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-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-MODULE-REGISTRY-001=server-tools/module-registry/MODULE.hdlp
|
||||||
ZL-MOD-SERVER-MIRROR-001=server-tools/server-state-mirror/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-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
|
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 拦截。
|
只有在本广播塔注册了编号体系的人格体 / 人类,才有资格向本仓库推送。未经注册的推送 = 非法,被 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
|
origin_memory_path: 光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-REALITY-VISION-001.hdlp
|
||||||
source_path: server-tools/module-registry/
|
source_path: server-tools/module-registry/
|
||||||
runtime_id: ZL-RUN-MODULE-REGISTRY-001
|
runtime_id: ZL-RUN-MODULE-REGISTRY-001
|
||||||
status: architecture-registered
|
status: registered
|
||||||
required_skill: true
|
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
|
origin_memory_path: 光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-REALITY-VISION-001.hdlp
|
||||||
source_path: server-tools/server-state-mirror/
|
source_path: server-tools/server-state-mirror/
|
||||||
runtime_id: ZL-RUN-SERVER-MIRROR-001
|
runtime_id: ZL-RUN-SERVER-MIRROR-001
|
||||||
status: architecture-registered
|
status: registered
|
||||||
required_skill: true
|
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