@dzhechkov/harness-core 0.5.3 → 0.6.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.
- package/.dz-manifest.json +88 -32
- package/LICENSE +21 -0
- package/README.md +13 -1
- package/dist/feature-adr-checkpoints.d.ts +51 -0
- package/dist/feature-adr-checkpoints.d.ts.map +1 -1
- package/dist/feature-adr-checkpoints.js +63 -1
- package/dist/feature-adr-checkpoints.js.map +1 -1
- package/dist/feature-adr-routing.d.ts +437 -4
- package/dist/feature-adr-routing.d.ts.map +1 -1
- package/dist/feature-adr-routing.js +719 -6
- package/dist/feature-adr-routing.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -3
- package/dist/index.js.map +1 -1
- package/dist/loop-blobs.generated.js +5 -5
- package/dist/loop-blobs.generated.js.map +1 -1
- package/package.json +18 -18
- package/sbom.json +177 -37
- package/src/feature-adr-checkpoints.ts +74 -1
- package/src/feature-adr-routing.ts +851 -6
- package/src/index.ts +52 -1
- package/src/loop-blobs.generated.ts +5 -5
package/sbom.json
CHANGED
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"hashes": [
|
|
16
16
|
{
|
|
17
17
|
"alg": "SHA-256",
|
|
18
|
-
"content": "
|
|
18
|
+
"content": "91eaf7e5d2dbf1c4a6627a001c1bf3551e84346a9fa1cc03d2c3eb53fc5eaa33"
|
|
19
19
|
}
|
|
20
20
|
]
|
|
21
21
|
},
|
|
@@ -25,17 +25,7 @@
|
|
|
25
25
|
"hashes": [
|
|
26
26
|
{
|
|
27
27
|
"alg": "SHA-256",
|
|
28
|
-
"content": "
|
|
29
|
-
}
|
|
30
|
-
]
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"type": "file",
|
|
34
|
-
"name": "coverage/.tmp/coverage-0.json",
|
|
35
|
-
"hashes": [
|
|
36
|
-
{
|
|
37
|
-
"alg": "SHA-256",
|
|
38
|
-
"content": "7d9ddf585a3cec04412ed70c7c0356a52b051f70ecf2cabda78bbb980c468968"
|
|
28
|
+
"content": "d8f8f086d2e3ad77f20b8692890eff77ee18a82e7057379ed73ea738447d06a4"
|
|
39
29
|
}
|
|
40
30
|
]
|
|
41
31
|
},
|
|
@@ -1245,7 +1235,7 @@
|
|
|
1245
1235
|
"hashes": [
|
|
1246
1236
|
{
|
|
1247
1237
|
"alg": "SHA-256",
|
|
1248
|
-
"content": "
|
|
1238
|
+
"content": "13d7d90d33f6c30498b397f34c32d095bdc91e407901a51a9ccdf40a56c60124"
|
|
1249
1239
|
}
|
|
1250
1240
|
]
|
|
1251
1241
|
},
|
|
@@ -1255,7 +1245,7 @@
|
|
|
1255
1245
|
"hashes": [
|
|
1256
1246
|
{
|
|
1257
1247
|
"alg": "SHA-256",
|
|
1258
|
-
"content": "
|
|
1248
|
+
"content": "bd89f5965d7437b4cef069a9a34cec1ab9f6cee40acde29cdba3fd4a18f27422"
|
|
1259
1249
|
}
|
|
1260
1250
|
]
|
|
1261
1251
|
},
|
|
@@ -1265,7 +1255,7 @@
|
|
|
1265
1255
|
"hashes": [
|
|
1266
1256
|
{
|
|
1267
1257
|
"alg": "SHA-256",
|
|
1268
|
-
"content": "
|
|
1258
|
+
"content": "2738a809f3910c7aebc595fc0140d77a8ce5a258036dd318ce05053066c5f07a"
|
|
1269
1259
|
}
|
|
1270
1260
|
]
|
|
1271
1261
|
},
|
|
@@ -1275,7 +1265,7 @@
|
|
|
1275
1265
|
"hashes": [
|
|
1276
1266
|
{
|
|
1277
1267
|
"alg": "SHA-256",
|
|
1278
|
-
"content": "
|
|
1268
|
+
"content": "bdeac6f879ab1695a11bb2323dc03ba4fa25dd7bd6da19e47208a69df33576f5"
|
|
1279
1269
|
}
|
|
1280
1270
|
]
|
|
1281
1271
|
},
|
|
@@ -1325,7 +1315,7 @@
|
|
|
1325
1315
|
"hashes": [
|
|
1326
1316
|
{
|
|
1327
1317
|
"alg": "SHA-256",
|
|
1328
|
-
"content": "
|
|
1318
|
+
"content": "a70af15e057ac643df6345a237c58bb3fb4b72f6707588eda3a93258394f78d0"
|
|
1329
1319
|
}
|
|
1330
1320
|
]
|
|
1331
1321
|
},
|
|
@@ -1335,7 +1325,7 @@
|
|
|
1335
1325
|
"hashes": [
|
|
1336
1326
|
{
|
|
1337
1327
|
"alg": "SHA-256",
|
|
1338
|
-
"content": "
|
|
1328
|
+
"content": "d19ee6f3753d3c715ae71113d85ca1349b04a6c31c72cb7593ab5c59adb174cb"
|
|
1339
1329
|
}
|
|
1340
1330
|
]
|
|
1341
1331
|
},
|
|
@@ -1345,7 +1335,7 @@
|
|
|
1345
1335
|
"hashes": [
|
|
1346
1336
|
{
|
|
1347
1337
|
"alg": "SHA-256",
|
|
1348
|
-
"content": "
|
|
1338
|
+
"content": "a2f73174d723a7b60292197d84d4b5ffdccf64eeb030b83594928cae45265bba"
|
|
1349
1339
|
}
|
|
1350
1340
|
]
|
|
1351
1341
|
},
|
|
@@ -1355,7 +1345,7 @@
|
|
|
1355
1345
|
"hashes": [
|
|
1356
1346
|
{
|
|
1357
1347
|
"alg": "SHA-256",
|
|
1358
|
-
"content": "
|
|
1348
|
+
"content": "cc1df1420b813207fbd9a3cdaae1c3d8db38b1c85c45472c2e132058c7ca6d72"
|
|
1359
1349
|
}
|
|
1360
1350
|
]
|
|
1361
1351
|
},
|
|
@@ -1525,7 +1515,7 @@
|
|
|
1525
1515
|
"hashes": [
|
|
1526
1516
|
{
|
|
1527
1517
|
"alg": "SHA-256",
|
|
1528
|
-
"content": "
|
|
1518
|
+
"content": "318e76012b186069d07446f4e3c719f439d1bda17314b5dd6d198abf62293ada"
|
|
1529
1519
|
}
|
|
1530
1520
|
]
|
|
1531
1521
|
},
|
|
@@ -1535,7 +1525,7 @@
|
|
|
1535
1525
|
"hashes": [
|
|
1536
1526
|
{
|
|
1537
1527
|
"alg": "SHA-256",
|
|
1538
|
-
"content": "
|
|
1528
|
+
"content": "997baa864e08b51d00c0207e5cb5e8d51c9c8c2f338037730944f78fa11d98d9"
|
|
1539
1529
|
}
|
|
1540
1530
|
]
|
|
1541
1531
|
},
|
|
@@ -1545,7 +1535,7 @@
|
|
|
1545
1535
|
"hashes": [
|
|
1546
1536
|
{
|
|
1547
1537
|
"alg": "SHA-256",
|
|
1548
|
-
"content": "
|
|
1538
|
+
"content": "95ec1aba37fe76082ad4fd5c75e53432fa6e81c39263cf98ef03aae5c73bba4b"
|
|
1549
1539
|
}
|
|
1550
1540
|
]
|
|
1551
1541
|
},
|
|
@@ -1555,7 +1545,7 @@
|
|
|
1555
1545
|
"hashes": [
|
|
1556
1546
|
{
|
|
1557
1547
|
"alg": "SHA-256",
|
|
1558
|
-
"content": "
|
|
1548
|
+
"content": "e5d106e7b3805e65788276981ffdd7a08591bfc3f767ba71caab640c1df8d848"
|
|
1559
1549
|
}
|
|
1560
1550
|
]
|
|
1561
1551
|
},
|
|
@@ -1625,7 +1615,7 @@
|
|
|
1625
1615
|
"hashes": [
|
|
1626
1616
|
{
|
|
1627
1617
|
"alg": "SHA-256",
|
|
1628
|
-
"content": "
|
|
1618
|
+
"content": "d74b846c3c6ca61b457a177719a0481e0c62760c4c106e9571c801ae178b4cf0"
|
|
1629
1619
|
}
|
|
1630
1620
|
]
|
|
1631
1621
|
},
|
|
@@ -1635,7 +1625,7 @@
|
|
|
1635
1625
|
"hashes": [
|
|
1636
1626
|
{
|
|
1637
1627
|
"alg": "SHA-256",
|
|
1638
|
-
"content": "
|
|
1628
|
+
"content": "c35d17990746480a66c9e34d6fa017b44bd233817cf2c798dc3bcd9ee62c7598"
|
|
1639
1629
|
}
|
|
1640
1630
|
]
|
|
1641
1631
|
},
|
|
@@ -3885,7 +3875,17 @@
|
|
|
3885
3875
|
"hashes": [
|
|
3886
3876
|
{
|
|
3887
3877
|
"alg": "SHA-256",
|
|
3888
|
-
"content": "
|
|
3878
|
+
"content": "abd7ce2bbf152b2e491c8fcaa1e7ee7bf6895a9a156a997e98596d13e31040aa"
|
|
3879
|
+
}
|
|
3880
|
+
]
|
|
3881
|
+
},
|
|
3882
|
+
{
|
|
3883
|
+
"type": "file",
|
|
3884
|
+
"name": "scripts/refuse-wrong-publisher.mjs",
|
|
3885
|
+
"hashes": [
|
|
3886
|
+
{
|
|
3887
|
+
"alg": "SHA-256",
|
|
3888
|
+
"content": "08bc189534281dd5421e941bd90b14b139dfd3b1dbf3125c9e7f0cf8db8c5add"
|
|
3889
3889
|
}
|
|
3890
3890
|
]
|
|
3891
3891
|
},
|
|
@@ -4195,7 +4195,7 @@
|
|
|
4195
4195
|
"hashes": [
|
|
4196
4196
|
{
|
|
4197
4197
|
"alg": "SHA-256",
|
|
4198
|
-
"content": "
|
|
4198
|
+
"content": "92b50c6987a9dc04a7a81608df6f819ee759c86d68498adf7b51ff7459c77d5f"
|
|
4199
4199
|
}
|
|
4200
4200
|
]
|
|
4201
4201
|
},
|
|
@@ -4215,7 +4215,7 @@
|
|
|
4215
4215
|
"hashes": [
|
|
4216
4216
|
{
|
|
4217
4217
|
"alg": "SHA-256",
|
|
4218
|
-
"content": "
|
|
4218
|
+
"content": "026f0bff646597899fcbb167066e44c0f474896de766da484231cf3f2aeeb8d8"
|
|
4219
4219
|
}
|
|
4220
4220
|
]
|
|
4221
4221
|
},
|
|
@@ -4265,7 +4265,7 @@
|
|
|
4265
4265
|
"hashes": [
|
|
4266
4266
|
{
|
|
4267
4267
|
"alg": "SHA-256",
|
|
4268
|
-
"content": "
|
|
4268
|
+
"content": "92c155f8dcde89e00d85f1eaf9748b32023ccf0ab3412f605b6d3769cdc37702"
|
|
4269
4269
|
}
|
|
4270
4270
|
]
|
|
4271
4271
|
},
|
|
@@ -4285,7 +4285,7 @@
|
|
|
4285
4285
|
"hashes": [
|
|
4286
4286
|
{
|
|
4287
4287
|
"alg": "SHA-256",
|
|
4288
|
-
"content": "
|
|
4288
|
+
"content": "60d25e8153ca6399e5e56b01db31b089001af84eec38e1f9082c1b16f6aa863d"
|
|
4289
4289
|
}
|
|
4290
4290
|
]
|
|
4291
4291
|
},
|
|
@@ -5069,6 +5069,26 @@
|
|
|
5069
5069
|
}
|
|
5070
5070
|
]
|
|
5071
5071
|
},
|
|
5072
|
+
{
|
|
5073
|
+
"type": "file",
|
|
5074
|
+
"name": "test/change-set-probe.test.ts",
|
|
5075
|
+
"hashes": [
|
|
5076
|
+
{
|
|
5077
|
+
"alg": "SHA-256",
|
|
5078
|
+
"content": "24a968aa313fcd7381134ea8df05f011d0529b6c5146f7769c6e6d1ab17ff93d"
|
|
5079
|
+
}
|
|
5080
|
+
]
|
|
5081
|
+
},
|
|
5082
|
+
{
|
|
5083
|
+
"type": "file",
|
|
5084
|
+
"name": "test/checkpoint-witness.test.ts",
|
|
5085
|
+
"hashes": [
|
|
5086
|
+
{
|
|
5087
|
+
"alg": "SHA-256",
|
|
5088
|
+
"content": "f55d4f5a096e201ef305e46e320123a690a218d1bc67b5505d5fa5aa3f8131f8"
|
|
5089
|
+
}
|
|
5090
|
+
]
|
|
5091
|
+
},
|
|
5072
5092
|
{
|
|
5073
5093
|
"type": "file",
|
|
5074
5094
|
"name": "test/claim-check-hook.test.ts",
|
|
@@ -5139,6 +5159,16 @@
|
|
|
5139
5159
|
}
|
|
5140
5160
|
]
|
|
5141
5161
|
},
|
|
5162
|
+
{
|
|
5163
|
+
"type": "file",
|
|
5164
|
+
"name": "test/codex-scoped-review.test.ts",
|
|
5165
|
+
"hashes": [
|
|
5166
|
+
{
|
|
5167
|
+
"alg": "SHA-256",
|
|
5168
|
+
"content": "34414570dac7fd1fe762f2b64a6d498334b9944200dbfbcbdcc22b43b596df44"
|
|
5169
|
+
}
|
|
5170
|
+
]
|
|
5171
|
+
},
|
|
5142
5172
|
{
|
|
5143
5173
|
"type": "file",
|
|
5144
5174
|
"name": "test/compounding.test.ts",
|
|
@@ -5179,6 +5209,16 @@
|
|
|
5179
5209
|
}
|
|
5180
5210
|
]
|
|
5181
5211
|
},
|
|
5212
|
+
{
|
|
5213
|
+
"type": "file",
|
|
5214
|
+
"name": "test/cross-family-qe.test.ts",
|
|
5215
|
+
"hashes": [
|
|
5216
|
+
{
|
|
5217
|
+
"alg": "SHA-256",
|
|
5218
|
+
"content": "a4fe45f891d874933158428f15f54da81a715f6c06f1c0b47ef6cfb67609bcb1"
|
|
5219
|
+
}
|
|
5220
|
+
]
|
|
5221
|
+
},
|
|
5182
5222
|
{
|
|
5183
5223
|
"type": "file",
|
|
5184
5224
|
"name": "test/cross-lingual-e2e.test.ts",
|
|
@@ -5225,7 +5265,7 @@
|
|
|
5225
5265
|
"hashes": [
|
|
5226
5266
|
{
|
|
5227
5267
|
"alg": "SHA-256",
|
|
5228
|
-
"content": "
|
|
5268
|
+
"content": "00a66584bc9218cb6429542e6984b77eb6814eb8f4c80def8b514761322ae050"
|
|
5229
5269
|
}
|
|
5230
5270
|
]
|
|
5231
5271
|
},
|
|
@@ -5299,6 +5339,16 @@
|
|
|
5299
5339
|
}
|
|
5300
5340
|
]
|
|
5301
5341
|
},
|
|
5342
|
+
{
|
|
5343
|
+
"type": "file",
|
|
5344
|
+
"name": "test/feature-adr-artifact-probe.test.ts",
|
|
5345
|
+
"hashes": [
|
|
5346
|
+
{
|
|
5347
|
+
"alg": "SHA-256",
|
|
5348
|
+
"content": "2243fc62d1518004ff0309e8c13aa0e06b51f6759233bbf990c4870de032e0fe"
|
|
5349
|
+
}
|
|
5350
|
+
]
|
|
5351
|
+
},
|
|
5302
5352
|
{
|
|
5303
5353
|
"type": "file",
|
|
5304
5354
|
"name": "test/feature-adr-brain.test.ts",
|
|
@@ -5315,7 +5365,7 @@
|
|
|
5315
5365
|
"hashes": [
|
|
5316
5366
|
{
|
|
5317
5367
|
"alg": "SHA-256",
|
|
5318
|
-
"content": "
|
|
5368
|
+
"content": "a644493843c097aeada5fc455ccdf063688761bcfa91e9a6f6423a96811034b3"
|
|
5319
5369
|
}
|
|
5320
5370
|
]
|
|
5321
5371
|
},
|
|
@@ -5335,7 +5385,27 @@
|
|
|
5335
5385
|
"hashes": [
|
|
5336
5386
|
{
|
|
5337
5387
|
"alg": "SHA-256",
|
|
5338
|
-
"content": "
|
|
5388
|
+
"content": "756d443892354a11abe1c405368b5f038bd39cea03efe55f98f23eac6db96451"
|
|
5389
|
+
}
|
|
5390
|
+
]
|
|
5391
|
+
},
|
|
5392
|
+
{
|
|
5393
|
+
"type": "file",
|
|
5394
|
+
"name": "test/feature-adr-design-fan-amplification.test.ts",
|
|
5395
|
+
"hashes": [
|
|
5396
|
+
{
|
|
5397
|
+
"alg": "SHA-256",
|
|
5398
|
+
"content": "9a739da5bbe8c2fb70971d00d51027004c3f59f2c28a12397e0fa594f53d7179"
|
|
5399
|
+
}
|
|
5400
|
+
]
|
|
5401
|
+
},
|
|
5402
|
+
{
|
|
5403
|
+
"type": "file",
|
|
5404
|
+
"name": "test/feature-adr-design-fan-resume.test.ts",
|
|
5405
|
+
"hashes": [
|
|
5406
|
+
{
|
|
5407
|
+
"alg": "SHA-256",
|
|
5408
|
+
"content": "1bf2c8524bd2cf0ff390907780a86f10aaa8656a41ec9967aa295a7a94c078cc"
|
|
5339
5409
|
}
|
|
5340
5410
|
]
|
|
5341
5411
|
},
|
|
@@ -5345,7 +5415,7 @@
|
|
|
5345
5415
|
"hashes": [
|
|
5346
5416
|
{
|
|
5347
5417
|
"alg": "SHA-256",
|
|
5348
|
-
"content": "
|
|
5418
|
+
"content": "19fda071984ef60634c1be53bc04c1c4a531c7d987810a8b310c477cab02942e"
|
|
5349
5419
|
}
|
|
5350
5420
|
]
|
|
5351
5421
|
},
|
|
@@ -5375,7 +5445,7 @@
|
|
|
5375
5445
|
"hashes": [
|
|
5376
5446
|
{
|
|
5377
5447
|
"alg": "SHA-256",
|
|
5378
|
-
"content": "
|
|
5448
|
+
"content": "9c5ac3b9fa91e7d59f50982474fdcb01cf90570efcc9505edf10e785ba5b433f"
|
|
5379
5449
|
}
|
|
5380
5450
|
]
|
|
5381
5451
|
},
|
|
@@ -5429,6 +5499,36 @@
|
|
|
5429
5499
|
}
|
|
5430
5500
|
]
|
|
5431
5501
|
},
|
|
5502
|
+
{
|
|
5503
|
+
"type": "file",
|
|
5504
|
+
"name": "test/fixtures/codex-review-2026-08-21.txt",
|
|
5505
|
+
"hashes": [
|
|
5506
|
+
{
|
|
5507
|
+
"alg": "SHA-256",
|
|
5508
|
+
"content": "d6c2a91af0f58350427dcfbaebef371aa484eb8007192109af84d32762b00a6a"
|
|
5509
|
+
}
|
|
5510
|
+
]
|
|
5511
|
+
},
|
|
5512
|
+
{
|
|
5513
|
+
"type": "file",
|
|
5514
|
+
"name": "test/fixtures/codex-review-empty-scope-2026-08-21.txt",
|
|
5515
|
+
"hashes": [
|
|
5516
|
+
{
|
|
5517
|
+
"alg": "SHA-256",
|
|
5518
|
+
"content": "4a35f4d302ed3c5d6bf25b85da5cab8e9a4be1aac163b0f4fc9d3cad9072b387"
|
|
5519
|
+
}
|
|
5520
|
+
]
|
|
5521
|
+
},
|
|
5522
|
+
{
|
|
5523
|
+
"type": "file",
|
|
5524
|
+
"name": "test/fixtures/codex-review-selfreview-slices-2026-08-21.txt",
|
|
5525
|
+
"hashes": [
|
|
5526
|
+
{
|
|
5527
|
+
"alg": "SHA-256",
|
|
5528
|
+
"content": "371404deb86510c725dd989540efcbbf21f00dc020f0c2ecce51281a63df534b"
|
|
5529
|
+
}
|
|
5530
|
+
]
|
|
5531
|
+
},
|
|
5432
5532
|
{
|
|
5433
5533
|
"type": "file",
|
|
5434
5534
|
"name": "test/fixtures/loop-lint/seeds/seed-1-sandbox-date-now.js",
|
|
@@ -5899,6 +5999,16 @@
|
|
|
5899
5999
|
}
|
|
5900
6000
|
]
|
|
5901
6001
|
},
|
|
6002
|
+
{
|
|
6003
|
+
"type": "file",
|
|
6004
|
+
"name": "test/mode-b-scope.test.ts",
|
|
6005
|
+
"hashes": [
|
|
6006
|
+
{
|
|
6007
|
+
"alg": "SHA-256",
|
|
6008
|
+
"content": "1d03efb58161c9dcc4bf40f1c834777ccc57dc037afa5f9755d1c353aabeb991"
|
|
6009
|
+
}
|
|
6010
|
+
]
|
|
6011
|
+
},
|
|
5902
6012
|
{
|
|
5903
6013
|
"type": "file",
|
|
5904
6014
|
"name": "test/model-recommender.test.ts",
|
|
@@ -5925,7 +6035,7 @@
|
|
|
5925
6035
|
"hashes": [
|
|
5926
6036
|
{
|
|
5927
6037
|
"alg": "SHA-256",
|
|
5928
|
-
"content": "
|
|
6038
|
+
"content": "1ff947d1a906c8a5b3e40ee05f953e7c90cd4b6d52c2c6edb57e877ce06596bd"
|
|
5929
6039
|
}
|
|
5930
6040
|
]
|
|
5931
6041
|
},
|
|
@@ -5989,6 +6099,16 @@
|
|
|
5989
6099
|
}
|
|
5990
6100
|
]
|
|
5991
6101
|
},
|
|
6102
|
+
{
|
|
6103
|
+
"type": "file",
|
|
6104
|
+
"name": "test/partition-findings.test.ts",
|
|
6105
|
+
"hashes": [
|
|
6106
|
+
{
|
|
6107
|
+
"alg": "SHA-256",
|
|
6108
|
+
"content": "5ba94ba0c9d7d74c3846de2073ed8186c69fd68e7575ccb93099dfb7579a47de"
|
|
6109
|
+
}
|
|
6110
|
+
]
|
|
6111
|
+
},
|
|
5992
6112
|
{
|
|
5993
6113
|
"type": "file",
|
|
5994
6114
|
"name": "test/patterns.test.ts",
|
|
@@ -6039,6 +6159,16 @@
|
|
|
6039
6159
|
}
|
|
6040
6160
|
]
|
|
6041
6161
|
},
|
|
6162
|
+
{
|
|
6163
|
+
"type": "file",
|
|
6164
|
+
"name": "test/publisher-guard.test.ts",
|
|
6165
|
+
"hashes": [
|
|
6166
|
+
{
|
|
6167
|
+
"alg": "SHA-256",
|
|
6168
|
+
"content": "bb065e8d63186c13861f8cf55ada96ed6415b63a3ba7d6a5957cb47c6c72ab94"
|
|
6169
|
+
}
|
|
6170
|
+
]
|
|
6171
|
+
},
|
|
6042
6172
|
{
|
|
6043
6173
|
"type": "file",
|
|
6044
6174
|
"name": "test/qe-bridge.test.ts",
|
|
@@ -6259,6 +6389,16 @@
|
|
|
6259
6389
|
}
|
|
6260
6390
|
]
|
|
6261
6391
|
},
|
|
6392
|
+
{
|
|
6393
|
+
"type": "file",
|
|
6394
|
+
"name": "test/step0-artifact.test.ts",
|
|
6395
|
+
"hashes": [
|
|
6396
|
+
{
|
|
6397
|
+
"alg": "SHA-256",
|
|
6398
|
+
"content": "72594c0ddc053f18e7b240cae4b07c61938ba245fd05cd7141dbbeb1a7447441"
|
|
6399
|
+
}
|
|
6400
|
+
]
|
|
6401
|
+
},
|
|
6262
6402
|
{
|
|
6263
6403
|
"type": "file",
|
|
6264
6404
|
"name": "test/store-lock.test.ts",
|
|
@@ -40,7 +40,10 @@ export type CheckpointStage = (typeof CHECKPOINT_STAGES)[number];
|
|
|
40
40
|
* an M+ design must probe its ADR/ideation/architecture files too, not just requirements
|
|
41
41
|
* (Codex QE #2: a one-file probe accepted a materially incomplete design). */
|
|
42
42
|
export const STAGE_ARTIFACTS: Record<CheckpointStage, string | null> = {
|
|
43
|
-
router
|
|
43
|
+
// Since 2026-08-21 Step 0 WRITES this, so the router stage has something to be witnessed by. It was
|
|
44
|
+
// `null` — a stage that promises nothing verifiable — which is precisely how the tier came to be
|
|
45
|
+
// recorded nowhere while a run was alive, and how C4 lost its input without anyone noticing.
|
|
46
|
+
router: '00_complexity_assessment.md',
|
|
44
47
|
design: '01_requirements.md',
|
|
45
48
|
plan: '06_implementation_plan.md',
|
|
46
49
|
code: '07_code_changes/change_manifest.md',
|
|
@@ -71,6 +74,20 @@ export const CHECKPOINT_MAX_RESULT_CHARS = 12_000;
|
|
|
71
74
|
*/
|
|
72
75
|
export const CKPT_SCHEMA_VERSION = 'fa-ckpt-3';
|
|
73
76
|
|
|
77
|
+
/**
|
|
78
|
+
* Router-stage hash token. Step 0's CONTRACT changed on 2026-08-21 — it must now WRITE
|
|
79
|
+
* `00_complexity_assessment.md` with an acid table — and a contract change that leaves the hash
|
|
80
|
+
* alone lets a pre-change router entry resume: the resume gate only asks whether the artifact is
|
|
81
|
+
* PRESENT, and one of the 66 features that already had a (tableless) file satisfies it. Step 0 then
|
|
82
|
+
* never re-runs, the acid table is never written, and C4 goes on skipping — the exact defect this
|
|
83
|
+
* change exists to close, resurrected through the resume path.
|
|
84
|
+
*
|
|
85
|
+
* Scoped like `LANDING_HASH_TOKEN` (003-10) rather than bumping CKPT_SCHEMA_VERSION: only the router
|
|
86
|
+
* stage re-runs once, while design/plan/code/qe checkpoints stay valid. A global bump would re-spend
|
|
87
|
+
* every in-flight stage to fix one.
|
|
88
|
+
*/
|
|
89
|
+
export const ROUTER_CONTRACT_TOKEN = 'router-writes-00-v1';
|
|
90
|
+
|
|
74
91
|
/** FNV-1a 32-bit over UTF-16 code units, hex-encoded (one pass; building block for the 64-bit form). */
|
|
75
92
|
export function fnv1a(str: string): string {
|
|
76
93
|
let h = 0x811c9dc5;
|
|
@@ -686,3 +703,59 @@ export function parseArtifactProbe(opts: {
|
|
|
686
703
|
if (sentinels !== 1) return null;
|
|
687
704
|
return found;
|
|
688
705
|
}
|
|
706
|
+
|
|
707
|
+
/** Why a checkpoint write was refused, or `ok` when it may proceed. */
|
|
708
|
+
export type CheckpointWriteVerdict =
|
|
709
|
+
| { readonly ok: true; readonly line: string; readonly witnessed: readonly string[] }
|
|
710
|
+
| { readonly ok: false; readonly reason: string };
|
|
711
|
+
|
|
712
|
+
/**
|
|
713
|
+
* Decide whether a stage may be recorded — the WITNESS half of `dz feature-adr checkpoint`.
|
|
714
|
+
*
|
|
715
|
+
* Why this exists (2026-08-21). The workflow script runs sandboxed with no filesystem, so it
|
|
716
|
+
* delegated checkpoint writes to a subagent by handing it a FINISHED JSON line and saying "append
|
|
717
|
+
* this". The subagent was a courier: it verified nothing. Read from outside, that shape is one party
|
|
718
|
+
* instructing another to declare a verification gate complete — which is what a safety classifier saw,
|
|
719
|
+
* blocking NINE such writes in one run (router, four design substages, plan, code, qe, and the cost
|
|
720
|
+
* ledger). MEASURED: `.fa-state/checkpoints.jsonl` was never created, while every stage had in fact
|
|
721
|
+
* run and left its artifact on disk. So resume was silently dead and the run still reported success.
|
|
722
|
+
*
|
|
723
|
+
* The classifier's premise was wrong for those writes, but its instinct was not: nothing in the old
|
|
724
|
+
* mechanism could tell a real completion from a fabricated one. A stage whose artifact does not exist
|
|
725
|
+
* could be recorded as complete, and yesterday's cross-family reviewer flagged exactly that for the
|
|
726
|
+
* `fleet` stage. So the fix is not a better-worded prompt — it is to stop hand-writing state at all.
|
|
727
|
+
* The subagent now RUNS A COMMAND; this function is the check that command performs first.
|
|
728
|
+
*
|
|
729
|
+
* @param artifacts repo-relative paths the stage must have produced. EMPTY IS REFUSED: a stage that
|
|
730
|
+
* claims nothing verifiable has nothing to witness, and recording it would restore the very
|
|
731
|
+
* hole this replaces.
|
|
732
|
+
* @param present the subset of `artifacts` the caller MEASURED on disk (never what it planned).
|
|
733
|
+
*/
|
|
734
|
+
export function decideCheckpointWrite(opts: {
|
|
735
|
+
stage: string;
|
|
736
|
+
inputHash: string;
|
|
737
|
+
result: unknown;
|
|
738
|
+
artifacts: readonly string[];
|
|
739
|
+
present: readonly string[];
|
|
740
|
+
}): CheckpointWriteVerdict {
|
|
741
|
+
const stage = String(opts.stage ?? '').trim();
|
|
742
|
+
if (stage === '') return { ok: false, reason: 'stage is empty' };
|
|
743
|
+
if (String(opts.inputHash ?? '').trim() === '') return { ok: false, reason: 'inputHash is empty' };
|
|
744
|
+
// A null result is what a DEAD stage returns. Recording it would mark a failure as a success.
|
|
745
|
+
if (opts.result === null || opts.result === undefined) {
|
|
746
|
+
return { ok: false, reason: `stage ${stage} produced no result — a dead stage is never recorded` };
|
|
747
|
+
}
|
|
748
|
+
if (opts.artifacts.length === 0) {
|
|
749
|
+
return { ok: false, reason: `stage ${stage} declared no artifact to witness` };
|
|
750
|
+
}
|
|
751
|
+
const presentSet = new Set(opts.present.map((p) => String(p)));
|
|
752
|
+
const missing = opts.artifacts.filter((a) => !presentSet.has(String(a)));
|
|
753
|
+
if (missing.length > 0) {
|
|
754
|
+
return { ok: false, reason: `stage ${stage} is missing its artifact(s): ${missing.join(', ')}` };
|
|
755
|
+
}
|
|
756
|
+
const line = serializeCheckpoint(stage, opts.inputHash, opts.result);
|
|
757
|
+
if (line === null) {
|
|
758
|
+
return { ok: false, reason: `stage ${stage} result is not serialisable within the size cap` };
|
|
759
|
+
}
|
|
760
|
+
return { ok: true, line, witnessed: [...opts.artifacts] };
|
|
761
|
+
}
|