@dzhechkov/harness-cli 0.8.23 → 0.8.25

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": "546a61c17cc3375afcc65d3ab02f8ca5336e85d76220e830a6574a29f778e583"
12
+ "sha256": "5ee90e7eda7d0d95f4ea8ed8df5ac2e487409d9c9805c7fbd22d91f69faae388"
13
13
  },
14
14
  {
15
15
  "path": "dist/bin.d.ts",
@@ -33,31 +33,31 @@
33
33
  },
34
34
  {
35
35
  "path": "dist/boolean-flags.d.ts.map",
36
- "sha256": "2acdecdcc1fb01ae636d83a90602e25ecb5467885bf603919923b3b5b75e8664"
36
+ "sha256": "6dc1cb51c44d69d47ed68fa59ef83d3864e67c464fd52d19304d686b0d52db0f"
37
37
  },
38
38
  {
39
39
  "path": "dist/boolean-flags.js",
40
- "sha256": "793946b04a78b8065492ff4276fbfe26211f66b187e6c963b3f337ef050cbcd7"
40
+ "sha256": "2603e6ae974bae8ad682654f4c4ebd732e8a8c98b984c1cb539576cff0e37662"
41
41
  },
42
42
  {
43
43
  "path": "dist/boolean-flags.js.map",
44
- "sha256": "e108aa8459b29c20e84fc382198c1d382f0c8b1e33a3e6d874d2f07099582162"
44
+ "sha256": "bc800f97db0d795fb323dfd8d5d8cf930dd3a426269e559fd6e73bb357f2024a"
45
45
  },
46
46
  {
47
47
  "path": "dist/cli.d.ts",
48
- "sha256": "194375a4c7edb48ed1a61d5b764831db1a084322c631d7a6a9ee137ebbfee931"
48
+ "sha256": "072300158117033a92fb1ca377e50a748e878bbd0ad29b1bca351a13f2fc8238"
49
49
  },
50
50
  {
51
51
  "path": "dist/cli.d.ts.map",
52
- "sha256": "97d7cd356f1300d2a50ed93ba9313d39089eee5adac400052a0ae1624076b487"
52
+ "sha256": "c6b19ec38d68a13c15fcd49cdc7214871b862fe6ad8479bbf008c2725c814aa5"
53
53
  },
54
54
  {
55
55
  "path": "dist/cli.js",
56
- "sha256": "58abc0af2ec824a4165a83dce1542b4305c9eedf8bac20b83165096d15aabf20"
56
+ "sha256": "b35532d4be6887c70f8abb2954c49e1b15198f8065055a0d9db8846041436520"
57
57
  },
58
58
  {
59
59
  "path": "dist/cli.js.map",
60
- "sha256": "7310a6347f933d655505afdf97c837172ea9ec590badd2c60d17443e6f20b232"
60
+ "sha256": "060b9b8d10025d5b55e40b2d91c2ed95fdd4593703f52b1521ab3d9c43c6e2b0"
61
61
  },
62
62
  {
63
63
  "path": "dist/command-inventory.d.ts",
@@ -129,15 +129,15 @@
129
129
  },
130
130
  {
131
131
  "path": "dist/known-flags.d.ts.map",
132
- "sha256": "fbb35e2e749cb2d4323307a150466811af4d731708252fcab78d6c1c3172e05c"
132
+ "sha256": "4388c40ba547deb7c1cc8038faab8b34146f3abb5538d4e64b328da4fea2bb7f"
133
133
  },
134
134
  {
135
135
  "path": "dist/known-flags.js",
136
- "sha256": "66c91a31d1e9ff68f515abc7faca6812c863404bba020452918b37c88fecae86"
136
+ "sha256": "481e990a09740a1af38213787041bf2c70f54c3539ccfb49fb045bd374bc7669"
137
137
  },
138
138
  {
139
139
  "path": "dist/known-flags.js.map",
140
- "sha256": "c7db75b60190b42ea80c5a3b58239c6a192cbd9d09976aeaa63c0c1e430054f5"
140
+ "sha256": "86d0e1be18f4bca85feafd2865b2371e77a04e202bf99b87ecda9483696e7433"
141
141
  },
142
142
  {
143
143
  "path": "keys/README.md",
@@ -149,7 +149,7 @@
149
149
  },
150
150
  {
151
151
  "path": "package.json",
152
- "sha256": "196a046baffc6431e597cef2bb4825afd30be4ab427a3fa4008073272473af56"
152
+ "sha256": "e37b3688f2bd91ae1ab797399274350a57eed10a1c43d69c94efb747c3fb7dd8"
153
153
  },
154
154
  {
155
155
  "path": "src/bin.ts",
@@ -157,11 +157,11 @@
157
157
  },
158
158
  {
159
159
  "path": "src/boolean-flags.ts",
160
- "sha256": "9bf188047aae20f90b448312c03c7e1e97feac16c7f94873de0bcbc32b92171b"
160
+ "sha256": "8705ed4427b562d0f39fe772a75cfac13d4322afda4a675cbfcf1e5bbab57628"
161
161
  },
162
162
  {
163
163
  "path": "src/cli.ts",
164
- "sha256": "c71bb49b95e4eb3286008688a9f35446277c1e97329937576f55d2eec0135da3"
164
+ "sha256": "8c831e3c524d6e38da9ea2360cdfb5ab5dfa939e8c4bf0eafe57724db472ec4d"
165
165
  },
166
166
  {
167
167
  "path": "src/command-inventory.ts",
@@ -181,9 +181,9 @@
181
181
  },
182
182
  {
183
183
  "path": "src/known-flags.ts",
184
- "sha256": "eb97286c632c3b10dcaa33c645dcf8a86eed6d1d491670c4d321111b3cffe63c"
184
+ "sha256": "a181018a851bbc4b1a7f3a06962a50db138c451abd0e6cca3e89f5a9d1228fba"
185
185
  }
186
186
  ]
187
187
  },
188
- "signature": "0kS8O+aNVqxgEP+Fx3M+IGc/0Ie3LYACCTzMjn/MfuomQysDqcLomk6bdUthSE/GrCreE+0j03gOMZdPALcyCQ=="
188
+ "signature": "OGv5/A3HMsZs+oYSwfend7+sOZpFoSc7xjFaz1MG0Gw7z6raYgNxJhbp2iypLLKPtpUw2wO+Zi5lXOYYjicIDQ=="
189
189
  }
package/README.md CHANGED
@@ -978,7 +978,13 @@ stated fact rather than an inference from an absent file. Records and reports ar
978
978
  the state directory itself is contained the same way, before anything is created in it. The audit
979
979
  trail is written BEFORE the report and corrected after it, so `reportWritten` can only ever
980
980
  understate; if the trail cannot be written at all, the run FAILS (`audit-write-failed`) rather than
981
- shipping a verdict nobody can re-derive.
981
+ shipping a verdict nobody can re-derive. The record also carries `writeSequence` — diagnostic
982
+ sequencing metadata: a self-reported, process-local trace of the `signoff-write-started` /
983
+ `report-written` / `record-update-prepared` steps with monotonic stamps taken at each named event
984
+ (the start of the first record write, the moment the report is on disk, and just before the atomic
985
+ record update). It replaces a file-mtime comparison in the tests (a race); the write ORDER itself is
986
+ proven by the report-failure test (record exists and says `false` when the report never lands) and
987
+ the failpoint test (`reportWritten:true` only after the report), not by this field.
982
988
 
983
989
  **Exit codes:** `0` a signoff was parsed (ANY grade — a grade F still exits 0: the bridge reports, it
984
990
  does not gate), `1` a named failure, `2` a usage error. **Honest limits:** it proves the call was
@@ -1449,7 +1455,25 @@ is not a false gate; `--audit-dev` widens; an audit that *cannot run* also block
1449
1455
  `STALE_DIST`, never checked as-is; a package that declares a `build` script but has **no** dist JS is
1450
1456
  `MISSING_DIST` — an unbuilt package cannot ship), (4) smoke-boot every bin via `node <bin> --help` in a
1451
1457
  throwaway cwd with a timeout. Packages without a `test` script are **named skips** in the report — never
1452
- silent passes; a template-only pack (no build, no artifacts, no bin) is a named `SKIP_NO_ARTIFACTS`.
1458
+ silent passes; a template-only pack (no build, no artifacts, no bin) is a named `SKIP_NO_ARTIFACTS`. The
1459
+ packed-install smoke's `pack` steps run against a **staged** `package.json` — `workspace:*` sibling
1460
+ deps rewritten to the exact sibling version, `scripts.prepublishOnly` dropped, written and restored
1461
+ atomically (temp file + rename), one package at a time — the same staging `dz publish`'s preview
1462
+ applies, so `npm install` on the resulting tarballs does not fail on a literal `workspace:*` spec. A
1463
+ restore that fails is reported as a FAILED step (the tree is left staged and says so), never as a pass.
1464
+ A red `tests`/`syntax`/`smoke` step names the failing test(s) when the output is a runner shape it
1465
+ recognises (vitest summary/FAIL/×/❯ lines, or node:test/TAP `not ok N …` + `# fail N`) — colour
1466
+ codes are stripped first, so a coloured runner is recognised too; otherwise it falls back to the
1467
+ first output line, marked `(no test-runner summary recognised)` so the difference from a parsed
1468
+ summary is visible. Beneath the reason it prints the tail **per stream**, labelled `stdout:` /
1469
+ `stderr:` — the two streams are captured independently, so their relative order (as the process
1470
+ actually interleaved them) is **not** reconstructed, only each stream's own tail order. Both
1471
+ streams appear the same way in the report, the `--json` output (a `tails: {stdout, stderr}` object
1472
+ on every executed tests/syntax/smoke/timeout failure — present with empty strings when a stream
1473
+ produced nothing), and the best-effort `gh issue`, where every tail is additionally **redacted**
1474
+ (`token`/`secret`/`password` values, `Bearer …`, `npm_…`/`ghp_…`/`sk-…`/`AKIA…` tokens, and long
1475
+ opaque base64/hex-ish blobs all become `[redacted]`) and the whole issue body is capped at 60KB,
1476
+ shrinking every tail evenly rather than dropping some whole while leaving others untouched.
1453
1477
 
1454
1478
  ```bash
1455
1479
  dz release --dry-run # full gate plan, zero commands executed
@@ -2197,9 +2221,9 @@ dz verify-pack --pack <dir> [--pubkey <path>] # signature check of a pack: fai
2197
2221
  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). The built-in SOFT `rounds-traced` rule warns at 10 packages/ commits since the latest round receipt (or the ledger's first row when no round exists); a null git fact is `not measured`, and `.dz/config.json` `rounds.traced:false` is a named skip. dz publish runs it automatically (--no-guard "<reason>" = logged escape hatch)
2198
2222
  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/
2199
2223
  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
2200
- dz publish [--filter <name>] [--bump-only] [--claim-check <off|warn|error>] [--mirror-cmd <cmd>|--no-mirror] (dry-run by default; pass --yes/--confirm to go live; a configured mirror must return a live receipt or the published run exits 3; config: publish.mirrorCommand)
2224
+ dz publish [--filter <name>] [--bump-only] [--claim-check <off|warn|error>] [--mirror-cmd <cmd>|--no-mirror] [--allow-sibling-drift] [--include-drifted] (dry-run by default; pass --yes/--confirm to go live; a configured mirror must return a live receipt or the published run exits 3; config: publish.mirrorCommand; sibling-drift + packed-install-smoke gates, feature publish-sibling-drift-gate, ADR-001 — a workspace sibling whose registry build differs blocks with a `--filter <batch>,<S>` fix-it, --allow-sibling-drift overrides (logged to .dz/guard-audit.jsonl), --include-drifted auto-extends the batch; the whole batch is packed + installed together and every bin runs `--version`, exit 0 + non-empty stdout required)
2201
2225
  dz parity [--target <name>] [--json] # honest feature×target map COMPUTED from the capability model — full / manual (via which form) / absent, per target
2202
- dz release [--filter <name>] [--affected] [--audit-dev] [--tag] [--publish] [--json] [--dry-run] [--no-issue] # VERIFIED release: 4 HARD gates in front of dz publish — package test suites, pnpm audit --prod >=high (--audit-dev widens), node --check of every dist/bin file (unbuilt package with a build script ⇒ MISSING_DIST fail), bin smoke-boot "node <bin> --help" (temp cwd + timeout); --affected narrows to git-touched packages (fail-open); any red gate STOPS the release (exit 1) + best-effort gh issue; green ⇒ re-sign reminder, then the ready dz publish command (never with --yes injected)
2226
+ dz release [--filter <name>] [--affected] [--audit-dev] [--tag] [--publish] [--json] [--dry-run] [--no-issue] # VERIFIED release: 4 HARD gates in front of dz publish — package test suites, pnpm audit --prod >=high (--audit-dev widens), node --check of every dist/bin file (unbuilt package with a build script ⇒ MISSING_DIST fail), bin smoke-boot "node <bin> --help" (temp cwd + timeout), packed-install smoke (same rule as dz publish's, feature publish-sibling-drift-gate — pack the batch, install together, `--version` every bin) when the set has a bin; --affected narrows to git-touched packages (fail-open); any red gate STOPS the release (exit 1) + best-effort gh issue; green ⇒ re-sign reminder, then the ready dz publish command (never with --yes injected)
2203
2227
  dz auto-canonicalize --source <github-url> --pack <skills-pack>
2204
2228
  dz sync-upstream [--package <dir>] [--list] [--all]
2205
2229
  dz drift-check [--all] [--json] [--project <dir>] # CI gate: exit 1 on NEW shared-skill drift (baseline: .dz/drift-allowlist.json; --all incl .claude dogfood)
@@ -3217,6 +3241,98 @@ dz publish --filter skills-devops # publish specific package
3217
3241
  dz publish --filter skills-devops --bump-only # bump version only, no publish
3218
3242
  ```
3219
3243
 
3244
+ #### Sibling-drift + packed-install-smoke gates (feature `publish-sibling-drift-gate`, ADR-001)
3245
+
3246
+ `workspace:^`/`workspace:~`/`workspace:*` pins a sibling dependency to the exact version on disk —
3247
+ but the REGISTRY under that version can carry an OLDER build if the sibling changed without a
3248
+ version bump (the 2026-09-13 incident: 15 minutes of a broken `@dzhechkov/harness-cli` on npm). Two
3249
+ HARD gates catch this before anything ships, and both run on `--dry-run` too — a dry run ALWAYS
3250
+ prints both verdicts, even once sibling-drift already blocks (no gate goes silent because an
3251
+ earlier one failed):
3252
+
3253
+ 1. **Sibling drift.** For every workspace `S` a batch package depends on (`dependencies`,
3254
+ `peerDependencies` AND `optionalDependencies` — all three pin and ship identically) that is NOT
3255
+ itself part of the batch, the gate compares `S`'s WORKSPACE copy against its published inventory,
3256
+ naming which mechanism produced BOTH sides on every result (`inventorySource: 'pnpm-pack' |
3257
+ 'npm-pack' | 'readdir-approximation'`, never left implicit). In production the CLI packs `S`'s
3258
+ workspace dir with `pnpm pack` — the SAME transport the live publish uses — into a per-run scratch
3259
+ dir, unpacks it, and hands the unpacked tree to core, which hashes it with the same full recursive
3260
+ walk it applies to the already-unpacked registry tarball: symmetric by construction, so a file the
3261
+ transport synthesises into the tarball (pnpm copies the workspace-root LICENSE into a package whose
3262
+ own tree has none) is on BOTH sides. MEASURED 2026-09-14 on the hub: with an `npm pack --dry-run
3263
+ --json` path listing instead, two siblings unchanged since publication (harness-presets, scout)
3264
+ read as "LICENSE only in the published copy" — a false drift, because npm's dry-run never lists
3265
+ the file pnpm adds. That npm listing survives only behind a test seam (`publishNpmPackRunner`,
3266
+ parsed by core's pure `parseNpmPackInventory`, source `'npm-pack'`) — the seam path and the
3267
+ production path are NOT the same code, and that is named here rather than implied. Packed ONCE
3268
+ per package directory per `dz publish` RUN (not re-run per dependent package that happens to
3269
+ share the sibling); the scratch dir is removed after the drift loop. With no provider injected
3270
+ (an unusual, degraded mode), both sides fall back to the same `dist`/`files`/`bin` approximation
3271
+ — cruder, but still symmetric by construction. Both
3272
+ inventories are hashed together with a normalized `package.json`
3273
+ (version/gitHead/`_*`/`imports`/`browser`/`sideEffects`/`man` compared, not just entry points). A
3274
+ mismatch blocks; anything this gate cannot build — a fetch that fails (offline, 404), a
3275
+ failed `pnpm pack` (or a shapeless seam listing) on the workspace side, an unreadable/invalid
3276
+ `package.json` on either side, or a `workspace:`-spec'd name it does not recognize — is
3277
+ `unavailable` and blocks too; `unavailable` is never silently treated as a pass, and NEVER goes
3278
+ unlogged (an `unavailable` outcome writes an audit record whether or not `--allow-sibling-drift`
3279
+ was used). `--include-drifted` auto-extends the batch and RE-CHECKS the expanded batch's own new
3280
+ edges until nothing new drifts (a fixed point over transitive drift, capped at the package count)
3281
+ — a folded-in sibling that itself depends on a drifted sibling is not missed.
3282
+ 2. **Packed-install smoke.** The batch's `.tgz` files are installed TOGETHER into a clean directory
3283
+ (siblings outside the batch resolve from the registry — exactly like a fresh user), then every
3284
+ declared `bin` — including one whose target file turns out NOT to exist after the install,
3285
+ which blocks with `declared bin missing after packed install` rather than silently reading as
3286
+ n/a — runs `--version` and must exit 0 with non-empty stdout. On a **live** publish this gate
3287
+ packs each package's tarball exactly ONCE, right after its own version bump — the SAME bytes are
3288
+ then smoke-tested and handed to `npm publish <tgz>`; their sha256 is printed
3289
+ (`tarball <pkg>@<ver> sha256:<hex>`). `dz release --dry-run` plans the same steps inside its
3290
+ `smoke` gate (`smoke:packed-install:*`) and `dz release`'s own execution judges the `--version`
3291
+ step through the identical rule — the two doors apply one rule, for real, not only on paper.
3292
+
3293
+ Both gates write to the SAME append-only, hash-chained `.dz/guard-audit.jsonl` `dz guard` reads —
3294
+ **exactly ONE JSONL record per package per rule per run**, never one record per SIBLING a package
3295
+ happens to depend on: every sibling's outcome for a package (same/drift/unavailable, overridden or
3296
+ not) is aggregated first, then written once, with a detail that names every sibling and its status
3297
+ and a verdict of `block` if any sibling stands blocked, else `warn` if the only issues were resolved
3298
+ via `--allow-sibling-drift`, else `pass` (a package with no external sibling to check still gets a
3299
+ `pass — no external siblings` record, so the rule is never silently absent for a package). Each
3300
+ note/violation names `<rule>: <pkg>@<ver> sha256:<hex> — <detail>`, with `sha256:n/a` stated
3301
+ explicitly whenever the verdict is a preview that ran before anything was packed. The write itself is
3302
+ durable: `openSync` append → a LOOP of `writeSync` calls until every byte of the record is confirmed
3303
+ written (checking the returned length on every call — a short write is resumed, not silently
3304
+ accepted) → `fsyncSync(fd)` → `closeSync`. Two FURTHER fsyncs are each REQUIRED, not best-effort, and
3305
+ each failure alone is enough to report the whole write as not logged: an `fsyncSync` of `.dz` itself
3306
+ when THIS call is the one that created the audit file (so its new directory entry survives a crash),
3307
+ and an `fsyncSync` of `.dz`'s PARENT when THIS call is the one that created `.dz` (so `.dz`'s own
3308
+ directory entry survives a crash). Every printed verdict line says so: `(logged)` appears only after
3309
+ every required fsync actually succeeded, and a failed write — the file's own fsync, either directory
3310
+ fsync, or a writer that makes no progress — prints `(audit NOT logged: <reason>)` instead, never a
3311
+ false `(logged)`. The signature gate got the matching honesty fix: a `.dz-manifest.json` that PARSES
3312
+ but is not a JSON object (`null`, an array, a bare string) is reported `unavailable` — "the manifest is
3313
+ malformed", not "the pack carries no signature", because the fix for each is different.
3314
+
3315
+ ```bash
3316
+ dz publish --filter harness-cli # ✓ sibling drift: none / ✓ packed install smoke, or BLOCKED with a fix-it command
3317
+ dz publish --filter harness-cli --allow-sibling-drift # override (logged to .dz/guard-audit.jsonl) — refused if the audit write itself fails
3318
+ dz publish --filter harness-cli --include-drifted # auto-extend the batch (transitively) with the drifted sibling(s) instead of blocking
3319
+ ```
3320
+
3321
+ A BLOCKED sibling-drift verdict always names the fix: `add S to the batch (--filter <batch>,<S>) or
3322
+ publish it first`.
3323
+
3324
+ ```
3325
+ $ dz publish --filter harness-cli
3326
+ dz publish: BLOCKED harness-cli — sibling drift: @dzhechkov/memory@0.2.20 on the registry differs from the workspace (3 file(s)); add @dzhechkov/memory to the batch (--filter harness-cli,@dzhechkov/memory) or publish it first
3327
+ dz publish: refusing to publish (1 sibling-drift violation(s))
3328
+
3329
+ $ dz publish --filter harness-cli --yes
3330
+ dz publish: tarball @dzhechkov/harness-cli@0.8.25 sha256:9f2c…e10a
3331
+ dz publish: ✓ packed install smoke
3332
+ ✓ @dzhechkov/harness-cli 1.0.0 → 1.0.1 published (confirmed by registry after 1 probes)
3333
+ sha256:9f2c…e10a
3334
+ ```
3335
+
3220
3336
  ### dz auto-canonicalize — discover skills in GitHub repos
3221
3337
 
3222
3338
  ```bash
@@ -3498,6 +3614,36 @@ dz setup --target claude-code --preset devops --memory agentdb # AgentDB (vect
3498
3614
  | **MCP tools** | 0 | pattern, reflexion, causal, skill, hierarchy (whatever the pinned `agentdb` build exposes — `dz` hardcodes no count) |
3499
3615
  | **Dependencies** | None | agentdb (optional, via npx) |
3500
3616
 
3617
+ ### Repeat setup — the backend comes from your config, not from a forgotten flag
3618
+
3619
+ **A plain `dz setup --target claude-code` re-run (no `--memory`) now keeps the backend `.dz/config.json`
3620
+ already names — a repeat setup takes the backend from your config; downgrading to jsonl needs an
3621
+ explicit `--memory jsonl`.** Before this feature, a repeat `dz setup --target claude-code` with no
3622
+ `--memory` decided the backend as "`--memory` or jsonl" and silently reset an agentdb project back
3623
+ to jsonl, dropping `.dz/agentdb-writer.mjs` from the `SessionStart` hook — the config still said
3624
+ `agentdb`, the hooks quietly stopped writing to it.
3625
+
3626
+ | You run | `.dz/config.json` before | Result |
3627
+ |---|---|---|
3628
+ | `dz setup --target claude-code` | `memory.backend: "agentdb"` | stays **agentdb** — hooks/writer untouched, byte-identical to the flagged run |
3629
+ | `dz setup --target claude-code --memory agentdb` | anything, or absent | **agentdb** (explicit, unchanged from before) |
3630
+ | `dz setup --target claude-code --memory jsonl` | `memory.backend: "agentdb"` | **downgrades to jsonl** — printed loudly: `⚠ memory backend downgraded agentdb → jsonl by --memory jsonl`; the config is rewritten to jsonl too (even without `--force`), so the two never disagree |
3631
+ | `dz setup --target claude-code` | no config yet | **jsonl** (the documented default — unchanged) |
3632
+
3633
+ Every run also prints where the backend came from, e.g. `memory backend: agentdb (from
3634
+ .dz/config.json)` / `memory backend: jsonl (from --memory)` / `memory backend: jsonl (default — no
3635
+ .dz/config.json)` — never left to be inferred from the flag alone.
3636
+
3637
+ `dz doctor` cross-checks the two truths too: a new `memory hooks match config` row goes red when
3638
+ `.dz/config.json`'s `memory.backend` and the ACTUAL `SessionStart`/`SessionEnd`/`PreCompact` hooks in
3639
+ `.claude/settings.json` disagree in either direction, naming the exact fix (`run: dz setup --target
3640
+ claude-code --memory agentdb`, or the jsonl equivalent). When the two truths agree, the row prints an
3641
+ explicit `[OK]` naming the backend and the three events (e.g. `memory.backend=agentdb —
3642
+ SessionStart/SessionEnd/PreCompact all invoke .dz/agentdb-writer.mjs`) — it stays silent only when
3643
+ there is no `.dz/config.json` at all (never ran `dz setup`); a `.claude/settings.json` that exists
3644
+ but cannot be parsed or inspected (invalid JSON, or a malformed `hooks` shape) is reported red as
3645
+ "cannot be compared", never as a green receipt.
3646
+
3501
3647
  ### The apply leg — `dz setup --memory agentdb` installs the whole loop, not two of three
3502
3648
 
3503
3649
  Self-learning is a three-leg loop: **collect** (session hooks write into the store above),
@@ -3506,7 +3652,7 @@ Self-learning is a three-leg loop: **collect** (session hooks write into the sto
3506
3652
  Before this feature `dz setup` shipped the first two legs only — the apply leg's files existed
3507
3653
  solely in this repo's own `.claude/helpers/`, so every OTHER project that ran `dz setup --memory
3508
3654
  agentdb` got collection and ranking, but never automatic recall (MEASURED: a clean install wrote no
3509
- `UserPromptSubmit` entry at all, on 0.8.10 and 0.8.23 alike, with or without `--memory agentdb`).
3655
+ `UserPromptSubmit` entry at all, on 0.8.10 and 0.8.25 alike, with or without `--memory agentdb`).
3510
3656
 
3511
3657
  `dz setup --target claude-code --memory agentdb` now installs all three, additively (a repeat run
3512
3658
  changes nothing; a foreign hook you wrote yourself is left exactly where it is):
@@ -3558,6 +3704,15 @@ exact fix command, and `dz parity`'s `learning-apply` row for `claude-code` read
3558
3704
  `not installed — run dz setup --target claude-code --memory agentdb` — never a silent `✓` read off
3559
3705
  a capability table that has never looked at your project.
3560
3706
 
3707
+ **Deeply nested checkout? The socket moves to a short tmpdir path, automatically.** A unix socket
3708
+ path is capped at ~100-108 bytes by the OS (`sun_path`); `<project>/.dz/embed.sock` can exceed that
3709
+ in a project nested several directories deep, and past the limit the daemon used to bind nowhere
3710
+ while still looking "ready". It now falls back to a short, deterministic path under your system temp
3711
+ directory and drops a pointer file (`.dz/embed.sock.path`) the recall hook and `dz doctor` both
3712
+ read — `dz doctor`'s liveness line names the actual path in that case: `embed socket present at
3713
+ /tmp/dz-embed-<hash>.sock (tmpdir-short: project path 118 bytes > 100)`. Nothing to configure; set
3714
+ `DZ_EMBED_SOCKET` yourself only if you need to pin an exact path.
3715
+
3561
3716
  #### Post-install verification (acceptance check, dz-harness-hub issue #10)
3562
3717
 
3563
3718
  A live end-to-end check for a fresh `--memory agentdb` install — every line below is something the
@@ -3588,12 +3743,71 @@ echo '{"prompt":"acceptance check lesson"}' | node .claude/helpers/recall-hook
3588
3743
  echo '{"prompt":"unrelated weather report"}' | node .claude/helpers/recall-hook.cjs # → empty stdout, exit 0
3589
3744
 
3590
3745
  # 7. Doctor confirms the leg is alive, not merely installed.
3591
- dz doctor # → "apply-leg alive (embed daemon): embed.sock present"
3746
+ dz doctor # → "apply-leg alive (embed daemon): embed socket present at <path> — recall injection can run"
3592
3747
  ```
3593
3748
 
3594
3749
  Every step above is a REPRODUCER, not a claim: run it on a scratch project before trusting a `dz
3595
3750
  setup --memory agentdb` install on a new machine.
3596
3751
 
3752
+ #### One recall engine for the hook and the CLI (`hook-recall-hybrid-parity`, ADR-001)
3753
+
3754
+ Before this feature the per-prompt hook and `dz recall` used TWO DIFFERENT engines: the hook's embed
3755
+ daemon ran its own brute-force cosine loop over the mirror; `dz recall` called core's `recallHybrid`
3756
+ (FTS5 lexical + semantic + reciprocal-rank-fusion). MEASURED (record 097ca040): 41.8% of taught
3757
+ lessons went unretrieved by either path over 48 days, and an exact lexical match with cosine 0.39 was
3758
+ silently dropped by the hook's cosine floor — a lexical hit `dz recall` would have surfaced.
3759
+
3760
+ The daemon's `op: recall` now calls `recallHybrid` itself — the SAME engine, SAME store, SAME
3761
+ ranking `dz recall` uses — under a time budget (`HOOK_RECALL_BUDGET_MS`, default 500 ms, below the
3762
+ hook's own 800 ms socket timeout). Every reply now carries an honest `engine` field:
3763
+
3764
+ - `engine: 'hybrid'` — `recallHybrid` answered inside the budget; `hits[].score` is an RRF rank
3765
+ normalized into `[0,1]` (`score / (2 / (RRF_K + 1))`, clamped — RRF_K=60 mirrors `vector-tier.ts`'s
3766
+ own constant).
3767
+ - `engine: 'cosine-fallback'` — the budget was exceeded, `recallHybrid`'s engine errored, or no core
3768
+ module was resolvable; the daemon falls back to TODAY'S brute-force cosine (unchanged, byte for
3769
+ byte) and reports `reason` alongside (e.g. `"budget exceeded (500 ms)"`).
3770
+
3771
+ The hook prints `engine`/`reason` to **stderr only** (`[dz-recall] engine=… reason=…`) — it never
3772
+ rides into `additionalContext`, so the model reading the prompt never sees it. The relevance floor
3773
+ the hook applies also depends on `engine`: a `cosine-fallback` reply keeps today's cosine-calibrated
3774
+ `DEFAULT_RECALL_FLOORS` (`recall-hook-policy.ts`) untouched; a `hybrid` reply is judged against its
3775
+ OWN placeholder floor (`DZ_RECALL_HOOK_SCORE_FLOOR`, currently `0.01`, deliberately permissive) —
3776
+ calibrating that floor on the real 281-pattern store is tracked as a follow-up measurement, named as
3777
+ a `TODO(08, FR-5)` at the constant's definition site.
3778
+
3779
+ **Recall-mode `'hook'` never moves the bandit's exposure counters.** The daemon calls
3780
+ `recallHybrid(PROJECT, prompt, { limit, mode: 'hook', deferExposures: true })` and never calls the
3781
+ returned `commitExposures(...)` — so a per-prompt recall (which would otherwise fire on every single
3782
+ turn) never counts as a bandit "exposure" the way an interactive `dz recall` does. `mode: 'hook'`
3783
+ itself ranks identically to `'hybrid'` (no weight change); it exists purely so the daemon's intent is
3784
+ visible end to end, alongside `deferExposures`, which is the field that actually withholds the write.
3785
+
3786
+ **The vector engine is now cached per process** (`getOrOpenEngine`, `vector-tier.ts`, FR-3): a
3787
+ long-lived caller like the daemon no longer re-runs the native-dependency probe
3788
+ (`isPackageInstalled`/`probeNativeDep`) on every single request — the resolved engine is kept keyed
3789
+ by `(projectRoot, mtime of .dz/agentdb.db)` and re-resolved only when that mtime changes (a `dz
3790
+ teach`/`consolidate` landed between requests). A short-lived CLI invocation is unaffected — the cache
3791
+ just gets populated once and discarded with the process, byte-identical to before this feature.
3792
+
3793
+ **`dz doctor`'s "apply-leg alive (embed daemon)" row now names the live engine** (FR-6): when the
3794
+ socket is alive it sends one `op: recall` probe (bounded at 1000 ms — comfortably above the 500 ms
3795
+ production budget default, see the honest NFR-1 discussion below) and appends `(engine: hybrid)` or
3796
+ `(engine: cosine-fallback)` to the detail line. A non-live fixture (no daemon actually listening)
3797
+ fails the probe near-instantly and the line is unchanged from before this feature.
3798
+
3799
+ **Honest NFR-1 finding (measured, not assumed).** The target was p95 daemon-answer ≤ 500 ms over 100
3800
+ real prompts from `.dz/recall-usage.jsonl`. MEASURED on this machine against the REAL 743-pattern
3801
+ production store, under the documented DEFAULT `HOOK_RECALL_BUDGET_MS=500` (script + numbers in
3802
+ `features/hook-recall-hybrid-parity/07_code_changes/change_manifest.md`): every single reply fell
3803
+ back to `engine: 'cosine-fallback'` — `resolveAgentdbEmbedder` (agentdb-index.ts, `EmbeddingService`)
3804
+ re-initializes the transformers pipeline on EVERY call with no cross-call caching (MEASURED
3805
+ standalone: 2–3.6 s per call, no warm-up across 3 repeated calls in one process), so a cold semantic
3806
+ leg routinely costs well over the 500 ms budget — NFR-1 is **not met** by the current architecture on
3807
+ this machine. Caching that embedder lives one layer below this feature's touched files
3808
+ (`agentdb-index.ts`, out of `hook-recall-hybrid-parity`'s scope) and is named as follow-up work in the
3809
+ manifest, not silently left unmeasured.
3810
+
3597
3811
  ### AgentDB self-learning algorithms
3598
3812
 
3599
3813
  When using `--memory agentdb`, the following algorithms automatically tune search quality:
@@ -5029,7 +5243,31 @@ refusal as the honest answer.
5029
5243
 
5030
5244
  ## Status
5031
5245
 
5032
- `harness-core v0.8.31` · `harness-cli v0.8.23` — **this release: the store guard tells "busy" from "broken",
5246
+ `harness-core v0.8.34` · `harness-cli v0.8.25` — **this release: the recall hook and `dz recall` share ONE hybrid
5247
+ engine, the embedder is cached per process, and every publish-gate verdict is a durable per-package audit record.**
5248
+ (0) Hook/CLI recall parity (`hook-recall-hybrid-parity`): the embed daemon answers `op: recall` through core's
5249
+ `recallHybrid` under a 500 ms budget (measured p95 100–190 ms on the real 743-pattern store, 99–100 of 100
5250
+ requests hybrid) with an honest cosine fallback labelled `engine`/`reason`, a warm-up at start, an in-flight cap,
5251
+ and an engine cache used ONLY by the hook (`dz recall` itself resolves fresh); `dz doctor` prints the engine.
5252
+ The agentdb embedder is cached per process (`agentdb-embedder-cache`: cold 2117 ms → warm 1 ms). Sibling-drift
5253
+ inventories come from `pnpm pack` — the live transport — so the LICENSE pnpm synthesises from the workspace root
5254
+ no longer reads as drift; every gate verdict is one fsync'd audit record per package with `sha256:<hex|n/a>`.
5255
+ Previous release (v0.8.33 / v0.8.25): `dz publish` refuses a broken pair, `dz setup`
5256
+ reads the memory backend from config, and the embed daemon says "ready" only with a socket that exists.
5257
+ (1) Sibling-drift gate + packed install smoke: before any live `npm publish`, every `workspace:*` sibling on
5258
+ the registry is compared with the workspace (dist/files/bin + the shipping fields of package.json); a
5259
+ drifted sibling BLOCKS the batch (`add <sibling> to the batch or publish it first`), and each package that
5260
+ declares a `bin` is packed post-bump, installed into a clean directory and asked `--version` — the exact
5261
+ incident of 2026-09-13 (a CLI published against a core that did not export what it imports) is now caught
5262
+ in the dry run. Transport is transactional: the first failed `npm publish` stops the batch. (2) `dz setup`
5263
+ without `--memory` takes the backend from `.dz/config.json` (`memory backend: agentdb (from .dz/config.json)`),
5264
+ downgrades only on an explicit `--memory jsonl` with a warning, and `dz doctor` gained `memory hooks match
5265
+ config` — all three session events must invoke `.dz/agentdb-writer.mjs` when config says agentdb.
5266
+ (3) A project whose `.dz/embed.sock` path exceeds the unix limit gets a short socket in a private
5267
+ `<tmpdir>/dz-<uid>/` directory (mode 0700) with an atomically published pointer `.dz/embed.sock.path`; the
5268
+ daemon prints `ready` only after the socket exists and exits 3 on a bind failure. (4) The qe-bridge signoff
5269
+ record carries `writeSequence` (diagnostic sequencing metadata) so the tests no longer race on file mtimes.
5270
+ Previous release (0.8.30/0.8.22): **the store guard tells "busy" from "broken",
5033
5271
  and a publish is not finished until the public mirror confirms it.** (1) The learning-store guard used to
5034
5272
  turn ANY read failure into `unreadable` and refuse the write; a neighbour holding the SQLite write lock
5035
5273
  (`SQLITE_BUSY`) or a store still being initialised (`no such table`) now gets bounded retries and, if still
@@ -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,CAmGhD,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,CAqGhD,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"}
@@ -25,6 +25,7 @@ export const BOOLEAN_CLI_FLAGS = new Set([
25
25
  'allow-cold-start',
26
26
  'allow-same-family',
27
27
  'allow-same-family-qe',
28
+ 'allow-sibling-drift',
28
29
  'any',
29
30
  'apply',
30
31
  'audit-dev',
@@ -55,6 +56,7 @@ export const BOOLEAN_CLI_FLAGS = new Set([
55
56
  'guards',
56
57
  'harmonize',
57
58
  'help',
59
+ 'include-drifted',
58
60
  'include-pairs',
59
61
  'init',
60
62
  'install',
@@ -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,kBAAkB;IAClB,mBAAmB;IACnB,sBAAsB;IACtB,KAAK;IACL,OAAO;IACP,WAAW;IACX,MAAM;IACN,OAAO;IACP,KAAK;IACL,WAAW;IACX,UAAU;IACV,WAAW;IACX,OAAO;IACP,cAAc;IACd,SAAS;IACT,KAAK;IACL,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,SAAS;IACT,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,OAAO;IACP,aAAa;IACb,kBAAkB;IAClB,SAAS;IACT,WAAW;IACX,oBAAoB;IACpB,mBAAmB;IACnB,QAAQ;IACR,OAAO;IACP,cAAc;IACd,iBAAiB;IACjB,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,aAAa;IACb,UAAU;IACV,MAAM;IACN,QAAQ;IACR,OAAO;IACP,aAAa;IACb,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;IACN,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,kBAAkB;IAClB,mBAAmB;IACnB,sBAAsB;IACtB,qBAAqB;IACrB,KAAK;IACL,OAAO;IACP,WAAW;IACX,MAAM;IACN,OAAO;IACP,KAAK;IACL,WAAW;IACX,UAAU;IACV,WAAW;IACX,OAAO;IACP,cAAc;IACd,SAAS;IACT,KAAK;IACL,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,iBAAiB;IACjB,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,SAAS;IACT,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,OAAO;IACP,aAAa;IACb,kBAAkB;IAClB,SAAS;IACT,WAAW;IACX,oBAAoB;IACpB,mBAAmB;IACnB,QAAQ;IACR,OAAO;IACP,cAAc;IACd,iBAAiB;IACjB,QAAQ;IACR,QAAQ;IACR,WAAW;IACX,aAAa;IACb,UAAU;IACV,MAAM;IACN,QAAQ;IACR,OAAO;IACP,aAAa;IACb,QAAQ;IACR,OAAO;IACP,QAAQ;IACR,KAAK;IACL,OAAO;IACP,OAAO;IACP,UAAU;IACV,MAAM;IACN,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
@@ -18,7 +18,7 @@ declare module '@dzhechkov/harness-core' {
18
18
  readonly execClaimedAt?: string;
19
19
  }
20
20
  }
21
- import { runSyncCodexHooks, type CodexHooksSyncReport, type BridgeFamily } from '@dzhechkov/harness-core';
21
+ import { runSyncCodexHooks, type CodexHooksSyncReport, type FetchPublished, type BridgeFamily } from '@dzhechkov/harness-core';
22
22
  import type { RecallPatternsOptions, TeachGuardResult, IntegrationOutcome } from '@dzhechkov/harness-core';
23
23
  /** Literal command inventory, pinned against the main dispatch switch by a layer-1 test. */
24
24
  export declare const DZ_COMMANDS: readonly string[];
@@ -112,6 +112,47 @@ export interface CliIo {
112
112
  readonly releaseRunner?: ReleaseExecRunner;
113
113
  /** Post-publish mirror command seam; production uses synchronous shell execution. */
114
114
  readonly publishMirrorRunner?: PublishMirrorRunner;
115
+ /**
116
+ * Test seam for `dz publish`'s sibling-drift gate (feature publish-sibling-drift-gate):
117
+ * overrides the registry fetch (production leaves it unset → real `npm pack` + extract into a
118
+ * temp dir). Tests inject a local directory instead of hitting the real registry.
119
+ */
120
+ readonly publishSiblingDriftFetcher?: FetchPublished;
121
+ /**
122
+ * Test seam for `dz publish`'s packed-install smoke: overrides the pack/install/`--version`
123
+ * subprocesses (production leaves it unset → real `execSync`, stdio piped). Mirrors
124
+ * {@link CliIo.releaseRunner}.
125
+ */
126
+ readonly publishPackedInstallRunner?: ReleaseExecRunner;
127
+ /**
128
+ * AM-1 (feature publish-sibling-drift-gate): overrides EVERY subprocess `publishPackages` would
129
+ * run on a LIVE publish — build, the `npm pack`/`npm publish <tgz>` packedTransport commands, and
130
+ * the `npm view` registry probes (production leaves it unset → real `execSync`, stdio piped).
131
+ * Threaded into `publishPackages`'s `exec` option so a test can drive the FULL live+packedTransport
132
+ * `cmdPublish` path (pack → smoke → publish → registry-confirm) with zero network and zero real
133
+ * `npm publish`.
134
+ */
135
+ readonly publishExecRunner?: (command: string, options: {
136
+ cwd?: string | URL | undefined;
137
+ stdio?: unknown;
138
+ encoding?: unknown;
139
+ timeout?: number | undefined;
140
+ env?: NodeJS.ProcessEnv | undefined;
141
+ }) => string;
142
+ /**
143
+ * Test seam for `dz publish`'s gate-audit writer (feature `publish-gate-audit-durable`, FR-2):
144
+ * overrides the fs primitives `appendPublishGateAudit` uses for its durable append (production
145
+ * leaves it unset → the real `node:fs` functions). Lets a test make `fsyncSync` throw to prove
146
+ * `(audit NOT logged: …)` is printed and the write is reported as failed, without touching any
147
+ * other seam's filesystem.
148
+ */
149
+ readonly publishGateAuditFsLayer?: PublishGateAuditFsLayer;
150
+ /**
151
+ * AM-5 (feature publish-gate-audit-durable): test seam for the sibling-drift gate's `npm pack
152
+ * --dry-run --json` call (production leaves it unset → real `execFileSync`). Takes the package
153
+ * dir, returns raw stdout, or throws to simulate a real `npm` failure without spawning anything.
154
+ */
155
+ readonly publishNpmPackRunner?: (dir: string) => string;
115
156
  /**
116
157
  * Test seam for `dz install`: overrides the `npm install` subprocess (production leaves
117
158
  * it unset → real `execSync`, stdio piped). A stub runner that pre-stages a fixture
@@ -219,6 +260,29 @@ export declare function codexHooksSummary(report: CodexHooksSyncReport, label?:
219
260
  export declare function deliverCodexHooks(input: CodexHooksSyncInput, sync?: (options: Parameters<typeof runSyncCodexHooks>[0]) => CodexHooksSyncReport, label?: string): CodexHooksSummary & {
220
261
  readonly report: CodexHooksSyncReport;
221
262
  };
263
+ /**
264
+ * fs primitives `appendPublishGateAudit` needs for its durable write (FR-2), injectable so a test
265
+ * can make `fsyncSync` throw without touching the real filesystem underneath every OTHER seam this
266
+ * function shares with production. Left unset in production → the real `node:fs` functions above.
267
+ */
268
+ interface PublishGateAuditFsLayer {
269
+ readonly existsSync: (path: string) => boolean;
270
+ readonly mkdirSync: (path: string, opts: {
271
+ recursive: boolean;
272
+ }) => void;
273
+ readonly openSync: (path: string, flags: number) => number;
274
+ /**
275
+ * AM-2 (Codex round-1 review, finding 2, high): `Buffer`, not `string` — a SHORT write must
276
+ * resume at the exact BYTE it stopped at, and a string-based API cannot express that safely once
277
+ * the data contains any multi-byte UTF-8 character (re-encoding a slice of an already-partial
278
+ * string can silently produce different bytes than the ones actually pending). The real
279
+ * `node:fs.writeSync` accepts a `Buffer` directly (no re-encoding), so this changes nothing about
280
+ * what production writes.
281
+ */
282
+ readonly writeSync: (fd: number, data: Buffer) => number;
283
+ readonly fsyncSync: (fd: number) => void;
284
+ readonly closeSync: (fd: number) => void;
285
+ }
222
286
  export declare function boundedMutationGateOutputTail(output: string): string | undefined;
223
287
  /** Test seam for the chokepoint: NEW-C4's proof needs to call it with a hostile pid. */
224
288
  export declare function __wfSignalChildTestSeam(child: unknown, signal: string, detached: boolean): boolean;
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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"}