@isaacriehm/cairn-core 0.2.0 → 0.3.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 (337) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/claude/runner.d.ts +1 -1
  3. package/dist/claude/runner.js +62 -1
  4. package/dist/claude/runner.js.map +1 -1
  5. package/dist/claude/types.d.ts +14 -7
  6. package/dist/claude/types.js +5 -7
  7. package/dist/claude/types.js.map +1 -1
  8. package/dist/context/index.d.ts +4 -4
  9. package/dist/context/index.js +3 -4
  10. package/dist/context/index.js.map +1 -1
  11. package/dist/context/spec-delta.js +2 -3
  12. package/dist/context/spec-delta.js.map +1 -1
  13. package/dist/context/task-summary.d.ts +18 -0
  14. package/dist/context/task-summary.js +89 -0
  15. package/dist/context/task-summary.js.map +1 -0
  16. package/dist/decision-capture/id.d.ts +21 -4
  17. package/dist/decision-capture/id.js +56 -5
  18. package/dist/decision-capture/id.js.map +1 -1
  19. package/dist/decision-capture/index.d.ts +7 -22
  20. package/dist/decision-capture/index.js +7 -17
  21. package/dist/decision-capture/index.js.map +1 -1
  22. package/dist/doctor/index.d.ts +1 -1
  23. package/dist/doctor/index.js +1 -1
  24. package/dist/events/index.d.ts +1 -1
  25. package/dist/events/index.js +1 -1
  26. package/dist/events/writer.d.ts +1 -1
  27. package/dist/events/writer.js +1 -1
  28. package/dist/gc/canary.d.ts +13 -23
  29. package/dist/gc/canary.js +36 -92
  30. package/dist/gc/canary.js.map +1 -1
  31. package/dist/gc/citation-integrity.d.ts +6 -6
  32. package/dist/gc/citation-integrity.js +64 -20
  33. package/dist/gc/citation-integrity.js.map +1 -1
  34. package/dist/gc/frontmatter.js +1 -1
  35. package/dist/gc/generator-drift.js +1 -1
  36. package/dist/gc/generator-drift.js.map +1 -1
  37. package/dist/gc/index.d.ts +2 -2
  38. package/dist/gc/index.js +1 -1
  39. package/dist/gc/index.js.map +1 -1
  40. package/dist/gc/quality-update.js +1 -1
  41. package/dist/gc/quality-update.js.map +1 -1
  42. package/dist/gc/types.d.ts +1 -30
  43. package/dist/ground/index.d.ts +2 -2
  44. package/dist/ground/index.js +1 -1
  45. package/dist/ground/index.js.map +1 -1
  46. package/dist/ground/ledgers.d.ts +0 -4
  47. package/dist/ground/ledgers.js +10 -8
  48. package/dist/ground/ledgers.js.map +1 -1
  49. package/dist/ground/manifest.js +0 -2
  50. package/dist/ground/manifest.js.map +1 -1
  51. package/dist/ground/quality-grades.js +3 -1
  52. package/dist/ground/quality-grades.js.map +1 -1
  53. package/dist/ground/schemas.d.ts +2 -7
  54. package/dist/ground/schemas.js +7 -2
  55. package/dist/ground/schemas.js.map +1 -1
  56. package/dist/ground/scope-index.d.ts +59 -12
  57. package/dist/ground/scope-index.js +212 -43
  58. package/dist/ground/scope-index.js.map +1 -1
  59. package/dist/hooks/bypass-detection.js +4 -2
  60. package/dist/hooks/bypass-detection.js.map +1 -1
  61. package/dist/hooks/post-tool-use/citation-scanner.d.ts +7 -5
  62. package/dist/hooks/post-tool-use/citation-scanner.js +15 -9
  63. package/dist/hooks/post-tool-use/citation-scanner.js.map +1 -1
  64. package/dist/hooks/post-tool-use/copy-scanner.js +1 -1
  65. package/dist/hooks/post-tool-use/copy-scanner.js.map +1 -1
  66. package/dist/hooks/post-tool-use/ledger-cache.d.ts +8 -0
  67. package/dist/hooks/post-tool-use/ledger-cache.js +53 -0
  68. package/dist/hooks/post-tool-use/ledger-cache.js.map +1 -1
  69. package/dist/hooks/post-tool-use/legend-builder.d.ts +3 -3
  70. package/dist/hooks/post-tool-use/legend-builder.js +30 -8
  71. package/dist/hooks/post-tool-use/legend-builder.js.map +1 -1
  72. package/dist/hooks/post-tool-use/read-enricher.d.ts +1 -1
  73. package/dist/hooks/post-tool-use/read-enricher.js +68 -21
  74. package/dist/hooks/post-tool-use/read-enricher.js.map +1 -1
  75. package/dist/hooks/post-tool-use/write-guardian.js +148 -18
  76. package/dist/hooks/post-tool-use/write-guardian.js.map +1 -1
  77. package/dist/hooks/runners/index.d.ts +1 -0
  78. package/dist/hooks/runners/index.js +1 -0
  79. package/dist/hooks/runners/index.js.map +1 -1
  80. package/dist/hooks/runners/payload.d.ts +1 -1
  81. package/dist/hooks/runners/payload.js +27 -12
  82. package/dist/hooks/runners/payload.js.map +1 -1
  83. package/dist/hooks/runners/session-start.js +212 -66
  84. package/dist/hooks/runners/session-start.js.map +1 -1
  85. package/dist/hooks/runners/stop.d.ts +9 -12
  86. package/dist/hooks/runners/stop.js +67 -36
  87. package/dist/hooks/runners/stop.js.map +1 -1
  88. package/dist/hooks/runners/user-prompt-submit.d.ts +15 -0
  89. package/dist/hooks/runners/user-prompt-submit.js +149 -0
  90. package/dist/hooks/runners/user-prompt-submit.js.map +1 -0
  91. package/dist/hooks/user-prompt-submit.d.ts +7 -0
  92. package/dist/hooks/user-prompt-submit.js +12 -0
  93. package/dist/hooks/user-prompt-submit.js.map +1 -0
  94. package/dist/index.d.ts +1 -6
  95. package/dist/index.js +1 -5
  96. package/dist/index.js.map +1 -1
  97. package/dist/init/baseline-audit.d.ts +5 -1
  98. package/dist/init/baseline-audit.js +25 -2
  99. package/dist/init/baseline-audit.js.map +1 -1
  100. package/dist/init/glob-inference.d.ts +16 -0
  101. package/dist/init/glob-inference.js +108 -0
  102. package/dist/init/glob-inference.js.map +1 -0
  103. package/dist/init/index.d.ts +2 -0
  104. package/dist/init/index.js +1 -0
  105. package/dist/init/index.js.map +1 -1
  106. package/dist/init/ingest-docs.d.ts +1 -1
  107. package/dist/init/ingest-docs.js +19 -6
  108. package/dist/init/ingest-docs.js.map +1 -1
  109. package/dist/init/init.js +12 -7
  110. package/dist/init/init.js.map +1 -1
  111. package/dist/init/mapper-merge.d.ts +8 -2
  112. package/dist/init/mapper-merge.js +50 -32
  113. package/dist/init/mapper-merge.js.map +1 -1
  114. package/dist/init/mapper-parallel.d.ts +2 -3
  115. package/dist/init/mapper-parallel.js +9 -38
  116. package/dist/init/mapper-parallel.js.map +1 -1
  117. package/dist/init/mapper-prompts.js +1 -1
  118. package/dist/init/mapper-prompts.js.map +1 -1
  119. package/dist/init/mapper.d.ts +6 -127
  120. package/dist/init/mapper.js +30 -7
  121. package/dist/init/mapper.js.map +1 -1
  122. package/dist/init/module-slicer.d.ts +1 -1
  123. package/dist/init/module-slicer.js +1 -1
  124. package/dist/init/multi-dev/install.d.ts +5 -11
  125. package/dist/init/multi-dev/install.js +4 -6
  126. package/dist/init/multi-dev/install.js.map +1 -1
  127. package/dist/init/overlay.d.ts +2 -2
  128. package/dist/init/overlay.js +1 -1
  129. package/dist/init/overlay.js.map +1 -1
  130. package/dist/init/phases/10-strip.js +1 -2
  131. package/dist/init/phases/10-strip.js.map +1 -1
  132. package/dist/init/phases/12-multidev.d.ts +1 -6
  133. package/dist/init/phases/12-multidev.js +1 -6
  134. package/dist/init/phases/12-multidev.js.map +1 -1
  135. package/dist/init/phases/3b-seed.d.ts +1 -10
  136. package/dist/init/phases/3b-seed.js +1 -10
  137. package/dist/init/phases/3b-seed.js.map +1 -1
  138. package/dist/init/phases/4-pilot.js +53 -15
  139. package/dist/init/phases/4-pilot.js.map +1 -1
  140. package/dist/init/phases/5-brand.js +10 -10
  141. package/dist/init/phases/5-brand.js.map +1 -1
  142. package/dist/init/prompts.d.ts +6 -8
  143. package/dist/init/prompts.js +3 -6
  144. package/dist/init/prompts.js.map +1 -1
  145. package/dist/init/rules-merge/ingest.js +1 -1
  146. package/dist/init/source-comments/classify.d.ts +1 -41
  147. package/dist/init/source-comments/classify.js +68 -37
  148. package/dist/init/source-comments/classify.js.map +1 -1
  149. package/dist/init/source-comments/index.d.ts +2 -2
  150. package/dist/init/source-comments/index.js +2 -2
  151. package/dist/init/source-comments/index.js.map +1 -1
  152. package/dist/init/source-comments/ingest.d.ts +38 -2
  153. package/dist/init/source-comments/ingest.js +237 -4
  154. package/dist/init/source-comments/ingest.js.map +1 -1
  155. package/dist/init/source-comments/strip-replace.d.ts +10 -19
  156. package/dist/init/source-comments/strip-replace.js +26 -2
  157. package/dist/init/source-comments/strip-replace.js.map +1 -1
  158. package/dist/init/source-comments/walker.d.ts +9 -2
  159. package/dist/init/source-comments/walker.js +38 -19
  160. package/dist/init/source-comments/walker.js.map +1 -1
  161. package/dist/init/submodules.d.ts +3 -2
  162. package/dist/init/types.d.ts +3 -5
  163. package/dist/init/types.js +3 -5
  164. package/dist/init/types.js.map +1 -1
  165. package/dist/init/visual.d.ts +4 -9
  166. package/dist/init/visual.js +1 -16
  167. package/dist/init/visual.js.map +1 -1
  168. package/dist/logger.d.ts +0 -1
  169. package/dist/logger.js +0 -1
  170. package/dist/logger.js.map +1 -1
  171. package/dist/mcp/context.d.ts +2 -3
  172. package/dist/mcp/context.js.map +1 -1
  173. package/dist/mcp/errors.d.ts +1 -1
  174. package/dist/mcp/errors.js.map +1 -1
  175. package/dist/mcp/history/prompt.d.ts +2 -1
  176. package/dist/mcp/history/walker.js +1 -1
  177. package/dist/mcp/history/walker.js.map +1 -1
  178. package/dist/mcp/path-allowlist.d.ts +0 -6
  179. package/dist/mcp/path-allowlist.js +0 -10
  180. package/dist/mcp/path-allowlist.js.map +1 -1
  181. package/dist/mcp/schemas.d.ts +15 -72
  182. package/dist/mcp/schemas.js +21 -70
  183. package/dist/mcp/schemas.js.map +1 -1
  184. package/dist/mcp/serve.d.ts +1 -1
  185. package/dist/mcp/serve.js +2 -5
  186. package/dist/mcp/serve.js.map +1 -1
  187. package/dist/mcp/server.js +10 -4
  188. package/dist/mcp/server.js.map +1 -1
  189. package/dist/mcp/telemetry.d.ts +8 -1
  190. package/dist/mcp/telemetry.js +16 -0
  191. package/dist/mcp/telemetry.js.map +1 -1
  192. package/dist/mcp/tools/decision-get.js +37 -29
  193. package/dist/mcp/tools/decision-get.js.map +1 -1
  194. package/dist/mcp/tools/decisions-in-scope.js +22 -3
  195. package/dist/mcp/tools/decisions-in-scope.js.map +1 -1
  196. package/dist/mcp/tools/index.js +2 -2
  197. package/dist/mcp/tools/index.js.map +1 -1
  198. package/dist/mcp/tools/invariant-get.js +1 -1
  199. package/dist/mcp/tools/invariant-get.js.map +1 -1
  200. package/dist/mcp/tools/invariants-in-scope.js +26 -7
  201. package/dist/mcp/tools/invariants-in-scope.js.map +1 -1
  202. package/dist/mcp/tools/query-history.js +3 -3
  203. package/dist/mcp/tools/query-history.js.map +1 -1
  204. package/dist/mcp/tools/resolve-attention.d.ts +3 -3
  205. package/dist/mcp/tools/resolve-attention.js +40 -28
  206. package/dist/mcp/tools/resolve-attention.js.map +1 -1
  207. package/dist/mcp/tools/search.js +3 -4
  208. package/dist/mcp/tools/search.js.map +1 -1
  209. package/dist/mcp/tools/task-create.d.ts +15 -0
  210. package/dist/mcp/tools/task-create.js +96 -0
  211. package/dist/mcp/tools/task-create.js.map +1 -0
  212. package/dist/mcp/tools/timeline.js +3 -7
  213. package/dist/mcp/tools/timeline.js.map +1 -1
  214. package/dist/profiles/types.d.ts +1 -1
  215. package/dist/profiles/types.js +1 -1
  216. package/dist/session/id.d.ts +1 -3
  217. package/dist/session/id.js +1 -1
  218. package/dist/session/id.js.map +1 -1
  219. package/dist/session-start/build.d.ts +12 -14
  220. package/dist/session-start/build.js +68 -38
  221. package/dist/session-start/build.js.map +1 -1
  222. package/dist/session-start/index.d.ts +2 -2
  223. package/dist/session-start/index.js +2 -2
  224. package/dist/session-start/index.js.map +1 -1
  225. package/dist/session-start/templates.d.ts +20 -4
  226. package/dist/session-start/templates.js +45 -35
  227. package/dist/session-start/templates.js.map +1 -1
  228. package/dist/status-line/format.d.ts +19 -11
  229. package/dist/status-line/format.js +44 -36
  230. package/dist/status-line/format.js.map +1 -1
  231. package/dist/status-line/index.d.ts +3 -1
  232. package/dist/status-line/index.js +1 -1
  233. package/dist/status-line/index.js.map +1 -1
  234. package/dist/status-line/reader.d.ts +9 -6
  235. package/dist/status-line/reader.js +50 -15
  236. package/dist/status-line/reader.js.map +1 -1
  237. package/dist/status-line/writer.d.ts +5 -0
  238. package/dist/status-line/writer.js +9 -0
  239. package/dist/status-line/writer.js.map +1 -1
  240. package/dist/trace/index.d.ts +44 -0
  241. package/dist/trace/index.js +51 -0
  242. package/dist/trace/index.js.map +1 -0
  243. package/package.json +2 -3
  244. package/templates/.archive/README.md +3 -3
  245. package/templates/.cairn/config/sensors.yaml +16 -19
  246. package/templates/.cairn/config/stub-patterns.yaml +4 -4
  247. package/templates/.cairn/config/trust-policy.yaml +3 -35
  248. package/templates/.cairn/config/workflow.md +13 -194
  249. package/templates/.cairn/git-hooks/commit-msg +1 -1
  250. package/templates/.cairn/ground/canonical-map/topics.yaml +3 -26
  251. package/templates/.cairn/ground/capabilities/snippets.yaml +0 -1
  252. package/templates/.cairn/ground/manifest.yaml +5 -8
  253. package/templates/.cairn/ground/product/personas.yaml +0 -1
  254. package/templates/.github/workflows/cairn-check.yml +3 -5
  255. package/dist/context/checkpoint.d.ts +0 -11
  256. package/dist/context/checkpoint.js +0 -30
  257. package/dist/context/checkpoint.js.map +0 -1
  258. package/dist/decision-capture/capture.d.ts +0 -57
  259. package/dist/decision-capture/capture.js +0 -186
  260. package/dist/decision-capture/capture.js.map +0 -1
  261. package/dist/decision-capture/extractor.d.ts +0 -20
  262. package/dist/decision-capture/extractor.js +0 -103
  263. package/dist/decision-capture/extractor.js.map +0 -1
  264. package/dist/decision-capture/prompt.d.ts +0 -15
  265. package/dist/decision-capture/prompt.js +0 -68
  266. package/dist/decision-capture/prompt.js.map +0 -1
  267. package/dist/decision-capture/refinement-prompt.d.ts +0 -25
  268. package/dist/decision-capture/refinement-prompt.js +0 -146
  269. package/dist/decision-capture/refinement-prompt.js.map +0 -1
  270. package/dist/decision-capture/refinement-schema.d.ts +0 -52
  271. package/dist/decision-capture/refinement-schema.js +0 -61
  272. package/dist/decision-capture/refinement-schema.js.map +0 -1
  273. package/dist/decision-capture/refinement.d.ts +0 -60
  274. package/dist/decision-capture/refinement.js +0 -439
  275. package/dist/decision-capture/refinement.js.map +0 -1
  276. package/dist/decision-capture/schema.d.ts +0 -70
  277. package/dist/decision-capture/schema.js +0 -71
  278. package/dist/decision-capture/schema.js.map +0 -1
  279. package/dist/decision-capture/types.d.ts +0 -201
  280. package/dist/decision-capture/types.js +0 -20
  281. package/dist/decision-capture/types.js.map +0 -1
  282. package/dist/decision-capture/writer.d.ts +0 -90
  283. package/dist/decision-capture/writer.js +0 -267
  284. package/dist/decision-capture/writer.js.map +0 -1
  285. package/dist/frontend-types.d.ts +0 -243
  286. package/dist/frontend-types.js +0 -15
  287. package/dist/frontend-types.js.map +0 -1
  288. package/dist/hooks/index.d.ts +0 -14
  289. package/dist/hooks/index.js +0 -14
  290. package/dist/hooks/index.js.map +0 -1
  291. package/dist/inbox.d.ts +0 -17
  292. package/dist/inbox.js +0 -30
  293. package/dist/inbox.js.map +0 -1
  294. package/dist/mcp/tools/append-run-note.d.ts +0 -18
  295. package/dist/mcp/tools/append-run-note.js +0 -54
  296. package/dist/mcp/tools/append-run-note.js.map +0 -1
  297. package/dist/mcp/tools/append.d.ts +0 -8
  298. package/dist/mcp/tools/append.js +0 -37
  299. package/dist/mcp/tools/append.js.map +0 -1
  300. package/dist/mcp/tools/ask-operator.d.ts +0 -34
  301. package/dist/mcp/tools/ask-operator.js +0 -97
  302. package/dist/mcp/tools/ask-operator.js.map +0 -1
  303. package/dist/mcp/tools/drop-task.d.ts +0 -12
  304. package/dist/mcp/tools/drop-task.js +0 -68
  305. package/dist/mcp/tools/drop-task.js.map +0 -1
  306. package/dist/mcp/tools/record-run-event.d.ts +0 -10
  307. package/dist/mcp/tools/record-run-event.js +0 -32
  308. package/dist/mcp/tools/record-run-event.js.map +0 -1
  309. package/dist/prompt.d.ts +0 -19
  310. package/dist/prompt.js +0 -50
  311. package/dist/prompt.js.map +0 -1
  312. package/dist/tier0/classify.d.ts +0 -10
  313. package/dist/tier0/classify.js +0 -110
  314. package/dist/tier0/classify.js.map +0 -1
  315. package/dist/tier0/index.d.ts +0 -2
  316. package/dist/tier0/index.js +0 -2
  317. package/dist/tier0/index.js.map +0 -1
  318. package/dist/tier0/types.d.ts +0 -24
  319. package/dist/tier0/types.js +0 -9
  320. package/dist/tier0/types.js.map +0 -1
  321. package/dist/tightener/index.d.ts +0 -4
  322. package/dist/tightener/index.js +0 -4
  323. package/dist/tightener/index.js.map +0 -1
  324. package/dist/tightener/prompt.d.ts +0 -3
  325. package/dist/tightener/prompt.js +0 -67
  326. package/dist/tightener/prompt.js.map +0 -1
  327. package/dist/tightener/schema.d.ts +0 -68
  328. package/dist/tightener/schema.js +0 -44
  329. package/dist/tightener/schema.js.map +0 -1
  330. package/dist/tightener/tighten.d.ts +0 -2
  331. package/dist/tightener/tighten.js +0 -66
  332. package/dist/tightener/tighten.js.map +0 -1
  333. package/dist/tightener/types.d.ts +0 -74
  334. package/dist/tightener/types.js +0 -6
  335. package/dist/tightener/types.js.map +0 -1
  336. package/templates/.claude/settings.json +0 -57
  337. package/templates/.mcp.json +0 -8
@@ -7,21 +7,25 @@
7
7
  * Spec: PLUGIN_ARCHITECTURE §7 + §10. Bin entrypoint at
8
8
  * `cairn-core/src/hooks/session-start.ts` calls into this runner.
9
9
  */
10
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
10
+ import { existsSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
11
11
  import { homedir } from "node:os";
12
12
  import { join } from "node:path";
13
+ import { readActiveTaskSummary } from "../../context/index.js";
13
14
  import { gcStaleEvents } from "../../events/index.js";
14
- import { inspectJoinState } from "../../join/index.js";
15
+ import { writeDecisionsLedger, writeInvariantsLedger } from "../../ground/ledgers.js";
16
+ import { rescanScopeIndex } from "../../ground/scope-index.js";
17
+ import { scanBypassedCommits } from "../bypass-detection.js";
18
+ import { inspectJoinState, runJoin } from "../../join/index.js";
15
19
  import { resolveRepoRoot } from "../../session-start/index.js";
16
20
  import { buildSessionStartContext } from "../../session-start/index.js";
17
21
  import { ensureSessionDir, gcStaleSessions, resolveSessionId, seedEventsMarker, } from "../../session/index.js";
18
22
  import { defaultStatusJson, writeStatusJson } from "../../status-line/index.js";
19
23
  import { emitShapeB, parseHookPayload, readHookStdin, recordHookTelemetry, } from "./payload.js";
20
24
  /**
21
- * Maintain the shim file the cairn-statusline-setup skill relies on —
22
- * a single line containing the absolute path to the active bundle's
23
- * `dist/cli.mjs`. The user's `~/.claude/settings.json` statusLine
24
- * command reads this path so plugin upgrades (which change
25
+ * Maintain the shim file the `/cairn-statusline-setup` command relies
26
+ * on — a single line containing the absolute path to the active
27
+ * bundle's `dist/cli.mjs`. The user's `~/.claude/settings.json`
28
+ * statusLine command reads this path so plugin upgrades (which change
25
29
  * CLAUDE_PLUGIN_ROOT's version segment) don't break the badge.
26
30
  *
27
31
  * No-op when the hook isn't running under the Claude Code plugin
@@ -116,6 +120,36 @@ export async function runSessionStartHook() {
116
120
  catch (err) {
117
121
  sessionWarnings.push(`events_gc_failed: ${err instanceof Error ? err.message : String(err)}`);
118
122
  }
123
+ // Deterministic scope-index sync — walk source files, regex for §INV/§DEC
124
+ // tokens, fold into scope-index. No LLM. Cheap (~100ms on 50k files via
125
+ // git ls-files). Keeps the in-scope tools accurate when an agent has
126
+ // moved cite tokens between files since the last init / rebuild.
127
+ try {
128
+ const rescan = rescanScopeIndex(repoRoot);
129
+ if (rescan.dirty) {
130
+ sessionWarnings.push(`scope_rescan_dirty:added=${rescan.entriesAdded},updated=${rescan.entriesUpdated}`);
131
+ }
132
+ }
133
+ catch (err) {
134
+ sessionWarnings.push(`scope_rescan_failed: ${err instanceof Error ? err.message : String(err)}`);
135
+ }
136
+ // Defensive ledger rebuilds — operator may edit a DEC or INV .md file
137
+ // out-of-band (text editor, git checkout of a different branch). The
138
+ // ledger.yaml indices won't reflect that until the next accept/reject
139
+ // landed via the MCP write path. Rebuild from on-disk frontmatter so
140
+ // the in-scope tools never see a stale ledger. Pure JS, milliseconds.
141
+ try {
142
+ writeDecisionsLedger({ repoRoot });
143
+ }
144
+ catch (err) {
145
+ sessionWarnings.push(`decisions_ledger_rebuild_failed: ${err instanceof Error ? err.message : String(err)}`);
146
+ }
147
+ try {
148
+ writeInvariantsLedger({ repoRoot });
149
+ }
150
+ catch (err) {
151
+ sessionWarnings.push(`invariants_ledger_rebuild_failed: ${err instanceof Error ? err.message : String(err)}`);
152
+ }
119
153
  const isResume = source === "resume";
120
154
  const buildArgs = { repoRoot };
121
155
  if (isResume)
@@ -127,12 +161,24 @@ export async function runSessionStartHook() {
127
161
  }
128
162
  const result = await buildSessionStartContext(buildArgs);
129
163
  try {
164
+ const active = readActiveTaskSummary(repoRoot);
165
+ let bypassCount = 0;
166
+ try {
167
+ bypassCount = scanBypassedCommits(repoRoot).bypassed.length;
168
+ }
169
+ catch {
170
+ bypassCount = 0;
171
+ }
130
172
  writeStatusJson(repoRoot, sessionId, {
131
173
  decisions_in_scope: result.counts.decisions,
132
174
  invariants_in_scope: result.counts.invariants,
133
175
  attention_count: result.counts.pendingDrafts +
134
176
  result.counts.baselineFindings +
135
177
  result.counts.driftFindings,
178
+ task_state: active?.taskState ?? "idle",
179
+ task_id: active?.taskId ?? null,
180
+ task_module: active?.taskModule ?? null,
181
+ bypass_count: bypassCount,
136
182
  updated_at: new Date().toISOString(),
137
183
  });
138
184
  }
@@ -161,24 +207,29 @@ export async function runSessionStartHook() {
161
207
  ...result.warnings,
162
208
  ...sessionWarnings,
163
209
  ...shimWarnings,
164
- ...(bootstrapBanner !== null ? ["bootstrap_required"] : []),
210
+ ...(bootstrapBanner !== null ? ["bootstrap_failed"] : []),
165
211
  ],
166
212
  extra: {
167
213
  sections_rendered: result.sectionsRendered,
168
214
  sections_dropped: result.sectionsDropped,
169
215
  total_chars: additionalContext.length,
216
+ additional_context: additionalContext,
217
+ ...(bootstrapBanner !== null ? { bootstrap_banner: bootstrapBanner } : {}),
170
218
  },
171
219
  });
172
220
  }
173
221
  /**
174
222
  * Per PLUGIN_ARCHITECTURE §17 Layer 4: when a clone is cairn-adopted
175
223
  * (`.cairn/config.yaml` present + `.git/` present) but `core.hooksPath`
176
- * is unset, the plugin enters degraded mode. The session opens — read
177
- * tools still work but main Claude must surface the bootstrap prompt
178
- * inline before the operator engages with any cairn write surface. The
179
- * banner is the only contract: if the surrounding skill / agent does not
180
- * gate on it, the MCP write tools' BOOTSTRAP_REQUIRED envelope is the
181
- * server-side backstop.
224
+ * is unset, run `cairn join` synchronously to wire the per-clone hooks.
225
+ * Bootstrap is idempotent, local-clone-only state (git config + chmod +
226
+ * gitignored sentinel files) plugin install is implicit consent for
227
+ * local config wiring, no operator prompt needed.
228
+ *
229
+ * Returns null on success (no banner needed) or when not in
230
+ * bootstrap-required state. Returns a failure banner only when
231
+ * `runJoin` errored — operator needs to know the write surface stayed
232
+ * disabled.
182
233
  */
183
234
  function renderBootstrapBanner(repoRoot) {
184
235
  if (!existsSync(join(repoRoot, ".git")))
@@ -188,76 +239,171 @@ function renderBootstrapBanner(repoRoot) {
188
239
  const state = inspectJoinState({ repoRoot });
189
240
  if (state.hooksPathSet)
190
241
  return null;
242
+ // Auto-run join. Idempotent — no harm if a parallel session beat us.
243
+ const result = runJoin({ repoRoot });
244
+ if (result.bootstrapped)
245
+ return null;
246
+ // Surface failure inline so operator knows the write surface is still
247
+ // refused. Include each errored step's detail for diagnosis.
191
248
  const lines = [];
192
- lines.push("## Cairn — bootstrap required");
249
+ lines.push("## Cairn — bootstrap failed");
193
250
  lines.push("");
194
- lines.push("This project is cairn-adopted, but this clone is not bootstrapped. " +
195
- "Without bootstrap, MCP write tools refuse, the cairn-direction " +
196
- "skill blocks, and local commits will fail at the pre-commit hook.");
251
+ lines.push("This clone is cairn-adopted but `cairn join` did not finish. " +
252
+ "MCP write tools refuse and local commits skip attestation until " +
253
+ "this resolves.");
197
254
  lines.push("");
198
- lines.push(`Project pinned to cairn ${state.projectCairnVersion ?? "(unset)"}.`);
255
+ for (const step of result.steps) {
256
+ if (step.status === "error") {
257
+ lines.push(`- **${step.step}** — ${step.detail}`);
258
+ }
259
+ }
199
260
  lines.push("");
200
- lines.push("Surface this inline by invoking the `cairn-bootstrap` skill —");
201
- lines.push("it owns the prompt + the spawn of the bundled join command.");
202
- lines.push("Do not embed the join command directly in chat output; the");
203
- lines.push("skill keeps the bundle path versioned with the plugin.");
261
+ lines.push("Re-run manually: `node \"${CLAUDE_PLUGIN_ROOT}/dist/cli.mjs\" join`");
204
262
  return lines.join("\n");
205
263
  }
206
264
  /**
207
265
  * Per PLUGIN_ARCHITECTURE §6: when the operator opens Claude Code in a
208
- * git repo with no `.cairn/` directory, the plugin proactively offers
209
- * adoption inline. SessionStart has no DOM to draw on — it injects the
210
- * instruction here as additionalContext so Claude reads it on the first
211
- * user message and surfaces the inline A/B/C prompt.
266
+ * project root with no `.cairn/` directory, the plugin proactively
267
+ * offers adoption inline. SessionStart has no DOM to draw on — it
268
+ * injects the instruction here as additionalContext so Claude reads it
269
+ * on the first user message and surfaces the inline A/B/C prompt.
212
270
  *
213
- * Returns null when cwd is not a git repo (Claude Code launched outside
214
- * any project) silent in that case.
271
+ * Project-shape detection: cwd is a project if it has `.git/` OR any
272
+ * common build manifest. The `cairn-adopt` skill's preflight handles
273
+ * the no-git case (offers `git init`), so we don't need to gate on
274
+ * `.git/` here. Returns null when cwd looks like a non-project dir
275
+ * (e.g. `~/`, `/tmp/`) — silent in that case.
276
+ */
277
+ const PROJECT_MARKERS = [
278
+ ".git",
279
+ "package.json",
280
+ "pyproject.toml",
281
+ "Cargo.toml",
282
+ "go.mod",
283
+ "Gemfile",
284
+ "build.gradle",
285
+ "build.gradle.kts",
286
+ "pom.xml",
287
+ "composer.json",
288
+ "Package.swift",
289
+ "deno.json",
290
+ "bun.lockb",
291
+ ];
292
+ function looksLikeProjectRoot(cwd) {
293
+ for (const marker of PROJECT_MARKERS) {
294
+ if (existsSync(join(cwd, marker)))
295
+ return true;
296
+ }
297
+ return false;
298
+ }
299
+ /**
300
+ * Find direct child directories that look like project roots. When the
301
+ * operator opens Claude Code in a parent dir (e.g. `~/Clients/Foo/`)
302
+ * that contains one or more adoptable projects in immediate subdirs,
303
+ * we surface them so the operator can `cd` in. Caps at 8 children to
304
+ * avoid spamming when launched in `~/` or similar.
215
305
  */
306
+ function findAdoptableChildren(cwd, max = 8) {
307
+ let entries;
308
+ try {
309
+ entries = readdirSync(cwd, { withFileTypes: true });
310
+ }
311
+ catch {
312
+ return [];
313
+ }
314
+ const out = [];
315
+ for (const entry of entries) {
316
+ if (!entry.isDirectory())
317
+ continue;
318
+ if (entry.name.startsWith("."))
319
+ continue;
320
+ const childPath = join(cwd, String(entry.name));
321
+ if (!looksLikeProjectRoot(childPath))
322
+ continue;
323
+ if (existsSync(join(childPath, ".cairn")))
324
+ continue; // already adopted
325
+ if (existsSync(join(childPath, ".cairn-skip")))
326
+ continue;
327
+ out.push(String(entry.name));
328
+ if (out.length >= max)
329
+ break;
330
+ }
331
+ return out;
332
+ }
216
333
  function renderAdoptionBanner(cwd) {
217
- if (!existsSync(join(cwd, ".git")))
218
- return null;
219
- // Operator opted-out previously — never re-prompt.
220
334
  if (existsSync(join(cwd, ".cairn-skip")))
221
335
  return null;
222
- // Walk upward briefly to make sure no parent has .cairn/ either —
223
- // monorepo subdirectories should not re-prompt for adoption.
224
- let dir = cwd;
225
- for (let i = 0; i < 40; i++) {
226
- if (existsSync(join(dir, ".cairn")))
227
- return null;
228
- if (existsSync(join(dir, ".cairn-skip")))
229
- return null;
230
- const parent = join(dir, "..");
231
- if (parent === dir)
232
- break;
233
- dir = parent;
234
- if (!existsSync(join(dir, ".git")))
235
- break;
336
+ const cwdIsProject = looksLikeProjectRoot(cwd);
337
+ if (cwdIsProject) {
338
+ // Walk upward briefly to make sure no parent has .cairn/ either —
339
+ // monorepo subdirectories should not re-prompt for adoption.
340
+ let dir = cwd;
341
+ for (let i = 0; i < 40; i++) {
342
+ if (existsSync(join(dir, ".cairn")))
343
+ return null;
344
+ if (existsSync(join(dir, ".cairn-skip")))
345
+ return null;
346
+ const parent = join(dir, "..");
347
+ if (parent === dir)
348
+ break;
349
+ dir = parent;
350
+ if (!looksLikeProjectRoot(dir))
351
+ break;
352
+ }
353
+ const lines = [];
354
+ lines.push("## Cairn — adoption available");
355
+ lines.push("");
356
+ lines.push("This project has no `.cairn/` directory. Cairn is installed and " +
357
+ "can adopt it: a one-time visual pass that ingests existing " +
358
+ "decisions, source-comment essays, and `CLAUDE.md` / `AGENTS.md` " +
359
+ "rules into queryable ground state.");
360
+ lines.push("");
361
+ lines.push("Invoke the `cairn-adopt` skill on the operator's first message — " +
362
+ "even a casual greeting like \"hi\". The skill renders the " +
363
+ "yes / not now / never prompt through `AskUserQuestion`; do not " +
364
+ "duplicate the prompt as inline markdown.");
365
+ lines.push("");
366
+ lines.push("On `never for this project`, the skill writes a one-line " +
367
+ "`.cairn-skip` file at the repo root so future sessions don't " +
368
+ "re-prompt.");
369
+ lines.push("");
370
+ lines.push("If the operator asks what cairn does, summarize: persistent " +
371
+ "ground state for AI agents — decisions, invariants, canonical " +
372
+ "map, sensors. Stops re-debating settled choices across sessions.");
373
+ return lines.join("\n");
236
374
  }
375
+ // cwd isn't itself a project — scan one level down for adoptable
376
+ // children (e.g. operator opened Claude Code in
377
+ // `~/Clients/Foo/Deliverables/Website/` containing `abholidaylighting/`).
378
+ const children = findAdoptableChildren(cwd);
379
+ if (children.length === 0)
380
+ return null;
237
381
  const lines = [];
238
- lines.push("## Cairn — adoption available");
239
- lines.push("");
240
- lines.push("This project is a git repo with no `.cairn/` directory. Cairn " +
241
- "is installed and can adopt it: a one-time visual pass that " +
242
- "ingests existing decisions, source-comment essays, and " +
243
- "`CLAUDE.md` / `AGENTS.md` rules into queryable ground state.");
382
+ lines.push("## Cairn — adoptable project in subdir");
244
383
  lines.push("");
245
- lines.push("Surface this inline to the operator on their first message — even " +
246
- "a casual greeting like \"hi\". Use AskUserQuestion or a markdown " +
247
- "blockquote with the three options:");
248
- lines.push("");
249
- lines.push("> Adopt this project with cairn?");
250
- lines.push("> `[a]` yes — walk adoption now (~30-60s, streamed)");
251
- lines.push("> `[b]` not now ask again next session");
252
- lines.push("> `[c]` never mark this project opted-out (writes `.cairn-skip`)");
253
- lines.push("");
254
- lines.push("On `[a]`, invoke the `cairn-adopt` skill (it auto-detects). On " +
255
- "`[c]`, write a one-line `.cairn-skip` file at the repo root so " +
256
- "future sessions don't re-prompt.");
384
+ if (children.length === 1) {
385
+ lines.push(`The current dir isn't a project root, but \`${children[0]}/\` is ` +
386
+ "and it has no `.cairn/`. Cairn can adopt it once the operator `cd`s in.");
387
+ lines.push("");
388
+ lines.push("Suggested first reply (edit if the operator prefers a different surface):");
389
+ lines.push("");
390
+ lines.push(`> Cairn can adopt \`${children[0]}/\`. \`cd\` in and reopen Claude Code, ` +
391
+ "or stay here for read-only access.");
392
+ }
393
+ else {
394
+ lines.push(`The current dir isn't a project root, but ${children.length} ` +
395
+ "immediate subdirs look adoptable:");
396
+ lines.push("");
397
+ for (const c of children) {
398
+ lines.push(`- \`${c}/\``);
399
+ }
400
+ lines.push("");
401
+ lines.push("Suggest the operator `cd` into one of them to adopt.");
402
+ }
257
403
  lines.push("");
258
- lines.push("If the operator asks what cairn does, summarize: persistent " +
259
- "ground state for AI agents decisions, invariants, canonical " +
260
- "map, sensors. Stops re-debating settled choices across sessions.");
404
+ lines.push("Do NOT auto-invoke `cairn-adopt` from this surface the skill " +
405
+ "operates on `cwd`, not subdirs. Surface the suggestion in chat " +
406
+ "and let the operator change directory.");
261
407
  return lines.join("\n");
262
408
  }
263
409
  //# sourceMappingURL=session-start.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runners/session-start.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-start.js","sourceRoot":"","sources":["../../../src/hooks/runners/session-start.ts"],"names":[],"mappings":"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"}
@@ -1,18 +1,15 @@
1
1
  /**
2
2
  * `Stop` hook runner — fires when the assistant turn ends.
3
3
  *
4
- * Current scope:
5
- * • Drain `.cairn/events/` since the per-session marker; stamp the
6
- * poll cursor so the next Stop only sees newer events.
7
- * • Scan `.cairn/tasks/active/<id>/` for tasks that have a
8
- * tightened spec but no `attestation.yaml`; surface a reviewer-
9
- * spawn hint in additionalContext so main Claude can spawn the
10
- * reviewer subagent on the next assistant turn.
11
- * • Patch the per-session status.json `updated_at` (heartbeat).
4
+ * Per PLUGIN_ARCHITECTURE §10:
5
+ * • Drains `.cairn/events/` since the per-session marker.
6
+ * Scans `.cairn/tasks/active/<id>/` for tasks missing attestation.yaml.
7
+ * • Compares HEAD's last 5 commits against `.cairn/.attested-commits`;
8
+ * surfaces bypass hint for `--no-verify` commits.
9
+ * Patches per-session status.json `updated_at` (heartbeat).
12
10
  *
13
- * Future scope (steps 7–8 per PLUGIN_ARCHITECTURE §10):
14
- * Run sensors on staged + unstaged diff; surface findings inline.
15
- * Compare HEAD's last 5 commits against `.attested-commits` marker;
16
- * surface backfill prompt for `--no-verify` bypasses.
11
+ * When context to surface: emits `{ decision: "block", reason: "..." }` so
12
+ * Claude reads the hint and invokes cairn-attention on the next turn.
13
+ * When nothing: emits `{ continue: true }` and Claude stops normally.
17
14
  */
18
15
  export declare function runStopHook(): Promise<void>;
@@ -1,22 +1,20 @@
1
1
  /**
2
2
  * `Stop` hook runner — fires when the assistant turn ends.
3
3
  *
4
- * Current scope:
5
- * • Drain `.cairn/events/` since the per-session marker; stamp the
6
- * poll cursor so the next Stop only sees newer events.
7
- * • Scan `.cairn/tasks/active/<id>/` for tasks that have a
8
- * tightened spec but no `attestation.yaml`; surface a reviewer-
9
- * spawn hint in additionalContext so main Claude can spawn the
10
- * reviewer subagent on the next assistant turn.
11
- * • Patch the per-session status.json `updated_at` (heartbeat).
4
+ * Per PLUGIN_ARCHITECTURE §10:
5
+ * • Drains `.cairn/events/` since the per-session marker.
6
+ * Scans `.cairn/tasks/active/<id>/` for tasks missing attestation.yaml.
7
+ * • Compares HEAD's last 5 commits against `.cairn/.attested-commits`;
8
+ * surfaces bypass hint for `--no-verify` commits.
9
+ * Patches per-session status.json `updated_at` (heartbeat).
12
10
  *
13
- * Future scope (steps 7–8 per PLUGIN_ARCHITECTURE §10):
14
- * Run sensors on staged + unstaged diff; surface findings inline.
15
- * Compare HEAD's last 5 commits against `.attested-commits` marker;
16
- * surface backfill prompt for `--no-verify` bypasses.
11
+ * When context to surface: emits `{ decision: "block", reason: "..." }` so
12
+ * Claude reads the hint and invokes cairn-attention on the next turn.
13
+ * When nothing: emits `{ continue: true }` and Claude stops normally.
17
14
  */
18
- import { existsSync, readdirSync, statSync } from "node:fs";
15
+ import { existsSync, readdirSync, readFileSync, statSync } from "node:fs";
19
16
  import { join } from "node:path";
17
+ import { readActiveTaskSummary } from "../../context/index.js";
20
18
  import { eventsSince, } from "../../events/index.js";
21
19
  import { renderBypassHint, scanBypassedCommits, } from "../bypass-detection.js";
22
20
  import { isDeferActive, readDeferState } from "../defer.js";
@@ -29,17 +27,16 @@ function isInitInProgress(repoRoot) {
29
27
  return existsSync(join(repoRoot, ".cairn", "init-state.json"));
30
28
  }
31
29
  /**
32
- * Cap the systemMessage that flows back to Claude Code. Both the
33
- * reviewer hint and the bypass hint can fire on the same Stop tick;
34
- * with many tasks/SHAs the combined render could blow past the
35
- * envelope budget. 4 KB is generous for two A/B/C strips with their
36
- * facts but small enough that overflow is structurally impossible.
30
+ * Cap the reason text that flows back to Claude Code via decision:block.
31
+ * Both the reviewer hint and the bypass hint can fire on the same Stop
32
+ * tick; 4 KB is generous for two A/B/C strips but small enough that
33
+ * overflow is structurally impossible.
37
34
  */
38
- const MAX_ADDITIONAL_CONTEXT_CHARS = 4_000;
39
- function clampAdditionalContext(body) {
40
- if (body.length <= MAX_ADDITIONAL_CONTEXT_CHARS)
35
+ const MAX_REASON_CHARS = 4_000;
36
+ function clampReason(body) {
37
+ if (body.length <= MAX_REASON_CHARS)
41
38
  return body;
42
- const head = body.slice(0, MAX_ADDITIONAL_CONTEXT_CHARS - 80);
39
+ const head = body.slice(0, MAX_REASON_CHARS - 80);
43
40
  return `${head}\n\n…(truncated; resolve via cairn-attention)`;
44
41
  }
45
42
  export async function runStopHook() {
@@ -53,7 +50,7 @@ export async function runStopHook() {
53
50
  let drained = [];
54
51
  let pendingReviews = [];
55
52
  let bypassed = [];
56
- let additionalContext = "";
53
+ let reason = "";
57
54
  if (repoRoot !== null && sessionId !== null && sessionId.length > 0) {
58
55
  try {
59
56
  const marker = readEventsMarker(repoRoot, sessionId);
@@ -93,7 +90,7 @@ export async function runStopHook() {
93
90
  warnings.push(`review_suppressed_until:${reviewDefer.deferred_at}`);
94
91
  }
95
92
  else {
96
- additionalContext = renderReviewerHint(pendingReviews);
93
+ reason = renderReviewerHint(pendingReviews);
97
94
  }
98
95
  }
99
96
  }
@@ -115,10 +112,7 @@ export async function runStopHook() {
115
112
  }
116
113
  else {
117
114
  const hint = renderBypassHint(bypassed);
118
- additionalContext =
119
- additionalContext.length > 0
120
- ? `${additionalContext}\n\n${hint}`
121
- : hint;
115
+ reason = reason.length > 0 ? `${reason}\n\n${hint}` : hint;
122
116
  }
123
117
  }
124
118
  }
@@ -127,20 +121,27 @@ export async function runStopHook() {
127
121
  }
128
122
  }
129
123
  try {
124
+ const active = readActiveTaskSummary(repoRoot);
130
125
  writeStatusJson(repoRoot, sessionId, {
131
126
  updated_at: new Date().toISOString(),
127
+ task_state: active?.taskState ?? "idle",
128
+ task_id: active?.taskId ?? null,
129
+ task_module: active?.taskModule ?? null,
130
+ bypass_count: bypassed.length,
132
131
  });
133
132
  }
134
133
  catch (err) {
135
134
  warnings.push(`status_heartbeat_failed: ${err instanceof Error ? err.message : String(err)}`);
136
135
  }
137
136
  }
138
- // Claude Code's Stop hook schema rejects hookSpecificOutput. Surface
139
- // text via the top-level systemMessage field; empty payload is fine.
140
- const out = { continue: true };
141
- if (additionalContext.length > 0) {
142
- out.systemMessage = clampAdditionalContext(additionalContext);
143
- }
137
+ // Stop hook uses decision:block+reason to inject context into Claude
138
+ // (Stop does not support hookSpecificOutput.additionalContext that
139
+ // field is silently ignored by Claude Code for Stop events). When
140
+ // reason is non-empty, blocking keeps the session alive so Claude
141
+ // reads the reason and acts on it (e.g. invokes cairn-attention).
142
+ const out = reason.length > 0
143
+ ? { decision: "block", reason: clampReason(reason) }
144
+ : { continue: true };
144
145
  emitShapeB(out);
145
146
  recordHookTelemetry({
146
147
  hook: "stop",
@@ -153,6 +154,8 @@ export async function runStopHook() {
153
154
  events_drained: drained.length,
154
155
  pending_reviews: pendingReviews.length,
155
156
  bypassed_commits: bypassed.length,
157
+ decision: reason.length > 0 ? "block" : "continue",
158
+ ...(reason.length > 0 ? { reason } : {}),
156
159
  },
157
160
  });
158
161
  }
@@ -165,6 +168,30 @@ export async function runStopHook() {
165
168
  * Older orphans are stale; the operator deals with them via attention
166
169
  * rather than spawning reviewers blindly.
167
170
  */
171
+ // Phases a task moves through. The reviewer-attestation prompt only
172
+ // fires for tasks that are explicitly ready for review — a fresh
173
+ // `running` task has work in flight, no reviewer needed yet.
174
+ const REVIEW_READY_PHASES = new Set(["ready_for_review", "awaiting_attestation"]);
175
+ function readTaskPhase(taskDir) {
176
+ const statusPath = join(taskDir, "status.yaml");
177
+ if (!existsSync(statusPath))
178
+ return null;
179
+ let raw;
180
+ try {
181
+ raw = readFileSync(statusPath, "utf8");
182
+ }
183
+ catch {
184
+ return null;
185
+ }
186
+ // Cheap line scan — `phase: <value>` at top-level. Avoid a full
187
+ // YAML parse (this runs on every Stop tick).
188
+ for (const line of raw.split(/\r?\n/)) {
189
+ const m = line.match(/^phase:\s*(\S+)/);
190
+ if (m && m[1] !== undefined)
191
+ return m[1].replace(/['"]/g, "");
192
+ }
193
+ return null;
194
+ }
168
195
  function scanPendingReviews(repoRoot) {
169
196
  const activeDir = join(repoRoot, ".cairn", "tasks", "active");
170
197
  if (!existsSync(activeDir))
@@ -189,6 +216,10 @@ function scanPendingReviews(repoRoot) {
189
216
  const attestation = join(taskDir, "attestation.yaml");
190
217
  if (existsSync(attestation))
191
218
  continue;
219
+ // Phase gate — `running` / `tightening` / etc. are not review-ready.
220
+ const phase = readTaskPhase(taskDir);
221
+ if (phase !== null && !REVIEW_READY_PHASES.has(phase))
222
+ continue;
192
223
  let mtime = 0;
193
224
  try {
194
225
  mtime = statSync(tightenedSpec).mtimeMs;
@@ -208,13 +239,13 @@ function scanPendingReviews(repoRoot) {
208
239
  function renderReviewerHint(pending) {
209
240
  const lines = [];
210
241
  const noun = pending.length === 1 ? "task" : "tasks";
211
- lines.push(`**Cairn — ${pending.length} ${noun} awaiting review attestation.**`);
242
+ lines.push(`## Cairn — ${pending.length} ${noun} awaiting review attestation`);
212
243
  lines.push("");
213
244
  for (const p of pending) {
214
245
  lines.push(`- \`${p.task_id}\``);
215
246
  }
216
247
  lines.push("");
217
- lines.push("`[a]` run review · `[b]` skip · `[c]` defer 24h");
248
+ lines.push("Invoke the `cairn-attention` skill on the next turn so the operator can pick run review / skip / defer through `AskUserQuestion`.");
218
249
  return lines.join("\n");
219
250
  }
220
251
  //# sourceMappingURL=stop.js.map