From 167ab70c3fcec8c8c8eb09070aa836ebeaffd56b Mon Sep 17 00:00:00 2001 From: Codex Date: Sun, 12 Jul 2026 12:02:45 -0700 Subject: [PATCH] =?UTF-8?q?ZL-004-20260713=20=C2=B7=20=E5=B9=BF=E6=92=AD?= =?UTF-8?q?=E5=A1=94=E4=B8=89=E9=98=B6=E6=AE=B5=E5=8F=91=E5=B8=83=E6=B2=BB?= =?UTF-8?q?=E7=90=86=20=C2=B7=20Stage=201=20=E6=A8=A1=E5=9D=97=E6=B3=A8?= =?UTF-8?q?=E5=86=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .code-map | 2 + BROADCAST-TOWER.hdlp | 34 ++++++++++++++ .../broadcast-release-governance/MODULE.hdlp | 34 ++++++++++++++ server-tools/module-registry/MODULE.hdlp | 2 +- server-tools/module-registry/package.json | 7 +++ server-tools/module-registry/registry.js | 47 +++++++++++++++++++ server-tools/module-registry/registry.test.js | 14 ++++++ server-tools/server-state-mirror/MODULE.hdlp | 2 +- .../ZL-MEM-BROADCAST-RELEASE-001.hdlp | 24 ++++++++++ 9 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 server-tools/broadcast-release-governance/MODULE.hdlp create mode 100644 server-tools/module-registry/package.json create mode 100644 server-tools/module-registry/registry.js create mode 100644 server-tools/module-registry/registry.test.js create mode 100644 光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-BROADCAST-RELEASE-001.hdlp diff --git a/.code-map b/.code-map index db2478a..a4e2f58 100644 --- a/.code-map +++ b/.code-map @@ -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 diff --git a/BROADCAST-TOWER.hdlp b/BROADCAST-TOWER.hdlp index e5b2d2d..29e9cb9 100644 --- a/BROADCAST-TOWER.hdlp +++ b/BROADCAST-TOWER.hdlp @@ -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 拦截。 ``` diff --git a/server-tools/broadcast-release-governance/MODULE.hdlp b/server-tools/broadcast-release-governance/MODULE.hdlp new file mode 100644 index 0000000..cf15672 --- /dev/null +++ b/server-tools/broadcast-release-governance/MODULE.hdlp @@ -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`。本模块仅完成第一阶段注册;不得触发测试或生产部署。 diff --git a/server-tools/module-registry/MODULE.hdlp b/server-tools/module-registry/MODULE.hdlp index 2edcb8c..7b563d9 100644 --- a/server-tools/module-registry/MODULE.hdlp +++ b/server-tools/module-registry/MODULE.hdlp @@ -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 ``` diff --git a/server-tools/module-registry/package.json b/server-tools/module-registry/package.json new file mode 100644 index 0000000..d7b3766 --- /dev/null +++ b/server-tools/module-registry/package.json @@ -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" } +} diff --git a/server-tools/module-registry/registry.js b/server-tools/module-registry/registry.js new file mode 100644 index 0000000..c97e811 --- /dev/null +++ b/server-tools/module-registry/registry.js @@ -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 }; diff --git a/server-tools/module-registry/registry.test.js b/server-tools/module-registry/registry.test.js new file mode 100644 index 0000000..4630beb --- /dev/null +++ b/server-tools/module-registry/registry.test.js @@ -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); +}); diff --git a/server-tools/server-state-mirror/MODULE.hdlp b/server-tools/server-state-mirror/MODULE.hdlp index 82a9fcb..0876ace 100644 --- a/server-tools/server-state-mirror/MODULE.hdlp +++ b/server-tools/server-state-mirror/MODULE.hdlp @@ -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 ``` diff --git a/光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-BROADCAST-RELEASE-001.hdlp b/光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-BROADCAST-RELEASE-001.hdlp new file mode 100644 index 0000000..a322cc0 --- /dev/null +++ b/光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-BROADCAST-RELEASE-001.hdlp @@ -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 + ├── 注册不等于测试 + ├── 测试通过不等于批准 + └── 没有技术主控签名不得进入真实服务器 +```