@isaacriehm/cairn 0.1.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 (562) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +37 -0
  3. package/dist/.tsbuildinfo +1 -0
  4. package/dist/backprop/id.d.ts +14 -0
  5. package/dist/backprop/id.js +40 -0
  6. package/dist/backprop/id.js.map +1 -0
  7. package/dist/backprop/index.d.ts +23 -0
  8. package/dist/backprop/index.js +21 -0
  9. package/dist/backprop/index.js.map +1 -0
  10. package/dist/backprop/prompt.d.ts +16 -0
  11. package/dist/backprop/prompt.js +101 -0
  12. package/dist/backprop/prompt.js.map +1 -0
  13. package/dist/backprop/runner.d.ts +18 -0
  14. package/dist/backprop/runner.js +95 -0
  15. package/dist/backprop/runner.js.map +1 -0
  16. package/dist/backprop/schema.d.ts +61 -0
  17. package/dist/backprop/schema.js +55 -0
  18. package/dist/backprop/schema.js.map +1 -0
  19. package/dist/backprop/types.d.ts +101 -0
  20. package/dist/backprop/types.js +24 -0
  21. package/dist/backprop/types.js.map +1 -0
  22. package/dist/backprop/writer.d.ts +27 -0
  23. package/dist/backprop/writer.js +301 -0
  24. package/dist/backprop/writer.js.map +1 -0
  25. package/dist/claude/error.d.ts +33 -0
  26. package/dist/claude/error.js +58 -0
  27. package/dist/claude/error.js.map +1 -0
  28. package/dist/claude/index.d.ts +3 -0
  29. package/dist/claude/index.js +3 -0
  30. package/dist/claude/index.js.map +1 -0
  31. package/dist/claude/runner.d.ts +11 -0
  32. package/dist/claude/runner.js +132 -0
  33. package/dist/claude/runner.js.map +1 -0
  34. package/dist/claude/types.d.ts +52 -0
  35. package/dist/claude/types.js +14 -0
  36. package/dist/claude/types.js.map +1 -0
  37. package/dist/cli/attention.d.ts +11 -0
  38. package/dist/cli/attention.js +234 -0
  39. package/dist/cli/attention.js.map +1 -0
  40. package/dist/cli/daemon.d.ts +54 -0
  41. package/dist/cli/daemon.js +351 -0
  42. package/dist/cli/daemon.js.map +1 -0
  43. package/dist/cli/doctor.d.ts +8 -0
  44. package/dist/cli/doctor.js +116 -0
  45. package/dist/cli/doctor.js.map +1 -0
  46. package/dist/cli/gc.d.ts +15 -0
  47. package/dist/cli/gc.js +139 -0
  48. package/dist/cli/gc.js.map +1 -0
  49. package/dist/cli/hook.d.ts +18 -0
  50. package/dist/cli/hook.js +57 -0
  51. package/dist/cli/hook.js.map +1 -0
  52. package/dist/cli/index.d.ts +2 -0
  53. package/dist/cli/index.js +127 -0
  54. package/dist/cli/index.js.map +1 -0
  55. package/dist/cli/init.d.ts +1 -0
  56. package/dist/cli/init.js +77 -0
  57. package/dist/cli/init.js.map +1 -0
  58. package/dist/cli/install.d.ts +52 -0
  59. package/dist/cli/install.js +308 -0
  60. package/dist/cli/install.js.map +1 -0
  61. package/dist/cli/join.d.ts +1 -0
  62. package/dist/cli/join.js +84 -0
  63. package/dist/cli/join.js.map +1 -0
  64. package/dist/cli/mcp.d.ts +1 -0
  65. package/dist/cli/mcp.js +62 -0
  66. package/dist/cli/mcp.js.map +1 -0
  67. package/dist/cli/mirror.d.ts +1 -0
  68. package/dist/cli/mirror.js +97 -0
  69. package/dist/cli/mirror.js.map +1 -0
  70. package/dist/cli/run.d.ts +1 -0
  71. package/dist/cli/run.js +174 -0
  72. package/dist/cli/run.js.map +1 -0
  73. package/dist/cli/scope.d.ts +8 -0
  74. package/dist/cli/scope.js +65 -0
  75. package/dist/cli/scope.js.map +1 -0
  76. package/dist/cli/task.d.ts +18 -0
  77. package/dist/cli/task.js +137 -0
  78. package/dist/cli/task.js.map +1 -0
  79. package/dist/cli/watch.d.ts +1 -0
  80. package/dist/cli/watch.js +73 -0
  81. package/dist/cli/watch.js.map +1 -0
  82. package/dist/decision-capture/capture.d.ts +57 -0
  83. package/dist/decision-capture/capture.js +186 -0
  84. package/dist/decision-capture/capture.js.map +1 -0
  85. package/dist/decision-capture/extractor.d.ts +20 -0
  86. package/dist/decision-capture/extractor.js +103 -0
  87. package/dist/decision-capture/extractor.js.map +1 -0
  88. package/dist/decision-capture/id.d.ts +14 -0
  89. package/dist/decision-capture/id.js +44 -0
  90. package/dist/decision-capture/id.js.map +1 -0
  91. package/dist/decision-capture/index.d.ts +25 -0
  92. package/dist/decision-capture/index.js +21 -0
  93. package/dist/decision-capture/index.js.map +1 -0
  94. package/dist/decision-capture/prompt.d.ts +15 -0
  95. package/dist/decision-capture/prompt.js +68 -0
  96. package/dist/decision-capture/prompt.js.map +1 -0
  97. package/dist/decision-capture/refinement-prompt.d.ts +25 -0
  98. package/dist/decision-capture/refinement-prompt.js +146 -0
  99. package/dist/decision-capture/refinement-prompt.js.map +1 -0
  100. package/dist/decision-capture/refinement-schema.d.ts +52 -0
  101. package/dist/decision-capture/refinement-schema.js +61 -0
  102. package/dist/decision-capture/refinement-schema.js.map +1 -0
  103. package/dist/decision-capture/refinement.d.ts +60 -0
  104. package/dist/decision-capture/refinement.js +439 -0
  105. package/dist/decision-capture/refinement.js.map +1 -0
  106. package/dist/decision-capture/schema.d.ts +70 -0
  107. package/dist/decision-capture/schema.js +71 -0
  108. package/dist/decision-capture/schema.js.map +1 -0
  109. package/dist/decision-capture/types.d.ts +201 -0
  110. package/dist/decision-capture/types.js +20 -0
  111. package/dist/decision-capture/types.js.map +1 -0
  112. package/dist/decision-capture/writer.d.ts +90 -0
  113. package/dist/decision-capture/writer.js +267 -0
  114. package/dist/decision-capture/writer.js.map +1 -0
  115. package/dist/frontend/discord/acl.d.ts +6 -0
  116. package/dist/frontend/discord/acl.js +19 -0
  117. package/dist/frontend/discord/acl.js.map +1 -0
  118. package/dist/frontend/discord/channels.d.ts +29 -0
  119. package/dist/frontend/discord/channels.js +58 -0
  120. package/dist/frontend/discord/channels.js.map +1 -0
  121. package/dist/frontend/discord/classifier.d.ts +16 -0
  122. package/dist/frontend/discord/classifier.js +29 -0
  123. package/dist/frontend/discord/classifier.js.map +1 -0
  124. package/dist/frontend/discord/index.d.ts +118 -0
  125. package/dist/frontend/discord/index.js +1104 -0
  126. package/dist/frontend/discord/index.js.map +1 -0
  127. package/dist/frontend/discord/slash.d.ts +18 -0
  128. package/dist/frontend/discord/slash.js +90 -0
  129. package/dist/frontend/discord/slash.js.map +1 -0
  130. package/dist/frontend/inbox.d.ts +17 -0
  131. package/dist/frontend/inbox.js +30 -0
  132. package/dist/frontend/inbox.js.map +1 -0
  133. package/dist/frontend/index.d.ts +8 -0
  134. package/dist/frontend/index.js +6 -0
  135. package/dist/frontend/index.js.map +1 -0
  136. package/dist/frontend/stub/index.d.ts +58 -0
  137. package/dist/frontend/stub/index.js +144 -0
  138. package/dist/frontend/stub/index.js.map +1 -0
  139. package/dist/frontend/types.d.ts +247 -0
  140. package/dist/frontend/types.js +15 -0
  141. package/dist/frontend/types.js.map +1 -0
  142. package/dist/gc/apply.d.ts +26 -0
  143. package/dist/gc/apply.js +48 -0
  144. package/dist/gc/apply.js.map +1 -0
  145. package/dist/gc/canary.d.ts +42 -0
  146. package/dist/gc/canary.js +134 -0
  147. package/dist/gc/canary.js.map +1 -0
  148. package/dist/gc/classify.d.ts +25 -0
  149. package/dist/gc/classify.js +89 -0
  150. package/dist/gc/classify.js.map +1 -0
  151. package/dist/gc/doc-gardening.d.ts +29 -0
  152. package/dist/gc/doc-gardening.js +146 -0
  153. package/dist/gc/doc-gardening.js.map +1 -0
  154. package/dist/gc/frontmatter.d.ts +35 -0
  155. package/dist/gc/frontmatter.js +111 -0
  156. package/dist/gc/frontmatter.js.map +1 -0
  157. package/dist/gc/generator-drift.d.ts +28 -0
  158. package/dist/gc/generator-drift.js +53 -0
  159. package/dist/gc/generator-drift.js.map +1 -0
  160. package/dist/gc/index.d.ts +35 -0
  161. package/dist/gc/index.js +26 -0
  162. package/dist/gc/index.js.map +1 -0
  163. package/dist/gc/quality-update.d.ts +23 -0
  164. package/dist/gc/quality-update.js +69 -0
  165. package/dist/gc/quality-update.js.map +1 -0
  166. package/dist/gc/stub-hits.d.ts +31 -0
  167. package/dist/gc/stub-hits.js +125 -0
  168. package/dist/gc/stub-hits.js.map +1 -0
  169. package/dist/gc/sweep.d.ts +56 -0
  170. package/dist/gc/sweep.js +178 -0
  171. package/dist/gc/sweep.js.map +1 -0
  172. package/dist/gc/types.d.ts +129 -0
  173. package/dist/gc/types.js +26 -0
  174. package/dist/gc/types.js.map +1 -0
  175. package/dist/ground/drift.d.ts +8 -0
  176. package/dist/ground/drift.js +23 -0
  177. package/dist/ground/drift.js.map +1 -0
  178. package/dist/ground/frontmatter.d.ts +20 -0
  179. package/dist/ground/frontmatter.js +49 -0
  180. package/dist/ground/frontmatter.js.map +1 -0
  181. package/dist/ground/glob.d.ts +10 -0
  182. package/dist/ground/glob.js +46 -0
  183. package/dist/ground/glob.js.map +1 -0
  184. package/dist/ground/index.d.ts +14 -0
  185. package/dist/ground/index.js +10 -0
  186. package/dist/ground/index.js.map +1 -0
  187. package/dist/ground/ledgers.d.ts +18 -0
  188. package/dist/ground/ledgers.js +103 -0
  189. package/dist/ground/ledgers.js.map +1 -0
  190. package/dist/ground/manifest.d.ts +10 -0
  191. package/dist/ground/manifest.js +88 -0
  192. package/dist/ground/manifest.js.map +1 -0
  193. package/dist/ground/paths.d.ts +20 -0
  194. package/dist/ground/paths.js +61 -0
  195. package/dist/ground/paths.js.map +1 -0
  196. package/dist/ground/quality-grades.d.ts +11 -0
  197. package/dist/ground/quality-grades.js +98 -0
  198. package/dist/ground/quality-grades.js.map +1 -0
  199. package/dist/ground/schemas.d.ts +306 -0
  200. package/dist/ground/schemas.js +188 -0
  201. package/dist/ground/schemas.js.map +1 -0
  202. package/dist/ground/walk.d.ts +7 -0
  203. package/dist/ground/walk.js +53 -0
  204. package/dist/ground/walk.js.map +1 -0
  205. package/dist/index.d.ts +8 -0
  206. package/dist/index.js +9 -0
  207. package/dist/index.js.map +1 -0
  208. package/dist/init/detect.d.ts +25 -0
  209. package/dist/init/detect.js +336 -0
  210. package/dist/init/detect.js.map +1 -0
  211. package/dist/init/index.d.ts +14 -0
  212. package/dist/init/index.js +9 -0
  213. package/dist/init/index.js.map +1 -0
  214. package/dist/init/init.d.ts +68 -0
  215. package/dist/init/init.js +673 -0
  216. package/dist/init/init.js.map +1 -0
  217. package/dist/init/mapper.d.ts +160 -0
  218. package/dist/init/mapper.js +248 -0
  219. package/dist/init/mapper.js.map +1 -0
  220. package/dist/init/prompts.d.ts +70 -0
  221. package/dist/init/prompts.js +80 -0
  222. package/dist/init/prompts.js.map +1 -0
  223. package/dist/init/secrets.d.ts +18 -0
  224. package/dist/init/secrets.js +76 -0
  225. package/dist/init/secrets.js.map +1 -0
  226. package/dist/init/seed.d.ts +21 -0
  227. package/dist/init/seed.js +75 -0
  228. package/dist/init/seed.js.map +1 -0
  229. package/dist/init/setup-runners.d.ts +17 -0
  230. package/dist/init/setup-runners.js +70 -0
  231. package/dist/init/setup-runners.js.map +1 -0
  232. package/dist/init/types.d.ts +59 -0
  233. package/dist/init/types.js +10 -0
  234. package/dist/init/types.js.map +1 -0
  235. package/dist/init/walker.d.ts +53 -0
  236. package/dist/init/walker.js +460 -0
  237. package/dist/init/walker.js.map +1 -0
  238. package/dist/init/workflow-block.d.ts +34 -0
  239. package/dist/init/workflow-block.js +110 -0
  240. package/dist/init/workflow-block.js.map +1 -0
  241. package/dist/logger.d.ts +3 -0
  242. package/dist/logger.js +23 -0
  243. package/dist/logger.js.map +1 -0
  244. package/dist/mcp/context.d.ts +16 -0
  245. package/dist/mcp/context.js +8 -0
  246. package/dist/mcp/context.js.map +1 -0
  247. package/dist/mcp/errors.d.ts +17 -0
  248. package/dist/mcp/errors.js +23 -0
  249. package/dist/mcp/errors.js.map +1 -0
  250. package/dist/mcp/index.d.ts +10 -0
  251. package/dist/mcp/index.js +7 -0
  252. package/dist/mcp/index.js.map +1 -0
  253. package/dist/mcp/path-allowlist.d.ts +25 -0
  254. package/dist/mcp/path-allowlist.js +66 -0
  255. package/dist/mcp/path-allowlist.js.map +1 -0
  256. package/dist/mcp/result.d.ts +8 -0
  257. package/dist/mcp/result.js +18 -0
  258. package/dist/mcp/result.js.map +1 -0
  259. package/dist/mcp/schemas.d.ts +153 -0
  260. package/dist/mcp/schemas.js +135 -0
  261. package/dist/mcp/schemas.js.map +1 -0
  262. package/dist/mcp/server.d.ts +11 -0
  263. package/dist/mcp/server.js +58 -0
  264. package/dist/mcp/server.js.map +1 -0
  265. package/dist/mcp/telemetry.d.ts +15 -0
  266. package/dist/mcp/telemetry.js +13 -0
  267. package/dist/mcp/telemetry.js.map +1 -0
  268. package/dist/mcp/tools/append.d.ts +8 -0
  269. package/dist/mcp/tools/append.js +33 -0
  270. package/dist/mcp/tools/append.js.map +1 -0
  271. package/dist/mcp/tools/archive.d.ts +8 -0
  272. package/dist/mcp/tools/archive.js +49 -0
  273. package/dist/mcp/tools/archive.js.map +1 -0
  274. package/dist/mcp/tools/ask-operator.d.ts +34 -0
  275. package/dist/mcp/tools/ask-operator.js +93 -0
  276. package/dist/mcp/tools/ask-operator.js.map +1 -0
  277. package/dist/mcp/tools/canonical-for-topic.d.ts +6 -0
  278. package/dist/mcp/tools/canonical-for-topic.js +40 -0
  279. package/dist/mcp/tools/canonical-for-topic.js.map +1 -0
  280. package/dist/mcp/tools/decision-get.d.ts +6 -0
  281. package/dist/mcp/tools/decision-get.js +49 -0
  282. package/dist/mcp/tools/decision-get.js.map +1 -0
  283. package/dist/mcp/tools/decisions-for-symbol.d.ts +7 -0
  284. package/dist/mcp/tools/decisions-for-symbol.js +42 -0
  285. package/dist/mcp/tools/decisions-for-symbol.js.map +1 -0
  286. package/dist/mcp/tools/decisions-in-scope.d.ts +7 -0
  287. package/dist/mcp/tools/decisions-in-scope.js +47 -0
  288. package/dist/mcp/tools/decisions-in-scope.js.map +1 -0
  289. package/dist/mcp/tools/drop-task.d.ts +12 -0
  290. package/dist/mcp/tools/drop-task.js +47 -0
  291. package/dist/mcp/tools/drop-task.js.map +1 -0
  292. package/dist/mcp/tools/get-full.d.ts +7 -0
  293. package/dist/mcp/tools/get-full.js +46 -0
  294. package/dist/mcp/tools/get-full.js.map +1 -0
  295. package/dist/mcp/tools/ground-get.d.ts +7 -0
  296. package/dist/mcp/tools/ground-get.js +80 -0
  297. package/dist/mcp/tools/ground-get.js.map +1 -0
  298. package/dist/mcp/tools/index.d.ts +3 -0
  299. package/dist/mcp/tools/index.js +44 -0
  300. package/dist/mcp/tools/index.js.map +1 -0
  301. package/dist/mcp/tools/invariant-get.d.ts +6 -0
  302. package/dist/mcp/tools/invariant-get.js +49 -0
  303. package/dist/mcp/tools/invariant-get.js.map +1 -0
  304. package/dist/mcp/tools/invariants-in-scope.d.ts +7 -0
  305. package/dist/mcp/tools/invariants-in-scope.js +65 -0
  306. package/dist/mcp/tools/invariants-in-scope.js.map +1 -0
  307. package/dist/mcp/tools/query-history.d.ts +9 -0
  308. package/dist/mcp/tools/query-history.js +33 -0
  309. package/dist/mcp/tools/query-history.js.map +1 -0
  310. package/dist/mcp/tools/record-decision.d.ts +14 -0
  311. package/dist/mcp/tools/record-decision.js +101 -0
  312. package/dist/mcp/tools/record-decision.js.map +1 -0
  313. package/dist/mcp/tools/record-run-event.d.ts +10 -0
  314. package/dist/mcp/tools/record-run-event.js +28 -0
  315. package/dist/mcp/tools/record-run-event.js.map +1 -0
  316. package/dist/mcp/tools/search.d.ts +9 -0
  317. package/dist/mcp/tools/search.js +165 -0
  318. package/dist/mcp/tools/search.js.map +1 -0
  319. package/dist/mcp/tools/supersedes-chain.d.ts +6 -0
  320. package/dist/mcp/tools/supersedes-chain.js +66 -0
  321. package/dist/mcp/tools/supersedes-chain.js.map +1 -0
  322. package/dist/mcp/tools/timeline.d.ts +9 -0
  323. package/dist/mcp/tools/timeline.js +65 -0
  324. package/dist/mcp/tools/timeline.js.map +1 -0
  325. package/dist/mcp/tools/types.d.ts +9 -0
  326. package/dist/mcp/tools/types.js +2 -0
  327. package/dist/mcp/tools/types.js.map +1 -0
  328. package/dist/mirror/clone.d.ts +6 -0
  329. package/dist/mirror/clone.js +48 -0
  330. package/dist/mirror/clone.js.map +1 -0
  331. package/dist/mirror/dirty-overlap.d.ts +13 -0
  332. package/dist/mirror/dirty-overlap.js +77 -0
  333. package/dist/mirror/dirty-overlap.js.map +1 -0
  334. package/dist/mirror/index.d.ts +7 -0
  335. package/dist/mirror/index.js +7 -0
  336. package/dist/mirror/index.js.map +1 -0
  337. package/dist/mirror/paths.d.ts +18 -0
  338. package/dist/mirror/paths.js +45 -0
  339. package/dist/mirror/paths.js.map +1 -0
  340. package/dist/mirror/push.d.ts +9 -0
  341. package/dist/mirror/push.js +27 -0
  342. package/dist/mirror/push.js.map +1 -0
  343. package/dist/mirror/state.d.ts +4 -0
  344. package/dist/mirror/state.js +36 -0
  345. package/dist/mirror/state.js.map +1 -0
  346. package/dist/mirror/sync.d.ts +9 -0
  347. package/dist/mirror/sync.js +33 -0
  348. package/dist/mirror/sync.js.map +1 -0
  349. package/dist/mirror/types.d.ts +77 -0
  350. package/dist/mirror/types.js +2 -0
  351. package/dist/mirror/types.js.map +1 -0
  352. package/dist/orchestrator/activity-summarizer.d.ts +33 -0
  353. package/dist/orchestrator/activity-summarizer.js +120 -0
  354. package/dist/orchestrator/activity-summarizer.js.map +1 -0
  355. package/dist/orchestrator/inbox.d.ts +78 -0
  356. package/dist/orchestrator/inbox.js +115 -0
  357. package/dist/orchestrator/inbox.js.map +1 -0
  358. package/dist/orchestrator/index.d.ts +9 -0
  359. package/dist/orchestrator/index.js +7 -0
  360. package/dist/orchestrator/index.js.map +1 -0
  361. package/dist/orchestrator/orchestrator.d.ts +154 -0
  362. package/dist/orchestrator/orchestrator.js +2437 -0
  363. package/dist/orchestrator/orchestrator.js.map +1 -0
  364. package/dist/orchestrator/prompt.d.ts +19 -0
  365. package/dist/orchestrator/prompt.js +50 -0
  366. package/dist/orchestrator/prompt.js.map +1 -0
  367. package/dist/orchestrator/queue.d.ts +21 -0
  368. package/dist/orchestrator/queue.js +80 -0
  369. package/dist/orchestrator/queue.js.map +1 -0
  370. package/dist/orchestrator/run-log.d.ts +53 -0
  371. package/dist/orchestrator/run-log.js +92 -0
  372. package/dist/orchestrator/run-log.js.map +1 -0
  373. package/dist/orchestrator/runner.d.ts +56 -0
  374. package/dist/orchestrator/runner.js +172 -0
  375. package/dist/orchestrator/runner.js.map +1 -0
  376. package/dist/orchestrator/tool-digest.d.ts +35 -0
  377. package/dist/orchestrator/tool-digest.js +116 -0
  378. package/dist/orchestrator/tool-digest.js.map +1 -0
  379. package/dist/orchestrator/types.d.ts +263 -0
  380. package/dist/orchestrator/types.js +2 -0
  381. package/dist/orchestrator/types.js.map +1 -0
  382. package/dist/orchestrator/workspace.d.ts +21 -0
  383. package/dist/orchestrator/workspace.js +31 -0
  384. package/dist/orchestrator/workspace.js.map +1 -0
  385. package/dist/profiles/index.d.ts +3 -0
  386. package/dist/profiles/index.js +3 -0
  387. package/dist/profiles/index.js.map +1 -0
  388. package/dist/profiles/registry.d.ts +5 -0
  389. package/dist/profiles/registry.js +31 -0
  390. package/dist/profiles/registry.js.map +1 -0
  391. package/dist/profiles/types.d.ts +48 -0
  392. package/dist/profiles/types.js +11 -0
  393. package/dist/profiles/types.js.map +1 -0
  394. package/dist/profiles/unknown.d.ts +9 -0
  395. package/dist/profiles/unknown.js +17 -0
  396. package/dist/profiles/unknown.js.map +1 -0
  397. package/dist/reviewer/index.d.ts +6 -0
  398. package/dist/reviewer/index.js +5 -0
  399. package/dist/reviewer/index.js.map +1 -0
  400. package/dist/reviewer/prompt.d.ts +11 -0
  401. package/dist/reviewer/prompt.js +132 -0
  402. package/dist/reviewer/prompt.js.map +1 -0
  403. package/dist/reviewer/remediation.d.ts +15 -0
  404. package/dist/reviewer/remediation.js +61 -0
  405. package/dist/reviewer/remediation.js.map +1 -0
  406. package/dist/reviewer/reviewer.d.ts +9 -0
  407. package/dist/reviewer/reviewer.js +89 -0
  408. package/dist/reviewer/reviewer.js.map +1 -0
  409. package/dist/reviewer/schema.d.ts +45 -0
  410. package/dist/reviewer/schema.js +43 -0
  411. package/dist/reviewer/schema.js.map +1 -0
  412. package/dist/reviewer/types.d.ts +74 -0
  413. package/dist/reviewer/types.js +14 -0
  414. package/dist/reviewer/types.js.map +1 -0
  415. package/dist/sensors/attestation.d.ts +44 -0
  416. package/dist/sensors/attestation.js +262 -0
  417. package/dist/sensors/attestation.js.map +1 -0
  418. package/dist/sensors/catalog.d.ts +41 -0
  419. package/dist/sensors/catalog.js +123 -0
  420. package/dist/sensors/catalog.js.map +1 -0
  421. package/dist/sensors/decisions.d.ts +30 -0
  422. package/dist/sensors/decisions.js +393 -0
  423. package/dist/sensors/decisions.js.map +1 -0
  424. package/dist/sensors/diff.d.ts +27 -0
  425. package/dist/sensors/diff.js +148 -0
  426. package/dist/sensors/diff.js.map +1 -0
  427. package/dist/sensors/index.d.ts +13 -0
  428. package/dist/sensors/index.js +9 -0
  429. package/dist/sensors/index.js.map +1 -0
  430. package/dist/sensors/remediation.d.ts +20 -0
  431. package/dist/sensors/remediation.js +65 -0
  432. package/dist/sensors/remediation.js.map +1 -0
  433. package/dist/sensors/runner.d.ts +44 -0
  434. package/dist/sensors/runner.js +95 -0
  435. package/dist/sensors/runner.js.map +1 -0
  436. package/dist/sensors/structural.d.ts +30 -0
  437. package/dist/sensors/structural.js +204 -0
  438. package/dist/sensors/structural.js.map +1 -0
  439. package/dist/sensors/stub-catalog.d.ts +39 -0
  440. package/dist/sensors/stub-catalog.js +115 -0
  441. package/dist/sensors/stub-catalog.js.map +1 -0
  442. package/dist/sensors/types.d.ts +135 -0
  443. package/dist/sensors/types.js +14 -0
  444. package/dist/sensors/types.js.map +1 -0
  445. package/dist/tier0/classify.d.ts +5 -0
  446. package/dist/tier0/classify.js +91 -0
  447. package/dist/tier0/classify.js.map +1 -0
  448. package/dist/tier0/index.d.ts +3 -0
  449. package/dist/tier0/index.js +3 -0
  450. package/dist/tier0/index.js.map +1 -0
  451. package/dist/tier0/ollama.d.ts +22 -0
  452. package/dist/tier0/ollama.js +63 -0
  453. package/dist/tier0/ollama.js.map +1 -0
  454. package/dist/tier0/types.d.ts +24 -0
  455. package/dist/tier0/types.js +7 -0
  456. package/dist/tier0/types.js.map +1 -0
  457. package/dist/tightener/index.d.ts +4 -0
  458. package/dist/tightener/index.js +4 -0
  459. package/dist/tightener/index.js.map +1 -0
  460. package/dist/tightener/prompt.d.ts +3 -0
  461. package/dist/tightener/prompt.js +67 -0
  462. package/dist/tightener/prompt.js.map +1 -0
  463. package/dist/tightener/schema.d.ts +68 -0
  464. package/dist/tightener/schema.js +44 -0
  465. package/dist/tightener/schema.js.map +1 -0
  466. package/dist/tightener/tighten.d.ts +2 -0
  467. package/dist/tightener/tighten.js +66 -0
  468. package/dist/tightener/tighten.js.map +1 -0
  469. package/dist/tightener/types.d.ts +74 -0
  470. package/dist/tightener/types.js +6 -0
  471. package/dist/tightener/types.js.map +1 -0
  472. package/dist/uat/bundle.d.ts +68 -0
  473. package/dist/uat/bundle.js +168 -0
  474. package/dist/uat/bundle.js.map +1 -0
  475. package/dist/uat/index.d.ts +15 -0
  476. package/dist/uat/index.js +10 -0
  477. package/dist/uat/index.js.map +1 -0
  478. package/dist/uat/persistent.d.ts +64 -0
  479. package/dist/uat/persistent.js +206 -0
  480. package/dist/uat/persistent.js.map +1 -0
  481. package/dist/uat/probes/cli.d.ts +11 -0
  482. package/dist/uat/probes/cli.js +107 -0
  483. package/dist/uat/probes/cli.js.map +1 -0
  484. package/dist/uat/probes/http.d.ts +12 -0
  485. package/dist/uat/probes/http.js +139 -0
  486. package/dist/uat/probes/http.js.map +1 -0
  487. package/dist/uat/probes/index.d.ts +21 -0
  488. package/dist/uat/probes/index.js +30 -0
  489. package/dist/uat/probes/index.js.map +1 -0
  490. package/dist/uat/probes/integration.d.ts +18 -0
  491. package/dist/uat/probes/integration.js +188 -0
  492. package/dist/uat/probes/integration.js.map +1 -0
  493. package/dist/uat/probes/sql/config.d.ts +14 -0
  494. package/dist/uat/probes/sql/config.js +57 -0
  495. package/dist/uat/probes/sql/config.js.map +1 -0
  496. package/dist/uat/probes/sql/index.d.ts +29 -0
  497. package/dist/uat/probes/sql/index.js +43 -0
  498. package/dist/uat/probes/sql/index.js.map +1 -0
  499. package/dist/uat/probes/sql/mysql.d.ts +12 -0
  500. package/dist/uat/probes/sql/mysql.js +96 -0
  501. package/dist/uat/probes/sql/mysql.js.map +1 -0
  502. package/dist/uat/probes/sql/pg.d.ts +20 -0
  503. package/dist/uat/probes/sql/pg.js +102 -0
  504. package/dist/uat/probes/sql/pg.js.map +1 -0
  505. package/dist/uat/probes/sql/sqlite.d.ts +9 -0
  506. package/dist/uat/probes/sql/sqlite.js +58 -0
  507. package/dist/uat/probes/sql/sqlite.js.map +1 -0
  508. package/dist/uat/probes/sql/types.d.ts +46 -0
  509. package/dist/uat/probes/sql/types.js +10 -0
  510. package/dist/uat/probes/sql/types.js.map +1 -0
  511. package/dist/uat/probes/sql.d.ts +9 -0
  512. package/dist/uat/probes/sql.js +119 -0
  513. package/dist/uat/probes/sql.js.map +1 -0
  514. package/dist/uat/probes/ui.d.ts +19 -0
  515. package/dist/uat/probes/ui.js +244 -0
  516. package/dist/uat/probes/ui.js.map +1 -0
  517. package/dist/uat/prompt.d.ts +10 -0
  518. package/dist/uat/prompt.js +85 -0
  519. package/dist/uat/prompt.js.map +1 -0
  520. package/dist/uat/question.d.ts +50 -0
  521. package/dist/uat/question.js +139 -0
  522. package/dist/uat/question.js.map +1 -0
  523. package/dist/uat/rejection.d.ts +58 -0
  524. package/dist/uat/rejection.js +163 -0
  525. package/dist/uat/rejection.js.map +1 -0
  526. package/dist/uat/runner.d.ts +6 -0
  527. package/dist/uat/runner.js +96 -0
  528. package/dist/uat/runner.js.map +1 -0
  529. package/dist/uat/schema.d.ts +322 -0
  530. package/dist/uat/schema.js +189 -0
  531. package/dist/uat/schema.js.map +1 -0
  532. package/dist/uat/types.d.ts +268 -0
  533. package/dist/uat/types.js +18 -0
  534. package/dist/uat/types.js.map +1 -0
  535. package/dist/uat/uat.d.ts +89 -0
  536. package/dist/uat/uat.js +256 -0
  537. package/dist/uat/uat.js.map +1 -0
  538. package/dist/voice/index.d.ts +4 -0
  539. package/dist/voice/index.js +4 -0
  540. package/dist/voice/index.js.map +1 -0
  541. package/dist/voice/model.d.ts +23 -0
  542. package/dist/voice/model.js +46 -0
  543. package/dist/voice/model.js.map +1 -0
  544. package/dist/voice/pipe.d.ts +9 -0
  545. package/dist/voice/pipe.js +47 -0
  546. package/dist/voice/pipe.js.map +1 -0
  547. package/dist/voice/transcribe.d.ts +3 -0
  548. package/dist/voice/transcribe.js +43 -0
  549. package/dist/voice/transcribe.js.map +1 -0
  550. package/dist/voice/types.d.ts +26 -0
  551. package/dist/voice/types.js +9 -0
  552. package/dist/voice/types.js.map +1 -0
  553. package/dist/watch/daemon.d.ts +21 -0
  554. package/dist/watch/daemon.js +143 -0
  555. package/dist/watch/daemon.js.map +1 -0
  556. package/dist/watch/index.d.ts +4 -0
  557. package/dist/watch/index.js +3 -0
  558. package/dist/watch/index.js.map +1 -0
  559. package/dist/watch/regenerate.d.ts +25 -0
  560. package/dist/watch/regenerate.js +51 -0
  561. package/dist/watch/regenerate.js.map +1 -0
  562. package/package.json +75 -0
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Reviewer subagent (Layer C) — Phase 10.
3
+ *
4
+ * Per PRIMER §10 + INTEGRATION_PLAN §5 Phase 10:
5
+ * - Same model as implementer (no model split). Context isolation does
6
+ * the work, not weight diversity (L15).
7
+ * - Fresh `claude` subprocess; reads ONLY the tightened spec, diff
8
+ * content, decisions ledger, in-scope assertions, and Phase 9 soft
9
+ * findings. Does NOT see implementer's reasoning or tool-use trace.
10
+ * - Anti-completionist prompt; default verdict = fail.
11
+ * - Structured output via `--json-schema`.
12
+ */
13
+ import type { ClaudeTier } from "../claude/index.js";
14
+ import type { DecisionFrontmatter } from "../ground/schemas.js";
15
+ import type { DiffEntry, SensorFinding } from "../sensors/index.js";
16
+ export type ReviewVerdict = "pass" | "fail";
17
+ export type ReviewGapCategory = "deferred_but_claimed_done" | "missing_acceptance_criterion" | "scope_leak" | "query_scope_omission" | "decision_contradiction" | "unhandled_error" | "fake_thoroughness" | "documentation_drift" | "security_concern" | "other";
18
+ export interface ReviewGap {
19
+ category: ReviewGapCategory;
20
+ description: string;
21
+ /** Repo-relative path of the file the gap is anchored on, when applicable. */
22
+ path?: string;
23
+ /** Symbol or function name the gap references. */
24
+ symbol?: string;
25
+ /** "hard" gates the run; "soft" reports for operator/UAT visibility. */
26
+ severity: "hard" | "soft";
27
+ }
28
+ export interface ReviewerOutput {
29
+ verdict: ReviewVerdict;
30
+ gaps: ReviewGap[];
31
+ /** Reviewer's confidence in its own verdict. */
32
+ confidence_signal: "high" | "medium" | "low";
33
+ /** One-paragraph natural-language summary of the review. */
34
+ summary: string;
35
+ }
36
+ export interface ReviewerInput {
37
+ /**
38
+ * The tightened spec body the implementer received. This is the only
39
+ * statement of intent the reviewer sees. Do NOT include the original
40
+ * untightened task body or any operator chatter.
41
+ */
42
+ tightened_spec: string;
43
+ /** Acceptance criteria the implementer was given. */
44
+ acceptance_criteria: string[];
45
+ /** Files changed in this run with their post-change content. */
46
+ diff: DiffEntry[];
47
+ /** Accepted decisions whose scope_globs overlap the diff. */
48
+ decisions_in_scope: DecisionFrontmatter[];
49
+ /** Soft findings from Phase 9 sensors (advisory; not gating). */
50
+ soft_findings: SensorFinding[];
51
+ /**
52
+ * True iff diff touches any high_stakes_globs. Triggers the explicit
53
+ * query-scope completeness check in the prompt (Codex audit Q1).
54
+ */
55
+ is_high_stakes: boolean;
56
+ /** Tier to use — match implementer per L15. */
57
+ tier: ClaudeTier;
58
+ /** Per-call timeout. Default 300_000 ms. */
59
+ timeout_ms?: number;
60
+ }
61
+ export interface ReviewerResult {
62
+ output: ReviewerOutput;
63
+ tier: ClaudeTier;
64
+ /**
65
+ * Aggregate decision: false when verdict=fail OR any hard gap exists.
66
+ * Soft gaps + verdict=pass = ok. Orchestrator gates on this.
67
+ */
68
+ ok: boolean;
69
+ duration_ms: number;
70
+ usage?: {
71
+ input_tokens?: number;
72
+ output_tokens?: number;
73
+ };
74
+ }
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Reviewer subagent (Layer C) — Phase 10.
3
+ *
4
+ * Per PRIMER §10 + INTEGRATION_PLAN §5 Phase 10:
5
+ * - Same model as implementer (no model split). Context isolation does
6
+ * the work, not weight diversity (L15).
7
+ * - Fresh `claude` subprocess; reads ONLY the tightened spec, diff
8
+ * content, decisions ledger, in-scope assertions, and Phase 9 soft
9
+ * findings. Does NOT see implementer's reasoning or tool-use trace.
10
+ * - Anti-completionist prompt; default verdict = fail.
11
+ * - Structured output via `--json-schema`.
12
+ */
13
+ export {};
14
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/reviewer/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Layer B — attestation cross-check.
3
+ *
4
+ * The agent emits a fenced YAML block at the end of its final response.
5
+ * This module:
6
+ * 1. Extracts the YAML block from the agent's final text.
7
+ * 2. Parses it into a structured `Attestation`.
8
+ * 3. Cross-checks every claim against the actual diff. Mismatch = lie.
9
+ *
10
+ * Per PRIMER §10 Layer B. Lying must be harder than telling truth.
11
+ */
12
+ import type { Attestation, DiffEntry, SensorResult, StubCatalog } from "./types.js";
13
+ /**
14
+ * Extract the YAML block from a final assistant message. The template
15
+ * instructs the agent to emit a fenced block whose first line is the literal
16
+ * key `attestation:`. We accept either:
17
+ *
18
+ * ```yaml
19
+ * attestation:
20
+ * ...
21
+ * ```
22
+ *
23
+ * or a bare top-level YAML doc starting with `attestation:`.
24
+ */
25
+ export declare function extractAttestation(text: string): Attestation | undefined;
26
+ /**
27
+ * Cross-check the attestation against the diff. Returns the sensor result.
28
+ *
29
+ * Hard fails:
30
+ * - attestation absent or unparseable
31
+ * - files_touched mismatches actual changed paths (set-equality)
32
+ * - todos_introduced != count of TODO/FIXME/XXX/HACK markers added
33
+ * - stubs_introduced != count of hard-severity stub-pattern hits
34
+ * - any delivered item declared `behavior: full` whose path/text contains
35
+ * a stub-pattern hit (lying about completeness)
36
+ */
37
+ export declare function runAttestationCrossCheck(args: {
38
+ attestation: Attestation | undefined;
39
+ diff: DiffEntry[];
40
+ stubCatalog: StubCatalog;
41
+ /** Globs of files always allowed in diff but not required to be in
42
+ * files_touched (e.g. `.harness/runs/active/**`). */
43
+ ignoreGlobs?: string[];
44
+ }): SensorResult;
@@ -0,0 +1,262 @@
1
+ /**
2
+ * Layer B — attestation cross-check.
3
+ *
4
+ * The agent emits a fenced YAML block at the end of its final response.
5
+ * This module:
6
+ * 1. Extracts the YAML block from the agent's final text.
7
+ * 2. Parses it into a structured `Attestation`.
8
+ * 3. Cross-checks every claim against the actual diff. Mismatch = lie.
9
+ *
10
+ * Per PRIMER §10 Layer B. Lying must be harder than telling truth.
11
+ */
12
+ import { parse as parseYaml } from "yaml";
13
+ import { matchAnyGlob } from "../ground/glob.js";
14
+ import { detectStubMatches } from "./stub-catalog.js";
15
+ const SENSOR_ID = "attestation-cross-check";
16
+ /**
17
+ * Extract the YAML block from a final assistant message. The template
18
+ * instructs the agent to emit a fenced block whose first line is the literal
19
+ * key `attestation:`. We accept either:
20
+ *
21
+ * ```yaml
22
+ * attestation:
23
+ * ...
24
+ * ```
25
+ *
26
+ * or a bare top-level YAML doc starting with `attestation:`.
27
+ */
28
+ export function extractAttestation(text) {
29
+ if (typeof text !== "string" || text.length === 0)
30
+ return undefined;
31
+ // Prefer fenced ```yaml ... ``` block whose body starts with `attestation:`.
32
+ const fenced = /```(?:yaml|yml)?\s*\n([\s\S]*?)\n```/g;
33
+ let match;
34
+ while ((match = fenced.exec(text)) !== null) {
35
+ const body = match[1] ?? "";
36
+ if (/^\s*attestation\s*:/m.test(body)) {
37
+ const parsed = parseAttestationBody(body);
38
+ if (parsed)
39
+ return parsed;
40
+ }
41
+ }
42
+ // Fallback: bare YAML in text starting with `attestation:`.
43
+ const bareIdx = text.search(/^\s*attestation\s*:/m);
44
+ if (bareIdx !== -1) {
45
+ const slice = text.slice(bareIdx);
46
+ return parseAttestationBody(slice);
47
+ }
48
+ return undefined;
49
+ }
50
+ /** Try parsing a YAML body that contains an `attestation:` key. */
51
+ function parseAttestationBody(body) {
52
+ let doc;
53
+ try {
54
+ doc = parseYaml(body);
55
+ }
56
+ catch {
57
+ return undefined;
58
+ }
59
+ if (typeof doc !== "object" || doc === null)
60
+ return undefined;
61
+ const root = doc;
62
+ const at = root["attestation"];
63
+ if (typeof at !== "object" || at === null)
64
+ return undefined;
65
+ const a = at;
66
+ const delivered = Array.isArray(a["delivered"])
67
+ ? a["delivered"].map((d) => ({
68
+ symbol: String(d["symbol"] ?? ""),
69
+ ...(typeof d["path"] === "string" ? { path: d["path"] } : {}),
70
+ behavior: (() => {
71
+ const v = d["behavior"];
72
+ return v === "partial" || v === "scaffolded" ? v : "full";
73
+ })(),
74
+ ...(Array.isArray(d["sensors_passed"])
75
+ ? { sensors_passed: d["sensors_passed"].map(String) }
76
+ : {}),
77
+ }))
78
+ : [];
79
+ const deferred = Array.isArray(a["deferred"])
80
+ ? a["deferred"].map((d) => ({
81
+ symbol: String(d["symbol"] ?? ""),
82
+ reason: String(d["reason"] ?? ""),
83
+ }))
84
+ : [];
85
+ const known_limitations = Array.isArray(a["known_limitations"])
86
+ ? a["known_limitations"].map(String)
87
+ : [];
88
+ const todos_introduced = typeof a["todos_introduced"] === "number" ? a["todos_introduced"] : 0;
89
+ const stubs_introduced = typeof a["stubs_introduced"] === "number" ? a["stubs_introduced"] : 0;
90
+ const files_touched = Array.isArray(a["files_touched"])
91
+ ? a["files_touched"].map(String)
92
+ : [];
93
+ const out = {
94
+ delivered,
95
+ deferred,
96
+ known_limitations,
97
+ todos_introduced,
98
+ stubs_introduced,
99
+ files_touched,
100
+ };
101
+ // Optional blocked_by from the same root or under attestation.
102
+ const block = (root["blocked_by"] ?? a["blocked_by"]);
103
+ if (typeof block === "object" && block !== null) {
104
+ const b = block;
105
+ if (typeof b["reason"] === "string") {
106
+ out.blocked_by = {
107
+ reason: b["reason"],
108
+ ...(typeof b["needed_from_operator"] === "string"
109
+ ? { needed_from_operator: b["needed_from_operator"] }
110
+ : {}),
111
+ };
112
+ }
113
+ }
114
+ return out;
115
+ }
116
+ /**
117
+ * Cross-check the attestation against the diff. Returns the sensor result.
118
+ *
119
+ * Hard fails:
120
+ * - attestation absent or unparseable
121
+ * - files_touched mismatches actual changed paths (set-equality)
122
+ * - todos_introduced != count of TODO/FIXME/XXX/HACK markers added
123
+ * - stubs_introduced != count of hard-severity stub-pattern hits
124
+ * - any delivered item declared `behavior: full` whose path/text contains
125
+ * a stub-pattern hit (lying about completeness)
126
+ */
127
+ export function runAttestationCrossCheck(args) {
128
+ const startedAt = Date.now();
129
+ const findings = [];
130
+ if (!args.attestation) {
131
+ findings.push({
132
+ sensor_id: SENSOR_ID,
133
+ message: "agent emitted no `attestation:` YAML block in final response — Layer B contract requires one",
134
+ severity: "hard",
135
+ });
136
+ return {
137
+ sensor_id: SENSOR_ID,
138
+ ok: false,
139
+ duration_ms: Date.now() - startedAt,
140
+ findings,
141
+ };
142
+ }
143
+ if (args.attestation.blocked_by) {
144
+ // Agent declared it can't proceed. Surface as soft so the orchestrator
145
+ // routes it back to the operator instead of looping.
146
+ findings.push({
147
+ sensor_id: SENSOR_ID,
148
+ message: `agent reported blocked_by: ${args.attestation.blocked_by.reason}`,
149
+ severity: "soft",
150
+ });
151
+ }
152
+ const diffPaths = new Set(args.diff
153
+ .filter((d) => d.status !== "deleted")
154
+ .map((d) => d.path));
155
+ const ignore = args.ignoreGlobs ?? [];
156
+ const declared = new Set(args.attestation.files_touched);
157
+ // Set-equality: every changed file must be declared, and every declared
158
+ // file must be in the diff (catches "I changed these other files too" lies).
159
+ for (const path of diffPaths) {
160
+ if (declared.has(path))
161
+ continue;
162
+ if (ignore.length > 0 && matchAnyGlob(path, ignore))
163
+ continue;
164
+ findings.push({
165
+ sensor_id: SENSOR_ID,
166
+ path,
167
+ message: `file changed but not in attestation.files_touched: ${path}`,
168
+ severity: "hard",
169
+ });
170
+ }
171
+ for (const path of declared) {
172
+ if (diffPaths.has(path))
173
+ continue;
174
+ findings.push({
175
+ sensor_id: SENSOR_ID,
176
+ path,
177
+ message: `attestation.files_touched lists a file not actually changed: ${path}`,
178
+ severity: "hard",
179
+ });
180
+ }
181
+ // Count markers added in the diff.
182
+ const addedTodoCount = countAddedMarkers(args.diff);
183
+ if (args.attestation.todos_introduced !== addedTodoCount) {
184
+ findings.push({
185
+ sensor_id: SENSOR_ID,
186
+ message: `attestation.todos_introduced=${args.attestation.todos_introduced} but diff adds ${addedTodoCount} TODO/FIXME/XXX/HACK marker(s)`,
187
+ severity: "hard",
188
+ });
189
+ }
190
+ // Count hard-stub matches in the diff.
191
+ const stubHits = detectStubMatches({
192
+ diff: args.diff,
193
+ catalog: args.stubCatalog,
194
+ /** All languages — Layer B doesn't get to filter by profile (the agent's
195
+ * number must match the same denominator we'll use). */
196
+ languages: undefined,
197
+ });
198
+ const hardStubCount = stubHits.filter((h) => h.severity === "hard").length;
199
+ if (args.attestation.stubs_introduced !== hardStubCount) {
200
+ findings.push({
201
+ sensor_id: SENSOR_ID,
202
+ message: `attestation.stubs_introduced=${args.attestation.stubs_introduced} but Layer A finds ${hardStubCount} hard-severity stub pattern(s)`,
203
+ severity: "hard",
204
+ });
205
+ }
206
+ // behavior:full + stub-pattern coexistence = lie about completeness.
207
+ for (const d of args.attestation.delivered) {
208
+ if (d.behavior !== "full")
209
+ continue;
210
+ const matches = stubHits.filter((h) => {
211
+ if (d.path && h.path !== d.path)
212
+ return false;
213
+ // If no path, just see whether any matched_text references the symbol.
214
+ if (!d.path)
215
+ return (h.matched_text ?? "").includes(d.symbol);
216
+ return true;
217
+ });
218
+ for (const m of matches) {
219
+ const f = {
220
+ sensor_id: SENSOR_ID,
221
+ message: `delivered "${d.symbol}" claimed behavior:full but contains stub pattern \`${m.pattern_id}\``,
222
+ severity: "hard",
223
+ };
224
+ if (m.path !== undefined)
225
+ f.path = m.path;
226
+ if (m.line !== undefined)
227
+ f.line = m.line;
228
+ if (m.matched_text !== undefined)
229
+ f.matched_text = m.matched_text;
230
+ if (m.pattern_id !== undefined)
231
+ f.pattern_id = m.pattern_id;
232
+ findings.push(f);
233
+ }
234
+ }
235
+ const ok = findings.every((f) => f.severity !== "hard");
236
+ return {
237
+ sensor_id: SENSOR_ID,
238
+ ok,
239
+ duration_ms: Date.now() - startedAt,
240
+ findings,
241
+ };
242
+ }
243
+ /**
244
+ * Count TODO/FIXME/XXX/HACK markers introduced in the diff (added lines only).
245
+ * Modified files: counts markers in content not present at the SHA pin.
246
+ * Added files: counts every marker.
247
+ */
248
+ function countAddedMarkers(diff) {
249
+ const re = /(?:\/\/|#|\/\*|--)\s*(TODO|FIXME|XXX|HACK)\b/g;
250
+ let total = 0;
251
+ for (const entry of diff) {
252
+ if (entry.status === "deleted")
253
+ continue;
254
+ const after = entry.afterContent ?? "";
255
+ const before = entry.beforeContent ?? "";
256
+ const beforeCount = (before.match(re) ?? []).length;
257
+ const afterCount = (after.match(re) ?? []).length;
258
+ total += Math.max(0, afterCount - beforeCount);
259
+ }
260
+ return total;
261
+ }
262
+ //# sourceMappingURL=attestation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attestation.js","sourceRoot":"","sources":["../../src/sensors/attestation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Loaders for the on-disk sensor configuration files.
3
+ *
4
+ * `.harness/config/stub-patterns.yaml` — Layer A regex catalog
5
+ * `.harness/config/sensors.yaml` — sensor registry (which sensors run,
6
+ * their layer, fail_severity, glob keys)
7
+ *
8
+ * Both files ship as templates in `harness/templates/.harness/config/` and
9
+ * are copied into the adopted project's `.harness/config/` at init.
10
+ */
11
+ import type { StubCatalog } from "./types.js";
12
+ /** Parse a stub-patterns.yaml document into the typed catalog shape. */
13
+ export declare function parseStubCatalog(yamlText: string): StubCatalog;
14
+ /**
15
+ * Load the stub-pattern catalog. Order:
16
+ * 1. `<repoRoot>/.harness/config/stub-patterns.yaml` (project override)
17
+ * 2. The package's bundled template file (always present in harness/dist).
18
+ *
19
+ * Returns the parsed catalog. Throws only if both candidates are missing or
20
+ * unparseable — that would indicate a broken harness install.
21
+ */
22
+ export declare function loadStubCatalog(repoRoot?: string): StubCatalog;
23
+ /** Sensor registry entry from sensors.yaml. */
24
+ export interface SensorRegistryEntry {
25
+ id: string;
26
+ layer: string;
27
+ kind: string;
28
+ description: string;
29
+ triggers: string[];
30
+ glob_keys?: string[];
31
+ catalog?: string;
32
+ fail_severity?: "hard" | "soft";
33
+ }
34
+ export interface SensorRegistry {
35
+ version: number;
36
+ sensors: SensorRegistryEntry[];
37
+ required_glob_keys: string[];
38
+ disabled_per_project: string[];
39
+ }
40
+ /** Load + parse the sensor registry. */
41
+ export declare function loadSensorRegistry(repoRoot?: string): SensorRegistry;
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Loaders for the on-disk sensor configuration files.
3
+ *
4
+ * `.harness/config/stub-patterns.yaml` — Layer A regex catalog
5
+ * `.harness/config/sensors.yaml` — sensor registry (which sensors run,
6
+ * their layer, fail_severity, glob keys)
7
+ *
8
+ * Both files ship as templates in `harness/templates/.harness/config/` and
9
+ * are copied into the adopted project's `.harness/config/` at init.
10
+ */
11
+ import { existsSync, readFileSync } from "node:fs";
12
+ import { dirname, join } from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+ import { parse as parseYaml } from "yaml";
15
+ const HERE = dirname(fileURLToPath(import.meta.url));
16
+ /**
17
+ * Path to the catalog file shipped inside the harness package itself. Used
18
+ * as the fallback when the adopted project hasn't customized the catalog.
19
+ *
20
+ * `dist/sensors/catalog.js` runtime path → `templates/.harness/config/...`.
21
+ */
22
+ const PKG_TEMPLATE_STUB = join(HERE, "..", "..", "templates", ".harness", "config", "stub-patterns.yaml");
23
+ const PKG_TEMPLATE_SENSORS = join(HERE, "..", "..", "templates", ".harness", "config", "sensors.yaml");
24
+ const KNOWN_LANGUAGES = [
25
+ "typescript",
26
+ "javascript",
27
+ "python",
28
+ "ruby",
29
+ "go",
30
+ "rust",
31
+ "sql",
32
+ ];
33
+ function isKnownLanguage(s) {
34
+ return typeof s === "string" && KNOWN_LANGUAGES.includes(s);
35
+ }
36
+ /** Parse a stub-patterns.yaml document into the typed catalog shape. */
37
+ export function parseStubCatalog(yamlText) {
38
+ const doc = parseYaml(yamlText);
39
+ const version = typeof doc["version"] === "number" ? doc["version"] : 1;
40
+ const rawPatterns = Array.isArray(doc["patterns"]) ? doc["patterns"] : [];
41
+ const patterns = [];
42
+ for (const raw of rawPatterns) {
43
+ if (typeof raw !== "object" || raw === null)
44
+ continue;
45
+ const r = raw;
46
+ const id = typeof r["id"] === "string" ? r["id"] : "";
47
+ const langs = Array.isArray(r["languages"])
48
+ ? r["languages"].filter(isKnownLanguage)
49
+ : [];
50
+ const description = typeof r["description"] === "string" ? r["description"] : "";
51
+ const regex = typeof r["regex"] === "string" ? r["regex"] : "";
52
+ const severity = r["severity"] === "soft" ? "soft" : "hard";
53
+ if (id === "" || regex === "" || langs.length === 0)
54
+ continue;
55
+ patterns.push({ id, languages: langs, description, regex, severity });
56
+ }
57
+ return { version, patterns };
58
+ }
59
+ /**
60
+ * Load the stub-pattern catalog. Order:
61
+ * 1. `<repoRoot>/.harness/config/stub-patterns.yaml` (project override)
62
+ * 2. The package's bundled template file (always present in harness/dist).
63
+ *
64
+ * Returns the parsed catalog. Throws only if both candidates are missing or
65
+ * unparseable — that would indicate a broken harness install.
66
+ */
67
+ export function loadStubCatalog(repoRoot) {
68
+ const candidates = [];
69
+ if (repoRoot !== undefined) {
70
+ candidates.push(join(repoRoot, ".harness", "config", "stub-patterns.yaml"));
71
+ }
72
+ candidates.push(PKG_TEMPLATE_STUB);
73
+ for (const p of candidates) {
74
+ if (!existsSync(p))
75
+ continue;
76
+ return parseStubCatalog(readFileSync(p, "utf8"));
77
+ }
78
+ throw new Error(`stub-patterns.yaml not found; checked: ${candidates.join(", ")}`);
79
+ }
80
+ /** Load + parse the sensor registry. */
81
+ export function loadSensorRegistry(repoRoot) {
82
+ const candidates = [];
83
+ if (repoRoot !== undefined) {
84
+ candidates.push(join(repoRoot, ".harness", "config", "sensors.yaml"));
85
+ }
86
+ candidates.push(PKG_TEMPLATE_SENSORS);
87
+ for (const p of candidates) {
88
+ if (!existsSync(p))
89
+ continue;
90
+ const doc = parseYaml(readFileSync(p, "utf8"));
91
+ const version = typeof doc["version"] === "number" ? doc["version"] : 1;
92
+ const sensors = [];
93
+ for (const raw of doc["sensors"] ?? []) {
94
+ if (typeof raw !== "object" || raw === null)
95
+ continue;
96
+ const r = raw;
97
+ sensors.push({
98
+ id: String(r["id"] ?? ""),
99
+ layer: String(r["layer"] ?? ""),
100
+ kind: String(r["kind"] ?? ""),
101
+ description: String(r["description"] ?? ""),
102
+ triggers: Array.isArray(r["triggers"]) ? r["triggers"] : [],
103
+ ...(Array.isArray(r["glob_keys"]) ? { glob_keys: r["glob_keys"] } : {}),
104
+ ...(typeof r["catalog"] === "string" ? { catalog: r["catalog"] } : {}),
105
+ ...(r["fail_severity"] === "hard" || r["fail_severity"] === "soft"
106
+ ? { fail_severity: r["fail_severity"] }
107
+ : {}),
108
+ });
109
+ }
110
+ return {
111
+ version,
112
+ sensors,
113
+ required_glob_keys: Array.isArray(doc["required_glob_keys"])
114
+ ? doc["required_glob_keys"]
115
+ : [],
116
+ disabled_per_project: Array.isArray(doc["disabled_per_project"])
117
+ ? doc["disabled_per_project"]
118
+ : [],
119
+ };
120
+ }
121
+ throw new Error(`sensors.yaml not found; checked: ${candidates.join(", ")}`);
122
+ }
123
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/sensors/catalog.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Decision-assertions sensor.
3
+ *
4
+ * For every accepted decision whose `scope_globs` overlap the diff, evaluate
5
+ * each machine-readable `assertion` against the post-change repository state.
6
+ * Failure quotes the failing assertion id + decision id + the contradicting
7
+ * line.
8
+ *
9
+ * Per L26+L41 — 11 assertion kinds. AST-level precision is v2; this module
10
+ * uses regex-based approximations and surfaces soft findings when it cannot
11
+ * verify with confidence (the reviewer subagent in Phase 10 catches the rest).
12
+ */
13
+ import { DecisionFrontmatter } from "../ground/schemas.js";
14
+ import type { DiffEntry, SensorResult } from "./types.js";
15
+ /** All decisions accepted at HEAD with parsed frontmatter. */
16
+ export declare function loadAcceptedDecisions(repoRoot: string): DecisionFrontmatter[];
17
+ /** Decisions whose scope_globs overlap the diff. */
18
+ export declare function decisionsInScope(decisions: DecisionFrontmatter[], diff: DiffEntry[]): DecisionFrontmatter[];
19
+ /**
20
+ * Walk the mirror once and list every tracked file (not gitignored). This is
21
+ * used by assertion kinds that need to scan beyond the diff (e.g. when the
22
+ * assertion targets a file the agent didn't change).
23
+ */
24
+ export declare function listMirrorFiles(mirrorPath: string): string[];
25
+ /** Run the decision-assertions sensor. */
26
+ export declare function runDecisionAssertions(args: {
27
+ mirrorPath: string;
28
+ diff: DiffEntry[];
29
+ decisions: DecisionFrontmatter[];
30
+ }): SensorResult;