@fractalsynapse/dsh-chapters 0.0.0-stage → 0.2.20

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 (195) hide show
  1. package/LICENSE +14 -0
  2. package/README.md +76 -2
  3. package/cordis.patch.yml +363 -0
  4. package/docs/architecture.md +692 -0
  5. package/docs/autorun-guide.md +248 -0
  6. package/docs/backlog.md +2022 -0
  7. package/docs/contract.md +938 -0
  8. package/docs/development.md +990 -0
  9. package/docs/host-compaction-seam.md +225 -0
  10. package/docs/host-protected-head-ask.md +80 -0
  11. package/docs/knowledge-repo.md +1332 -0
  12. package/docs/plans-carriage.md +571 -0
  13. package/docs/project-state.md +642 -0
  14. package/docs/provider.md +98 -0
  15. package/docs/superpowers/plans/2026-10-17-chapters-save.md +198 -0
  16. package/docs/superpowers/plans/2026-11-02-chapter-removal.md +151 -0
  17. package/docs/superpowers/specs/2026-11-02-chapter-removal-design.md +115 -0
  18. package/docs/verify.md +561 -0
  19. package/lib/archive.d.ts +161 -0
  20. package/lib/archive.js +229 -0
  21. package/lib/archive.js.map +1 -0
  22. package/lib/arrival.d.ts +23 -0
  23. package/lib/arrival.js +125 -0
  24. package/lib/arrival.js.map +1 -0
  25. package/lib/artifact-query.d.ts +62 -0
  26. package/lib/artifact-query.js +187 -0
  27. package/lib/artifact-query.js.map +1 -0
  28. package/lib/attach.d.ts +46 -0
  29. package/lib/attach.js +120 -0
  30. package/lib/attach.js.map +1 -0
  31. package/lib/auto-save.d.ts +145 -0
  32. package/lib/auto-save.js +334 -0
  33. package/lib/auto-save.js.map +1 -0
  34. package/lib/aux-message.d.ts +17 -0
  35. package/lib/aux-message.js +20 -0
  36. package/lib/aux-message.js.map +1 -0
  37. package/lib/client.js +1419 -0
  38. package/lib/client.js.map +1 -0
  39. package/lib/codegraph.d.ts +76 -0
  40. package/lib/codegraph.js +190 -0
  41. package/lib/codegraph.js.map +1 -0
  42. package/lib/commands.d.ts +52 -0
  43. package/lib/commands.js +946 -0
  44. package/lib/commands.js.map +1 -0
  45. package/lib/compose.d.ts +30 -0
  46. package/lib/compose.js +185 -0
  47. package/lib/compose.js.map +1 -0
  48. package/lib/continue-core.d.ts +245 -0
  49. package/lib/continue-core.js +405 -0
  50. package/lib/continue-core.js.map +1 -0
  51. package/lib/diag.d.ts +55 -0
  52. package/lib/diag.js +186 -0
  53. package/lib/diag.js.map +1 -0
  54. package/lib/engine-core.d.ts +301 -0
  55. package/lib/engine-core.js +531 -0
  56. package/lib/engine-core.js.map +1 -0
  57. package/lib/engine-note.d.ts +35 -0
  58. package/lib/engine-note.js +32 -0
  59. package/lib/engine-note.js.map +1 -0
  60. package/lib/engine.d.ts +329 -0
  61. package/lib/engine.js +1179 -0
  62. package/lib/engine.js.map +1 -0
  63. package/lib/enrich-queue.d.ts +66 -0
  64. package/lib/enrich-queue.js +126 -0
  65. package/lib/enrich-queue.js.map +1 -0
  66. package/lib/enrich-store.d.ts +31 -0
  67. package/lib/enrich-store.js +103 -0
  68. package/lib/enrich-store.js.map +1 -0
  69. package/lib/enrich-wire.d.ts +163 -0
  70. package/lib/enrich-wire.js +353 -0
  71. package/lib/enrich-wire.js.map +1 -0
  72. package/lib/enrich.d.ts +102 -0
  73. package/lib/enrich.js +267 -0
  74. package/lib/enrich.js.map +1 -0
  75. package/lib/gitops.d.ts +107 -0
  76. package/lib/gitops.js +539 -0
  77. package/lib/gitops.js.map +1 -0
  78. package/lib/index.d.ts +241 -0
  79. package/lib/index.js +1162 -0
  80. package/lib/index.js.map +1 -0
  81. package/lib/indexing.d.ts +98 -0
  82. package/lib/indexing.js +223 -0
  83. package/lib/indexing.js.map +1 -0
  84. package/lib/injections.d.ts +90 -0
  85. package/lib/injections.js +165 -0
  86. package/lib/injections.js.map +1 -0
  87. package/lib/last-resort.d.ts +24 -0
  88. package/lib/last-resort.js +27 -0
  89. package/lib/last-resort.js.map +1 -0
  90. package/lib/log-shape.d.ts +38 -0
  91. package/lib/log-shape.js +93 -0
  92. package/lib/log-shape.js.map +1 -0
  93. package/lib/models-command.d.ts +74 -0
  94. package/lib/models-command.js +100 -0
  95. package/lib/models-command.js.map +1 -0
  96. package/lib/notice.d.ts +74 -0
  97. package/lib/notice.js +92 -0
  98. package/lib/notice.js.map +1 -0
  99. package/lib/plans.d.ts +154 -0
  100. package/lib/plans.js +315 -0
  101. package/lib/plans.js.map +1 -0
  102. package/lib/preset.d.ts +186 -0
  103. package/lib/preset.js +212 -0
  104. package/lib/preset.js.map +1 -0
  105. package/lib/prompt-keys.d.ts +7 -0
  106. package/lib/prompt-keys.js +8 -0
  107. package/lib/prompt-keys.js.map +1 -0
  108. package/lib/prompt-loop.d.ts +73 -0
  109. package/lib/prompt-loop.js +147 -0
  110. package/lib/prompt-loop.js.map +1 -0
  111. package/lib/prompt-push.d.ts +47 -0
  112. package/lib/prompt-push.js +115 -0
  113. package/lib/prompt-push.js.map +1 -0
  114. package/lib/prompt-runner.d.ts +48 -0
  115. package/lib/prompt-runner.js +90 -0
  116. package/lib/prompt-runner.js.map +1 -0
  117. package/lib/prompt-state.d.ts +142 -0
  118. package/lib/prompt-state.js +101 -0
  119. package/lib/prompt-state.js.map +1 -0
  120. package/lib/prompt.d.ts +270 -0
  121. package/lib/prompt.js +408 -0
  122. package/lib/prompt.js.map +1 -0
  123. package/lib/provider.d.ts +44 -0
  124. package/lib/provider.js +66 -0
  125. package/lib/provider.js.map +1 -0
  126. package/lib/redact.d.ts +24 -0
  127. package/lib/redact.js +85 -0
  128. package/lib/redact.js.map +1 -0
  129. package/lib/registry.d.ts +187 -0
  130. package/lib/registry.js +235 -0
  131. package/lib/registry.js.map +1 -0
  132. package/lib/removal.d.ts +159 -0
  133. package/lib/removal.js +556 -0
  134. package/lib/removal.js.map +1 -0
  135. package/lib/render.d.ts +97 -0
  136. package/lib/render.js +530 -0
  137. package/lib/render.js.map +1 -0
  138. package/lib/repair-run.d.ts +76 -0
  139. package/lib/repair-run.js +506 -0
  140. package/lib/repair-run.js.map +1 -0
  141. package/lib/repair.d.ts +208 -0
  142. package/lib/repair.js +357 -0
  143. package/lib/repair.js.map +1 -0
  144. package/lib/repo.d.ts +78 -0
  145. package/lib/repo.js +184 -0
  146. package/lib/repo.js.map +1 -0
  147. package/lib/rules-commands.d.ts +46 -0
  148. package/lib/rules-commands.js +379 -0
  149. package/lib/rules-commands.js.map +1 -0
  150. package/lib/rules.d.ts +267 -0
  151. package/lib/rules.js +478 -0
  152. package/lib/rules.js.map +1 -0
  153. package/lib/save-core.d.ts +72 -0
  154. package/lib/save-core.js +220 -0
  155. package/lib/save-core.js.map +1 -0
  156. package/lib/search.d.ts +112 -0
  157. package/lib/search.js +282 -0
  158. package/lib/search.js.map +1 -0
  159. package/lib/session-rules.d.ts +222 -0
  160. package/lib/session-rules.js +454 -0
  161. package/lib/session-rules.js.map +1 -0
  162. package/lib/signature.d.ts +45 -0
  163. package/lib/signature.js +199 -0
  164. package/lib/signature.js.map +1 -0
  165. package/lib/store.d.ts +156 -0
  166. package/lib/store.js +368 -0
  167. package/lib/store.js.map +1 -0
  168. package/lib/sync.d.ts +220 -0
  169. package/lib/sync.js +810 -0
  170. package/lib/sync.js.map +1 -0
  171. package/lib/tools.d.ts +113 -0
  172. package/lib/tools.js +1090 -0
  173. package/lib/tools.js.map +1 -0
  174. package/lib/treedx/client.d.ts +57 -0
  175. package/lib/treedx/client.js +82 -0
  176. package/lib/treedx/client.js.map +1 -0
  177. package/lib/treedx/provider.d.ts +39 -0
  178. package/lib/treedx/provider.js +479 -0
  179. package/lib/treedx/provider.js.map +1 -0
  180. package/lib/treedx/state.d.ts +27 -0
  181. package/lib/treedx/state.js +65 -0
  182. package/lib/treedx/state.js.map +1 -0
  183. package/lib/types.d.ts +210 -0
  184. package/lib/types.js +31 -0
  185. package/lib/types.js.map +1 -0
  186. package/lib/version.d.ts +9 -0
  187. package/lib/version.js +10 -0
  188. package/lib/version.js.map +1 -0
  189. package/lib/vocabulary.d.ts +41 -0
  190. package/lib/vocabulary.js +118 -0
  191. package/lib/vocabulary.js.map +1 -0
  192. package/lib/warnings.d.ts +10 -0
  193. package/lib/warnings.js +18 -0
  194. package/lib/warnings.js.map +1 -0
  195. package/package.json +151 -4
package/lib/removal.js ADDED
@@ -0,0 +1,556 @@
1
+ /**
2
+ * Chapter removal (#255) — the operator door that deletes BAD knowledge for real.
3
+ *
4
+ * The field case: a prompt meant for another project typed into a project session; its chapters
5
+ * contaminate every derived surface downstream. Repair (#60) supersedes damage and keeps bytes;
6
+ * removal deletes them. The maintainer's rule: *bad bytes leave the memory; the log is what lets
7
+ * you admit you were wrong.*
8
+ *
9
+ * What this module guarantees, each pinned by tests/unit/removal.test.ts:
10
+ * - **journal before deletion.** A journal that cannot be written stops the run before the first
11
+ * unlink — the #60 write-ahead discipline, same shape, different word.
12
+ * - **the stub holds the watermark.** The registry record survives with `status: 'removed'`
13
+ * keeping number/span/path/sha256/artifacts: the watermark is `max(endSeq)` over ALL records, and
14
+ * an erased record would let an auto-archive moment re-capture the poisoned span (#59 poison).
15
+ * - **orphan math protects shared blobs.** Artifacts are content-addressed and deduplicated across
16
+ * the subtree; a blob dies only when no ACTIVE, non-target record anywhere in the project names it.
17
+ * - **one path dialect.** Comparisons go through `sameStoredPath`, never `===` (#69).
18
+ * - **detected is delivered (#61).** Dangling citations are reported to the operator AND appended
19
+ * to `<store-root>/removals/missing-access.log`, never returned into a void.
20
+ *
21
+ * Restore is re-derivation from the durable log (Task 7, same file) — never resurrection of bytes.
22
+ */
23
+ import fs from 'node:fs';
24
+ import path from 'node:path';
25
+ import { resolveStoredPath, sameStoredPath } from "./archive.js";
26
+ import { ancestorPath, buildIndex, isActiveChapter, isRemovedChapter } from "./registry.js";
27
+ // One dialect, one direction: the removal imports the store→pool mapping from sync (it never
28
+ // re-implements it — a second mapping is a second truth), and sync never imports removal.
29
+ import { planStoreToRepo } from "./sync.js";
30
+ // ------------------------------------------------------------------ resolve
31
+ const nearCandidates = (raw, rows, cwd) => {
32
+ const base = (raw.split('/').pop() ?? raw).toLowerCase();
33
+ const out = [];
34
+ for (const [sessionId, state] of rows) {
35
+ for (const c of state.chapters) {
36
+ if (!isActiveChapter(c))
37
+ continue;
38
+ const name = c.path.split('/').pop() ?? '';
39
+ if (name.toLowerCase().includes(base) || base.includes(name.toLowerCase().replace('.md', ''))) {
40
+ out.push(`${sessionId}:${c.number} → ${c.path}`);
41
+ }
42
+ if (out.length >= 5)
43
+ break;
44
+ }
45
+ }
46
+ return out.length === 0 ? 'no near candidates either' : `near candidates: ${out.join(', ')}`;
47
+ };
48
+ /**
49
+ * Resolve one operator-supplied id to exactly one ACTIVE chapter record. Accepted dialects:
50
+ * registry path (the `list`/journal output), pool path from a search hit
51
+ * (`chapters/<key>/<session>/<file>.md` — matched by its `<session>/<file>` tail),
52
+ * `<sessionId>:<number>`, and a bare TOC display ordinal (needs the caller's session, because the
53
+ * ordinal is a position in the caller's ancestor-path flat index, not a registry number).
54
+ * Zero matches, several matches, or a tombstone each refuse with specifics — removal is destructive
55
+ * and never guesses.
56
+ */
57
+ export function resolveRemovalId(raw, rows, cwd, callerSessionId) {
58
+ const norm = raw.trim();
59
+ if (norm === '')
60
+ return { refusal: 'empty id' };
61
+ const ordinal = /^\d+$/.test(norm);
62
+ if (ordinal && callerSessionId === undefined) {
63
+ return { refusal: `bare ordinal "${norm}" needs a session context (it is a position in a TOC, not a registry number) — use <sessionId>:<number> or a path from /chapters-remove list` };
64
+ }
65
+ const getter = (id) => rows.find(([k]) => k === id)?.[1];
66
+ let ordinalHit = null;
67
+ if (ordinal && callerSessionId !== undefined) {
68
+ const entries = buildIndex(ancestorPath(getter, callerSessionId), (id) => getter(id) ?? undefined, () => 'ok');
69
+ const n = Number(norm);
70
+ const e = entries[n - 1];
71
+ if (e !== undefined)
72
+ ordinalHit = { sessionId: e.authorSession, number: e.number };
73
+ }
74
+ const [head, tail] = [norm.slice(0, Math.max(norm.lastIndexOf(':'), 0)), norm.slice(norm.lastIndexOf(':') + 1)];
75
+ const colonHit = norm.includes(':') && /^\d+$/.test(tail) ? { sessionId: head, number: Number(tail) } : null;
76
+ const parts = norm.split('/');
77
+ const poolBase = parts[parts.length - 1];
78
+ const poolSession = parts.length >= 2 ? parts[parts.length - 2] : '';
79
+ const matches = [];
80
+ let tombstone = '';
81
+ for (const [sessionId, state] of rows) {
82
+ for (const c of state.chapters) {
83
+ const isMatch = ordinal
84
+ ? ordinalHit !== null && ordinalHit.sessionId === sessionId && ordinalHit.number === c.number
85
+ // the ordinal of a REMOVED chapter can exist on a stale page — name the tombstone honestly
86
+ || (ordinalHit === null && sessionId === callerSessionId && c.number === Number(norm))
87
+ : colonHit !== null
88
+ ? colonHit.sessionId === sessionId && colonHit.number === c.number
89
+ : sameStoredPath(norm, c.path, cwd)
90
+ || sameStoredPath(resolveStoredPath(cwd, norm), c.path, cwd)
91
+ || (poolSession !== '' && poolBase.endsWith('.md') && c.path.endsWith(`/${poolSession}/chapters/${poolBase}`))
92
+ // third dialect (#255): searchLocalStore answers paths relative to the STORE ROOT
93
+ // (`<session>/chapters/<file>`); any raw that is a boundary-suffix of a record path
94
+ // resolves — ambiguity across records still refuses.
95
+ || (norm.includes('/') && c.path.endsWith(`/${norm}`))
96
+ || (parts.length === 1 && (c.path.split('/').pop() ?? '') === poolBase);
97
+ if (!isMatch)
98
+ continue;
99
+ if (!isActiveChapter(c)) {
100
+ if (isRemovedChapter(c))
101
+ tombstone = `${sessionId}:${c.number} (${c.path})`;
102
+ continue;
103
+ }
104
+ matches.push({ sessionId, rootSession: state.rootSession, record: c });
105
+ }
106
+ }
107
+ if (matches.length === 1)
108
+ return { target: matches[0] };
109
+ if (matches.length > 1) {
110
+ return { refusal: `ambiguous "${norm}" — ${matches.length} active chapters match: ${matches.map((m) => `${m.sessionId}:${m.record.number} → ${m.record.path}`).join(', ')}; nothing was removed` };
111
+ }
112
+ if (tombstone !== '')
113
+ return { refusal: `${tombstone} — already removed (its bytes left the store; the stub is kept on purpose so the watermark cannot rewind)` };
114
+ return { refusal: `no active chapter matches "${norm}" — ${nearCandidates(norm, rows, cwd)}` };
115
+ }
116
+ // ------------------------------------------------------------------ plan
117
+ const fileEntry = (stored, cwd, missing) => {
118
+ const abs = resolveStoredPath(cwd, stored);
119
+ try {
120
+ return { abs, stored, bytes: fs.statSync(abs).size };
121
+ }
122
+ catch {
123
+ missing.push(stored);
124
+ return null;
125
+ }
126
+ };
127
+ /**
128
+ * The exact deletion set + the dangling report, from registry rows and the filesystem — written
129
+ * for the dry-run and consumed unchanged by apply. Reads only; deletes nothing.
130
+ */
131
+ export function planRemoval(opts) {
132
+ const { targets, rows, cwd } = opts;
133
+ const targetKeys = new Set(targets.map((t) => `${t.sessionId}#${t.record.number}`));
134
+ // Active refs from NON-target records — the orphan test's other side. Removed/superseded stubs do
135
+ // NOT hold blobs open: their references are exactly what the operator judged bad.
136
+ const activeRefs = [];
137
+ const survivingChapters = [];
138
+ for (const [sessionId, state] of rows) {
139
+ for (const c of state.chapters) {
140
+ if (!isActiveChapter(c) || targetKeys.has(`${sessionId}#${c.number}`))
141
+ continue;
142
+ survivingChapters.push({ path: c.path });
143
+ // A survivor's OWN file is a live reference too: a record may name another chapter's path as
144
+ // an artifact (measured by the path-collision test — the orphan math must not schedule the
145
+ // neighbor's bytes for deletion).
146
+ activeRefs.push(c.path);
147
+ for (const a of c.artifacts)
148
+ activeRefs.push(a.path);
149
+ for (const p of c.plans ?? [])
150
+ activeRefs.push(p.artifactPath);
151
+ for (const d of c.planDocs ?? [])
152
+ activeRefs.push(d.path);
153
+ }
154
+ }
155
+ const missing = [];
156
+ const chapterFiles = [];
157
+ const blobFiles = [];
158
+ const seen = new Set();
159
+ for (const t of targets) {
160
+ const f = fileEntry(t.record.path, cwd, missing);
161
+ if (f !== null && !seen.has(f.abs)) {
162
+ seen.add(f.abs);
163
+ chapterFiles.push(f);
164
+ }
165
+ const candidates = [
166
+ ...t.record.artifacts.map((a) => a.path),
167
+ ...(t.record.plans ?? []).map((p) => p.artifactPath),
168
+ ...(t.record.planDocs ?? []).map((d) => d.path),
169
+ ];
170
+ for (const p of [...new Set(candidates)]) {
171
+ if (sameStoredPath(p, t.record.path, cwd))
172
+ continue;
173
+ if (activeRefs.some((r) => sameStoredPath(r, p, cwd)))
174
+ continue;
175
+ const bf = fileEntry(p, cwd, missing);
176
+ if (bf !== null && !seen.has(bf.abs)) {
177
+ seen.add(bf.abs);
178
+ blobFiles.push(bf);
179
+ }
180
+ }
181
+ }
182
+ const dangling = scanDangling(rows, targets, cwd, targetKeys);
183
+ return { targets: [...targets], chapterFiles, blobFiles, dangling, missing };
184
+ }
185
+ /**
186
+ * Every SURVIVING chapter body that still names a removed chapter — by any dialect: the stored path,
187
+ * the filename, or the absolute path a TOC copy would carry. This is the operator's "should the
188
+ * referrer stay?" list, and the seed for missing-access.log.
189
+ */
190
+ export function scanDangling(rows, targets, cwd, targetKeys) {
191
+ const keys = targetKeys ?? new Set(targets.map((t) => `${t.sessionId}#${t.record.number}`));
192
+ const needles = [];
193
+ for (const t of targets) {
194
+ const name = t.record.path.split('/').pop() ?? t.record.path;
195
+ for (const n of new Set([t.record.path, name, resolveStoredPath(cwd, t.record.path)])) {
196
+ needles.push({ needle: n, target: t.record.path });
197
+ }
198
+ }
199
+ const out = [];
200
+ const done = new Set();
201
+ for (const [sessionId, state] of rows) {
202
+ for (const c of state.chapters) {
203
+ if (!isActiveChapter(c) || keys.has(`${sessionId}#${c.number}`))
204
+ continue;
205
+ let text;
206
+ try {
207
+ text = fs.readFileSync(resolveStoredPath(cwd, c.path), 'utf8');
208
+ }
209
+ catch {
210
+ continue;
211
+ }
212
+ for (const { needle, target } of needles) {
213
+ if (needle === c.path || !text.includes(needle))
214
+ continue;
215
+ const id = `${c.path}|${target}`;
216
+ if (done.has(id))
217
+ continue;
218
+ done.add(id);
219
+ out.push({ referrer: c.path, needle: target, how: 'cited-in-body' });
220
+ }
221
+ }
222
+ }
223
+ return out;
224
+ }
225
+ // ------------------------------------------------------------------ apply
226
+ const journalDirOf = (storeDir, rootSession) => path.join(storeDir, rootSession, 'removals');
227
+ const writeJournal = (dir, j) => {
228
+ fs.mkdirSync(dir, { recursive: true });
229
+ const file = path.join(dir, `${j.journalId}.json`);
230
+ fs.writeFileSync(file, `${JSON.stringify(j, null, 2)}\n`);
231
+ return file;
232
+ };
233
+ /**
234
+ * Execute a plan. Safety order, pinned by tests: journal (status 'planned') BEFORE the first unlink;
235
+ * unlinks; stub the record through `store.mutate` (never a snapshot put, #59) ONLY for targets whose
236
+ * chapter file is gone; append the dangling report to the missing-access log; rewrite the journal as
237
+ * applied (or partial, naming every problem). Idempotence: a second apply finds the records already
238
+ * tombstoned by the caller's resolve step — resolve refuses tombstones, so there is nothing to redo.
239
+ */
240
+ export async function applyRemoval(ports, plan) {
241
+ const { store, cwd, rows, now } = ports;
242
+ const at = now();
243
+ const journalId = at.replace(/[:.]/g, '-');
244
+ const problems = [];
245
+ const byRoot = new Map();
246
+ for (const t of plan.targets) {
247
+ const list = byRoot.get(t.rootSession) ?? [];
248
+ list.push(t);
249
+ byRoot.set(t.rootSession, list);
250
+ }
251
+ // 1. journal-before-unlink — per affected tree, so restoreRepair-style lookup by (tree, id) works.
252
+ const journals = [];
253
+ try {
254
+ for (const [root, list] of byRoot) {
255
+ const dir = journalDirOf(pathStoreDir(ports), root);
256
+ const j = {
257
+ journalId, at, cwd, status: 'planned',
258
+ entries: list.map((t) => ({
259
+ sessionId: t.sessionId, number: t.record.number, title: t.record.title,
260
+ startSeq: t.record.startSeq, endSeq: t.record.endSeq, path: t.record.path,
261
+ sha256: t.record.sha256, removedFiles: [],
262
+ })),
263
+ };
264
+ journals.push({ dir, file: writeJournal(dir, j), j });
265
+ }
266
+ }
267
+ catch (error) {
268
+ return {
269
+ journalId: '', removed: [], stubbed: [],
270
+ problems: [`journal could not be written (${String(error?.message ?? error)}) — refusing to apply anything`],
271
+ dangling: plan.dangling, bytes: 0,
272
+ };
273
+ }
274
+ // 2. unlinks — chapter files first, then orphan blobs; ENOENT counts as done (the tree may already
275
+ // be half-lost, and a "missing" note in the plan said so).
276
+ const removed = [];
277
+ const goneAbs = new Set();
278
+ // Mirror rels are listed from the CURRENT store state (planStoreToRepo) BEFORE any unlink —
279
+ // one mapping, the sync module's own (#255: publishIntoClone only copies; the removal must
280
+ // unlink the clone paths itself so stageAllAndCommit sees a deletion).
281
+ const cloneRels = new Map();
282
+ if (ports.cloneDir !== undefined && ports.projectKey !== undefined) {
283
+ try {
284
+ for (const { abs, rel } of planStoreToRepo(pathStoreDir(ports), ports.projectKey))
285
+ cloneRels.set(abs, rel);
286
+ }
287
+ catch (error) {
288
+ problems.push(`mirror listing failed (${String(error?.message ?? error)}): clone copies stay this run — the guard still keeps them out of the store`);
289
+ }
290
+ }
291
+ for (const f of [...plan.chapterFiles, ...plan.blobFiles]) {
292
+ try {
293
+ if (fs.existsSync(f.abs))
294
+ fs.unlinkSync(f.abs);
295
+ goneAbs.add(f.abs);
296
+ removed.push(f.stored);
297
+ }
298
+ catch (error) {
299
+ problems.push(`unlink ${f.stored} failed: ${String(error?.message ?? error)}`);
300
+ }
301
+ }
302
+ // 2b. mirror copies — only for files whose store side is actually gone (a failed store unlink means
303
+ // the chapter is still knowledge on disk; deleting its mirror copy alone would strand the truth).
304
+ if (ports.cloneDir !== undefined && ports.projectKey !== undefined) {
305
+ for (const f of [...plan.chapterFiles, ...plan.blobFiles]) {
306
+ if (!goneAbs.has(f.abs))
307
+ continue;
308
+ const rel = cloneRels.get(f.abs) ?? cloneRelOf(f.stored, ports.projectKey);
309
+ if (rel === null) {
310
+ problems.push(`no mirror path derivable for ${f.stored} — the pool copy (if any) was NOT unlinked`);
311
+ continue;
312
+ }
313
+ const abs = path.join(ports.cloneDir, rel);
314
+ try {
315
+ if (fs.existsSync(abs))
316
+ fs.unlinkSync(abs);
317
+ removed.push(`mirror:${rel}`);
318
+ }
319
+ catch (error) {
320
+ problems.push(`mirror unlink ${rel} failed: ${String(error?.message ?? error)}`);
321
+ }
322
+ }
323
+ }
324
+ // 3. stub records — ONLY for targets whose chapter file is gone: an active record whose bytes are
325
+ // still on disk and uncited-by-nothing is repair's problem, not removal's. The tombstone flips
326
+ // only when the deletion actually landed.
327
+ const stubbed = [];
328
+ for (const t of plan.targets) {
329
+ if (!goneAbs.has(resolveStoredPath(cwd, t.record.path)))
330
+ continue;
331
+ try {
332
+ await store.mutate(t.sessionId, (st) => ({
333
+ ...st,
334
+ chapters: st.chapters.map((c) => (c.number === t.record.number && isActiveChapter(c)
335
+ ? { ...c, status: 'removed', removedAt: at }
336
+ : c)),
337
+ }));
338
+ stubbed.push(`${t.sessionId}:${t.record.number}`);
339
+ for (const jj of journals) {
340
+ const e = jj.j.entries.find((x) => x.sessionId === t.sessionId && x.number === t.record.number);
341
+ if (e !== undefined)
342
+ e.removedFiles = [...plan.chapterFiles, ...plan.blobFiles]
343
+ .filter((f) => f.stored === t.record.path || t.record.artifacts.some((a) => sameStoredPath(a.path, f.stored, cwd))
344
+ || (t.record.planDocs ?? []).some((d) => sameStoredPath(d.path, f.stored, cwd))
345
+ || (t.record.plans ?? []).some((p) => sameStoredPath(p.artifactPath, f.stored, cwd)))
346
+ .map((f) => f.stored);
347
+ }
348
+ }
349
+ catch (error) {
350
+ problems.push(`registry stub for ${t.sessionId}:${t.record.number} failed: ${String(error?.message ?? error)}`);
351
+ }
352
+ }
353
+ // 4. missing-access log — dangling refs are the operator's referrer-deciding material (#61).
354
+ const logLines = [
355
+ ...plan.dangling.map((d) => `${at} | removed=${d.needle} | referrer=${d.referrer} | how=${d.how}`),
356
+ ...plan.targets.map((t) => `${at} | removed=${t.record.path} | session=${t.sessionId} | span=${t.record.startSeq}-${t.record.endSeq} | stub-holds-watermark`),
357
+ ];
358
+ if (logLines.length > 0)
359
+ appendMissingAccess(pathStoreDir(ports), logLines, problems);
360
+ // 5. finalize journals.
361
+ for (const jj of journals) {
362
+ jj.j.status = problems.length === 0 ? 'applied' : 'partial';
363
+ jj.j.problems = problems;
364
+ for (const e of jj.j.entries)
365
+ e.appliedAt = at;
366
+ try {
367
+ writeJournal(jj.dir, jj.j);
368
+ }
369
+ catch (error) {
370
+ problems.push(`journal ${journalId} could not be updated: ${String(error?.message ?? error)}`);
371
+ }
372
+ }
373
+ const bytes = plan.chapterFiles.reduce((s, f) => s + f.bytes, 0) + plan.blobFiles.reduce((s, f) => s + f.bytes, 0);
374
+ return { journalId, removed, stubbed, problems, dangling: plan.dangling, bytes };
375
+ }
376
+ /** The store ROOT (the directory holding session trees): the configured one, else the default name. */
377
+ function pathStoreDir(ports) {
378
+ return ports.storeDir ?? path.join(ports.cwd, '.dsh-chapters');
379
+ }
380
+ // ------------------------------------------------------------------ missing-access log
381
+ export const MISSING_ACCESS_FILE = path.join('removals', 'missing-access.log');
382
+ export function appendMissingAccess(storeDir, lines, problems) {
383
+ const file = path.join(storeDir, MISSING_ACCESS_FILE);
384
+ try {
385
+ fs.mkdirSync(path.dirname(file), { recursive: true });
386
+ fs.appendFileSync(file, `${lines.join('\n')}\n`);
387
+ }
388
+ catch (error) {
389
+ const msg = `missing-access log append failed: ${String(error?.message ?? error)}`;
390
+ if (problems !== undefined)
391
+ problems.push(msg);
392
+ // never throw into the operator's turn: the dangling report already printed; the line is gone,
393
+ // the fact is said.
394
+ }
395
+ }
396
+ export function readMissingAccess(storeDir, maxLines) {
397
+ const file = path.join(storeDir, MISSING_ACCESS_FILE);
398
+ let all = [];
399
+ try {
400
+ all = fs.readFileSync(file, 'utf8').split('\n').filter((l) => l.trim() !== '');
401
+ }
402
+ catch { /* no log yet is an EMPTY state, stated — not an error */ }
403
+ const tail = all.slice(Math.max(0, all.length - maxLines));
404
+ return { lines: tail, total: all.length, withheld: Math.max(0, all.length - tail.length), file };
405
+ }
406
+ // ------------------------------------------------------------------ removed guard
407
+ /**
408
+ * The rehydrate guard (#255): every name a `removed` stub owns, in the mirror walk's identity
409
+ * (`<sessionDir>#<file>` for chapters and plan documents; blob basename for content-addressed
410
+ * artifacts). Rehydration that skips these cannot resurrect a decision; the count lands in the
411
+ * sync steps. Keys are session-id-scoped and content-addressed-scoped, so they cannot collide
412
+ * across projects on one machine.
413
+ */
414
+ export function removedGuard(rows) {
415
+ const chapterKeys = new Set();
416
+ const blobKeys = new Set();
417
+ const keyFor = (stored) => {
418
+ const segs = stored.split('/').filter((s) => s !== '');
419
+ const ci = segs.lastIndexOf('chapters');
420
+ if (ci >= 1 && ci < segs.length - 1)
421
+ chapterKeys.add(`${segs[ci - 1]}#${segs[ci + 1]}`);
422
+ else
423
+ blobKeys.add(segs[segs.length - 1]);
424
+ };
425
+ for (const [, state] of rows) {
426
+ for (const c of state.chapters ?? []) {
427
+ if (!isRemovedChapter(c))
428
+ continue;
429
+ keyFor(c.path);
430
+ for (const d of c.planDocs ?? [])
431
+ keyFor(d.path);
432
+ for (const a of c.artifacts ?? [])
433
+ blobKeys.add(a.path.split('/').pop() ?? '');
434
+ }
435
+ }
436
+ return { chapterKeys, blobKeys };
437
+ }
438
+ /** Deterministic fallback mapping for a stored path when the pre-unlink listing lacks the entry. */
439
+ function cloneRelOf(stored, projectKey) {
440
+ const segs = stored.split('/').filter((s) => s !== '');
441
+ const ci = segs.lastIndexOf('chapters');
442
+ if (ci >= 1 && ci < segs.length - 1)
443
+ return path.join('chapters', projectKey, segs[ci - 1], segs[ci + 1]);
444
+ const ai = segs.indexOf('artifacts');
445
+ if (ai >= 0 && ai < segs.length - 1)
446
+ return path.join('artifacts', projectKey, ...segs.slice(ai + 1));
447
+ return null;
448
+ }
449
+ // ------------------------------------------------------------------ restore (re-derivation)
450
+ import { saveSession } from "./save-core.js";
451
+ import { coveringChapter, markSupersededBy } from "./repair.js";
452
+ /**
453
+ * Reversal is RE-DERIVATION (#255): the journaled span is re-rendered from the session's durable
454
+ * log through the SAME save core every door calls — a repaired chapter is byte-for-byte a normal
455
+ * chapter, and so is a restored one. The number is NEW (a spent number stays spent; identity is
456
+ * `(number, sha256)`); the removed stub flips to `superseded` with `repairs[].class =
457
+ * 'operator-restore'`, which is how an audit tells a restore from a repair. The log is never
458
+ * touched. A span that renders nothing REFUSES (never commit an empty archive); an unreadable log
459
+ * is UNRECOVERABLE and said so. One journal id can span trees: apply wrote one per affected tree,
460
+ * so restore collects entries from every `<tree>/removals/<id>.json`.
461
+ */
462
+ export async function restoreRemoval(ports, journalId) {
463
+ const restored = [];
464
+ const skipped = [];
465
+ const problems = [];
466
+ const entries = [];
467
+ let trees = [];
468
+ try {
469
+ trees = fs.readdirSync(ports.storeDir, { withFileTypes: true }).filter((d) => d.isDirectory()).map((d) => d.name);
470
+ }
471
+ catch (error) {
472
+ return { journalId, restored, skipped, problems: [`store root unreadable (${String(error?.message ?? error)}) — no journal can be read`] };
473
+ }
474
+ let found = 0;
475
+ for (const tree of trees) {
476
+ const file = path.join(ports.storeDir, tree, 'removals', `${journalId}.json`);
477
+ if (!fs.existsSync(file))
478
+ continue;
479
+ found += 1;
480
+ try {
481
+ const j = JSON.parse(fs.readFileSync(file, 'utf8'));
482
+ for (const e of j.entries ?? [])
483
+ entries.push({ sessionId: e.sessionId, e });
484
+ }
485
+ catch (error) {
486
+ problems.push(`journal ${journalId} in ${tree} is unreadable (${String(error?.message ?? error)}) — its entries were NOT restored`);
487
+ }
488
+ }
489
+ if (found === 0)
490
+ return { journalId, restored, skipped, problems: [`no journal ${journalId} under ${ports.storeDir}/*/removals/ — apply printed the id it wrote; nothing was restored`] };
491
+ for (const { sessionId, e } of entries) {
492
+ const st = await ports.store.get(sessionId);
493
+ const stub = st.chapters.find((c) => c.number === e.number);
494
+ if (stub === undefined) {
495
+ problems.push(`${sessionId}:${e.number}: the record vanished from the registry — nowhere to attach the re-derivation`);
496
+ continue;
497
+ }
498
+ if (isActiveChapter(stub)) {
499
+ skipped.push(`${sessionId}:${e.number}: still ACTIVE knowledge — removal never applied to it; refusing to restore over it`);
500
+ continue;
501
+ }
502
+ if (!isRemovedChapter(stub)) {
503
+ skipped.push(`${sessionId}:${e.number}: stub is already ${String(stub.status)} — a repair or an earlier restore spent this number (idempotent)`);
504
+ continue;
505
+ }
506
+ const events = await ports.readLog(sessionId);
507
+ if (events === null || events.length === 0) {
508
+ problems.push(`${sessionId}:${e.number}: UNRECOVERABLE — the durable log for this session cannot be read, so span ${e.startSeq}-${e.endSeq} cannot be re-derived; the stub stays`);
509
+ continue;
510
+ }
511
+ try {
512
+ const out = await saveSession({
513
+ events, sessionId, cwd: ports.cwd, store: ports.store, config: ports.config,
514
+ span: { fromSeq: e.startSeq, toSeq: e.endSeq },
515
+ supersede: { over: e.number, reason: 'operator-restore' },
516
+ attemptSalt: `restore:${journalId}:${sessionId}:${e.number}`,
517
+ });
518
+ if (out.records.length === 0) {
519
+ problems.push(`${sessionId}:${e.number}: the re-render produced nothing (${out.skipped ?? 'no records'}) — stub left in place; an empty archive is never committed`);
520
+ continue;
521
+ }
522
+ restored.push(`${sessionId}:${e.number} → ch.${out.records.map((r) => r.number).join(', ch.')}`);
523
+ }
524
+ catch (error) {
525
+ const msg = String(error?.message ?? error);
526
+ if (!/already archived|already in the archive/i.test(msg)) {
527
+ problems.push(`${sessionId}:${e.number}: restore failed: ${msg.slice(0, 160)}`);
528
+ continue;
529
+ }
530
+ // #60's lesson reborn: an earlier pass archived this span. Point the stub at what covers it
531
+ // rather than stranding it — nothing is rewritten, the covered fact is recorded.
532
+ const fresh = await ports.store.get(sessionId);
533
+ const cover = coveringChapter(fresh, e.startSeq, e.endSeq, e.number);
534
+ if (cover.length === 0) {
535
+ problems.push(`${sessionId}:${e.number}: the re-read said "already archived" but no active chapter covers ${e.startSeq}-${e.endSeq} — stub left in place`);
536
+ continue;
537
+ }
538
+ let markProblem;
539
+ await ports.store.mutate(sessionId, (s) => {
540
+ const m = markSupersededBy(s, e.number, cover[0].number, 'operator-restore');
541
+ markProblem = m.problem;
542
+ return m.state;
543
+ });
544
+ if (markProblem !== undefined) {
545
+ problems.push(`${sessionId}:${e.number}: ${markProblem}`);
546
+ continue;
547
+ }
548
+ skipped.push(`${sessionId}:${e.number}: span already covered by ch.${cover[0].number}; stub marked superseded, nothing was rewritten`);
549
+ }
550
+ }
551
+ if (restored.length > 0) {
552
+ appendMissingAccess(ports.storeDir, restored.map((r) => `${ports.now()} | restored | ${r} | journal=${journalId}`));
553
+ }
554
+ return { journalId, restored, skipped, problems };
555
+ }
556
+ //# sourceMappingURL=removal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removal.js","sourceRoot":"","sources":["../src/removal.ts"],"names":[],"mappings":"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"}