bookworm-smart-assistant/scripts/patches/patch-p1-2-jsonl-baseline-init.js

65 lines
2.0 KiB
JavaScript
Raw Normal View History

#!/usr/bin/env node
/**
* patch-p1-2-jsonl-baseline-init.js
*
* P1.2 step2: evolution-log.jsonl + route-feedback.jsonl 创建 HMAC baseline 快照
*
* 输出: <jsonl>.hmac-baseline.json (只读快照)
*
* warn 模式策略:
* - baseline 一旦创建后只增写入新行不改 baseline
* - 周期 verifier 跑时若发现 drift 仅记录到 evolution-log violation
* - 用户切 enforce 后才禁止 drift需另写 enforce 脚本
*/
'use strict';
const fs = require('fs');
const path = require('path');
const ROOT = path.join(__dirname, '..', '..');
const TARGETS = [
{ jsonl: path.join(ROOT, 'evolution-log.jsonl'), label: 'evolution-log' },
{ jsonl: path.join(ROOT, 'debug', 'route-feedback.jsonl'), label: 'route-feedback' },
];
let mod;
try {
mod = require(path.join(ROOT, 'hooks', 'lib', 'jsonl-hmac.js'));
} catch (e) {
process.stderr.write('[ERROR] jsonl-hmac.js lib not found. Run patch-p1-2-jsonl-hmac-lib.js first.\n');
process.exit(1);
}
let okCount = 0, skipCount = 0, errCount = 0;
for (const { jsonl, label } of TARGETS) {
const baselinePath = jsonl + '.hmac-baseline.json';
if (!fs.existsSync(jsonl)) {
process.stdout.write('[SKIP] ' + label + ': source not found (' + jsonl + ')\n');
skipCount++;
continue;
}
if (fs.existsSync(baselinePath)) {
process.stdout.write('[SKIP] ' + label + ': baseline already exists\n');
skipCount++;
continue;
}
const result = mod.writeBaseline(jsonl, baselinePath);
if (!result.ok) {
process.stderr.write('[ERROR] ' + label + ': ' + result.error + '\n');
errCount++;
continue;
}
process.stdout.write('[OK] ' + label + ' baseline created\n');
process.stdout.write(' lines=' + result.baseline.lineCount + ' sig=' + (result.baseline.sig || '').slice(0, 16) + '...\n');
process.stdout.write(' fingerprint=' + result.baseline.hmacKeyFingerprint + '\n');
okCount++;
}
process.stdout.write('\n[SUMMARY] ok=' + okCount + ' skip=' + skipCount + ' err=' + errCount + '\n');
process.exit(errCount > 0 ? 1 : 0);