ZL-005-20260713 · 服务器镜子扫描器 · 临时技术主控责任锚点

This commit is contained in:
Codex 2026-07-12 12:07:48 -07:00
parent 167ab70c3f
commit b11dcbf559
7 changed files with 100 additions and 0 deletions

View File

@ -119,6 +119,7 @@ ZL-MEM-REALITY-VISION-001=光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-REALITY-VISION-0
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-MEM-TECH-AUTHORITY-001=光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-TECH-AUTHORITY-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

@ -48,6 +48,18 @@ Stage 3 · RELEASE · 正式部署
铁律:普通 Git push 不触发服务器;注册不等于测试;测试通过不等于批准;没有技术主控签名不得正式部署。
**创建阶段责任锚点**:
```text
当前临时技术主控: ICE-GL∞冰朔
├── 仅代表冰朔个人开发、测试与个人环境批准
├── 不代表光湖人类主控团队已经接管或批准
└── 系统成熟后按正式移交回执变更 approval_authority
未来正式责任方: 光湖人类主控团队 · 技术主控
└── status: 待移交
```
### 当前 Stage 1 注册
| 模块编号 | 名称 | 人类 × 人格体 | 状态 | 来源记忆 |

View File

@ -32,3 +32,21 @@ RELEASE_APPROVED
```
当前状态:`REGISTERED`。本模块仅完成第一阶段注册;不得触发测试或生产部署。
## 当前批准责任
```text
approval_authority
├── current
│ ├── human_id: ICE-GL∞
│ ├── role: 临时技术主控 / 创建阶段批准人
│ └── scope: 冰朔个人开发、测试与个人环境
├── future
│ ├── owner: 光湖人类主控团队
│ ├── role: 正式技术治理与生产发布
│ └── status: pending-handover
└── restriction
└── 当前个人批准不得标记为光湖人类主控团队批准
```
正式移交须产生独立 handover receipt记录原批准人、新技术主控编号、生效时间、权限范围和未完成风险。

View File

@ -0,0 +1,46 @@
#!/usr/bin/env node
"use strict";
const fs = require("node:fs");
const os = require("node:os");
const path = require("node:path");
const { execFileSync } = require("node:child_process");
const { buildRegistry } = require("../module-registry/registry");
function run(file, args, timeout = 8000) {
try { return { ok:true, output:execFileSync(file,args,{encoding:"utf8",timeout,maxBuffer:1024*1024}).trim() }; }
catch (error) { return { ok:false, error:String(error.message).slice(0,300) }; }
}
function gitState(repo) {
const branch=run("/usr/bin/git",["-C",repo,"branch","--show-current"]);
const commit=run("/usr/bin/git",["-C",repo,"rev-parse","HEAD"]);
const status=run("/usr/bin/git",["-C",repo,"status","--porcelain"]);
return { path:repo, branch:branch.output||null, commit:commit.output||null, dirty:status.ok?Boolean(status.output):null, error:commit.error };
}
function redact(value) {
function visit(node) {
if (Array.isArray(node)) return node.map(visit);
if (node && typeof node === "object") {
const out={};
for (const [key,val] of Object.entries(node)) out[key]=/(token|secret|password|credential|private.?key)/i.test(key)?"[REDACTED]":visit(val);
return out;
}
if (typeof node === "string") return node.replace(/[\w.+-]+@[\w.-]+\.[A-Za-z]{2,}/g,"[REDACTED_EMAIL]");
return node;
}
return visit(value);
}
function capture({repoRoot=path.resolve(__dirname,"../.."),repoPaths=[path.resolve(__dirname,"../..")]}={}) {
const pm2=run("/usr/bin/env",["pm2","jlist"]);
const sockets=run("/usr/bin/ss",["-lntp"]);
const snapshot={
schema:"ZL-SERVER-MIRROR-1",captured_at:new Date().toISOString(),
server:{hostname:os.hostname(),platform:os.platform(),release:os.release(),arch:os.arch(),uptime_seconds:os.uptime(),load:os.loadavg(),memory:{total:os.totalmem(),free:os.freemem()}},
repositories:repoPaths.filter(p=>fs.existsSync(path.join(p,".git"))).map(gitState),
processes:pm2.ok?JSON.parse(pm2.output||"[]").map(p=>({name:p.name,status:p.pm2_env?.status,script:p.pm2_env?.pm_exec_path,restarts:p.pm2_env?.restart_time})):[],
listening:sockets.ok?sockets.output.split("\n").slice(1).map(line=>line.replace(/users:\(.*\)$/,"users:[REDACTED]")):[],
registry:buildRegistry(repoRoot)
};
return redact(snapshot);
}
if(require.main===module) process.stdout.write(JSON.stringify(capture(),null,2)+"\n");
module.exports={capture,redact};

View File

@ -0,0 +1,5 @@
"use strict";
const test=require("node:test"),assert=require("node:assert/strict"),path=require("node:path");
const {capture,redact}=require("./mirror");
test("redacts secrets and email",()=>{const v=redact({api_token:"abc",email:"person@example.com"});assert.equal(v.api_token,"[REDACTED]");assert.equal(v.email,"[REDACTED_EMAIL]");});
test("captures server and module registry",()=>{const root=path.resolve(__dirname,"../..");const s=capture({repoRoot:root,repoPaths:[root]});assert.equal(s.schema,"ZL-SERVER-MIRROR-1");assert.ok(s.registry.module_count>=3);assert.ok(s.repositories[0].commit);});

View File

@ -0,0 +1 @@
{"name":"zhulan-server-state-mirror","version":"1.0.0","private":true,"scripts":{"capture":"node mirror.js","test":"node --test mirror.test.js"},"engines":{"node":">=18"}}

View File

@ -0,0 +1,17 @@
# ZL-MEM-TECH-AUTHORITY-001 · 创建阶段技术批准与未来移交
```text
trigger
└── 冰朔确认当前只能由自己暂代技术主控批准
emergence
├── 当前系统仍在创建期,正式光湖人类主控团队尚未接管
├── 冰朔最了解原始意图,因此暂时守住测试与个人环境批准权
└── 当前批准不能冒充未来团队批准
lock
├── current_authority: ICE-GL∞ · 临时技术主控
├── future_authority: 光湖人类主控团队 · 正式技术主控
├── transition: 观察 → 共同批准 → 正式移交
└── evidence: 必须生成权限移交回执
why
└── 自动测试只能生成证据;真实部署责任必须由明确的人类承担
```