ZL-004-20260713 · 广播塔三阶段发布治理 · Stage 1 模块注册

This commit is contained in:
Codex 2026-07-12 12:02:45 -07:00
parent 99227cab7c
commit 167ab70c3f
9 changed files with 164 additions and 2 deletions

View File

@ -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

View File

@ -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 拦截。
```

View 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`。本模块仅完成第一阶段注册;不得触发测试或生产部署。

View File

@ -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
```

View 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" }
}

View 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 };

View 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);
});

View File

@ -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
```

View 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
├── 注册不等于测试
├── 测试通过不等于批准
└── 没有技术主控签名不得进入真实服务器
```