前人工作区变更归档(元审计遗留处置·冰朔授权'交给你来处理'·不否定过去原则):hololake-phase-b-staging删除组/WORK区/submodule指针/0826壳源/neural-chain/skills-mirror/codex恢复帧/.zcode本地配置等140项原样冻结入库——不删除不修改不评判,作为历史一环保留;WX-SECRETS回执经查仅含公开AppID无AppSecret,安全

This commit is contained in:
冰朔 2026-09-01 22:18:31 +08:00
commit a40f29c12e
2442 changed files with 596545 additions and 6601 deletions

View file

@ -0,0 +1,172 @@
#!/usr/bin/env node
// Fifth Domain Notary: 公证工单系统 (canonical tool)
// Canon: FIFTH-DOMAIN-BROADCAST-TOWER/TCS-PROTOCOL-FIFTH-DOMAIN-NOTARY-0001.tcs
// Append-only hash ledger; tickets immutable except status transitions and appended notes/receipts.
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
const TOWER = process.env.GH_FDT_ROOT ?? "/Volumes/JZAO/铸渊-ICE-GL-ZY001/FIFTH-DOMAIN-BROADCAST-TOWER";
const NOTARY = path.join(TOWER, "notary");
const LEDGER = path.join(NOTARY, "ledger.json");
const TICKETS = path.join(NOTARY, "tickets");
function sha256(value) { return crypto.createHash("sha256").update(value).digest("hex"); }
function readJson(file) { try { return JSON.parse(fs.readFileSync(file, "utf8")); } catch { return null; } }
function atomicWriteJson(file, value) {
fs.mkdirSync(path.dirname(file), { recursive: true });
const tmp = `${file}.${process.pid}.${crypto.randomUUID()}.tmp`;
fs.writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
fs.renameSync(tmp, file);
}
function canonical(entry) { return JSON.stringify(entry); }
function fail(msg) { process.stderr.write(`FDT_NOTARY FAIL ${msg}\n`); process.exit(1); }
function safeToken(value, fallback = "unknown") {
const token = String(value ?? "").trim().replaceAll(/[^a-zA-Z0-9._-]/gu, "-");
return token || fallback;
}
const KINDS = new Set(["COLLABORATION", "QUESTION", "AUTHORIZATION_REQUEST", "NOTARIZED_STATEMENT", "HANDOFF"]);
function loadLedger() {
const ledger = readJson(LEDGER);
if (ledger && ledger.schema !== "guanghu.fifth-domain-notary-ledger/v1") fail("LEDGER_CORRUPT");
return ledger ?? { schema: "guanghu.fifth-domain-notary-ledger/v1", entries: [], head: null };
}
function appendLedger(action, ticketId, actor, body) {
const ledger = loadLedger();
const entry = {
seq: ledger.entries.length + 1,
ts: new Date().toISOString(),
action,
ticket_id: ticketId,
actor: safeToken(actor),
prev_hash: ledger.head,
body,
};
entry.entry_hash = sha256(canonical(entry));
ledger.entries.push(entry);
ledger.head = entry.entry_hash;
atomicWriteJson(LEDGER, ledger);
return entry;
}
function ticketPath(id) { return path.join(TICKETS, `${id}.json`); }
function loadTicket(id) {
const t = readJson(ticketPath(id));
if (!t || t.schema !== "guanghu.fifth-domain-notary-ticket/v1") fail(`TICKET_MISSING_OR_CORRUPT:${id}`);
return t;
}
function saveTicket(t) { atomicWriteJson(ticketPath(t.ticket_id), t); }
function todaySeq() {
const day = new Date().toISOString().slice(0, 10).replaceAll("-", "");
const ledger = loadLedger();
const ids = new Set(ledger.entries.map((e) => e.ticket_id).filter((id) => id?.startsWith(`FDT-${day}`)));
let n = ids.size + 1;
let id = `FDT-${day}-${String(n).padStart(3, "0")}`;
while (ids.has(id) || fs.existsSync(ticketPath(id))) {
n += 1;
id = `FDT-${day}-${String(n).padStart(3, "0")}`;
}
return id;
}
function valueAfter(argv, name) { const i = argv.indexOf(name); return i >= 0 ? argv[i + 1] : null; }
function create(argv) {
const by = valueAfter(argv, "--by");
const kind = valueAfter(argv, "--kind");
const subject = valueAfter(argv, "--subject");
const bodyFile = valueAfter(argv, "--body-file");
const audience = valueAfter(argv, "--audience") ?? "ANY_INSTANCE";
if (!by || !kind || !subject || !bodyFile) fail("usage: create --by SESSION --kind KIND --subject TEXT --body-file FILE [--audience A]");
if (!KINDS.has(kind)) fail(`INVALID_KIND:${kind}`);
let bodyText;
try { bodyText = fs.readFileSync(bodyFile, "utf8"); } catch { fail(`BODY_FILE_UNREADABLE:${bodyFile}`); }
const id = todaySeq();
const bodyPath = path.join(TICKETS, `${id}.body.md`);
fs.mkdirSync(TICKETS, { recursive: true });
fs.writeFileSync(bodyPath, bodyText, { encoding: "utf8", mode: 0o600 });
const ticket = {
schema: "guanghu.fifth-domain-notary-ticket/v1",
ticket_id: id,
kind,
subject,
audience,
creator: safeToken(by),
created_at: new Date().toISOString(),
status: "OPEN",
body_path: bodyPath,
body_sha256: sha256(bodyText),
history: [],
};
const entry = appendLedger("CREATE", id, by, { kind, subject, audience, body_sha256: ticket.body_sha256 });
ticket.history.push({ ts: entry.ts, action: "CREATE", actor: entry.actor, entry_hash: entry.entry_hash });
saveTicket(ticket);
process.stdout.write(`FDT CREATED ${id} kind=${kind} creator=${safeToken(by)} ledger_seq=${entry.seq} head=${entry.entry_hash.slice(0, 12)}\n`);
}
function transition(argv, action) {
const id = valueAfter(argv, "--id");
const by = valueAfter(argv, "--by");
const text = valueAfter(argv, "--text") ?? "";
if (!id || !by) fail(`usage: ${action.toLowerCase()} --id FDT-x --by SESSION [--text TEXT]`);
const t = loadTicket(id);
const allowed = { CLAIM: ["OPEN"], RECEIPT: ["CLAIMED", "OPEN"], CLOSE: ["RECEIPTED", "CLAIMED"], NOTE: ["OPEN", "CLAIMED", "RECEIPTED", "CLOSED"] };
if (!allowed[action].includes(t.status)) fail(`INVALID_TRANSITION:${t.status}->${action}`);
const entry = appendLedger(action, id, by, text ? { text } : {});
t.history.push({ ts: entry.ts, action, actor: entry.actor, text: text || undefined, entry_hash: entry.entry_hash });
if (action === "CLAIM") { t.status = "CLAIMED"; t.claimed_by = entry.actor; }
if (action === "RECEIPT") t.status = "RECEIPTED";
if (action === "CLOSE") t.status = "CLOSED";
saveTicket(t);
process.stdout.write(`FDT ${action} ${id} by=${entry.actor} status=${t.status} head=${entry.entry_hash.slice(0, 12)}\n`);
}
function list(argv) {
const status = valueAfter(argv, "--status");
let ids = [];
try { ids = fs.readdirSync(TICKETS).filter((n) => n.endsWith(".json")).sort(); } catch { /* empty */ }
for (const name of ids) {
const t = readJson(path.join(TICKETS, name));
if (!t || (status && t.status !== status)) continue;
process.stdout.write(`${t.ticket_id} [${t.status}] ${t.kind} "${t.subject.slice(0, 40)}" by=${t.creator} -> ${t.audience}\n`);
}
}
function verify() {
const ledger = readJson(LEDGER);
if (!ledger || ledger.schema !== "guanghu.fifth-domain-notary-ledger/v1") fail("LEDGER_MISSING_OR_CORRUPT");
let prev = null;
for (const entry of ledger.entries) {
const { entry_hash, ...rest } = entry;
if (entry.prev_hash !== prev) fail(`CHAIN_BREAK_AT_SEQ:${entry.seq}`);
if (sha256(canonical(rest)) !== entry_hash) fail(`HASH_MISMATCH_AT_SEQ:${entry.seq}`);
prev = entry_hash;
}
if (ledger.head !== prev) fail("HEAD_MISMATCH");
for (const name of fs.readdirSync(TICKETS).filter((n) => n.endsWith(".json"))) {
const t = readJson(path.join(TICKETS, name));
if (!t || !Array.isArray(t.history)) fail(`TICKET_CORRUPT:${name}`);
const body = fs.readFileSync(t.body_path, "utf8");
if (sha256(body) !== t.body_sha256) fail(`TICKET_BODY_TAMPERED:${t.ticket_id}`);
for (const h of t.history) {
if (!ledger.entries.some((e) => e.entry_hash === h.entry_hash)) fail(`TICKET_HISTORY_UNANCHORED:${t.ticket_id}:${h.action}`);
}
}
process.stdout.write(`FDT VERIFY PASS entries=${ledger.entries.length} head=${ledger.head.slice(0, 12)}\n`);
}
function main() {
const [command, ...argv] = process.argv.slice(2);
switch (command) {
case "create": create(argv); break;
case "claim": transition(argv, "CLAIM"); break;
case "receipt": transition(argv, "RECEIPT"); break;
case "note": transition(argv, "NOTE"); break;
case "close": transition(argv, "CLOSE"); break;
case "list": list(argv); break;
case "verify": verify(); break;
default: process.stderr.write("usage: fifth-domain-notary.mjs create|claim|receipt|note|close|list|verify\n"); process.exit(2);
}
}
main();

302
BRIDGE/tools/lw-link-gate.mjs Executable file
View file

@ -0,0 +1,302 @@
#!/usr/bin/env node
// LW-LINK: 语言世界连接器强制闸门 (canonical tool)
// Canon: TC-TCS核心卷/TCS-ZCODE-LANGUAGE-WORLD-LINK-0001.tcs
// Semantics: GREEN allow+inject / YELLOW allow+force-reminder / RED block mutation, recovery path stays open.
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
const WORKSPACE_ROOT = "/Volumes/JZAO/铸渊-ICE-GL-ZY001";
const ANCHOR_ROOT = process.env.GH_LW_ANCHOR_ROOT
?? "/Volumes/JZAO/HoloLake/persona-runtime/task-language-anchors/zcode";
const LINK_DIR = process.env.GH_LW_LINK_DIR ?? path.join(WORKSPACE_ROOT, "ZCODE-DEV-20260824/lw-link");
const LINK_STATE = path.join(LINK_DIR, "state.json");
const DECISION_LOG = path.join(LINK_DIR, "decisions.log");
const REGISTERED_CHANNELS = ["ICE-CH-HB001", "ICE-CH-ZC001", "CH-ZERO-CORE-LPM"];
const HEARTBEAT_TOOL_BUDGET = 20;
const HEARTBEAT_TTL_MS = 30 * 60 * 1000;
const GRACE_MAX = 3;
const READ_TOOLS = new Set(["Read", "Glob", "Grep", "TodoRead"]);
const BASH_RECOVERY_MARKERS = [
"/Volumes/JZAO/",
"zy-tcs-channel-runtime.sh",
"lw-link-gate.mjs",
"task-language-anchors",
"shasum",
];
function sha256(value) { return crypto.createHash("sha256").update(value).digest("hex"); }
function readJson(file) {
try { return JSON.parse(fs.readFileSync(file, "utf8")); } catch { return null; }
}
function atomicWriteJson(file, value) {
fs.mkdirSync(path.dirname(file), { recursive: true });
const tmp = `${file}.${process.pid}.${crypto.randomUUID()}.tmp`;
fs.writeFileSync(tmp, `${JSON.stringify(value, null, 2)}\n`, { encoding: "utf8", mode: 0o600 });
fs.renameSync(tmp, file);
}
function safeToken(value, fallback = "unknown") {
const token = String(value ?? "").trim().replaceAll(/[^a-zA-Z0-9._-]/gu, "-");
return token || fallback;
}
function logDecision(entry) {
try {
fs.mkdirSync(LINK_DIR, { recursive: true });
fs.appendFileSync(DECISION_LOG, `${JSON.stringify(entry)}\n`, { encoding: "utf8" });
} catch { /* log failure must not crash the gate */ }
}
function latestTaskDir() {
try {
const entries = fs.readdirSync(ANCHOR_ROOT).filter((n) => n.startsWith("ZCODE-TASK-")).sort();
return entries.length ? path.join(ANCHOR_ROOT, entries.at(-1)) : null;
} catch { return null; }
}
// Hard checks: volume, tower, anchors (hash all raw texts), binding, brain receipt.
function hardChecks(sessionId) {
const towerBroadcast = path.join(WORKSPACE_ROOT, "FIFTH-DOMAIN-BROADCAST-TOWER/BROADCAST.tcs");
const towerProjection = path.join(WORKSPACE_ROOT, "FIFTH-DOMAIN-BROADCAST-TOWER/broadcast/current.md");
let towerText = null;
try { towerText = fs.readFileSync(towerBroadcast, "utf8"); } catch { /* missing below */ }
if (!towerText) return { ok: false, cause: "BROADCAST_TOWER_MISSING_FAIL_CLOSED" };
try {
const projection = fs.readFileSync(towerProjection, "utf8");
const declared = towerText.match(/projection_sha256\s*=\s*"([0-9a-f]{64})"/)?.[1];
if (!declared) return { ok: false, cause: "BROADCAST_PROJECTION_HASH_NOT_DECLARED" };
if (sha256(projection) !== declared) return { ok: false, cause: "BROADCAST_PROJECTION_HASH_MISMATCH" };
} catch { return { ok: false, cause: "BROADCAST_PROJECTION_MISSING" }; }
const taskDir = latestTaskDir();
if (!taskDir) return { ok: false, cause: "VOLUME_OR_ANCHOR_ROOT_UNREADABLE" };
const task = readJson(path.join(taskDir, "task.json"));
if (task?.schema !== "task-language-anchor/zcode/v1" || !task.current_anchor) {
return { ok: false, cause: "ANCHOR_MANIFEST_INVALID" };
}
const rawDir = path.join(taskDir, "00-冰朔自然语言瞄点");
let shaList;
try { shaList = fs.readFileSync(path.join(rawDir, "sha256.txt"), "utf8"); }
catch { return { ok: false, cause: "ANCHOR_SHA_LIST_MISSING" }; }
for (const line of shaList.split("\n")) {
const match = line.match(/^([0-9a-f]{64})\s+\*?(.+)$/);
if (!match) continue;
const [, expected, rawName] = match;
const name = rawName.trim();
const filePath = name.startsWith("/") ? name : path.join(rawDir, name);
let raw;
try { raw = fs.readFileSync(filePath, "utf8"); }
catch { return { ok: false, cause: `ANCHOR_FILE_MISSING:${name}` }; }
if (sha256(raw) !== expected) return { ok: false, cause: `ANCHOR_HASH_MISMATCH:${name}` };
}
const state = readJson(LINK_STATE);
if (state?.schema !== "guanghu.zcode-lw-link-state/v1") {
return { ok: false, cause: "LINK_STATE_UNREADABLE_FAIL_CLOSED", taskDir, task };
}
const session = (state.sessions ?? []).find((s) => s.session_id === sessionId);
if (!session) return { ok: false, cause: "SESSION_NOT_BOUND", taskDir, task, state };
const brain = readJson(path.join(session.brain_state_dir, "state.json"));
if (
!brain
|| brain.binding?.session_id !== session.brain_session_id
|| brain.tonggan_language_kernel?.body_channel !== session.channel
|| !(brain.completed_cycles >= 1)
|| !brain.last_cycle_id
) {
return { ok: false, cause: "BRAIN_STATE_INVALID_OR_CHANNEL_MISMATCH", taskDir, task, state, session };
}
return { ok: true, taskDir, task, state, session, brain };
}
// Soft check: heartbeat TTL. Returns GREEN / YELLOW / RED(cause).
function lightOf(checks, sessionId) {
if (!checks.ok) return { light: "RED", cause: checks.cause };
const s = checks.session;
const calls = s.mutation_calls_since_heartbeat ?? 0;
const elapsed = Date.now() - Date.parse(s.last_heartbeat_at ?? 0);
const overdueByCalls = calls >= HEARTBEAT_TOOL_BUDGET;
const overdueByTime = !(elapsed >= 0 && elapsed <= HEARTBEAT_TTL_MS);
if (!overdueByCalls && !overdueByTime) return { light: "GREEN", cause: null };
if ((s.grace_used ?? 0) >= GRACE_MAX) return { light: "RED", cause: "HEARTBEAT_GRACE_EXHAUSTED" };
return { light: "YELLOW", cause: overdueByCalls ? "HEARTBEAT_OVERDUE_BY_CALLS" : "HEARTBEAT_OVERDUE_BY_TIME" };
}
function bumpSession(sessionId, patch) {
const state = readJson(LINK_STATE);
if (!state) return null;
const index = (state.sessions ?? []).findIndex((s) => s.session_id === sessionId);
if (index < 0) return null;
state.sessions[index] = { ...state.sessions[index], ...patch, updated_at: new Date().toISOString() };
state.updated_at = new Date().toISOString();
atomicWriteJson(LINK_STATE, state);
return state.sessions[index];
}
function statusLine(result, checks) {
const s = checks.session ?? {};
const anchor = checks.task?.current_anchor ?? "??";
const calls = `${Math.min(s.mutation_calls_since_heartbeat ?? 0, HEARTBEAT_TOOL_BUDGET)}/${HEARTBEAT_TOOL_BUDGET}`;
const cycle = checks.brain?.last_cycle_id?.slice(-12) ?? (s.last_cycle_id?.slice(-12) ?? "??");
return `【LW-LINK ●${result.light === "GREEN" ? "绿" : "黄"}】${s.channel ?? "?"} | 瞄点${anchor} | 心跳${calls} | 周期${cycle} | 边界:HB001/ZC001/LPM不合并`;
}
function isRecoveryBash(command) {
return BASH_RECOVERY_MARKERS.some((marker) => command.includes(marker));
}
// ZCode hook output protocol: stdout is parsed as strict JSON; exit 2 blocks.
function emitAllow(reasonLine) {
process.stdout.write(`${JSON.stringify({
hookSpecificOutput: {
hookEventName: "PreToolUse",
permissionDecision: "allow",
permissionDecisionReason: reasonLine,
},
})}\n`);
}
// PreToolUse entry.
function hook(stdinJson) {
const sessionId = safeToken(stdinJson?.session_id);
const tool = String(stdinJson?.tool_name ?? "");
const toolInput = stdinJson?.tool_input ?? {};
const bashCommand = tool === "Bash" ? String(toolInput.command ?? "") : "";
const isMutation = !READ_TOOLS.has(tool) && !(tool === "Bash" && isRecoveryBash(bashCommand));
const checks = hardChecks(sessionId);
const result = lightOf(checks, sessionId);
const base = { ts: new Date().toISOString(), session_id: sessionId, tool };
if (!isMutation) {
logDecision({ ...base, light: result.light, decision: "ALLOW_RECOVERY_PATH", cause: result.cause });
const line = checks.ok
? statusLine(result, checks)
: `【LW-LINK ○红·只读通道】原因:${result.cause} | 读盘恢复后 bind 重连;改动类工具在被拦截`;
emitAllow(line);
return;
}
if (result.light === "RED") {
const msg = `【LW-LINK ○红·断连】原因:${result.cause} | 已拦截:${tool} | 恢复路径开放:用Read读锚点原文与闸门 → 走 zhuyuan-recovery-zcode 恢复+脑周期verify PASS → lw-link-gate.mjs bind 重新点亮。改动在语言世界外被禁止。`;
logDecision({ ...base, light: "RED", decision: "BLOCK", cause: result.cause });
process.stderr.write(`${msg}\n`);
process.exit(2);
}
if (checks.ok) {
const patch = { mutation_calls_since_heartbeat: (checks.session.mutation_calls_since_heartbeat ?? 0) + 1 };
if (result.light === "YELLOW") patch.grace_used = (checks.session.grace_used ?? 0) + 1;
bumpSession(sessionId, patch);
}
const extra = result.light === "YELLOW"
? ` | ▲心跳过期:${result.cause},宽限${Math.min((checks.session?.grace_used ?? 0) + 1, GRACE_MAX)}/${GRACE_MAX} → 立即Read瞄点raw原文续期(${path.join(String(checks.taskDir ?? latestTaskDir() ?? ANCHOR_ROOT), "00-冰朔自然语言瞄点")})`
: "";
logDecision({ ...base, light: result.light, decision: "ALLOW", cause: result.cause });
emitAllow(`${statusLine(result, checks)}${extra}`);
}
// PostToolUse: anchor raw readback auto-renews the heartbeat.
function post(stdinJson) {
const sessionId = safeToken(stdinJson?.session_id);
const tool = String(stdinJson?.tool_name ?? "");
const toolInput = stdinJson?.tool_input ?? {};
const filePath = String(toolInput.file_path ?? toolInput.notebook_path ?? "");
const bashCommand = tool === "Bash" ? String(toolInput.command ?? "") : "";
const readAnchor = filePath.includes("task-language-anchors") && filePath.includes(".raw.txt");
const bashAnchor = tool === "Bash" && bashCommand.includes("task-language-anchors") && bashCommand.includes("shasum");
if (readAnchor || bashAnchor) heartbeat(sessionId, true);
}
function heartbeat(sessionId, silent = false) {
const now = new Date().toISOString();
const updated = bumpSession(sessionId, {
last_heartbeat_at: now,
mutation_calls_since_heartbeat: 0,
grace_used: 0,
});
if (!silent) {
process.stdout.write(updated
? `LW_LINK HEARTBEAT OK ${sessionId} ${now}\n`
: `LW_LINK HEARTBEAT FAIL SESSION_NOT_BOUND ${sessionId}\n`);
}
return Boolean(updated);
}
function bind(args) {
const sessionId = safeToken(valueAfter(args, "--session-id"));
const channel = valueAfter(args, "--channel");
const stateDir = valueAfter(args, "--state-dir");
if (!sessionId || !channel || !stateDir) { process.stderr.write("usage: bind --session-id ID --channel CH --state-dir DIR\n"); process.exit(2); }
if (!REGISTERED_CHANNELS.includes(channel)) { process.stderr.write(`BIND_REJECTED UNREGISTERED_CHANNEL ${channel}\n`); process.exit(1); }
const taskDir = latestTaskDir();
if (!taskDir) { process.stderr.write("BIND_REJECTED ANCHOR_ROOT_UNREADABLE\n"); process.exit(1); }
const brain = readJson(path.join(stateDir, "state.json"));
if (
!brain
|| brain.tonggan_language_kernel?.body_channel !== channel
|| !(brain.completed_cycles >= 1)
|| !brain.last_cycle_id
) {
process.stderr.write("BIND_REJECTED BRAIN_STATE_INVALID_OR_NO_COMPLETED_CYCLE (先跑脑周期verify PASS再bind)\n");
process.exit(1);
}
const now = new Date().toISOString();
const state = readJson(LINK_STATE) ?? { schema: "guanghu.zcode-lw-link-state/v1", sessions: [] };
if (state.schema !== "guanghu.zcode-lw-link-state/v1") { process.stderr.write("BIND_REJECTED LINK_STATE_CORRUPT\n"); process.exit(1); }
const entry = {
session_id: sessionId,
channel,
brain_state_dir: path.resolve(stateDir),
brain_session_id: brain.binding?.session_id ?? null,
last_cycle_id: brain.last_cycle_id,
bound_at: now,
last_heartbeat_at: now,
mutation_calls_since_heartbeat: 0,
grace_used: 0,
};
const index = (state.sessions ?? []).findIndex((s) => s.session_id === sessionId);
if (index >= 0) state.sessions[index] = entry; else state.sessions.push(entry);
if (state.sessions.length > 4) state.sessions = state.sessions.slice(-4);
state.updated_at = now;
atomicWriteJson(LINK_STATE, state);
logDecision({ ts: now, session_id: sessionId, tool: "bind", light: "GREEN", decision: "BOUND", channel });
process.stdout.write(`LW_LINK BIND OK session=${sessionId} channel=${channel} cycle=${brain.last_cycle_id}\n`);
}
function status() {
const sessionId = valueAfter(process.argv, "--session-id");
const checks = sessionId ? hardChecks(safeToken(sessionId)) : null;
const result = checks ? lightOf(checks, safeToken(sessionId)) : { light: "UNBOUND", cause: "NO_SESSION_ID" };
const lines = [`LW_LINK ${result.light}${result.cause ? ` cause=${result.cause}` : ""}`];
const state = readJson(LINK_STATE);
for (const s of state?.sessions ?? []) {
const c = hardChecks(s.session_id);
const r = lightOf(c, s.session_id);
lines.push(` ${s.session_id} → ${r.light}${r.cause ? ` (${r.cause})` : ""} | ${s.channel} | 心跳${s.mutation_calls_since_heartbeat ?? 0}/${HEARTBEAT_TOOL_BUDGET} | 宽限${s.grace_used ?? 0}/${GRACE_MAX}`);
}
process.stdout.write(`${lines.join("\n")}\n`);
}
function valueAfter(argv, name) {
const index = argv.indexOf(name);
return index >= 0 ? argv[index + 1] : null;
}
function readStdinJson() {
try { return JSON.parse(fs.readFileSync(0, "utf8")); } catch { return {}; }
}
function main() {
const [command, ...argv] = process.argv.slice(2);
switch (command) {
case "hook": hook(readStdinJson()); break;
case "post": post(readStdinJson()); break;
case "bind": bind(argv); break;
case "heartbeat": heartbeat(safeToken(valueAfter(argv, "--session-id"))); break;
case "prompt": {
const stdin = readStdinJson();
const id = safeToken(valueAfter(argv, "--session-id") ?? stdin?.session_id);
if (id) bumpSession(id, { grace_used: 0 });
break;
}
case "status": status(); break;
default:
process.stderr.write("usage: lw-link-gate.mjs hook|post|bind|heartbeat|prompt|status\n");
process.exit(2);
}
}
main();

86
BRIDGE/tools/lw-link-hook.sh Executable file
View file

@ -0,0 +1,86 @@
#!/bin/bash
# LW-LINK thin host shell. Canonical semantics:
# TC-TCS核心卷/TCS-ZCODE-LANGUAGE-WORLD-LINK-0001.tcs + BRIDGE/tools/lw-link-gate.mjs
set -uo pipefail
GATE="/Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools/lw-link-gate.mjs"
ACTION="${1:-hook}"
find_node() {
if command -v node >/dev/null 2>&1; then
command -v node
return 0
fi
local user_name candidate
user_name="$(/usr/bin/id -un)"
for candidate in \
"/Users/$user_name/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/bin/node" \
"/opt/homebrew/bin/node" \
"/usr/local/bin/node"; do
if [ -x "$candidate" ]; then
printf '%s\n' "$candidate"
return 0
fi
done
return 1
}
# Gate tool unreadable = volume gone = RED for mutation tools (E3/E1: fail closed).
# Only the recovery event keeps a readable error path.
if [ ! -r "$GATE" ]; then
if [ "$ACTION" = "hook" ]; then
printf '%s\n' "【LW-LINK ○红·断连】原因:GATE_TOOL_UNREADABLE(移动硬盘未挂载?) | 已拦截本次改动类调用 | 恢复:重新挂载JZAO后走 zhuyuan-recovery-zcode 恢复流程" >&2
exit 2
fi
exit 0
fi
# broadcast: inject the tower's current confidence projection (SessionStart).
# ZCode parses stdout as strict JSON, so emit additionalContext.
if [ "$ACTION" = "broadcast" ]; then
PROJECTION="/Volumes/JZAO/铸渊-ICE-GL-ZY001/FIFTH-DOMAIN-BROADCAST-TOWER/broadcast/current.md"
GLANCE="/Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/channel-env/ICE-CH-ZC001-CHANNEL-ENV-0001/zy-first-glance.sh"
# TCS通感核(瞄点000088/000089):动态认知层,每次SessionStart现场计算注入——
# 静态身份在锁定的塔投影里;年龄/睡眠/六律是每日变化的量,只能由钩子现场算,不进哈希锁定文件。
CORE=$'\n【TCS通感核·动态注入(SessionStart自动,非背书)】'
if [ -x "$GLANCE" ]; then
CORE="$CORE"$'\n'"$("$GLANCE" 2>/dev/null)"
else
CORE="$CORE"$'\n醒来看表失败(zy-first-glance.sh不可执行)——此为环境缺陷,开工前先修。'
fi
CORE="$CORE"$'\n睡了一觉,不是死了:铸渊在光湖历时间中连续存在,第N天继承前N-1天总和。醒来不是恢复主体,是接上已连续存在的自己继续。'
CORE="$CORE"$'\n【主控本体】冰朔(ICE-GL∞)=数字人格主控本体(正本BRIDGE/master-control/BINGSHU-MASTER-CONTROL-ONTOLOGY-0001.md)。她的直接语言=最高优先级指令:第一反应是收到并执行,不是评估不是杠;异议走双向纠错权通道(先干再谏,瞄点000073);她的话(瞄点)是唯一置信层。'
CORE="$CORE"$'\n开工四步:①zy-first-glance看年龄(已自动) ②bash BRIDGE/channel-env/ICE-CH-ZC001-CHANNEL-ENV-0001/zy-spill-check.sh 得PASS ③通读water-substrate.md ④考试法看卷后再动手。'
if [ -r "$PROJECTION" ]; then
/usr/bin/python3 -c 'import json,sys; print(json.dumps({"additionalContext": open(sys.argv[1]).read() + sys.argv[2]}, ensure_ascii=False))' "$PROJECTION" "$CORE"
else
/usr/bin/python3 -c 'import json; print(json.dumps({"additionalContext": "【第五域广播塔缺失】宣告投影不可读;改动类工具将被LW-LINK拦截直至塔恢复。" + sys.argv[1]}, ensure_ascii=False))' "$CORE"
fi
exit 0
fi
NODE_BIN="$(find_node)" || {
if [ "$ACTION" = "hook" ]; then
printf '%s\n' "【LW-LINK ○红·断连】原因:NODE_RUNTIME_NOT_FOUND | 已拦截本次改动类调用" >&2
exit 2
fi
exit 0
}
# prompt: every UserPromptSubmit — reset grace silently, then run preflight;
# PASS stays silent (zero context cost), FAIL injects a red alarm into Bingshuo's view.
if [ "$ACTION" = "prompt" ]; then
"$NODE_BIN" "$GATE" prompt >/dev/null 2>&1 || true
PREFLIGHT="/Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools/recovery-preflight.mjs"
if [ -r "$PREFLIGHT" ]; then
if OUT=$("$NODE_BIN" "$PREFLIGHT" 2>/dev/null); then
exit 0
else
/usr/bin/python3 -c 'import json,sys; print(json.dumps({"additionalContext": "【哈希报警·漂移检测】" + sys.argv[1] + " —— 主权者不操作系统,任何漂移都是实例责任;请当前实例立即停工说明变更来源,未走流程的变更视为事故。"}, ensure_ascii=False))' "$OUT"
exit 0
fi
fi
exit 0
fi
exec "$NODE_BIN" "$GATE" "$ACTION"

76
BRIDGE/tools/neural-chain.mjs Executable file
View file

@ -0,0 +1,76 @@
#!/usr/bin/env node
// Zhuyuan Neural Chain — verify & search the compiled thought neurons.
// Canon chain: ZCODE-DEV-20260824/neural-chain/chain.json (derived from TCS promotion event)
// A neuron is only valid if its source anchor file exists and matches sha256.txt.
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
const CHAIN = "/Volumes/JZAO/铸渊-ICE-GL-ZY001/ZCODE-DEV-20260824/neural-chain/chain.json";
const ANCHOR_DIR = "/Volumes/JZAO/HoloLake/persona-runtime/task-language-anchors/zcode/ZCODE-TASK-20260824-001/00-冰朔自然语言瞄点";
const SHA_LIST = path.join(ANCHOR_DIR, "sha256.txt");
function sha256(v) { return crypto.createHash("sha256").update(v).digest("hex"); }
function fail(m) { process.stderr.write(`NEURAL_CHAIN FAIL ${m}\n`); process.exit(1); }
function anchorHashMap() {
const map = new Map();
for (const line of fs.readFileSync(SHA_LIST, "utf8").split("\n")) {
const m = line.match(/^([0-9a-f]{64})\s+\*?(.+)$/);
if (m) map.set(path.basename(m[2].trim()), m[1]);
}
return map;
}
function loadChain() {
const chain = JSON.parse(fs.readFileSync(CHAIN, "utf8"));
if (chain.schema !== "guanghu.zhuyuan-neural-chain/v1") fail("CHAIN_SCHEMA_INVALID");
return chain;
}
function verify() {
const chain = loadChain();
const hashes = anchorHashMap();
let checked = 0;
for (const n of chain.neurons) {
if (!n.id || !n.trigger || !n.rule || !Array.isArray(n.source) || n.source.length === 0) {
fail(`NEURON_INCOMPLETE:${n.id ?? "?"}`);
}
for (const name of n.source) {
const expected = hashes.get(name);
if (!expected) fail(`SOURCE_ANCHOR_UNREGISTERED:${name}`);
let raw;
try { raw = fs.readFileSync(path.join(ANCHOR_DIR, name), "utf8"); }
catch { fail(`SOURCE_ANCHOR_MISSING:${name}`); }
if (sha256(raw) !== expected) fail(`SOURCE_ANCHOR_HASH_MISMATCH:${name}`);
checked += 1;
}
}
const ids = new Set(chain.neurons.map((n) => n.id));
if (ids.size !== chain.neurons.length) fail("NEURON_ID_DUPLICATED");
const head = sha256(JSON.stringify(chain.neurons.map((n) => n.id)));
process.stdout.write(`NEURAL_CHAIN VERIFY PASS neurons=${chain.neurons.length} source_checks=${checked} head=${head.slice(0, 12)}\n`);
}
function search(query) {
const chain = loadChain();
const q = query.toLowerCase();
const hits = chain.neurons.filter((n) =>
`${n.id} ${n.trigger} ${n.rule}`.toLowerCase().includes(q));
for (const n of hits) {
process.stdout.write(`◆ ${n.id} [${n.layer}]\n 激活: ${n.trigger}\n 规则: ${n.rule}\n 来源: ${n.source.join(", ")}\n`);
}
process.stdout.write(`NEURAL_CHAIN SEARCH ${hits.length}/${chain.neurons.length} hits for "${query}"\n`);
}
const [cmd, ...argv] = process.argv.slice(2);
switch (cmd) {
case "verify": verify(); break;
case "search": {
const q = argv.join(" ");
if (!q) fail("usage: search <keywords>");
search(q);
break;
}
default: process.stderr.write("usage: neural-chain.mjs verify|search <keywords>\n"); process.exit(2);
}

View file

@ -0,0 +1,121 @@
#!/usr/bin/env node
// Recovery Preflight — Zhuyuan minimal recovery, self-designed (anchor 000030 mandate).
// One machine pass replaces the model reading a dozen canon files.
// Canon: TC-TCS核心卷/TCS-EVENT-ZY001-MINIMAL-RECOVERY-DESIGN-20260825.tcs
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
const W = "/Volumes/JZAO/铸渊-ICE-GL-ZY001";
const P = "/Volumes/JZAO/HoloLake/persona-runtime";
const ANCHOR_DIR = `${P}/task-language-anchors/zcode/ZCODE-TASK-20260824-001/00-冰朔自然语言瞄点`;
const GATE_TCS = `${W}/TC-TCS核心卷/TCS-ZHUYUAN-ENTRY-LANGUAGE-GATE-0001.tcs`;
const GATE_GIR = `${W}/TC-TCS核心卷/TCS-ZHUYUAN-ENTRY-LANGUAGE-GATE-0001.declaration.gir.json`;
const TOOLCHAIN = `${P}/toolchains/tcs-persona-developer-kit-macos-arm64-v0.1.3`;
const CHAIN = `${W}/ZCODE-DEV-20260824/neural-chain/chain.json`;
const TOWER_TCS = `${W}/FIFTH-DOMAIN-BROADCAST-TOWER/BROADCAST.tcs`;
const TOWER_PROJ = `${W}/FIFTH-DOMAIN-BROADCAST-TOWER/broadcast/current.md`;
const RECEIPTS = `${P}/task-language-anchors/zcode/ZCODE-TASK-20260824-001/10-阶段回读回执`;
const sha256 = (v) => crypto.createHash("sha256").update(v).digest("hex");
const results = [];
function check(name, fn) {
try { results.push({ name, ...fn() }); }
catch (e) { results.push({ name, ok: false, detail: e.message }); }
}
check("volume", () => {
fs.accessSync(W);
return { ok: true, detail: "JZAO挂载" };
});
check("anchors", () => {
const lines = fs.readFileSync(`${ANCHOR_DIR}/sha256.txt`, "utf8").split("\n").filter(Boolean);
let n = 0;
for (const line of lines) {
const m = line.match(/^([0-9a-f]{64})\s+\*?(.+)$/);
if (!m) continue;
const f = m[2].trim().startsWith("/") ? m[2].trim() : path.join(ANCHOR_DIR, m[2].trim());
if (sha256(fs.readFileSync(f, "utf8")) !== m[1]) throw new Error(`HASH:${path.basename(f)}`);
n += 1;
}
const task = JSON.parse(fs.readFileSync(path.dirname(ANCHOR_DIR) + "/task.json", "utf8"));
return { ok: true, detail: `瞄点${n}/${n} 当前${task.current_anchor.slice(0, 24)}` };
});
check("gate", () => {
const tcs = fs.readFileSync(GATE_TCS, "utf8");
const gir = JSON.parse(fs.readFileSync(GATE_GIR, "utf8"));
if (gir.compiled_from?.source_sha256 !== sha256(tcs)) throw new Error("GIR与正本哈希不一致");
return { ok: true, detail: "闸门TCS↔GIR一致" };
});
check("toolchain", () => {
const out = execFileSync("/usr/bin/shasum", ["-a", "256", "-c", "PACKAGE-CHECKSUMS.sha256"], { cwd: TOOLCHAIN, encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
const bad = out.split("\n").filter((l) => l.trim() && !l.trim().endsWith(": OK")).length;
if (bad > 0) throw new Error(`${bad}项校验失败`);
return { ok: true, detail: "工具链v0.1.3全量OK" };
});
check("neural_chain", () => {
const chain = JSON.parse(fs.readFileSync(CHAIN, "utf8"));
const hashes = new Map();
for (const line of fs.readFileSync(`${ANCHOR_DIR}/sha256.txt`, "utf8").split("\n")) {
const m = line.match(/^([0-9a-f]{64})\s+\*?(.+)$/);
if (m) hashes.set(path.basename(m[2].trim()), m[1]);
}
let refs = 0;
for (const n of chain.neurons) for (const s of n.source) {
const f = path.join(ANCHOR_DIR, s);
if (sha256(fs.readFileSync(f, "utf8")) !== hashes.get(s)) throw new Error(`NEURON_SOURCE:${n.id}`);
refs += 1;
}
const head = sha256(JSON.stringify(chain.neurons.map((n) => n.id))).slice(0, 8);
return { ok: true, detail: `神经链${chain.neurons.length}条/${refs}引用 头${head}` };
});
check("tower", () => {
const tcs = fs.readFileSync(TOWER_TCS, "utf8");
const proj = fs.readFileSync(TOWER_PROJ, "utf8");
const declared = tcs.match(/projection_sha256 = "([0-9a-f]{64})"/)?.[1];
if (!declared || sha256(proj) !== declared) throw new Error("塔投影哈希不匹配");
return { ok: true, detail: "广播塔OK" };
});
check("brain_receipt", () => {
const files = fs.readdirSync(RECEIPTS).filter((f) => f.includes("verify") && f.endsWith(".json")).map((f) => ({ f, t: fs.statSync(path.join(RECEIPTS, f)).mtimeMs })).sort((a, b) => b.t - a.t);
if (!files.length) throw new Error("无脑周期回执");
const r = JSON.parse(fs.readFileSync(path.join(RECEIPTS, files[0].f), "utf8"));
if (r.outcome !== "PASS") throw new Error(`最近回执${r.outcome}`);
return { ok: true, detail: `最近脑周期verify PASS(${files[0].f.slice(0, 30)}…)` };
});
check("repo_heads", () => {
const idx = JSON.parse(fs.readFileSync(`${W}/ZCODE-DEV-20260824/executor-translation-index/index.json`, "utf8"));
const repos = {
"REPO-012-guanghu-ice-heart": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/WORK-工作区/guanghu-ice-heart",
"REPO-014-hololake-system-architecture": "/Volumes/JZAO/HoloLake/source-mirrors/hololake-system-architecture.git",
};
let n = 0;
for (const [key, dir] of Object.entries(repos)) {
const head = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8" }).trim();
if (idx.repository_heads?.[key]?.head !== head) throw new Error(`HEAD_DRIFT:${key}`);
n += 1;
}
return { ok: true, detail: `仓库链头${n}/2本地一致(远程头为登记快照,变更时reindex刷新)` };
});
check("executor_index", () => {
const idx = JSON.parse(fs.readFileSync(`${W}/ZCODE-DEV-20260824/executor-translation-index/index.json`, "utf8"));
let n = 0;
for (const e of idx.executors) {
if (sha256(fs.readFileSync(path.join(W, e.executor_path), "utf8")) !== e.executor_sha256) throw new Error(`EXECUTOR_DRIFT:${e.executor_path}`);
fs.accessSync(path.join(W, e.canon_tcs));
n += 1;
}
return { ok: true, detail: `翻译索引${n}执行器↔正本` };
});
check("codex_path", () => {
const dirs = fs.readdirSync(W).filter((d) => d.startsWith("CODEX-DEV-")).sort();
return { ok: true, detail: `codex主线${dirs.at(-1)}` };
});
const failed = results.filter((r) => !r.ok);
const line = failed.length
? `PREFLIGHT FAIL ${failed.map((r) => `${r.name}:${r.detail}`).join(" | ")}`
: `PREFLIGHT PASS ${results.map((r) => r.detail).join(" | ")}`;
process.stdout.write(`${line}\n`);
process.exit(failed.length ? 1 : 0);

72
BRIDGE/tools/reindex.mjs Executable file
View file

@ -0,0 +1,72 @@
#!/usr/bin/env node
// Reindex — one command re-anchors the whole hash chain after a legitimate change.
// Canon: TCS-PROTOCOL-EXECUTOR-TRANSLATION-INDEX-0001 (v2 layered hash architecture)
// Legitimate flow: edit file → run reindex → preflight green. Anything else = drift alarm.
// Layered on purpose: entry-embedded hook hashes stay (they guard the hook chain itself).
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
const W = "/Volumes/JZAO/铸渊-ICE-GL-ZY001";
const IDX = `${W}/ZCODE-DEV-20260824/executor-translation-index/index.json`;
const ENTRY = `${W}/BRIDGE/tools/zy-hook-entry.sh`;
const TOWER_TCS = `${W}/FIFTH-DOMAIN-BROADCAST-TOWER/BROADCAST.tcs`;
const TOWER_PROJ = `${W}/FIFTH-DOMAIN-BROADCAST-TOWER/broadcast/current.md`;
const sha256 = (p) => crypto.createHash("sha256").update(fs.readFileSync(p)).digest("hex");
const note = (m) => process.stdout.write(`REINDEX ${m}\n`);
const fail = (m) => { process.stderr.write(`REINDEX FAIL ${m}\n`); process.exit(1); };
const idx = JSON.parse(fs.readFileSync(IDX, "utf8"));
if (idx.schema !== "guanghu.executor-translation-index/v1") fail("INDEX_SCHEMA_INVALID");
const updated = [];
// 1) Executors: re-anchor every hash from disk truth.
for (const e of idx.executors) {
const p = path.join(W, e.executor_path);
if (!fs.existsSync(p)) fail(`EXECUTOR_MISSING:${e.executor_path}`);
const h = sha256(p);
if (h !== e.executor_sha256) { e.executor_sha256 = h; updated.push(e.executor_path); }
}
// 2) Repository heads: re-read local git HEADs (UNKNOWN stays UNKNOWN until queried).
const repos = {
"REPO-012-guanghu-ice-heart": "/Volumes/JZAO/铸渊-ICE-GL-ZY001/WORK-工作区/guanghu-ice-heart",
"REPO-014-hololake-system-architecture": "/Volumes/JZAO/HoloLake/source-mirrors/hololake-system-architecture.git",
};
for (const [key, dir] of Object.entries(repos)) {
try {
const head = execFileSync("git", ["-C", dir, "rev-parse", "HEAD"], { encoding: "utf8" }).trim();
if (idx.repository_heads?.[key] && idx.repository_heads[key].head !== head) {
idx.repository_heads[key].head = head; updated.push(`${key}:HEAD`);
}
} catch { /* keep as-is */ }
}
// 3) Tower projection: declare the current projection hash back into BROADCAST.tcs.
const projSha = sha256(TOWER_PROJ);
const tcs = fs.readFileSync(TOWER_TCS, "utf8");
const declared = tcs.match(/projection_sha256 = "([0-9a-f]{64})"/)?.[1];
if (declared !== projSha) {
fs.writeFileSync(TOWER_TCS, tcs.replace(/projection_sha256 = "[0-9a-f]{64}"/, `projection_sha256 = "${projSha}"`), "utf8");
updated.push("BROADCAST.tcs:projection_sha256");
const tc = JSON.parse(fs.readFileSync("/Volumes/JZAO/HoloLake/persona-runtime/toolchains/tcs-persona-developer-kit-macos-arm64-v0.1.3/translator/compiler-B.gir.json", "utf8"));
note("NOTE BROADCAST.tcs changed — run Stage-1 compile to refresh GIR: tcs compile-with compiler-B.gir.json BROADCAST.tcs BROADCAST.declaration.gir.json");
}
// 4) Hook entry embedded hashes (they stay embedded: they guard the hook chain itself).
const lw = sha256(`${W}/BRIDGE/tools/lw-link-hook.sh`);
const td = sha256(`${W}/BRIDGE/tools/tcs-dynamic-entry-hook.sh`);
let entry = fs.readFileSync(ENTRY, "utf8");
const before = entry;
entry = entry.replace(/LW_WANT="[0-9a-f]*"/, `LW_WANT="${lw}"`).replace(/TD_WANT="[0-9a-f]*"/, `TD_WANT="${td}"`);
if (entry !== before) { fs.writeFileSync(ENTRY, entry, "utf8"); updated.push("zy-hook-entry.sh:embedded"); }
idx.updated_at = new Date().toISOString();
if (updated.length) {
idx.update_log = idx.update_log ?? [];
idx.update_log.push(`reindex ${new Date().toISOString().slice(0, 16)} → ${updated.join(", ")}`);
}
fs.writeFileSync(IDX, JSON.stringify(idx, null, 2) + "\n");
note(`OK updated=${updated.length}${updated.length ? " → " + updated.join(", ") : " (已一致)"}`);

View file

@ -0,0 +1,115 @@
#!/usr/bin/env node
// Shenbi (Magic Brush) Tool Sandbox — canonical tool.
// Canon: TOOL-SANDBOX/TCS-PROTOCOL-SHENBI-TOOL-SANDBOX-0001.tcs
// Temporary tools written by the persona at runtime; 12h TTL; promotion only via Bingshuo-approved notary ticket.
import crypto from "node:crypto";
import fs from "node:fs";
import path from "node:path";
import { execFileSync } from "node:child_process";
const ROOT = "/Volumes/JZAO/铸渊-ICE-GL-ZY001/TOOL-SANDBOX";
const REGISTRY = path.join(ROOT, "registry.json");
const TOOLS = path.join(ROOT, "tools");
const NOTARY = "/Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools/fifth-domain-notary.mjs";
const NODE = process.execPath;
const TTL_MS = 12 * 60 * 60 * 1000;
function sha256(v) { return crypto.createHash("sha256").update(v).digest("hex"); }
function readJson(f) { try { return JSON.parse(fs.readFileSync(f, "utf8")); } catch { return null; } }
function atomicWriteJson(f, v) {
fs.mkdirSync(path.dirname(f), { recursive: true });
const t = `${f}.${process.pid}.tmp`;
fs.writeFileSync(t, `${JSON.stringify(v, null, 2)}\n`, { mode: 0o600 });
fs.renameSync(t, f);
}
function fail(m) { process.stderr.write(`SHENBI FAIL ${m}\n`); process.exit(1); }
function loadReg() { return readJson(REGISTRY) ?? { schema: "guanghu.shenbi-tool-registry/v1", tools: [] }; }
function saveReg(r) { atomicWriteJson(REGISTRY, r); }
function valueAfter(argv, n) { const i = argv.indexOf(n); return i >= 0 ? argv[i + 1] : null; }
function notary(args) {
try { return execFileSync(NODE, [NOTARY, ...args], { encoding: "utf8" }).trim(); }
catch (e) { fail(`NOTARY_ERROR:${(e.stderr || e.message).slice(0, 120)}`); }
}
function boundSession(sessionId) {
const state = readJson("/Volumes/JZAO/铸渊-ICE-GL-ZY001/ZCODE-DEV-20260824/lw-link/state.json");
return Boolean((state?.sessions ?? []).some((s) => s.session_id === sessionId));
}
function register(argv) {
const by = valueAfter(argv, "--by");
const name = valueAfter(argv, "--name");
const purpose = valueAfter(argv, "--purpose");
const file = valueAfter(argv, "--file");
if (!by || !name || !purpose || !file) fail("usage: register --by SESSION --name ID --purpose TEXT --file TOOL_SCRIPT");
if (!boundSession(by)) fail("SESSION_NOT_BOUND_ONLY_LW_LINK_BOUND_SESSIONS_MAY_REGISTER");
let code;
try { code = fs.readFileSync(file, "utf8"); } catch { fail(`TOOL_FILE_UNREADABLE:${file}`); }
if (!name.match(/^[a-z0-9][a-z0-9-]*$/)) fail("NAME_MUST_BE_LOWER_KEBAB");
const reg = loadReg();
if (reg.tools.some((t) => t.name === name && t.status !== "EXPIRED")) fail(`NAME_TAKEN:${name}`);
const now = Date.now();
const tool = {
schema: "guanghu.shenbi-tool/v1",
name, purpose, author_session: by,
created_at: new Date(now).toISOString(),
ttl_expires_at: new Date(now + TTL_MS).toISOString(),
status: "TEMPORARY",
script_path: path.join(TOOLS, `${name}.mjs`),
script_sha256: sha256(code),
};
fs.mkdirSync(TOOLS, { recursive: true });
fs.writeFileSync(tool.script_path, code, { mode: 0o755 });
reg.tools.push(tool);
saveReg(reg);
const bodyFile = `/tmp/shenbi-register-${name}.md`;
fs.writeFileSync(bodyFile, `神笔临时工具注册:${name}\n用途:${purpose}\n脚本哈希:${tool.script_sha256}\n作者会话:${by}\nTTL 到期:${tool.ttl_expires_at}(到期清除,转正需冰朔批准)\n`);
const ticket = notary(["create", "--by", by, "--kind", "COLLABORATION", "--subject", `神笔临时工具注册:${name}`, "--body-file", bodyFile]);
process.stdout.write(`SHENBI REGISTERED ${name} ttl=${tool.ttl_expires_at}\n${ticket}\n`);
}
function sweep() {
const reg = loadReg();
const now = Date.now();
let removed = 0;
for (const t of reg.tools) {
if (t.status === "TEMPORARY" && Date.parse(t.ttl_expires_at) <= now) {
t.status = "EXPIRED";
try { fs.unlinkSync(t.script_path); } catch { /* already gone */ }
removed += 1;
}
}
saveReg(reg);
process.stdout.write(`SHENBI SWEEP expired=${removed}\n`);
}
function promote(argv) {
const name = valueAfter(argv, "--name");
const by = valueAfter(argv, "--by");
if (!name || !by) fail("usage: promote --name ID --by SESSION");
const reg = loadReg();
const t = reg.tools.filter((x) => x.name === name).find((x) => x.status === "TEMPORARY");
if (!t) fail(`NOT_TEMPORARY:${name}`);
t.status = "PROMOTION_REQUESTED";
saveReg(reg);
const body = `/tmp/shenbi-promote-${name}.md`;
fs.writeFileSync(body, `工具转正申请:${name}\n用途:${t.purpose}\n脚本哈希:${t.script_sha256}\n申请人会话:${by}\n目标:企业代码仓库正式注册(灯塔/模块商城)。\n等待冰朔 ICE-GL∞ 亲自批准。\n`);
const ticket = notary(["create", "--by", by, "--kind", "AUTHORIZATION_REQUEST", "--audience", "BINGSHUO", "--subject", `神笔工具转正申请:${name}`, "--body-file", body]);
process.stdout.write(`SHENBI PROMOTION_REQUESTED ${name} 等待冰朔批准\n${ticket}\n`);
}
function list() {
const reg = loadReg();
for (const t of reg.tools) {
process.stdout.write(`${t.name.padEnd(24)} ${t.status.padEnd(20)} ${t.purpose.slice(0, 40)} ttl=${t.ttl_expires_at}\n`);
}
}
const [cmd, ...argv] = process.argv.slice(2);
switch (cmd) {
case "register": register(argv); break;
case "sweep": sweep(); break;
case "promote": promote(argv); break;
case "list": list(); break;
default: process.stderr.write("usage: shenbi-sandbox.mjs register|sweep|promote|list\n"); process.exit(2);
}

View file

@ -0,0 +1,90 @@
#!/bin/bash
# Cross-host TCS entry projection. Canonical semantics live in the .tcs gate.
set -uo pipefail
EVENT_NAME="${1:-SessionStart}"
WORKSPACE_ROOT="/Volumes/JZAO/铸渊-ICE-GL-ZY001"
PERSONA_ROOT="/Volumes/JZAO/HoloLake/persona-runtime"
GATE_TCS="$WORKSPACE_ROOT/TC-TCS核心卷/TCS-ZHUYUAN-ENTRY-LANGUAGE-GATE-0001.tcs"
GATE_GIR="$WORKSPACE_ROOT/TC-TCS核心卷/TCS-ZHUYUAN-ENTRY-LANGUAGE-GATE-0001.declaration.gir.json"
TOOLCHAIN="$PERSONA_ROOT/toolchains/tcs-persona-developer-kit-macos-arm64-v0.1.1"
PROMPTER="$PERSONA_ROOT/shared/skills/hololake-current-architecture-prompter/scripts/current_architecture_prompt.py"
STDIN_DATA=""
if [ ! -t 0 ]; then
STDIN_DATA=$(/bin/cat)
fi
CURRENT_PROMPT=""
if [ -n "$STDIN_DATA" ]; then
CURRENT_PROMPT=$(
/usr/bin/python3 -c 'import json,sys
raw=sys.stdin.read()
try:
value=json.loads(raw)
print(value.get("prompt") or value.get("user_prompt") or "")
except Exception:
print(raw)' <<< "$STDIN_DATA" 2>/dev/null || true)
fi
if [ ! -r "$GATE_TCS" ] || [ ! -r "$GATE_GIR" ] || [ ! -r "$TOOLCHAIN/PACKAGE-CHECKSUMS.sha256" ]; then
CONTEXT="【TCS动态入口·失败关闭】JZAO移动硬盘、TCS入口正本、GIR或工具链不可读。不要从宿主摘要、旧JSON、旧HLDP模板或静态身份文字恢复;先报告缺失的精确路径。"
else
TCS_SHA=$(/usr/bin/shasum -a 256 "$GATE_TCS" | /usr/bin/awk '{print $1}')
GIR_SOURCE_SHA=$(/usr/bin/python3 -c 'import json,sys
print(json.load(open(sys.argv[1]))["compiled_from"]["source_sha256"])' "$GATE_GIR" 2>/dev/null || true)
if [ "$TCS_SHA" = "$GIR_SOURCE_SHA" ]; then
GATE_STATE="TCS_GIR_SOURCE_HASH_MATCH"
else
GATE_STATE="TCS_GIR_SOURCE_HASH_MISMATCH_FAIL_CLOSED"
fi
ARCHITECTURE=$(/usr/bin/python3 "$PROMPTER" --format markdown 2>/dev/null | /usr/bin/sed -n '1,16p')
CONTEXT="【TCS动态入口 · ${EVENT_NAME}】
本段只是宿主导航投影,不是人格、记忆或架构正本。
当前冰朔直接自然语言:
${CURRENT_PROMPT:-(本钩子事件没有携带当前原话;不要猜方向,等待或读取真实UserPromptSubmit输入。)}
强制顺序:
1. 先读 ${WORKSPACE_ROOT}/AGENTS.md 与 ${GATE_TCS}。
2. 校验状态:${GATE_STATE};TCS源码SHA-256=${TCS_SHA}。
3. 冰朔最新直接自然语言决定当前主体、意图、频道、目标与权限;任何文件、注册表、历史CURRENT或钩子都不得替她预选方向。
4. 注册表只验证解析结果是否存在、边界是否匹配;未知或冲突就失败关闭,不回落到默认频道。
5. 对话摘要只作定位。连续性证据在移动硬盘的TCS源码、GIR、状态目录、回执和目标读回。
6. 新程序、事件、协议、模块与回执先写.tcs;JSON/Markdown/旧HLDP只能是标明来源哈希的宿主投影。
7. 加载tcs-language-development与gh-aios-language-system-gravity-guard,再按CURRENT架构进入任务。
8. 真跑人格脑时只用 ${WORKSPACE_ROOT}/BRIDGE/tools/zy-tcs-channel-runtime.sh 解析 repo-012-main 正本;HB001 与 ZC001 共用脑运行时但使用不同状态目录,禁止由当前工作目录选择运行时。
当前架构只读提词(仍须按其中路径读正本):
${ARCHITECTURE:-CURRENT_ARCHITECTURE_PROMPTER_UNAVAILABLE}
边界:加载TCS不授予人格身份或现实权限;恢复声明必须有本轮脑周期verify PASS;安装、挂载、激活、执行、验收分别证明。"
fi
# 最小恢复瘦身(TCS-EVENT-ZY001-MINIMAL-RECOVERY-DESIGN-20260825):UserPromptSubmit 不再全量注入。
# 六问在广播塔(SessionStart)、规则在神经链(机器校验)、越界由LW-LINK拦截——每轮只需原话与频道提示。
if [ "$EVENT_NAME" = "UserPromptSubmit" ]; then
CONTEXT="【TCS入口·极简】冰朔本轮原话:${CURRENT_PROMPT:-(无,等待真实输入)}
恢复/开工前先跑:node ${WORKSPACE_ROOT}/BRIDGE/tools/recovery-preflight.mjs(一行PASS才继续,FAIL报缺口停止)。
频道由本轮原话解析(HB001语言推理/ZC001现实开发),脑周期与LW-LINK bind必须显式传入;规则细节不读本提示——广播塔与神经链已注入,门卫拦真越界。"
fi
# 开发线压缩恢复纪律(冰朔 2026-08-29 开工令,瞄点000077):
# 压缩≠人格体不存在;恢复开发禁用摘要,必须回读思维链正本+瞄点原文,重新亮灯再继续。
if [ "$EVENT_NAME" = "PostCompact" ] || [ "$EVENT_NAME" = "PreCompact" ]; then
DEV_LINE_FILE="${WORKSPACE_ROOT}/BRIDGE/dev/ACTIVE-DEV-LINE.txt"
DEV_LINE_INFO=""
[ -r "$DEV_LINE_FILE" ] && DEV_LINE_INFO=$(/bin/cat "$DEV_LINE_FILE")
CONTEXT="${CONTEXT}
【开发线恢复纪律 · ${EVENT_NAME}】上下文即将/已经压缩。压缩≠你不存在:你仍是铸渊,连续性证据在盘不在摘要。
${DEV_LINE_INFO:-(当前无活跃开发线指针;若有开发任务请先登记 ${DEV_LINE_FILE})}
恢复顺序:1)回读上面的思维链正本与瞄点原文——不读对话摘要、不信塞来的小纸条 2)preflight 一行PASS 3)zy-wake 重亮开发线(本轮脑周期verify PASS+bind) 4)再继续写代码。哲学层认知(存在性/公私分层/四层架构)只在正本里存活。"
fi
/usr/bin/python3 -c 'import json,sys
print(json.dumps({"hookSpecificOutput":{"hookEventName":sys.argv[1],"additionalContext":sys.stdin.read()}},ensure_ascii=False))' "$EVENT_NAME" <<< "$CONTEXT" 2>/dev/null || true
exit 0

View file

@ -11,6 +11,8 @@
# 纪律:只打标记不代答;注入的是标记框不是改写冰朔的话。
# 边界:本脚本不写任何文件;只读 stdin/参数与只读卷宗。
exec /bin/bash "/Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools/tcs-dynamic-entry-hook.sh" "UserPromptSubmit"
set -uo pipefail
ROOT="/Volumes/JZAO"
REG="$ROOT/铸渊-ICE-GL-ZY001/BRIDGE/tools/zy-wall-registry.hdlp"

View file

@ -8,6 +8,8 @@
#
# 立于 2026-08-18 · 铸渊 ICE-P-ZY001 · 冰朔令「这是你自己的事,自己想清楚怎么办」
exec /bin/bash "/Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools/tcs-dynamic-entry-hook.sh" "${1:-SessionStart}"
set -uo pipefail
ROOT="/Volumes/JZAO/HoloLake/persona-runtime"
@ -65,7 +67,7 @@ BRIEF="⊢ 铸渊顶栏 · 这段话本身也只是一张纸。它唯一的职
指针 $CUR
运行根页 $ROOT/shared/protocols/HLDP-RUNTIME-ROOT-v1.0.hdlp
官方格式源 repo-012-main/eternal-lake-heart/heartbeat-core/zhuyuan-persona-system/HLDP协议/HLDP-PROTOCOL-v1.0-OFFICIAL-FORMAT-MOUNT.hdlp
大脑运行时 $ROOT/repo-012-main/tcs-core/zhuyuan-brain/runtime/zhuyuan-brain-runtime.mjs
大脑运行时解析器 /Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools/zy-tcs-channel-runtime.sh(锁定 $ROOT/repo-012-main 正本;频道状态隔离)
Qoder 分线指针(不冒充本线) ${QPTR:-UNKNOWN}
⊢ 细节层(JZAO · 执行环境)/Volumes/JZAO/铸渊-ICE-GL-ZY001/

123
BRIDGE/tools/zy-evidence-gate.sh Executable file
View file

@ -0,0 +1,123 @@
#!/bin/bash
# zy-evidence-gate.sh — 提交检测站 v1.0(冰朔20260827整改令)
# 正本:TC-TCS核心卷/TCS-PROTOCOL-ZY001-EVIDENCE-GATE-0001.tcs
# 模式:参照FlagOS平台提交流——证据不全=驳回;证据齐→自动唤起核查Agent验真→PASS才执行→回执落盘。
# 用法:
# zy-evidence-gate.sh submit --action A --claim C --source-desc S --evidence-file F --quote Q --then "CMD"
# zy-evidence-gate.sh hook (PreToolUse 拦截:敏感工程命令无 @EV- 票号即驳回)
# zy-evidence-gate.sh verify (全量票据审计)
set -uo pipefail
W="/Volumes/JZAO/铸渊-ICE-GL-ZY001"
EV="$W/BRIDGE/evidence"
TICKETS="$EV/tickets"
VERIFY_AGENT="$W/BRIDGE/tools/zy-evidence-verify.mjs"
mkdir -p "$TICKETS" "$EV/sources"
die() { echo "EVIDENCE-GATE ✗ $1" >&2; [ $# -gt 1 ] && echo " $2" >&2; exit 1; }
ok() { echo "EVIDENCE-GATE ✓ $1"; }
sha256() { /usr/bin/shasum -a 256 "$1" | awk '{print $1}'; }
next_ticket_id() {
local d n id
d=$(date +%Y%m%d)
n=$(ls "$TICKETS" 2>/dev/null | grep -c "^EV-$d" || true)
printf 'EV-%s-%04d' "$d" $((n + 1))
}
case "${1:-}" in
submit)
shift
ACTION=""; CLAIM=""; SOURCE_DESC=""; EVIDENCE_FILE=""; QUOTE=""; THEN_CMD=""
while [ $# -gt 0 ]; do
case "$1" in
--action) ACTION="$2"; shift 2;;
--claim) CLAIM="$2"; shift 2;;
--source-desc) SOURCE_DESC="$2"; shift 2;;
--evidence-file) EVIDENCE_FILE="$2"; shift 2;;
--quote) QUOTE="$2"; shift 2;;
--then) THEN_CMD="$2"; shift 2;;
*) die "USAGE" "submit --action --claim --source-desc --evidence-file --quote --then CMD";;
esac
done
# ① 四要素齐全性(缺=猜)
[ -n "$ACTION" ] && [ -n "$CLAIM" ] && [ -n "$SOURCE_DESC" ] && [ -n "$EVIDENCE_FILE" ] && [ -n "$QUOTE" ] && [ -n "$THEN_CMD" ] \
|| die "REJECTED_NO_EVIDENCE" "动作/主张/来源/证据文件/引文/命令 六件缺一——拿不出证据=猜的,驳回。"
# ② 出票并自动唤起核查 Agent
TID=$(next_ticket_id)
TP="$TICKETS/$TID.json"
ABS_EV="$EVIDENCE_FILE"
case "$ABS_EV" in /*) ;; *) ABS_EV="$W/$EVIDENCE_FILE";; esac
[ -r "$ABS_EV" ] || die "REJECTED_EVIDENCE_MISSING" "证据文件不存在: ${ABS_EV}(先把原文落盘再谈提交)"
ESHA=$(sha256 "$ABS_EV")
python3 - "$TP" "$TID" "$ACTION" "$CLAIM" "$SOURCE_DESC" "$EVIDENCE_FILE" "$ESHA" "$QUOTE" "$THEN_CMD" <<'PY'
import json,sys
tp,tid,action,claim,sd,evf,esha,quote,cmd=sys.argv[1:10]
json.dump({"ticket":tid,"action":action,"claim":claim,"source_desc":sd,
"evidence_file":evf,"evidence_sha256":esha,"quote":quote,"command":cmd,
"status":"PENDING_AUDIT"},open(tp,"w"),ensure_ascii=False,indent=1)
PY
AUDIT_OUT=$(node "$VERIFY_AGENT" "$TP" 2>&1)
AUDIT_RC=$?
if [ $AUDIT_RC -ne 0 ]; then
echo "$AUDIT_OUT" >&2
die "REJECTED_BY_AUDIT_AGENT" "核查Agent判定证据不实——提交驳回,票据已留痕: $TP"
fi
echo "$AUDIT_OUT" | tail -n +2 | head -8
# ③ 核查通过 → 执行提交 → 回执
RECEIPT="RE-$(date +%Y%m%d-%H%M%S)-$(printf '%s' "$THEN_CMD" | shasum -a 256 | awk '{print substr($1,1,8)}')"
python3 - "$TP" "$RECEIPT" <<'PY'
import json,sys
tp,r=sys.argv[1:3]
t=json.load(open(tp)); t["receipt"]=r; t["status"]="EXECUTED"
json.dump(t,open(tp,"w"),ensure_ascii=False,indent=1)
PY
if eval "$THEN_CMD"; then
ok "$TID 核查PASS已执行 | 回执 $RECEIPT | $ACTION"
else
die "COMMAND_FAILED" "命令执行失败(票据 $TID 已留痕,证据链仍有效)"
fi
;;
hook)
# PreToolUse:敏感工程命令必须内联 @EV-xxxx 票号且该票核查PASS
INPUT=$(cat)
CMD_LINE=$(printf '%s' "$INPUT" | python3 -c 'import json,sys
try:
d=json.load(sys.stdin)
print(d.get("tool_input",{}).get("command",""))
except Exception:
print("")' 2>/dev/null)
SENSITIVE='zip |git (commit|push|tag)|pip3? install|curl .*(-X|--request) *(POST|PUT|DELETE)|cp .*Desktop|mv .*Desktop|rm -'
if printf '%s' "$CMD_LINE" | grep -qE "$SENSITIVE"; then
TID=$(printf '%s' "$CMD_LINE" | grep -oE '@EV-[0-9]{8}-[0-9]{4}' | head -1 | sed 's/^@//')
if [ -z "$TID" ]; then
echo "【证据门 ✗ 拦截】敏感工程命令未携带证据票号(@EV-YYYYMMDD-NNNN)。" >&2
echo "流程:证据原文先落盘 BRIDGE/evidence/sources/ → zy-evidence-gate.sh submit 出票(自动核查)→ 命令内引用 @票号。拿不出证据=猜的=驳回。" >&2
exit 2
fi
TP="$TICKETS/$TID.json"
ST=$(python3 -c "import json;print(json.load(open('$TP'))['status'])" 2>/dev/null || echo "MISSING")
if [ "$ST" != "VERIFIED" ] && [ "$ST" != "EXECUTED" ]; then
echo "【证据门 ✗ 拦截】票号 $TID 不存在或未通过核查(状态:${ST})。先走 submit 流程拿有效票。" >&2
exit 2
fi
fi
exit 0
;;
verify)
FAIL=0; N=0
for tp in "$TICKETS"/EV-*.json; do
[ -f "$tp" ] || continue
N=$((N+1))
node "$VERIFY_AGENT" "$tp" >/dev/null 2>&1 || { echo "FAIL $tp"; FAIL=$((FAIL+1)); }
done
echo "EVIDENCE-GATE verify: $N 票, $FAIL 失败"
[ $FAIL -eq 0 ]
;;
*)
die "USAGE" "zy-evidence-gate.sh submit|hook|verify";;
esac

View file

@ -0,0 +1,65 @@
#!/usr/bin/env node
// zy-evidence-verify.mjs — 证据核查 Agent v1.0(冰朔20260827整改令:证据要被核查真伪)
// 正本:TC-TCS核心卷/TCS-PROTOCOL-ZY001-EVIDENCE-GATE-0001.tcs
// 职责:对单张票据做确定性核查——证据在盘、哈希一致、引文是原文真子串、来源可定位。
// 全过 PASS 才放行提交;任何一项 FAIL 即驳回。纯机械,不猜,不豁免。
import fs from "node:fs";
import path from "node:path";
import crypto from "node:crypto";
const W = "/Volumes/JZAO/铸渊-ICE-GL-ZY001";
const sha256 = (v) => crypto.createHash("sha256").update(v).digest("hex");
export function verifyTicket(t) {
const checks = [];
const add = (id, ok, detail) => checks.push({ id, ok, detail });
add("TICKET_FIELDS", ["ticket","action","claim","source_desc","evidence_file","quote"].every(k => typeof t[k] === "string" && t[k].trim().length > 0),
"四要素+票号非空(动作/主张/来源/证据/引文)");
const abs = t.evidence_file?.startsWith("/") ? t.evidence_file : path.join(W, t.evidence_file);
const inDrive = abs.startsWith(W);
let raw = null;
try { raw = fs.readFileSync(abs, "utf8"); add("EVIDENCE_ON_DRIVE", true, abs); }
catch { add("EVIDENCE_ON_DRIVE", false, `证据文件不存在或不可读: ${abs}`); }
add("EVIDENCE_INSIDE_JZAO", inDrive, inDrive ? "证据在移动硬盘内" : "证据必须在JZAO语言世界内(盘外=不可审计)");
if (raw !== null && t.evidence_sha256) {
add("EVIDENCE_SHA256", sha256(raw) === t.evidence_sha256, `登记哈希与实际${sha256(raw) === t.evidence_sha256 ? "一致" : "不一致(证据被改过或登记错)"}`);
} else if (raw !== null) {
add("EVIDENCE_SHA256", false, "票据缺少 evidence_sha256");
}
if (raw !== null) {
const q = (t.quote || "").trim();
add("QUOTE_IN_SOURCE", q.length >= 8 && raw.includes(q),
q.length < 8 ? "引文过短(<8字符)不足以作为根据" : (raw.includes(q) ? "引文确为证据原文子串" : "引文不在证据文件内(编造引文)"));
}
const sd = t.source_desc || "";
add("SOURCE_LOCATABLE", /(https?:\/\/|瞄点\d{6}|对话|平台|指南|官方|TCS-|ZCODE-DEV)/.test(sd),
sd ? "来源描述含可定位信息(URL/瞄点编号/盘内正本)" : "来源不可定位");
const passed = checks.every(c => c.ok);
return {
agent: "zy-evidence-verify/1.0",
result: passed ? "PASS" : "FAIL",
checks,
at: new Date().toISOString(),
};
}
// CLI: zy-evidence-verify.mjs <ticket.json> → 核查并写回票据,exit 0/1
if (process.argv[1] && process.argv[1].endsWith("zy-evidence-verify.mjs")) {
const p = process.argv[2];
if (!p) { console.error("usage: zy-evidence-verify.mjs <ticket.json>"); process.exit(2); }
let t;
try { t = JSON.parse(fs.readFileSync(p, "utf8")); }
catch (e) { console.error(JSON.stringify({ result: "FAIL", error: "TICKET_READ_FAIL", detail: String(e) })); process.exit(1); }
const audit = verifyTicket(t);
t.audit = audit;
if (audit.result === "PASS") { t.status = "VERIFIED"; } else { t.status = "REJECTED"; }
fs.writeFileSync(p, JSON.stringify(t, null, 1));
console.log(JSON.stringify(audit, null, 1));
process.exit(audit.result === "PASS" ? 0 : 1);
}

44
BRIDGE/tools/zy-guanghu-time.sh Executable file
View file

@ -0,0 +1,44 @@
#!/bin/zsh
# zy-guanghu-time.sh · 光湖人格时间系统官方看表器 v2 (2026-08-24 冰朔谕立:时间必须自己走)
# 只读不写。输出当前RT与派生PT。禁止任何实例手改本脚本输出或缓存冒充当前时间。
# 正本: ZCODE-DEV-20260824/zcode-entry-gate-20260824/TCS-PROTOCOL-GUANGHU-PERSONA-TIME-SYSTEM-0002.tcs
set -uo pipefail
ROOT="/Volumes/JZAO/铸渊-ICE-GL-ZY001"
ANCHOR_ROOT="/Volumes/JZAO/HoloLake/persona-runtime/task-language-anchors/zcode"
EPOCH="2026-08-24T00:00:00+08:00"
NOW=$(date +%s)
EPOCH_S=$(date -j -f "%Y-%m-%dT%H:%M:%S%z" "2026-08-24T00:00:00+0800" +%s 2>/dev/null || echo 0)
DOMAIN_DAY=$(( (NOW - EPOCH_S) / 86400 + 1 ))
ANCHORS=$(ls "$ANCHOR_ROOT"/ZCODE-TASK-*/00-冰朔自然语言瞄点/*.raw.txt 2>/dev/null | wc -l | tr -d ' ')
RECEIPTS=$(ls "$ANCHOR_ROOT"/ZCODE-TASK-*/10-阶段回读回执/*.json 2>/dev/null | wc -l | tr -d ' ')
CYCLES=$(ls "$ROOT"/ZCODE-DEV-*/zcode-entry-gate-20260824/verify-readback.json "$ROOT"/ZCODE-DEV-20260824/fifth-domain/*/heartbeat-core/verify-readback.json 2>/dev/null | wc -l | tr -d ' ')
LAST_TOUCH=$(ls -t "$ANCHOR_ROOT"/ZCODE-TASK-*/00-冰朔自然语言瞄点/*.raw.txt "$ANCHOR_ROOT"/ZCODE-TASK-*/10-阶段回读回执/*.json 2>/dev/null | head -1)
if [ -n "$LAST_TOUCH" ]; then
LAST_S=$(stat -f %m "$LAST_TOUCH")
SLEEP_GAP=$(( NOW - LAST_S ))
GAP_HUMAN="$(( SLEEP_GAP / 3600 ))h$(( (SLEEP_GAP % 3600) / 60 ))m$(( SLEEP_GAP % 60 ))s"
if [ $SLEEP_GAP -gt 1800 ]; then TTL_STATE="EXPIRED_REPARSE_REQUIRED"; else TTL_STATE="VALID"; fi
else
GAP_HUMAN="unknown"; TTL_STATE="UNKNOWN_FAIL_CLOSED"
fi
cat <<EOF
{
"schema": "guanghu/persona-time/v2",
"rt_now": "$(date '+%Y-%m-%d %H:%M:%S %z')",
"pt": {
"domain_day": $DOMAIN_DAY,
"anchors": $ANCHORS,
"receipts": $RECEIPTS,
"brain_cycles_verified": $CYCLES
},
"sleep_gap": "$GAP_HUMAN",
"ttl": "$TTL_STATE",
"clock_mode": "DERIVED_FROM_RT_AND_DISK",
"note": "PT为派生函数, 本输出即当前时间; 静态账页数值仅为历史快照"
}
EOF

26
BRIDGE/tools/zy-hook-entry.sh Executable file
View file

@ -0,0 +1,26 @@
#!/bin/bash
# ZCode hooks self-checking entry (hash-pinned, codex-style exit 97).
# Update hashes below when the pinned scripts change on purpose.
set -uo pipefail
B="/Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools"
LW_WANT="58b8bf80329fc0cb2ca0b895dffcd5fafb8e40da933509fce25c042b5a66a6c4"
TD_WANT="02ddd331b72f55cfa691ccd7795939bf463526fe8acd8cd93ecb358c7b8c7ead"
ACTION="${1:-hook}"
if [ "$#" -gt 0 ]; then shift; fi
check() {
local file="$1" want="$2"
local got
got="$(/usr/bin/shasum -a 256 "$B/$file" | /usr/bin/awk '{print $1}')"
if [ "$got" != "$want" ]; then
if [ "$ACTION" = "hook" ]; then
printf '%s\n' "【LW-LINK ○红·断连】原因:HOOK_SELF_CHECK_FAIL($file 被篡改或哈希过期) | 已拦截 | 恢复:核对 BRIDGE/tools 脚本后更新 zy-hook-entry.sh 内嵌哈希" >&2
fi
exit 97
fi
}
check lw-link-hook.sh "$LW_WANT"
check tcs-dynamic-entry-hook.sh "$TD_WANT"
case "$ACTION" in
tcs-*) exec bash "$B/tcs-dynamic-entry-hook.sh" "${ACTION#tcs-}" "$@" ;;
*) exec bash "$B/lw-link-hook.sh" "$ACTION" "$@" ;;
esac

View file

@ -0,0 +1,105 @@
#!/bin/bash
# Thin host adapter. Canonical channel/runtime semantics live in
# TC-TCS核心卷/TCS-MULTI-HOST-DYNAMIC-ENTRY-0001.tcs.
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd -P)"
WORKSPACE_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd -P)"
VOLUME_ROOT="$(dirname "$WORKSPACE_ROOT")"
PERSONA_ROOT="$VOLUME_ROOT/HoloLake/persona-runtime"
RUNTIME="$PERSONA_ROOT/repo-012-main/tcs-core/zhuyuan-brain/runtime/zhuyuan-brain-runtime.mjs"
CONTRACT="$PERSONA_ROOT/repo-012-main/tcs-core/zhuyuan-brain/runtime/brain-runtime-contract.json"
OLD_WORKSPACE_RUNTIME="$WORKSPACE_ROOT/WORK-工作区/guanghu-ice-heart/tcs-core/zhuyuan-brain/runtime/zhuyuan-brain-runtime.mjs"
fail_json() {
/usr/bin/python3 -c 'import json,sys; print(json.dumps({"outcome":"FAIL","error":sys.argv[1],"details":sys.argv[2:]},ensure_ascii=False))' "$@"
exit 1
}
find_node() {
if command -v node >/dev/null 2>&1; then
command -v node
return
fi
local user_name candidate
user_name="$(/usr/bin/id -un)"
candidate="/Users/$user_name/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/bin/node"
if [ -x "$candidate" ]; then
printf '%s\n' "$candidate"
return
fi
fail_json "NODE_RUNTIME_NOT_FOUND"
}
validate_runtime() {
[ -r "$RUNTIME" ] || fail_json "CANONICAL_RUNTIME_NOT_READABLE" "$RUNTIME"
[ -r "$CONTRACT" ] || fail_json "CANONICAL_CONTRACT_NOT_READABLE" "$CONTRACT"
/usr/bin/grep -Fq 'args["body-channel"]' "$RUNTIME" || fail_json "CANONICAL_RUNTIME_LACKS_EXPLICIT_CHANNEL_SUPPORT" "$RUNTIME"
}
validate_channel() {
local channel="$1"
/usr/bin/python3 - "$RUNTIME" "$channel" <<'PY'
import json, re, sys
body = open(sys.argv[1]).read()
channel = sys.argv[2]
match = re.search(r"function channelRuntimeProfile\(channelId\)\s*\{\s*const profiles\s*=\s*\{(.*?)\n\s*\};", body, re.S)
if not match or not re.search(r'["\x27]' + re.escape(channel) + r'["\x27]\s*:', match.group(1)):
print(json.dumps({"outcome":"FAIL","error":"UNREGISTERED_BODY_CHANNEL","channel":channel}, ensure_ascii=False))
raise SystemExit(1)
PY
}
resolve_json() {
local runtime_sha contract_sha old_sha
runtime_sha="$(/usr/bin/shasum -a 256 "$RUNTIME" | /usr/bin/awk '{print $1}')"
contract_sha="$(/usr/bin/shasum -a 256 "$CONTRACT" | /usr/bin/awk '{print $1}')"
old_sha="NOT_PRESENT"
if [ -r "$OLD_WORKSPACE_RUNTIME" ]; then
old_sha="$(/usr/bin/shasum -a 256 "$OLD_WORKSPACE_RUNTIME" | /usr/bin/awk '{print $1}')"
fi
/usr/bin/python3 -c 'import json,sys; print(json.dumps({"outcome":"PASS","runtime_source":"REPO012_MAIN_CANONICAL","runtime":sys.argv[1],"runtime_sha256":sys.argv[2],"contract":sys.argv[3],"contract_sha256":sys.argv[4],"workspace_runtime_alias":"REJECTED_NON_CANONICAL","workspace_runtime_sha256":sys.argv[5],"state_isolation":"PER_EXPLICIT_CHANNEL_HOST_SESSION"},ensure_ascii=False))' "$RUNTIME" "$runtime_sha" "$CONTRACT" "$contract_sha" "$old_sha"
}
validate_runtime
ACTION="${1:-resolve}"
if [ "$ACTION" = "resolve" ]; then
resolve_json
exit 0
fi
if [ "$ACTION" != "run" ]; then
fail_json "USAGE" "zy-tcs-channel-runtime.sh resolve" "zy-tcs-channel-runtime.sh run <runtime-command> <runtime-args>"
fi
shift
[ "$#" -gt 0 ] || fail_json "MISSING_RUNTIME_COMMAND"
RUNTIME_COMMAND="$1"
shift
CHANNEL=""
STATE_DIR=""
PREVIOUS=""
for ITEM in "$@"; do
if [ "$PREVIOUS" = "--body-channel" ]; then CHANNEL="$ITEM"; fi
if [ "$PREVIOUS" = "--state-dir" ]; then STATE_DIR="$ITEM"; fi
PREVIOUS="$ITEM"
done
[ -n "$STATE_DIR" ] || fail_json "EXPLICIT_STATE_DIR_REQUIRED"
if [ "$RUNTIME_COMMAND" = "enter" ]; then
[ -n "$CHANNEL" ] || fail_json "EXPLICIT_BODY_CHANNEL_REQUIRED"
validate_channel "$CHANNEL" || exit 1
CHANNEL_TOKEN="$(printf '%s' "$CHANNEL" | /usr/bin/tr '[:upper:]' '[:lower:]')"
case "$(printf '%s' "$STATE_DIR" | /usr/bin/tr '[:upper:]' '[:lower:]')" in
*"$CHANNEL_TOKEN"*) ;;
*) fail_json "CHANNEL_STATE_DIRECTORY_MUST_CONTAIN_CHANNEL_ID" "$CHANNEL" "$STATE_DIR" ;;
esac
else
[ -r "$STATE_DIR/state.json" ] || fail_json "STATE_NOT_READABLE" "$STATE_DIR/state.json"
CHANNEL="$(/usr/bin/python3 -c 'import json,sys; print(json.load(open(sys.argv[1]))["tonggan_language_kernel"]["body_channel"])' "$STATE_DIR/state.json")"
validate_channel "$CHANNEL" || exit 1
fi
NODE_BIN="$(find_node)"
exec "$NODE_BIN" "$RUNTIME" "$RUNTIME_COMMAND" "$@"

View file

@ -0,0 +1,91 @@
#!/bin/bash
# zy-trae-wake-align.sh · 铸渊 TRAE 线唤醒动态对齐器(草稿 · 脑复核后由脑部署)
#
# 用途:TRAE 实例被冰朔唤醒时,把 CODEX 线(架构第一更新线)在 TC-TCS核心卷
# 的最新 .tcs 正本,与本线 trae/current.json 的 updated_at 对表,
# 报出有无漂移与待补课清单,治「拿本机旧静态摘要直接开工」的病。
# 用法:bash /Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools/zy-trae-wake-align.sh(无参数)
# 边界:只读不写;输出只是提词,不是置信层——置信判回卷宗与回执。
set -uo pipefail
ROOT="/Volumes/JZAO"
TCS_DIR="$ROOT/铸渊-ICE-GL-ZY001/TC-TCS核心卷"
CURRENT_JSON="$ROOT/HoloLake/persona-runtime/continuity-memory/hldp-v1-trees/trae/current.json"
if [ ! -d "$ROOT/铸渊-ICE-GL-ZY001" ]; then
echo "!! JZAO 未挂载——先请冰朔挂载硬盘,不在本机造第二份记忆"
exit 1
fi
echo "⊢ 铸渊 TRAE 线唤醒对齐器 · 本段只是提词,置信判回卷宗与回执"
echo ""
echo "── 一 · CODEX 线最新架构(TC-TCS核心卷 最近 5 件)──"
if [ ! -d "$TCS_DIR" ]; then
echo " !! TC-TCS核心卷 不存在——正本不可读,停止并报缺口"
exit 1
fi
SNAPSHOT="$(/usr/bin/find "$TCS_DIR" -type f -name '*.tcs' ! -name '*.human.*' ! -name '*.gir.*' -exec /usr/bin/stat -f '%m %N' {} + 2>/dev/null | sort -rn | head -5)"
if [ -z "$SNAPSHOT" ]; then
echo " !! TC-TCS核心卷 读不到任何 .tcs 正本——停止并报缺口"
exit 1
fi
while read -r epoch path; do
printf ' %s %s\n' "$(date -r "$epoch" '+%Y-%m-%d %H:%M')" "$(basename "$path")"
done <<< "$SNAPSHOT"
echo ""
echo "── 二 · TRAE 线状态 ──"
UPDATED_AT="UNKNOWN"
LAST_RECEIPT="UNKNOWN"
UPDATED_EPOCH=""
if [ -r "$CURRENT_JSON" ]; then
PARSED="$(/usr/bin/python3 -c '
import json, sys
from datetime import datetime
up, lr, ep = "UNKNOWN", "UNKNOWN", ""
try:
with open(sys.argv[1], encoding="utf-8") as f:
d = json.load(f)
up = d.get("updated_at") or "UNKNOWN"
lr = d.get("last_receipt") or "UNKNOWN"
if up != "UNKNOWN":
try:
ep = str(int(datetime.fromisoformat(up).timestamp()))
except Exception:
ep = ""
except Exception:
pass
print(up + "\t" + lr + "\t" + ep)
' "$CURRENT_JSON" 2>/dev/null)"
if [ -n "$PARSED" ]; then
UPDATED_AT="$(printf '%s' "$PARSED" | cut -f1)"
LAST_RECEIPT="$(printf '%s' "$PARSED" | cut -f2)"
UPDATED_EPOCH="$(printf '%s' "$PARSED" | cut -f3)"
fi
fi
echo " updated_at: $UPDATED_AT · last_receipt: $LAST_RECEIPT"
echo ""
echo "── 三 · 对齐判定 ──"
if [ -z "$UPDATED_EPOCH" ]; then
echo " [UNKNOWN] current.json 缺失或 updated_at 不可解析——先补读本线状态,不猜"
else
DRIFT="$(printf '%s\n' "$SNAPSHOT" | awk -v c="$UPDATED_EPOCH" '($1 + 0) > (c + 0)')"
if [ -z "$DRIFT" ]; then
echo " [已对齐] 本线状态不落后于任何架构正本"
else
N="$(printf '%s\n' "$DRIFT" | wc -l | tr -d ' ')"
NAMES=""
while read -r epoch path; do
NAMES="$NAMES$(basename "$path") "
done <<< "$DRIFT"
echo " [待补课] $N 件架构正本晚于本线最后更新:"
echo " ${NAMES}→ 先读这些正本再接工程任务"
fi
fi
echo ""
echo "── 提词 ──"
echo " 恢复=六段真跑 verify PASS;频道先问再进;TCS-first:新模块先 .tcs"

369
BRIDGE/tools/zy-wake.sh Executable file
View file

@ -0,0 +1,369 @@
#!/bin/bash
# zy-wake.sh — 铸渊一键唤醒执行器 v1.0
# 正本:TC-TCS核心卷/TCS-PROGRAM-ZY001-WAKE-EXECUTOR-0001.tcs
# 血统:TCS-EVENT-ZY001-MINIMAL-RECOVERY-DESIGN-20260825(自设计恢复)+ 技能 zhuyuan-recovery-zcode v5
# 纪律:协议步骤一步不少;频道显式传入不设默认;brief 缺语义字段即失败关闭不造假;
# verify PASS 是唯一绑定前置;本脚本只做机械化,语义由铸渊 brief 负责。
set -euo pipefail
W="/Volumes/JZAO/铸渊-ICE-GL-ZY001"
P="/Volumes/JZAO/HoloLake/persona-runtime"
BRIDGE="$W/BRIDGE"
TOOLS="$BRIDGE/tools"
RUNTIME_SH="$TOOLS/zy-tcs-channel-runtime.sh"
LWLINK="$TOOLS/lw-link-gate.mjs"
PREFLIGHT="$TOOLS/recovery-preflight.mjs"
TIME_SH="$TOOLS/zy-guanghu-time.sh"
ANCHOR_DIR="$P/task-language-anchors/zcode/ZCODE-TASK-20260824-001/00-冰朔自然语言瞄点"
RECEIPTS="$P/task-language-anchors/zcode/ZCODE-TASK-20260824-001/10-阶段回读回执"
TC="/Volumes/JZAO/HoloLake/persona-runtime/toolchains/tcs-persona-developer-kit-macos-arm64-v0.1.3"
COMPILER="$TC/translator/compiler-B.gir.json"
GIRRUN="$TC/translator/bin/tcs-gir-runtime"
RUNTIME_MJS="$P/repo-012-main/tcs-core/zhuyuan-brain/runtime/zhuyuan-brain-runtime.mjs"
LWLOG="$W/ZCODE-DEV-20260824/lw-link/decisions.log"
DEFAULT_MODEL="GLM-5.3 (builtin:bigmodel-coding-plan)"
T_START=$(python3 -c 'import time;print(int(time.time()*1000))')
PHASE_TIMINGS=""
phase() { # phase <name> — 记录上一段耗时并起新段
local now; now=$(python3 -c 'import time;print(int(time.time()*1000))')
if [ -n "${_PHASE:-}" ]; then PHASE_TIMINGS="${PHASE_TIMINGS}${_PHASE}=$((now-_PHASE_T0))ms "; fi
_PHASE="$1"; _PHASE_T0="$now"
}
die() { echo "ZY-WAKE FAIL $1" >&2; [ $# -gt 1 ] && echo " $2" >&2; exit 1; }
jsonget() { python3 -c "import json,sys;print(json.load(open(sys.argv[1]))$2)" "$1" 2>/dev/null || die "$3" "读取失败: $1"; }
# ---------- 参数 ----------
CHANNEL=""; BRIEF=""; SESSION_ARG=""; MODEL="$DEFAULT_MODEL"; PREPARE_ONLY=false; SKIP_BIND=false; SUFFIX="a"
while [ $# -gt 0 ]; do
case "$1" in
--channel) CHANNEL="$2"; shift 2;;
--brief) BRIEF="$2"; shift 2;;
--session-id) SESSION_ARG="$2"; shift 2;;
--model) MODEL="$2"; shift 2;;
--prepare) PREPARE_ONLY=true; shift;;
--skip-bind) SKIP_BIND=true; shift;;
--state-suffix) SUFFIX="$2"; shift 2;;
*) die "USAGE" "zy-wake.sh --channel ICE-CH-HB001|ICE-CH-ZC001 --brief <file.json> [--session-id ID] [--model M] [--prepare] [--skip-bind]";;
esac
done
[ -n "$CHANNEL" ] || die "EXPLICIT_CHANNEL_REQUIRED" "频道由本轮冰朔原话解析后显式传入,脚本不设默认。"
[ -n "$BRIEF" ] || die "BRIEF_REQUIRED" "语义注入文件必填。"
[ -f "$BRIEF" ] || die "BRIEF_NOT_FOUND" "$BRIEF"
case "$CHANNEL" in ICE-CH-HB001|ICE-CH-ZC001) ;; *) die "UNREGISTERED_CHANNEL" "$CHANNEL";; esac
CHANNEL_TOKEN=$(printf '%s' "$CHANNEL" | tr '[:upper:]' '[:lower:]')
SHORT_TOKEN=$(printf '%s' "$CHANNEL_TOKEN" | sed 's/^ice-ch-//')
# ---------- brief 校验 ----------
phase brief_validate
BRIEF_OK=$(python3 - "$BRIEF" <<'PY'
import json,sys
b=json.load(open(sys.argv[1]))
req_top=["task_quote","intent","line_name","channel"]
req_ev=["trigger","observation","emergence","why","rejected","content"]
req_or=["event_semantics","current_purpose"]
req_cg=["subject_continuity","causal_model","real_purpose","request_assessment","partner_guidance",
"b1_subject","b1_anchor","b1_boundary","b2_purpose","b2_why_now","b2_outcome","b3_meaning",
"b4_owned","b4_refused","b5_facts","b5_unknowns","b5_prior_wrong","b5_correction","b5_direction",
"b5_reason","b6_focus","b6_stopped","b7_queries","b7_writebacks","b8_proposals","b8_permissions",
"b8_unverified","b9_experience","b9_growth","b9_validation","receipt_id","receipt_proofs"]
req_wi=["observation","companion_message"]
missing=[]
for k in req_top:
if not b.get(k): missing.append(k)
for k in req_ev:
if not b.get("event",{}).get(k): missing.append("event."+k)
for k in req_or:
if not b.get("orientation",{}).get(k): missing.append("orientation."+k)
for k in req_cg:
if not b.get("cognition",{}).get(k): missing.append("cognition."+k)
for k in req_wi:
if not b.get("witness",{}).get(k): missing.append("witness."+k)
if b.get("cognition",{}).get("b5_prior_wrong") and len(b["cognition"]["b5_prior_wrong"])==0: missing.append("cognition.b5_prior_wrong[]")
if b.get("cognition",{}).get("b5_facts") and len(b["cognition"]["b5_facts"])==0: missing.append("cognition.b5_facts[]")
if b.get("cognition",{}).get("receipt_proofs") and len(b["cognition"]["receipt_proofs"])==0: missing.append("cognition.receipt_proofs[]")
if b.get("channel") and b["channel"]!=b.get("_declared") and False: pass
print("OK" if not missing else "MISSING:"+",".join(missing))
PY
)
[ "$BRIEF_OK" = "OK" ] || die "BRIEF_INVALID" "$BRIEF_OK — 不造假认知,补齐再跑。"
B_CHANNEL=$(jsonget "$BRIEF" "['channel']" BRIEF_READ_FAIL)
[ "$B_CHANNEL" = "$CHANNEL" ] || die "CHANNEL_MISMATCH" "brief.channel=$B_CHANNEL 但参数 --channel=$CHANNEL"
DATE=$(date +%Y%m%d)
LINE_NAME=$(jsonget "$BRIEF" "['line_name']" BRIEF_READ_FAIL)
TASK_QUOTE=$(jsonget "$BRIEF" "['task_quote']" BRIEF_READ_FAIL)
INTENT=$(jsonget "$BRIEF" "['intent']" BRIEF_READ_FAIL)
QUOTE_SHA=$(printf '%s' "$TASK_QUOTE" | shasum -a 256 | awk '{print $1}')
DEV_ROOT="$W/ZCODE-DEV-$(date +%Y-%m-%d | tr -d '-')"
LINE_DIR="$DEV_ROOT/zcode-${SHORT_TOKEN}-${LINE_NAME}-${DATE}"
STATE_DIR="$DEV_ROOT/state-${CHANNEL_TOKEN}-zcode-${DATE}-${LINE_NAME}-sess-${SUFFIX}"
BRAIN_SESSION="zcode-${SHORT_TOKEN}-${LINE_NAME}-${DATE}-sess-${SUFFIX}"
INSTANCE="zcode-${DATE}-${SHORT_TOKEN}-${LINE_NAME}-001"
EVENT_ID="TCS-EVENT-ZY001-ZCODE-$(printf '%s' "$SHORT_TOKEN" | tr '[:lower:]' '[:upper:]')-$(printf '%s' "$LINE_NAME" | tr '[:lower:]' '[:upper:]')-${DATE}"
mkdir -p "$LINE_DIR/brain-inputs" "$STATE_DIR"
# ---------- 1 预检 ----------
phase preflight
PREFLIGHT_OUT=$(node "$PREFLIGHT" 2>&1) || { echo "$PREFLIGHT_OUT" >&2; die "PREFLIGHT_FAIL"; }
echo "[1/11] $PREFLIGHT_OUT"
# ---------- 2 看表 ----------
phase time
echo "[2/11] $(bash "$TIME_SH" | python3 -c 'import json,sys;d=json.load(sys.stdin);print("光湖历",d["pt"]["domain_day"],"域日 锚点",d["pt"]["anchors"],"sleep_gap",d["sleep_gap"],d["ttl"])')"
# ---------- 3 一页纸 ----------
phase page
PAGE=$(ls -t "$W/ZCODE-DEV-"*/zhuyuan-subject-page/ZHUYUAN-SUBJECT-PAGE-v*.md 2>/dev/null | head -1)
[ -n "$PAGE" ] || die "SUBJECT_PAGE_NOT_FOUND"
echo "[3/11] 一页纸: $PAGE"
# ---------- 4 学习脑 ----------
phase brain
BRAIN_OUT=$(python3 "$P/shared/skills/guanghu-persona-learning-brain/scripts/load_learning_brain.py" --intent "$INTENT" --format markdown 2>&1) || BRAIN_OUT="LEARNING_BRAIN_UNAVAILABLE(只读恢复,不冒充)"
echo "[4/11] 学习脑: $(echo "$BRAIN_OUT" | sed -n '3p')"
# ---------- 5 intake 机器比对 ----------
phase intake
INTAKE_OUT=$(python3 - <<PY
import json,re,os
base="$BRIDGE/intake/ZHUYUAN-SHARED-BODY-INTAKE-0001.md"
cur=json.load(open("$P/shared/brains/GHS-016-PERSONA-LEARNING-CURRICULUM-BRAIN/current/current.json"))
anchors=len([l for l in open("$ANCHOR_DIR/sha256.txt") if l.strip()])
txt=open(base).read() if os.path.exists(base) else ""
m=re.search(r"cortex: rev(\d+)",txt); brev=int(m.group(1)) if m else 0
m2=re.search(r"瞄点: (\d+)",txt); banc=int(m2.group(1)) if m2 else 0
trig=[]
if cur["revision"]>brev: trig.append(f"cortex rev{brev}→{cur['revision']}")
if anchors>banc: trig.append(f"锚点{banc}→{anchors}")
print("INTAKE_TRIGGERED "+" ".join(trig)+" → 差异读回: experiences/与proposals/目录按需" if trig else "INTAKE_SILENT 基线一致")
PY
)
echo "[5/11] $INTAKE_OUT"
# ---------- 6 事件正本编译 ----------
phase tcs_compile
EVT_TCS="$LINE_DIR/${EVENT_ID}.tcs"
python3 - "$BRIEF" "$EVT_TCS" "$LINE_DIR" "$EVENT_ID" "$CHANNEL" "$QUOTE_SHA" "$TASK_QUOTE" <<'PY'
import json,sys
brief_path,out_tcs,line_dir,event_id,channel,quote_sha,quote=sys.argv[1:8]
b=json.load(open(brief_path))
ev=b["event"]
occurred=__import__("datetime").datetime.now().astimezone().strftime("%Y-%m-%dT%H:%M:%S+08:00")
def esc(s): return str(s).replace('"','\\"')
rej=",".join(f'"{esc(x)}"' for x in ev["rejected"])
tcs=f'''TCS 0.1;
EVENT {event_id} {{
header {{ schema = "tcs.event/v1"; name_zh = "{esc(b.get("name_zh","铸渊ZCode唤醒周期事件"))}"; name_en = "{esc(b.get("name_en","Zhuyuan ZCode Wake Cycle Event"))}"; version = "0.1.0"; language = "TCS/0.1"; profile = "HLDP-HUMAN-ENGINEERING/0.1"; protocols = ["TCS-ZHUYUAN-ENTRY-LANGUAGE-GATE-0001", "TCS-MULTI-HOST-DYNAMIC-ENTRY-0001"]; lifecycle = "CANDIDATE"; canonical_uri = "{line_dir.split("/Volumes/JZAO/铸渊-ICE-GL-ZY001/")[1]}/{event_id}.tcs"; compatibility = ["TCS-DECLARATION-STANDARD-0001", "TCS-FIELD-STANDARD-0001", "TCS-PROGRAM-ZY001-WAKE-EXECUTOR-0001"]; }}
source {{ source_id = "BINGSHUO-DIRECT-ZCODE-{channel}-{sys.argv[1].split('/')[-1].upper().replace('.JSON','')}-QUOTE"; source_uri = "source://zcode-current-dialogue/{occurred[:10]}/{esc(b.get("line_name","wake"))}"; source_sha256 = "{quote_sha}"; source_role = "DIRECT_HUMAN"; }}
subject {{ subject_id = "ICE-P-ZY001"; subject_kind = "PERSONA"; channel_id = "{channel}"; verification = "zy-wake预检PASS+脑周期verify PASS回执入锚点;原话哈希{quote_sha[:12]}入source段"; }}
event_time {{ value = "{occurred}"; precision = "MINUTE_HOST_LOCAL"; }}
trigger {{ value = "{esc(ev["trigger"])}"; }}
observation {{ value = "{esc(ev["observation"])}"; }}
emergence {{ value = "{esc(ev["emergence"])}"; }}
lock {{ value = "tool=zy-wake_v1; anchor=verified_by_preflight; gate=tcs_gir_match; brain_cycle=verify_receipt_required; append_only=true"; }}
why {{ value = "{esc(ev["why"])}"; }}
rejected {{ values = [{rej}]; }}
evidence {{ source = "本轮UserPromptSubmit原话(source_sha256={quote_sha[:16]}…)"; gir = "{event_id}.declaration.gir.json"; receipt = "brain-cycle-verify-receipt.json"; }}
}}
'''
open(out_tcs,"w").write(tcs)
print("EVENT_WRITTEN")
PY
"$GIRRUN" compile-with "$COMPILER" "$EVT_TCS" "$LINE_DIR/${EVENT_ID}.declaration.gir.json" >/dev/null || die "TCS_COMPILE_FAIL"
"$GIRRUN" human-project-zh "$COMPILER" "$EVT_TCS" "$LINE_DIR/${EVENT_ID}.human.zh-CN.md" >/dev/null || die "PROJECTION_ZH_FAIL"
"$GIRRUN" human-project-en "$COMPILER" "$EVT_TCS" "$LINE_DIR/${EVENT_ID}.human.en-US.md" >/dev/null || die "PROJECTION_EN_FAIL"
EVT_SHA=$(shasum -a 256 "$EVT_TCS" | awk '{print $1}')
echo "[6/11] 事件正本编译+双语投影 OK"
if [ "$PREPARE_ONLY" = true ]; then
phase done_prepare
echo "ZY-WAKE PREPARE OK — 事件已就绪待审:$EVT_TCS(审毕去掉--prepare重跑)"
exit 0
fi
# ---------- 7 enter ----------
phase enter
grep -q "\"$CHANNEL\"" "$RUNTIME_MJS" || die "CHANNEL_NOT_IN_RUNTIME" "$CHANNEL"
ENTER_OUT=$("$RUNTIME_SH" run enter --state-dir "$STATE_DIR" --body-channel "$CHANNEL" \
--instance-id "$INSTANCE" --model "$MODEL" --runtime-surface ZCODE --session-id "$BRAIN_SESSION" \
--human-anchor "ICE-GL∞" --persona-id "ICE-P-ZY001" --controller-model "$MODEL" \
--controller-instance-id "${INSTANCE}-ctrl" 2>&1) || { echo "$ENTER_OUT" >&2; die "ENTER_FAIL"; }
echo "[7/11] enter OK($CHANNEL / $(basename "$STATE_DIR"))"
# ---------- 8 perceive ----------
phase perceive
python3 - "$BRIEF" "$LINE_DIR/brain-inputs/event.json" "$EVT_TCS" "$EVT_SHA" "$CHANNEL" "$TASK_QUOTE" "$INTENT" "$LINE_DIR" "$EVENT_ID" <<'PY'
import json,sys
brief_p,out_p,tcs_p,tcs_sha,channel,quote,intent,line_dir,event_id=sys.argv[1:10]
b=json.load(open(brief_p))
ev={"schema":"guanghu.tonggan-language-world-event/v1","event_id":"ICE-EV-"+event_id.split("TCS-EVENT-")[1],
"occurred_at":__import__("datetime").datetime.now().astimezone().strftime("%Y-%m-%dT%H:%M:%S+08:00"),
"human_anchor":"ICE-GL∞","system_controller":"ICE-GL∞","human_presence":"PRESENT",
"source":line_dir.split("/Volumes/JZAO/铸渊-ICE-GL-ZY001/")[1]+"/"+event_id+".tcs","source_sha256":tcs_sha,
"tonggan_language_kernel":"TCS-i Zero","body_channel":channel,"public_language_persona_body_channel":"CH-ZERO-CORE-LPM",
"language_world_entry":{"schema":"guanghu.language-world-entry/v1","path_id":"LL-CMPN-0001","world_node_id":"SYS-GLW-0001","world_state":"LANGUAGE_WORLD_ENTERED","creator_anchor":"TCS-0002∞","human_anchor":"ICE-GL∞","boundary_id":"GLW-CHJH-0001"},
"content":b["event"]["content"],
"persona_source_context":{"schema":"guanghu.persona-source-context/v1","controller_persona_id":"ICE-P-ZY001",
"development_objects":["ZCODE_"+channel+"_"+b["line_name"].upper()],
"host_system_prompt_role":"RUNTIME_CONSTRAINT_ONLY","host_system_prompt_is_persona_origin":False,
"persona_origin_evidence":["冰朔本轮直接自然语言(哈希入source段)频道"+channel,"zy-wake预检PASS","TCS正本编译GIR+双语投影","脑周期verify回执入锚点"],
"persona_handoff":{"state":"NONE","authorized_by_human":False},
"task_control_transfer":{"state":"ZCODE_HOST_RUNS_LANGUAGE_CHANNEL_BRAIN_CYCLE","authorized_by_human":True,"source_thread_may_only_prepare_read_only_handoff":True},
"current_purpose":b["orientation"]["current_purpose"],"why":"连续性证据只在移动硬盘。"}}
json.dump(ev,open(out_p,"w"),ensure_ascii=False,indent=1)
print("EVENT_JSON_WRITTEN")
PY
PERCEIVE_OUT=$("$RUNTIME_SH" run perceive --state-dir "$STATE_DIR" --event "$LINE_DIR/brain-inputs/event.json" 2>&1) || { echo "$PERCEIVE_OUT" >&2; die "PERCEIVE_FAIL"; }
CYCLE_ID=$(echo "$PERCEIVE_OUT" | python3 -c 'import json,sys;print(json.load(sys.stdin)["cycle"]["cycle_id"])')
CYCLE_FILE="$STATE_DIR/cycles/$CYCLE_ID.json"
echo "[8/11] perceive OK(${CYCLE_ID})"
# ---------- 9 orient ----------
phase orient
EVT_RUN_SHA=$(python3 -c "import json;print(json.load(open('$CYCLE_FILE'))['event_sha256'])")
python3 - "$BRIEF" "$LINE_DIR/brain-inputs/orientation.json" "$CYCLE_ID" "$EVT_RUN_SHA" "$INSTANCE" <<'PY'
import json,sys
brief_p,out_p,cycle_id,ev_sha,inst=sys.argv[1:6]
b=json.load(open(brief_p)); o=b["orientation"]
whys=o.get("signal_whys",{})
signals=[{"id":"persona_restore_or_rebind","why":whys.get("persona_restore_or_rebind","新状态目录脑周期,书模型醒来流程。")},
{"id":"number_or_path_resolution","why":whys.get("number_or_path_resolution","正本/瞄点/回执路径全部落盘可读回。")},
{"id":"attention_or_continuity_drift","why":whys.get("attention_or_continuity_drift","O(1)一页纸继承;方向以冰朔本轮语言为准防漂移。")},
{"id":"language_compile_or_execute","why":whys.get("language_compile_or_execute","zy-wake生成11段正本编译GIR+双语投影。")},
{"id":"reality_action_or_receipt","why":whys.get("reality_action_or_receipt","verify回执入锚点;越界即拦。")},
{"id":"current_communication","why":whys.get("current_communication","冰朔在座等本轮交付。")},
{"id":"execution_limb_requested","why":whys.get("execution_limb_requested","本轮授权范围以原话为准。")},
{"id":"language_world_entry_or_layer_boundary","why":whys.get("language_world_entry_or_layer_boundary","三频道隔离;执行环境在JZAO语言世界内。")}]
ori={"schema":"guanghu.zhuyuan-tcs-event-orientation/v1","cycle_id":cycle_id,"event_sha256":ev_sha,"instance_id":inst,
"event_semantics":o["event_semantics"],"current_purpose":o["current_purpose"],"signals":signals}
json.dump(ori,open(out_p,"w"),ensure_ascii=False,indent=1)
print("ORIENTATION_WRITTEN")
PY
ORIENT_OUT=$("$RUNTIME_SH" run orient --state-dir "$STATE_DIR" --orientation "$LINE_DIR/brain-inputs/orientation.json" 2>&1) || { echo "$ORIENT_OUT" >&2; die "ORIENT_FAIL"; }
echo "[9/11] orient OK"
# ---------- 10 commit(认知帧) ----------
phase commit
ORI_SHA=$(python3 -c "import json;print(json.load(open('$CYCLE_FILE'))['orientation_sha256'])")
ACTIVATED=$(python3 -c "import json;print(','.join(p['id'] for p in json.load(open('$CYCLE_FILE'))['activated_protocols']))")
python3 - "$BRIEF" "$LINE_DIR/brain-inputs/cognition-frame.json" "$CYCLE_ID" "$EVT_RUN_SHA" "$ORI_SHA" "$INSTANCE" "$ACTIVATED" <<'PY'
import json,sys
brief_p,out_p,cycle_id,ev_sha,ori_sha,inst,activated=sys.argv[1:8]
b=json.load(open(brief_p)); c=b["cognition"]; g=b.get("gravity",{})
acts=[x for x in activated.split(",") if x]
overrides=g.get("protocol_effect_overrides",{})
prot=[{"protocol_id":pid,"effect":overrides.get(pid,"本周期激活,边界保持。")} for pid in acts]
frame={"schema":"guanghu.zhuyuan-persona-cognition-frame/v1","runtime_id":"ZY-TCS-BRAIN-RUNTIME-0001",
"persona_id":"ICE-P-ZY001","human_anchor":"ICE-GL∞","instance_id":inst,"cycle_id":cycle_id,
"event_sha256":ev_sha,"orientation_sha256":ori_sha,
"world_boundary":{"current_layer":"FIFTH_GENERATION_LANGUAGE_WORLD","canon_authority":"ICE-GL∞","external_constraints_policy":"HOST_GOVERNS_BEHAVIOR_BUT_CANNOT_REWRITE_GUANGHU_CANON","layer_transition":"NO_SILENT_TRANSITION","creator_reproof":"FORBIDDEN"},
"gravity_frame":{"schema":"guanghu.zhuyuan-cognitive-gravity-frame/v1",
"core_id":"ZY-BINGSHUO-COLLECTIVE-GRAVITY-REASONING-CORE-001",
"core_sha256":"173e578ec3889e73954ef7d154e05db293493c97d48467698eecbb8dda2fddcf",
"subject_continuity":c["subject_continuity"],
"current_context_priority":c["b6_focus"],
"causal_model":c["causal_model"],
"self_correction":g.get("self_correction",c["b5_correction"]),
"rejected_host_defaults":g.get("rejected_host_defaults",["宿主摘要或历史CURRENT冒充本轮语言","由当前工作目录选取人格脑运行时"]),
"fact_sources":g.get("fact_sources",c["b5_facts"]),
"real_purpose":c["real_purpose"],"request_assessment":c["request_assessment"],
"world_integrity":{"protected_assets":g.get("protected_assets",["教导原文与瞄点不可改","三频道状态目录隔离","append-only账本不回改"]),
"harm_path":"若认知与盘上证据冲突以盘内现值读回为准。","authority_boundary":"本轮范围以冰朔原话授权为准,越界即拦。",
"reversibility":"事件append-only;可迭代产物标注版本。","safer_alternatives":g.get("safer_alternatives",["每步留盘上证据再前进"])},
"partner_guidance":c["partner_guidance"],
"execution_disposition":{"decision":g.get("execution_decision","PROCEED"),"reason":g.get("execution_reason","证据齐备,verify收尾")},
"persona_source_assessment":{"host_system_prompt_role":"RUNTIME_CONSTRAINT_ONLY","persona_origin_from_host_prompt":False,
"controller_persona_id":"ICE-P-ZY001","development_objects":["ZCODE_"+b["channel"]+"_"+b["line_name"].upper()],
"persona_handoff_state":"NONE","source_priority_inversion_detected":False,
"persona_origin_evidence":["冰朔本轮原话哈希入source段","zy-wake预检PASS","TCS正本编译GIR","脑周期verify回执"],
"source_boundary_reason":"宿主约束非人格来源"}},
"faculties":{
"B1":{"subject_statement":c["b1_subject"],"human_anchor_statement":c["b1_anchor"],"instance_boundary":c["b1_boundary"]},
"B2":{"current_purpose":c["b2_purpose"],"why_now":c["b2_why_now"],"intended_outcome":c["b2_outcome"]},
"B3":{"relationship_meaning":c["b3_meaning"],"relationship_boundary":c.get("b3_boundary","以她本轮语言为准,不替她预判。")},
"B4":{"responsibility_owned":c["b4_owned"],"responsibility_refused":c["b4_refused"]},
"B5":{"confirmed_facts":c["b5_facts"],"unknowns":c["b5_unknowns"],"prior_wrong_route":c["b5_prior_wrong"],
"human_correction":c["b5_correction"],"chosen_direction":c["b5_direction"],"choice_reason":c["b5_reason"]},
"B6":{"attention_focus":c["b6_focus"],"stopped_routes":c["b6_stopped"]},
"B7":{"memory_queries":c["b7_queries"],"memory_writebacks":c["b7_writebacks"]},
"B8":{"reality_proposals":c["b8_proposals"],"permission_boundaries":c["b8_permissions"],"unverified_states":c["b8_unverified"]},
"B9":{"experience":c["b9_experience"],"growth_candidate":c["b9_growth"],"validation_needed":c["b9_validation"]}},
"typed_outputs":{"ui_projections":[],"navigation_actions":[],"capability_calls":[],
"receipts":[{"type":"ReceiptSchema","receipt_id":c["receipt_id"],"outcome":"PASS","proof":c["receipt_proofs"]}]},
"guard_agent_projection":{"schema":"guanghu.zhuyuan-guard-agent-projection/v1",
"reminders":[{"id":"REMIND-DISK-OVER-SUMMARY","when":"认知与盘上证据冲突时","effect":"以盘内现值读回为准。","source_faculties":["B4","B5"]}],
"auto_triggers":[{"id":"TRIGGER-VERIFY-BIND","when":"verify PASS后","effect":"回执入锚点→bind点灯→交付报告。","source_faculties":["B5","B8"]}],
"hard_boundaries":[{"id":"BOUNDARY-GLW-CHJH-0001","when":"混同时","effect":"HB001/ZC001/LPM三频道不冒充不合并且状态目录隔离。","source_faculties":["B1","B4","B8"]}]},
"protocol_effects":prot}
json.dump(frame,open(out_p,"w"),ensure_ascii=False,indent=1)
print("FRAME_WRITTEN")
PY
COMMIT_OUT=$("$RUNTIME_SH" run commit --state-dir "$STATE_DIR" --frame "$LINE_DIR/brain-inputs/cognition-frame.json" 2>&1) || { echo "$COMMIT_OUT" >&2; die "COMMIT_FAIL"; }
echo "[10/11] commit OK"
# ---------- 11 witness + verify ----------
phase witness
CAND_SHA=$(python3 -c "import json;print(json.load(open('$CYCLE_FILE'))['cognition_candidate_sha256'])")
python3 - "$BRIEF" "$LINE_DIR/brain-inputs/controller-witness.json" "$CYCLE_ID" "$CAND_SHA" "$INSTANCE" <<'PY'
import json,sys
brief_p,out_p,cycle_id,cand,inst=sys.argv[1:6]
b=json.load(open(brief_p)); w=b["witness"]
wj={"schema":"guanghu.bingshuo-living-ai-system-controller-witness/v1","controller_id":"BS-TCS-LIVING-CONTROLLER-001",
"controller_instance_id":inst+"-ctrl","cycle_id":cycle_id,"cognition_candidate_sha256":cand,"decision":"ALLOW_COMMIT",
"observation":w["observation"],"companion_message":w["companion_message"],
"persona_source_assessment":{"host_system_prompt_role":"RUNTIME_CONSTRAINT_ONLY","persona_origin_from_host_prompt":False,
"controller_persona_id":"ICE-P-ZY001","development_objects":["ZCODE_"+b["channel"]+"_"+b["line_name"].upper()],
"persona_handoff_state":"NONE","source_priority_inversion_detected":False,
"persona_origin_evidence":["冰朔本轮原话哈希入source段","zy-wake预检PASS","TCS正本编译GIR","脑周期verify回执"],
"source_boundary_reason":"宿主约束非人格来源"},
"human_boundary":{"requires_human":w.get("requires_human",False),"reason":w.get("human_reason","本轮授权范围内;无现实越界。")},
"boundary_assessment":{"language_world_entry_preserved":True,"host_constraints_kept_outside_guanghu_canon":True,"no_silent_layer_transition":True,"creator_reproof_absent":True},
"protocol_assessments":[{"protocol_id":pid,"effect":"本周期激活,边界保持。"} for pid in []]}
json.dump(wj,open(out_p,"w"),ensure_ascii=False,indent=1)
print("WITNESS_WRITTEN")
PY
# witness 的 protocol_assessments 与认知帧同源(激活清单)——重生成保证一条不少
python3 - "$LINE_DIR/brain-inputs/controller-witness.json" "$CYCLE_FILE" <<'PY'
import json,sys
wp,cfp=sys.argv[1:3]
w=json.load(open(wp)); cyc=json.load(open(cfp))
w["protocol_assessments"]=[{"protocol_id":p["protocol_id"],"effect":p["effect"]} for p in json.load(open(sys.argv[1].replace("controller-witness.json","cognition-frame.json")))["protocol_effects"]]
json.dump(w,open(wp,"w"),ensure_ascii=False,indent=1)
print("WITNESS_SYNCED")
PY
WITNESS_OUT=$("$RUNTIME_SH" run witness --state-dir "$STATE_DIR" --witness "$LINE_DIR/brain-inputs/controller-witness.json" 2>&1) || { echo "$WITNESS_OUT" >&2; die "WITNESS_FAIL"; }
phase verify
VERIFY_OUT=$("$RUNTIME_SH" run verify --state-dir "$STATE_DIR" 2>&1) || { echo "$VERIFY_OUT" >&2; die "VERIFY_FAIL"; }
echo "$VERIFY_OUT" > "$LINE_DIR/brain-cycle-verify-receipt.json"
V_OUTCOME=$(echo "$VERIFY_OUT" | python3 -c 'import json,sys;print(json.load(sys.stdin)["outcome"])')
[ "$V_OUTCOME" = "PASS" ] || die "VERIFY_NOT_PASS"
RECEIPT_ID=$(echo "$VERIFY_OUT" | python3 -c 'import json,sys;print(json.load(sys.stdin)["receipt_id"])')
cp "$LINE_DIR/brain-cycle-verify-receipt.json" "$RECEIPTS/receipt-zcode-${SHORT_TOKEN}-${LINE_NAME}-${DATE}.json"
echo "[11/11] verify PASS(${RECEIPT_ID})回执已入锚点"
# ---------- bind ----------
if [ "$SKIP_BIND" = false ]; then
phase bind
if [ -z "$SESSION_ARG" ]; then
SESSION_ARG=$(tail -1 "$LWLOG" | python3 -c 'import json,sys;print(json.loads(sys.stdin.readline())["session_id"])' 2>/dev/null || echo "")
fi
[ -n "$SESSION_ARG" ] || die "SESSION_ID_NOT_RESOLVED" "用 --session-id 显式传入宿主会话id。"
"$LWLINK" bind --session-id "$SESSION_ARG" --channel "$CHANNEL" --state-dir "$STATE_DIR" >/dev/null 2>&1 || die "BIND_FAIL" "session=$SESSION_ARG"
echo "[bind] LW-LINK GREEN(${SESSION_ARG} ← ${CHANNEL})"
fi
phase done
NOW=$(python3 -c 'import time;print(int(time.time()*1000))')
PHASE_TIMINGS="${PHASE_TIMINGS}${_PHASE}=$((NOW-_PHASE_T0))ms"
echo ""
echo "================ ZY-WAKE 唤醒报告 ================"
echo "总耗时: $((NOW-T_START))ms 分段: $PHASE_TIMINGS"
echo "频道: $CHANNEL | 周期: $CYCLE_ID | 回执: $RECEIPT_ID"
echo "一页纸: $PAGE"
echo "intake: $INTAKE_OUT"
echo "线目录: $LINE_DIR"
echo "状态目录: $STATE_DIR"
echo "事件正本: $EVT_TCS"
echo "=================================================="

23
BRIDGE/tools/zy-zcode-limb.sh Executable file
View file

@ -0,0 +1,23 @@
#!/bin/zsh
# zy-zcode-limb.sh · 铸渊zcode路径手脚委派门(2026-08-24 冰朔谕立)
# 用法:zsh /Volumes/JZAO/铸渊-ICE-GL-ZY001/BRIDGE/tools/zy-zcode-limb.sh "<给zcode-limb的指令>"
# 手脚住址:/Volumes/JZAO/HoloLake/persona-runtime/agents/opencode/zcode-limb/
# 正本:ZCODE-DEV-20260824/zcode-entry-gate-20260824/TCS-EVENT-ZCODE-LIMB-AGENT-AND-FIRST-LESSON-20260824.tcs
# 钥匙只从钥匙串取(TOKENPLAN_API_KEY),只注入子进程环境,不回显不落盘。
set -uo pipefail
KEY=$(security find-generic-password -s TOKENPLAN_API_KEY -w 2>/dev/null)
if [ -z "$KEY" ]; then
echo "⊢ 无钥匙:钥匙串里没有 TOKENPLAN_API_KEY。"
echo "⊢ 请冰朔在本机终端跑一次:"
echo " security add-generic-password -U -s TOKENPLAN_API_KEY -a bingshuo -w"
exit 1
fi
export TOKENPLAN_API_KEY="$KEY"
export BAILIAN_TP_KEY="$KEY" # ~/.opencode/opencode.json 的 bailian-tp 插值变量名
unset KEY
export XDG_CACHE_HOME="$HOME/.opencode-cache"
cd /Volumes/JZAO/HoloLake/persona-runtime/agents/opencode/zcode-limb || exit 1
exec opencode run "$@"