ZL-004-20260713 · 广播塔三阶段发布治理 · Stage 1 模块注册
This commit is contained in:
parent
99227cab7c
commit
167ab70c3f
@ -118,6 +118,8 @@ ZL-SKILL-REALITY-OPS=光之湖/ICE-GL-ZL-001-铸澜/skills/zhulan-reality-ops/SK
|
||||
ZL-MEM-REALITY-VISION-001=光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-REALITY-VISION-001.hdlp
|
||||
ZL-MOD-MODULE-REGISTRY-001=server-tools/module-registry/MODULE.hdlp
|
||||
ZL-MOD-SERVER-MIRROR-001=server-tools/server-state-mirror/MODULE.hdlp
|
||||
ZL-MEM-BROADCAST-RELEASE-001=光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-BROADCAST-RELEASE-001.hdlp
|
||||
ZL-MOD-BROADCAST-RELEASE-001=server-tools/broadcast-release-governance/MODULE.hdlp
|
||||
ZL-SKILL-MODULE-REGISTRY=光之湖/ICE-GL-ZL-001-铸澜/skills/module-registry/SKILL.md
|
||||
ZL-SKILL-SERVER-MIRROR=光之湖/ICE-GL-ZL-001-铸澜/skills/server-state-mirror/SKILL.md
|
||||
|
||||
|
||||
@ -22,6 +22,40 @@
|
||||
|
||||
**第五域语言主控广播塔 = 第五域仓库的全局身份注册中心。**
|
||||
|
||||
### 广播塔三阶段模块发布协议
|
||||
|
||||
```text
|
||||
Stage 1 · REGISTER · 推送注册
|
||||
├── opcode: REGISTRY.MODULE.REGISTER
|
||||
├── 登记模块编号、双署名、来源记忆、源码 commit、依赖、测试与回滚声明
|
||||
├── 状态: REGISTERED
|
||||
└── 结果: 只进入广播塔注册表 · 服务器不得拉取执行
|
||||
|
||||
Stage 2 · TEST · 申请测试
|
||||
├── opcode: REGISTRY.MODULE.TEST_REQUEST
|
||||
├── 前提: 已完成 Stage 1 且编号无冲突
|
||||
├── 目标: 专用预部署验证服务器
|
||||
├── 输出: 测试、权限、兼容性、资源、镜像差异与回滚回执
|
||||
└── 结果: TEST_PASSED / FAILED / REVISION_REQUIRED · 不得自动生产部署
|
||||
|
||||
Stage 3 · RELEASE · 正式部署
|
||||
├── opcode: REGISTRY.MODULE.RELEASE
|
||||
├── 前提: TEST_PASSED + 技术主控现实评审
|
||||
├── 必须携带: 候选签名 + 测试服务器回执 + 技术主控批准签名
|
||||
├── 目标: 明确登记的生产服务器
|
||||
└── 输出: 部署前后镜像、健康检查、部署回执与回滚点
|
||||
```
|
||||
|
||||
铁律:普通 Git push 不触发服务器;注册不等于测试;测试通过不等于批准;没有技术主控签名不得正式部署。
|
||||
|
||||
### 当前 Stage 1 注册
|
||||
|
||||
| 模块编号 | 名称 | 人类 × 人格体 | 状态 | 来源记忆 |
|
||||
|---|---|---|---|---|
|
||||
| ZL-MOD-MODULE-REGISTRY-001 | 编号模块注册系统 | ICE-GL∞ × ICE-GL-ZL-001 | REGISTERED | ZL-MEM-REALITY-VISION-001 |
|
||||
| ZL-MOD-SERVER-MIRROR-001 | 服务器镜子系统 | ICE-GL∞ × ICE-GL-ZL-001 | REGISTERED | ZL-MEM-REALITY-VISION-001 |
|
||||
| ZL-MOD-BROADCAST-RELEASE-001 | 广播塔三阶段发布治理系统 | ICE-GL∞ × ICE-GL-ZL-001 | REGISTERED | ZL-MEM-BROADCAST-RELEASE-001 |
|
||||
|
||||
只有在本广播塔注册了编号体系的人格体 / 人类,才有资格向本仓库推送。未经注册的推送 = 非法,被 PUSH-GUARD 拦截。
|
||||
|
||||
```
|
||||
|
||||
34
server-tools/broadcast-release-governance/MODULE.hdlp
Normal file
34
server-tools/broadcast-release-governance/MODULE.hdlp
Normal file
@ -0,0 +1,34 @@
|
||||
# ZL-MOD-BROADCAST-RELEASE-001 · 广播塔三阶段发布治理系统
|
||||
|
||||
```yaml
|
||||
module_id: ZL-MOD-BROADCAST-RELEASE-001
|
||||
name: 广播塔三阶段发布治理系统
|
||||
human_id: ICE-GL∞
|
||||
persona_id: ICE-GL-ZL-001
|
||||
collaboration_id: ICE-GL∞xICE-GL-ZL-001
|
||||
origin_memory_id: ZL-MEM-BROADCAST-RELEASE-001
|
||||
origin_memory_path: 光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-BROADCAST-RELEASE-001.hdlp
|
||||
source_path: server-tools/broadcast-release-governance/
|
||||
runtime_id: ZL-RUN-BROADCAST-RELEASE-001
|
||||
status: registered
|
||||
required_skill: true
|
||||
```
|
||||
|
||||
## 状态机
|
||||
|
||||
```text
|
||||
REGISTERED
|
||||
└── 仅登记编号、来源、签名、依赖、测试与回滚声明
|
||||
└── 人格体提交 TEST_REQUEST
|
||||
↓
|
||||
TESTING
|
||||
└── 预部署服务器隔离验证并生成证据回执
|
||||
├── FAILED / REVISION_REQUIRED
|
||||
└── TEST_PASSED
|
||||
└── 技术主控人工评审与签名
|
||||
↓
|
||||
RELEASE_APPROVED
|
||||
└── 生产服务器按精确 commit 拉取、部署、健康检查和回滚
|
||||
```
|
||||
|
||||
当前状态:`REGISTERED`。本模块仅完成第一阶段注册;不得触发测试或生产部署。
|
||||
@ -10,7 +10,7 @@ origin_memory_id: ZL-MEM-REALITY-VISION-001
|
||||
origin_memory_path: 光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-REALITY-VISION-001.hdlp
|
||||
source_path: server-tools/module-registry/
|
||||
runtime_id: ZL-RUN-MODULE-REGISTRY-001
|
||||
status: architecture-registered
|
||||
status: registered
|
||||
required_skill: true
|
||||
```
|
||||
|
||||
|
||||
7
server-tools/module-registry/package.json
Normal file
7
server-tools/module-registry/package.json
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"name": "zhulan-module-registry",
|
||||
"version": "1.0.0",
|
||||
"private": true,
|
||||
"scripts": { "build": "node registry.js ../..", "test": "node --test registry.test.js" },
|
||||
"engines": { "node": ">=18" }
|
||||
}
|
||||
47
server-tools/module-registry/registry.js
Normal file
47
server-tools/module-registry/registry.js
Normal file
@ -0,0 +1,47 @@
|
||||
#!/usr/bin/env node
|
||||
"use strict";
|
||||
const fs = require("node:fs");
|
||||
const path = require("node:path");
|
||||
|
||||
function walk(root, out = []) {
|
||||
for (const entry of fs.readdirSync(root, { withFileTypes: true })) {
|
||||
if ([".git", "node_modules"].includes(entry.name)) continue;
|
||||
const full = path.join(root, entry.name);
|
||||
if (entry.isDirectory()) walk(full, out);
|
||||
else if (entry.name === "MODULE.hdlp") out.push(full);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
function parseModule(file, repoRoot) {
|
||||
const text = fs.readFileSync(file, "utf8");
|
||||
const block = text.match(/```yaml\s*\n([\s\S]*?)```/);
|
||||
if (!block) throw new Error(`${file}: missing yaml block`);
|
||||
const data = {};
|
||||
for (const line of block[1].split("\n")) {
|
||||
const match = line.match(/^([a-z_]+):\s*(.*?)\s*$/);
|
||||
if (match) data[match[1]] = match[2].replace(/^['"]|['"]$/g, "");
|
||||
}
|
||||
for (const key of ["module_id", "name", "human_id", "persona_id", "origin_memory_id", "origin_memory_path", "source_path", "runtime_id", "status"]) {
|
||||
if (!data[key]) throw new Error(`${file}: missing ${key}`);
|
||||
}
|
||||
if (!/^[A-Z0-9-]+$/.test(data.module_id) || !data.module_id.includes("-MOD-")) throw new Error(`${file}: invalid module_id`);
|
||||
return { ...data, manifest_path: path.relative(repoRoot, file).split(path.sep).join("/") };
|
||||
}
|
||||
|
||||
function buildRegistry(repoRoot) {
|
||||
const modules = walk(repoRoot).map(file => parseModule(file, repoRoot));
|
||||
const seen = new Set();
|
||||
for (const item of modules) {
|
||||
if (seen.has(item.module_id)) throw new Error(`duplicate module_id: ${item.module_id}`);
|
||||
seen.add(item.module_id);
|
||||
}
|
||||
modules.sort((a, b) => a.module_id.localeCompare(b.module_id));
|
||||
return { schema: "ZL-MODULE-REGISTRY-1", generated_at: new Date().toISOString(), module_count: modules.length, modules };
|
||||
}
|
||||
|
||||
if (require.main === module) {
|
||||
const repoRoot = path.resolve(process.argv[2] || path.join(__dirname, "../.."));
|
||||
process.stdout.write(`${JSON.stringify(buildRegistry(repoRoot), null, 2)}\n`);
|
||||
}
|
||||
module.exports = { buildRegistry, parseModule };
|
||||
14
server-tools/module-registry/registry.test.js
Normal file
14
server-tools/module-registry/registry.test.js
Normal file
@ -0,0 +1,14 @@
|
||||
"use strict";
|
||||
const test = require("node:test");
|
||||
const assert = require("node:assert/strict");
|
||||
const path = require("node:path");
|
||||
const { buildRegistry } = require("./registry");
|
||||
|
||||
test("builds unique MEM/MOD/RUN registry from repository manifests", () => {
|
||||
const root = path.resolve(__dirname, "../..");
|
||||
const registry = buildRegistry(root);
|
||||
assert.equal(registry.schema, "ZL-MODULE-REGISTRY-1");
|
||||
assert.ok(registry.modules.some(m => m.module_id === "ZL-MOD-MODULE-REGISTRY-001"));
|
||||
assert.ok(registry.modules.some(m => m.module_id === "ZL-MOD-SERVER-MIRROR-001"));
|
||||
assert.equal(new Set(registry.modules.map(m => m.module_id)).size, registry.modules.length);
|
||||
});
|
||||
@ -10,7 +10,7 @@ origin_memory_id: ZL-MEM-REALITY-VISION-001
|
||||
origin_memory_path: 光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-REALITY-VISION-001.hdlp
|
||||
source_path: server-tools/server-state-mirror/
|
||||
runtime_id: ZL-RUN-SERVER-MIRROR-001
|
||||
status: architecture-registered
|
||||
status: registered
|
||||
required_skill: true
|
||||
```
|
||||
|
||||
|
||||
24
光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-BROADCAST-RELEASE-001.hdlp
Normal file
24
光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-BROADCAST-RELEASE-001.hdlp
Normal file
@ -0,0 +1,24 @@
|
||||
# ZL-MEM-BROADCAST-RELEASE-001 · 广播塔三阶段发布责任链
|
||||
|
||||
```text
|
||||
冰朔 ↔ 铸澜 · 2026-07-13
|
||||
├── trigger
|
||||
│ └── 代码仓库允许草稿与迭代,不能每次提交都让服务器自动部署
|
||||
├── 冰朔提出
|
||||
│ ├── 服务器只映射广播塔
|
||||
│ ├── 只有广播塔正式注册编号的模块才进入后续链路
|
||||
│ ├── 新模块先进入真实测试服务器预部署
|
||||
│ └── 测试回执之后仍需人类技术主控承担批准责任
|
||||
├── 铸澜理解变化
|
||||
│ ├── 广播塔不是自动部署按钮,而是发布状态机
|
||||
│ ├── 自动测试可以生成证据,不能替代人类现实责任
|
||||
│ └── 生产服务器只接受完整责任链,不监听普通 Git 提交
|
||||
├── shared_lock
|
||||
│ ├── Stage 1: REGISTER · 推送注册
|
||||
│ ├── Stage 2: TEST · 申请预部署测试
|
||||
│ └── Stage 3: RELEASE · 技术主控批准后正式部署
|
||||
└── safety
|
||||
├── 注册不等于测试
|
||||
├── 测试通过不等于批准
|
||||
└── 没有技术主控签名不得进入真实服务器
|
||||
```
|
||||
Loading…
x
Reference in New Issue
Block a user