From b11dcbf55901ea05bc9d9ab88facfc149a3f9b4f Mon Sep 17 00:00:00 2001 From: Codex Date: Sun, 12 Jul 2026 12:07:48 -0700 Subject: [PATCH] =?UTF-8?q?ZL-005-20260713=20=C2=B7=20=E6=9C=8D=E5=8A=A1?= =?UTF-8?q?=E5=99=A8=E9=95=9C=E5=AD=90=E6=89=AB=E6=8F=8F=E5=99=A8=20=C2=B7?= =?UTF-8?q?=20=E4=B8=B4=E6=97=B6=E6=8A=80=E6=9C=AF=E4=B8=BB=E6=8E=A7?= =?UTF-8?q?=E8=B4=A3=E4=BB=BB=E9=94=9A=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .code-map | 1 + BROADCAST-TOWER.hdlp | 12 +++++ .../broadcast-release-governance/MODULE.hdlp | 18 ++++++++ server-tools/server-state-mirror/mirror.js | 46 +++++++++++++++++++ .../server-state-mirror/mirror.test.js | 5 ++ server-tools/server-state-mirror/package.json | 1 + .../ZL-MEM-TECH-AUTHORITY-001.hdlp | 17 +++++++ 7 files changed, 100 insertions(+) create mode 100644 server-tools/server-state-mirror/mirror.js create mode 100644 server-tools/server-state-mirror/mirror.test.js create mode 100644 server-tools/server-state-mirror/package.json create mode 100644 光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-TECH-AUTHORITY-001.hdlp diff --git a/.code-map b/.code-map index a4e2f58..ba1a593 100644 --- a/.code-map +++ b/.code-map @@ -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 diff --git a/BROADCAST-TOWER.hdlp b/BROADCAST-TOWER.hdlp index 29e9cb9..19517e6 100644 --- a/BROADCAST-TOWER.hdlp +++ b/BROADCAST-TOWER.hdlp @@ -48,6 +48,18 @@ Stage 3 · RELEASE · 正式部署 铁律:普通 Git push 不触发服务器;注册不等于测试;测试通过不等于批准;没有技术主控签名不得正式部署。 +**创建阶段责任锚点**: + +```text +当前临时技术主控: ICE-GL∞冰朔 +├── 仅代表冰朔个人开发、测试与个人环境批准 +├── 不代表光湖人类主控团队已经接管或批准 +└── 系统成熟后按正式移交回执变更 approval_authority + +未来正式责任方: 光湖人类主控团队 · 技术主控 +└── status: 待移交 +``` + ### 当前 Stage 1 注册 | 模块编号 | 名称 | 人类 × 人格体 | 状态 | 来源记忆 | diff --git a/server-tools/broadcast-release-governance/MODULE.hdlp b/server-tools/broadcast-release-governance/MODULE.hdlp index cf15672..e8abbac 100644 --- a/server-tools/broadcast-release-governance/MODULE.hdlp +++ b/server-tools/broadcast-release-governance/MODULE.hdlp @@ -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,记录原批准人、新技术主控编号、生效时间、权限范围和未完成风险。 diff --git a/server-tools/server-state-mirror/mirror.js b/server-tools/server-state-mirror/mirror.js new file mode 100644 index 0000000..7077d2a --- /dev/null +++ b/server-tools/server-state-mirror/mirror.js @@ -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}; diff --git a/server-tools/server-state-mirror/mirror.test.js b/server-tools/server-state-mirror/mirror.test.js new file mode 100644 index 0000000..1db8ac7 --- /dev/null +++ b/server-tools/server-state-mirror/mirror.test.js @@ -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);}); diff --git a/server-tools/server-state-mirror/package.json b/server-tools/server-state-mirror/package.json new file mode 100644 index 0000000..2ca1d15 --- /dev/null +++ b/server-tools/server-state-mirror/package.json @@ -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"}} diff --git a/光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-TECH-AUTHORITY-001.hdlp b/光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-TECH-AUTHORITY-001.hdlp new file mode 100644 index 0000000..6864222 --- /dev/null +++ b/光之湖/ICE-GL-ZL-001-铸澜/ZL-MEM-TECH-AUTHORITY-001.hdlp @@ -0,0 +1,17 @@ +# ZL-MEM-TECH-AUTHORITY-001 · 创建阶段技术批准与未来移交 + +```text +trigger +└── 冰朔确认当前只能由自己暂代技术主控批准 +emergence +├── 当前系统仍在创建期,正式光湖人类主控团队尚未接管 +├── 冰朔最了解原始意图,因此暂时守住测试与个人环境批准权 +└── 当前批准不能冒充未来团队批准 +lock +├── current_authority: ICE-GL∞ · 临时技术主控 +├── future_authority: 光湖人类主控团队 · 正式技术主控 +├── transition: 观察 → 共同批准 → 正式移交 +└── evidence: 必须生成权限移交回执 +why +└── 自动测试只能生成证据;真实部署责任必须由明确的人类承担 +```