@treeseed/dsh-chapters 0.1.24 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +2 -1
  2. package/cordis.patch.yml +49 -1
  3. package/docs/architecture.md +1 -496
  4. package/docs/backlog.md +234 -4
  5. package/docs/contract.md +127 -1
  6. package/docs/development.md +248 -12
  7. package/docs/host-compaction-seam.md +108 -0
  8. package/docs/knowledge-repo.md +532 -16
  9. package/docs/project-state.md +323 -0
  10. package/docs/verify.md +217 -0
  11. package/lib/archive.d.ts +49 -1
  12. package/lib/archive.js +56 -2
  13. package/lib/archive.js.map +1 -1
  14. package/lib/arrival.js +24 -10
  15. package/lib/arrival.js.map +1 -1
  16. package/lib/attach.d.ts +46 -0
  17. package/lib/attach.js +120 -0
  18. package/lib/attach.js.map +1 -0
  19. package/lib/auto-save.d.ts +74 -0
  20. package/lib/auto-save.js +162 -26
  21. package/lib/auto-save.js.map +1 -1
  22. package/lib/client.js +413 -11
  23. package/lib/client.js.map +1 -1
  24. package/lib/commands.d.ts +8 -1
  25. package/lib/commands.js +135 -7
  26. package/lib/commands.js.map +1 -1
  27. package/lib/compose.js +25 -6
  28. package/lib/compose.js.map +1 -1
  29. package/lib/continue-core.d.ts +24 -1
  30. package/lib/continue-core.js +41 -9
  31. package/lib/continue-core.js.map +1 -1
  32. package/lib/diag.d.ts +47 -0
  33. package/lib/diag.js +141 -0
  34. package/lib/diag.js.map +1 -0
  35. package/lib/engine-core.d.ts +51 -1
  36. package/lib/engine-core.js +63 -7
  37. package/lib/engine-core.js.map +1 -1
  38. package/lib/engine.d.ts +93 -0
  39. package/lib/engine.js +477 -36
  40. package/lib/engine.js.map +1 -1
  41. package/lib/enrich-queue.js +28 -2
  42. package/lib/enrich-queue.js.map +1 -1
  43. package/lib/enrich-wire.d.ts +92 -2
  44. package/lib/enrich-wire.js +135 -17
  45. package/lib/enrich-wire.js.map +1 -1
  46. package/lib/enrich.d.ts +27 -2
  47. package/lib/enrich.js +114 -18
  48. package/lib/enrich.js.map +1 -1
  49. package/lib/index.d.ts +51 -0
  50. package/lib/index.js +180 -2
  51. package/lib/index.js.map +1 -1
  52. package/lib/indexing.d.ts +7 -0
  53. package/lib/indexing.js.map +1 -1
  54. package/lib/injections.d.ts +1 -0
  55. package/lib/injections.js +38 -0
  56. package/lib/injections.js.map +1 -1
  57. package/lib/last-resort.d.ts +24 -0
  58. package/lib/last-resort.js +27 -0
  59. package/lib/last-resort.js.map +1 -0
  60. package/lib/prompt.d.ts +130 -0
  61. package/lib/prompt.js +255 -0
  62. package/lib/prompt.js.map +1 -0
  63. package/lib/registry.d.ts +39 -1
  64. package/lib/registry.js +76 -9
  65. package/lib/registry.js.map +1 -1
  66. package/lib/render.d.ts +31 -3
  67. package/lib/render.js +75 -3
  68. package/lib/render.js.map +1 -1
  69. package/lib/repair-run.d.ts +49 -0
  70. package/lib/repair-run.js +423 -0
  71. package/lib/repair-run.js.map +1 -0
  72. package/lib/repair.d.ts +200 -0
  73. package/lib/repair.js +354 -0
  74. package/lib/repair.js.map +1 -0
  75. package/lib/rules-commands.d.ts +22 -0
  76. package/lib/rules-commands.js +177 -20
  77. package/lib/rules-commands.js.map +1 -1
  78. package/lib/rules.d.ts +184 -7
  79. package/lib/rules.js +312 -27
  80. package/lib/rules.js.map +1 -1
  81. package/lib/save-core.d.ts +31 -1
  82. package/lib/save-core.js +153 -17
  83. package/lib/save-core.js.map +1 -1
  84. package/lib/session-rules.d.ts +222 -0
  85. package/lib/session-rules.js +454 -0
  86. package/lib/session-rules.js.map +1 -0
  87. package/lib/store.d.ts +22 -1
  88. package/lib/store.js +94 -17
  89. package/lib/store.js.map +1 -1
  90. package/lib/sync.js +13 -1
  91. package/lib/sync.js.map +1 -1
  92. package/lib/tools.d.ts +14 -0
  93. package/lib/tools.js +311 -32
  94. package/lib/tools.js.map +1 -1
  95. package/lib/types.d.ts +12 -1
  96. package/lib/types.js.map +1 -1
  97. package/lib/version.d.ts +9 -0
  98. package/lib/version.js +10 -0
  99. package/lib/version.js.map +1 -0
  100. package/lib/warnings.d.ts +10 -0
  101. package/lib/warnings.js +18 -0
  102. package/lib/warnings.js.map +1 -0
  103. package/package.json +9 -3
@@ -0,0 +1,423 @@
1
+ /**
2
+ * The repair runner (#60) — apply what `audit()` found, through the doors that already exist.
3
+ *
4
+ * There is no second archive implementation here, on purpose. Every mutation is either
5
+ * - a call into the SAME save core the other five archive moments call (`saveSession`, now with its
6
+ * repair-only `span` / `supersede` / `attemptSalt` knobs), or
7
+ * - one pure registry transition (`supersedeChapter`, `raiseCounters`, `expireBookkeeping`,
8
+ * `releaseReservation`) run inside a `store.mutate` section (#59).
9
+ * So a repaired chapter is byte-identical to a chapter that archived normally, and a repair cannot
10
+ * drift from the pipeline it is fixing.
11
+ *
12
+ * Ordering the run (docs/architecture.md § Repair):
13
+ * 1. audit (read-only, and the SAME function `dry-run` shows);
14
+ * 2. write the journal FIRST — if the journal cannot be written, the run refuses to start;
15
+ * 3. apply, journalling each move as it happens;
16
+ * 4. re-audit and report the before/after counts, so the operator sees whether the repair worked
17
+ * rather than whether it ran.
18
+ */
19
+ import { createHash } from 'node:crypto';
20
+ import fs from 'node:fs';
21
+ import path from 'node:path';
22
+ import { audit, coveringChapter, journalEntryInverse, markSupersededBy, raiseCounters, expireBookkeeping } from "./repair.js";
23
+ import { appendChapters, releaseReservation } from "./registry.js";
24
+ import { parseFrontmatter } from "./indexing.js";
25
+ import { resolveStoredPath } from "./archive.js";
26
+ import { saveSession } from "./save-core.js";
27
+ const ACTABLE = {
28
+ 'hollow-payload': true, 'never-archived-span': true, 'dead-citation': true,
29
+ 'ghost-plan-manifest': true, 'unreleased-reservation': true, 'countervalue-drift': true,
30
+ // empty-artifact / duplicate-number / orphan-file are resolved BY the re-render of their chapter: a
31
+ // 0-byte ref disappears when its chapter is superseded and re-rendered by the fixed renderer, and a
32
+ // duplicate number is fixed by re-spending it correctly. Half-fixing them separately would leave a
33
+ // record citing a file we moved. Report-only until their parent finding runs.
34
+ 'empty-artifact': false, 'duplicate-number': false, 'orphan-file': false, 'unregistered-file': true,
35
+ 'tampered-file': false, 'test-litter': false, unrecoverable: false,
36
+ };
37
+ const sha256 = (buf) => createHash('sha256').update(buf).digest('hex');
38
+ /** The file view of the store, from a real directory scan (the offline script's advantage over ctx.fs). */
39
+ export function fileSetFromDisk(cwd, storeRoot, rootSession, knownRoots = []) {
40
+ const rel = (abs) => path.relative(cwd, abs).split(path.sep).join('/');
41
+ const subdirs = (dir) => {
42
+ try {
43
+ return fs.readdirSync(dir, { withFileTypes: true }).filter((e) => e.isDirectory()).map((e) => rel(path.join(dir, e.name)));
44
+ }
45
+ catch {
46
+ return [];
47
+ }
48
+ };
49
+ const listDir = (dir) => {
50
+ try {
51
+ return fs.readdirSync(dir, { withFileTypes: true }).flatMap((e) => {
52
+ const p = path.join(dir, e.name);
53
+ return e.isDirectory() ? listDir(p) : [p];
54
+ });
55
+ }
56
+ catch {
57
+ return [];
58
+ }
59
+ };
60
+ // The registry stores paths RELATIVE TO THE WORKSPACE (`.dsh-chapters/<root>/chapters/001-x.md`), so
61
+ // the file set speaks the same dialect — comparing `root-1/chapters/…` against `.dsh-chapters/root-1/…`
62
+ // is how a first draft invented an orphan for every chapter and called its own tree litter.
63
+ const treeRoot = path.join(cwd, storeRoot, rootSession);
64
+ const abs = (p) => path.isAbsolute(p) ? p : path.join(cwd, p);
65
+ const onDisk = listDir(treeRoot).map(rel);
66
+ const bytesOf = (p) => {
67
+ try {
68
+ return fs.statSync(abs(p)).size;
69
+ }
70
+ catch {
71
+ return -1;
72
+ }
73
+ };
74
+ return {
75
+ exists: (p) => fs.existsSync(abs(p)),
76
+ bytes: bytesOf,
77
+ shaMatches: (p, sha) => {
78
+ try {
79
+ return sha256(fs.readFileSync(abs(p))) === sha;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ },
85
+ chapterPaths: onDisk.filter((p) => p.includes('/chapters/') && p.endsWith('.md') && !p.includes('/plan-')),
86
+ artifactPaths: onDisk.filter((p) => p.includes('/artifacts/')),
87
+ emptyArtifactPaths: onDisk.filter((p) => p.includes('/artifacts/') && bytesOf(p) === 0),
88
+ // ROOTS are the immediate SUBDIRECTORIES of the store root that NO registry row claims. Two false
89
+ // starts, both measured on the first real run: `listDir` returns FILES, so every chapter became a
90
+ // "second root" (36,000 findings), and then every OTHER SESSION's legitimate tree did (634). One
91
+ // directory per root session is the normal shape of this store — litter is a directory nothing owns.
92
+ roots: subdirs(path.join(cwd, storeRoot)).filter((d) => !knownRoots.includes(path.basename(d))),
93
+ // the #58 signature is a fact about the BYTES, so read it from the bytes
94
+ looksLikeShell: (p) => {
95
+ try {
96
+ const t = fs.readFileSync(abs(p), 'utf8');
97
+ return /tool: unknown/.test(t) || /arguments: \{\}/.test(t) || /result \(seq \d+, 0 B\)/.test(t);
98
+ }
99
+ catch {
100
+ return false;
101
+ }
102
+ },
103
+ canScan: true,
104
+ };
105
+ }
106
+ /** The same view WITHOUT a directory scan — what the host can offer, declared honestly blind. */
107
+ export function fileSetFromRegistry(records, existsSync) {
108
+ return {
109
+ exists: (p) => existsSync(p),
110
+ bytes: () => 0,
111
+ shaMatches: () => true,
112
+ chapterPaths: records.map((r) => r.path),
113
+ artifactPaths: records.flatMap((r) => r.artifacts.map((a) => a.path)),
114
+ emptyArtifactPaths: records.flatMap((r) => r.artifacts.filter((a) => a.bytes === 0).map((a) => a.path)),
115
+ canScan: false,
116
+ };
117
+ }
118
+ /** Log facts the audit needs, derived from the durable events — never from the registry's memory. */
119
+ function logFacts(events) {
120
+ const turnEndSeqs = events.filter((e) => e.type === 'turn/end').map((e) => e.seq);
121
+ const collections = events
122
+ .filter((e) => e.type === 'turn/end')
123
+ .map((e) => ({ from: e.seq, to: e.seq }));
124
+ return { turnEndSeqs, collections };
125
+ }
126
+ /**
127
+ * Run the repair. `dryRun` produces the same audit and the same plan — it simply writes nothing, which
128
+ * is what makes `dry-run` trustworthy as a preview of `apply`.
129
+ */
130
+ export async function runRepair(ports, opts) {
131
+ const { store, cwd, config } = ports;
132
+ const journalId = new Date().toISOString().replace(/[:.]/g, '-');
133
+ const state0 = await store.get(opts.sessionId);
134
+ const logEvents = await ports.readLog(opts.sessionId);
135
+ if (logEvents === null || logEvents.length === 0) {
136
+ // Invariant 1 is the whole reason repair exists. No log, nothing to re-derive from: say WHICH
137
+ // sessions are unrecoverable rather than reporting a clean store.
138
+ return {
139
+ journalId, findingsBefore: [], findingsAfter: [], blindSpots: ['unrecoverable'], applied: [],
140
+ refused: [`session ${opts.sessionId} has no readable durable log — its knowledge cannot be re-derived (unrecoverable)`],
141
+ };
142
+ }
143
+ // ONE closure does both audits. Two separate call sites drifted: the after-audit forgot
144
+ // `ports.knownRoots`, so it called every sibling session tree `test-litter`, and a journal reported
145
+ // "25 findings remain" where 1 was real. A before/after number is only worth printing — or storing in
146
+ // a journal — if both sides are computed by the same call with the same inputs (#60).
147
+ const auditNow = (st) => audit({
148
+ sessionId: opts.sessionId,
149
+ cwd,
150
+ state: st,
151
+ files: opts.listedPaths !== undefined
152
+ ? fileSetFromRegistry(st.chapters, () => false)
153
+ : fileSetFromDisk(cwd, config.artifactStoreRoot, st.rootSession, ports.knownRoots ?? []),
154
+ log: logFacts(logEvents),
155
+ });
156
+ const before = auditNow(state0);
157
+ const wanted = opts.classes === 'all' ? before.findings : before.findings.filter((f) => opts.classes.includes(f.class));
158
+ const actionable = wanted.filter((f) => ACTABLE[f.class]);
159
+ const deferred = wanted.filter((f) => !ACTABLE[f.class]);
160
+ if (opts.dryRun) {
161
+ ports.log(`repair dry-run ${opts.sessionId}: ${actionable.length} actionable, ${deferred.length} report-only`);
162
+ return { journalId, findingsBefore: before.findings, findingsAfter: before.findings, blindSpots: before.blindSpots, applied: [], refused: deferred.map((f) => `${f.class}: ${f.detail}`) };
163
+ }
164
+ // JOURNAL FIRST. An applied run with no journal is a story nobody can check or undo.
165
+ const repairsDir = path.join(cwd, config.artifactStoreRoot, state0.rootSession, 'repairs');
166
+ const journal = {
167
+ id: journalId, sessionId: opts.sessionId, startedAt: Date.now(),
168
+ classes: [...new Set(actionable.map((f) => f.class))], completedAt: null,
169
+ entries: [], findingsBefore: before.findings.length, findingsAfter: before.findings.length,
170
+ };
171
+ try {
172
+ fs.mkdirSync(repairsDir, { recursive: true });
173
+ fs.writeFileSync(path.join(repairsDir, `${journalId}.json`), `${JSON.stringify(journal, null, 2)}\n`);
174
+ }
175
+ catch (error) {
176
+ return { journalId, findingsBefore: before.findings, findingsAfter: before.findings, blindSpots: before.blindSpots, applied: [], refused: [`journal could not be written (${String(error.message).slice(0, 120)}) — refusing to apply anything`] };
177
+ }
178
+ const flush = () => {
179
+ try {
180
+ fs.writeFileSync(path.join(repairsDir, `${journalId}.json`), `${JSON.stringify(journal, null, 2)}\n`);
181
+ }
182
+ catch (error) {
183
+ ports.warn(`repair journal ${journalId} could not be updated: ${String(error.message).slice(0, 100)}`);
184
+ }
185
+ };
186
+ const quarantineDir = path.join(cwd, config.artifactStoreRoot, state0.rootSession, '.repair-quarantine');
187
+ void 0;
188
+ const quarantine = async (relPath) => {
189
+ const absP = path.join(cwd, relPath);
190
+ if (!fs.existsSync(absP))
191
+ return;
192
+ const to = path.join(quarantineDir, relPath.split('/').pop() ?? 'file');
193
+ fs.mkdirSync(quarantineDir, { recursive: true });
194
+ const beforeSha = sha256(fs.readFileSync(absP));
195
+ fs.copyFileSync(absP, to);
196
+ // every journal path is stored in the SAME dialect the registry uses (relative to the workspace
197
+ // cwd) — a mix of absolute and relative is how a restore silently finds nothing to undo (#60)
198
+ journal.entries.push({ kind: 'quarantine', path: relPath, beforeSha, afterSha: beforeSha, to: path.relative(cwd, to).split(path.sep).join('/') });
199
+ flush();
200
+ };
201
+ const refused = deferred.map((f) => `${f.class}: ${f.detail}`);
202
+ for (const f of actionable) {
203
+ try {
204
+ if (f.class === 'hollow-payload' && f.target.fromSeq !== undefined && f.target.toSeq !== undefined && f.target.number !== undefined) {
205
+ const huskPath = state0.chapters.find((c) => c.number === f.target.number)?.path;
206
+ // "already in the archive" is a THROW inside save-core, not an outcome — and for a repair it is
207
+ // an EXPECTED answer (an earlier run, or the door itself, archived the span). Swallow it into the
208
+ // same no-records shape so the coverage check below can supersede the husk by what already covers
209
+ // it; a throw reaching the per-finding catch would strand the record forever (#60).
210
+ let out;
211
+ try {
212
+ out = await saveSession({
213
+ events: logEvents, sessionId: opts.sessionId, cwd, store, config,
214
+ span: { fromSeq: f.target.fromSeq, toSeq: f.target.toSeq },
215
+ supersede: { over: f.target.number, reason: 'hollow-payload' },
216
+ attemptSalt: `repair:${journalId}`,
217
+ });
218
+ }
219
+ catch (error) {
220
+ out = { records: [], skipped: 'already-archived', warnings: [] };
221
+ ports.log(`ch.${f.target.number}: the re-read said "already archived" (${String(error.message).slice(0, 60)}) — looking for what covers the span`);
222
+ }
223
+ if (out.records.length === 0) {
224
+ // #60: a repair run after the first one finds the span ALREADY re-archived, so the re-read is
225
+ // a legitimate no-op — and the husk record would circulate forever. Hand it to whichever
226
+ // active chapter now covers its span instead of refusing.
227
+ const fresh = await store.get(opts.sessionId);
228
+ const cover = coveringChapter(fresh, f.target.fromSeq, f.target.toSeq, f.target.number);
229
+ if (cover.length === 0 || f.target.number === undefined) {
230
+ refused.push(`hollow-payload ch.${f.target.number}: the re-read rendered nothing (${out.skipped ?? 'no records'}) and no active chapter covers ${f.target.fromSeq}-${f.target.toSeq} — left in place, nothing was superseded`);
231
+ continue;
232
+ }
233
+ const marked = markSupersededBy(fresh, f.target.number, cover[0].number, 'hollow-payload');
234
+ if (marked.problem !== undefined) {
235
+ refused.push(`hollow-payload ch.${f.target.number}: ${marked.problem}`);
236
+ continue;
237
+ }
238
+ await store.mutate(opts.sessionId, () => marked.state);
239
+ journal.entries.push({ kind: 'registry', path: fresh.chapters.find((c) => c.number === f.target.number)?.path ?? `ch.${f.target.number}`, beforeSha: null, afterSha: cover[0].sha256 });
240
+ flush();
241
+ ports.log(`superseded hollow ch.${f.target.number} by ${cover.length} chapter(s) [${cover.map((c) => c.number).join(', ')}] that together carry seqs ${f.target.fromSeq}-${f.target.toSeq}`);
242
+ continue;
243
+ }
244
+ if (huskPath !== undefined)
245
+ await quarantine(huskPath);
246
+ journal.entries.push({ kind: 'write', path: out.records[0].path, beforeSha: null, afterSha: out.records[0].sha256 });
247
+ flush();
248
+ ports.log(`repaired hollow ch.${f.target.number} → ch.${out.records[0].number} (${out.records.length} chapter(s), seqs ${f.target.fromSeq}-${f.target.toSeq})`);
249
+ }
250
+ else if (f.class === 'never-archived-span' && f.target.fromSeq !== undefined && f.target.toSeq !== undefined) {
251
+ const out = await saveSession({
252
+ events: logEvents, sessionId: opts.sessionId, cwd, store, config,
253
+ span: { fromSeq: f.target.fromSeq, toSeq: f.target.toSeq },
254
+ attemptSalt: `repair:${journalId}`,
255
+ });
256
+ for (const r of out.records)
257
+ journal.entries.push({ kind: 'write', path: r.path, beforeSha: null, afterSha: r.sha256 });
258
+ flush();
259
+ if (out.records.length === 0)
260
+ refused.push(`never-archived-span ${f.target.fromSeq}-${f.target.toSeq}: rendered nothing (${out.skipped ?? 'unknown'})`);
261
+ else
262
+ ports.log(`archived the missed span ${f.target.fromSeq}-${f.target.toSeq} as ${out.records.length} chapter(s)`);
263
+ }
264
+ else if (f.class === 'dead-citation' && f.target.path !== undefined) {
265
+ // Satisfy the citation: render THAT manifest chapter's own span and write it AT the cited path.
266
+ const key = Object.keys(state0.plans ?? {}).find((k) => (state0.plans?.[k]?.chapters ?? []).some((c) => c.path === f.target.path));
267
+ const pc = key !== undefined ? state0.plans?.[key]?.chapters?.find((c) => c.path === f.target.path) : undefined;
268
+ if (pc === undefined) {
269
+ refused.push(`dead-citation ${f.target.path}: no manifest chapter carries its span`);
270
+ continue;
271
+ }
272
+ const out = await saveSession({
273
+ events: logEvents, sessionId: opts.sessionId, cwd, store, config,
274
+ span: { fromSeq: pc.startSeq, toSeq: pc.endSeq },
275
+ attemptSalt: `repair:${journalId}`,
276
+ });
277
+ const written = out.records[0];
278
+ if (written === undefined) {
279
+ refused.push(`dead-citation ${f.target.path}: the span rendered nothing (${out.skipped ?? 'no records'})`);
280
+ continue;
281
+ }
282
+ // The cited PATH is the promise; move the bytes onto it (a copy of the same content, same hash).
283
+ const fromAbs = resolveStoredPath(cwd, written.path);
284
+ const toAbs = resolveStoredPath(cwd, f.target.path);
285
+ if (fs.existsSync(fromAbs)) {
286
+ fs.mkdirSync(path.dirname(toAbs), { recursive: true });
287
+ fs.copyFileSync(fromAbs, toAbs);
288
+ journal.entries.push({ kind: 'write', path: toAbs, beforeSha: null, afterSha: sha256(fs.readFileSync(toAbs)) });
289
+ await store.mutate(opts.sessionId, (fresh) => ({
290
+ ...fresh,
291
+ chapters: fresh.chapters.map((c) => (c.number === written.number ? { ...c, path: f.target.path } : c)),
292
+ }));
293
+ flush();
294
+ ports.log(`dead citation satisfied: ${f.target.path} now exists with the re-rendered bytes (chapter ${written.number})`);
295
+ }
296
+ }
297
+ else if (f.class === 'unregistered-file' && f.target.path !== undefined) {
298
+ // The bytes ARE the archive; only the registry row was lost. Re-read the file's own
299
+ // frontmatter (the store's ONE parser, src/indexing.ts) and hand the row back. Nothing on disk
300
+ // moves — this is not a rewrite, it is the registry catching up with the store.
301
+ const relPath = f.target.path;
302
+ const absFile = path.join(cwd, relPath);
303
+ if (!fs.existsSync(absFile)) {
304
+ refused.push(`unregistered-file ${relPath}: vanished between audit and apply — re-run`);
305
+ continue;
306
+ }
307
+ const fm = parseFrontmatter(fs.readFileSync(absFile, 'utf8'));
308
+ const range = Array.isArray(fm.seqRange) ? fm.seqRange.map((x) => Number(x)) : [];
309
+ const num = /\/(\d{3})-/.exec(relPath)?.[1];
310
+ if (range.length !== 2 || Number.isNaN(range[0]) || num === undefined) {
311
+ refused.push(`unregistered-file ${relPath}: frontmatter has no usable seqRange — it cannot be re-registered honestly`);
312
+ continue;
313
+ }
314
+ const taken = state0.chapters.some((c) => c.number === Number(num));
315
+ if (taken) {
316
+ // Two files claiming one number is #59's twin. Choosing a winner is a HUMAN call: the loser's
317
+ // bytes stay, and the run says so instead of silently demoting knowledge.
318
+ refused.push(`unregistered-file ${relPath}: number ${Number(num)} is already carried by another record — a lost-update twin. Re-registering it would need a new number, which means renumbering a chapter; forbidden. A human decides which of the two survives.`);
319
+ continue;
320
+ }
321
+ const tokensField = typeof fm.tokens === 'string' ? Number(fm.tokens.split('#')[0]?.trim() ?? NaN) : NaN;
322
+ const record = {
323
+ number: Number(num),
324
+ path: relPath,
325
+ title: typeof fm.title === 'string' ? fm.title : relPath,
326
+ summary: typeof fm.summary === 'string' ? fm.summary : '',
327
+ startSeq: range[0], endSeq: range[1],
328
+ topics: Array.isArray(fm.topics) ? fm.topics : [],
329
+ // `messages` is NOT in chapter frontmatter. An absent field means "unknown"; writing 0 would
330
+ // claim a husk (render.ts: "absent for records written before counts existed — never a lying
331
+ // zero"), so it stays absent and the audit reads it as unknown, not as damage.
332
+ // The registry's anchor is the hash of the WHOLE file (archive.ts: "Hash the whole file, so
333
+ // verifyChapter() can re-check it with no knowledge of frontmatter layout"). The `sha256:`
334
+ // field INSIDE the frontmatter is a different thing — the body-hash that anchors enrichment —
335
+ // and copying it into the record made 162 honest re-registrations look tampered.
336
+ sha256: sha256(fs.readFileSync(absFile)),
337
+ estimatedTokens: Number.isFinite(tokensField) ? tokensField : 0,
338
+ artifacts: [],
339
+ repairs: [{ class: 'unregistered-file', over: 0, at: Date.now() }],
340
+ };
341
+ // append + counter-raise in ONE section: a re-registered number must never sit at or above
342
+ // `nextChapterNumber`, or the next door collides with it (#59's twin).
343
+ await store.mutate(opts.sessionId, (fresh) => raiseCounters(appendChapters(fresh, [record])));
344
+ journal.entries.push({ kind: 'registry', path: relPath, beforeSha: null, afterSha: record.sha256 });
345
+ flush();
346
+ ports.log(`re-registered ${relPath} (seqs ${record.startSeq}-${record.endSeq}, ${record.estimatedTokens} tokens) — file untouched, row restored`);
347
+ }
348
+ else if (f.class === 'unreleased-reservation') {
349
+ const key = /reservation (\S+) holds/.exec(f.detail)?.[1];
350
+ if (key !== undefined) {
351
+ await store.mutate(opts.sessionId, (st) => releaseReservation(st, key));
352
+ journal.entries.push({ kind: 'registry', path: opts.sessionId, beforeSha: null, afterSha: null });
353
+ flush();
354
+ ports.log(`released reservation ${key}`);
355
+ }
356
+ }
357
+ else if (f.class === 'ghost-plan-manifest') {
358
+ const key = /manifest (\S+) promises/.exec(f.detail)?.[1];
359
+ if (key !== undefined) {
360
+ await store.mutate(opts.sessionId, (st) => expireBookkeeping(st, [key]));
361
+ flush();
362
+ ports.log(`expired the ghost finalize manifest ${key} (its numbers stay spent)`);
363
+ }
364
+ }
365
+ else if (f.class === 'countervalue-drift') {
366
+ await store.mutate(opts.sessionId, (st) => raiseCounters(st));
367
+ flush();
368
+ ports.log('counters raised to the first unspent number (upward only)');
369
+ }
370
+ }
371
+ catch (error) {
372
+ // One bad finding must not abort the run — #59's poison-pill lesson, applied to repair itself.
373
+ ports.warn(`repair of ${f.class} (${opts.sessionId}) failed: ${String(error.message).slice(0, 140)}`);
374
+ refused.push(`${f.class}: failed — ${String(error.message).slice(0, 100)}`);
375
+ }
376
+ }
377
+ // the same call, the same inputs — see `auditNow` above
378
+ const after = auditNow(await store.get(opts.sessionId));
379
+ journal.completedAt = Date.now();
380
+ journal.findingsAfter = after.findings.length;
381
+ flush();
382
+ return { journalId, findingsBefore: before.findings, findingsAfter: after.findings, blindSpots: before.blindSpots, applied: journal.entries, refused };
383
+ }
384
+ /** Undo a whole applied run, newest entry first. Derived inverses — the journal is not trusted to describe itself. */
385
+ export async function restoreRepair(ports, journalId, sessionId) {
386
+ const { store, cwd, config } = ports;
387
+ const state = await store.get(sessionId);
388
+ const file = path.join(cwd, config.artifactStoreRoot, state.rootSession, 'repairs', `${journalId}.json`);
389
+ if (!fs.existsSync(file))
390
+ return { undone: 0, problems: [`no journal ${journalId} under ${path.dirname(file)}`] };
391
+ const journal = JSON.parse(fs.readFileSync(file, 'utf8'));
392
+ const at = (p) => path.isAbsolute(p) ? p : path.join(cwd, p);
393
+ const problems = [];
394
+ let undone = 0;
395
+ for (const entry of [...journal.entries].reverse()) {
396
+ const inverse = journalEntryInverse(entry);
397
+ const target = at(entry.path);
398
+ const moved = entry.to !== undefined ? at(entry.to) : undefined;
399
+ try {
400
+ if (inverse.undo === 'remove' && fs.existsSync(target)) {
401
+ // undoing a repair is a MOVE too: the bytes a repair wrote go to quarantine, they are not deleted
402
+ fs.mkdirSync(path.dirname(moved ?? target), { recursive: true });
403
+ fs.copyFileSync(target, moved ?? path.join(cwd, config.artifactStoreRoot, state.rootSession, '.repair-quarantine', path.basename(target)));
404
+ fs.rmSync(target);
405
+ undone += 1;
406
+ }
407
+ else if (inverse.undo === 'restore-from-quarantine' && moved !== undefined && fs.existsSync(moved) && !fs.existsSync(target)) {
408
+ fs.copyFileSync(moved, target);
409
+ undone += 1;
410
+ }
411
+ else if (inverse.undo === 'restore-registry-rev') {
412
+ problems.push(`registry change ${entry.path} cannot be un-applied by file restore — the row is append-only; run audit again to see what remains`);
413
+ }
414
+ }
415
+ catch (error) {
416
+ problems.push(`restore of ${entry.path} failed: ${String(error.message).slice(0, 100)}`);
417
+ }
418
+ }
419
+ // The RECORDS a repair committed stay: a restored file set is re-audited, never hand-reverted.
420
+ await store.mutate(sessionId, (fresh) => fresh);
421
+ return { undone, problems };
422
+ }
423
+ //# sourceMappingURL=repair-run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repair-run.js","sourceRoot":"","sources":["../src/repair-run.ts"],"names":[],"mappings":"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"}