@dzhechkov/harness-core 0.7.7 → 0.7.9

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 (42) hide show
  1. package/.dz-manifest.json +86 -26
  2. package/README.md +42 -3
  3. package/dist/checkpoint-stamp.d.ts +31 -0
  4. package/dist/checkpoint-stamp.d.ts.map +1 -0
  5. package/dist/checkpoint-stamp.js +54 -0
  6. package/dist/checkpoint-stamp.js.map +1 -0
  7. package/dist/feature-adr-checkpoints.d.ts +20 -0
  8. package/dist/feature-adr-checkpoints.d.ts.map +1 -1
  9. package/dist/feature-adr-checkpoints.js.map +1 -1
  10. package/dist/index.d.ts +6 -1
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +4 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/ledger-backfill.d.ts +114 -0
  15. package/dist/ledger-backfill.d.ts.map +1 -0
  16. package/dist/ledger-backfill.js +183 -0
  17. package/dist/ledger-backfill.js.map +1 -0
  18. package/dist/operations.d.ts.map +1 -1
  19. package/dist/operations.js +40 -0
  20. package/dist/operations.js.map +1 -1
  21. package/dist/publish.d.ts +16 -0
  22. package/dist/publish.d.ts.map +1 -1
  23. package/dist/publish.js +24 -1
  24. package/dist/publish.js.map +1 -1
  25. package/dist/score.d.ts +29 -0
  26. package/dist/score.d.ts.map +1 -1
  27. package/dist/score.js +108 -0
  28. package/dist/score.js.map +1 -1
  29. package/dist/telemetry-vocabulary.d.ts +87 -0
  30. package/dist/telemetry-vocabulary.d.ts.map +1 -0
  31. package/dist/telemetry-vocabulary.js +109 -0
  32. package/dist/telemetry-vocabulary.js.map +1 -0
  33. package/package.json +7 -7
  34. package/sbom.json +175 -25
  35. package/src/checkpoint-stamp.ts +50 -0
  36. package/src/feature-adr-checkpoints.ts +20 -0
  37. package/src/index.ts +6 -1
  38. package/src/ledger-backfill.ts +237 -0
  39. package/src/operations.ts +36 -0
  40. package/src/publish.ts +25 -1
  41. package/src/score.ts +96 -0
  42. package/src/telemetry-vocabulary.ts +138 -0
package/sbom.json CHANGED
@@ -25,7 +25,7 @@
25
25
  "hashes": [
26
26
  {
27
27
  "alg": "SHA-256",
28
- "content": "196e14163a267a84083c01a9c4c7d6a26b49adcf4287ade505600848baa02161"
28
+ "content": "bc991bf4772dee2935710f224e7f0de9c5db84be93da7acef003b82a4fc90cba"
29
29
  }
30
30
  ]
31
31
  },
@@ -669,6 +669,46 @@
669
669
  }
670
670
  ]
671
671
  },
672
+ {
673
+ "type": "file",
674
+ "name": "dist/checkpoint-stamp.d.ts",
675
+ "hashes": [
676
+ {
677
+ "alg": "SHA-256",
678
+ "content": "bcd22740dabf30df0b71f2164dd13c9c7fe619746a852929c7e8bd4edd049556"
679
+ }
680
+ ]
681
+ },
682
+ {
683
+ "type": "file",
684
+ "name": "dist/checkpoint-stamp.d.ts.map",
685
+ "hashes": [
686
+ {
687
+ "alg": "SHA-256",
688
+ "content": "ff59e5bc4e293a465dae508d6c50fead4d9925b890f33a737b8716ae0529287f"
689
+ }
690
+ ]
691
+ },
692
+ {
693
+ "type": "file",
694
+ "name": "dist/checkpoint-stamp.js",
695
+ "hashes": [
696
+ {
697
+ "alg": "SHA-256",
698
+ "content": "925ab26d210efe89d02924e979b6cb1598a3289af4c94c87734af04e7b992620"
699
+ }
700
+ ]
701
+ },
702
+ {
703
+ "type": "file",
704
+ "name": "dist/checkpoint-stamp.js.map",
705
+ "hashes": [
706
+ {
707
+ "alg": "SHA-256",
708
+ "content": "aa2887d4e9129aa14cb8b6dbd138307c1a9f06860cfe80cb985176b17db399e3"
709
+ }
710
+ ]
711
+ },
672
712
  {
673
713
  "type": "file",
674
714
  "name": "dist/claim-check-hook-policy.d.ts",
@@ -1355,7 +1395,7 @@
1355
1395
  "hashes": [
1356
1396
  {
1357
1397
  "alg": "SHA-256",
1358
- "content": "13d7d90d33f6c30498b397f34c32d095bdc91e407901a51a9ccdf40a56c60124"
1398
+ "content": "ba30eb15d8b125a3fbf71897fc848807b4636f676b2bc5c0cfb14c71d4667fa0"
1359
1399
  }
1360
1400
  ]
1361
1401
  },
@@ -1365,7 +1405,7 @@
1365
1405
  "hashes": [
1366
1406
  {
1367
1407
  "alg": "SHA-256",
1368
- "content": "bd89f5965d7437b4cef069a9a34cec1ab9f6cee40acde29cdba3fd4a18f27422"
1408
+ "content": "c1ee8730f59317e337b65fb200e2c2d6a817f87014ce84f192702aed9e38d14f"
1369
1409
  }
1370
1410
  ]
1371
1411
  },
@@ -1385,7 +1425,7 @@
1385
1425
  "hashes": [
1386
1426
  {
1387
1427
  "alg": "SHA-256",
1388
- "content": "bdeac6f879ab1695a11bb2323dc03ba4fa25dd7bd6da19e47208a69df33576f5"
1428
+ "content": "739d561a337682247f3341878b2c65254a2cf90db38513a73535a6f1dd7f0752"
1389
1429
  }
1390
1430
  ]
1391
1431
  },
@@ -1635,7 +1675,7 @@
1635
1675
  "hashes": [
1636
1676
  {
1637
1677
  "alg": "SHA-256",
1638
- "content": "4eadcf12e18ccfbe77f857d71e52b29d51b35ee8bb9bbdf3a34cfb6724826c10"
1678
+ "content": "90f57cae51a79c8d102b2230d7a94544abda217cb84f0c1fc5ec7d0a8334964c"
1639
1679
  }
1640
1680
  ]
1641
1681
  },
@@ -1645,7 +1685,7 @@
1645
1685
  "hashes": [
1646
1686
  {
1647
1687
  "alg": "SHA-256",
1648
- "content": "de6cd5f7de860105804f100e487b65a78f2edd67a40645a710ad81c12e1c5b72"
1688
+ "content": "4f4c8fd219c3027ba1d79d99b8329425026e70f65920a94f743a73bcb39ac647"
1649
1689
  }
1650
1690
  ]
1651
1691
  },
@@ -1655,7 +1695,7 @@
1655
1695
  "hashes": [
1656
1696
  {
1657
1697
  "alg": "SHA-256",
1658
- "content": "bdb6933fa24b0e02ed293fe4e9c52910e2ed4f5652ea7bcb0dbbb7dc996cc224"
1698
+ "content": "a4f52c56700d821995c7c15af20c9cf8ad8ed2682a37de41f2b03d7202022c02"
1659
1699
  }
1660
1700
  ]
1661
1701
  },
@@ -1665,7 +1705,7 @@
1665
1705
  "hashes": [
1666
1706
  {
1667
1707
  "alg": "SHA-256",
1668
- "content": "b47db4310de5fd7a586e795e10abe108e18cd164d1cb1862e67c227310a68001"
1708
+ "content": "d3a50f4906f913b3419d24d710ec2b27838ffce89f224bf53d6447572bdcd7bc"
1669
1709
  }
1670
1710
  ]
1671
1711
  },
@@ -1709,6 +1749,46 @@
1709
1749
  }
1710
1750
  ]
1711
1751
  },
1752
+ {
1753
+ "type": "file",
1754
+ "name": "dist/ledger-backfill.d.ts",
1755
+ "hashes": [
1756
+ {
1757
+ "alg": "SHA-256",
1758
+ "content": "ef962a467ec121fa41ed346fe1ac619333f7e76c209173a7d4d5897ef9d6d5c7"
1759
+ }
1760
+ ]
1761
+ },
1762
+ {
1763
+ "type": "file",
1764
+ "name": "dist/ledger-backfill.d.ts.map",
1765
+ "hashes": [
1766
+ {
1767
+ "alg": "SHA-256",
1768
+ "content": "776d033d3aeffeb40af85cf2dd318ddff35bf08c8867cd56502f3240e841deb3"
1769
+ }
1770
+ ]
1771
+ },
1772
+ {
1773
+ "type": "file",
1774
+ "name": "dist/ledger-backfill.js",
1775
+ "hashes": [
1776
+ {
1777
+ "alg": "SHA-256",
1778
+ "content": "d8849acd78274c7f5ac82fda839899b1df107eab5cb4d58086d3b89a38fb30af"
1779
+ }
1780
+ ]
1781
+ },
1782
+ {
1783
+ "type": "file",
1784
+ "name": "dist/ledger-backfill.js.map",
1785
+ "hashes": [
1786
+ {
1787
+ "alg": "SHA-256",
1788
+ "content": "f3d4b2dfaef7cf56542d489bc57a6dcbca97f20181bc1fd2d293341be5dd3706"
1789
+ }
1790
+ ]
1791
+ },
1712
1792
  {
1713
1793
  "type": "file",
1714
1794
  "name": "dist/loop-blobs.generated.d.ts",
@@ -2285,7 +2365,7 @@
2285
2365
  "hashes": [
2286
2366
  {
2287
2367
  "alg": "SHA-256",
2288
- "content": "dfb99e5055b94eb46783f352095d00cfe096d657fd0d2697fa24f64078d3a681"
2368
+ "content": "d1c3b12bfae90c560ccd3a20a988e219d215da92122da4729a1a549f32894656"
2289
2369
  }
2290
2370
  ]
2291
2371
  },
@@ -2295,7 +2375,7 @@
2295
2375
  "hashes": [
2296
2376
  {
2297
2377
  "alg": "SHA-256",
2298
- "content": "f865c6cacc965fbb445c4a8ccbcfd99420ffe7a6256cda79139d73cc24c33797"
2378
+ "content": "e48fe1595148cc7b8859d8d89eef7c444c5d9c3025a3addfaa669d6762789c3f"
2299
2379
  }
2300
2380
  ]
2301
2381
  },
@@ -2305,7 +2385,7 @@
2305
2385
  "hashes": [
2306
2386
  {
2307
2387
  "alg": "SHA-256",
2308
- "content": "3f1675b4e6a5c73197d330f1415c5a0baa352f7e9ce179a7c49a6630848c9e06"
2388
+ "content": "cea487680c0fdfa429a06815ef5362f9c635bc3e9d3592efc8d7db526f3d21d4"
2309
2389
  }
2310
2390
  ]
2311
2391
  },
@@ -2635,7 +2715,7 @@
2635
2715
  "hashes": [
2636
2716
  {
2637
2717
  "alg": "SHA-256",
2638
- "content": "b67799a78a9b7298b1085b46f3c020a3ae8580ac3732c450c2e37f634c4d5cda"
2718
+ "content": "ea13f5ecd61f3ae84e01c62c5881a026e1e3893b58bc2593e07d785fd5701320"
2639
2719
  }
2640
2720
  ]
2641
2721
  },
@@ -2645,7 +2725,7 @@
2645
2725
  "hashes": [
2646
2726
  {
2647
2727
  "alg": "SHA-256",
2648
- "content": "c90dcb2cb719184a02fb5aa9973e78b7648756c337598801c3c5ea826accfe4e"
2728
+ "content": "b5d136be2a037a66f506e79108002d0b4eef05bbe2daa17ddca06a3bf9dae163"
2649
2729
  }
2650
2730
  ]
2651
2731
  },
@@ -2655,7 +2735,7 @@
2655
2735
  "hashes": [
2656
2736
  {
2657
2737
  "alg": "SHA-256",
2658
- "content": "a07e19838a997ef6ad929a684b035aba564c5554e2b3a1b99f761d54b3f6033f"
2738
+ "content": "9b6b69db28b41bd13c48f604504836bab00970e6ccdd5bf06309d4e8c0f540d8"
2659
2739
  }
2660
2740
  ]
2661
2741
  },
@@ -2665,7 +2745,7 @@
2665
2745
  "hashes": [
2666
2746
  {
2667
2747
  "alg": "SHA-256",
2668
- "content": "7065aeeff6219fac4eab92f09e38fd263392bd288d5602f5e630b110ab2c18b0"
2748
+ "content": "bc3c91b1a58c4f35148e98c86514b3a1bd0f4d43de24c3531b69feceb9a389fd"
2669
2749
  }
2670
2750
  ]
2671
2751
  },
@@ -3355,7 +3435,7 @@
3355
3435
  "hashes": [
3356
3436
  {
3357
3437
  "alg": "SHA-256",
3358
- "content": "337431dbd1999ee5ed97b00080c9044179998b4956381478331eda763cde23da"
3438
+ "content": "0558d5a3ea988184f08459a3ed0c6e138541b86cb78cbca378a6ceef797f3c1f"
3359
3439
  }
3360
3440
  ]
3361
3441
  },
@@ -3365,7 +3445,7 @@
3365
3445
  "hashes": [
3366
3446
  {
3367
3447
  "alg": "SHA-256",
3368
- "content": "b259da2b621ff859700c5f1ca8084292f4a300261e3c4c9dc2e38f77fab3c137"
3448
+ "content": "4775208c01c974b495c6001974902447bf3375ed675e4822dc8c1d5022b2e665"
3369
3449
  }
3370
3450
  ]
3371
3451
  },
@@ -3375,7 +3455,7 @@
3375
3455
  "hashes": [
3376
3456
  {
3377
3457
  "alg": "SHA-256",
3378
- "content": "ba4545d48692e799ad86f20839c0e225f38ddb9ea4be95134d7e0accecfb1cef"
3458
+ "content": "ce87f3d528feaeb2f5c9d1c0287065078b388fd2b061a3412a49a836938ca7a8"
3379
3459
  }
3380
3460
  ]
3381
3461
  },
@@ -3385,7 +3465,7 @@
3385
3465
  "hashes": [
3386
3466
  {
3387
3467
  "alg": "SHA-256",
3388
- "content": "24b30e4cfe58695e57ae07643cfd49352687ae10916713452a5a1c42f8fbdbf0"
3468
+ "content": "7bcbb79b446908423948e131d1abfc3b01f6caf1ddcadeeffe083614bf119bbf"
3389
3469
  }
3390
3470
  ]
3391
3471
  },
@@ -3909,6 +3989,46 @@
3909
3989
  }
3910
3990
  ]
3911
3991
  },
3992
+ {
3993
+ "type": "file",
3994
+ "name": "dist/telemetry-vocabulary.d.ts",
3995
+ "hashes": [
3996
+ {
3997
+ "alg": "SHA-256",
3998
+ "content": "034f40510ecaa9ae9d867f482c87dbf3a1f771bc9b7ec67ff181fa4f9acf6499"
3999
+ }
4000
+ ]
4001
+ },
4002
+ {
4003
+ "type": "file",
4004
+ "name": "dist/telemetry-vocabulary.d.ts.map",
4005
+ "hashes": [
4006
+ {
4007
+ "alg": "SHA-256",
4008
+ "content": "9431269b10db42cba8796139d104a61182b08f080c7497b84542e7649c9947b5"
4009
+ }
4010
+ ]
4011
+ },
4012
+ {
4013
+ "type": "file",
4014
+ "name": "dist/telemetry-vocabulary.js",
4015
+ "hashes": [
4016
+ {
4017
+ "alg": "SHA-256",
4018
+ "content": "9cedc164e6d9b68583912a738c70b712763241c6b2d91a9e904505ebd31118e1"
4019
+ }
4020
+ ]
4021
+ },
4022
+ {
4023
+ "type": "file",
4024
+ "name": "dist/telemetry-vocabulary.js.map",
4025
+ "hashes": [
4026
+ {
4027
+ "alg": "SHA-256",
4028
+ "content": "a35a1fc29fc679ed9f27e43482a041a9d32f61289924f6e7599765043be8ec45"
4029
+ }
4030
+ ]
4031
+ },
3912
4032
  {
3913
4033
  "type": "file",
3914
4034
  "name": "dist/tg-post.d.ts",
@@ -4315,7 +4435,7 @@
4315
4435
  "hashes": [
4316
4436
  {
4317
4437
  "alg": "SHA-256",
4318
- "content": "a75aa6acab6e787f214313004d83fcde7a3332e9828b61bf383fdc5e58a98186"
4438
+ "content": "fefcdc0b5606d8c9ccd189e128bce94bf08bab1e943379c964e626e537396dee"
4319
4439
  }
4320
4440
  ]
4321
4441
  },
@@ -4479,6 +4599,16 @@
4479
4599
  }
4480
4600
  ]
4481
4601
  },
4602
+ {
4603
+ "type": "file",
4604
+ "name": "src/checkpoint-stamp.ts",
4605
+ "hashes": [
4606
+ {
4607
+ "alg": "SHA-256",
4608
+ "content": "35fdc7c788149c846114641b8dca2594a800e8210062478de04f42d0a11cc076"
4609
+ }
4610
+ ]
4611
+ },
4482
4612
  {
4483
4613
  "type": "file",
4484
4614
  "name": "src/claim-check-hook-policy.ts",
@@ -4655,7 +4785,7 @@
4655
4785
  "hashes": [
4656
4786
  {
4657
4787
  "alg": "SHA-256",
4658
- "content": "92b50c6987a9dc04a7a81608df6f819ee759c86d68498adf7b51ff7459c77d5f"
4788
+ "content": "1b857c02834026d729b35a2df5998bc8a8e42dc124c6f6f07dad3b5a08d2e6f2"
4659
4789
  }
4660
4790
  ]
4661
4791
  },
@@ -4725,7 +4855,7 @@
4725
4855
  "hashes": [
4726
4856
  {
4727
4857
  "alg": "SHA-256",
4728
- "content": "18a9f1e7f84b56f0c7aa23b096a15c414418ecdd4fafc2f29d38d6dcbf761c84"
4858
+ "content": "6c99d27272bf6dd1acf3bdb32f01fc9dff13b25ea9e1f89eb49a7692ac1d4b50"
4729
4859
  }
4730
4860
  ]
4731
4861
  },
@@ -4739,6 +4869,16 @@
4739
4869
  }
4740
4870
  ]
4741
4871
  },
4872
+ {
4873
+ "type": "file",
4874
+ "name": "src/ledger-backfill.ts",
4875
+ "hashes": [
4876
+ {
4877
+ "alg": "SHA-256",
4878
+ "content": "5659ef646baec7a952a4c7bf9eddc1cde24205ae8eb39f43999c5656ace42224"
4879
+ }
4880
+ ]
4881
+ },
4742
4882
  {
4743
4883
  "type": "file",
4744
4884
  "name": "src/loop-blobs.generated.ts",
@@ -4885,7 +5025,7 @@
4885
5025
  "hashes": [
4886
5026
  {
4887
5027
  "alg": "SHA-256",
4888
- "content": "45875b1296fe035953aded1adba53cbc829f02d632a6c301640e4fedf0e08d38"
5028
+ "content": "3b61b04d7fbcf6186695ea9afc8750d4d3c7dd633285a53b972e6544579a5c7b"
4889
5029
  }
4890
5030
  ]
4891
5031
  },
@@ -4975,7 +5115,7 @@
4975
5115
  "hashes": [
4976
5116
  {
4977
5117
  "alg": "SHA-256",
4978
- "content": "a23d5cb5bf77cc9479e2f00d59afe0f9c5bf56e04129116c171108c8af992182"
5118
+ "content": "740196d64cc54b282a4c745864b7b1f1ce3e0375bfff5644c14b65bd7e0f92b6"
4979
5119
  }
4980
5120
  ]
4981
5121
  },
@@ -5135,7 +5275,7 @@
5135
5275
  "hashes": [
5136
5276
  {
5137
5277
  "alg": "SHA-256",
5138
- "content": "6a0522654d31a6e1e395d95450a7529c4bc64fd61a6a1c9d7a5f132aa2fb618d"
5278
+ "content": "31c96e4bae47eedea0ef30b4a79997ef05e950dc8c61a3fd9b4c41070bb72ada"
5139
5279
  }
5140
5280
  ]
5141
5281
  },
@@ -5279,6 +5419,16 @@
5279
5419
  }
5280
5420
  ]
5281
5421
  },
5422
+ {
5423
+ "type": "file",
5424
+ "name": "src/telemetry-vocabulary.ts",
5425
+ "hashes": [
5426
+ {
5427
+ "alg": "SHA-256",
5428
+ "content": "8d6c4da15bb76eca46bff58a0519e4fc0f0b835e5a2b20fa701425ae8d518f10"
5429
+ }
5430
+ ]
5431
+ },
5282
5432
  {
5283
5433
  "type": "file",
5284
5434
  "name": "src/tg-post.ts",
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Stamp a checkpoint line with the instant it was WRITTEN.
3
+ *
4
+ * Deliberately NOT part of `feature-adr-checkpoints.ts`. That module's functions are mirrored
5
+ * verbatim into the sandboxed workflow through the loop-blob registry, and the sandbox has no
6
+ * `Date` — so a clock has no business inside a function the clockless copy also runs. Changing the
7
+ * mirrored serializer would also drag the whole blob regeneration + region re-render behind a
8
+ * one-field addition, which is a large machine for a small honest fact.
9
+ *
10
+ * The stamp belongs to the WRITER. Only the CLI performing the append has a clock, so only the CLI
11
+ * stamps, here, at the boundary.
12
+ *
13
+ * WHY IT EXISTS (MEASURED 2026-08-25): `.fa-state/checkpoints.jsonl` carried no time field of any
14
+ * kind, so across 241 feature dirs "how long did this stage take" had no answer for a single run —
15
+ * and no future run could answer it either.
16
+ *
17
+ * @packageDocumentation
18
+ */
19
+
20
+ /** An ISO-8601 UTC instant exactly as `Date#toISOString` emits it. Anything else we did not write. */
21
+ const ISO_INSTANT = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/;
22
+
23
+ /**
24
+ * Return `line` with a `ts` field, or `line` UNCHANGED when the stamp is absent or malformed.
25
+ *
26
+ * Three properties, each a test:
27
+ * - an ABSENT stamp leaves the record with no `ts` — unknown, never zero and never "now". Inventing
28
+ * one would make every pre-existing record indistinguishable from a measured one.
29
+ * - a MALFORMED stamp is dropped. A wrong instant is worse than an absent one: only the absent one
30
+ * is readable as unmeasured.
31
+ * - an EXISTING `ts` is never overwritten, and a line that is not a JSON object is passed through
32
+ * untouched — this runs on the way to an append-only log.
33
+ */
34
+ export function stampCheckpointLine(line: string, ts: string): string {
35
+ if (!ISO_INSTANT.test(ts)) return line;
36
+ let parsed: unknown;
37
+ try {
38
+ parsed = JSON.parse(line);
39
+ } catch {
40
+ return line;
41
+ }
42
+ if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return line;
43
+ const row = parsed as Record<string, unknown>;
44
+ if (typeof row['ts'] === 'string') return line;
45
+ try {
46
+ return JSON.stringify({ ...row, ts });
47
+ } catch {
48
+ return line;
49
+ }
50
+ }
@@ -56,6 +56,26 @@ export interface CheckpointEntry {
56
56
  stage: string;
57
57
  inputHash: string;
58
58
  result: unknown;
59
+ /**
60
+ * ISO-8601 UTC instant the checkpoint was WRITTEN, supplied by the writer.
61
+ *
62
+ * OPTIONAL by necessity and by design. The sandboxed workflow has no `Date` at all, so it cannot
63
+ * stamp its own records — only the CLI that performs the append can, and only for the write, not
64
+ * for the stage's start. Absent `ts` therefore means UNKNOWN, never zero and never "instant": a
65
+ * pre-2026-08-25 record simply predates the field, and a reader must say so rather than compute a
66
+ * duration from a missing number.
67
+ *
68
+ * Why this exists at all: until it was added, `.fa-state/checkpoints.jsonl` carried no time field
69
+ * of any kind, so across 241 feature dirs the question "how long did this stage take" had no
70
+ * answer for a single run — and no FUTURE run could answer it either. This is the whole of the
71
+ * fix: one optional field, and every run from now on can be placed on a timeline.
72
+ *
73
+ * Deliberately NOT accompanied by a {@link CKPT_SCHEMA_VERSION} bump. The version is SALTED into
74
+ * every input hash, so bumping it would hash every in-flight checkpoint stale and force each
75
+ * feature to re-run router+design+plan. Stage semantics did not change; an additive optional field
76
+ * that old readers ignore and new readers treat as unknown is not a format break.
77
+ */
78
+ ts?: string;
59
79
  }
60
80
 
61
81
  /** Oversize guard: a result JSON above this is NOT checkpointed (the stage simply re-runs on resume).
package/src/index.ts CHANGED
@@ -77,6 +77,11 @@ export { checkUpstream, checkAllUpstream, discoverSourcePackages, loadSourcesMan
77
77
  export type { SyncUpstreamReport, UpstreamCheckResult, SourcesManifest, SourcePackageInfo } from './sync-upstream.js';
78
78
  export { sweepSkillDrift, syncCanonicalSkill } from './skill-drift.js';
79
79
  export { SKILL_INSTALL_ROOTS, SKILL_INSTALL_ROOT_BY_TARGET, DEV_SKILL_ROOT, TARGET_ENRICHMENT_ASSETS } from './skill-install-roots.js';
80
+ export { stampCheckpointLine } from './checkpoint-stamp.js';
81
+ export { TELEMETRY_VOCAB_VERSION, TELEMETRY_FIELDS, PROVISIONAL_TELEMETRY_FIELDS, LOCAL_FIELD_ALIASES, telemetryFieldFor } from './telemetry-vocabulary.js';
82
+ export type { TelemetryField, FieldSource } from './telemetry-vocabulary.js';
83
+ export { planLedgerBackfill, LEDGER_FILL_SOURCE, AMBIGUOUS, resolveLedgerRunId } from './ledger-backfill.js';
84
+ export type { LedgerBackfillPlan, LedgerBackfillRow, RunCostFacts } from './ledger-backfill.js';
80
85
  export type { SweepResult, DriftedSkill, SyncResult, SyncCanonicalOptions } from './skill-drift.js';
81
86
  export { benchmarkSkill, benchmarkSkills, compareSkills } from './benchmark.js';
82
87
  export { buildRegistry, searchRegistry, filterByCategory, skillPackBaseDirs, discoverSkillPackDirs, discoverVerifiablePackDirs } from './registry.js';
@@ -463,7 +468,7 @@ export type {
463
468
  ChainDefectAge,
464
469
  ChainDefectAges,
465
470
  } from './event-chain.js';
466
- export { decideProvenance, environmentCanMintProvenance, publishArgv, discoverPackages, publishPackages, bumpPatch, compareVersions, findUnpackagedSkills, findUnpublishedWorkspaceFloors, orderByDependencies, syncReadmeVersion } from './publish.js';
471
+ export { decideProvenance, environmentCanMintProvenance, publishArgv, discoverPackages, publishPackages, bumpPatch, compareVersions, findUnpackagedSkills, findUnpublishedWorkspaceFloors, orderByDependencies, syncReadmeVersion, isChangelogEntryLine } from './publish.js';
467
472
  export { fetchAllDownloads } from './downloads.js';
468
473
  export type { PackageDownloads, DownloadsReport } from './downloads.js';
469
474
  export { discoverInstalled, checkUpgrades } from './upgrade.js';