diff --git a/harness/ruview/.harness/manifest.json b/harness/ruview/.harness/manifest.json index 17d4cfc6..6d91f3d5 100644 --- a/harness/ruview/.harness/manifest.json +++ b/harness/ruview/.harness/manifest.json @@ -10,19 +10,19 @@ ], "toolPolicy": "default-deny-mutations", "files": { - ".claude/settings.json": "734e93983f6f0a42f17e5920df559c3367cd646b764afda072593771547fe620", - ".claude/skills/calibrate-room/SKILL.md": "6e0f9fd4d16bce3366fd5d9f1ca3f3595521cec58ac9ecbc000448c61b4d35ff", - ".claude/skills/onboard/SKILL.md": "347558601ad2c4002b0b6ec0ef8b3391e4c923f830b07c71025d6129c9970c2a", - ".claude/skills/provision-node/SKILL.md": "a980482bb06a271a88ccd973512090db59a6b7a13bb3407f8e85a547536e0612", - ".claude/skills/train-pose/SKILL.md": "3c72c12756294ecbd94da52e29e639f54f5903172ddb40137f27c442cb68021d", - ".claude/skills/verify/SKILL.md": "60c2f3e27854794eaeb45f83ec54b3fc03f09faff84c63b70f25fed139820571", + ".claude/settings.json": "19c76e2250c3f8eb9eeb60f04af9362be5d3513392b9591a312afb92178c067e", + ".claude/skills/calibrate-room/SKILL.md": "4b29c7c331f47acad3c0f51b3d3d8f5b5573e316e081bae71dbe21a47fa95240", + ".claude/skills/onboard/SKILL.md": "97ee71f0aa985cfc03bb8e764789bb55c4f9fd5dae10a116c1071eab85b5893f", + ".claude/skills/provision-node/SKILL.md": "5f73823794ed5f0b25c102aa8b1bf2dd534a1ec468173d8330c2af0ca24f239c", + ".claude/skills/train-pose/SKILL.md": "92aebd4423470eb10eabaee642ec3493284d98b7ae9785e0f34378c709746e65", + ".claude/skills/verify/SKILL.md": "2d38d240e9810a7827e2ebd3717dc0f85c646cc92e46c3812fe77c5b9eb40b76", ".harness/claims.json": "eaa44c5154ba1833c2289e5f46b98c53b38285aa75cf1ba3f725f3806ba69aa1", ".harness/mcp-policy.json": "19c266b061a8de579fb6dec4843f48761ddd8ea0806ee5d8ca848fd7e8cd428e", ".mcp/servers.json": "fec6075400f8350d8075beac8306690355c4b015425bfd0e5f52966234e9d66f", - "CLAUDE.md": "a39fb83cbc12870c98241c81c3e79a016f21a76d05cbe66fb27c40f68a5134af", - "LICENSE": "a5e8c796a9213c6c2e21c6975d2fb7134d52ce8be8a1b28835ccc9b11386db65", - "README.md": "4e4bf1fbe8cb6dc6bc82f93491af72e7086e584d8dfe08e4918dba2eb3e403d2", - "bin/cli.js": "dda158ef36b527e79b47fb51fdb504ccc0c68b3d653e203db6744345cb70d66c", + "CLAUDE.md": "1d7af0c310dd8093b4ae6c9c94a1c0cc9ff02ac9c8d5b45caba5363c3af99475", + "LICENSE": "631f94984f626818d42ecf717aa6e8e0afd4f9f355ca706bd2effafbd1416d06", + "README.md": "a38c64a947989246107a48b8181078c7ba4361ab5bdb49a57439b9cab6fe737d", + "bin/cli.js": "6713e8a36e1304f0c25eecc06e07e53240465a25c036469112a09de4a00cec57", "brain/corpus/core.jsonl": "4bbb5f86dd1c13f26d19f911a33c7b382203ddb70b00ce3c7dbe7cbc4b96f9a8", "flywheel/evaluations.json": "ac4ff1f897a2444870cd2b8ae8aee8b1578e61467aeca4db57893f41be98a572", "flywheel/fixture.mjs": "de71be88753d0da4695d91011b54380c994a018986fafba36cb13739307a9bce", @@ -30,28 +30,28 @@ "flywheel/genome.json": "32c937ccf4431409c1bd7892b4afba6097c539d8c76d41aa968091c9a83d8f99", "flywheel/replay.mjs": "0670ca0b03701f4afe0b4bca8a3d58d481676b61a94a5b98c6a425aefb1159ab", "flywheel/run.mjs": "6d4f97db16900c45367b6538848cbe1915af999e663720dfc51f2bb1698f1cd0", - "package.json": "ef9b6a092a86efdf0adc75de436c22c217a265b42528c44efd460e5bbd02dd8c", - "scripts/sync-skills.mjs": "dd01ce95853c983709bca391266fe4593cbc0fbed0c54b4c1c0729ee63d24f2f", - "scripts/update-manifest.mjs": "27fecb8c8ddf5506129738fa3b74d549f2d43b55c49fd1d438aa71405c946663", - "scripts/verify-manifest.mjs": "fafab2986e100095886b31ed86ca97d7d7b49f22fa3afc9e9d47e79f8edcca79", - "skills/calibrate-room.md": "6e0f9fd4d16bce3366fd5d9f1ca3f3595521cec58ac9ecbc000448c61b4d35ff", - "skills/onboard.md": "347558601ad2c4002b0b6ec0ef8b3391e4c923f830b07c71025d6129c9970c2a", - "skills/provision-node.md": "a980482bb06a271a88ccd973512090db59a6b7a13bb3407f8e85a547536e0612", - "skills/train-pose.md": "3c72c12756294ecbd94da52e29e639f54f5903172ddb40137f27c442cb68021d", - "skills/verify.md": "60c2f3e27854794eaeb45f83ec54b3fc03f09faff84c63b70f25fed139820571", + "package.json": "a83b8b2f903ba1bc31daf98e37a2ab69b7e30c5ae8b6415b3193487dc75b398b", + "scripts/sync-skills.mjs": "43715dab61e204dc91bbd61755810e8fdb2f66e2b0c0bd791b4bf48a2e293565", + "scripts/update-manifest.mjs": "8f56764b8f70aed55da0c7e2417ae875b0d58d781d839b6db7f115f08af61e6b", + "scripts/verify-manifest.mjs": "6491a221762efcfeb3e749ecab243b204f17fd5bc871f3d4025597f31b8f0f10", + "skills/calibrate-room.md": "4b29c7c331f47acad3c0f51b3d3d8f5b5573e316e081bae71dbe21a47fa95240", + "skills/onboard.md": "97ee71f0aa985cfc03bb8e764789bb55c4f9fd5dae10a116c1071eab85b5893f", + "skills/provision-node.md": "5f73823794ed5f0b25c102aa8b1bf2dd534a1ec468173d8330c2af0ca24f239c", + "skills/train-pose.md": "92aebd4423470eb10eabaee642ec3493284d98b7ae9785e0f34378c709746e65", + "skills/verify.md": "2d38d240e9810a7827e2ebd3717dc0f85c646cc92e46c3812fe77c5b9eb40b76", "src/brain.js": "0f16a75aea943acdacc430ff11d5df7ecdec9cca2ab497795ff6f33eaebdfab6", - "src/guardrails.js": "e9ebea002f376f611f9c7447667cf0a6cdd2ba713f205e6fa59d9286da91d7c1", + "src/guardrails.js": "aacc8fa6088f7f1ccea3a0b02171a5c516b95d3416ee3ba87add3879a1d6aaad", "src/hosts/claude-code.js": "2212bc39b49822018800dfe33a471e56bbb4c5233d716bfa7aa4fff77aa23edb", "src/hosts/codex.js": "d41ecd132ce2db7b47aad9cebbc020d70e6810d48c3554858d099ff2e8f6608b", "src/hosts/index.js": "ab276c41ab722bcdf72c2d1649cecbb760ae05c41c1372aae4c2447aa7c11539", - "src/mcp-server.js": "0b98f6873c4ed282df2b251df81da771416b5dadc735fae9b8be9e455118e46b", + "src/mcp-server.js": "8c44b0f5e2ee0c386e5315b5927483620cd32ab978055b9f540259c65d4da5fc", "src/policy.js": "9731e534a2d9b9b4fe841f1f50ff4a133728ad48bea8fd629aa880790f345e8f", "src/process-runner.js": "49533b038044dfb8bc76ed01c030d06a9856ead0836157fb693e2a7d40f786d6", "src/redact.js": "ebf1afff46341078706b0401838c53db043603586e280d51ece5cf1feba35189", "src/repo-trust.js": "06e2a94d7113ed936f208a12b7fcc785801c215a3e2c5e7418f6238d991a289c", - "src/tools.js": "2b7ab45a6b783de05ad509a2acb25bd24bdbb905ec0df190e59e5c9fc778c822" + "src/tools.js": "ba897110ed5565930f0df1c72cf406d2319ad493c081fecc9d111f1be9f5ebf1" }, - "filesDigest": "462b6e5907894e6af8afe16f88466179bea2323016c40bbcddf1370691b7e5a5", + "filesDigest": "a665538c692ab6fdc48e888712dfb1cb9d9588d72a4a9c5477a3ee33481dfa0e", "brainDigest": "4bbb5f86dd1c13f26d19f911a33c7b382203ddb70b00ce3c7dbe7cbc4b96f9a8", "gateFingerprint": "6e53c784eee38310188948fc75fb49e6b4ebc04e247d01b903fa8c8a92d67bdd", "developmentPins": { diff --git a/harness/ruview/.harness/manifest.sha256 b/harness/ruview/.harness/manifest.sha256 index 6aa5007d..da061638 100644 --- a/harness/ruview/.harness/manifest.sha256 +++ b/harness/ruview/.harness/manifest.sha256 @@ -1 +1 @@ -ef8ed7933ea35729a0ddbe9a711fef7d04e098b4a6471c217ff6ec19cefc7fd1 manifest.json +47eef713ec90adc6b09becb10e4d409c4edc4212cd5e910e0c062cb3c195ac3e manifest.json diff --git a/harness/ruview/scripts/update-manifest.mjs b/harness/ruview/scripts/update-manifest.mjs index f2ad8978..28bf111c 100644 --- a/harness/ruview/scripts/update-manifest.mjs +++ b/harness/ruview/scripts/update-manifest.mjs @@ -10,6 +10,7 @@ const ROOT = dirname(dirname(fileURLToPath(import.meta.url))); const quiet = process.argv.includes('--quiet'); const INCLUDE = ['package.json', 'bin', 'src', 'skills', '.claude', '.mcp', '.harness/claims.json', '.harness/mcp-policy.json', 'brain', 'flywheel', 'scripts', 'CLAUDE.md', 'README.md', 'LICENSE']; const sha = (value) => createHash('sha256').update(value).digest('hex'); +const canonicalFile = (path) => readFileSync(path, 'utf8').replace(/\r\n/g, '\n'); const files = []; function walk(path) { const stat = statSync(path); @@ -18,7 +19,7 @@ function walk(path) { } else files.push(path); } for (const entry of INCLUDE) walk(join(ROOT, entry)); -const hashes = Object.fromEntries(files.sort().map((path) => [relative(ROOT, path).replaceAll('\\', '/'), sha(readFileSync(path))])); +const hashes = Object.fromEntries(files.sort().map((path) => [relative(ROOT, path).replaceAll('\\', '/'), sha(canonicalFile(path))])); const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8')); const manifest = { schema: 2, diff --git a/harness/ruview/scripts/verify-manifest.mjs b/harness/ruview/scripts/verify-manifest.mjs index 7658f077..9ca376ad 100644 --- a/harness/ruview/scripts/verify-manifest.mjs +++ b/harness/ruview/scripts/verify-manifest.mjs @@ -6,6 +6,7 @@ import { fileURLToPath } from 'node:url'; const ROOT = dirname(dirname(fileURLToPath(import.meta.url))); const quiet = process.argv.includes('--quiet'); const sha = (value) => createHash('sha256').update(value).digest('hex'); +const canonicalFile = (path) => readFileSync(path, 'utf8').replace(/\r\n/g, '\n'); const path = join(ROOT, '.harness', 'manifest.json'); const raw = readFileSync(path); const manifest = JSON.parse(raw); @@ -13,7 +14,7 @@ const findings = []; for (const [name, expected] of Object.entries(manifest.files || {})) { const target = join(ROOT, name); if (!existsSync(target)) findings.push(`${name}:missing`); - else if (sha(readFileSync(target)) !== expected) findings.push(`${name}:hash-mismatch`); + else if (sha(canonicalFile(target)) !== expected) findings.push(`${name}:hash-mismatch`); } const expectedOuter = readFileSync(join(ROOT, '.harness', 'manifest.sha256'), 'utf8').trim().split(/\s+/)[0]; if (sha(raw) !== expectedOuter) findings.push('manifest.sha256:mismatch');