@codedology/code-forge 0.9.0 → 0.11.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 (62) hide show
  1. package/CHANGELOG.md +93 -0
  2. package/README.md +49 -9
  3. package/docs/reference/blocks.json +587 -1
  4. package/docs/reference/config.md +36 -0
  5. package/package.json +2 -2
  6. package/schema/code-forge.schema.json +89 -0
  7. package/skill/SKILL.md +1 -1
  8. package/skill/references/adapters/claude-code.md +1 -1
  9. package/skill/references/adapters/solo.md +2 -2
  10. package/skill/references/adapters/subprocess.md +12 -2
  11. package/skill/references/code.md +14 -7
  12. package/skill/references/ledger.md +2 -2
  13. package/skill/references/proof.md +77 -2
  14. package/skill/references/review.md +39 -7
  15. package/skill/references/security.md +4 -4
  16. package/skill/scripts/forge +1 -1
  17. package/skill/templates/coder-brief.md +6 -6
  18. package/src/autopilot/binnacle.mjs +9 -3
  19. package/src/cli/block.mjs +262 -31
  20. package/src/cli/jev.mjs +22 -3
  21. package/src/cli/keys.mjs +156 -21
  22. package/src/cli/proof.mjs +35 -7
  23. package/src/cli/review-file.mjs +17 -11
  24. package/src/cli/spawn.mjs +44 -3
  25. package/src/config/validate.mjs +320 -5
  26. package/src/doctor/index.mjs +2 -1
  27. package/src/doctor/local.mjs +27 -6
  28. package/src/doctor/probes.mjs +38 -0
  29. package/src/engines/builders/codex.mjs +44 -4
  30. package/src/engines/sandbox-dirs.mjs +257 -0
  31. package/src/keys/store.mjs +128 -21
  32. package/src/proof/junit.mjs +530 -0
  33. package/src/proof/red-green.mjs +57 -9
  34. package/src/proof/red-parse.mjs +2 -0
  35. package/src/proof/runners.mjs +472 -0
  36. package/src/proof/xcresult.mjs +285 -0
  37. package/src/review/engine.mjs +141 -42
  38. package/src/review/fixloop.mjs +75 -23
  39. package/src/review/gate-check.mjs +3 -2
  40. package/src/review/lenses/A.md +2 -0
  41. package/src/review/lenses/B.md +2 -0
  42. package/src/review/lenses/full.md +2 -0
  43. package/src/review/lenses/quick.md +1 -0
  44. package/src/review/lenses/recheck.md +2 -0
  45. package/src/review/packet.mjs +48 -14
  46. package/src/review/paired.mjs +80 -0
  47. package/src/review/reopen.mjs +4 -6
  48. package/src/review/reviewed-lines.mjs +94 -0
  49. package/src/review/route.mjs +232 -0
  50. package/src/review/schema-fallback.mjs +77 -22
  51. package/src/review/session-retry.mjs +44 -9
  52. package/src/review/test-quality.mjs +201 -0
  53. package/src/review/verb-forms.mjs +39 -0
  54. package/src/session/spawn.mjs +39 -2
  55. package/src/state/block-end.mjs +10 -6
  56. package/src/state/block.mjs +13 -3
  57. package/src/state/config-snapshot.mjs +39 -0
  58. package/src/state/run.mjs +4 -0
  59. package/src/util/forbidden.mjs +2 -2
  60. package/src/worker/engine.mjs +43 -15
  61. package/src/worker/loop.mjs +98 -15
  62. package/src/worker/ticket.mjs +9 -1
@@ -4,7 +4,7 @@
4
4
  "plans/code-forge-plan-v1.3.md §10.4",
5
5
  "plans/NIGHT-LOG.md"
6
6
  ],
7
- "block_count": 88,
7
+ "block_count": 111,
8
8
  "baseline_ids": ["B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8"],
9
9
  "baseline_note": "Wave 0-1 blocks, landed before v1.3; depends_on may name them, but they have no entry under blocks.",
10
10
  "blocks": {
@@ -1239,6 +1239,592 @@
1239
1239
  "B76"
1240
1240
  ],
1241
1241
  "note": "root-added 2026-10-12; B75 leftovers (plans/reviews/b75/r3.txt a-d); a failed link-back writes a refused fresh-restore-failed marker or keeps the claim; a kept claim holds the ticket; block reopen clears claims"
1242
+ },
1243
+ "B84": {
1244
+ "title": "keys.cache_hours and keys set --cache-hours set the 1Password cache time",
1245
+ "wave": 14,
1246
+ "level": "L2",
1247
+ "status": "landed",
1248
+ "owned": [
1249
+ "schema/code-forge.schema.json",
1250
+ "docs/reference/config.md",
1251
+ "src/keys/store.mjs",
1252
+ "src/cli/keys.mjs",
1253
+ "src/cli/jev.mjs",
1254
+ "src/doctor/local.mjs",
1255
+ "src/worker/loop.mjs",
1256
+ "test/keys/cache-hours.test.mjs",
1257
+ "test/keys/cli.test.mjs",
1258
+ "test/config/schema-coverage.test.mjs",
1259
+ "test/config/schema.test.mjs",
1260
+ "docs/getting-started.md",
1261
+ "docs/how-it-works.md",
1262
+ "skill/references/security.md",
1263
+ "README.md"
1264
+ ],
1265
+ "depends_on": [
1266
+ "B83"
1267
+ ],
1268
+ "note": "root-added 2026-10-12; issue #14 part 1 (plans/keys-cache/plan.md); 1-24 h, default 8; a lower value shortens a cached key at the next read; bad config refuses set --op, warns elsewhere"
1269
+ },
1270
+ "B85": {
1271
+ "title": "key expiry warnings and the re-link line",
1272
+ "wave": 14,
1273
+ "level": "L2",
1274
+ "status": "landed",
1275
+ "owned": [
1276
+ "src/keys/store.mjs",
1277
+ "src/cli/keys.mjs",
1278
+ "src/cli/jev.mjs",
1279
+ "src/doctor/local.mjs",
1280
+ "test/keys/expiry-warn.test.mjs",
1281
+ "docs/getting-started.md",
1282
+ "docs/how-it-works.md",
1283
+ "skill/references/security.md",
1284
+ "README.md"
1285
+ ],
1286
+ "depends_on": [
1287
+ "B84"
1288
+ ],
1289
+ "note": "root-added 2026-10-12; issue #14 part 2 (plans/keys-cache/plan.md); index keeps the op ref; WARN under 1 h in keys list and doctor; jev ask prints the re-link line when the cache expired and 1Password fails; refs shell-quoted"
1290
+ },
1291
+ "B86": {
1292
+ "title": "fail-closed JUnit XML report reader for proof red-green",
1293
+ "wave": 14,
1294
+ "level": "L2",
1295
+ "status": "landed",
1296
+ "owned": [
1297
+ "src/proof/junit.mjs",
1298
+ "test/proof/junit.test.mjs",
1299
+ "test/fixtures/junit/xctest.xml",
1300
+ "test/fixtures/junit/swift-testing.xml",
1301
+ "test/fixtures/junit/phpunit.xml",
1302
+ "test/fixtures/junit/pest.xml",
1303
+ "test/fixtures/junit/pytest.xml",
1304
+ "skill/references/proof.md",
1305
+ "test/skill/structure.test.mjs"
1306
+ ],
1307
+ "depends_on": [
1308
+ "B85"
1309
+ ],
1310
+ "note": "root-added 2026-10-13; issue #7 part 1 (plans/red-green/plan.md); hand-written reader, no DTD/entities, 8 MiB cap, O_NOFOLLOW|O_NONBLOCK; RED only on assertion failures; SwiftPM bare failure needs a matching XCTest console line; not wired into proof yet (B87)"
1311
+ },
1312
+ "B87": {
1313
+ "title": "proof.runners: prove non-node:test files through a runner argv and its JUnit report",
1314
+ "wave": 14,
1315
+ "level": "L2",
1316
+ "status": "landed",
1317
+ "owned": [
1318
+ "src/proof/runners.mjs",
1319
+ "src/proof/red-green.mjs",
1320
+ "src/cli/proof.mjs",
1321
+ "src/config/validate.mjs",
1322
+ "schema/code-forge.schema.json",
1323
+ "src/state/config-snapshot.mjs",
1324
+ "src/state/block.mjs",
1325
+ "src/state/run.mjs",
1326
+ "src/proof/junit.mjs",
1327
+ "docs/concepts.md",
1328
+ "docs/how-it-works.md",
1329
+ "docs/tutorial-first-test.md",
1330
+ "docs/reference/config.md",
1331
+ "skill/references/proof.md",
1332
+ "skill/references/code.md",
1333
+ "README.md",
1334
+ "test/proof/runners.test.mjs",
1335
+ "test/proof/red-green.test.mjs",
1336
+ "test/proof/junit.test.mjs",
1337
+ "test/config/validate.test.mjs",
1338
+ "test/config/schema-coverage.test.mjs",
1339
+ "test/skill/structure.test.mjs"
1340
+ ],
1341
+ "depends_on": [
1342
+ "B86"
1343
+ ],
1344
+ "note": "root-added 2026-10-13; issue #7 part 2 (plans/red-green/plan.md, C-D1=a); runners frozen in the run snapshot; argv only, GIT_* stripped; rule 17 proof-runners-invalid; no-hook match refused exit 2; env_keys names only; swift runs as junit until B88"
1345
+ },
1346
+ "B88": {
1347
+ "title": "swift adapter for proof.runners, checked live with swift test",
1348
+ "wave": 14,
1349
+ "level": "L2",
1350
+ "status": "landed",
1351
+ "owned": [
1352
+ "src/proof/runners.mjs",
1353
+ "src/proof/junit.mjs",
1354
+ "src/proof/red-green.mjs",
1355
+ "test/proof/swift-adapter.test.mjs",
1356
+ "test/proof/swift-live.test.mjs",
1357
+ "test/proof/junit.test.mjs",
1358
+ "test/proof/runners.test.mjs",
1359
+ "test/fixtures/junit/xctest.xml",
1360
+ "test/fixtures/junit/xctest-pass.xml",
1361
+ "test/fixtures/junit/xctest-none.xml",
1362
+ "test/fixtures/junit/swift-testing.xml",
1363
+ "test/fixtures/junit/swift-testing-pass.xml",
1364
+ "test/fixtures/junit/swift-testing-none.xml",
1365
+ "test/fixtures/junit/swift-testing-crash.xml",
1366
+ "test/fixtures/junit/pest.xml",
1367
+ "test/fixtures/junit/pytest.xml",
1368
+ "skill/references/proof.md",
1369
+ "test/skill/structure.test.mjs"
1370
+ ],
1371
+ "depends_on": [
1372
+ "B87"
1373
+ ],
1374
+ "note": "root-added 2026-10-13; issue #7 part 3 (plans/red-green/plan.md §1.3); live VERIFIED Swift 6.3.3 / Xcode 26.6 / macOS 26 arm64; real SwiftPM bare failure is message=\"failure\"; --parallel needed for the XCTest report; filters anchored; swiftc compile shapes; B87 r3 leftovers folded in"
1375
+ },
1376
+ "B89": {
1377
+ "title": "PHP red-green through the junit adapter, checked live on Laravel (PHPUnit and Pest)",
1378
+ "wave": 14,
1379
+ "level": "L1",
1380
+ "status": "landed",
1381
+ "owned": [
1382
+ "test/proof/laravel-live.test.mjs",
1383
+ "test/fixtures/junit/phpunit.xml",
1384
+ "test/fixtures/junit/phpunit-pass.xml",
1385
+ "test/fixtures/junit/phpunit-new-class.xml",
1386
+ "test/fixtures/junit/phpunit-full.xml",
1387
+ "test/fixtures/junit/pest.xml",
1388
+ "test/fixtures/junit/pest-pass.xml",
1389
+ "test/fixtures/junit/pest-new-class.xml",
1390
+ "src/proof/red-parse.mjs",
1391
+ "test/proof/red-parse.test.mjs",
1392
+ "test/proof/junit.test.mjs",
1393
+ "skill/references/proof.md",
1394
+ "docs/how-it-works.md",
1395
+ "test/skill/structure.test.mjs"
1396
+ ],
1397
+ "depends_on": [
1398
+ "B88"
1399
+ ],
1400
+ "note": "root-added 2026-10-13; issue #7 part 4 (plans/red-green/plan.md §1.4); live VERIFIED PHP 8.4.25, Laravel 13.35.0, PHPUnit 12.5.39, Pest 4.7.8 through php artisan test; red-parse reads Laravel 13's JSON-escaped agent console (folded-in candidate B108); no <warning> seen"
1401
+ },
1402
+ "B102": {
1403
+ "title": "The xcodebuild adapter for proof.runners: Xcode precheck, -only-testing, result bundle reader",
1404
+ "wave": 14,
1405
+ "level": "L2",
1406
+ "status": "landed",
1407
+ "owned": [
1408
+ "src/proof/xcresult.mjs",
1409
+ "src/proof/runners.mjs",
1410
+ "src/proof/junit.mjs",
1411
+ "src/config/validate.mjs",
1412
+ "schema/code-forge.schema.json",
1413
+ "docs/reference/config.md",
1414
+ "skill/references/proof.md",
1415
+ "test/proof/xcodebuild-adapter.test.mjs",
1416
+ "test/proof/runners.test.mjs",
1417
+ "test/config/schema-coverage.test.mjs",
1418
+ "test/skill/structure.test.mjs",
1419
+ "test/fixtures/xcresult/bare-fail.json",
1420
+ "test/fixtures/xcresult/build-failed.console",
1421
+ "test/fixtures/xcresult/build-failed.json",
1422
+ "test/fixtures/xcresult/build-for-testing-failed.console",
1423
+ "test/fixtures/xcresult/near-names.json",
1424
+ "test/fixtures/xcresult/swift-testing-case.json",
1425
+ "test/fixtures/xcresult/swift-testing-noparens.json",
1426
+ "test/fixtures/xcresult/swift-testing-pass.json",
1427
+ "test/fixtures/xcresult/swift-testing.console",
1428
+ "test/fixtures/xcresult/swift-testing.json",
1429
+ "test/fixtures/xcresult/thrown.console",
1430
+ "test/fixtures/xcresult/thrown.json",
1431
+ "test/fixtures/xcresult/xctest-case.json",
1432
+ "test/fixtures/xcresult/xctest-pass.json",
1433
+ "test/fixtures/xcresult/xctest.console",
1434
+ "test/fixtures/xcresult/xctest.json"
1435
+ ],
1436
+ "depends_on": [
1437
+ "B89"
1438
+ ],
1439
+ "note": "root-added 2026-10-13; issue #7 part 5 (plans/red-green/plan.md §1.6); fixtures captured from Xcode 26.6 (17F113), iPhone 17 simulator iOS 26.5, xcresulttool schema 0.1.0; Swift Testing -only-testing needs (); exit 0 with no test, no bundle, an unreadable bundle or an out-of-scope test is RED_INVALID error; parameterized Swift Testing, repetitions, multi-destination, Runtime Warning and Expected Failure make the bundle unreadable (fail closed)"
1440
+ },
1441
+ "B103": {
1442
+ "title": "A live xcodebuild red-green check on an iOS simulator, opt-in",
1443
+ "wave": 14,
1444
+ "level": "L2",
1445
+ "status": "landed",
1446
+ "owned": [
1447
+ "test/proof/xcodebuild-live.test.mjs",
1448
+ "skill/references/proof.md",
1449
+ "docs/how-it-works.md",
1450
+ "test/skill/structure.test.mjs"
1451
+ ],
1452
+ "depends_on": [
1453
+ "B102"
1454
+ ],
1455
+ "note": "root-added 2026-10-13; issue #7 part 6 (plans/red-green/plan.md §1.6); live VERIFIED Xcode 26.6 (17F113), iPhone 17 simulator iOS 26.5; XCTest and Swift Testing, file and case runs RED assertion → GREEN, new function RED_INVALID compile, ghost destination destination-unavailable; live JSON matched the B102 fixtures (kept)"
1456
+ },
1457
+ "B90": {
1458
+ "title": "Size-based review routing: review.routes",
1459
+ "wave": 14,
1460
+ "level": "L2",
1461
+ "status": "landed",
1462
+ "owned": [
1463
+ "src/review/route.mjs",
1464
+ "src/worker/loop.mjs",
1465
+ "src/worker/ticket.mjs",
1466
+ "src/config/validate.mjs",
1467
+ "schema/code-forge.schema.json",
1468
+ "docs/reference/config.md",
1469
+ "skill/references/review.md",
1470
+ "docs/how-it-works.md",
1471
+ "docs/review-only.md",
1472
+ "test/review/route.test.mjs",
1473
+ "test/config/validate-routes.test.mjs",
1474
+ "test/config/validate.test.mjs",
1475
+ "test/config/schema-coverage.test.mjs",
1476
+ "test/skill/structure.test.mjs"
1477
+ ],
1478
+ "depends_on": [
1479
+ "B103"
1480
+ ],
1481
+ "note": "root-added 2026-10-13; issue #10 item 4 (plans/iteration/plan.md B90); rule 18 review-routes-invalid; signed review.route rows before the first session, once per ticket; no routes = byte-equal to 8fadc12"
1482
+ },
1483
+ "B91": {
1484
+ "title": "Two broken results (schema or timeout) move a packet to the second level",
1485
+ "wave": 14,
1486
+ "level": "L2",
1487
+ "status": "landed",
1488
+ "owned": [
1489
+ "src/review/session-retry.mjs",
1490
+ "src/review/schema-fallback.mjs",
1491
+ "src/review/engine.mjs",
1492
+ "src/review/fixloop.mjs",
1493
+ "src/autopilot/binnacle.mjs",
1494
+ "skill/references/review.md",
1495
+ "docs/how-it-works.md",
1496
+ "docs/review-only.md",
1497
+ "test/review/broken-fallback.test.mjs",
1498
+ "test/review/schema-fallback.test.mjs",
1499
+ "test/worker/schema-fallback-wiring.test.mjs",
1500
+ "test/autopilot/binnacle.test.mjs",
1501
+ "test/skill/structure.test.mjs"
1502
+ ],
1503
+ "depends_on": [
1504
+ "B90"
1505
+ ],
1506
+ "note": "root-added 2026-10-13; issue #10 (plans/iteration/plan.md B91); review.session_timeout notes carry packet_hash and are signed; review.schema_fallback gains trigger schema|timeout; no second level = as before plus packet_hash"
1507
+ },
1508
+ "B92": {
1509
+ "title": "Test-quality hint: a test that reads source text is listed for the reviewer",
1510
+ "wave": 14,
1511
+ "level": "L1",
1512
+ "status": "landed",
1513
+ "owned": [
1514
+ "src/review/test-quality.mjs",
1515
+ "src/review/engine.mjs",
1516
+ "src/review/lenses/A.md",
1517
+ "src/review/lenses/B.md",
1518
+ "src/review/lenses/full.md",
1519
+ "src/review/lenses/quick.md",
1520
+ "src/review/lenses/recheck.md",
1521
+ "skill/references/code.md",
1522
+ "skill/references/review.md",
1523
+ "skill/templates/coder-brief.md",
1524
+ "docs/how-it-works.md",
1525
+ "test/review/test-quality.test.mjs",
1526
+ "test/review/fixloop.test.mjs",
1527
+ "test/review/route.test.mjs",
1528
+ "test/skill/structure.test.mjs"
1529
+ ],
1530
+ "depends_on": [
1531
+ "B91"
1532
+ ],
1533
+ "note": "root-added 2026-10-13; issue #10 item 3 (plans/iteration/plan.md B92); a pure detector lists test lines that read a source file and assert on its text; the packet gets a ## test-quality hint section, the lens rule tells the reviewer to judge it; rechecks get the rule but no section; lens A/B order test sorted (flake fixed)"
1534
+ },
1535
+ "B93": {
1536
+ "title": "coder.sandbox: a run-fixed sandbox profile for the Codex coder",
1537
+ "wave": 14,
1538
+ "level": "L2",
1539
+ "status": "landed",
1540
+ "owned": [
1541
+ "src/engines/builders/codex.mjs",
1542
+ "src/session/spawn.mjs",
1543
+ "src/cli/spawn.mjs",
1544
+ "src/engines/sandbox-dirs.mjs",
1545
+ "src/state/config-snapshot.mjs",
1546
+ "src/state/run.mjs",
1547
+ "schema/code-forge.schema.json",
1548
+ "src/config/validate.mjs",
1549
+ "docs/reference/config.md",
1550
+ "src/doctor/probes.mjs",
1551
+ "src/doctor/index.mjs",
1552
+ "skill/references/adapters/subprocess.md",
1553
+ "skill/references/security.md",
1554
+ "docs/brief-mode.md",
1555
+ "docs/how-it-works.md",
1556
+ "test/engines/sandbox-profile.test.mjs",
1557
+ "test/config/validate.test.mjs",
1558
+ "test/config/schema-coverage.test.mjs",
1559
+ "test/skill/structure.test.mjs"
1560
+ ],
1561
+ "depends_on": [
1562
+ "B92"
1563
+ ],
1564
+ "note": "root-added 2026-10-13; issue #10 item 1 (plans/iteration/plan.md B93); profiles workspace (default, today's argv), toolchain (--add-dir per entry), full (danger-full-access, doctor WARN); refused dirs checked after a per-component symlink walk with native realpath; rule 19 sandbox-dir-refused, rule 20 sandbox-dirs-unused (WARN); immutable key; spawn --role coder --run checks the snapshot (sandbox-changed)"
1565
+ },
1566
+ "B94": {
1567
+ "title": "Skill: one fix round per block",
1568
+ "wave": 14,
1569
+ "level": "L1",
1570
+ "status": "landed",
1571
+ "owned": [
1572
+ "skill/references/code.md",
1573
+ "skill/references/review.md",
1574
+ "skill/references/adapters/solo.md",
1575
+ "skill/references/adapters/claude-code.md",
1576
+ "skill/references/adapters/subprocess.md",
1577
+ "docs/how-it-works.md",
1578
+ "test/skill/structure.test.mjs",
1579
+ "docs/concepts.md",
1580
+ "docs/brief-mode.md",
1581
+ "docs/autopilot.md",
1582
+ "skill/references/ledger.md"
1583
+ ],
1584
+ "depends_on": [
1585
+ "B93"
1586
+ ],
1587
+ "note": "root-added 2026-10-13; issue #10 item 5 (plans/iteration/plan.md B94); skill and docs only; the full rule word for word in code.md §4, solo.md §3 step 7 and how-it-works; one fixed pointer sentence in the other docs; the per-file cap counts per file"
1588
+ },
1589
+ "B80": {
1590
+ "title": "Human-only verbs: waive and reopen ask at a terminal",
1591
+ "wave": 14,
1592
+ "level": "L2",
1593
+ "status": "landed",
1594
+ "owned": [
1595
+ "docs/concepts.md",
1596
+ "docs/getting-started.md",
1597
+ "docs/how-it-works.md",
1598
+ "docs/tutorial-first-test.md",
1599
+ "skill/references/adapters/claude-code.md",
1600
+ "skill/references/adapters/solo.md",
1601
+ "skill/references/code.md",
1602
+ "skill/references/ledger.md",
1603
+ "skill/references/proof.md",
1604
+ "skill/references/review.md",
1605
+ "skill/references/security.md",
1606
+ "src/cli/block.mjs",
1607
+ "src/review/gate-check.mjs",
1608
+ "src/review/reopen.mjs",
1609
+ "src/review/verb-forms.mjs",
1610
+ "src/util/forbidden.mjs",
1611
+ "test/cli/block-human-confirm.test.mjs",
1612
+ "test/cli/status.test.mjs",
1613
+ "test/helpers/human-confirm.mjs",
1614
+ "test/review/answers.test.mjs",
1615
+ "test/review/close-gate.test.mjs",
1616
+ "test/review/gate-check.test.mjs",
1617
+ "test/review/reopen.test.mjs",
1618
+ "test/review/waived-all.test.mjs",
1619
+ "test/skill/structure.test.mjs",
1620
+ "test/state/block-end.test.mjs"
1621
+ ],
1622
+ "depends_on": [
1623
+ "B94"
1624
+ ],
1625
+ "note": "root-added 2026-10-13; issue #10 owner item 1 (plans/iteration/plan.md B80, D1 = a); block waive and block reopen ask the human for a yes at a terminal, no --yes, no terminal exits 2 and records nothing; pre-checks run before the question; a pseudo-terminal passes the check (honest limit in security.md §3); D1 (b) is a later option"
1626
+ },
1627
+ "B108": {
1628
+ "title": "Release moves the README What's new bullets and checks the docs",
1629
+ "wave": 14,
1630
+ "level": "L2",
1631
+ "status": "landed",
1632
+ "owned": [
1633
+ "README.md",
1634
+ "docs/releasing.md",
1635
+ "scripts/release.mjs",
1636
+ "test/release-readme.test.mjs",
1637
+ "test/release.test.mjs"
1638
+ ],
1639
+ "depends_on": [
1640
+ "B80"
1641
+ ],
1642
+ "note": "root-added 2026-10-13; process fix after the 0.10.0 README miss (plans/field-bugs/plan.md B108); npm run release moves the 'In the next release:' bullets under 'In X.Y.Z:' (new '## What's new in X.Y' on a minor or major), keeps an empty anchor, refuses an empty [Unreleased] or a missing anchor in preflight, rolls README back with the other files, and runs gen-config-doc --check"
1643
+ },
1644
+ "B96": {
1645
+ "title": "The close writes the reviewed ticket lines",
1646
+ "wave": 14,
1647
+ "level": "L2",
1648
+ "status": "landed",
1649
+ "owned": [
1650
+ "docs/concepts.md",
1651
+ "docs/how-it-works.md",
1652
+ "docs/tutorial-first-test.md",
1653
+ "skill/SKILL.md",
1654
+ "skill/references/code.md",
1655
+ "skill/templates/coder-brief.md",
1656
+ "src/cli/block.mjs",
1657
+ "src/review/reviewed-lines.mjs",
1658
+ "src/state/block-end.mjs",
1659
+ "test/cli/close-report.test.mjs",
1660
+ "test/cli/status.test.mjs",
1661
+ "test/engines/sentinel-tests.test.mjs",
1662
+ "test/integration/review-flow.test.mjs",
1663
+ "test/review/answers.test.mjs",
1664
+ "test/review/close-gate.test.mjs",
1665
+ "test/review/external.test.mjs",
1666
+ "test/review/gate-check.test.mjs",
1667
+ "test/review/reopen.test.mjs",
1668
+ "test/review/waived-all.test.mjs",
1669
+ "test/session/plan-sections.test.mjs",
1670
+ "test/skill/structure.test.mjs",
1671
+ "test/state/block.test.mjs",
1672
+ "test/worker/deletion-review.test.mjs"
1673
+ ],
1674
+ "depends_on": [
1675
+ "B108"
1676
+ ],
1677
+ "note": "root-added 2026-10-13; issue #16 item 6 (Group E); block close prints `reviewed <path> ticket <id>` for every file the review gate accepts, --json and the done file carry reviewed [{file, ticket, via}]; the coder report needs no hand ticket lines; a mismatched hand line under --report prints a held WARN; no-ticket, bad-ticket and lines-unavailable WARNs are held and print only on a successful close"
1678
+ },
1679
+ "B109": {
1680
+ "title": "Step up from quick to one full review before split_required",
1681
+ "wave": 14,
1682
+ "level": "L2",
1683
+ "status": "landed",
1684
+ "owned": [
1685
+ "docs/how-it-works.md",
1686
+ "skill/references/review.md",
1687
+ "src/review/engine.mjs",
1688
+ "test/review/budget-step-up.test.mjs",
1689
+ "test/review/test-quality.test.mjs"
1690
+ ],
1691
+ "depends_on": [
1692
+ "B96"
1693
+ ],
1694
+ "note": "root-added 2026-10-13; issue #16 item 1 (plans/field-bugs/plan.md B109, D1 = a); a non-Markdown quick packet over quick_in is planned again at risk 1; if that plan is one full session and fits full_in it reviews with it (review.plan step_up {from: 'quick', tokens_in, budget}); otherwise split_required with the full packet's size; first block built by Codex at high effort"
1695
+ },
1696
+ "B110": {
1697
+ "title": "Re-run a cached round-1 split_required",
1698
+ "wave": 14,
1699
+ "level": "L2",
1700
+ "status": "landed",
1701
+ "owned": [
1702
+ "docs/how-it-works.md",
1703
+ "skill/references/code.md",
1704
+ "skill/references/review.md",
1705
+ "src/cli/review-file.mjs",
1706
+ "test/skill/structure.test.mjs",
1707
+ "test/worker/fresh-split.test.mjs",
1708
+ "test/worker/fresh.test.mjs"
1709
+ ],
1710
+ "depends_on": [
1711
+ "B109"
1712
+ ],
1713
+ "note": "root-added 2026-10-13; issue #16 item 2 (plans/field-bugs/plan.md B110); a cached round-1 split_required ran no session and counts no round: plain review-file re-queues it with retry: true and --fresh re-queues it, same ticket id; a recheck stop (status stopped, stopped split_required) still needs block reopen or waive; built by Codex at high effort"
1714
+ },
1715
+ "B111": {
1716
+ "title": "An unchanged or incomplete recheck never counts or stalls",
1717
+ "wave": 14,
1718
+ "level": "L2",
1719
+ "status": "landed",
1720
+ "owned": [
1721
+ "docs/how-it-works.md",
1722
+ "skill/references/review.md",
1723
+ "src/review/fixloop.mjs",
1724
+ "src/worker/engine.mjs",
1725
+ "test/review/recheck-real.test.mjs",
1726
+ "test/autopilot/actions.test.mjs",
1727
+ "test/cli/block-human-confirm.test.mjs",
1728
+ "test/review/fixloop.test.mjs",
1729
+ "test/review/moved-wiring.test.mjs",
1730
+ "test/review/patch-progress.test.mjs",
1731
+ "test/review/reopen.test.mjs",
1732
+ "test/worker/fixloop-wiring.test.mjs",
1733
+ "test/worker/pool.test.mjs",
1734
+ "test/worker/review-state-durable.test.mjs",
1735
+ "test/worker/review-state-restore.test.mjs"
1736
+ ],
1737
+ "depends_on": [
1738
+ "B110"
1739
+ ],
1740
+ "note": "root-added 2026-10-13; issue #16 item 3 (plans/field-bugs/plan.md B111, D3 = a); P1: a recheck with no fix hunks runs no session, counts no round and returns reviewed, approved false, reason no-fix-hunks; P2: a recheck answer without a resolved entry for each open finding of its packet is a schema miss (B55/B91 second level at the second broken result, else unavailable); the worker recheck summary gains status, tokens_in, tokens_out and reason; 10 fixtures now answer resolved explicitly; built by Codex at high effort in 2 rounds"
1741
+ },
1742
+ "B97": {
1743
+ "title": "Paired-file names in the packet; untracked owned files can be attached",
1744
+ "wave": 14,
1745
+ "level": "L2",
1746
+ "status": "landed",
1747
+ "owned": [
1748
+ "docs/how-it-works.md",
1749
+ "skill/references/review.md",
1750
+ "src/review/packet.mjs",
1751
+ "src/review/paired.mjs",
1752
+ "test/review/engine.test.mjs",
1753
+ "test/review/packet.test.mjs",
1754
+ "test/review/paired.test.mjs"
1755
+ ],
1756
+ "depends_on": [
1757
+ "B111"
1758
+ ],
1759
+ "note": "root-added 2026-10-13; Group E E5 part 1 (plans/run-speed/plan.md B97, D4 = a); pairsFor by stem for .mjs/.ts/PHP/Go/Python/Swift; summarize lists at most 40 unique test names or exported symbols of at most 120 chars, redacted before truncation; assemblePacket takes paired and renders ## paired after ## context, dropped first over budget, never split_required; attachFiles attaches an untracked file only when owned and changed in the block and not ignored or secret-like; builders wire it in B98; built by Codex at high effort in 2 rounds"
1760
+ },
1761
+ "B98": {
1762
+ "title": "The packet builders send the paired files; the lenses use them",
1763
+ "wave": 14,
1764
+ "level": "L2",
1765
+ "status": "landed",
1766
+ "owned": [
1767
+ "docs/how-it-works.md",
1768
+ "skill/references/review.md",
1769
+ "src/review/engine.mjs",
1770
+ "src/review/fixloop.mjs",
1771
+ "src/review/lenses/A.md",
1772
+ "src/review/lenses/B.md",
1773
+ "src/review/lenses/full.md",
1774
+ "src/review/lenses/recheck.md",
1775
+ "src/worker/engine.mjs",
1776
+ "test/review/fixloop.test.mjs",
1777
+ "test/review/paired-wiring.test.mjs",
1778
+ "test/review/route.test.mjs",
1779
+ "test/review/sections.test.mjs"
1780
+ ],
1781
+ "depends_on": [
1782
+ "B97"
1783
+ ],
1784
+ "note": "root-added 2026-10-13; Group E E5 part 2 (plans/run-speed/plan.md B98); pairedContext builds ## paired from the block's owned changed peers plus its test_files (glob entries dropped) in round 1, full rounds and rechecks; the worker passes ownedFiles/changedFiles so needs_file can attach a new untracked owned test file; a failing peer listing is fail-soft (empty context); the four lenses say a test named in ## paired exists; built by Codex at high effort in 2 rounds"
1785
+ },
1786
+ "B112": {
1787
+ "title": "Suite speed: peer diffs read lazily again (B98 regression); bench test load-proof",
1788
+ "wave": 14,
1789
+ "level": "L2",
1790
+ "status": "landed",
1791
+ "owned": [
1792
+ "src/worker/engine.mjs",
1793
+ "test/worker/peer-diffs-lazy.test.mjs",
1794
+ "test/bench-review.test.mjs"
1795
+ ],
1796
+ "depends_on": [
1797
+ "B98"
1798
+ ],
1799
+ "note": "root-added 2026-10-13; velocity; review.test.mjs 89 s -> 44 s"
1800
+ },
1801
+ "B113": {
1802
+ "title": "No leaked workers: orphan stop, failure-safe test cleanup, no-leak worker check",
1803
+ "wave": 14,
1804
+ "level": "L2",
1805
+ "status": "landed",
1806
+ "owned": [
1807
+ "docs/how-it-works.md",
1808
+ "package.json",
1809
+ "src/worker/loop.mjs",
1810
+ "test/cli/review.test.mjs",
1811
+ "test/docs-marketing.test.mjs",
1812
+ "test/harness-isolation.test.mjs",
1813
+ "test/helpers/isolate.mjs",
1814
+ "test/helpers/worker-processes.mjs",
1815
+ "test/no-leak.test.mjs",
1816
+ "test/router.test.mjs",
1817
+ "test/worker/cli-cleanup.test.mjs",
1818
+ "test/worker/helper-cleanup.test.mjs",
1819
+ "test/worker/helpers.mjs",
1820
+ "test/worker/orphan-guard.test.mjs",
1821
+ "test/worker/orphan.test.mjs",
1822
+ "test/worker/process-list.test.mjs"
1823
+ ],
1824
+ "depends_on": [
1825
+ "B112"
1826
+ ],
1827
+ "note": "root-added 2026-10-13; bug; 226 orphan test workers drove load to 350-450 and broke the release test step"
1242
1828
  }
1243
1829
  }
1244
1830
  }