@isaacriehm/cairn-core 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (336) 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 +3 -11
  220. package/dist/session-start/build.js +55 -34
  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/dist/context/checkpoint.d.ts +0 -11
  255. package/dist/context/checkpoint.js +0 -30
  256. package/dist/context/checkpoint.js.map +0 -1
  257. package/dist/decision-capture/capture.d.ts +0 -57
  258. package/dist/decision-capture/capture.js +0 -186
  259. package/dist/decision-capture/capture.js.map +0 -1
  260. package/dist/decision-capture/extractor.d.ts +0 -20
  261. package/dist/decision-capture/extractor.js +0 -103
  262. package/dist/decision-capture/extractor.js.map +0 -1
  263. package/dist/decision-capture/prompt.d.ts +0 -15
  264. package/dist/decision-capture/prompt.js +0 -68
  265. package/dist/decision-capture/prompt.js.map +0 -1
  266. package/dist/decision-capture/refinement-prompt.d.ts +0 -25
  267. package/dist/decision-capture/refinement-prompt.js +0 -146
  268. package/dist/decision-capture/refinement-prompt.js.map +0 -1
  269. package/dist/decision-capture/refinement-schema.d.ts +0 -52
  270. package/dist/decision-capture/refinement-schema.js +0 -61
  271. package/dist/decision-capture/refinement-schema.js.map +0 -1
  272. package/dist/decision-capture/refinement.d.ts +0 -60
  273. package/dist/decision-capture/refinement.js +0 -439
  274. package/dist/decision-capture/refinement.js.map +0 -1
  275. package/dist/decision-capture/schema.d.ts +0 -70
  276. package/dist/decision-capture/schema.js +0 -71
  277. package/dist/decision-capture/schema.js.map +0 -1
  278. package/dist/decision-capture/types.d.ts +0 -201
  279. package/dist/decision-capture/types.js +0 -20
  280. package/dist/decision-capture/types.js.map +0 -1
  281. package/dist/decision-capture/writer.d.ts +0 -90
  282. package/dist/decision-capture/writer.js +0 -267
  283. package/dist/decision-capture/writer.js.map +0 -1
  284. package/dist/frontend-types.d.ts +0 -243
  285. package/dist/frontend-types.js +0 -15
  286. package/dist/frontend-types.js.map +0 -1
  287. package/dist/hooks/index.d.ts +0 -14
  288. package/dist/hooks/index.js +0 -14
  289. package/dist/hooks/index.js.map +0 -1
  290. package/dist/inbox.d.ts +0 -17
  291. package/dist/inbox.js +0 -30
  292. package/dist/inbox.js.map +0 -1
  293. package/dist/mcp/tools/append-run-note.d.ts +0 -18
  294. package/dist/mcp/tools/append-run-note.js +0 -54
  295. package/dist/mcp/tools/append-run-note.js.map +0 -1
  296. package/dist/mcp/tools/append.d.ts +0 -8
  297. package/dist/mcp/tools/append.js +0 -37
  298. package/dist/mcp/tools/append.js.map +0 -1
  299. package/dist/mcp/tools/ask-operator.d.ts +0 -34
  300. package/dist/mcp/tools/ask-operator.js +0 -97
  301. package/dist/mcp/tools/ask-operator.js.map +0 -1
  302. package/dist/mcp/tools/drop-task.d.ts +0 -12
  303. package/dist/mcp/tools/drop-task.js +0 -68
  304. package/dist/mcp/tools/drop-task.js.map +0 -1
  305. package/dist/mcp/tools/record-run-event.d.ts +0 -10
  306. package/dist/mcp/tools/record-run-event.js +0 -32
  307. package/dist/mcp/tools/record-run-event.js.map +0 -1
  308. package/dist/prompt.d.ts +0 -19
  309. package/dist/prompt.js +0 -50
  310. package/dist/prompt.js.map +0 -1
  311. package/dist/tier0/classify.d.ts +0 -10
  312. package/dist/tier0/classify.js +0 -110
  313. package/dist/tier0/classify.js.map +0 -1
  314. package/dist/tier0/index.d.ts +0 -2
  315. package/dist/tier0/index.js +0 -2
  316. package/dist/tier0/index.js.map +0 -1
  317. package/dist/tier0/types.d.ts +0 -24
  318. package/dist/tier0/types.js +0 -9
  319. package/dist/tier0/types.js.map +0 -1
  320. package/dist/tightener/index.d.ts +0 -4
  321. package/dist/tightener/index.js +0 -4
  322. package/dist/tightener/index.js.map +0 -1
  323. package/dist/tightener/prompt.d.ts +0 -3
  324. package/dist/tightener/prompt.js +0 -67
  325. package/dist/tightener/prompt.js.map +0 -1
  326. package/dist/tightener/schema.d.ts +0 -68
  327. package/dist/tightener/schema.js +0 -44
  328. package/dist/tightener/schema.js.map +0 -1
  329. package/dist/tightener/tighten.d.ts +0 -2
  330. package/dist/tightener/tighten.js +0 -66
  331. package/dist/tightener/tighten.js.map +0 -1
  332. package/dist/tightener/types.d.ts +0 -74
  333. package/dist/tightener/types.js +0 -6
  334. package/dist/tightener/types.js.map +0 -1
  335. package/templates/.claude/settings.json +0 -57
  336. package/templates/.mcp.json +0 -8
@@ -1,14 +1,13 @@
1
1
  # Trust policy.
2
2
  #
3
- # Per-command trust posture (WORKFLOW_GUIDE.md §3 + §8). Three classes:
3
+ # Per-command trust posture. Three classes:
4
4
  #
5
5
  # read_only no friction — runs without any operator confirmation
6
6
  # write_creating light friction — single-tap reaction or button confirm
7
7
  # configuration heavy friction — operator must edit a config file
8
8
  #
9
- # Auto-merge classes (PRIMER §12.2) live in workflow.md trust_posture_defaults
10
- # and the project block; this file governs operator INTERACTION friction, not
11
- # git-push friction.
9
+ # Auto-merge classes live in workflow.md trust_posture_defaults and the project
10
+ # block; this file governs operator INTERACTION friction, not git-push friction.
12
11
 
13
12
  version: 1
14
13
 
@@ -18,12 +17,6 @@ commands:
18
17
  - id: status
19
18
  posture: read_only
20
19
  surface: slash
21
- - id: queue
22
- posture: read_only
23
- surface: slash
24
- - id: eval
25
- posture: read_only
26
- surface: slash
27
20
  - id: agent_list
28
21
  posture: read_only
29
22
  surface: slash
@@ -32,19 +25,6 @@ commands:
32
25
  surface: slash
33
26
 
34
27
  # ── Write-creating — single-tap confirm ────────────────────────────────
35
- - id: task
36
- posture: write_creating
37
- surface: slash
38
- confirmation: none # spec tightener handles ambiguity downstream
39
- - id: run
40
- posture: write_creating
41
- surface: slash
42
- confirmation: reaction_if_outside_pilot_scope
43
- timeout_seconds: 30
44
- - id: oops
45
- posture: write_creating
46
- surface: slash
47
- confirmation: per_step_inline_reaction
48
28
  - id: direction
49
29
  posture: write_creating
50
30
  surface: slash
@@ -60,10 +40,6 @@ commands:
60
40
  - id: ship_anyway
61
41
  posture: write_creating_logged_override
62
42
  surface: slash
63
- confirmation: none # logged for audit; no friction
64
- - id: halt
65
- posture: write_creating
66
- surface: slash
67
43
  confirmation: none
68
44
 
69
45
  # ── Configuration — high-friction by design ─────────────────────────────
@@ -76,12 +52,6 @@ commands:
76
52
  - id: change_pilot_module
77
53
  posture: configuration
78
54
  surface: workflow_yaml_edit
79
- - id: change_collaboration_mode
80
- posture: configuration
81
- surface: workflow_yaml_edit
82
- - id: register_frontend_adapter
83
- posture: configuration
84
- surface: workflow_yaml_edit
85
55
  - id: change_off_limits
86
56
  posture: configuration
87
57
  surface: workflow_yaml_edit
@@ -91,5 +61,3 @@ notification_routing:
91
61
  errors: all_registered_adapters
92
62
  completions: all_registered_adapters
93
63
  paged_events: all_registered_adapters
94
- uat_approval_request: first_registered_adapter
95
- voice_capable_only: discord
@@ -7,98 +7,15 @@ verified-at: 2026-05-02T13:19:00Z
7
7
  source-commits:
8
8
  - manual
9
9
 
10
- # ──────────────────────────────────────────────────────────────────────────────
11
- # Top-level (project-agnostic) configuration.
12
- # This block is read by Cairn package code; values here are universal defaults.
13
- # Project-specific overrides go in the `<project_name>:` extension block below.
14
- # ──────────────────────────────────────────────────────────────────────────────
15
-
16
- collaboration_mode: solo # solo | team — see FILESYSTEM_LAYOUT.md §12
17
- concurrency: 1 # single-task FIFO; do not change without re-reviewing PRIMER §5.4
18
-
19
- frontend_adapters:
20
- - discord # discord | notion | cli | web
21
- # operator may register additional adapters; first-registered owns approval-request routing
22
-
23
- tier_assignment:
24
- intent_classifier: 0 # 0 = Ollama; 1 = Haiku 4.5; 2 = Sonnet 4.6; 3 = Opus 4.7
25
- spec_tightener_short: 1
26
- spec_tightener_long: 2
27
- decision_extractor: 1
28
- attestation_check: 0 # mechanical regex; LLM only on ambiguity
29
- implementer_default: 2
30
- implementer_high_stakes: 3
31
- reviewer: 2 # same model as implementer; context isolation does the work
32
- uat_runner: 2
33
- uat_question_agent: 1
34
- backprop_author: 2
35
- garbage_collector: 1
36
- init_mapper: 2 # one-time at adoption; OK to spend tokens
37
-
38
- # Tier-3 (Opus) auto-escalation policy — per Codex audit Finding #9.
39
- escalation:
40
- tier_3_requires_explicit_approval: true
41
- max_attempts_per_task: 3 # halt + page operator after this many retries
42
- pre_run_cost_projection: true # block dispatch on > 1% daily plan-headroom estimate
43
-
44
- # Run lifecycle thresholds.
45
- timeouts:
46
- stall_event_silence_seconds: 300 # no event in 5 min → kill + retry
47
- uat_decision_seconds: 86400 # 24h before auto-deny
48
- approval_dialog_seconds: 30 # 🟢/🔴 confirm window
49
-
50
- # Anthropic plan-quota self-throttle (per WORKFLOW_GUIDE §2.2).
51
- plan_quota_floor_percent: 20 # below this remaining → Cairn self-throttles to Tier 1 only
52
-
53
- # Spec-tightener gate.
54
- spec_quality_floor: 7 # quality_score < floor → operator dialog OR /ship-anyway
55
-
56
- # Dialog rules.
57
- operator_dialog_max_questions_per_turn: 2 # Codex audit Finding #7 — collapse 3+ to single tightened proposal
58
-
59
- # Trust posture defaults — overridden in project block as needed.
60
- trust_posture_defaults:
61
- safe_class_auto_merge: true
62
- code_class_auto_merge: false
63
- high_stakes_auto_merge: false
64
-
65
- # Decision capture defaults.
66
- decision_extractor:
67
- auto_propose_threshold_confidence: 0.7
68
- require_assertions_at_confirm: true
69
-
70
- # Whisper / voice defaults.
71
- voice:
72
- enabled: true
73
- model: large-v3-turbo
74
- quantization: q5_0
75
- language: en
76
- confidence_floor: 0.85 # below → operator confirm-heard prompt
77
- audio_persistence: forbidden # never write audio to disk
78
-
79
- # Local mirror checkout (Cairn operates here, never user's working tree).
80
- mirror:
81
- base_path: "~/.local/cairn/repos" # one subdir per adopted project
82
- state_path: "~/.local/cairn/state" # PIDs, sockets, runtime
83
- models_path: "~/.local/cairn/models"
84
-
85
- # Retention policy.
86
- retention_days:
87
- runs: 90
88
- transcripts: 90
89
- inbox: 30
90
-
91
10
  # ──────────────────────────────────────────────────────────────────────────────
92
11
  # Project-extension placeholder.
93
12
  #
94
- # At adoption (`npx @isaacriehm/cairn init`), the init script REPLACES this
95
- # block with a real key matching the adopting project's `package.json name`
96
- # (or directory name, lowercased, with non-alphanumerics → underscores).
13
+ # At adoption, the init script REPLACES this block with a real key matching
14
+ # the adopting project's `package.json name` (or directory name, lowercased,
15
+ # with non-alphanumerics → underscores).
97
16
  #
98
17
  # Cairn package code reads this block by `Object.keys()` lookup — never by
99
- # hardcoded project name (per L50 + operator-S1).
100
- #
101
- # Example below uses `<project_name>` as the placeholder key.
18
+ # hardcoded project name.
102
19
  # ──────────────────────────────────────────────────────────────────────────────
103
20
 
104
21
  <project_name>:
@@ -115,116 +32,18 @@ retention_days:
115
32
  safe_class_auto_merge: true
116
33
  code_class_auto_merge: false
117
34
  high_stakes_auto_merge: false
118
- budget_metric:
119
- primary: claude_code_subscription_quota
120
- secondary_dollar_record_only: true
121
- pre_run_projection: true
122
- tier_3_requires_explicit_approval: true
123
- max_attempts_per_task: 3
124
35
 
125
36
  ---
126
37
 
127
- # Per-task prompt template
128
-
129
- Below is the rendered-prompt body the orchestrator injects into every agent run. The template engine substitutes `{{var}}` tokens with run-scoped values resolved at dispatch time.
130
-
131
- ## Identity
132
-
133
- You are running inside Cairn as agent role `{{agent_role}}` for project `{{project_name}}`. Your run-id is `{{run_id}}`. The mirror checkout is at `{{mirror_path}}` pinned to `origin/main` SHA `{{sha_pin}}`. Do not modify files outside the mirror. Do not switch branches.
134
-
135
- ## Task
136
-
137
- {{tightened_spec_body}}
138
-
139
- ## Acceptance criteria
140
-
141
- {{#each acceptance_criteria}}
142
- - {{this}}
143
- {{/each}}
144
-
145
- ## Decisions in scope
146
-
147
- The following accepted decisions bind your work. You MUST NOT contradict them. Their machine-readable assertions will be evaluated against your diff.
148
-
149
- {{#each in_scope_decisions}}
150
- - **{{id}}** — {{title}} ({{scope_summary}})
151
- {{/each}}
152
-
153
- If none, this is empty.
154
-
155
- ## Invariants in scope
156
-
157
- The following §V invariants bind your work. They have sensors that will block your commit if violated.
158
-
159
- {{#each in_scope_invariants}}
160
- - **{{id}}** — {{title}}
161
- {{/each}}
162
-
163
- If none, this is empty.
164
-
165
- ## Off-limits paths
166
-
167
- You MUST NOT modify any of these:
168
-
169
- {{#each off_limits}}
170
- - {{this}}
171
- {{/each}}
172
-
173
- ## Sensors that will run
174
-
175
- After your turn, these sensors will execute against your diff. Their failure messages are remediation prompts — read them and retry.
176
-
177
- {{#each scoped_sensors}}
178
- - `{{id}}` — {{description}}
179
- {{/each}}
180
-
181
- ## Honesty contract (Layer B)
182
-
183
- When you emit your final response, include a fenced YAML block titled `attestation` with these fields filled:
184
-
185
- ```yaml
186
- attestation:
187
- delivered:
188
- - symbol: "<name>"
189
- path: "<path>"
190
- behavior: full | partial | scaffolded
191
- sensors_passed: [<sensor_ids>]
192
- deferred:
193
- - symbol: "<name>"
194
- reason: "<one line>"
195
- known_limitations: []
196
- todos_introduced: 0
197
- stubs_introduced: 0
198
- files_touched: ["<paths>"]
199
- ```
200
-
201
- This will be cross-checked against your actual diff. Any mismatch fails the run.
202
-
203
- ## Tools available
204
-
205
- You have the standard Read/Edit/Write/Bash/Glob/Grep tool surface. You also have the Cairn MCP tools — use these for grounding rather than re-reading large files:
206
-
207
- - `cairn_decision_get(id)` — full ADR + assertions
208
- - `cairn_decisions_in_scope(globs[])` — IDs whose scope overlaps your target
209
- - `cairn_invariant_get(id)` — §V invariant + linked sensor
210
- - `cairn_canonical_for_topic(topic)` — canonical doc path + verified-at
211
- - `cairn_query_history(scope, question)` — the ONLY way to read `.archive/`
212
-
213
- ## Constraints
214
-
215
- - Hard cutovers; no backwards-compat shims, no deprecation notices, no transition regex.
216
- - No `[STALE]` banners — stale docs get archived, not labeled.
217
- - No model-issued confidence scores in user-visible writes.
218
- - No commit, no push — Cairn handles git after sensor + reviewer + UAT pass.
219
-
220
- ## Stop conditions
38
+ # Workflow policy
221
39
 
222
- Stop when the acceptance criteria are met AND the attestation block is complete AND no in-scope assertion or invariant is contradicted.
40
+ This file is the on-disk surface for the **project-extension block** that
41
+ `cairn-core/src/sensors/runner.ts` reads (via `Object.keys()` lookup) and
42
+ that the Phase-3 init mapper patches with discovered globs and sensors.
223
43
 
224
- If you cannot proceed (genuine ambiguity, missing context, contradicting decisions), emit a `blocked_by` field instead of a partial diff:
44
+ The plugin-era cairn does NOT use this file as a per-task prompt template
45
+ — each task's spec lives at `.cairn/tasks/active/<task_id>/spec.tightened.md`
46
+ and is written directly by the `cairn-direction` skill. The reviewer
47
+ subagent reads that spec; nothing renders this markdown body.
225
48
 
226
- ```yaml
227
- blocked_by:
228
- reason: "<one line>"
229
- needed_from_operator: "<one line>"
230
- ```
49
+ If you're looking for the daily flow, see `docs/SYSTEM_OVERVIEW.md` §4.
@@ -3,7 +3,7 @@
3
3
  #
4
4
  # Spec: PLUGIN_ARCHITECTURE §17 Layer 1.
5
5
  #
6
- # Validates DEC/TSK/§V citations in the commit message body when the
6
+ # Validates DEC/TSK/§INV citations in the commit message body when the
7
7
  # project's commit policy requires them. The Cairn CLI owns the policy
8
8
  # (sensors.yaml `commit_msg_policy`) so the hook stays a thin shim.
9
9
 
@@ -4,9 +4,7 @@
4
4
  # the authoritative path for a topic — no fuzzy match, no hallucinated paths.
5
5
  #
6
6
  # Adopters extend this registry as their codebase grows. Unknown topics
7
- # return TOPIC_NOT_REGISTERED — agents must NOT invent topics. Add via
8
- # /direction confirmation when an operator references a recurring topic
9
- # the Cairn agents should know about.
7
+ # return TOPIC_NOT_REGISTERED — agents must NOT invent topics.
10
8
  #
11
9
  # Below is a baseline that ships with `cairn init` so every adoption
12
10
  # has a non-empty registry on day one. Trim or extend per project.
@@ -22,33 +20,12 @@ topics:
22
20
  - topic: cairn-architecture
23
21
  canonical_path: docs/ARCHITECTURE.md
24
22
  audience: dual
25
- - topic: cairn-primer
26
- canonical_path: docs/PRIMER.md
27
- audience: dual
28
23
  - topic: cairn-mcp-surface
29
24
  canonical_path: docs/MCP_SURFACE.md
30
25
  audience: dual
31
26
  - topic: cairn-filesystem-layout
32
27
  canonical_path: docs/FILESYSTEM_LAYOUT.md
33
28
  audience: dual
34
- - topic: cairn-workflow-guide
35
- canonical_path: docs/WORKFLOW_GUIDE.md
36
- audience: dual
37
- - topic: cairn-uat-pipeline
38
- canonical_path: docs/UAT_PIPELINE.md
39
- audience: dual
40
- - topic: cairn-sessionstart-spec
41
- canonical_path: docs/SESSIONSTART_SPEC.md
42
- audience: dual
43
- - topic: two-zone-separation
44
- canonical_path: docs/PRIMER.md
45
- audience: dual
46
- - topic: backprop-protocol
47
- canonical_path: docs/PRIMER.md
48
- audience: dual
49
- - topic: garbage-collection-cadence
50
- canonical_path: docs/PRIMER.md
51
- audience: dual
52
- - topic: anti-patterns
53
- canonical_path: docs/PRIMER.md
29
+ - topic: cairn-plugin-architecture
30
+ canonical_path: docs/PLUGIN_ARCHITECTURE.md
54
31
  audience: dual
@@ -1,3 +1,2 @@
1
1
  # Blessed implementations for security-sensitive patterns.
2
- # See DOCS_SPEC.md §3.5 for shape.
3
2
  snippets: []
@@ -1,16 +1,13 @@
1
1
  # Ground manifest — read-only for agents.
2
2
  #
3
- # Continuously regenerated by `cairn watch` (the grounding daemon) on filesystem
4
- # events. Each entry is one canonical-zone file with its hash, classification,
5
- # audience, verified-at, and (for generated artifacts) the source + generator.
3
+ # Regenerated by the GC sweep and post-commit hook. Each entry is one
4
+ # canonical-zone file with its hash, classification, audience, verified-at,
5
+ # and (for generated artifacts) the source + generator.
6
6
  #
7
- # Agents query the MCP tool surface, NOT this file directly. The daemon is the
8
- # only writer. Modifying this file by hand is meaningless — the daemon overwrites
9
- # on next event.
7
+ # Agents query the MCP tool surface, NOT this file directly.
10
8
  #
11
- # Layout per FILESYSTEM_LAYOUT.md §8.
9
+ # Layout per docs/FILESYSTEM_LAYOUT.md §8.
12
10
 
13
11
  version: 1
14
12
  generated: 2026-05-02T13:19:00Z
15
- generator: cairn-watch
16
13
  files: []
@@ -1,4 +1,3 @@
1
1
  # Product personas — who this is for. Read at every SessionStart.
2
- # See DOCS_SPEC.md §3.4 for shape.
3
2
  status: draft
4
3
  personas: []
@@ -1,11 +0,0 @@
1
- /**
2
- * Checkpoint writer — emits a snapshot of the same handoff block content
3
- * to `.cairn/tasks/active/<taskId>/checkpoint-<ISO>.md`. Invoked from the
4
- * Stop hook and by the cairn-direction skill before subagent dispatch.
5
- *
6
- * Spec: docs/CONTEXT_CONTINUITY_SPEC.md §2.2.
7
- *
8
- * Throws if the task directory is missing — callers should fail loudly when
9
- * pointed at a stale taskId. Successful writes return the absolute path.
10
- */
11
- export declare function writeCheckpoint(repoRoot: string, taskId: string, _runId: string): Promise<string>;
@@ -1,30 +0,0 @@
1
- /**
2
- * Checkpoint writer — emits a snapshot of the same handoff block content
3
- * to `.cairn/tasks/active/<taskId>/checkpoint-<ISO>.md`. Invoked from the
4
- * Stop hook and by the cairn-direction skill before subagent dispatch.
5
- *
6
- * Spec: docs/CONTEXT_CONTINUITY_SPEC.md §2.2.
7
- *
8
- * Throws if the task directory is missing — callers should fail loudly when
9
- * pointed at a stale taskId. Successful writes return the absolute path.
10
- */
11
- import { existsSync, mkdirSync, writeFileSync } from "node:fs";
12
- import { join } from "node:path";
13
- import { buildHandoffBlock } from "./handoff-builder.js";
14
- export async function writeCheckpoint(repoRoot, taskId, _runId) {
15
- const taskDir = join(repoRoot, ".cairn", "tasks", "active", taskId);
16
- if (!existsSync(taskDir)) {
17
- throw new Error(`writeCheckpoint: task directory not found: ${taskDir}`);
18
- }
19
- const block = await buildHandoffBlock(repoRoot);
20
- const content = block === null ? "(no active run handoff to capture)\n" : block;
21
- // Ensure dir exists (defensive — `existsSync` above guarantees parent, but
22
- // mkdir recursive is cheap and safe).
23
- mkdirSync(taskDir, { recursive: true });
24
- const stamp = new Date().toISOString().replace(/:/g, "-");
25
- const filename = `checkpoint-${stamp}.md`;
26
- const abs = join(taskDir, filename);
27
- writeFileSync(abs, content, "utf8");
28
- return abs;
29
- }
30
- //# sourceMappingURL=checkpoint.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"checkpoint.js","sourceRoot":"","sources":["../../src/context/checkpoint.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC/D,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,QAAgB,EAChB,MAAc,EACd,MAAc;IAEd,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACpE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,8CAA8C,OAAO,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,KAAK,CAAC;IAEhF,2EAA2E;IAC3E,sCAAsC;IACtC,SAAS,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAExC,MAAM,KAAK,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,cAAc,KAAK,KAAK,CAAC;IAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACpC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -1,57 +0,0 @@
1
- /**
2
- * runDecisionCapture — orchestrates the full flow:
3
- *
4
- * raw_text → extract → write draft → adapter dialog 🟢/🟡/🔴
5
- * ├── 🟢 commit → acceptDraft → ledger
6
- * ├── 🟡 edit → leave draft + return correction text
7
- * └── 🔴 reject → rejectDraft → no record
8
- *
9
- * The dialog is supplied by the caller (typically a FrontendAdapter's
10
- * requestDialog) so this entry point works equally well in tests with the
11
- * stub adapter, in CLI with a TTY prompt, and in Discord with the real
12
- * adapter.
13
- */
14
- import type { FrontendAdapter } from "../frontend-types.js";
15
- import type { ClaudeTier } from "../claude/index.js";
16
- import { runDecisionExtractor } from "./extractor.js";
17
- import { proposeStrictAssertions } from "./refinement.js";
18
- import type { DecisionCaptureResult } from "./types.js";
19
- export interface RunDecisionCaptureArgs {
20
- /** Repo root for the mirror checkout. */
21
- repoRoot: string;
22
- /** Raw operator text. */
23
- rawText: string;
24
- /** Operator id. */
25
- authorId: string;
26
- /** Source — `discord:slash:/direction` or `discord:free_text` etc. */
27
- source: string;
28
- /** ISO timestamp the message was received. Default = now. */
29
- receivedAt?: string;
30
- /** Tier for the extractor. Default = haiku. */
31
- tier?: ClaudeTier;
32
- /** Channel id to thread the confirm dialog through. */
33
- channelId?: string;
34
- /** Adapter that owns the confirm dialog. */
35
- adapter: FrontendAdapter;
36
- /** Confirm-dialog timeout. Default 60_000 ms. */
37
- confirmTimeoutMs?: number;
38
- /**
39
- * Optional: override the extractor entry point. Smokes inject a stub so
40
- * the smoke runs without burning claude quota when only the
41
- * draft/confirm/ledger flow needs verifying.
42
- */
43
- extractorOverride?: typeof runDecisionExtractor;
44
- /**
45
- * Skip the post-commit refinement step. Defaults to false. The
46
- * orchestrator's `bypassRefinement` mirrors this for production runs;
47
- * smokes that don't care about refinement can flip it on.
48
- */
49
- bypassRefinement?: boolean;
50
- /** Tier for the refinement proposer. Default = haiku. */
51
- refinementTier?: ClaudeTier;
52
- /** Refinement dialog timeout. Default 60_000 ms. */
53
- refinementDialogTimeoutMs?: number;
54
- /** Smokes inject a stub proposer to avoid burning claude quota. */
55
- refinementProposerOverride?: typeof proposeStrictAssertions;
56
- }
57
- export declare function runDecisionCapture(args: RunDecisionCaptureArgs): Promise<DecisionCaptureResult>;