#!/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 "); search(q); break; } default: process.stderr.write("usage: neural-chain.mjs verify|search \n"); process.exit(2); }