@codedology/code-forge 0.8.0 → 0.10.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 (64) hide show
  1. package/CHANGELOG.md +114 -0
  2. package/README.md +46 -7
  3. package/docs/reference/blocks.json +618 -1
  4. package/docs/reference/config.md +36 -0
  5. package/package.json +1 -1
  6. package/schema/code-forge.schema.json +89 -0
  7. package/skill/references/adapters/claude-code.md +1 -1
  8. package/skill/references/adapters/solo.md +2 -2
  9. package/skill/references/adapters/subprocess.md +12 -2
  10. package/skill/references/code.md +21 -7
  11. package/skill/references/ledger.md +2 -2
  12. package/skill/references/proof.md +77 -2
  13. package/skill/references/review.md +29 -4
  14. package/skill/references/security.md +5 -5
  15. package/skill/scripts/forge +1 -1
  16. package/skill/templates/coder-brief.md +4 -2
  17. package/src/autopilot/binnacle.mjs +9 -3
  18. package/src/cli/block.mjs +300 -33
  19. package/src/cli/jev.mjs +22 -3
  20. package/src/cli/keys.mjs +156 -21
  21. package/src/cli/proof.mjs +35 -7
  22. package/src/cli/review-file.mjs +264 -13
  23. package/src/cli/spawn.mjs +44 -3
  24. package/src/config/validate.mjs +320 -5
  25. package/src/doctor/index.mjs +7 -5
  26. package/src/doctor/local.mjs +116 -8
  27. package/src/doctor/probes.mjs +38 -0
  28. package/src/engines/builders/codex.mjs +44 -4
  29. package/src/engines/sandbox-dirs.mjs +257 -0
  30. package/src/keys/store.mjs +128 -21
  31. package/src/ledger/write.mjs +7 -1
  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/answers.mjs +445 -0
  38. package/src/review/deletion.mjs +106 -0
  39. package/src/review/engine.mjs +117 -31
  40. package/src/review/fixloop.mjs +70 -28
  41. package/src/review/gate-check.mjs +378 -80
  42. package/src/review/lenses/A.md +1 -0
  43. package/src/review/lenses/B.md +1 -0
  44. package/src/review/lenses/full.md +1 -0
  45. package/src/review/lenses/quick.md +1 -0
  46. package/src/review/lenses/recheck.md +1 -0
  47. package/src/review/reopen.mjs +256 -0
  48. package/src/review/route.mjs +232 -0
  49. package/src/review/schema-fallback.mjs +77 -22
  50. package/src/review/session-retry.mjs +44 -9
  51. package/src/review/stop-exits.mjs +15 -0
  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.mjs +13 -3
  56. package/src/state/config-snapshot.mjs +39 -0
  57. package/src/state/run.mjs +4 -0
  58. package/src/util/forbidden.mjs +11 -1
  59. package/src/util/tmp.mjs +16 -4
  60. package/src/worker/engine.mjs +75 -9
  61. package/src/worker/loop.mjs +82 -15
  62. package/src/worker/queue.mjs +265 -10
  63. package/src/worker/review-state.mjs +346 -51
  64. 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": 73,
7
+ "block_count": 102,
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": {
@@ -1006,6 +1006,623 @@
1006
1006
  "B66"
1007
1007
  ],
1008
1008
  "note": "root-added 2026-10-12; GitHub issue #13 adoption plan (plans/adoption-13/plan.md); also amends skill/SKILL.md, skill/references/code.md, docs/README.md, docs/how-it-works.md and test/skill/structure.test.mjs"
1009
+ },
1010
+ "B68": {
1011
+ "title": "A lost review-state file is rebuilt from the signed ledger, never reset",
1012
+ "wave": 14,
1013
+ "level": "L2",
1014
+ "status": "landed",
1015
+ "owned": [
1016
+ "src/worker/review-state.mjs",
1017
+ "test/worker/review-state-restore.test.mjs"
1018
+ ],
1019
+ "depends_on": [
1020
+ "B67"
1021
+ ],
1022
+ "note": "root-added 2026-10-12; GitHub issue #15 review-exits plan (plans/review-exits/plan.md); review.state anchors carry a slim signed state_body; also amends src/worker/engine.mjs, src/worker/loop.mjs, skill/references/review.md, skill/references/ledger.md and test/worker/fixloop-wiring.test.mjs"
1023
+ },
1024
+ "B69": {
1025
+ "title": "Review state lives under the code-forge home, not the temp root",
1026
+ "wave": 14,
1027
+ "level": "L1",
1028
+ "status": "landed",
1029
+ "owned": [
1030
+ "src/worker/review-state.mjs",
1031
+ "src/doctor/local.mjs",
1032
+ "test/worker/review-state-durable.test.mjs"
1033
+ ],
1034
+ "depends_on": [
1035
+ "B68"
1036
+ ],
1037
+ "note": "root-added 2026-10-12; GitHub issue #15 review-exits plan (plans/review-exits/plan.md); state at <home>/runs/<run>/review-state, one-time checked move from the temp root, doctor review-state row; also amends src/util/tmp.mjs (runRootPath), src/worker/engine.mjs, src/doctor/index.mjs, skill/references/review.md, docs/how-it-works.md, docs/getting-started.md and the B68/fixloop-wiring tests"
1038
+ },
1039
+ "B70": {
1040
+ "title": "A fully waived review counts as reviewed",
1041
+ "wave": 14,
1042
+ "level": "L2",
1043
+ "status": "landed",
1044
+ "owned": [
1045
+ "src/review/gate-check.mjs",
1046
+ "test/review/waived-all.test.mjs"
1047
+ ],
1048
+ "depends_on": [
1049
+ "B69"
1050
+ ],
1051
+ "note": "root-added 2026-10-12; GitHub issue #9 review-exits plan (plans/review-exits/plan.md); reviewed_by_waiver status and signed gate.review_waived_all row before block.close; unknown severity is human-only; also amends src/cli/block.mjs, skill/references/review.md, skill/references/ledger.md, docs/how-it-works.md and docs/concepts.md"
1052
+ },
1053
+ "B77": {
1054
+ "title": "Test guard ignores live runs of the developer",
1055
+ "wave": 14,
1056
+ "level": "L1",
1057
+ "status": "landed",
1058
+ "owned": [
1059
+ "test/helpers/isolate.mjs",
1060
+ "test/helpers-isolate.test.mjs"
1061
+ ],
1062
+ "depends_on": [
1063
+ "B70"
1064
+ ],
1065
+ "note": "root-added 2026-10-12; tool fix found while building (plans/pipeline.md); leakedEntries: a new path of a run whose record was in the baseline is not a leak; also amends test/no-leak.test.mjs"
1066
+ },
1067
+ "B78": {
1068
+ "title": "Full reviewed text comes back after a restore",
1069
+ "wave": 14,
1070
+ "level": "L1",
1071
+ "status": "landed",
1072
+ "owned": [
1073
+ "src/worker/review-state.mjs",
1074
+ "test/worker/review-state-restore.test.mjs"
1075
+ ],
1076
+ "depends_on": [
1077
+ "B77"
1078
+ ],
1079
+ "note": "root-added 2026-10-12; tool fix found while building (plans/pipeline.md), follows B68 (issue #15); reviewed_content_blob in the signed state_body, git hash-object/cat-file with a discovery ceiling, sha-checked, falls back to B68; also amends src/worker/engine.mjs, skill/references/review.md and skill/references/ledger.md"
1080
+ },
1081
+ "B71": {
1082
+ "title": "review-file --answers: a reviewer judges a fix made in another owned file",
1083
+ "wave": 14,
1084
+ "level": "L2",
1085
+ "status": "landed",
1086
+ "owned": [
1087
+ "src/review/answers.mjs",
1088
+ "test/review/answers.test.mjs"
1089
+ ],
1090
+ "depends_on": [
1091
+ "B78"
1092
+ ],
1093
+ "note": "root-added 2026-10-12; GitHub issue #9 review-exits plan (plans/review-exits/plan.md); answers ticket kind, signed review.answered rows bound to both content hashes, gate counts a still-current answer like a waiver (answered list on gate.review_waived_all), unknown severities fail closed; also amends src/review/gate-check.mjs, src/cli/review-file.mjs, src/cli/block.mjs, src/worker/queue.mjs, src/worker/engine.mjs, src/worker/loop.mjs, skill/references/review.md, skill/references/ledger.md and docs/how-it-works.md"
1094
+ },
1095
+ "B72": {
1096
+ "title": "block reopen: a human restarts a stopped or lost file on new content",
1097
+ "wave": 14,
1098
+ "level": "L2",
1099
+ "status": "landed",
1100
+ "owned": [
1101
+ "src/review/reopen.mjs",
1102
+ "test/review/reopen.test.mjs"
1103
+ ],
1104
+ "depends_on": [
1105
+ "B71"
1106
+ ],
1107
+ "note": "root-added 2026-10-12; GitHub issues #12 and #15 review-exits plan (plans/review-exits/plan.md); human-only verb on CODER_ONLY_FORBIDDEN, signed review.reopened row bound to the latest anchor seq, stop_content_hash in the state, one row per at_seq, L3 rung stays spent; also amends src/cli/block.mjs, src/util/forbidden.mjs, src/worker/engine.mjs, src/worker/queue.mjs, the forbidden-list pin tests, skill/references/review.md, skill/references/ledger.md, skill/references/code.md and docs/how-it-works.md"
1108
+ },
1109
+ "B79": {
1110
+ "title": "Review-exit leftovers: cap-row severity, answers packet secrets and budget, reopen config and write cause",
1111
+ "wave": 14,
1112
+ "level": "L1",
1113
+ "status": "landed",
1114
+ "owned": [
1115
+ "src/review/answers.mjs",
1116
+ "src/review/gate-check.mjs",
1117
+ "src/cli/block.mjs",
1118
+ "src/review/reopen.mjs",
1119
+ "test/review/answers.test.mjs",
1120
+ "test/review/reopen.test.mjs"
1121
+ ],
1122
+ "depends_on": [
1123
+ "B72"
1124
+ ],
1125
+ "note": "root-added 2026-10-12; leftovers from the B71 and B72 round-3 reviews; also amends B71 (answers packet, openAt) and B72 (reopen config, write failure)"
1126
+ },
1127
+ "B73": {
1128
+ "title": "A patch check that closes findings is progress; stop answers name the exits",
1129
+ "wave": 14,
1130
+ "level": "L2",
1131
+ "status": "landed",
1132
+ "owned": [
1133
+ "src/review/fixloop.mjs",
1134
+ "src/review/stop-exits.mjs",
1135
+ "src/cli/review-file.mjs",
1136
+ "src/review/gate-check.mjs",
1137
+ "test/review/patch-progress.test.mjs",
1138
+ "test/worker/fix-list.test.mjs",
1139
+ "test/autopilot/actions.test.mjs",
1140
+ "docs/how-it-works.md",
1141
+ "skill/references/review.md"
1142
+ ],
1143
+ "depends_on": [
1144
+ "B79"
1145
+ ],
1146
+ "note": "root-added 2026-10-12; issue #12 items 9-10; also amends B71 (review-file stopped answer) and the gate review_cap/unreviewed detail"
1147
+ },
1148
+ "B81": {
1149
+ "title": "Deterministic ledger rotation race test",
1150
+ "wave": 14,
1151
+ "level": "L1",
1152
+ "status": "landed",
1153
+ "owned": [
1154
+ "src/ledger/write.mjs",
1155
+ "test/ledger/write.test.mjs"
1156
+ ],
1157
+ "depends_on": [
1158
+ "B73"
1159
+ ],
1160
+ "note": "root-added 2026-10-12; the claimRotatedName two-racers test failed once under full-suite load during the B73 land; an afterLink hook forces the race order"
1161
+ },
1162
+ "B74": {
1163
+ "title": "A deleted owned file is reviewed with a deletion note",
1164
+ "wave": 14,
1165
+ "level": "L1",
1166
+ "status": "landed",
1167
+ "owned": [
1168
+ "src/review/engine.mjs",
1169
+ "src/review/deletion.mjs",
1170
+ "test/worker/deletion-review.test.mjs",
1171
+ "docs/how-it-works.md",
1172
+ "skill/references/review.md"
1173
+ ],
1174
+ "depends_on": [
1175
+ "B81"
1176
+ ],
1177
+ "note": "root-added 2026-10-12; issue #8; the deletion flow already worked end to end (pinned by test); adds the deletion note with bounded reference search"
1178
+ },
1179
+ "B75": {
1180
+ "title": "review-file --fresh re-runs only results that never counted",
1181
+ "wave": 14,
1182
+ "level": "L1",
1183
+ "status": "landed",
1184
+ "owned": [
1185
+ "src/cli/review-file.mjs",
1186
+ "src/worker/queue.mjs",
1187
+ "test/worker/fresh.test.mjs",
1188
+ "test/worker/queue.test.mjs",
1189
+ "skill/references/review.md",
1190
+ "skill/references/code.md"
1191
+ ],
1192
+ "depends_on": [
1193
+ "B74"
1194
+ ],
1195
+ "note": "root-added 2026-10-12; issue #10 item 4; classify the done marker in place, claim only a re-runnable one by atomic rename, restore by link; leftovers in B83"
1196
+ },
1197
+ "B82": {
1198
+ "title": "Deterministic worker restart kill test",
1199
+ "wave": 14,
1200
+ "level": "L1",
1201
+ "status": "landed",
1202
+ "owned": [
1203
+ "test/worker/worker.test.mjs"
1204
+ ],
1205
+ "depends_on": [
1206
+ "B75"
1207
+ ],
1208
+ "note": "root-added 2026-10-12; the 'new worker re-reads 3 queued tickets' test checked a killed pid once and failed under load (zombie window); it now waits for ESRCH with a 5 s deadline"
1209
+ },
1210
+ "B76": {
1211
+ "title": "the skill and docs name the review exits in order",
1212
+ "wave": 14,
1213
+ "level": "L1",
1214
+ "status": "landed",
1215
+ "owned": [
1216
+ "skill/references/review.md",
1217
+ "skill/references/code.md",
1218
+ "skill/references/security.md",
1219
+ "skill/templates/coder-brief.md",
1220
+ "docs/how-it-works.md",
1221
+ "test/skill/structure.test.mjs"
1222
+ ],
1223
+ "depends_on": [
1224
+ "B75"
1225
+ ],
1226
+ "note": "root-added 2026-10-12; group A docs; exits in order (fix + block reopen, --answers, block waive, re-decompose), block attempt never resets review state, a lost state is rebuilt from the ledger, when --fresh helps"
1227
+ },
1228
+ "B83": {
1229
+ "title": "review-file --fresh fails closed when a marker cannot be restored",
1230
+ "wave": 14,
1231
+ "level": "L1",
1232
+ "status": "landed",
1233
+ "owned": [
1234
+ "src/worker/queue.mjs",
1235
+ "src/cli/review-file.mjs",
1236
+ "test/worker/fresh.test.mjs"
1237
+ ],
1238
+ "depends_on": [
1239
+ "B76"
1240
+ ],
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"
1009
1626
  }
1010
1627
  }
1011
1628
  }