58 files: TCS canons+GIR+projections (LW-LINK/BROADCAST/NOTARY/SHENBI/TRANSLATION-INDEX/TCS-ONLY-MANDATE + teaching&promotion events), 7 executors, neural-chain v5 (28 neurons), executor translation index, 8 acceptance receipts, numbered push manifest ZY-LWS-001 mapping every file back to JZAO canonical paths+sha256. Authorized by ICE-GL∞ direct language 2026-08-25. Route: LOCAL_GIT_OSXKEYCHAIN+FETCH+REBASE+HEAD:main+NO_FORCE.
76 lines
3 KiB
JavaScript
76 lines
3 KiB
JavaScript
#!/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);
|
|
}
|