@brainfile/cli 0.16.1 → 0.17.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. package/.brainfile/brainfile.md.v1.bak +171 -0
  2. package/.brainfile/logs/task-1.md +206 -0
  3. package/.brainfile/logs/task-2.md +482 -0
  4. package/.brainfile/logs/task-3.md +314 -0
  5. package/.github/workflows/release.yml +35 -0
  6. package/README.md +3 -5
  7. package/dist/cli.js +29 -53
  8. package/dist/cli.js.map +1 -1
  9. package/dist/commands/add.d.ts +2 -0
  10. package/dist/commands/add.d.ts.map +1 -1
  11. package/dist/commands/add.js +16 -2
  12. package/dist/commands/add.js.map +1 -1
  13. package/dist/commands/complete.d.ts +5 -7
  14. package/dist/commands/complete.d.ts.map +1 -1
  15. package/dist/commands/complete.js +76 -127
  16. package/dist/commands/complete.js.map +1 -1
  17. package/dist/commands/contract.d.ts +46 -2
  18. package/dist/commands/contract.d.ts.map +1 -1
  19. package/dist/commands/contract.js +499 -2
  20. package/dist/commands/contract.js.map +1 -1
  21. package/dist/commands/mcp.d.ts.map +1 -1
  22. package/dist/commands/mcp.js +1037 -1763
  23. package/dist/commands/mcp.js.map +1 -1
  24. package/dist/commands/migrate.d.ts +0 -2
  25. package/dist/commands/migrate.d.ts.map +1 -1
  26. package/dist/commands/migrate.js +23 -89
  27. package/dist/commands/migrate.js.map +1 -1
  28. package/dist/commands/move.js.map +1 -1
  29. package/dist/commands/schema.d.ts.map +1 -1
  30. package/dist/commands/schema.js +6 -1
  31. package/dist/commands/schema.js.map +1 -1
  32. package/dist/index.d.ts +1 -1
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +4 -1
  35. package/dist/index.js.map +1 -1
  36. package/dist/lib/contractRunner.d.ts.map +1 -1
  37. package/dist/lib/contractRunner.js +76 -49
  38. package/dist/lib/contractRunner.js.map +1 -1
  39. package/dist/mcp/tools/contract.d.ts +25 -0
  40. package/dist/mcp/tools/contract.d.ts.map +1 -0
  41. package/dist/mcp/tools/contract.js +33 -0
  42. package/dist/mcp/tools/contract.js.map +1 -0
  43. package/dist/utils/config.d.ts.map +1 -1
  44. package/dist/utils/config.js +22 -9
  45. package/dist/utils/config.js.map +1 -1
  46. package/dist/utils/contractSpec.d.ts +2 -0
  47. package/dist/utils/contractSpec.d.ts.map +1 -1
  48. package/dist/utils/contractSpec.js +5 -1
  49. package/dist/utils/contractSpec.js.map +1 -1
  50. package/dist/utils/hook-settings.d.ts.map +1 -1
  51. package/dist/utils/hook-settings.js +5 -1
  52. package/dist/utils/hook-settings.js.map +1 -1
  53. package/dist/validation/command-lint.d.ts +11 -0
  54. package/dist/validation/command-lint.d.ts.map +1 -0
  55. package/dist/validation/command-lint.js +88 -0
  56. package/dist/validation/command-lint.js.map +1 -0
  57. package/package.json +2 -2
  58. package/dist/commands/context.d.ts +0 -19
  59. package/dist/commands/context.d.ts.map +0 -1
  60. package/dist/commands/context.js +0 -103
  61. package/dist/commands/context.js.map +0 -1
  62. package/dist/commands/history.d.ts +0 -18
  63. package/dist/commands/history.d.ts.map +0 -1
  64. package/dist/commands/history.js +0 -92
  65. package/dist/commands/history.js.map +0 -1
  66. package/dist/commands/ledger-rebuild.d.ts +0 -17
  67. package/dist/commands/ledger-rebuild.d.ts.map +0 -1
  68. package/dist/commands/ledger-rebuild.js +0 -287
  69. package/dist/commands/ledger-rebuild.js.map +0 -1
  70. package/dist/commands/ledger.d.ts +0 -20
  71. package/dist/commands/ledger.d.ts.map +0 -1
  72. package/dist/commands/ledger.js +0 -111
  73. package/dist/commands/ledger.js.map +0 -1
  74. package/dist/commands/migrate-ledger.d.ts +0 -17
  75. package/dist/commands/migrate-ledger.d.ts.map +0 -1
  76. package/dist/commands/migrate-ledger.js +0 -127
  77. package/dist/commands/migrate-ledger.js.map +0 -1
  78. package/dist/commands/stats.d.ts +0 -20
  79. package/dist/commands/stats.d.ts.map +0 -1
  80. package/dist/commands/stats.js +0 -151
  81. package/dist/commands/stats.js.map +0 -1
  82. package/dist/tui/components/ArchivePanel.d.ts +0 -16
  83. package/dist/tui/components/ArchivePanel.d.ts.map +0 -1
  84. package/dist/tui/components/ArchivePanel.js +0 -115
  85. package/dist/tui/components/ArchivePanel.js.map +0 -1
  86. package/dist/utils/date-helpers.d.ts +0 -20
  87. package/dist/utils/date-helpers.d.ts.map +0 -1
  88. package/dist/utils/date-helpers.js +0 -54
  89. package/dist/utils/date-helpers.js.map +0 -1
  90. package/dist/utils/v2-tasks.d.ts +0 -121
  91. package/dist/utils/v2-tasks.d.ts.map +0 -1
  92. package/dist/utils/v2-tasks.js +0 -384
  93. package/dist/utils/v2-tasks.js.map +0 -1
@@ -0,0 +1,482 @@
1
+ ---
2
+ id: task-2
3
+ title: Use core compound contract operations in CLI contractRunner
4
+ description: |-
5
+ Replace direct contract.status mutations and setTaskContractStatus calls in cli/src/lib/contractRunner.ts with the new compound operations from @brainfile/core@0.15.1.
6
+
7
+ The V2 code paths (pickupContractV2, deliverContractV2, validateContractV2) should use:
8
+ - pickupTaskContract() — sets in_progress + moves column to in-progress
9
+ - deliverTaskContract() — sets delivered + moves column to review
10
+ - completeTaskContract() — sets done + archives to logs (validate success path)
11
+ - failTaskContract() — sets failed + adds feedback (validate failure path)
12
+
13
+ V1 code paths stay as-is (legacy board format).
14
+
15
+ Key behavior change: `brainfile contract validate` on a passing task will now archive it off the board. This is the intended UX fix — done = off the board.
16
+
17
+ Also bump @brainfile/core dependency to ^0.15.1 in cli/package.json.
18
+ priority: high
19
+ tags:
20
+ - contract
21
+ - ux
22
+ - core-upgrade
23
+ assignee: implement
24
+ relatedFiles:
25
+ - cli/src/lib/contractRunner.ts
26
+ - cli/src/commands/contract.ts
27
+ - cli/src/commands/mcp.ts
28
+ - cli/package.json
29
+ subtasks:
30
+ - id: task-2-1
31
+ title: Bump @brainfile/core to ^0.15.1 in cli/package.json
32
+ completed: false
33
+ - id: task-2-2
34
+ title: Replace pickupContractV2 internals with pickupTaskContract()
35
+ completed: false
36
+ - id: task-2-3
37
+ title: Replace deliverContractV2 internals with deliverTaskContract()
38
+ completed: false
39
+ - id: task-2-4
40
+ title: Replace validateContractV2 success path with completeTaskContract()
41
+ completed: false
42
+ - id: task-2-5
43
+ title: Replace validateContractV2 failure path with failTaskContract()
44
+ completed: false
45
+ - id: task-2-6
46
+ title: Update MCP contract tool handlers to pass logsDir for completion
47
+ completed: false
48
+ - id: task-2-7
49
+ title: Update existing contract tests for new archive-on-done behavior
50
+ completed: false
51
+ - id: task-2-8
52
+ title: Add tests verifying column sync on pickup/deliver
53
+ completed: false
54
+ createdAt: "2026-03-06T20:35:53.495Z"
55
+ updatedAt: "2026-03-07T12:53:33.466Z"
56
+ contract:
57
+ status: done
58
+ deliverables:
59
+ - type: file
60
+ path: src/lib/contractRunner.ts
61
+ description: Replace V2 pickup/deliver/validate with core compound ops
62
+ - type: test
63
+ path: src/__tests__/contract.test.ts
64
+ description: Updated tests for archive-on-done and column sync
65
+ validation:
66
+ commands:
67
+ - npm test
68
+ constraints:
69
+ - V1 code paths must remain untouched
70
+ - pickupContractV2 must still return contract context markdown
71
+ - validate success must archive task to logs via completeTaskContract
72
+ - All existing contract tests must pass or be updated for new behavior
73
+ metrics:
74
+ reworkCount: 11
75
+ pickedUpAt: "2026-03-07T12:52:36.236Z"
76
+ baseline:
77
+ src/lib/contractRunner.ts: 7346371ed8445e7a
78
+ src/__tests__/contract.test.ts: 4ee4a1e32a025a2a
79
+ deliveredAt: "2026-03-07T12:53:26.239Z"
80
+ duration: 50
81
+ deliverablePaths:
82
+ - src/lib/contractRunner.ts
83
+ - src/__tests__/contract.test.ts
84
+ evidence:
85
+ assertions: []
86
+ validationPlan:
87
+ intent: smoke
88
+ mode: legacy-raw
89
+ legacy: true
90
+ warnings:
91
+ - validation.commands is treated as a legacy raw-shell alias; prefer validation.profile/checks or validation.raw.commands
92
+ compiledAt: "2026-03-07T12:53:26.240Z"
93
+ passed: true
94
+ steps:
95
+ - id: legacy:smoke:1:1
96
+ label: smoke raw validation 1
97
+ command: npm test
98
+ source: legacy-raw
99
+ legacy: true
100
+ intent: smoke
101
+ passed: true
102
+ output: |-
103
+ > @brainfile/cli@0.17.0 test
104
+ > jest
105
+
106
+ console.log
107
+ Backup: /tmp/brainfile-migrate-v2-test-rxJA8i/.brainfile/brainfile.md.v1.bak
108
+
109
+ at migrateBrainfileToV2 (src/commands/migrate.ts:166:13)
110
+
111
+ console.log
112
+ Migration to v2 complete!
113
+
114
+ at migrateBrainfileToV2 (src/commands/migrate.ts:274:11)
115
+
116
+ console.log
117
+
118
+
119
+ at migrateBrainfileToV2 (src/commands/migrate.ts:275:11)
120
+
121
+ console.log
122
+ Active tasks: 3 files in board/
123
+
124
+ at migrateBrainfileToV2 (src/commands/migrate.ts:276:11)
125
+
126
+ console.log
127
+ Completed/logs: 1 files in logs/
128
+
129
+ at migrateBrainfileToV2 (src/commands/migrate.ts:277:11)
130
+
131
+ console.log
132
+ Board config: /tmp/brainfile-migrate-v2-test-rxJA8i/.brainfile/brainfile.md (config-only)
133
+
134
+ at migrateBrainfileToV2 (src/commands/migrate.ts:278:11)
135
+
136
+ console.log
137
+ Backup: /tmp/brainfile-migrate-v2-test-rxJA8i/.brainfile/brainfile.md.v1.bak
138
+
139
+ at migrateBrainfileToV2 (src/commands/migrate.ts:279:11)
140
+
141
+ console.log
142
+ Backup: /tmp/brainfile-migrate-v2-test-MBTZvO/.brainfile/brainfile.md.v1.bak
143
+
144
+ at migrateBrainfileToV2 (src/commands/migrate.ts:166:13)
145
+
146
+ console.log
147
+ Migration to v2 complete!
148
+
149
+ at migrateBrainfileToV2 (src/commands/migrate.ts:274:11)
150
+
151
+ console.log
152
+
153
+
154
+ at migrateBrainfileToV2 (src/commands/migrate.ts:275:11)
155
+
156
+ console.log
157
+ Active tasks: 0 files in board/
158
+
159
+ at migrateBrainfileToV2 (src/commands/migrate.ts:276:11)
160
+
161
+ console.log
162
+ Completed/logs: 0 files in logs/
163
+
164
+ at migrateBrainfileToV2 (src/commands/migrate.ts:277:11)
165
+
166
+ console.log
167
+ Board config: /tmp/brainfile-migrate-v2-test-MBTZvO/.brainfile/brainfile.md (config-only)
168
+
169
+ at migrateBrainfileToV2 (src/commands/migrate.ts:278:11)
170
+
171
+ console.log
172
+ Backup: /tmp/brainfile-migrate-v2-test-MBTZvO/.brainfile/brainfile.md.v1.bak
173
+
174
+ at migrateBrainfileToV2 (src/commands/migrate.ts:279:11)
175
+
176
+ console.log
177
+ Backup: /tmp/brainfile-migrate-v2-test-KRP3tH/.brainfile/brainfile.md.v1.bak
178
+
179
+ at migrateBrainfileToV2 (src/commands/migrate.ts:166:13)
180
+
181
+ console.log
182
+ Migration to v2 complete!
183
+
184
+ at migrateBrainfileToV2 (src/commands/migrate.ts:274:11)
185
+
186
+ console.log
187
+
188
+
189
+ at migrateBrainfileToV2 (src/commands/migrate.ts:275:11)
190
+
191
+ console.log
192
+ Active tasks: 0 files in board/
193
+
194
+ at migrateBrainfileToV2 (src/commands/migrate.ts:276:11)
195
+
196
+ console.log
197
+ Completed/logs: 1 files in logs/
198
+
199
+ at migrateBrainfileToV2 (src/commands/migrate.ts:277:11)
200
+
201
+ console.log
202
+ Board config: /tmp/brainfile-migrate-v2-test-KRP3tH/.brainfile/brainfile.md (config-only)
203
+
204
+ at migrateBrainfileToV2 (src/commands/migrate.ts:278:11)
205
+
206
+ console.log
207
+ Backup: /tmp/brainfile-migrate-v2-test-KRP3tH/.brainfile/brainfile.md.v1.bak
208
+
209
+ at migrateBrainfileToV2 (src/commands/migrate.ts:279:11)
210
+
211
+ console.log
212
+ Backup: /tmp/brainfile-migrate-v2-test-3eGGjg/.brainfile/brainfile.md.v1.bak
213
+
214
+ at migrateBrainfileToV2 (src/commands/migrate.ts:166:13)
215
+
216
+ console.log
217
+ Migration to v2 complete!
218
+
219
+ at migrateBrainfileToV2 (src/commands/migrate.ts:274:11)
220
+
221
+ console.log
222
+
223
+
224
+ at migrateBrainfileToV2 (src/commands/migrate.ts:275:11)
225
+
226
+ console.log
227
+ Active tasks: 1 files in board/
228
+
229
+ at migrateBrainfileToV2 (src/commands/migrate.ts:276:11)
230
+
231
+ console.log
232
+ Completed/logs: 0 files in logs/
233
+
234
+ at migrateBrainfileToV2 (src/commands/migrate.ts:277:11)
235
+
236
+ console.log
237
+ Board config: /tmp/brainfile-migrate-v2-test-3eGGjg/.brainfile/brainfile.md (config-only)
238
+
239
+ at migrateBrainfileToV2 (src/commands/migrate.ts:278:11)
240
+
241
+ console.log
242
+ Backup: /tmp/brainfile-migrate-v2-test-3eGGjg/.brainfile/brainfile.md.v1.bak
243
+
244
+ at migrateBrainfileToV2 (src/commands/migrate.ts:279:11)
245
+
246
+ console.log
247
+ Legacy root brainfile detected alongside v2 workspace.
248
+
249
+ at migrateMixedWorkspace (src/commands/migrate.ts:66:15)
250
+
251
+ console.log
252
+ Backed up root file to: /tmp/brainfile-migrate-mixed-tes
253
+ ...[truncated]
254
+ exitCode: 0
255
+ durationMs: 7214
256
+ deltas:
257
+ - path: src/lib/contractRunner.ts
258
+ change: any
259
+ passed: true
260
+ existedBefore: true
261
+ existsNow: true
262
+ baselineHash: 7346371ed8445e7a
263
+ currentHash: 1197269871a20085
264
+ - path: src/__tests__/contract.test.ts
265
+ change: any
266
+ passed: true
267
+ existedBefore: true
268
+ existsNow: true
269
+ baselineHash: 4ee4a1e32a025a2a
270
+ currentHash: 4ee4a1e32a025a2a
271
+ scopeViolations: []
272
+ changedFiles:
273
+ - .brainfile/.gitignore
274
+ - .brainfile/board/task-2.md
275
+ - .brainfile/brainfile.md
276
+ - .brainfile/brainfile.md.v1.bak
277
+ - .brainfile/cache/acp-registry.json
278
+ - .brainfile/logs/task-1.md
279
+ - .brainfile/supervisor.json
280
+ - .github/workflows/release.yml
281
+ - brainfile-core-0.15.1.tgz
282
+ - brainfile.md
283
+ - package-lock.json
284
+ - package.json
285
+ - src/__tests__/add.test.ts
286
+ - src/__tests__/contract-graph.test.ts
287
+ - src/__tests__/contract.test.ts
288
+ - src/__tests__/draft-default.test.ts
289
+ - src/__tests__/git-helper.test.ts
290
+ - src/__tests__/lint.test.ts
291
+ - src/__tests__/mcp-consolidated.test.ts
292
+ - src/__tests__/move.test.ts
293
+ - src/__tests__/rules.test.ts
294
+ - src/__tests__/schema.test.ts
295
+ - src/__tests__/show.test.ts
296
+ - src/__tests__/template.test.ts
297
+ - src/cli.ts
298
+ - src/commands/add.ts
299
+ - src/commands/contract.ts
300
+ - src/commands/mcp.ts
301
+ - src/commands/migrate.ts
302
+ - src/commands/move.ts
303
+ - src/commands/schema.ts
304
+ - src/index.ts
305
+ - src/lib/contractRunner.ts
306
+ - src/mcp/tools/contract.ts
307
+ - src/utils/config.ts
308
+ - src/utils/contractSpec.ts
309
+ - src/utils/hook-settings.ts
310
+ - undefined/brainfile/config.json
311
+ warnings: []
312
+ passed: true
313
+ validatedAt: "2026-03-07T12:53:26.240Z"
314
+ feedback: |-
315
+ Validation step failed (npm test): command exited 1 (> @brainfile/cli@0.17.0 test
316
+ > jest
317
+
318
+ console.log
319
+ Backup: /tmp/brainfile-migrate-v2-test-RcO2pH/.brainfile/brainfile.md.v1.bak
320
+
321
+ at migrateBrainfileToV2 (src/commands/migrate.ts:166:13)
322
+
323
+ console.log
324
+ Migration to v2 complete!
325
+
326
+ at migrateBrainfileToV2 (src/commands/migrate.ts:274:11)
327
+
328
+ console.log
329
+
330
+
331
+ at migrateBrainfileToV2 (src/commands/migrate.ts:275:11)
332
+
333
+ console.log
334
+ Active tasks: 3 files in board/
335
+
336
+ at migrateBrainfileToV2 (src/commands/migrate.ts:276:11)
337
+
338
+ console.log
339
+ Completed/logs: 1 files in logs/
340
+
341
+ at migrateBrainfileToV2 (src/commands/migrate.ts:277:11)
342
+
343
+ console.log
344
+ Board config: /tmp/brainfile-migrate-v2-test-RcO2pH/.brainfile/brainfile.md (config-only)
345
+
346
+ at migrateBrainfileToV2 (src/commands/migrate.ts:278:11)
347
+
348
+ console.log
349
+ Backup: /tmp/brainfile-migrate-v2-test-RcO2pH/.brainfile/brainfile.md.v1.bak
350
+
351
+ at migrateBrainfileToV2 (src/commands/migrate.ts:279:11)
352
+
353
+ console.log
354
+ Backup: /tmp/brainfile-migrate-v2-test-qGBGRY/.brainfile/brainfile.md.v1.bak
355
+
356
+ at migrateBrainfileToV2 (src/commands/migrate.ts:166:13)
357
+
358
+ console.log
359
+ Migration to v2 complete!
360
+
361
+ at migrateBrainfileToV2 (src/commands/migrate.ts:274:11)
362
+
363
+ console.log
364
+
365
+
366
+ at migrateBrainfileToV2 (src/commands/migrate.ts:275:11)
367
+
368
+ console.log
369
+ Active tasks: 0 files in board/
370
+
371
+ at migrateBrainfileToV2 (src/commands/migrate.ts:276:11)
372
+
373
+ console.log
374
+ Completed/logs: 0 files in logs/
375
+
376
+ at migrateBrainfileToV2 (src/commands/migrate.ts:277:11)
377
+
378
+ console.log
379
+ Board config: /tmp/brainfile-migrate-v2-test-qGBGRY/.brainfile/brainfile.md (config-only)
380
+
381
+ at migrateBrainfileToV2 (src/commands/migrate.ts:278:11)
382
+
383
+ console.log
384
+ Backup: /tmp/brainfile-migrate-v2-test-qGBGRY/.brainfile/brainfile.md.v1.bak
385
+
386
+ at migrateBrainfileToV2 (src/commands/migrate.ts:279:11)
387
+
388
+ console.log
389
+ Backup: /tmp/brainfile-migrate-v2-test-OwU0cE/.brainfile/brainfile.md.v1.bak
390
+
391
+ at migrateBrainfileToV2 (src/commands/migrate.ts:166:13)
392
+
393
+ console.log
394
+ Migration to v2 complete!
395
+
396
+ at migrateBrainfileToV2 (src/commands/migrate.ts:274:11)
397
+
398
+ console.log
399
+
400
+
401
+ at migrateBrainfileToV2 (src/commands/migrate.ts:275:11)
402
+
403
+ console.log
404
+ Active tasks: 0 files in board/
405
+
406
+ at migrateBrainfileToV2 (src/commands/migrate.ts:276:11)
407
+
408
+ console.log
409
+ Completed/logs: 1 files in logs/
410
+
411
+ at migrateBrainfileToV2 (src/commands/migrate.ts:277:11)
412
+
413
+ console.log
414
+ Board config: /tmp/brainfile-migrate-v2-test-OwU0cE/.brainfile/brainfile.md (config-only)
415
+
416
+ at migrateBrainfileToV2 (src/commands/migrate.ts:278:11)
417
+
418
+ console.log
419
+ Backup: /tmp/brainfile-migrate-v2-test-OwU0cE/.brainfile/brainfile.md.v1.bak
420
+
421
+ at migrateBrainfileToV2 (src/commands/migrate.ts:279:11)
422
+
423
+ console.log
424
+ Backup: /tmp/brainfile-migrate-v2-test-3K0qqt/.brainfile/brainfile.md.v1.bak
425
+
426
+ at migrateBrainfileToV2 (src/commands/migrate.ts:166:13)
427
+
428
+ console.log
429
+ Migration to v2 complete!
430
+
431
+ at migrateBrainfileToV2 (src/commands/migrate.ts:274:11)
432
+
433
+ console.log
434
+
435
+
436
+ at migrateBrainfileToV2 (src/commands/migrate.ts:275:11)
437
+
438
+ console.log
439
+ Active tasks: 1 files in board/
440
+
441
+ at migrateBrainfileToV2 (src/commands/migrate.ts:276:11)
442
+
443
+ console.log
444
+ Completed/logs: 0 files in logs/
445
+
446
+ at migrateBrainfileToV2 (src/commands/migrate.ts:277:11)
447
+
448
+ console.log
449
+ Board config: /tmp/brainfile-migrate-v2-test-3K0qqt/.brainfile/brainfile.md (config-only)
450
+
451
+ at migrateBrainfileToV2 (src/commands/migrate.ts:278:11)
452
+
453
+ console.log
454
+ Backup: /tmp/brainfile-migrate-v2-test-3K0qqt/.brainfile/brainfile.md.v1.bak
455
+
456
+ at migrateBrainfileToV2 (src/commands/migrate.ts:279:11)
457
+
458
+ console.log
459
+ Legacy root brainfile detected alongside v2 workspace.
460
+
461
+ at migrateMixedWorkspace (src/commands/migrate.ts:66:15)
462
+
463
+ console.log
464
+ Backed up root file to: /tmp/brainfile-migrate-mixed-tes
465
+ ...[truncated])
466
+ completedAt: "2026-03-07T12:53:33.466Z"
467
+ ---
468
+
469
+ ## Description
470
+ Replace direct contract.status mutations and setTaskContractStatus calls in cli/src/lib/contractRunner.ts with the new compound operations from @brainfile/core@0.15.1.
471
+
472
+ The V2 code paths (pickupContractV2, deliverContractV2, validateContractV2) should use:
473
+ - pickupTaskContract() — sets in_progress + moves column to in-progress
474
+ - deliverTaskContract() — sets delivered + moves column to review
475
+ - completeTaskContract() — sets done + archives to logs (validate success path)
476
+ - failTaskContract() — sets failed + adds feedback (validate failure path)
477
+
478
+ V1 code paths stay as-is (legacy board format).
479
+
480
+ Key behavior change: `brainfile contract validate` on a passing task will now archive it off the board. This is the intended UX fix — done = off the board.
481
+
482
+ Also bump @brainfile/core dependency to ^0.15.1 in cli/package.json.