@dzhechkov/harness-core 0.8.2 → 0.8.5

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 (45) hide show
  1. package/.dz-manifest.json +110 -22
  2. package/README.md +66 -1
  3. package/dist/cmd-usage.d.ts +148 -0
  4. package/dist/cmd-usage.d.ts.map +1 -0
  5. package/dist/cmd-usage.js +548 -0
  6. package/dist/cmd-usage.js.map +1 -0
  7. package/dist/compounding.d.ts +4 -0
  8. package/dist/compounding.d.ts.map +1 -1
  9. package/dist/compounding.js +6 -0
  10. package/dist/compounding.js.map +1 -1
  11. package/dist/contract-checklist.d.ts +123 -0
  12. package/dist/contract-checklist.d.ts.map +1 -0
  13. package/dist/contract-checklist.js +700 -0
  14. package/dist/contract-checklist.js.map +1 -0
  15. package/dist/feature-adr-routing.d.ts +2 -2
  16. package/dist/feature-adr-routing.d.ts.map +1 -1
  17. package/dist/feature-adr-routing.js +21 -1
  18. package/dist/feature-adr-routing.js.map +1 -1
  19. package/dist/index.d.ts +7 -0
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/index.js +7 -0
  22. package/dist/index.js.map +1 -1
  23. package/dist/qe-bridge.d.ts.map +1 -1
  24. package/dist/qe-bridge.js +9 -0
  25. package/dist/qe-bridge.js.map +1 -1
  26. package/dist/restart-advisor.d.ts +103 -0
  27. package/dist/restart-advisor.d.ts.map +1 -0
  28. package/dist/restart-advisor.js +445 -0
  29. package/dist/restart-advisor.js.map +1 -0
  30. package/dist/slop-lint.d.ts +128 -0
  31. package/dist/slop-lint.d.ts.map +1 -0
  32. package/dist/slop-lint.js +607 -0
  33. package/dist/slop-lint.js.map +1 -0
  34. package/package.json +14 -13
  35. package/sbom.json +241 -21
  36. package/src/cmd-usage.ts +720 -0
  37. package/src/compounding.ts +13 -0
  38. package/src/contract-checklist.ts +973 -0
  39. package/src/deadwood-allowlist.json +80 -0
  40. package/src/feature-adr-routing.ts +21 -1
  41. package/src/index.ts +79 -0
  42. package/src/qe-bridge.ts +9 -0
  43. package/src/restart-advisor.ts +579 -0
  44. package/src/slop-lint.ts +762 -0
  45. package/src/slop-markers.json +71 -0
package/.dz-manifest.json CHANGED
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "path": "README.md",
12
- "sha256": "f2c5e30f529842d9e21b4287787c9290aa53c5163ad7586d406cbda256cceffa"
12
+ "sha256": "b5e8b564fd67fe51018b91957db1f4145f6399d396a0c7af36a423560e2156a2"
13
13
  },
14
14
  {
15
15
  "path": "dist/__tests__/golden-baseline.test.d.ts",
@@ -331,6 +331,22 @@
331
331
  "path": "dist/cli-flag-notice.js.map",
332
332
  "sha256": "6f55153a39da8bb9ceb87dff9e47e279f7ce316083454e9b8675685dcc4f959a"
333
333
  },
334
+ {
335
+ "path": "dist/cmd-usage.d.ts",
336
+ "sha256": "e3e0fb1463b65d718f0d34e37de1a0769bbe60ad1a0807a5d339cc713b241a2d"
337
+ },
338
+ {
339
+ "path": "dist/cmd-usage.d.ts.map",
340
+ "sha256": "c6a36a379484001317dbcea5ffbc5a64b0f37488d36ee4a860eea13e1cb76a45"
341
+ },
342
+ {
343
+ "path": "dist/cmd-usage.js",
344
+ "sha256": "6c6f240b378cd87109ef22df7725fa0327d6838479a1693cf74baffe1dec3623"
345
+ },
346
+ {
347
+ "path": "dist/cmd-usage.js.map",
348
+ "sha256": "a7f40794aa14ca45c7b809b1e57f6ddc3c0153c0f664334a410182e1758535e6"
349
+ },
334
350
  {
335
351
  "path": "dist/codex-hooks-assets.d.ts",
336
352
  "sha256": "dd1cb9cce42a0ca37a3e64eeac19c98f18f225932ffea282b33fdfd699446191"
@@ -381,19 +397,35 @@
381
397
  },
382
398
  {
383
399
  "path": "dist/compounding.d.ts",
384
- "sha256": "26f6cf197298e8ccf61d72bb26d6f5e88a3d58af3ff0b3351f44755c5acff1da"
400
+ "sha256": "b412bf4dcc70afb9a06d835c98bbb5506ed5560481c38e4e12d37925216ace86"
385
401
  },
386
402
  {
387
403
  "path": "dist/compounding.d.ts.map",
388
- "sha256": "571ea5e0ebb71a5325da6171b09affeb6ba3d4b759d0eb4cc8d3af57dd369104"
404
+ "sha256": "f2a660b717c491c718eae425fa950ffb1b315b5c0934a9cecc7137d82e9c5625"
389
405
  },
390
406
  {
391
407
  "path": "dist/compounding.js",
392
- "sha256": "83db18eb05a6400809b7c1624e3df24f40f1050b39f022d87448d8017399e4e0"
408
+ "sha256": "74e42a9fac17a8a8941d398de696fec6630a81cb5c5db9be10c431646f4f07ef"
393
409
  },
394
410
  {
395
411
  "path": "dist/compounding.js.map",
396
- "sha256": "f353339d08c311fb69d44960e97bcc9ddfc01d7bdb8c3ae26e9884a494c0338f"
412
+ "sha256": "7a075042f2c92eef663b35bd0fcc05e0a2ceee8610633c0d78c1a65d5c32a745"
413
+ },
414
+ {
415
+ "path": "dist/contract-checklist.d.ts",
416
+ "sha256": "bf101a58875316681241b76308383ec61ac0d2f60ce3256693a4cf20dacd6749"
417
+ },
418
+ {
419
+ "path": "dist/contract-checklist.d.ts.map",
420
+ "sha256": "fa5598db398ca655764fa07878fa093766211011574c77fd6890476b27a4f332"
421
+ },
422
+ {
423
+ "path": "dist/contract-checklist.js",
424
+ "sha256": "0943f9f0986ef240395c8d3679bb6d83e95a2259c49d4af3a85bc4a3dbcf3998"
425
+ },
426
+ {
427
+ "path": "dist/contract-checklist.js.map",
428
+ "sha256": "ae1d26c22ddd63c589349a371f371a63b4e83066b94a8a0e93f58b0d976a9f5b"
397
429
  },
398
430
  {
399
431
  "path": "dist/cost-ledger.d.ts",
@@ -589,19 +621,19 @@
589
621
  },
590
622
  {
591
623
  "path": "dist/feature-adr-routing.d.ts",
592
- "sha256": "a1af0f230be9ee3eaccdf24ada9364bc2169905b68efaec35cb6f6844284677c"
624
+ "sha256": "446b308f9811f92feedb519a48e35e7a096b94443c2fef9471ccfc44ef2c9a75"
593
625
  },
594
626
  {
595
627
  "path": "dist/feature-adr-routing.d.ts.map",
596
- "sha256": "0e74beee5ab13a4762e2219f8f77f65c2403636268682ba6828fd0bbc6fdef99"
628
+ "sha256": "904d3e0f33dac38b53c247eae03477f4f5be02c8076814b75ff8a51738febb72"
597
629
  },
598
630
  {
599
631
  "path": "dist/feature-adr-routing.js",
600
- "sha256": "a213058784464f7ba21be0178324d68fb417da00f3b416726f6acdf9de944b36"
632
+ "sha256": "6999f294aec398afe3f26db69e686f4219cb6cca7f330a70c254ea55a92058c8"
601
633
  },
602
634
  {
603
635
  "path": "dist/feature-adr-routing.js.map",
604
- "sha256": "2c1520e30dba9fad19981c7533edb57ef8be7f4dcf444463f4c00e33826b8663"
636
+ "sha256": "82141719b632a2b0476bc0ca3861d691176370ded64d43117ebe7616893b5acc"
605
637
  },
606
638
  {
607
639
  "path": "dist/feature-adr-setup.d.ts",
@@ -669,19 +701,19 @@
669
701
  },
670
702
  {
671
703
  "path": "dist/index.d.ts",
672
- "sha256": "d888730d400004a18af528bbe2802539e2b9e9c74383e928dfd6478d98d66e75"
704
+ "sha256": "fe3ab287d75a9eb941db110bd60fdec8c760f3089d58a367adc9a7e1861571b2"
673
705
  },
674
706
  {
675
707
  "path": "dist/index.d.ts.map",
676
- "sha256": "d54a95081a81d817f95baa7b0e608e21b7d758fa6328f2ac894c805d7e769e38"
708
+ "sha256": "f08708ffff3c3c548bd9bf2540895e37a4927047f496a0746584a15f8b66ea7e"
677
709
  },
678
710
  {
679
711
  "path": "dist/index.js",
680
- "sha256": "8035369f844e9b6634fd23151e8e97f06f6a2b0f10b51b7d2fcda6626950d8f2"
712
+ "sha256": "0b5a0b9fbb4b538ff7f1cd444749d9f1a5a8e0987d3f188c9a32306d17951380"
681
713
  },
682
714
  {
683
715
  "path": "dist/index.js.map",
684
- "sha256": "d7d306a43374b99065a88693c383f7e5777fafef88b7c8bd36bab7cfdc6fa954"
716
+ "sha256": "aa2abb54621e5eddf25755bdfcabaafee604a9709e0e82bf43d6b9ee06fb9ab2"
685
717
  },
686
718
  {
687
719
  "path": "dist/learning-backend.d.ts",
@@ -1201,15 +1233,15 @@
1201
1233
  },
1202
1234
  {
1203
1235
  "path": "dist/qe-bridge.d.ts.map",
1204
- "sha256": "0cf3af2eedb4922c9106fac1f2d09bb5127a46ba7232e5899ba6c29bf33659c2"
1236
+ "sha256": "0a32cc82bbc3b5df2576495e5d4823b32ddcc4375b9217d3c8a008cc68054997"
1205
1237
  },
1206
1238
  {
1207
1239
  "path": "dist/qe-bridge.js",
1208
- "sha256": "555ffe4f1f6c2c11aec4b3637d03468f8978b8574c7129af948e3c6177c57243"
1240
+ "sha256": "805dbe6e3d2e60b243b51b5f76c688707f1634625ab5326723f8e7e28b4f0246"
1209
1241
  },
1210
1242
  {
1211
1243
  "path": "dist/qe-bridge.js.map",
1212
- "sha256": "844373e7ce0a18945adff9521c101e76baa39d2082cfd6a2517844d72e6a5702"
1244
+ "sha256": "82b9a67c5432a3b2d029720a16c7336b1443ed8b7f00e7ce911fb4eb31e106e5"
1213
1245
  },
1214
1246
  {
1215
1247
  "path": "dist/qe-rounds.d.ts",
@@ -1387,6 +1419,22 @@
1387
1419
  "path": "dist/reqe.js.map",
1388
1420
  "sha256": "c28182b280cf2c016a2b1d2ef15a3a335ff25993220767ae9fc7c74af76ba022"
1389
1421
  },
1422
+ {
1423
+ "path": "dist/restart-advisor.d.ts",
1424
+ "sha256": "ffc0fc6bba01766fc2efb12877dad9074523bc9f49d3a4c1e8b06fee83be3371"
1425
+ },
1426
+ {
1427
+ "path": "dist/restart-advisor.d.ts.map",
1428
+ "sha256": "e5ad5c1c08775a1284cba310fb1aab81959cb0a333746c8108220258cf839d94"
1429
+ },
1430
+ {
1431
+ "path": "dist/restart-advisor.js",
1432
+ "sha256": "c3eb24a53d2064c623bed87145e5b30c720f79ef638516b570926189f97eb670"
1433
+ },
1434
+ {
1435
+ "path": "dist/restart-advisor.js.map",
1436
+ "sha256": "50e95f2a379d1212a628ee816ceeaaa6abfa069ed13f3d15166af5d1b7a7bb91"
1437
+ },
1390
1438
  {
1391
1439
  "path": "dist/retro.d.ts",
1392
1440
  "sha256": "2f76203c306a37f03e1398149d2c3b48e78c33e02d37e6666bc94d1b2db3eb1e"
@@ -1643,6 +1691,22 @@
1643
1691
  "path": "dist/skills.js.map",
1644
1692
  "sha256": "27188e499f4d04661dbb8ba6da4a8eb3d94fccd4171b3059c4e26334aae9f946"
1645
1693
  },
1694
+ {
1695
+ "path": "dist/slop-lint.d.ts",
1696
+ "sha256": "7318105a744791852f7451933d22a03238186992c5338982473210e14208c94a"
1697
+ },
1698
+ {
1699
+ "path": "dist/slop-lint.d.ts.map",
1700
+ "sha256": "992700e7c1f5e3041c92b36c35a50d40dfbfe32e381e7c0448195787d9294411"
1701
+ },
1702
+ {
1703
+ "path": "dist/slop-lint.js",
1704
+ "sha256": "57963eeb81cb13f1216cfdc6c17d9d495801736216aa6fcddb4e921999285f73"
1705
+ },
1706
+ {
1707
+ "path": "dist/slop-lint.js.map",
1708
+ "sha256": "cfbc962ed288943dd1f8f7c3aabe1f1c00abdec485e5f743047e30b452b87d1f"
1709
+ },
1646
1710
  {
1647
1711
  "path": "dist/statusline.d.ts",
1648
1712
  "sha256": "b55c3a156695c6c573f515eec6fd8c51ccecb360f6348188dae53fc467668fe1"
@@ -1933,7 +1997,7 @@
1933
1997
  },
1934
1998
  {
1935
1999
  "path": "package.json",
1936
- "sha256": "37716151597f357e24ec394b1fdeedd68c6348bf43f6e296115f8793c0fc5647"
2000
+ "sha256": "ed603e834bc9070b87afa6d2eaf75ef1024a0b1a8a4f897ead88b096c412ab92"
1937
2001
  },
1938
2002
  {
1939
2003
  "path": "src/__tests__/golden-baseline.test.ts",
@@ -2015,6 +2079,10 @@
2015
2079
  "path": "src/cli-flag-notice.ts",
2016
2080
  "sha256": "6fe214c17519ab8e334b59c865fd74fc8ea915fa492d81f5fca03375fb54adc6"
2017
2081
  },
2082
+ {
2083
+ "path": "src/cmd-usage.ts",
2084
+ "sha256": "199000257c58bc47799b31c31b1d203b43a97d5cb8a8a0484db25186390f02b0"
2085
+ },
2018
2086
  {
2019
2087
  "path": "src/codex-hooks-assets.ts",
2020
2088
  "sha256": "5d74d533435cdf7e6375c5888713044c00960681ff48e8a90af84b07e168876a"
@@ -2029,7 +2097,11 @@
2029
2097
  },
2030
2098
  {
2031
2099
  "path": "src/compounding.ts",
2032
- "sha256": "1b20b2b6ababea386d195ab3481a0af6582fda2757720732b5098e162964da32"
2100
+ "sha256": "d71dcd6fc9953179a327158a65bb562b01cfd823d6d9d2895978626226d01bb6"
2101
+ },
2102
+ {
2103
+ "path": "src/contract-checklist.ts",
2104
+ "sha256": "7e54a22c9c1a4dbc76bffc82ae58fd6a21510de689f139ac06a04038620e56ae"
2033
2105
  },
2034
2106
  {
2035
2107
  "path": "src/cost-ledger.ts",
@@ -2043,6 +2115,10 @@
2043
2115
  "path": "src/create-skill.ts",
2044
2116
  "sha256": "7c8c2015630b2265db694ff41561647c11b252f68c45ee16bed0a4d940ccaf8c"
2045
2117
  },
2118
+ {
2119
+ "path": "src/deadwood-allowlist.json",
2120
+ "sha256": "936a8529319df44976d6bb79681296f09d28f922446e3fba890532afeca5235a"
2121
+ },
2046
2122
  {
2047
2123
  "path": "src/delivery-check.ts",
2048
2124
  "sha256": "04db640b8c5d439f4392c9f8dd64fb3433f6f71d07a707cc9058f6baa6cf917c"
@@ -2081,7 +2157,7 @@
2081
2157
  },
2082
2158
  {
2083
2159
  "path": "src/feature-adr-routing.ts",
2084
- "sha256": "d7dcf5340f1a08744ccf362605d4ea6d019e911bc7b436cde236221adfb3ed35"
2160
+ "sha256": "66ce9df47b63e57171eff29de8b87f1042c7a4d0ea5e36da365848e6db56e40b"
2085
2161
  },
2086
2162
  {
2087
2163
  "path": "src/feature-adr-setup.ts",
@@ -2101,7 +2177,7 @@
2101
2177
  },
2102
2178
  {
2103
2179
  "path": "src/index.ts",
2104
- "sha256": "532d52e2b2afbdd462feff7f1d31b5b827e90457f4f394afa604ed6ff0671ff5"
2180
+ "sha256": "c26e1cfe56a2e2cb8d48478b7d337c76265ce877350c351b38f6d130aa0f379a"
2105
2181
  },
2106
2182
  {
2107
2183
  "path": "src/learning-backend.ts",
@@ -2233,7 +2309,7 @@
2233
2309
  },
2234
2310
  {
2235
2311
  "path": "src/qe-bridge.ts",
2236
- "sha256": "b8bbc5dfa625e1709abf6c2d5ca84ad4dff0b8b4f67a4f4ad0605170f5ac5f01"
2312
+ "sha256": "5d4329089e2ad573a65663bfde91e2d94194dfe04f1bf4f8e1d7ac8f90db0e05"
2237
2313
  },
2238
2314
  {
2239
2315
  "path": "src/qe-rounds.ts",
@@ -2279,6 +2355,10 @@
2279
2355
  "path": "src/reqe.ts",
2280
2356
  "sha256": "67988858ff527e5b465aa46b341aa710465e8cb0f72038be30f2419e0ff12cc3"
2281
2357
  },
2358
+ {
2359
+ "path": "src/restart-advisor.ts",
2360
+ "sha256": "ba13e85c465aada9ddded13bc679f3df30bdbe839d92e19b9f231eabbefecdf8"
2361
+ },
2282
2362
  {
2283
2363
  "path": "src/risk-scoring.ts",
2284
2364
  "sha256": "dcae3c879f114899b12ca57324e776e083f5753590763647690de1fdbd40198d"
@@ -2339,6 +2419,14 @@
2339
2419
  "path": "src/skills.ts",
2340
2420
  "sha256": "cb1fc2b2f904e6c40ef7ba481c4ca2e9072b31302015134f4e636f67323c89d8"
2341
2421
  },
2422
+ {
2423
+ "path": "src/slop-lint.ts",
2424
+ "sha256": "60e66ec6603997524b908833605d9f74bb3154552311e743e3a09b6f0364b3c7"
2425
+ },
2426
+ {
2427
+ "path": "src/slop-markers.json",
2428
+ "sha256": "0083b0f7ca65579b7b78289eb7066d818db37ee794d329a9452cc0c5281d91fc"
2429
+ },
2342
2430
  {
2343
2431
  "path": "src/statusline.ts",
2344
2432
  "sha256": "31000d5b249345d659478d7eb49f10771015d9c180ab265ab1cb915ee180b092"
@@ -2413,5 +2501,5 @@
2413
2501
  }
2414
2502
  ]
2415
2503
  },
2416
- "signature": "bnuFg1kyQUJp5inmfL8gczneBPvvrwCdA4z47rLQ1LR6o/gbLsKxk1pJYzw/yy+AYEOetHtJZVyVIlDxlFFiBQ=="
2504
+ "signature": "npoVQ+I9LMnoeVAOel7dIywviRN+xgTlOnBiKxqlNJ/pbuVoK6v3R30W3jIbgMoUoUiwuxFjoKFwi4GZSKd0CA=="
2417
2505
  }
package/README.md CHANGED
@@ -39,6 +39,7 @@ that works.
39
39
  | `agents-policy` | `POLICY_SOURCES`, `extractPolicyBlocks`, `renderPolicySections`, `detectPolicyDrift`, `measureAgentsMdBudget` | Pure anchored policy extraction, 12-hex source stamps, drift classification and Codex project-doc byte-budget measurement. The stamps prove source/target synchronization only; they do not prove that a runtime read or obeyed the text |
40
40
  | `sign` | `listPackFiles`, `listSignablePackFiles`, `verifyManifest`, `verifySbomAgainstManifest` | Shared node_modules/.git exclusions; verify sees MORE than sign (smuggled symlinks still fail). After authenticating the Ed25519 manifest, verification derives the canonical CycloneDX document from those signed entries and requires the no-follow `sbom.json` read to match it exactly. Current/v3 signing refuses malformed, duplicate-key, or precision-losing root `package.json` JSON and preserves object order throughout `exports`, `imports`, and `typesVersions`, so condition-order entry-point changes cannot hide behind packer-noise canonicalisation. Readers retain v1/v2 compatibility |
41
41
  | `guard` | `evaluateGuard`, `resolveRules`, `scanSecrets`, `DEFAULT_RULES`, `parsePnpmLockImporters` | Declarative HARD/SOFT constraint engine behind `dz guard` (publish/teach/consolidate pre-flight; fail-closed). The SOFT `lockfile-in-sync` rule compares each workspace package's `@dzhechkov/*` dep specs against the specifier `pnpm-lock.yaml` records for that importer — the `ERR_PNPM_OUTDATED_LOCKFILE` CI break, caught at publish. Its lockfile reader (`parsePnpmLockImporters`) is a pure RECOGNISE-OR-REFUSE parser (no YAML dependency): it reads only the `lockfileVersion: 9`+ importer layout and returns `undefined` for a legacy v5/v6 file, a truncated one, or any shape that leaves an importer with zero specifiers — because a half-parse reports every real dependency as "not recorded". The rule FAILS OPEN on that `undefined` (no violation) and is pinned SOFT-only via `SOFT_ONLY_RULES`, so no config can turn a parser that admits uncertainty into a publish blocker. The HARD `licence-hold` rule (+ `LICENCE_HOLD_PENDING_MARKER`) is the machine side of a declared licence precondition (`package.json.licenseHold`, ADR-001 hermes-claude-adaptation): silent while the pack stays `private:true` (the npm layer refuses it), it HARD-blocks publish the moment the pack becomes publishable with the hold unsatisfied — LICENSE absent/empty or still carrying the `<!-- PENDING:` grant placeholder, no `Grant-Confirmation: <url>` line, empty THIRD_PARTY_NOTICES, or a non-SPDX license field |
42
+ | `slop-lint` | `slopLint`, `parseSlopRegistry`, `validateSlopLintConfig`, `DEFAULT_SLOP_CONFIG`, `BUNDLED_SLOP_REGISTRY_URL` | Pure deterministic EN/RU lexical-density and structural-style analysis behind advisory `dz lint`. It excludes protected Markdown, requires at least two distinct registered marker IDs in one paragraph, divides marker hits by `max(visibleWords, wordFloor)`, and reports bullet walls or registered three-adjective stacks independently. Under the default `4`/`2`/`25` policy, the distinct-ID floor owns paragraphs through 50 words and density is the dilution cap from 51 words onward. The core performs no file, network, clock, locale, or process I/O; policy/config failures are typed diagnostics rather than empty clean results. |
42
43
  | `backlog` + `backlog-embed` | `dedupIdea`, `classifyDedup`, `dedupPairBand`, `dedupEmbedText`, `lexicalContainment`, `ensureBacklogEmbedForm`, `recordAbsorption`, `alignIdea`, `spinRoulette`, `readGoalMapDetailed`, `parseEffort`, `ensureBacklogGitignored`, `harmonizeBacklog`, `transitionIdeas`, `checkTransition`, `resolveIdPrefix`, `IDEA_TRANSITIONS` | The Smart Backlog engine behind `dz backlog`: status lifecycle via `transitionIdeas` (`ship`/`drop`/`reopen` against the `IDEA_TRANSITIONS` table — unique-short-prefix resolution, idempotent ship/drop no-ops, non-idempotent reopen, all-or-nothing fail-closed batches, line-preserving atomic JSONL rewrite that keeps every non-status byte of untouched records); content-addressed idea records in `.dz/backlog/ideas.jsonl`, semantic dedup over the REUSED agentdb vector namespace (`dz-backlog` — no second store), weighted-max GoalMap alignment, and a seeded weighted roulette. Dedup is TWO-SIGNAL since the register-inflation fix (MEASURED 2026-08-11 on the real 105-idea store: full-length embeds INVERTED the signal on long texts — genuine paraphrases 0.35–0.61 vs topically disjoint long-RU pairs up to 0.9195): `dedupEmbedText` embeds a bounded 400-char excerpt (`backlog-embed.ts`, one form shared by query/mirror/reindex so vectors can never split spaces; `ensureBacklogEmbedForm` re-mirrors v1 stores once, batched), and `dedupPairBand` requires a cosine-threshold DUPLICATE to also share subject vocabulary (`lexicalContainment` ≥ 0.3, else demoted to RELATED with the pair reported — the 0.941 register-only absorption) while promoting a same-idea re-capture at a different length (containment ≥ 0.95, cosine ≥ 0.75) to a subset duplicate; `recordAbsorption` keeps every absorbed text in `absorbed.jsonl` so a wrong verdict is reversible (mutation-defended: `backlog-dedup-demotion-corroboration`, hand-verified 6 red). Every band/weight decision is a PURE function. `classifyDedup` also reports the top-1 match id alongside the cosine (the calibration surface for the 0.92 duplicate band — observational, it never moves the verdict); `readGoalMapDetailed` returns the entries the defensive reader DROPPED with a reason AND the fields it REPAIRED with their raw values (a weight clamped before validation made the validator's out-of-range branch dead code), so `goals --validate` can never report a vacuous "valid (0 goals)" nor hide a `weight: 7`; `parseEffort` returns a printable note for every clamp; `ensureBacklogGitignored` gitignores the store on first write (raw ideas are private prompt-class content) — atomically, preserving the file's dominant EOL, recognising every plain spelling of an existing rule (`/.dz/`, `.dz/**`, …) via `backlogIgnoreStatus`, and obeying a `!` negation as an explicit user opt-out instead of overriding it |
43
44
  | `no-stubs` | `scanStubs`, `checkNoStubs`, `scannableStubPath`, `STUB_MARKERS`, `STUB_PHRASES`, `STUB_SCAN_EXTENSIONS` | Pure unfinished-stub scanner behind the SOFT `no-stubs` publish rule (backlog 0b403a0106103901, Karpathy-Michaels rule XI): bare markers (`TODO`/`FIXME`/`HACK`/`XXX`/`PLACEHOLDER`) case-SENSITIVE with hard word boundaries (`hackathon`/`todos`/a marker inside a hash never fire; MEASURED: relaxing case doubles this repo's hits and adds only prose) + the `implement later` phrase case-insensitive. SCOPE = the CHANGE-SET (the working-tree `git status --porcelain -uall` diff — `-uall` so a brand-new untracked DIRECTORY is scanned file-by-file instead of collapsing to one invisible `?? newdir/` line; `.gitignore` semantics unchanged), never the whole tree — MEASURED: a tree-wide scan is 32+25 hits of mostly ancient legitimate markers, i.e. noise that gets a gate switched off. Markdown gets PROSE scoping (fenced blocks + backticked spans are QUOTES, not stubs). Waiver-with-REASON only, per line (`no-stubs: <reason>`) or per path (`.dz/guard.json` `stubWaivers`, the feature-adr-setup --guards shape); a reasonless waiver is REFUSED as its own finding and exempts nothing. Self-exemption is STRUCTURAL: every marker in the module and its tests is assembled from string fragments, so the gate's own source scans clean — a tested property, not a path skip. Fail-open on missing evidence (no change fact / ungathered contents ⇒ nothing reported) but never fail-SILENT: skipped scannable files (deleted/oversize/unreadable/beyond the file cap) surface as ONE aggregate `notes` entry in the `GuardResult` + audit record — information that can never move the verdict. KNOWN LIMITS are documented at the top of `no-stubs.ts` instead of implied away (whole-line inline waiver token = layer-4 auditability defence; reason QUALITY not judged; boolean fence model, not CommonMark; git-quoted paths undecoded; TS-monorepo extension allowlist; worktree-not-index reads; exact-string config-waiver paths). Mutation-defended (`no-stubs-bare-marker-fires` observed 10 red, `no-stubs-skipped-note-emitted` observed 2 red) |
44
45
  | `feature-adr-setup` (P3) | `renderGuardsConfig`, `renderGuardsRunner` | Scaffolds deterministic guard tests into a TARGET project: `guards.config.json` + a zero-dependency `check.mjs` runner (loc-cap, secret-scan, frozen-file sha256 pins, waivers-with-reasons) — `dz feature-adr-setup --guards` |
@@ -290,9 +291,73 @@ Contracts the exports actually keep (each with its proving test in `test/profile
290
291
  directly with a poisoned in-memory profile skips `writeProfile` entirely. Invalid → verdict, no
291
292
  write, no backup.
292
293
 
294
+ ## Contract checklist API
295
+
296
+ `contract-checklist.ts` is the dependency-free policy behind retrospective feature-contract checks.
297
+ It performs no filesystem, process, network, clock, locale, or model I/O. Callers supply artifact
298
+ bytes and an injected evidence reader:
299
+
300
+ ```ts
301
+ import {
302
+ extractContractChecklist,
303
+ renderContractChecklist,
304
+ parseContractVerdictReport,
305
+ verifyContractVerdicts,
306
+ } from '@dzhechkov/harness-core';
307
+ ```
308
+
309
+ - `extractContractChecklist(source)` reads the exact `## Acceptance criteria` / `AC-N: ...`
310
+ vocabulary and one exact `## Confirmation` pair from each canonical direct ADR Markdown file. It
311
+ emits ordered `contract-checklist/1` items with contiguous `CC-N` ids or no partial contract.
312
+ - `renderContractChecklist(checklist)` serializes one deterministic fenced `contract-checklist`
313
+ block for a future producer integration.
314
+ - `parseContractVerdictReport(text)` accepts one `## Contract checklist` fenced JSON object with
315
+ schema `contract-checklist-verdict/1`, rejects duplicate JSON members and closed-schema drift, and
316
+ requires payload `overallGrade` to equal the human Grade.
317
+ - `verifyContractVerdicts(checklist, report, evidenceReader)` requires exact ordered coverage,
318
+ repository-relative artifact syntax, one exact quote occurrence, verdict/outcome polarity, and
319
+ rejects grade A/B when any item is `unmet`.
320
+
321
+ This is a structural assurance boundary. It proves grammar, identity completeness, evidence
322
+ containment/uniqueness, polarity, and grade coherence. It does not judge whether a quote semantically
323
+ proves a criterion, execute a cited test, replace ADR Confirmation, or replace independent QE.
324
+
325
+ ## Restart advisor API
326
+
327
+ `restart-advisor.ts` is the pure policy behind the manual `dz restart-advisor` command. It accepts
328
+ JSONL bytes and an explicit threshold/round count; it performs no filesystem, process, environment,
329
+ clock, network, or model I/O. The public value exports are:
330
+
331
+ ```ts
332
+ import {
333
+ parseCheckpointQeHistory,
334
+ parseTrainingPairQeHistory,
335
+ decideRestartRecommendation,
336
+ adviseRestart,
337
+ renderRestartDecisionLog,
338
+ } from '@dzhechkov/harness-core';
339
+ ```
340
+
341
+ The versioned `restart-advisor/1` result returns one of `RESTART_CODE_STAGE`,
342
+ `NO_RESTART_RECOMMENDATION`, `NOT_ESTABLISHED`, or `INVALID_INPUT`. Only the adjacent trailing
343
+ streak counts. The checkpoint and training-pair histories are never unioned: when both carry QE
344
+ rounds they must normalize to the same identities and grades, or advice is not established. A
345
+ firing result is still data only: `autoAction` is always `false`, and
346
+ `renderRestartDecisionLog` exposes the effective policy, evidence, source, and reason without
347
+ persisting anything or restarting a stage.
348
+
293
349
  ## Status
294
350
 
295
- `0.8.1` — **the operator profile module, hardened by four cross-family review rounds until round 8
351
+ `0.8.5` — **the pure `restart-advisor/1` API for an explicit, advisory-only code-stage
352
+ restart recommendation.** The CLI supplies D/2 defaults; core itself refuses absent policy.
353
+ Publication and live feature-adr integration remain outside this implementation step.
354
+
355
+ `0.8.3` — **staged: the pure `contract-checklist/1` extraction and
356
+ `contract-checklist-verdict/1` verification API, alongside bilingual advisory `dz lint`.** The
357
+ contract module is string/object-in and typed-decision-out; publication remains outside this
358
+ implementation step.
359
+
360
+ `0.8.2` — **the operator profile module, hardened by four cross-family review rounds until round 8
296
361
  came back clean** (the contract list above IS the round-by-round finding list — echo deferral lives
297
362
  in the CLI, the two totality fixes and the seam refusals live here). Tests: `test/profile.test.ts`
298
363
  22/22 (MEASURED — reproducer `npx vitest run test/profile.test.ts`).
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Command-invocation accounting for `dz deadwood`.
3
+ *
4
+ * The write leg is a single best-effort append. The report leg is pure: callers
5
+ * inject log text, inventory, an allowlist, and a clock. A usage report is
6
+ * advisory only and never mutates the harness surface it describes.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ export declare const CMD_USAGE_LOG_RELATIVE = ".dz/cmd-usage.jsonl";
11
+ export declare const CMD_USAGE_LOG_MAX_BYTES = 1048576;
12
+ export declare const CMD_USAGE_COMPACT_TARGET_BYTES: number;
13
+ export declare const CMD_USAGE_SCHEMA = 1;
14
+ export declare const CMD_USAGE_V1_EPOCH_MS: number;
15
+ export declare const DEADWOOD_FUTURE_TOLERANCE_MS = 86400000;
16
+ export declare const DEADWOOD_MIN_OBSERVED_DAYS = 28;
17
+ export declare const DEADWOOD_MIN_RECORDS = 100;
18
+ export type DeadwoodSurfaceKind = 'command' | 'skill' | 'rule';
19
+ export interface CmdUsageInvocationRecord {
20
+ readonly kind: 'cmd';
21
+ readonly cmd: string;
22
+ readonly ts: string;
23
+ readonly v: 1;
24
+ }
25
+ export interface CmdUsageAggregateRecord {
26
+ readonly kind: 'agg';
27
+ readonly cmd: string;
28
+ readonly runs: number;
29
+ readonly firstAt: string;
30
+ readonly lastAt: string;
31
+ readonly v: 1;
32
+ }
33
+ export type CmdUsageRecord = CmdUsageInvocationRecord | CmdUsageAggregateRecord;
34
+ export interface ParsedCmdUsage {
35
+ readonly records: readonly CmdUsageRecord[];
36
+ readonly skipped: number;
37
+ readonly outOfRange: number;
38
+ }
39
+ export interface CmdUsageStat {
40
+ readonly cmd: string;
41
+ readonly runs: number;
42
+ readonly runsInWindow: number;
43
+ readonly firstAt: string;
44
+ readonly lastAt: string;
45
+ }
46
+ export interface DeadwoodAllowlistEntry {
47
+ readonly surface: string;
48
+ readonly kind: DeadwoodSurfaceKind;
49
+ readonly reason: string;
50
+ }
51
+ export interface DeadwoodInventoryItem {
52
+ readonly surface: string;
53
+ readonly kind: DeadwoodSurfaceKind;
54
+ /** Alternate typed command tokens folded into this canonical command candidate. */
55
+ readonly aliases?: readonly string[];
56
+ }
57
+ export type DeadwoodVerdict = 'insufficient-data' | 'ready';
58
+ export interface DeadwoodUsedSurface {
59
+ readonly state: 'used';
60
+ readonly surface: string;
61
+ readonly kind: Exclude<DeadwoodSurfaceKind, 'skill'>;
62
+ readonly runs: number;
63
+ readonly runsInWindow: number;
64
+ readonly firstAt: string;
65
+ readonly lastAt: string;
66
+ }
67
+ export interface DeadwoodCandidate {
68
+ readonly state: 'zero-usage';
69
+ readonly surface: string;
70
+ readonly kind: Exclude<DeadwoodSurfaceKind, 'skill'>;
71
+ readonly runs: number;
72
+ readonly runsInWindow: 0;
73
+ readonly firstAt: string | null;
74
+ readonly lastAt: string | null;
75
+ }
76
+ export interface DeadwoodExemptSurface {
77
+ readonly state: 'excluded-safety';
78
+ readonly surface: string;
79
+ readonly kind: Exclude<DeadwoodSurfaceKind, 'skill'>;
80
+ readonly reason: string;
81
+ readonly runs: number;
82
+ readonly runsInWindow: 0;
83
+ readonly firstAt: string | null;
84
+ readonly lastAt: string | null;
85
+ }
86
+ export interface DeadwoodUnjudgedSurface {
87
+ readonly state: 'insufficient-data' | 'no-instrumentation';
88
+ readonly surface: string;
89
+ readonly kind: DeadwoodSurfaceKind;
90
+ readonly reason: string;
91
+ }
92
+ export interface DeadwoodReport {
93
+ readonly verdict: DeadwoodVerdict;
94
+ readonly windowWeeks: number;
95
+ readonly observedDays: number;
96
+ readonly recordCount: number;
97
+ readonly ruleObservedDays: number;
98
+ readonly ruleAuditCount: number;
99
+ readonly candidates: readonly DeadwoodCandidate[];
100
+ readonly exempt: readonly DeadwoodExemptSurface[];
101
+ readonly used: readonly DeadwoodUsedSurface[];
102
+ readonly insufficient: readonly DeadwoodUnjudgedSurface[];
103
+ readonly noInstrumentation: readonly DeadwoodUnjudgedSurface[];
104
+ readonly staleAllowlist: readonly DeadwoodAllowlistEntry[];
105
+ readonly skippedLines: number;
106
+ readonly outOfRange: number;
107
+ }
108
+ export interface DeadwoodInput {
109
+ readonly cmdUsageText: string;
110
+ readonly guardAuditText?: string;
111
+ readonly inventory: readonly DeadwoodInventoryItem[];
112
+ readonly allowlistText: string;
113
+ readonly weeks: number;
114
+ readonly now: Date;
115
+ }
116
+ /** Walk up to the nearest `.dz` directory without ever making telemetry throw. */
117
+ export declare function resolveCmdUsageRoot(startDir: string): string;
118
+ /** One append per parsed command, with no argv/cwd/env payload. Never throws. */
119
+ export declare function recordCommandInvocation(root: string, cmd: string, now?: Date): void;
120
+ /** ADR-compatible name retained for callers/tests written before the plan renamed the seam. */
121
+ export declare const appendCommandUsage: typeof recordCommandInvocation;
122
+ /** Parse independently per line; torn or schema-invalid rows are counted and skipped. */
123
+ export declare function parseCmdUsageLines(text: string, now: Date): ParsedCmdUsage;
124
+ /** Measured corpus span (first accepted event to last), or null when no event can be read. */
125
+ export declare function measureCmdUsageDepthDays(text: string, now: Date): number | null;
126
+ /** A verdict needs both a meaningful sample and history spanning the requested window. */
127
+ export declare function decideDeadwoodWindow(depthDays: number, count: number, weeks: number): {
128
+ ok: boolean;
129
+ reason: string;
130
+ };
131
+ /** Fold raw and compacted rows into the same per-command accounting shape. */
132
+ export declare function foldCmdUsage(records: readonly CmdUsageRecord[], weeks: number, now: Date): Map<string, CmdUsageStat>;
133
+ /** Parse the committed safety allowlist; a reason-less exemption is refused, never skipped. */
134
+ export declare function loadDeadwoodAllowlist(json: string): DeadwoodAllowlistEntry[];
135
+ /** Build the single structure consumed by both the human and JSON renderers. */
136
+ export declare function buildDeadwoodReport(input: DeadwoodInput): DeadwoodReport;
137
+ /** Render one report object as either human text or stable JSON. */
138
+ export declare function renderDeadwoodReport(report: DeadwoodReport, format: 'text' | 'json'): string;
139
+ /**
140
+ * Lazily compact the invocation log on the cold read path.
141
+ *
142
+ * The named lock protects competing compactors. Emitters deliberately stay
143
+ * lock-free; this advisory log accepts a possible racing row rather than making
144
+ * every command wait on a lock. Every error is swallowed so compaction can never
145
+ * turn `dz deadwood` into a gate.
146
+ */
147
+ export declare function compactCmdUsageIfNeeded(root: string): void;
148
+ //# sourceMappingURL=cmd-usage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cmd-usage.d.ts","sourceRoot":"","sources":["../src/cmd-usage.ts"],"names":[],"mappings":"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"}