@dzhechkov/harness-cli 0.8.5 → 0.8.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.
package/.dz-manifest.json CHANGED
@@ -9,7 +9,7 @@
9
9
  },
10
10
  {
11
11
  "path": "README.md",
12
- "sha256": "e74440eef6812dbeaa550bdbbd80483e4cf4f38c22857260c534726f14ebb680"
12
+ "sha256": "2498732f43f16f1ba0f974d0deeabf628ceb9a1d4b294df01d32dd2138d04933"
13
13
  },
14
14
  {
15
15
  "path": "dist/bin.d.ts",
@@ -33,35 +33,35 @@
33
33
  },
34
34
  {
35
35
  "path": "dist/boolean-flags.d.ts.map",
36
- "sha256": "bf5eadb6ea3ed4761fbc8206167c86119467d7dfd28d7e0eee7cd21d30099da6"
36
+ "sha256": "454794ad9738157ca422201aaedf99704a2c525e32d48ee2dac533d498bf1271"
37
37
  },
38
38
  {
39
39
  "path": "dist/boolean-flags.js",
40
- "sha256": "2cee996fe21ed692135c98b35bf5e56a89f2dc157f681b36c65020fd062b857b"
40
+ "sha256": "cd2cfc484dd9d0bcb1063be0f55e12dbd6b49e2642568bd7ad2a5f045b83be5b"
41
41
  },
42
42
  {
43
43
  "path": "dist/boolean-flags.js.map",
44
- "sha256": "68a41f08452af263f2a378b54e813567b6ba52376f3d0e13567a7eef7dff09e0"
44
+ "sha256": "ce07c1e9270067794d744c59cdacd083e22ff3a2e38f10b7b41e3397b3ad2ff5"
45
45
  },
46
46
  {
47
47
  "path": "dist/cli.d.ts",
48
- "sha256": "aac58bbd870ae960365e085570635030bd4ef454e2326ac3d782c8e9f8116941"
48
+ "sha256": "cbdb7b8512c91f1c17dbfa85856d67e2d368f7f8c090b712935767781318f8fe"
49
49
  },
50
50
  {
51
51
  "path": "dist/cli.d.ts.map",
52
- "sha256": "a5d8d7579320ddbb30016d48c6d74a8ecf5628d90efe3925ed8ecb06cde7477c"
52
+ "sha256": "4d543e2a0c57bf76e016842064244005a60f5723b05cc56d038646b7fa8ffddd"
53
53
  },
54
54
  {
55
55
  "path": "dist/cli.js",
56
- "sha256": "bee6b00ec45da2d49c60ff85a675f989100bf703ce05cbaa5e4f730417161ccc"
56
+ "sha256": "6cd8fb4f769c0877aaa556bf1948367855e0f7a704eae8726a864b8bf7c966c0"
57
57
  },
58
58
  {
59
59
  "path": "dist/cli.js.map",
60
- "sha256": "e68711d595224a75faf9527aa6ec186b0c37ef551470c9df3690b780efe9cfd5"
60
+ "sha256": "113f073970be1fec877a3174d3fe781d022d06d87cae001d7cd505d9d0a56c38"
61
61
  },
62
62
  {
63
63
  "path": "dist/core-compat.d.ts",
64
- "sha256": "8635dba8bfdc635d44467a47ff693ec9f85b14c1d9c6dfa6d00e6e9ff5d2f7f1"
64
+ "sha256": "a1e1b7a74e846be02a2a7384e25a695f85e8315360eea7cc3a8e0a3e2e330eeb"
65
65
  },
66
66
  {
67
67
  "path": "dist/core-compat.d.ts.map",
@@ -69,27 +69,27 @@
69
69
  },
70
70
  {
71
71
  "path": "dist/core-compat.js",
72
- "sha256": "570a6e1d7536890735e771888050c490bc1a2a239b2a2514d87248604e3354f0"
72
+ "sha256": "6eefe1328f2586bed953d61c0d9a06ad4684b1a2e978abfdf3d91b937d2f72e0"
73
73
  },
74
74
  {
75
75
  "path": "dist/core-compat.js.map",
76
- "sha256": "342b0c716f6ac9f853e6fb9e10d2d3ae4c643f047becd200d6f8576a84674fb2"
76
+ "sha256": "cb7436935411b3804741d475fb231ae7d66cece98d3934fa09f25161aa535ea7"
77
77
  },
78
78
  {
79
79
  "path": "dist/index.d.ts",
80
- "sha256": "4d80bdb7f6742b2f356b07688cda569ea2aaab55f9300626244d15862da8a14f"
80
+ "sha256": "7f2301a59931e768865a58b7681882dc3b6d9b19b4d6ba2d6836e153c15c39f0"
81
81
  },
82
82
  {
83
83
  "path": "dist/index.d.ts.map",
84
- "sha256": "3bc53d2587335beb17c5bd4ffb88987f61328b164519714d198a94f893bd3ea9"
84
+ "sha256": "f90807882ce10b96cb22af34d9a612a87f8e3869c338ebed666f9f7677bb651c"
85
85
  },
86
86
  {
87
87
  "path": "dist/index.js",
88
- "sha256": "e2f5b6cb4291b002ec74891f666ab11e916d10455ae1ca2a88d41207c944b771"
88
+ "sha256": "d492db6c67df4c7d78cdf50bcfb55da9609e2891178d5fdd1fa91ef973d81a62"
89
89
  },
90
90
  {
91
91
  "path": "dist/index.js.map",
92
- "sha256": "116828d2b6d8698b6a66291b0676e97c7cf0208a3591e8047462c70065b94bc1"
92
+ "sha256": "6a5a693bc1035cc67ea572e609d4e2fb05580c9268821e25ba8d278e61635033"
93
93
  },
94
94
  {
95
95
  "path": "dist/install-spec.d.ts",
@@ -113,15 +113,15 @@
113
113
  },
114
114
  {
115
115
  "path": "dist/known-flags.d.ts.map",
116
- "sha256": "310b51c71ec9f0f2089ece6ff4f33c2baeae78d462b3bbdd702255bcf73fb726"
116
+ "sha256": "bcc70b16fc530e09a764852e6d57f4858161244555b0d270fca8335b0a800a49"
117
117
  },
118
118
  {
119
119
  "path": "dist/known-flags.js",
120
- "sha256": "8c457fd3408799ce075bb07a6a77a885141cbf8cd9d47ae8c124ad60e64fd7f3"
120
+ "sha256": "dc11bc77b47cd80ca6f0efb0f4d991ddc6060fe59bd30824178cc9c8add6bcaf"
121
121
  },
122
122
  {
123
123
  "path": "dist/known-flags.js.map",
124
- "sha256": "e6a349e6587f8dfa134c597328d09ac09755c321c23d1bab98fd6e6a3adff86a"
124
+ "sha256": "1b5a6a740581a5ba0aa26533648ffa603411ac0ba5d9c243bd5005593e7ce11c"
125
125
  },
126
126
  {
127
127
  "path": "keys/README.md",
@@ -133,7 +133,7 @@
133
133
  },
134
134
  {
135
135
  "path": "package.json",
136
- "sha256": "11df4bc14008b0e123b91bf5dc395589a147c24de3afd1f7beb58093ec753325"
136
+ "sha256": "5480e62c310e52e3578c1e693460289caf9acb1c3f7948357c06fdec905112f1"
137
137
  },
138
138
  {
139
139
  "path": "src/bin.ts",
@@ -141,19 +141,19 @@
141
141
  },
142
142
  {
143
143
  "path": "src/boolean-flags.ts",
144
- "sha256": "3ea2dd881198881f94675ce14e465ce007e5d987e25b7786f67d9af13e880e22"
144
+ "sha256": "8d9fe5f91b143cbecafacf69489f284ab312f277b8f84da0558ee572e4203b41"
145
145
  },
146
146
  {
147
147
  "path": "src/cli.ts",
148
- "sha256": "6d402ac972df1c859da5996a65dbd94699f5df5080217cf6fce9af354fe92699"
148
+ "sha256": "00ba927eb54a3a4ae074a9d68acd96f0526b189b4944f583d830b8705ccab4b4"
149
149
  },
150
150
  {
151
151
  "path": "src/core-compat.ts",
152
- "sha256": "432d622419ea6a6cbb704ff9a6a1e305f2a3f920f253d31712a0566ab457db53"
152
+ "sha256": "31e681ab5795f875c675691a46bb2d2553c43d4638682d572dfc77343e081d49"
153
153
  },
154
154
  {
155
155
  "path": "src/index.ts",
156
- "sha256": "0401f29a7a76e73e6f6654c7f05ef547bbd7fc180a127202255337f31c21454a"
156
+ "sha256": "ece9dc7be312c38212e72440493221dc816ea109d1ba8842d2ed3410445b65a1"
157
157
  },
158
158
  {
159
159
  "path": "src/install-spec.ts",
@@ -161,9 +161,9 @@
161
161
  },
162
162
  {
163
163
  "path": "src/known-flags.ts",
164
- "sha256": "2956fd1c4720c3ccdd5b4ffd4edfa8c19ad034b5ff7fb418c5befb9cb3829644"
164
+ "sha256": "6365829621a8f3b50381310f4c62ae5a5c4c1625587acf2b73d3f3486ecfc791"
165
165
  }
166
166
  ]
167
167
  },
168
- "signature": "Of546A8oarnbK/BQr+Vl9yXG6+PcIKe7Ymi8e1KFVk9GkZIw8SMy+JWG3RFiYyzuR1Ya3+XbJAbAJwIkCZ74Dg=="
168
+ "signature": "Dr0iwgi5ddZLuWVUPMyadfnbZPn2EwN/dZcBBa49B+InX2Vx4C61bwG8kbAeE/xS3JLaCaQTXZjMclDLbST8Bw=="
169
169
  }
package/README.md CHANGED
@@ -36,6 +36,19 @@ The **`dz`** CLI — the main entry point to the DZ Harness Hub. Install AI skil
36
36
  npm install -g @dzhechkov/harness-cli
37
37
  ```
38
38
 
39
+ ## MCP and hook companion configuration
40
+
41
+ A skill can request companion configuration through a bounded adjacent `INTEGRATIONS.json`. The
42
+ first integration-aware init prints its aggregate digest; only
43
+ `--allow-integrations <that-digest>` can authorize the exact content. The live registration probe is
44
+ non-executing: it uses target-owned list/get surfaces, never the manifest command or URL.
45
+
46
+ The measured support matrix currently admits Claude Code `2.1.235` project MCP only. Every other
47
+ target/component pair is a named refusal, except that the existing Codex hook writer can map to
48
+ emitted when its live veto probe reports `ready: true`. Claude `Pending approval` is registration
49
+ with `ready: false`. Use `--no-integrations` for explicit skills-only installation; `--no-verify`
50
+ does not authorize emission.
51
+
39
52
  > **Note:** If you get `EUNSUPPORTEDPROTOCOL workspace:*`, you're inside a pnpm/yarn workspace. Run the install from `/tmp` or `~` instead.
40
53
 
41
54
  ### Updating an already-installed `dz`
@@ -660,14 +673,25 @@ $ dz compounding
660
673
  INSTRUMENTATION: last apply-leg record … — live
661
674
  EVIDENCE CHAIN .dz/recall-usage.jsonl: verified · 3 chained · 133 pre-chain (uncovered)
662
675
  EVIDENCE CHAIN .dz/guard-audit.jsonl: verified · 3 chained · 82 pre-chain (uncovered)
676
+ LESSON → RULE FUNNEL (calendar month, observed traffic only):
677
+ 2026-08 · eligible/attempted/accepted/executions NOT MEASURED (promotion-history-not-recorded)
663
678
  ```
664
679
 
665
- Three honesty rules are load-bearing:
680
+ Four honesty rules are load-bearing:
666
681
  - **a gate without enough data says INSUFFICIENT DATA** — never a verdict (the apply-leg log turned
667
682
  out to have been silently dead for 19 days; "no data" is a finding, not a pass);
668
683
  - **readiness is not a result** — the replay section says `ready`, never `promote`;
669
684
  - **improvement is judged by RATE** (violations per audit), so a quiet afternoon cannot masquerade
670
- as progress.
685
+ as progress;
686
+ - **zero promotions is not itself a finding** — the funnel names a stopped stage only when its
687
+ predecessor is non-empty and it stays empty for three consecutive measured UTC months. A missing,
688
+ malformed, unreadable, unobserved, or anchorless source prints `NOT MEASURED (<reason>)`, never 0.
689
+
690
+ The funnel is prospective: ordinary non-dry `dz guard promote` runs append bounded candidate/status
691
+ observations to the existing `.dz/promotion-state.json`; `--dry-run` still writes nothing. Guard
692
+ firings join by the opaque digest of the exact effective template+params carried in the audit row, never by a
693
+ display rule id alone. Text and `--json` render the same counts/status/findings model and issue no
694
+ overall learning-health verdict.
671
695
 
672
696
  The prompt queries that make replay possible stay on your machine: `.dz/recall-usage.jsonl` is
673
697
  git-ignored, entries are truncated at 200 chars and flagged when truncated (a prefix is not a prompt,
@@ -1374,7 +1398,7 @@ Get the whole set with `dz init --target claude-code --preset meta`, or pick one
1374
1398
  | [@dzhechkov/p-replicator](https://www.npmjs.com/package/@dzhechkov/p-replicator) | `npx @dzhechkov/p-replicator init` | AI product development (/replicate pipeline) |
1375
1399
  | [@dzhechkov/health-advisor](https://www.npmjs.com/package/@dzhechkov/health-advisor) | `npx @dzhechkov/health-advisor init` | Medical AI (25 skills) |
1376
1400
  | [@dzhechkov/skills-bto](https://www.npmjs.com/package/@dzhechkov/skills-bto) | `npx @dzhechkov/skills-bto init` | BTO benchmarking (Build-Test-Optimize) |
1377
- | [@dzhechkov/skills-feature-adr](https://www.npmjs.com/package/@dzhechkov/skills-feature-adr) | `npx @dzhechkov/skills-feature-adr init` | 11-step feature pipeline |
1401
+ | [@dzhechkov/skills-feature-adr](https://www.npmjs.com/package/@dzhechkov/skills-feature-adr) | `npx @dzhechkov/skills-feature-adr init` | 11-step feature pipeline with two-axis `primary` + per-family `budget` routing (`normal`/`eco`/`hybrid`); explicit stage models keep precedence |
1378
1402
  | [@dzhechkov/skills-edu-site](https://www.npmjs.com/package/@dzhechkov/skills-edu-site) | `npx @dzhechkov/skills-edu-site init` | Gamified edu site generator |
1379
1403
  | [@dzhechkov/skills-transcript-site](https://www.npmjs.com/package/@dzhechkov/skills-transcript-site) | `npx @dzhechkov/skills-transcript-site init` | Transcript → interactive site |
1380
1404
  | [@dzhechkov/skills-analyst-manual](https://www.npmjs.com/package/@dzhechkov/skills-analyst-manual) | `npx @dzhechkov/skills-analyst-manual init` | 3-phase analyst composite |
@@ -1619,13 +1643,14 @@ run pkg-audit-1; sources: trace, ledger
1619
1643
  The gate passed, the inventory (52 directories = 49 canonical + 2 private + 1 non-package) was
1620
1644
  cross-checked deterministically against the filesystem, and the stale test was re-pinned to it.
1621
1645
 
1622
- **And the run surfaced a real defect kept here on purpose.** Read the trace again: the registry
1623
- names six chunks, but only `chunk-1..3` ever dispatched — `maxFanout: 3` **silently truncated** the
1624
- other three lanes, and the run stayed green only because the synthesize agent noticed the gap and
1625
- audited the missing chunks with its own tools. That is exactly what the trace is for: it shows what
1626
- your loop *did*, not what the plan promised. (Filed in this repo's backlog: over-registry items must
1627
- become a named failure or a loud trace event, never a silent drop. Until then: keep
1628
- `fanouts[].registry.length maxFanout`, and read the trace after the first run of any new plan.)
1646
+ **And this recorded run is now the regression proof for a fixed defect.** Read the trace again: the
1647
+ registry names six chunks, but only `chunk-1..3` dispatched — the old renderer treated
1648
+ `maxFanout: 3` as a prefix cap, and the run survived only because synthesize audited the missing
1649
+ chunks itself. Current plans treat `maxFanout` as concurrency: all six dispatch through a three-wide
1650
+ window. Deliberate sampling is explicit (`overflow: "truncate"` plus a non-blank
1651
+ `truncateReason`) and emits a banner, a `[fanout-truncated]` stderr line, and a trace receipt. The
1652
+ reader now grades this historical trace `region-dispatch-completeness:fan = FAIL` and names
1653
+ `chunk-4..6`; a legacy projection without registry evidence is `INCONCLUSIVE`, never a guessed pass.
1629
1654
 
1630
1655
  #### How to phrase the ASK — Claude Code vs Codex
1631
1656
 
@@ -1839,16 +1864,18 @@ runs a command that MEASURES the declared artifacts itself. It refuses a null re
1839
1864
  never recorded as done), an absent or partially-present artifact set, and a stage that declares nothing
1840
1865
  to witness — so a stage that did not happen can no longer be recorded, which the old mechanism allowed.
1841
1866
 
1842
- ## All Commands (83)
1867
+ ## All Commands (84)
1843
1868
 
1844
- *(83 MEASURED reproducer: `node --input-type=module -e "import('./dist/index.js').then(m=>console.log(m.DZ_COMMANDS.length))"`; `dz --help` exposes 80 unique top-level names, pinned by `test/command-count.test.ts`.)*
1869
+ *(84 MEASURED from the bounded command inventory below; rendered `dz --help` exposes 81 unique
1870
+ top-level names, pinned by `test/command-count.test.ts`.)*
1845
1871
 
1846
1872
  ```
1847
1873
  dz setup --target <name> [--preset <name>] [--select id,id,...] [--skills-dir <dir>] [--memory agentdb] [--no-memory] [--no-hooks] [--install-driver] [--force]
1848
- dz init --target <name> [--preset <name>] [--select id,id,...] [--force]
1874
+ dz init --target <name> [--preset <name>] [--select id,id,...] [--allow-integrations <sha256:...>] [--no-integrations] [--no-verify] [--force]
1875
+ dz integrations-verify --target <name> --component <mcp|hooks> [--project <dir>] [--json]
1849
1876
  dz install <npm-pkg> [--target <name>] [--project <dir>] [--force]
1850
1877
  dz bundle [--preset <name> | --select id,...] [--out <dir>] [--skills-dir <dir>] [--force]
1851
- dz teach "<pattern>" [--reward <0-1>] [--domain <name>] [--type rule|success-pattern|lesson-learned] [--project <dir>] [--to project|global] [--no-mirror] [--guard] # --project pins the learned store to <dir>/.dz (not the cwd) — pin to a canonical brain; --to picks WHICH store (global = ~/.dz, shared across projects). Session default: export DZ_LEARN=global. Project default: .dz/config.json -> learning.teachTo. An unknown value is REFUSED, never defaulted. Every write prints the path AND what chose it.
1878
+ dz teach "<pattern>" [--class-form "<template with :slot>"] [--reward <0-1>] [--domain <name>] [--type rule|success-pattern|lesson-learned] [--project <dir>] [--to project|global] [--no-mirror] [--guard] # --class-form is optional and never blocks the specific write; --project pins the learned store to <dir>/.dz; --to picks WHICH store (global = ~/.dz, shared across projects). Every write prints the path AND what chose it.
1852
1879
  dz teach --reinforce "<dzId-or-exact-text>" [--project <dir>] # bump an existing learned pattern instead of writing a near-duplicate
1853
1880
  dz teach --from-json <file> [--project <dir>] [--no-mirror] [--harmonize] # bulk-import a `dz recall --all --json` export; prints a harmonize dry-run advisory
1854
1881
  dz consolidate [--sessions-dir <dir>] [--project <dir>] [--no-mirror]
@@ -1904,7 +1931,7 @@ dz feature-adr-record --kind ledger|training-pair --stage <s> [--slug <s>] [--r
1904
1931
  dz mutation-gate [--package <dir>] [--registry <file>] [--test-cmd "<cmd>"] [--only <id[,id]>] [--timeout <ms>] [--rebaseline per-entry|final] [--keep-scratch] [--json] # the mutation gate: for each NAMED protection in a declarative registry, copy the package to a scratch dir (shadow-repo layout, node_modules symlinked, git-initialized), verify the baseline is green, apply the entry's exact {find, replace} mutation, run the suite, REQUIRE red, restore — and require the red to be ATTRIBUTABLE to the protection: a mutated file that no longer parses is MUTATION_UNPARSEABLE, a failing count far above the entry's bound (maxFailing, default from observed) is OVER_FAILING, and a restored tree that does not reproduce green makes the entry INCONCLUSIVE (flaky suite). A mutation that does not apply, a green suite, or an inconclusive run is a FAILURE — never a skip. exit 0 all proven / 1 gate failed / 2 setup error
1905
1932
  dz delivery-check --slug <slug> [--context-only] [--findings <f.json>] [--strict] [--author <model>] [--json] # portable Step-10 Delivery Gate: the `manual` form that travels to every shell target — prints the 4-plane review brief (regressions ‖ security ‖ code-quality ‖ product-honesty) + artifact probes; --findings classifies a fed-back review into a fail-closed ready|blocked hand-off (only cross-validated BLOCKER/HIGH count) and writes features/<slug>/10_delivery_review.md; --strict exits 1 on blocked
1906
1933
  dz skills-verify [--dir <project>] [--expect a,b] [--static] [--strict] [--timeout <s>] [--json] # does .claude/skills/ actually REGISTER? --static = instant layout scan (CI-safe, no session): flags dirs that can never register; default also starts a real session and reads the authoritative system/init listing. exit 0 pass / 1 fail / 2 inconclusive — an unobservable registration is NEVER a pass
1907
- dz compounding [--project <dir>] [--json] # honest learning-loop payoff report: pool write-only ratio, guard repeat-violation trajectory (rate per audit-half), cold-vs-warm replay readiness over unique untruncated prompt events, apply-leg staleness, and EVENT-CHAIN health of the two evidence logs (verified / defects / uncovered pre-chain prefix) a gate without enough data says INSUFFICIENT_DATA, never a verdict
1934
+ dz compounding [--project <dir>] [--json] # honest learning-loop payoff report: pool/replay/guard instrumentation plus the monthly eligible→attempted→accepted→executions funnel. A missing source is NOT MEASURED; only a non-empty→empty named edge across three consecutive measured months is a funnel finding; text/JSON carry the same facts and no learning-health verdict
1908
1935
  dz deadwood [--weeks <n>] [--json] # advisory zero-usage report for commands and guard-rule firings; safety-net exclusions carry written reasons, skills without an invocation signal are never candidates, and shallow history says INSUFFICIENT_DATA. Human deprecation review only — never deletes or modifies harness surface
1909
1936
  dz epoch-replay --mock [--n <N>] [--effect <-1..1>] [--tie-rate <0..1>] [--seed <N>] [--slice <name>] [--margin <0..0.5>] [--json] # $0 synthetic run through the REAL verdict math; labelled SYNTHETIC, same seed = byte-identical
1910
1937
  dz epoch-replay --emit [--project <dir>] [--limit <N>] [--seed <N>] [--margin <0..0.5>] [--out <file>] [--json] # cold-vs-warm work order: replayable instances + PRE-REGISTERED blind A/B assignment + the PRE-REGISTERED non-superiority margin + a sha256 integrity digest + emittedAt/corpus fingerprint (raw prompts — defaults into the git-ignored .dz/epoch-replay/)
@@ -1926,7 +1953,7 @@ dz backlog <sub> add "<idea>" | list | show <id> | goals [--validate] | roul
1926
1953
  dz sign --init --out <path> | --pack <dir> --key <path> # --init: generate the Ed25519 keypair (private OUTSIDE the repo, prints the public key for keys/dz.pub); else sign a pack's manifest + CycloneDX SBOM
1927
1954
  dz sbom --pack <dir> [--out <file>] # emit the CycloneDX 1.5 SBOM for a pack standalone (file-level bill of materials); print to stdout or write to a file
1928
1955
  dz guard check --op <publish|teach|consolidate|reindex> [--text <s>] [--json] [--force <reason>] # declarative constraint layer before self-mutating ops: HARD violation → block (exit 1), SOFT → warn; zero-config defaults, .dz/guard.json to customise; dz guard --init | dz guard log (append-only audit). dz publish runs it automatically (--no-guard "<reason>" = logged escape hatch)
1929
- dz guard promote [--dry-run | --apply] [--window-days <N>] [--periods <N>] [--json] # lesson → guard-rule promotion: ranks lessons by firings × cost, SHADOW-replays each candidate over real commits, and proposes a rule only after TWO consecutive wins AND two window-lengths of REAL elapsed time since first observation (a window with zero firings resets the counter; a thin window is skipped, never a loss; commit dates are author-supplied, so elapsed time is measured by the local clock in .dz/promotion-state.json). Proposes by default (--dry-run writes nothing — and so never starts that clock; --apply installs it SOFT a promoted rule can never block, and a same-id/different-body clash is a CONFLICT that exits 1 rather than claiming success); promotions AND refusals are recorded in features/guard-promotion/promotions/
1956
+ dz guard promote [--dry-run | --apply] [--window-days <N>] [--periods <N>] [--json] # lesson → guard-rule promotion: ranks lessons by firings × cost, SHADOW-replays each candidate over real commits, and proposes a rule only after TWO consecutive wins AND two window-lengths of REAL elapsed time since first observation. Non-dry runs add bounded prospective funnel evidence to .dz/promotion-state.json without feeding the verdict; --dry-run remains write-free. --apply installs SOFT rules only; promotions/refusals remain under features/guard-promotion/promotions/
1930
1957
  dz feature-adr-setup --guards [--loc-cap <n>] [--apply] # P3: scaffold DETERMINISTIC guard tests into the project — guards.config.json + a zero-dependency check.mjs runner (LOC cap, secret scan, frozen-file sha256 pins, waivers-with-reasons); wire `node architecture/guards/check.mjs` into CI
1931
1958
  dz publish [--filter <name>] [--bump-only] [--claim-check <off|warn|error>] (dry-run by default; pass --yes/--confirm to go live; claim-check gate defaults to warn — surfaces README claim findings, never blocks)
1932
1959
  dz parity [--target <name>] [--json] # honest feature×target map COMPUTED from the capability model — full / manual (via which form) / absent, per target
@@ -1955,6 +1982,29 @@ dz import-ecc [--local-path <dir>] [--select id,id,...] [--limit N] [--out
1955
1982
  dz help
1956
1983
  ```
1957
1984
 
1985
+ ### Optional class form for a taught lesson
1986
+
1987
+ `dz teach` can store the observed lesson and an explicitly proposed class template in the same
1988
+ invocation. The class half is optional: omission, a blank value, or syntactic rejection leaves the
1989
+ specific write successful and unchanged.
1990
+
1991
+ ```bash
1992
+ dz teach "Use Jira labels for release gates" --class-form "Use :field labels for release gates"
1993
+ dz recall "Use GitHub labels for release gates"
1994
+ # ... specific: Use Jira labels for release gates · class: Use :field labels for release gates [match: class]
1995
+ ```
1996
+
1997
+ Use the class form when a future reader needs the *why* across structure, interfaces, or
1998
+ maintainability. Skip it when scope, risk, time, and cost are low, or standards, policy, or existing
1999
+ documentation already cover the choice. `dz` checks only that the `:slot` template syntactically
2000
+ covers the specific text; it does not certify that the broader rule is true.
2001
+
2002
+ The store keeps two linked, role-labelled rows (`lessonForm` + `lessonPairId`), while ranked recall
2003
+ returns one logical lesson with separate `pattern`/`classForm` fields and
2004
+ `matchedForm: specific|class|both`. The vector mirror remains specific-text-only in this tranche;
2005
+ class attribution comes from the durable lexical path, so a vector score is never mislabeled as a
2006
+ class match.
2007
+
1958
2008
  **Closeness, not a rank surrogate (feature `recall-true-closeness`).** Each hit now carries `sim=` —
1959
2009
  the semantic leg's real cosine — with `▲` above the measured relevance floor for the query's language
1960
2010
  and `▽` below it (ru 0.38 / en 0.31, calibrated 2026-07-09 on a 32-probe labeled set). A lexical-only
@@ -2091,10 +2141,20 @@ dz statusline --fa-record --slug my-loop --step build --kind loop
2091
2141
  ```
2092
2142
 
2093
2143
  ```
2094
- 📐 feature-adr Step 8 QE · 🎓 224 pool · ↑7 used · +2 new · ↻0 reinforced · 🎓 dz: 224 patterns · 🧠 3 sources
2144
+ 📐 feature-adr Step 7 Code · ⏱ ~25–47м (p25–p75 по n=5 ранам M; окно 2026-08-24–2026-08-29) · 🎓 224 pool · ↑7 used · +2 new · ↻0 reinforced · 🎓 dz: 224 patterns · 🧠 3 sources
2145
+ 📐 feature-adr Step 8 QE · ETA: недостаточно истории (n=2 L; окно 2026-08-28–2026-08-29) · 🎓 224 pool · ↑7 used · +2 new · ↻0 reinforced · 🎓 dz: 224 patterns · 🧠 3 sources
2095
2146
  🔁 loop build · 🎓 dz: 224 patterns · 🧠 3 sources
2096
2147
  ```
2097
2148
 
2149
+ For a live `/feature-adr` run, the panel derives remaining-stage timing from timestamped
2150
+ `features/*/.fa-state/checkpoints.jsonl` runs of the **same tier**. Every estimate prints its
2151
+ evidence basis: distinct-run `n`, tier, and date window. A Codex-shaped `code` leg always renders
2152
+ as p25–p75 rather than a false-precision point. The floor is three runs for **each** remaining
2153
+ `(tier, stage)` bucket; one thin bucket makes the whole result `ETA: недостаточно истории` instead
2154
+ of silently shortening the sum. Missing/unreadable checkpoints omit ETA, never `~0м`, and never
2155
+ take down the rest of the statusline. `dz statusline --json` includes the typed `eta` verdict for
2156
+ custom tooling whenever the live run has enough checkpoint identity to evaluate it.
2157
+
2098
2158
  `--kind <feature-adr|loop>` names the PRODUCER and defaults to `feature-adr`; an unrecognised value
2099
2159
  exits 1 rather than silently weakening panel arbitration. It is load-bearing in two places:
2100
2160
 
@@ -2525,10 +2585,14 @@ dz routing recommend # per-stage args.models suggestion, printed
2525
2585
  # attributed run-level — an inference, and it says so), and every skipped
2526
2586
  # record with WHY. qe is FORCED to the cross-family of the code pick —
2527
2587
  # a same-family qe recommendation is unrepresentable, not filtered.
2588
+ # A `store:` line always says current / STALE / UNFED and names
2589
+ # the remedy; JSON carries basis.freshness + basis.unfed.
2528
2590
  dz routing recommend --apply # feed the samples into .dz/routing-outcomes.json (the store the
2529
2591
  # `auto-cost` plan spec reads) — idempotent by runId: a second apply
2530
2592
  # feeds 0 and names the skipped runs. Insufficient data is SAID
2531
2593
  # (cold-start pick + escalation chain), never dressed as a bar-met pick.
2594
+ # `dz guard --op publish` warns SOFT as routing-store-stale when
2595
+ # harvested runIds are still missing from that store.
2532
2596
  # (status, effort, goal, uses…) is preserved byte-for-byte,
2533
2597
  # the previous text lands in .dz/backlog/edits.jsonl, and the
2534
2598
  # dedup vector is re-embedded in the same bounded form.
@@ -3498,7 +3562,7 @@ invariants: HARD rules **block** the operation, SOFT rules warn. Zero config nee
3498
3562
  cover the known rakes; `.dz/guard.json` (via `dz guard --init`) exists only if you want to tune a severity
3499
3563
  or disable a rule.
3500
3564
  ```bash
3501
- dz guard check --op publish # no-workspace-star · no-skill-drift · no-secrets · readme-consistency · readme-first · skills-registrable · lockfile-in-sync · no-stubs · review-round · licence-hold
3565
+ dz guard check --op publish # no-workspace-star · no-skill-drift · no-secrets · readme-consistency · readme-first · skills-registrable · lockfile-in-sync · marketplace-parity · no-stubs · review-round · licence-hold
3502
3566
  dz guard check --op teach --text "the fix: export sk-abc..." # → BLOCK (exit 1): looks like a credential
3503
3567
  dz guard log # append-only audit: every verdict + every forced override
3504
3568
  ```
@@ -3533,6 +3597,26 @@ zero specifiers, and then report every real dependency as "not recorded". The ru
3533
3597
  `.dz/guard.json` cannot promote it to HARD, since a parser designed to admit "I may not understand this
3534
3598
  file" must never be able to block a publish.
3535
3599
 
3600
+ The SOFT, publish-only `marketplace-parity` rule regenerates `.claude-plugin/plugin.json` and
3601
+ `.claude-plugin/marketplace.json` from the live registry in an isolated temp directory and compares
3602
+ their composition with the published showcase. It deliberately excludes `version`, which remains an
3603
+ operator field, and never blocks publication; composition drift warns with the exact repair command
3604
+ `dz plugin --version <published>`. A repository with no complete `.claude-plugin/` showcase is out of
3605
+ scope: the rule records an informational skip reason and emits no violation.
3606
+
3607
+ Four publish-only `volume-shadow/v1` observations meter the always-loaded corpus without becoming a
3608
+ release gate: configured template context, largest-file share, feature-artifact/unified-diff-byte
3609
+ ratio, and the tier/lifecycle artifact set. Rules and commands are reported separately from
3610
+ conditional full-skill bodies, and their sum is labelled a configured/invokable envelope rather
3611
+ than measured per-session cost. Human output uses `[observe]` or `[note]`; JSON and the chained audit
3612
+ retain the same operands, units, dated reference starting points, and method identifiers.
3613
+
3614
+ All four rules are SOFT-only, including when `.dz/guard.json` requests HARD. An incomplete or capped
3615
+ scan, escaping/non-regular input, ambiguous attribution, or zero denominator is a visible typed
3616
+ `unknown`, never a clean zero and never a blocker. Source comments and comment density are not
3617
+ collected or classified. The observations therefore do not recommend shortening justification;
3618
+ they only report volume inside their closed artifact scope.
3619
+
3536
3620
  **`review-round` (HARD, publish)** — a package that bumps its version AND changes source must bring a
3537
3621
  GRADED `features/*/08_qe_report.md` in the same change. The gate had eleven rules and not one asked
3538
3622
  whether anyone but the author had read the code; the cost is on the record (health-advisor slice H:
@@ -3706,6 +3790,12 @@ and a `--dry-run`-only workflow never promotes, because the run that would start
3706
3790
  the one that writes nothing. (The `wait` reason spells both out.) This is a guard against accidental
3707
3791
  self-gaming, not a cryptographic one — the state file is local and editable.
3708
3792
 
3793
+ Every non-dry run also records a bounded, prospective observation in that same state file for
3794
+ `dz compounding`: candidate eligibility, an opaque digest of the exact effective template+params when one
3795
+ exists, and the route's authoritative candidate verdict. It stores no lesson/rule body, does not
3796
+ feed the promotion decision, and deduplicates an identical run. Legacy state remains readable, but
3797
+ months before this observation history existed are `NOT MEASURED`; they are never reconstructed.
3798
+
3709
3799
  **It refuses out loud.** Rule code is never synthesised from lesson text — a lesson that fits no
3710
3800
  template is listed as not-promotable *with the reason*, and the refusals are recorded in
3711
3801
  `features/guard-promotion/promotions/` alongside the promotions. A candidate already covered by an
@@ -4051,7 +4141,7 @@ The self-learning loop is only compounding if every run reads and writes the **s
4051
4141
  dz vector harmonize --apply --project <brain> # optional: collapse near-dup paraphrases
4052
4142
  ```
4053
4143
 
4054
- - **Route each stage to an optimal model — `args.models`.** The `feature-adr` workflow takes an optional per-stage map (`{router, requirements, research, adr, ideation, ddd, architecture, plan, code, qe, fleet}`); each value a **spec** — Claude `fable|opus|sonnet|haiku` or Codex `codex[:id[:reasoning]]` (ids incl. `gpt-5.5`, `gpt-5.6`) — backed by a proven default table. The **load-bearing default**: when `models.qe` is unset, QE auto-routes to the *other family than the coder* (a model that writes code must not also self-QE — cross-model review catches what self-review misses), falling back to a Claude reviewer if Codex is absent (never blocks). `args.models[stage]` wins over the legacy `planner`/`coder`/`qeReviewer`/`codexModel` knobs; omitting it is byte-identical to today; the result reports `modelsUsed`. Adding a new Codex id is a data-only allowlist edit (gpt-5.6-ready).
4144
+ - **Route by primary family, budget, or stage.** The `feature-adr` workflow accepts `primary=claude|codex`, per-family `budget=normal|eco|hybrid`, and an optional per-stage `models` map over `{router, requirements, research, adr, ideation, ddd, architecture, plan, code, qe, fleet}`. Each stage value is a **spec** — Claude `fable|opus|sonnet|haiku` or Codex `codex[:id[:reasoning]]` (ids incl. `gpt-5.5`, `gpt-5.6`). The **load-bearing default** routes unset QE to the other family than the actual coder; Codex QE uses `sol:high` under normal/hybrid and `terra:medium` under eco, with a loud Claude fallback if the selected id is unavailable. Precedence is `models[stage]` > legacy `planner`/`coder`/`qeReviewer`/`codexModel` knobs > primary/budget defaults > session-inherited. Omitting every routing knob keeps the inherited session path; the result reports `modelsUsed`.
4055
4145
  ```js
4056
4146
  // Claude codes, Codex independently QEs (cross-model by construction):
4057
4147
  Workflow({ scriptPath: '.claude/workflows/feature-adr.js',
@@ -4306,6 +4396,25 @@ refusal as the honest answer.
4306
4396
 
4307
4397
  ## Status
4308
4398
 
4399
+ `harness-core v0.8.10` · `harness-cli v0.8.9` — **staged, not published:** adds bounded
4400
+ `volume-shadow/v1` publish observations with structured human/JSON/audit parity. All four remain
4401
+ SOFT-only; incomplete evidence is unknown, and source-comment justification is out of scope.
4402
+
4403
+ `harness-core v0.8.9` · `skills-feature-adr v1.5.9` — **staged, not published:** the packaged
4404
+ feature-adr workflow performs advisory top-3 micro-recall at the live Step 3 ADR choice and Step 6
4405
+ plan-route choice. Every failure is fail-open; versioned `.fa-state/decision-recall.jsonl` rows make
4406
+ receipt coverage and repeat-related outcomes derivable offline. The hypothesis is external `[SRC],
4407
+ n=1`, books were silent on retrieval timing, and no runtime threshold gates a stage.
4408
+
4409
+ `v0.8.8` — **staged, not published.** `dz init` now reports exactly one MCP and one hook outcome,
4410
+ adds `integrations-verify`, content-bound authorization, explicit skills-only opt-out, and named
4411
+ partial-failure exits; only receipt-proven live registration may be called emitted.
4412
+
4413
+ `v0.8.7` — **honest ETA in the live 📐 feature-adr statusline.** The panel scans timestamped
4414
+ same-tier checkpoint history only while a fresh run is visible, prints p25–p75 for the code leg,
4415
+ and carries `n`, tier, and date window inline. Any remaining stage below n=3 says
4416
+ `ETA: недостаточно истории`; absent/unreadable checkpoints fail open without `~0м`.
4417
+
4309
4418
  `v0.8.5` — **`dz restart-advisor`, the 83rd inventory command (80 documented top-level
4310
4419
  help names).** It returns an explicit `restart-advisor/1` recommendation from confined QE-history
4311
4420
  reads, never restarts or mutates the live pipeline, and reports not-established evidence with exit 2.
@@ -1 +1 @@
1
- {"version":3,"file":"boolean-flags.d.ts","sourceRoot":"","sources":["../src/boolean-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CAyFhD,CAAC;AAEH,gGAAgG;AAChG,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAAc,CAAC;AAElE,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGpE"}
1
+ {"version":3,"file":"boolean-flags.d.ts","sourceRoot":"","sources":["../src/boolean-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,MAAM,CA0FhD,CAAC;AAEH,gGAAgG;AAChG,eAAO,MAAM,qBAAqB,EAAE,SAAS,MAAM,EAAc,CAAC;AAElE,iGAAiG;AACjG,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAGpE"}
@@ -68,6 +68,7 @@ export const BOOLEAN_CLI_FLAGS = new Set([
68
68
  'no-dry-run',
69
69
  'no-evals',
70
70
  'no-hooks',
71
+ 'no-integrations',
71
72
  'no-issue',
72
73
  'no-memory',
73
74
  'no-mirror',
@@ -1 +1 @@
1
- {"version":3,"file":"boolean-flags.js","sourceRoot":"","sources":["../src/boolean-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IAC5D,UAAU;IACV,UAAU;IACV,KAAK;IACL,mBAAmB;IACnB,sBAAsB;IACtB,KAAK;IACL,OAAO;IACP,WAAW;IACX,MAAM;IACN,OAAO;IACP,KAAK;IACL,WAAW;IACX,UAAU;IACV,WAAW;IACX,OAAO;IACP,SAAS;IACT,cAAc;IACd,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,WAAW;IACX,oBAAoB;IACpB,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,WAAW;IACX,MAAM;IACN,eAAe;IACf,MAAM;IACN,SAAS;IACT,gBAAgB;IAChB,cAAc;IACd,MAAM;IACN,cAAc;IACd,QAAQ;IACR,SAAS;IACT,MAAM;IACN,cAAc;IACd,MAAM;IACN,OAAO;IACP,YAAY;IACZ,UAAU;IACV,UAAU;IACV,UAAU;IACV,WAAW;IACX,WAAW;IACX,eAAe;IACf,WAAW;IACX,aAAa;IACb,UAAU;IACV,WAAW;IACX,MAAM;IACN,UAAU;IACV,SAAS;IACT,YAAY;IACZ,aAAa;IACb,kBAAkB;IAClB,SAAS;IACT,WAAW;IACX,oBAAoB;IACpB,mBAAmB;IACnB,QAAQ;IACR,cAAc;IACd,iBAAiB;IACjB,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,UAAU;IACV,MAAM;IACN,OAAO;IACP,aAAa;IACb,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;IACN,YAAY;IACZ,iBAAiB;IACjB,KAAK;CACN,CAAC,CAAC;AAEH,gGAAgG;AAChG,MAAM,CAAC,MAAM,qBAAqB,GAAsB,CAAC,OAAO,CAAC,CAAC;AAElE,iGAAiG;AACjG,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IACzD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtE,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"boolean-flags.js","sourceRoot":"","sources":["../src/boolean-flags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAwB,IAAI,GAAG,CAAC;IAC5D,UAAU;IACV,UAAU;IACV,KAAK;IACL,mBAAmB;IACnB,sBAAsB;IACtB,KAAK;IACL,OAAO;IACP,WAAW;IACX,MAAM;IACN,OAAO;IACP,KAAK;IACL,WAAW;IACX,UAAU;IACV,WAAW;IACX,OAAO;IACP,SAAS;IACT,cAAc;IACd,MAAM;IACN,MAAM;IACN,MAAM;IACN,SAAS;IACT,MAAM;IACN,QAAQ;IACR,WAAW;IACX,oBAAoB;IACpB,UAAU;IACV,OAAO;IACP,MAAM;IACN,OAAO;IACP,OAAO;IACP,QAAQ;IACR,WAAW;IACX,MAAM;IACN,eAAe;IACf,MAAM;IACN,SAAS;IACT,gBAAgB;IAChB,cAAc;IACd,MAAM;IACN,cAAc;IACd,QAAQ;IACR,SAAS;IACT,MAAM;IACN,cAAc;IACd,MAAM;IACN,OAAO;IACP,YAAY;IACZ,UAAU;IACV,UAAU;IACV,iBAAiB;IACjB,UAAU;IACV,WAAW;IACX,WAAW;IACX,eAAe;IACf,WAAW;IACX,aAAa;IACb,UAAU;IACV,WAAW;IACX,MAAM;IACN,UAAU;IACV,SAAS;IACT,YAAY;IACZ,aAAa;IACb,kBAAkB;IAClB,SAAS;IACT,WAAW;IACX,oBAAoB;IACpB,mBAAmB;IACnB,QAAQ;IACR,cAAc;IACd,iBAAiB;IACjB,QAAQ;IACR,QAAQ;IACR,aAAa;IACb,UAAU;IACV,MAAM;IACN,OAAO;IACP,aAAa;IACb,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;IACN,YAAY;IACZ,iBAAiB;IACjB,KAAK;CACN,CAAC,CAAC;AAEH,gGAAgG;AAChG,MAAM,CAAC,MAAM,qBAAqB,GAAsB,CAAC,OAAO,CAAC,CAAC;AAElE,iGAAiG;AACjG,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IACzD,IAAI,IAAI,KAAK,OAAO;QAAE,OAAO,CAAC,qBAAqB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACtE,OAAO,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AACrC,CAAC"}
package/dist/cli.d.ts CHANGED
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { spawn, type ChildProcess } from 'node:child_process';
7
7
  import { runSyncCodexHooks, type CodexHooksSyncReport, type BridgeFamily } from '@dzhechkov/harness-core';
8
+ import type { RecallPatternsOptions, TeachGuardResult, IntegrationOutcome } from '@dzhechkov/harness-core';
8
9
  /** Literal command inventory, pinned against the main dispatch switch by a layer-1 test. */
9
10
  export declare const DZ_COMMANDS: readonly string[];
10
11
  /** Output sink + working directory — injectable so the CLI is testable. */
@@ -29,6 +30,18 @@ export interface CliIo {
29
30
  * command that needs it (`brain ground`), and never when stdin is a TTY (nothing piped).
30
31
  */
31
32
  readonly stdin?: string;
33
+ /** Human-terminal rendering seam; production defaults to stdout TTY detection. */
34
+ readonly interactive?: boolean;
35
+ /** Fault seam proving that class-form recall degrades to specific recall with a stderr receipt. */
36
+ readonly classMatcher?: RecallPatternsOptions['classMatcher'];
37
+ /** Guard decision seam; production always uses the real vector-backed teach guard. */
38
+ readonly teachGuardRunner?: (projectRoot: string, text: string, opts: {
39
+ readonly reward?: number;
40
+ }) => Promise<TeachGuardResult>;
41
+ /** Reinforcement flush seam paired with `teachGuardRunner`; production uses the configured backend. */
42
+ readonly teachReinforceRunner?: (projectRoot: string, dzId: string, reward: number) => Promise<{
43
+ readonly flushed: number;
44
+ }>;
32
45
  /**
33
46
  * Test seam for `dz release`: overrides subprocess execution for gate steps and the
34
47
  * gh/git side channels (production leaves it unset → real `execSync`, stdio piped).
@@ -86,6 +99,10 @@ export interface CodexHooksSummary {
86
99
  readonly stdout: readonly string[];
87
100
  readonly stderr: readonly string[];
88
101
  }
102
+ /** Map the retained Codex hook writer's one live verdict into the common integration contract. */
103
+ export declare function normalizeCodexHookOutcome(base: IntegrationOutcome, delivery: CodexHooksSummary & {
104
+ readonly report: CodexHooksSyncReport;
105
+ }, noVerify?: boolean): IntegrationOutcome;
89
106
  /**
90
107
  * What the user is told about a sync report — the ONE place the success word can be printed.
91
108
  *
package/dist/cli.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}