@isaacriehm/cairn-core 0.7.3 → 0.9.1

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 (229) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/attention/bulk-accept.d.ts +0 -2
  3. package/dist/attention/bulk-accept.js +0 -3
  4. package/dist/attention/bulk-accept.js.map +1 -1
  5. package/dist/attention/scoring.d.ts +1 -3
  6. package/dist/attention/scoring.js +1 -12
  7. package/dist/attention/scoring.js.map +1 -1
  8. package/dist/claude/cache.js +1 -0
  9. package/dist/claude/cache.js.map +1 -1
  10. package/dist/claude/runner.js +25 -1
  11. package/dist/claude/runner.js.map +1 -1
  12. package/dist/claude/types.d.ts +8 -0
  13. package/dist/doctor/index.js +57 -0
  14. package/dist/doctor/index.js.map +1 -1
  15. package/dist/gc/citation-integrity.js +3 -1
  16. package/dist/gc/citation-integrity.js.map +1 -1
  17. package/dist/gc/doc-claims.d.ts +31 -0
  18. package/dist/gc/doc-claims.js +213 -0
  19. package/dist/gc/doc-claims.js.map +1 -0
  20. package/dist/gc/doc-source-drift.d.ts +31 -0
  21. package/dist/gc/doc-source-drift.js +190 -0
  22. package/dist/gc/doc-source-drift.js.map +1 -0
  23. package/dist/gc/index.d.ts +4 -0
  24. package/dist/gc/index.js +2 -0
  25. package/dist/gc/index.js.map +1 -1
  26. package/dist/gc/sweep.js +18 -0
  27. package/dist/gc/sweep.js.map +1 -1
  28. package/dist/gc/types.d.ts +2 -2
  29. package/dist/hooks/runners/context-threshold.d.ts +63 -0
  30. package/dist/hooks/runners/context-threshold.js +179 -0
  31. package/dist/hooks/runners/context-threshold.js.map +1 -0
  32. package/dist/hooks/runners/gc-autotrigger.d.ts +49 -0
  33. package/dist/hooks/runners/gc-autotrigger.js +87 -0
  34. package/dist/hooks/runners/gc-autotrigger.js.map +1 -0
  35. package/dist/hooks/runners/index.d.ts +2 -0
  36. package/dist/hooks/runners/index.js +1 -0
  37. package/dist/hooks/runners/index.js.map +1 -1
  38. package/dist/hooks/runners/payload.d.ts +10 -0
  39. package/dist/hooks/runners/payload.js +13 -0
  40. package/dist/hooks/runners/payload.js.map +1 -1
  41. package/dist/hooks/runners/session-end.js +2 -4
  42. package/dist/hooks/runners/session-end.js.map +1 -1
  43. package/dist/hooks/runners/session-start.js +157 -9
  44. package/dist/hooks/runners/session-start.js.map +1 -1
  45. package/dist/hooks/runners/stop.js +119 -0
  46. package/dist/hooks/runners/stop.js.map +1 -1
  47. package/dist/init/brand-derive.js +6 -1
  48. package/dist/init/brand-derive.js.map +1 -1
  49. package/dist/init/brand-setup.d.ts +12 -1
  50. package/dist/init/brand-setup.js +36 -1
  51. package/dist/init/brand-setup.js.map +1 -1
  52. package/dist/init/curator/corpus.d.ts +92 -0
  53. package/dist/init/curator/corpus.js +171 -0
  54. package/dist/init/curator/corpus.js.map +1 -0
  55. package/dist/init/curator/emit.d.ts +42 -0
  56. package/dist/init/curator/emit.js +230 -0
  57. package/dist/init/curator/emit.js.map +1 -0
  58. package/dist/init/curator/index.d.ts +1 -0
  59. package/dist/init/curator/index.js +2 -0
  60. package/dist/init/curator/index.js.map +1 -0
  61. package/dist/init/curator/regex-prefilter.d.ts +54 -0
  62. package/dist/init/curator/regex-prefilter.js +185 -0
  63. package/dist/init/curator/regex-prefilter.js.map +1 -0
  64. package/dist/init/curator/validate.d.ts +46 -0
  65. package/dist/init/curator/validate.js +100 -0
  66. package/dist/init/curator/validate.js.map +1 -0
  67. package/dist/init/curator/walker.d.ts +36 -0
  68. package/dist/init/curator/walker.js +380 -0
  69. package/dist/init/curator/walker.js.map +1 -0
  70. package/dist/init/eta-calibration.d.ts +39 -0
  71. package/dist/init/eta-calibration.js +143 -0
  72. package/dist/init/eta-calibration.js.map +1 -0
  73. package/dist/init/index.d.ts +8 -3
  74. package/dist/init/index.js +4 -1
  75. package/dist/init/index.js.map +1 -1
  76. package/dist/init/ingest-docs.d.ts +6 -1
  77. package/dist/init/ingest-docs.js.map +1 -1
  78. package/dist/init/init.js +15 -26
  79. package/dist/init/init.js.map +1 -1
  80. package/dist/init/mapper-merge.d.ts +4 -6
  81. package/dist/init/mapper-merge.js +11 -34
  82. package/dist/init/mapper-merge.js.map +1 -1
  83. package/dist/init/mapper-parallel.d.ts +0 -1
  84. package/dist/init/mapper-parallel.js +20 -12
  85. package/dist/init/mapper-parallel.js.map +1 -1
  86. package/dist/init/mapper-prompts.d.ts +1 -4
  87. package/dist/init/mapper-prompts.js +2 -6
  88. package/dist/init/mapper-prompts.js.map +1 -1
  89. package/dist/init/mapper.d.ts +8 -7
  90. package/dist/init/mapper.js +23 -15
  91. package/dist/init/mapper.js.map +1 -1
  92. package/dist/init/overlay.js +0 -1
  93. package/dist/init/overlay.js.map +1 -1
  94. package/dist/init/phases/1-detect.d.ts +17 -4
  95. package/dist/init/phases/1-detect.js +48 -4
  96. package/dist/init/phases/1-detect.js.map +1 -1
  97. package/dist/init/phases/10-rules-merge.d.ts +7 -2
  98. package/dist/init/phases/10-rules-merge.js +17 -32
  99. package/dist/init/phases/10-rules-merge.js.map +1 -1
  100. package/dist/init/phases/11-baseline.js.map +1 -1
  101. package/dist/init/phases/12-strip.js +14 -1
  102. package/dist/init/phases/12-strip.js.map +1 -1
  103. package/dist/init/phases/13-multidev.d.ts +5 -1
  104. package/dist/init/phases/13-multidev.js +23 -2
  105. package/dist/init/phases/13-multidev.js.map +1 -1
  106. package/dist/init/phases/3-mapper.js.map +1 -1
  107. package/dist/init/phases/4-seed.js +2 -3
  108. package/dist/init/phases/4-seed.js.map +1 -1
  109. package/dist/init/phases/5-preflight.d.ts +42 -0
  110. package/dist/init/phases/5-preflight.js +244 -0
  111. package/dist/init/phases/5-preflight.js.map +1 -0
  112. package/dist/init/phases/6-brand.js +2 -4
  113. package/dist/init/phases/6-brand.js.map +1 -1
  114. package/dist/init/phases/7-topic-index.d.ts +6 -0
  115. package/dist/init/phases/7-topic-index.js +13 -0
  116. package/dist/init/phases/7-topic-index.js.map +1 -1
  117. package/dist/init/phases/8-docs-ingest.d.ts +6 -5
  118. package/dist/init/phases/8-docs-ingest.js +16 -43
  119. package/dist/init/phases/8-docs-ingest.js.map +1 -1
  120. package/dist/init/phases/9a-walker.d.ts +15 -0
  121. package/dist/init/phases/9a-walker.js +63 -0
  122. package/dist/init/phases/9a-walker.js.map +1 -0
  123. package/dist/init/phases/9b-curate.d.ts +19 -0
  124. package/dist/init/phases/9b-curate.js +79 -0
  125. package/dist/init/phases/9b-curate.js.map +1 -0
  126. package/dist/init/phases/9c-emit.d.ts +13 -0
  127. package/dist/init/phases/9c-emit.js +57 -0
  128. package/dist/init/phases/9c-emit.js.map +1 -0
  129. package/dist/init/phases/index.d.ts +6 -5
  130. package/dist/init/phases/index.js +4 -4
  131. package/dist/init/phases/index.js.map +1 -1
  132. package/dist/init/phases/mapper-output-io.d.ts +5 -5
  133. package/dist/init/phases/mapper-output-io.js +5 -5
  134. package/dist/init/phases/orchestrator.d.ts +10 -0
  135. package/dist/init/phases/orchestrator.js +13 -1
  136. package/dist/init/phases/orchestrator.js.map +1 -1
  137. package/dist/init/phases/state-io.js +1 -1
  138. package/dist/init/phases/types.d.ts +115 -9
  139. package/dist/init/phases/types.js +4 -2
  140. package/dist/init/phases/types.js.map +1 -1
  141. package/dist/init/post-git-init.d.ts +53 -0
  142. package/dist/init/post-git-init.js +74 -0
  143. package/dist/init/post-git-init.js.map +1 -0
  144. package/dist/init/preflight-guards.d.ts +11 -2
  145. package/dist/init/preflight-guards.js +27 -5
  146. package/dist/init/preflight-guards.js.map +1 -1
  147. package/dist/init/rules-merge/index.d.ts +1 -1
  148. package/dist/init/rules-merge/ingest.d.ts +6 -1
  149. package/dist/init/rules-merge/ingest.js.map +1 -1
  150. package/dist/init/skill-budget.d.ts +39 -0
  151. package/dist/init/skill-budget.js +99 -0
  152. package/dist/init/skill-budget.js.map +1 -0
  153. package/dist/init/source-comments/ingest.d.ts +0 -2
  154. package/dist/init/source-comments/ingest.js.map +1 -1
  155. package/dist/init/source-comments/walker.js +2 -2
  156. package/dist/init/topic-index/index.d.ts +8 -0
  157. package/dist/init/topic-index/index.js +10 -2
  158. package/dist/init/topic-index/index.js.map +1 -1
  159. package/dist/init/topic-index/judge.d.ts +15 -0
  160. package/dist/init/topic-index/judge.js +15 -1
  161. package/dist/init/topic-index/judge.js.map +1 -1
  162. package/dist/init/topic-index/resolve.js +41 -14
  163. package/dist/init/topic-index/resolve.js.map +1 -1
  164. package/dist/init/types.d.ts +9 -0
  165. package/dist/init/walker.d.ts +1 -1
  166. package/dist/init/walker.js +1 -1
  167. package/dist/init/workflow-block.d.ts +5 -6
  168. package/dist/init/workflow-block.js +5 -9
  169. package/dist/init/workflow-block.js.map +1 -1
  170. package/dist/mcp/bootstrap-guard.js +2 -2
  171. package/dist/mcp/bootstrap-guard.js.map +1 -1
  172. package/dist/mcp/schemas.d.ts +34 -0
  173. package/dist/mcp/schemas.js +50 -0
  174. package/dist/mcp/schemas.js.map +1 -1
  175. package/dist/mcp/telemetry.d.ts +1 -1
  176. package/dist/mcp/tools/bootstrap-retry.d.ts +23 -0
  177. package/dist/mcp/tools/bootstrap-retry.js +53 -0
  178. package/dist/mcp/tools/bootstrap-retry.js.map +1 -0
  179. package/dist/mcp/tools/bulk-accept-attention.d.ts +1 -1
  180. package/dist/mcp/tools/bulk-accept-attention.js +4 -6
  181. package/dist/mcp/tools/bulk-accept-attention.js.map +1 -1
  182. package/dist/mcp/tools/index.js +10 -0
  183. package/dist/mcp/tools/index.js.map +1 -1
  184. package/dist/mcp/tools/init-phases.d.ts +7 -6
  185. package/dist/mcp/tools/init-phases.js +36 -65
  186. package/dist/mcp/tools/init-phases.js.map +1 -1
  187. package/dist/mcp/tools/resume.d.ts +21 -0
  188. package/dist/mcp/tools/resume.js +88 -0
  189. package/dist/mcp/tools/resume.js.map +1 -0
  190. package/dist/mcp/tools/task-complete.d.ts +23 -0
  191. package/dist/mcp/tools/task-complete.js +51 -0
  192. package/dist/mcp/tools/task-complete.js.map +1 -0
  193. package/dist/mcp/tools/task-create.js +17 -11
  194. package/dist/mcp/tools/task-create.js.map +1 -1
  195. package/dist/mcp/tools/task-journal-append.d.ts +22 -0
  196. package/dist/mcp/tools/task-journal-append.js +44 -0
  197. package/dist/mcp/tools/task-journal-append.js.map +1 -0
  198. package/dist/paths/index.js +1 -1
  199. package/dist/paths/index.js.map +1 -1
  200. package/dist/status-line/format.js +20 -0
  201. package/dist/status-line/format.js.map +1 -1
  202. package/dist/tasks/index.d.ts +2 -0
  203. package/dist/tasks/index.js +2 -0
  204. package/dist/tasks/index.js.map +1 -0
  205. package/dist/tasks/lifecycle.d.ts +107 -0
  206. package/dist/tasks/lifecycle.js +302 -0
  207. package/dist/tasks/lifecycle.js.map +1 -0
  208. package/dist/trace/index.d.ts +1 -1
  209. package/dist/trace/index.js +2 -2
  210. package/dist/trace/index.js.map +1 -1
  211. package/package.json +2 -2
  212. package/templates/.cairn/config/trust-policy.yaml +0 -3
  213. package/templates/.cairn/config/workflow.md +0 -1
  214. package/templates/.cairn/ground/canonical-map/topics.yaml +0 -12
  215. package/dist/init/phases/5-pilot.d.ts +0 -10
  216. package/dist/init/phases/5-pilot.js +0 -108
  217. package/dist/init/phases/5-pilot.js.map +0 -1
  218. package/dist/init/phases/9-source-comments.d.ts +0 -6
  219. package/dist/init/phases/9-source-comments.js +0 -55
  220. package/dist/init/phases/9-source-comments.js.map +0 -1
  221. package/dist/init/phases/parallel-8910.d.ts +0 -27
  222. package/dist/init/phases/parallel-8910.js +0 -172
  223. package/dist/init/phases/parallel-8910.js.map +0 -1
  224. package/dist/init/phases/source-comments-output-io.d.ts +0 -84
  225. package/dist/init/phases/source-comments-output-io.js +0 -81
  226. package/dist/init/phases/source-comments-output-io.js.map +0 -1
  227. package/templates/.cairn/ground/capabilities/mcp-tools.yaml +0 -29
  228. package/templates/.cairn/ground/capabilities/skills.yaml +0 -25
  229. package/templates/.cairn/ground/capabilities/snippets.yaml +0 -29
@@ -0,0 +1,213 @@
1
+ /**
2
+ * GC pass 10 — doc-claims-vs-runtime drift sensor.
3
+ *
4
+ * Scans operator-authored prose (README.md, CLAUDE.md, docs/*.md) for
5
+ * extractable claims about the workspace shape — package count, smoke-gate
6
+ * count, MCP tool count, hook event count — and flags any value that
7
+ * disagrees with the runtime. Surfaces as `warn` findings; the
8
+ * cairn-attention skill turns each into an inline A/B/C
9
+ * (`doc wrong → regenerate`, `code wrong → file task`, `defer`).
10
+ *
11
+ * Closes the dogfood loop where adoption Phase 8 silently ingests stale
12
+ * docs as ground truth.
13
+ */
14
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
15
+ import { resolve } from "node:path";
16
+ const PASS_ID = "doc-claims-vs-runtime";
17
+ const ROOT_DOCS = ["README.md", "CLAUDE.md"];
18
+ const DOCS_DIR = "docs";
19
+ const NUMBER_WORDS = {
20
+ one: 1,
21
+ two: 2,
22
+ three: 3,
23
+ four: 4,
24
+ five: 5,
25
+ six: 6,
26
+ seven: 7,
27
+ eight: 8,
28
+ nine: 9,
29
+ ten: 10,
30
+ };
31
+ const CLAIM_PATTERNS = [
32
+ // "5 packages" — plural only; rejects "§3 Package contents" headings.
33
+ { kind: "packageCount", regex: /\b(\d+)\s+packages\b/g, numericGroup: 1 },
34
+ // "5-package boundary", "5-packages" — hyphenated form admits singular.
35
+ { kind: "packageCount", regex: /\b(\d+)-packages?\b/gi, numericGroup: 1 },
36
+ // "five packages" — wordy plural.
37
+ {
38
+ kind: "packageCount",
39
+ regex: /\b(one|two|three|four|five|six|seven|eight|nine|ten)\s+packages\b/gi,
40
+ numericGroup: 1,
41
+ wordy: true,
42
+ },
43
+ // "five-package boundary" — wordy hyphenated.
44
+ {
45
+ kind: "packageCount",
46
+ regex: /\b(one|two|three|four|five|six|seven|eight|nine|ten)-packages?\b/gi,
47
+ numericGroup: 1,
48
+ wordy: true,
49
+ },
50
+ // "29-smoke gate", "27 smoke gate"
51
+ { kind: "smokeCount", regex: /\b(\d+)[-\s]smoke gate\b/gi, numericGroup: 1 },
52
+ // "5 hooks (SessionStart, ...)" — paren disambiguates from "Stop hook"
53
+ { kind: "hookEventCount", regex: /\b(\d+)\s+hooks?\s*\(/gi, numericGroup: 1 },
54
+ // "28 typed tools", "25 MCP tools"
55
+ {
56
+ kind: "mcpToolCount",
57
+ regex: /\b(\d+)\s+(?:typed tools|MCP tools)\b/gi,
58
+ numericGroup: 1,
59
+ },
60
+ ];
61
+ export function runDocClaimsVsRuntime(opts) {
62
+ const detected = readRuntimeTruth(opts.repoRoot);
63
+ const runtime = { ...detected, ...(opts.runtimeOverride ?? {}) };
64
+ const findings = [];
65
+ for (const rel of collectDocFiles(opts.repoRoot)) {
66
+ const abs = resolve(opts.repoRoot, rel);
67
+ let body;
68
+ try {
69
+ body = readFileSync(abs, "utf8");
70
+ }
71
+ catch {
72
+ continue;
73
+ }
74
+ findings.push(...scanFile(rel, body, runtime));
75
+ }
76
+ return { findings, runtime };
77
+ }
78
+ function collectDocFiles(repoRoot) {
79
+ const out = [];
80
+ for (const rel of ROOT_DOCS) {
81
+ if (existsSync(resolve(repoRoot, rel)))
82
+ out.push(rel);
83
+ }
84
+ const docsAbs = resolve(repoRoot, DOCS_DIR);
85
+ if (existsSync(docsAbs)) {
86
+ let entries;
87
+ try {
88
+ entries = readdirSync(docsAbs);
89
+ }
90
+ catch {
91
+ entries = [];
92
+ }
93
+ for (const entry of entries) {
94
+ if (entry.endsWith(".md"))
95
+ out.push(`${DOCS_DIR}/${entry}`);
96
+ }
97
+ }
98
+ return out;
99
+ }
100
+ function scanFile(rel, body, truth) {
101
+ const findings = [];
102
+ for (const pattern of CLAIM_PATTERNS) {
103
+ const re = new RegExp(pattern.regex.source, pattern.regex.flags);
104
+ let m;
105
+ while ((m = re.exec(body)) !== null) {
106
+ const raw = m[pattern.numericGroup];
107
+ if (raw === undefined)
108
+ continue;
109
+ const claimed = pattern.wordy
110
+ ? NUMBER_WORDS[raw.toLowerCase()] ?? Number.NaN
111
+ : Number.parseInt(raw, 10);
112
+ if (!Number.isFinite(claimed))
113
+ continue;
114
+ const expected = truth[pattern.kind];
115
+ if (claimed === expected)
116
+ continue;
117
+ const line = lineOf(body, m.index);
118
+ findings.push({
119
+ pass: PASS_ID,
120
+ kind: "doc_claim_drift",
121
+ path: rel,
122
+ detail: `${rel}:${line} — \`${m[0]}\` claims ${pattern.kind}=${claimed}, runtime=${expected}`,
123
+ severity: "warn",
124
+ line,
125
+ matched_text: m[0],
126
+ });
127
+ }
128
+ }
129
+ return findings;
130
+ }
131
+ function lineOf(source, idx) {
132
+ let line = 1;
133
+ for (let i = 0; i < idx; i++) {
134
+ if (source.charCodeAt(i) === 10)
135
+ line++;
136
+ }
137
+ return line;
138
+ }
139
+ function readRuntimeTruth(repoRoot) {
140
+ return {
141
+ packageCount: countPackages(repoRoot),
142
+ smokeCount: countSmokeGate(repoRoot),
143
+ mcpToolCount: countMcpTools(repoRoot),
144
+ hookEventCount: countHookEvents(repoRoot),
145
+ };
146
+ }
147
+ function countPackages(repoRoot) {
148
+ const dir = resolve(repoRoot, "packages");
149
+ if (!existsSync(dir))
150
+ return 0;
151
+ let entries;
152
+ try {
153
+ entries = readdirSync(dir);
154
+ }
155
+ catch {
156
+ return 0;
157
+ }
158
+ let n = 0;
159
+ for (const entry of entries) {
160
+ if (existsSync(resolve(dir, entry, "package.json")))
161
+ n++;
162
+ }
163
+ return n;
164
+ }
165
+ function countSmokeGate(repoRoot) {
166
+ const pkg = resolve(repoRoot, "packages", "cairn", "package.json");
167
+ if (!existsSync(pkg))
168
+ return 0;
169
+ try {
170
+ const json = JSON.parse(readFileSync(pkg, "utf8"));
171
+ const chain = json.scripts?.["smokes"];
172
+ if (typeof chain !== "string")
173
+ return 0;
174
+ return (chain.match(/pnpm\s+smoke:[a-z-]+/g) ?? []).length;
175
+ }
176
+ catch {
177
+ return 0;
178
+ }
179
+ }
180
+ function countMcpTools(repoRoot) {
181
+ const file = resolve(repoRoot, "packages", "cairn-core", "src", "mcp", "tools", "index.ts");
182
+ if (!existsSync(file))
183
+ return 0;
184
+ try {
185
+ const src = readFileSync(file, "utf8");
186
+ const decl = src.indexOf("allTools");
187
+ if (decl === -1)
188
+ return 0;
189
+ const open = src.indexOf("[", decl);
190
+ const close = src.indexOf("];", open);
191
+ if (open === -1 || close === -1)
192
+ return 0;
193
+ const block = src.slice(open + 1, close);
194
+ const stripped = block.replace(/\/\/[^\n]*/g, "");
195
+ return (stripped.match(/[A-Za-z][A-Za-z0-9_]*Tool\b/g) ?? []).length;
196
+ }
197
+ catch {
198
+ return 0;
199
+ }
200
+ }
201
+ function countHookEvents(repoRoot) {
202
+ const file = resolve(repoRoot, "packages", "cairn-frontend-claudecode", "hooks", "hooks.json");
203
+ if (!existsSync(file))
204
+ return 0;
205
+ try {
206
+ const json = JSON.parse(readFileSync(file, "utf8"));
207
+ return Object.keys(json.hooks ?? {}).length;
208
+ }
209
+ catch {
210
+ return 0;
211
+ }
212
+ }
213
+ //# sourceMappingURL=doc-claims.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-claims.js","sourceRoot":"","sources":["../../src/gc/doc-claims.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * GC pass 11 — doc-source-drift.
3
+ *
4
+ * For every accepted DEC / INV with `sot_kind: path`, recompute the body
5
+ * hash from the file at `sot_path` and compare against the frontmatter
6
+ * `sot_content_hash`. The PostToolUse `sot-align` hook only fires when
7
+ * Claude Code itself edits the file; this pass closes the loop for
8
+ * external editor edits (VS Code, Cursor, raw shell) by checking the
9
+ * snapshot every GC sweep.
10
+ *
11
+ * Section extraction by `#anchor` uses GitHub-style heading slugs so the
12
+ * pass works without a populated AnchorMap. Missing file → finding;
13
+ * unresolvable anchor → finding; hash mismatch → finding.
14
+ *
15
+ * V1 surfaces only — no auto-rewrite proposal. Once the cairn-attention
16
+ * skill ingests the findings as A/B/C cases, the operator chooses
17
+ * `[a] regenerate from runtime` (refresh body), `[b] code wrong`
18
+ * (replace ground), or `[c] defer`.
19
+ */
20
+ import type { GcFinding } from "./types.js";
21
+ export interface DocSourceDriftOptions {
22
+ repoRoot: string;
23
+ }
24
+ export interface DocSourceDriftResult {
25
+ findings: GcFinding[];
26
+ /** Total path-kind entries scanned. Useful for tests. */
27
+ scanned: number;
28
+ }
29
+ export declare function runDocSourceDrift(opts: DocSourceDriftOptions): DocSourceDriftResult;
30
+ export declare function slugifyHeading(text: string): string;
31
+ export declare function extractSectionByAnchor(source: string, anchor: string): string | null;
@@ -0,0 +1,190 @@
1
+ /**
2
+ * GC pass 11 — doc-source-drift.
3
+ *
4
+ * For every accepted DEC / INV with `sot_kind: path`, recompute the body
5
+ * hash from the file at `sot_path` and compare against the frontmatter
6
+ * `sot_content_hash`. The PostToolUse `sot-align` hook only fires when
7
+ * Claude Code itself edits the file; this pass closes the loop for
8
+ * external editor edits (VS Code, Cursor, raw shell) by checking the
9
+ * snapshot every GC sweep.
10
+ *
11
+ * Section extraction by `#anchor` uses GitHub-style heading slugs so the
12
+ * pass works without a populated AnchorMap. Missing file → finding;
13
+ * unresolvable anchor → finding; hash mismatch → finding.
14
+ *
15
+ * V1 surfaces only — no auto-rewrite proposal. Once the cairn-attention
16
+ * skill ingests the findings as A/B/C cases, the operator chooses
17
+ * `[a] regenerate from runtime` (refresh body), `[b] code wrong`
18
+ * (replace ground), or `[c] defer`.
19
+ */
20
+ import { existsSync, readdirSync, readFileSync } from "node:fs";
21
+ import { resolve } from "node:path";
22
+ import { bodyContentHash, decisionsDir, invariantsDir, parseFrontmatterRecord, } from "@isaacriehm/cairn-state";
23
+ const PASS_ID = "doc-source-drift";
24
+ export function runDocSourceDrift(opts) {
25
+ const findings = [];
26
+ let scanned = 0;
27
+ for (const groundPath of collectGroundFiles(opts.repoRoot)) {
28
+ const abs = resolve(opts.repoRoot, groundPath);
29
+ let raw;
30
+ try {
31
+ raw = readFileSync(abs, "utf8");
32
+ }
33
+ catch {
34
+ continue;
35
+ }
36
+ const fm = extractPathKindFrontmatter(raw);
37
+ if (fm === null)
38
+ continue;
39
+ scanned++;
40
+ const finding = checkOne(opts.repoRoot, groundPath, fm);
41
+ if (finding !== null)
42
+ findings.push(finding);
43
+ }
44
+ return { findings, scanned };
45
+ }
46
+ function collectGroundFiles(repoRoot) {
47
+ const out = [];
48
+ for (const dir of [decisionsDir(repoRoot), invariantsDir(repoRoot)]) {
49
+ if (!existsSync(dir))
50
+ continue;
51
+ for (const name of listLedgerMarkdown(dir)) {
52
+ out.push(toRepoRel(repoRoot, dir, name));
53
+ }
54
+ }
55
+ return out;
56
+ }
57
+ function listLedgerMarkdown(dir) {
58
+ let names;
59
+ try {
60
+ names = readdirSync(dir);
61
+ }
62
+ catch {
63
+ return [];
64
+ }
65
+ return names
66
+ .filter((n) => n.endsWith(".md") && !n.startsWith("_"))
67
+ .sort();
68
+ }
69
+ function toRepoRel(repoRoot, dir, name) {
70
+ const abs = resolve(dir, name);
71
+ const root = resolve(repoRoot);
72
+ return abs.startsWith(`${root}/`) ? abs.slice(root.length + 1) : abs;
73
+ }
74
+ function extractPathKindFrontmatter(raw) {
75
+ const { fm } = parseFrontmatterRecord(raw);
76
+ if (fm["sot_kind"] !== "path")
77
+ return null;
78
+ const id = typeof fm["id"] === "string" ? fm["id"] : "";
79
+ const sotPath = typeof fm["sot_path"] === "string" ? fm["sot_path"] : "";
80
+ const sotContentHash = typeof fm["sot_content_hash"] === "string" ? fm["sot_content_hash"] : "";
81
+ if (id.length === 0 || sotPath.length === 0 || sotContentHash.length !== 64) {
82
+ return null;
83
+ }
84
+ return { id, sotPath, sotContentHash };
85
+ }
86
+ function checkOne(repoRoot, groundPath, fm) {
87
+ const [filePart, anchorPart] = splitSotPath(fm.sotPath);
88
+ const fileAbs = resolve(repoRoot, filePart);
89
+ if (!existsSync(fileAbs)) {
90
+ return {
91
+ pass: PASS_ID,
92
+ kind: "sot_missing",
93
+ path: groundPath,
94
+ detail: `${groundPath} — sot_path \`${fm.sotPath}\` does not exist`,
95
+ severity: "warn",
96
+ matched_text: fm.sotPath,
97
+ };
98
+ }
99
+ let source;
100
+ try {
101
+ source = readFileSync(fileAbs, "utf8");
102
+ }
103
+ catch {
104
+ return {
105
+ pass: PASS_ID,
106
+ kind: "sot_missing",
107
+ path: groundPath,
108
+ detail: `${groundPath} — sot_path \`${fm.sotPath}\` unreadable`,
109
+ severity: "warn",
110
+ matched_text: fm.sotPath,
111
+ };
112
+ }
113
+ let body;
114
+ if (anchorPart === null) {
115
+ body = source.trim();
116
+ }
117
+ else {
118
+ const extracted = extractSectionByAnchor(source, anchorPart);
119
+ if (extracted === null) {
120
+ return {
121
+ pass: PASS_ID,
122
+ kind: "sot_anchor_missing",
123
+ path: groundPath,
124
+ detail: `${groundPath} — anchor \`#${anchorPart}\` not found in ${filePart}`,
125
+ severity: "warn",
126
+ matched_text: fm.sotPath,
127
+ };
128
+ }
129
+ body = extracted;
130
+ }
131
+ const actual = bodyContentHash(body);
132
+ if (actual === fm.sotContentHash)
133
+ return null;
134
+ return {
135
+ pass: PASS_ID,
136
+ kind: "doc_source_drift",
137
+ path: groundPath,
138
+ detail: `${groundPath} — body at ${fm.sotPath} drifted from snapshot (expected sha256 ${shortHash(fm.sotContentHash)}, actual ${shortHash(actual)})`,
139
+ severity: "warn",
140
+ matched_text: fm.sotPath,
141
+ };
142
+ }
143
+ function splitSotPath(sotPath) {
144
+ const idx = sotPath.indexOf("#");
145
+ if (idx === -1)
146
+ return [sotPath, null];
147
+ return [sotPath.slice(0, idx), sotPath.slice(idx + 1)];
148
+ }
149
+ function shortHash(hash) {
150
+ return hash.slice(0, 8);
151
+ }
152
+ const HEADING_RE = /^(#+)\s+(.*?)\s*$/;
153
+ export function slugifyHeading(text) {
154
+ return text
155
+ .toLowerCase()
156
+ .replace(/[^a-z0-9]+/g, "-")
157
+ .replace(/^-+|-+$/g, "");
158
+ }
159
+ export function extractSectionByAnchor(source, anchor) {
160
+ const lines = source.split("\n");
161
+ let startLine = -1;
162
+ let startDepth = 0;
163
+ for (let i = 0; i < lines.length; i++) {
164
+ const m = HEADING_RE.exec(lines[i] ?? "");
165
+ if (m === null)
166
+ continue;
167
+ const depth = (m[1] ?? "").length;
168
+ const text = m[2] ?? "";
169
+ if (slugifyHeading(text) === anchor) {
170
+ startLine = i;
171
+ startDepth = depth;
172
+ break;
173
+ }
174
+ }
175
+ if (startLine === -1)
176
+ return null;
177
+ let endLine = lines.length;
178
+ for (let i = startLine + 1; i < lines.length; i++) {
179
+ const m = HEADING_RE.exec(lines[i] ?? "");
180
+ if (m === null)
181
+ continue;
182
+ const depth = (m[1] ?? "").length;
183
+ if (depth <= startDepth) {
184
+ endLine = i;
185
+ break;
186
+ }
187
+ }
188
+ return lines.slice(startLine, endLine).join("\n").trim();
189
+ }
190
+ //# sourceMappingURL=doc-source-drift.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doc-source-drift.js","sourceRoot":"","sources":["../../src/gc/doc-source-drift.ts"],"names":[],"mappings":"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"}
@@ -24,8 +24,12 @@ export { classifyAutoMerge } from "./classify.js";
24
24
  export type { ClassifyArgs } from "./classify.js";
25
25
  export { runCompletionIntegrity } from "./completion-integrity.js";
26
26
  export type { CompletionIntegrityOptions, CompletionIntegrityResult, } from "./completion-integrity.js";
27
+ export { runDocClaimsVsRuntime } from "./doc-claims.js";
28
+ export type { DocClaimKind, DocClaimsOptions, DocClaimsResult, RuntimeTruth as DocClaimsRuntimeTruth, } from "./doc-claims.js";
27
29
  export { runDocGardening } from "./doc-gardening.js";
28
30
  export type { DocGardeningOptions, DocGardeningResult, } from "./doc-gardening.js";
31
+ export { extractSectionByAnchor, runDocSourceDrift, slugifyHeading, } from "./doc-source-drift.js";
32
+ export type { DocSourceDriftOptions, DocSourceDriftResult, } from "./doc-source-drift.js";
29
33
  export { runFrontmatterFreshness, } from "./frontmatter.js";
30
34
  export type { FrontmatterFreshnessOptions, FrontmatterFreshnessResult, } from "./frontmatter.js";
31
35
  export { runGeneratorDrift } from "./generator-drift.js";
package/dist/gc/index.js CHANGED
@@ -19,7 +19,9 @@ export { runGcCanary as verifyBatchCanary } from "./canary.js";
19
19
  export { runCitationIntegrity } from "./citation-integrity.js";
20
20
  export { classifyAutoMerge } from "./classify.js";
21
21
  export { runCompletionIntegrity } from "./completion-integrity.js";
22
+ export { runDocClaimsVsRuntime } from "./doc-claims.js";
22
23
  export { runDocGardening } from "./doc-gardening.js";
24
+ export { extractSectionByAnchor, runDocSourceDrift, slugifyHeading, } from "./doc-source-drift.js";
23
25
  export { runFrontmatterFreshness, } from "./frontmatter.js";
24
26
  export { runGeneratorDrift } from "./generator-drift.js";
25
27
  export { runQualityUpdate as runQualityGradesUpdate } from "./quality-update.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKnE,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,EACL,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKpD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/gc/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAYH,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzC,OAAO,EAAE,WAAW,IAAI,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAK/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKnE,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAOxD,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAKrD,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EACjB,cAAc,GACf,MAAM,uBAAuB,CAAC;AAK/B,OAAO,EACL,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAK1B,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAKzD,OAAO,EAAE,gBAAgB,IAAI,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAIjF,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAK7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAKvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAIpD,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAKpD,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC"}
package/dist/gc/sweep.js CHANGED
@@ -20,7 +20,9 @@ import { runGcCanary } from "./canary.js";
20
20
  import { runCitationIntegrity } from "./citation-integrity.js";
21
21
  import { classifyAutoMerge } from "./classify.js";
22
22
  import { runCompletionIntegrity } from "./completion-integrity.js";
23
+ import { runDocClaimsVsRuntime } from "./doc-claims.js";
23
24
  import { runDocGardening } from "./doc-gardening.js";
25
+ import { runDocSourceDrift } from "./doc-source-drift.js";
24
26
  import { runFrontmatterFreshness } from "./frontmatter.js";
25
27
  import { runGeneratorDrift } from "./generator-drift.js";
26
28
  import { runQualityUpdate } from "./quality-update.js";
@@ -43,6 +45,8 @@ export async function runGcSweep(opts) {
43
45
  "completion-integrity": 0,
44
46
  "citation-integrity": 0,
45
47
  "attested-commits-pruning": 0,
48
+ "doc-claims-vs-runtime": 0,
49
+ "doc-source-drift": 0,
46
50
  };
47
51
  // 1. Frontmatter freshness.
48
52
  {
@@ -125,6 +129,20 @@ export async function runGcSweep(opts) {
125
129
  findings.push(...r.findings);
126
130
  passDurations["attested-commits-pruning"] = Date.now() - t0;
127
131
  }
132
+ // 10. Doc-claims vs runtime drift.
133
+ {
134
+ const t0 = Date.now();
135
+ const r = runDocClaimsVsRuntime({ repoRoot: opts.repoRoot });
136
+ findings.push(...r.findings);
137
+ passDurations["doc-claims-vs-runtime"] = Date.now() - t0;
138
+ }
139
+ // 11. Doc-source drift — body of sot_kind=path DECs/INVs vs ground hash.
140
+ {
141
+ const t0 = Date.now();
142
+ const r = runDocSourceDrift({ repoRoot: opts.repoRoot });
143
+ findings.push(...r.findings);
144
+ passDurations["doc-source-drift"] = Date.now() - t0;
145
+ }
128
146
  // Re-classify proposals against project globs (passes set defaults; this
129
147
  // ensures high-stakes hits dominate when a stale-frontmatter doc happens to
130
148
  // live under a high-stakes glob).
@@ -1 +1 @@
1
- {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/gc/sweep.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sweep.js","sourceRoot":"","sources":["../../src/gc/sweep.ts"],"names":[],"mappings":"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"}
@@ -22,8 +22,8 @@
22
22
  * reviewer + UAT 🟢 → push.
23
23
  * high-stakes — touches projectGlobs.high_stakes_globs. Above + E2E + Layer E.
24
24
  */
25
- export type GcPassId = "frontmatter-freshness" | "generator-drift" | "stub-catalog-hits" | "doc-gardening" | "quality-grades" | "scope-coverage" | "completion-integrity" | "citation-integrity" | "attested-commits-pruning";
26
- export type GcFindingKind = "frontmatter_stale" | "generator_drift" | "stub_hit" | "broken_link" | "orphan_path" | "quality_update" | "scope_uncovered" | "scope_drift_orphan" | "scope_index_missing" | "task_integrity_error" | "orphaned_citation" | "stale_citation" | "quality_grades_rebuilt" | "superseded_citation";
25
+ export type GcPassId = "frontmatter-freshness" | "generator-drift" | "stub-catalog-hits" | "doc-gardening" | "quality-grades" | "scope-coverage" | "completion-integrity" | "citation-integrity" | "attested-commits-pruning" | "doc-claims-vs-runtime" | "doc-source-drift";
26
+ export type GcFindingKind = "frontmatter_stale" | "generator_drift" | "stub_hit" | "broken_link" | "orphan_path" | "quality_update" | "scope_uncovered" | "scope_drift_orphan" | "scope_index_missing" | "task_integrity_error" | "orphaned_citation" | "stale_citation" | "quality_grades_rebuilt" | "superseded_citation" | "doc_claim_drift" | "doc_source_drift" | "sot_missing" | "sot_anchor_missing";
27
27
  export type GcAutoMergeClass = "safe" | "code" | "high-stakes";
28
28
  export interface GcFinding {
29
29
  pass: GcPassId;
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Context-threshold detection for the Stop hook.
3
+ *
4
+ * When mid-task context approaches the active model's window, surface
5
+ * an inline `[a] keep going [b] /clear and resume now [c] mark task
6
+ * done` choice via Claude Code's AskUserQuestion. The Stop hook can't
7
+ * call AskUserQuestion directly (only the model can), so it injects
8
+ * `decision: block` with an instructional reason that prompts main
9
+ * Claude to render the question.
10
+ *
11
+ * Threshold defaults to 50 % of the active model's window:
12
+ * - claude-opus-* → 1_000_000 tokens, fire at 500_000
13
+ * - claude-sonnet-* → 200_000 tokens, fire at 100_000
14
+ * - claude-haiku-* → 200_000 tokens, fire at 100_000
15
+ * - unknown model → assume Opus shape (1M / 500k threshold)
16
+ *
17
+ * Token count is estimated from the transcript file size (`bytes / 4`)
18
+ * — overcounts a little on JSON whitespace, undercounts on unicode-
19
+ * heavy turns. Good enough to fire near the threshold; not a budget
20
+ * check.
21
+ *
22
+ * Suppress re-fire within the same session by stamping
23
+ * `.cairn/sessions/<id>/ctx-threshold-warned.json`. Once stamped, the
24
+ * threshold prompt re-fires only when usage climbs another +10 %
25
+ * past the last warning.
26
+ */
27
+ export interface ContextThresholdInput {
28
+ transcriptPath: string | null;
29
+ repoRoot: string;
30
+ sessionId: string;
31
+ /** Override the model lookup (rarely needed). */
32
+ modelOverride?: string | null;
33
+ /** Override the threshold fraction (default 0.5). */
34
+ thresholdFraction?: number;
35
+ /** Override the window size in tokens (default keyed on model). */
36
+ windowOverride?: number;
37
+ }
38
+ export interface ContextThresholdHit {
39
+ hit: true;
40
+ estimatedTokens: number;
41
+ windowTokens: number;
42
+ pct: number;
43
+ model: string;
44
+ taskId: string | null;
45
+ }
46
+ export interface ContextThresholdMiss {
47
+ hit: false;
48
+ }
49
+ export type ContextThresholdResult = ContextThresholdHit | ContextThresholdMiss;
50
+ /**
51
+ * Returns the current threshold result. Stamps the warned-state file
52
+ * on a hit so re-fires within the same session are suppressed until
53
+ * usage climbs another +10 % of the window.
54
+ */
55
+ export declare function checkContextThreshold(input: ContextThresholdInput): ContextThresholdResult;
56
+ /**
57
+ * Render the inline prompt that the Stop hook injects via
58
+ * `decision: block`. The text instructs main Claude to render the
59
+ * three-option AskUserQuestion. Format-locked so the `[b]` branch
60
+ * always emits the literal `/cairn-resume <task_id>` token the
61
+ * operator pastes after `/clear`.
62
+ */
63
+ export declare function renderContextThresholdHint(hit: ContextThresholdHit, taskId: string | null): string;