@soleri/core 9.2.0 → 9.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 (298) hide show
  1. package/data/flows/build.flow.yaml +8 -9
  2. package/data/flows/deliver.flow.yaml +9 -10
  3. package/data/flows/design.flow.yaml +3 -4
  4. package/data/flows/enhance.flow.yaml +5 -6
  5. package/data/flows/explore.flow.yaml +3 -4
  6. package/data/flows/fix.flow.yaml +5 -6
  7. package/data/flows/plan.flow.yaml +4 -5
  8. package/data/flows/review.flow.yaml +3 -4
  9. package/dist/curator/curator.d.ts.map +1 -1
  10. package/dist/curator/curator.js +98 -22
  11. package/dist/curator/curator.js.map +1 -1
  12. package/dist/engine/bin/soleri-engine.js.map +1 -1
  13. package/dist/engine/module-manifest.d.ts.map +1 -1
  14. package/dist/engine/module-manifest.js +21 -1
  15. package/dist/engine/module-manifest.js.map +1 -1
  16. package/dist/engine/register-engine.d.ts.map +1 -1
  17. package/dist/engine/register-engine.js +25 -1
  18. package/dist/engine/register-engine.js.map +1 -1
  19. package/dist/flows/gate-evaluator.js.map +1 -1
  20. package/dist/operator/operator-profile.d.ts.map +1 -1
  21. package/dist/operator/operator-profile.js +11 -5
  22. package/dist/operator/operator-profile.js.map +1 -1
  23. package/dist/operator/operator-signals.d.ts.map +1 -1
  24. package/dist/operator/operator-signals.js.map +1 -1
  25. package/dist/planning/evidence-collector.js.map +1 -1
  26. package/dist/planning/gap-passes.d.ts.map +1 -1
  27. package/dist/planning/gap-passes.js +23 -6
  28. package/dist/planning/gap-passes.js.map +1 -1
  29. package/dist/planning/gap-patterns.d.ts.map +1 -1
  30. package/dist/planning/gap-patterns.js +57 -11
  31. package/dist/planning/gap-patterns.js.map +1 -1
  32. package/dist/planning/github-projection.d.ts.map +1 -1
  33. package/dist/planning/github-projection.js +39 -20
  34. package/dist/planning/github-projection.js.map +1 -1
  35. package/dist/planning/impact-analyzer.d.ts.map +1 -1
  36. package/dist/planning/impact-analyzer.js +20 -18
  37. package/dist/planning/impact-analyzer.js.map +1 -1
  38. package/dist/planning/plan-lifecycle.d.ts.map +1 -1
  39. package/dist/planning/plan-lifecycle.js +22 -9
  40. package/dist/planning/plan-lifecycle.js.map +1 -1
  41. package/dist/planning/planner.d.ts.map +1 -1
  42. package/dist/planning/planner.js +60 -17
  43. package/dist/planning/planner.js.map +1 -1
  44. package/dist/planning/rationalization-detector.d.ts.map +1 -1
  45. package/dist/planning/rationalization-detector.js.map +1 -1
  46. package/dist/planning/reconciliation-engine.d.ts.map +1 -1
  47. package/dist/planning/reconciliation-engine.js.map +1 -1
  48. package/dist/planning/task-verifier.d.ts.map +1 -1
  49. package/dist/planning/task-verifier.js +14 -6
  50. package/dist/planning/task-verifier.js.map +1 -1
  51. package/dist/runtime/admin-setup-ops.d.ts.map +1 -1
  52. package/dist/runtime/admin-setup-ops.js +2 -1
  53. package/dist/runtime/admin-setup-ops.js.map +1 -1
  54. package/dist/runtime/branching-ops.d.ts +12 -0
  55. package/dist/runtime/branching-ops.d.ts.map +1 -0
  56. package/dist/runtime/branching-ops.js +100 -0
  57. package/dist/runtime/branching-ops.js.map +1 -0
  58. package/dist/runtime/context-health.d.ts.map +1 -1
  59. package/dist/runtime/context-health.js.map +1 -1
  60. package/dist/runtime/facades/branching-facade.d.ts +7 -0
  61. package/dist/runtime/facades/branching-facade.d.ts.map +1 -0
  62. package/dist/runtime/facades/branching-facade.js +8 -0
  63. package/dist/runtime/facades/branching-facade.js.map +1 -0
  64. package/dist/runtime/facades/chat-service-ops.d.ts.map +1 -1
  65. package/dist/runtime/facades/chat-service-ops.js +3 -1
  66. package/dist/runtime/facades/chat-service-ops.js.map +1 -1
  67. package/dist/runtime/facades/chat-transport-ops.d.ts.map +1 -1
  68. package/dist/runtime/facades/chat-transport-ops.js.map +1 -1
  69. package/dist/runtime/facades/index.d.ts.map +1 -1
  70. package/dist/runtime/facades/index.js +42 -0
  71. package/dist/runtime/facades/index.js.map +1 -1
  72. package/dist/runtime/facades/intake-facade.d.ts +9 -0
  73. package/dist/runtime/facades/intake-facade.d.ts.map +1 -0
  74. package/dist/runtime/facades/intake-facade.js +11 -0
  75. package/dist/runtime/facades/intake-facade.js.map +1 -0
  76. package/dist/runtime/facades/links-facade.d.ts +9 -0
  77. package/dist/runtime/facades/links-facade.d.ts.map +1 -0
  78. package/dist/runtime/facades/links-facade.js +10 -0
  79. package/dist/runtime/facades/links-facade.js.map +1 -0
  80. package/dist/runtime/facades/operator-facade.d.ts.map +1 -1
  81. package/dist/runtime/facades/operator-facade.js.map +1 -1
  82. package/dist/runtime/facades/plan-facade.d.ts.map +1 -1
  83. package/dist/runtime/facades/plan-facade.js +4 -1
  84. package/dist/runtime/facades/plan-facade.js.map +1 -1
  85. package/dist/runtime/facades/tier-facade.d.ts +7 -0
  86. package/dist/runtime/facades/tier-facade.d.ts.map +1 -0
  87. package/dist/runtime/facades/tier-facade.js +8 -0
  88. package/dist/runtime/facades/tier-facade.js.map +1 -0
  89. package/dist/runtime/facades/vault-facade.d.ts +9 -1
  90. package/dist/runtime/facades/vault-facade.d.ts.map +1 -1
  91. package/dist/runtime/facades/vault-facade.js +44 -187
  92. package/dist/runtime/facades/vault-facade.js.map +1 -1
  93. package/dist/runtime/github-integration.d.ts.map +1 -1
  94. package/dist/runtime/github-integration.js +11 -4
  95. package/dist/runtime/github-integration.js.map +1 -1
  96. package/dist/runtime/orchestrate-ops.d.ts.map +1 -1
  97. package/dist/runtime/orchestrate-ops.js +32 -10
  98. package/dist/runtime/orchestrate-ops.js.map +1 -1
  99. package/dist/runtime/planning-extra-ops.d.ts.map +1 -1
  100. package/dist/runtime/planning-extra-ops.js.map +1 -1
  101. package/dist/runtime/runtime.d.ts.map +1 -1
  102. package/dist/runtime/runtime.js +3 -1
  103. package/dist/runtime/runtime.js.map +1 -1
  104. package/dist/runtime/session-briefing.d.ts.map +1 -1
  105. package/dist/runtime/session-briefing.js +5 -1
  106. package/dist/runtime/session-briefing.js.map +1 -1
  107. package/dist/runtime/tier-ops.d.ts +13 -0
  108. package/dist/runtime/tier-ops.d.ts.map +1 -0
  109. package/dist/runtime/tier-ops.js +110 -0
  110. package/dist/runtime/tier-ops.js.map +1 -0
  111. package/dist/skills/sync-skills.d.ts.map +1 -1
  112. package/dist/skills/sync-skills.js +1 -1
  113. package/dist/skills/sync-skills.js.map +1 -1
  114. package/dist/vault/linking.d.ts.map +1 -1
  115. package/dist/vault/linking.js +41 -5
  116. package/dist/vault/linking.js.map +1 -1
  117. package/dist/vault/vault-entries.d.ts.map +1 -1
  118. package/dist/vault/vault-entries.js +68 -26
  119. package/dist/vault/vault-entries.js.map +1 -1
  120. package/dist/vault/vault-maintenance.d.ts.map +1 -1
  121. package/dist/vault/vault-maintenance.js +6 -2
  122. package/dist/vault/vault-maintenance.js.map +1 -1
  123. package/dist/vault/vault-markdown-sync.d.ts.map +1 -1
  124. package/dist/vault/vault-markdown-sync.js.map +1 -1
  125. package/dist/vault/vault-memories.d.ts.map +1 -1
  126. package/dist/vault/vault-memories.js +3 -1
  127. package/dist/vault/vault-memories.js.map +1 -1
  128. package/dist/vault/vault-schema.js +36 -10
  129. package/dist/vault/vault-schema.js.map +1 -1
  130. package/dist/vault/vault.d.ts.map +1 -1
  131. package/dist/vault/vault.js +5 -1
  132. package/dist/vault/vault.js.map +1 -1
  133. package/package.json +7 -7
  134. package/src/agency/agency-manager.test.ts +60 -40
  135. package/src/agency/default-rules.test.ts +17 -9
  136. package/src/capabilities/registry.test.ts +2 -12
  137. package/src/chat/agent-loop.test.ts +33 -43
  138. package/src/chat/mcp-bridge.test.ts +7 -2
  139. package/src/claudemd/inject.test.ts +2 -12
  140. package/src/context/context-engine.test.ts +96 -51
  141. package/src/control/intent-router.test.ts +3 -3
  142. package/src/curator/classifier.test.ts +14 -8
  143. package/src/curator/contradiction-detector.test.ts +30 -5
  144. package/src/curator/curator.ts +278 -56
  145. package/src/curator/duplicate-detector.test.ts +77 -15
  146. package/src/curator/quality-gate.test.ts +71 -31
  147. package/src/curator/tag-manager.test.ts +12 -4
  148. package/src/domain-packs/knowledge-installer.test.ts +2 -10
  149. package/src/domain-packs/token-resolver.test.ts +1 -3
  150. package/src/domain-packs/types.test.ts +16 -2
  151. package/src/enforcement/registry.test.ts +2 -8
  152. package/src/engine/bin/soleri-engine.ts +3 -1
  153. package/src/engine/module-manifest.test.ts +5 -4
  154. package/src/engine/module-manifest.ts +21 -1
  155. package/src/engine/register-engine.test.ts +6 -1
  156. package/src/engine/register-engine.ts +26 -3
  157. package/src/errors/classify.test.ts +6 -2
  158. package/src/errors/retry.test.ts +1 -4
  159. package/src/facades/facade-factory.test.ts +110 -64
  160. package/src/flows/epilogue.test.ts +16 -10
  161. package/src/flows/gate-evaluator.test.ts +12 -6
  162. package/src/flows/gate-evaluator.ts +1 -3
  163. package/src/governance/governance.test.ts +137 -21
  164. package/src/health/health-registry.test.ts +8 -1
  165. package/src/intake/content-classifier.test.ts +121 -51
  166. package/src/intake/dedup-gate.test.ts +38 -22
  167. package/src/intake/intake-pipeline.test.ts +5 -3
  168. package/src/intake/text-ingester.test.ts +26 -20
  169. package/src/llm/key-pool.test.ts +1 -3
  170. package/src/llm/llm-client.test.ts +1 -4
  171. package/src/llm/oauth-discovery.test.ts +16 -16
  172. package/src/llm/utils.test.ts +62 -18
  173. package/src/logging/logger.test.ts +4 -1
  174. package/src/loop/loop-manager.test.ts +2 -6
  175. package/src/migrations/migration-runner.edge-cases.test.ts +2 -7
  176. package/src/operator/operator-profile-extended.test.ts +15 -5
  177. package/src/operator/operator-profile.test.ts +26 -8
  178. package/src/operator/operator-profile.ts +38 -22
  179. package/src/operator/operator-signals-extended.test.ts +35 -23
  180. package/src/operator/operator-signals.test.ts +6 -10
  181. package/src/operator/operator-signals.ts +2 -1
  182. package/src/operator/prompts/hook-precompact-operator-dispatch.md +10 -6
  183. package/src/operator/prompts/subagent-soft-signal-extractor.md +5 -0
  184. package/src/operator/prompts/subagent-synthesis-cognition.md +19 -10
  185. package/src/operator/prompts/subagent-synthesis-communication.md +13 -7
  186. package/src/operator/prompts/subagent-synthesis-technical.md +19 -9
  187. package/src/operator/prompts/subagent-synthesis-trust.md +27 -21
  188. package/src/persona/defaults.test.ts +1 -5
  189. package/src/planning/evidence-collector.test.ts +147 -38
  190. package/src/planning/evidence-collector.ts +1 -4
  191. package/src/planning/gap-analysis-alternatives.test.ts +41 -11
  192. package/src/planning/gap-passes.test.ts +215 -33
  193. package/src/planning/gap-passes.ts +115 -46
  194. package/src/planning/gap-patterns.test.ts +87 -13
  195. package/src/planning/gap-patterns.ts +114 -31
  196. package/src/planning/github-projection.test.ts +6 -1
  197. package/src/planning/github-projection.ts +41 -20
  198. package/src/planning/impact-analyzer.test.ts +10 -23
  199. package/src/planning/impact-analyzer.ts +33 -46
  200. package/src/planning/plan-lifecycle.test.ts +103 -36
  201. package/src/planning/plan-lifecycle.ts +49 -18
  202. package/src/planning/planner.test.ts +12 -2
  203. package/src/planning/planner.ts +198 -58
  204. package/src/planning/rationalization-detector.test.ts +5 -20
  205. package/src/planning/rationalization-detector.ts +14 -16
  206. package/src/planning/reconciliation-engine.test.ts +20 -3
  207. package/src/planning/reconciliation-engine.ts +1 -2
  208. package/src/planning/task-verifier.test.ts +59 -27
  209. package/src/planning/task-verifier.ts +15 -9
  210. package/src/playbooks/playbook-executor.test.ts +1 -3
  211. package/src/plugins/plugin-loader.test.ts +19 -14
  212. package/src/plugins/plugin-registry.test.ts +45 -33
  213. package/src/project/project-registry.test.ts +23 -12
  214. package/src/prompts/template-manager.test.ts +4 -1
  215. package/src/queue/job-queue.test.ts +10 -14
  216. package/src/runtime/admin-extra-ops.test.ts +5 -19
  217. package/src/runtime/admin-ops.test.ts +1 -3
  218. package/src/runtime/admin-setup-ops.test.ts +3 -4
  219. package/src/runtime/admin-setup-ops.ts +9 -2
  220. package/src/runtime/archive-ops.test.ts +4 -1
  221. package/src/runtime/branching-ops.test.ts +144 -0
  222. package/src/runtime/branching-ops.ts +107 -0
  223. package/src/runtime/capture-ops.test.ts +7 -21
  224. package/src/runtime/chain-ops.test.ts +16 -6
  225. package/src/runtime/claude-md-helpers.test.ts +1 -3
  226. package/src/runtime/context-health.test.ts +1 -3
  227. package/src/runtime/context-health.ts +1 -3
  228. package/src/runtime/curator-extra-ops.test.ts +3 -1
  229. package/src/runtime/domain-ops.test.ts +46 -36
  230. package/src/runtime/facades/admin-facade.test.ts +1 -4
  231. package/src/runtime/facades/archive-facade.test.ts +21 -7
  232. package/src/runtime/facades/brain-facade.test.ts +176 -72
  233. package/src/runtime/facades/branching-facade.test.ts +43 -0
  234. package/src/runtime/facades/branching-facade.ts +11 -0
  235. package/src/runtime/facades/chat-facade.test.ts +81 -28
  236. package/src/runtime/facades/chat-service-ops.test.ts +178 -73
  237. package/src/runtime/facades/chat-service-ops.ts +3 -1
  238. package/src/runtime/facades/chat-session-ops.test.ts +25 -10
  239. package/src/runtime/facades/chat-transport-ops.test.ts +101 -34
  240. package/src/runtime/facades/chat-transport-ops.ts +0 -1
  241. package/src/runtime/facades/context-facade.test.ts +19 -4
  242. package/src/runtime/facades/control-facade.test.ts +3 -3
  243. package/src/runtime/facades/index.ts +42 -0
  244. package/src/runtime/facades/intake-facade.test.ts +215 -0
  245. package/src/runtime/facades/intake-facade.ts +14 -0
  246. package/src/runtime/facades/links-facade.test.ts +203 -0
  247. package/src/runtime/facades/links-facade.ts +13 -0
  248. package/src/runtime/facades/loop-facade.test.ts +22 -5
  249. package/src/runtime/facades/memory-facade.test.ts +19 -5
  250. package/src/runtime/facades/operator-facade.test.ts +17 -4
  251. package/src/runtime/facades/operator-facade.ts +11 -3
  252. package/src/runtime/facades/orchestrate-facade.test.ts +7 -1
  253. package/src/runtime/facades/plan-facade.test.ts +29 -12
  254. package/src/runtime/facades/plan-facade.ts +7 -2
  255. package/src/runtime/facades/tier-facade.test.ts +47 -0
  256. package/src/runtime/facades/tier-facade.ts +11 -0
  257. package/src/runtime/facades/vault-facade.test.ts +174 -242
  258. package/src/runtime/facades/vault-facade.ts +55 -199
  259. package/src/runtime/github-integration.ts +11 -8
  260. package/src/runtime/grading-ops.test.ts +39 -8
  261. package/src/runtime/intake-ops.test.ts +69 -16
  262. package/src/runtime/loop-ops.test.ts +16 -6
  263. package/src/runtime/memory-cross-project-ops.test.ts +25 -14
  264. package/src/runtime/orchestrate-ops.ts +54 -27
  265. package/src/runtime/pack-ops.test.ts +23 -6
  266. package/src/runtime/planning-extra-ops.test.ts +17 -7
  267. package/src/runtime/planning-extra-ops.ts +3 -1
  268. package/src/runtime/playbook-ops.test.ts +26 -3
  269. package/src/runtime/plugin-ops.test.ts +83 -25
  270. package/src/runtime/project-ops.test.ts +26 -6
  271. package/src/runtime/runtime.ts +3 -1
  272. package/src/runtime/session-briefing.test.ts +183 -54
  273. package/src/runtime/session-briefing.ts +8 -2
  274. package/src/runtime/sync-ops.test.ts +3 -12
  275. package/src/runtime/telemetry-ops.test.ts +31 -6
  276. package/src/runtime/tier-ops.test.ts +159 -0
  277. package/src/runtime/tier-ops.ts +119 -0
  278. package/src/runtime/vault-extra-ops.test.ts +32 -8
  279. package/src/runtime/vault-sharing-ops.test.ts +1 -4
  280. package/src/skills/sync-skills.ts +2 -12
  281. package/src/transport/ws-server.test.ts +7 -4
  282. package/src/vault/__tests__/vault-characterization.test.ts +492 -81
  283. package/src/vault/linking.test.ts +50 -17
  284. package/src/vault/linking.ts +48 -7
  285. package/src/vault/obsidian-sync.test.ts +6 -3
  286. package/src/vault/scope-detector.test.ts +1 -3
  287. package/src/vault/vault-branching.test.ts +9 -7
  288. package/src/vault/vault-entries.ts +209 -65
  289. package/src/vault/vault-maintenance.ts +7 -12
  290. package/src/vault/vault-manager.test.ts +10 -10
  291. package/src/vault/vault-markdown-sync.ts +4 -1
  292. package/src/vault/vault-memories.ts +7 -7
  293. package/src/vault/vault-schema.ts +72 -15
  294. package/src/vault/vault.ts +55 -9
  295. package/src/brain/strength-scorer.ts +0 -404
  296. package/src/engine/index.ts +0 -21
  297. package/src/persona/index.ts +0 -9
  298. package/src/vault/vault-interfaces.ts +0 -56
@@ -24,9 +24,27 @@ function makePlan(overrides: Partial<Plan> = {}): Plan {
24
24
  status: 'executing',
25
25
  decisions: [],
26
26
  tasks: [
27
- { id: 'task-1', title: 'Add auth middleware', description: 'Create auth middleware for Express', status: 'completed', updatedAt: Date.now() },
28
- { id: 'task-2', title: 'Add login endpoint', description: 'POST /auth/login endpoint', status: 'completed', updatedAt: Date.now() },
29
- { id: 'task-3', title: 'Add JWT utils', description: 'JWT signing and verification utilities', status: 'pending', updatedAt: Date.now() },
27
+ {
28
+ id: 'task-1',
29
+ title: 'Add auth middleware',
30
+ description: 'Create auth middleware for Express',
31
+ status: 'completed',
32
+ updatedAt: Date.now(),
33
+ },
34
+ {
35
+ id: 'task-2',
36
+ title: 'Add login endpoint',
37
+ description: 'POST /auth/login endpoint',
38
+ status: 'completed',
39
+ updatedAt: Date.now(),
40
+ },
41
+ {
42
+ id: 'task-3',
43
+ title: 'Add JWT utils',
44
+ description: 'JWT signing and verification utilities',
45
+ status: 'pending',
46
+ updatedAt: Date.now(),
47
+ },
30
48
  ],
31
49
  checks: [],
32
50
  createdAt: Date.now(),
@@ -97,7 +115,13 @@ describe('collectGitEvidence', () => {
97
115
 
98
116
  const plan = makePlan({
99
117
  tasks: [
100
- { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'skipped', updatedAt: Date.now() },
118
+ {
119
+ id: 'task-1',
120
+ title: 'Add auth middleware',
121
+ description: 'Auth middleware',
122
+ status: 'skipped',
123
+ updatedAt: Date.now(),
124
+ },
101
125
  ],
102
126
  });
103
127
  const report = collectGitEvidence(plan, '/project', 'main');
@@ -112,13 +136,21 @@ describe('collectGitEvidence', () => {
112
136
 
113
137
  const plan = makePlan({
114
138
  tasks: [
115
- { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'completed', updatedAt: Date.now() },
139
+ {
140
+ id: 'task-1',
141
+ title: 'Add auth middleware',
142
+ description: 'Auth middleware',
143
+ status: 'completed',
144
+ updatedAt: Date.now(),
145
+ },
116
146
  ],
117
147
  });
118
148
  const report = collectGitEvidence(plan, '/project', 'main');
119
149
 
120
150
  expect(report.unplannedChanges.length).toBeGreaterThanOrEqual(1);
121
- const configChange = report.unplannedChanges.find((uc) => uc.file.path === 'src/config/database.ts');
151
+ const configChange = report.unplannedChanges.find(
152
+ (uc) => uc.file.path === 'src/config/database.ts',
153
+ );
122
154
  expect(configChange).toBeDefined();
123
155
  expect(configChange?.possibleReason).toBe('configuration change');
124
156
  });
@@ -130,8 +162,20 @@ describe('collectGitEvidence', () => {
130
162
 
131
163
  const plan = makePlan({
132
164
  tasks: [
133
- { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'completed', updatedAt: Date.now() },
134
- { id: 'task-2', title: 'Add login endpoint', description: 'Login endpoint', status: 'completed', updatedAt: Date.now() },
165
+ {
166
+ id: 'task-1',
167
+ title: 'Add auth middleware',
168
+ description: 'Auth middleware',
169
+ status: 'completed',
170
+ updatedAt: Date.now(),
171
+ },
172
+ {
173
+ id: 'task-2',
174
+ title: 'Add login endpoint',
175
+ description: 'Login endpoint',
176
+ status: 'completed',
177
+ updatedAt: Date.now(),
178
+ },
135
179
  ],
136
180
  });
137
181
  const report = collectGitEvidence(plan, '/project', 'main');
@@ -141,9 +185,7 @@ describe('collectGitEvidence', () => {
141
185
  });
142
186
 
143
187
  it('returns 100% accuracy for empty task list', () => {
144
- mockExecFileSync
145
- .mockReturnValueOnce('main\n')
146
- .mockReturnValueOnce('');
188
+ mockExecFileSync.mockReturnValueOnce('main\n').mockReturnValueOnce('');
147
189
 
148
190
  const plan = makePlan({ tasks: [] });
149
191
  const report = collectGitEvidence(plan, '/project', 'main');
@@ -167,12 +209,20 @@ describe('collectGitEvidence', () => {
167
209
  it('falls back to HEAD~5 when branch diff fails', () => {
168
210
  mockExecFileSync
169
211
  .mockReturnValueOnce('feature/auth\n') // rev-parse
170
- .mockImplementationOnce(() => { throw new Error('bad revision'); }) // main...HEAD fails
212
+ .mockImplementationOnce(() => {
213
+ throw new Error('bad revision');
214
+ }) // main...HEAD fails
171
215
  .mockReturnValueOnce('M\tsrc/auth/middleware.ts\n'); // HEAD~5 fallback
172
216
 
173
217
  const plan = makePlan({
174
218
  tasks: [
175
- { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'completed', updatedAt: Date.now() },
219
+ {
220
+ id: 'task-1',
221
+ title: 'Add auth middleware',
222
+ description: 'Auth middleware',
223
+ status: 'completed',
224
+ updatedAt: Date.now(),
225
+ },
176
226
  ],
177
227
  });
178
228
  const report = collectGitEvidence(plan, '/project', 'main');
@@ -188,7 +238,13 @@ describe('collectGitEvidence', () => {
188
238
 
189
239
  const plan = makePlan({
190
240
  tasks: [
191
- { id: 'task-1', title: 'Add login endpoint', description: 'Login endpoint', status: 'completed', updatedAt: Date.now() },
241
+ {
242
+ id: 'task-1',
243
+ title: 'Add login endpoint',
244
+ description: 'Login endpoint',
245
+ status: 'completed',
246
+ updatedAt: Date.now(),
247
+ },
192
248
  ],
193
249
  });
194
250
  collectGitEvidence(plan, '/project', 'main');
@@ -206,7 +262,13 @@ describe('collectGitEvidence', () => {
206
262
 
207
263
  const plan = makePlan({
208
264
  tasks: [
209
- { id: 'task-1', title: 'Add auth middleware', description: 'Auth middleware', status: 'completed', updatedAt: Date.now() },
265
+ {
266
+ id: 'task-1',
267
+ title: 'Add auth middleware',
268
+ description: 'Auth middleware',
269
+ status: 'completed',
270
+ updatedAt: Date.now(),
271
+ },
210
272
  ],
211
273
  });
212
274
  const report = collectGitEvidence(plan, '/project', 'main');
@@ -224,7 +286,13 @@ describe('collectGitEvidence', () => {
224
286
 
225
287
  const plan = makePlan({
226
288
  tasks: [
227
- { id: 'task-1', title: 'Remove old auth middleware', description: 'Delete old auth middleware files', status: 'completed', updatedAt: Date.now() },
289
+ {
290
+ id: 'task-1',
291
+ title: 'Remove old auth middleware',
292
+ description: 'Delete old auth middleware files',
293
+ status: 'completed',
294
+ updatedAt: Date.now(),
295
+ },
228
296
  ],
229
297
  });
230
298
  const report = collectGitEvidence(plan, '/project', 'main');
@@ -252,11 +320,11 @@ describe('collectGitEvidence', () => {
252
320
  .mockReturnValueOnce('feature/auth\n')
253
321
  .mockReturnValueOnce(
254
322
  'M\tpackage.json\n' +
255
- 'M\tsrc/types/auth.d.ts\n' +
256
- 'A\tsrc/tests/auth.test.ts\n' +
257
- 'M\tREADME.md\n' +
258
- 'M\tsrc/index.ts\n' +
259
- 'M\tsrc/random/file.ts\n'
323
+ 'M\tsrc/types/auth.d.ts\n' +
324
+ 'A\tsrc/tests/auth.test.ts\n' +
325
+ 'M\tREADME.md\n' +
326
+ 'M\tsrc/index.ts\n' +
327
+ 'M\tsrc/random/file.ts\n',
260
328
  );
261
329
 
262
330
  const plan = makePlan({ tasks: [] });
@@ -276,7 +344,13 @@ describe('collectVerificationGaps', () => {
276
344
  it('returns empty array when no tasks have verification', () => {
277
345
  const tasks: PlanTask[] = [makeTask()];
278
346
  const evidence: GitTaskEvidence[] = [
279
- { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
347
+ {
348
+ taskId: 'task-1',
349
+ taskTitle: 'Fix auth bug',
350
+ plannedStatus: 'completed',
351
+ matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
352
+ verdict: 'DONE',
353
+ },
280
354
  ];
281
355
 
282
356
  const gaps = collectVerificationGaps(tasks, evidence);
@@ -287,14 +361,18 @@ describe('collectVerificationGaps', () => {
287
361
  const tasks: PlanTask[] = [
288
362
  makeTask({
289
363
  verification: {
290
- findings: [
291
- { description: 'Auth timeout under load', severity: 'high', proven: false },
292
- ],
364
+ findings: [{ description: 'Auth timeout under load', severity: 'high', proven: false }],
293
365
  },
294
366
  }),
295
367
  ];
296
368
  const evidence: GitTaskEvidence[] = [
297
- { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
369
+ {
370
+ taskId: 'task-1',
371
+ taskTitle: 'Fix auth bug',
372
+ plannedStatus: 'completed',
373
+ matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
374
+ verdict: 'DONE',
375
+ },
298
376
  ];
299
377
 
300
378
  const gaps = collectVerificationGaps(tasks, evidence);
@@ -308,13 +386,24 @@ describe('collectVerificationGaps', () => {
308
386
  makeTask({
309
387
  verification: {
310
388
  findings: [
311
- { description: 'Auth timeout under load', severity: 'high', proven: true, proof: 'Reproduced with load test' },
389
+ {
390
+ description: 'Auth timeout under load',
391
+ severity: 'high',
392
+ proven: true,
393
+ proof: 'Reproduced with load test',
394
+ },
312
395
  ],
313
396
  },
314
397
  }),
315
398
  ];
316
399
  const evidence: GitTaskEvidence[] = [
317
- { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
400
+ {
401
+ taskId: 'task-1',
402
+ taskTitle: 'Fix auth bug',
403
+ plannedStatus: 'completed',
404
+ matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
405
+ verdict: 'DONE',
406
+ },
318
407
  ];
319
408
 
320
409
  const gaps = collectVerificationGaps(tasks, evidence);
@@ -325,14 +414,18 @@ describe('collectVerificationGaps', () => {
325
414
  const tasks: PlanTask[] = [
326
415
  makeTask({
327
416
  verification: {
328
- findings: [
329
- { description: 'Some finding', severity: 'medium', proven: false },
330
- ],
417
+ findings: [{ description: 'Some finding', severity: 'medium', proven: false }],
331
418
  },
332
419
  }),
333
420
  ];
334
421
  const evidence: GitTaskEvidence[] = [
335
- { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/new-auth.ts', status: 'added' }], verdict: 'DONE' },
422
+ {
423
+ taskId: 'task-1',
424
+ taskTitle: 'Fix auth bug',
425
+ plannedStatus: 'completed',
426
+ matchedFiles: [{ path: 'src/new-auth.ts', status: 'added' }],
427
+ verdict: 'DONE',
428
+ },
336
429
  ];
337
430
 
338
431
  const gaps = collectVerificationGaps(tasks, evidence);
@@ -343,9 +436,7 @@ describe('collectVerificationGaps', () => {
343
436
  const tasks: PlanTask[] = [
344
437
  makeTask({
345
438
  verification: {
346
- findings: [
347
- { description: 'Some finding', severity: 'medium', proven: false },
348
- ],
439
+ findings: [{ description: 'Some finding', severity: 'medium', proven: false }],
349
440
  },
350
441
  }),
351
442
  ];
@@ -368,7 +459,13 @@ describe('collectVerificationGaps', () => {
368
459
  }),
369
460
  ];
370
461
  const evidence: GitTaskEvidence[] = [
371
- { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
462
+ {
463
+ taskId: 'task-1',
464
+ taskTitle: 'Fix auth bug',
465
+ plannedStatus: 'completed',
466
+ matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
467
+ verdict: 'DONE',
468
+ },
372
469
  ];
373
470
 
374
471
  const gaps = collectVerificationGaps(tasks, evidence);
@@ -394,8 +491,20 @@ describe('collectVerificationGaps', () => {
394
491
  }),
395
492
  ];
396
493
  const evidence: GitTaskEvidence[] = [
397
- { taskId: 'task-1', taskTitle: 'Fix auth bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }], verdict: 'DONE' },
398
- { taskId: 'task-2', taskTitle: 'Fix other bug', plannedStatus: 'completed', matchedFiles: [{ path: 'src/other.ts', status: 'modified' }], verdict: 'DONE' },
494
+ {
495
+ taskId: 'task-1',
496
+ taskTitle: 'Fix auth bug',
497
+ plannedStatus: 'completed',
498
+ matchedFiles: [{ path: 'src/auth.ts', status: 'modified' }],
499
+ verdict: 'DONE',
500
+ },
501
+ {
502
+ taskId: 'task-2',
503
+ taskTitle: 'Fix other bug',
504
+ plannedStatus: 'completed',
505
+ matchedFiles: [{ path: 'src/other.ts', status: 'modified' }],
506
+ verdict: 'DONE',
507
+ },
399
508
  ];
400
509
 
401
510
  const gaps = collectVerificationGaps(tasks, evidence);
@@ -146,10 +146,7 @@ export function collectVerificationGaps(
146
146
  /**
147
147
  * Check if a task modifies existing code (vs. creating new files).
148
148
  */
149
- function taskModifiesExistingCode(
150
- task: PlanTask,
151
- evidence: GitTaskEvidence[],
152
- ): boolean {
149
+ function taskModifiesExistingCode(task: PlanTask, evidence: GitTaskEvidence[]): boolean {
153
150
  const taskEvidence = evidence.find((e) => e.taskId === task.id);
154
151
  if (!taskEvidence) return false;
155
152
  return taskEvidence.matchedFiles.some((f) => f.status === 'modified');
@@ -15,13 +15,40 @@ function makePlan(overrides: Partial<Plan> = {}): Plan {
15
15
  scope: 'Auth module, middleware, and user service. Does not include OAuth providers.',
16
16
  status: 'draft',
17
17
  decisions: [
18
- { decision: 'Use JWT for stateless auth', rationale: 'Because it scales horizontally without shared session store' },
18
+ {
19
+ decision: 'Use JWT for stateless auth',
20
+ rationale: 'Because it scales horizontally without shared session store',
21
+ },
19
22
  ],
20
23
  tasks: [
21
- { id: 'task-1', title: 'Add JWT signing', description: 'Implement JWT sign/verify using built-in crypto module', status: 'pending', updatedAt: Date.now() },
22
- { id: 'task-2', title: 'Add auth middleware', description: 'Create Express middleware that validates JWT from Authorization header', status: 'pending', updatedAt: Date.now() },
23
- { id: 'task-3', title: 'Add login endpoint', description: 'POST /auth/login returns JWT after verifying credentials', status: 'pending', updatedAt: Date.now() },
24
- { id: 'task-4', title: 'Add test coverage', description: 'Test JWT signing, middleware rejection, and login flow end-to-end', status: 'pending', updatedAt: Date.now() },
24
+ {
25
+ id: 'task-1',
26
+ title: 'Add JWT signing',
27
+ description: 'Implement JWT sign/verify using built-in crypto module',
28
+ status: 'pending',
29
+ updatedAt: Date.now(),
30
+ },
31
+ {
32
+ id: 'task-2',
33
+ title: 'Add auth middleware',
34
+ description: 'Create Express middleware that validates JWT from Authorization header',
35
+ status: 'pending',
36
+ updatedAt: Date.now(),
37
+ },
38
+ {
39
+ id: 'task-3',
40
+ title: 'Add login endpoint',
41
+ description: 'POST /auth/login returns JWT after verifying credentials',
42
+ status: 'pending',
43
+ updatedAt: Date.now(),
44
+ },
45
+ {
46
+ id: 'task-4',
47
+ title: 'Add test coverage',
48
+ description: 'Test JWT signing, middleware rejection, and login flow end-to-end',
49
+ status: 'pending',
50
+ updatedAt: Date.now(),
51
+ },
25
52
  ],
26
53
  checks: [],
27
54
  createdAt: Date.now(),
@@ -148,12 +175,15 @@ describe('Pass 8: Alternative Analysis', () => {
148
175
 
149
176
  it('does not modify gaps from passes 1-7', () => {
150
177
  const plan = makePlan({
151
- alternatives: [makeAlternative(), makeAlternative({
152
- approach: 'Alternative B',
153
- pros: ['Pro'],
154
- cons: ['Con'],
155
- rejected_reason: 'Not suitable',
156
- })],
178
+ alternatives: [
179
+ makeAlternative(),
180
+ makeAlternative({
181
+ approach: 'Alternative B',
182
+ pros: ['Pro'],
183
+ cons: ['Con'],
184
+ rejected_reason: 'Not suitable',
185
+ }),
186
+ ],
157
187
  });
158
188
  const gapsWithAlts = runGapAnalysis(plan);
159
189