dsh-completion-guard 0.9.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,14 +2,60 @@
2
2
 
3
3
  All notable changes to this project are documented here. The project is pre-1.0; release versions track the plugin lifecycle, not stabilised API promises.
4
4
 
5
- ## 0.9.0
5
+ Each entry describes that version. Historical host ranges, defaults, plans and candidate validation results are not current setup instructions or proof that a later release passed. Use [installation and first load](docs/GETTING_STARTED.md) for the current setup and [acceptance records](docs/LOCAL_ACCEPTANCE.md) for version-specific evidence.
6
+
7
+ <details>
8
+ <summary>Version index</summary>
9
+
10
+ [0.11.0](#0110) · [0.10.0](#0100) · [0.9.0](#090) · [0.8.4](#084) · [0.8.3](#083) · [0.8.2](#082) · [0.8.1](#081) · [0.8.0](#080) · [0.7.1](#071---2026-09-22) · [0.7.0](#070---2026-09-21) · [0.6.3](#063---2026-09-18) · [0.6.2](#062---2026-09-16) · [0.6.1](#061-2026-09-15) · [0.6.0](#060---2026-09-14) · [0.5.3](#053---2026-09-14) · [0.5.2](#052---2026-09-11) · [0.5.1](#051---2026-09-10) · [0.5.0](#050---2026-09-10) · [0.4.3](#043---2026-09-08) · [0.4.2](#042---2026-09-07) · [0.4.1-rc.1](#041-rc1---2026-09-04) · [0.4.0](#040---2026-09-02) · [0.3.2](#032---2026-09-01) · [0.3.1](#031---2026-08-31) · [0.3.0](#030---2026-08-31) · [0.2.1](#021---2026-08-28) · [0.2.0](#020---2026-08-28) · [0.1.2](#012---2026-08-27) · [0.1.1](#011---2026-08-27) · [0.1.0](#010---2026-08-27)
11
+
12
+ </details>
13
+
14
+ ## 0.11.0
15
+
16
+ - **Upgrade DSH to `0.2.1-rc.3` or later before installing Guard 0.11.0.** Package declarations, runtime admission and the default audited cohort now use rc.3 as the minimum. Existing session and Guard data protocols remain compatible; rc.2 identities are retained as historical evidence.
17
+
18
+ - **Host-lock injection preserves JSON-shaped patch sequences.** The managed entry stays inside the sequence, with user entries retained. Existing block YAML, inline flow values, activation and disabled-only overrides remain supported. Invalid syntax, duplicate keys, ambiguous Guard fields and malformed managed markers refuse before profile mutation; the bundled YAML reader does not evaluate `!!js` expressions. Full composition and native loading remain separate checks.
19
+
20
+ - **Known upstream risk:** for this 0.11.0 release, the maintainer explicitly accepted three Undici 8.11.2 high-risk findings through **2026-11-05 inclusive**. The signed host remains unfixed; see the [risk scope and expiry](docs/DEPENDENCY_SCAN.md). We will update after the upstream fixed chain is verified.
6
21
 
7
- - Explicit readable-subset migration: read-only `inventory` distinguishes the official old-format refusal from errors, and `select` freezes user-chosen IDs. Selected inspect/adopt/verify checks the entire inventory for drift, preserves original logs/old-mode sources and reports selected completion with excluded rows pending. The whole-inventory default stays fail-closed; see the bilingual command and AI-prompt guide.
22
+ - Default host audits check declared files and dependency routes without scanning unrelated directories. Audits backed by a qualification receipt continue to check the complete file inventory.
23
+
24
+ - **Reviewed Chinese instruction forms such as 请分别执行 no longer create false bans.** Words such as 分别 stay intact in those forms; genuine bans such as 这个别推送 and 完成前别 remain in force.
25
+
26
+ - **Long host-lock configuration exports now reach pipes in full.** `verify-dump` explicitly reports that it checks only Guard lock fields; complete configuration parsing and host loading remain separate checks.
27
+
28
+ - **The activation CLI supports official rc.3 persistence exports.** Inventory and explicit mode adoption accept both the default-plugin and namespace-plugin module shapes, and reject invalid modules before persistence access.
29
+
30
+ - **Release tgz identity is now read through one auditable tar subset.** Guard, npm and every release stage agree on which `package.json` the bytes encode: resolution, the final pre-effect check and post-publish readback all use one strict reader that validates header checksums, models ustar prefixes and npm's path normalization, and refuses links, PAX/GNU extensions, duplicate normalized names and paths outside `package/`. A crafted archive whose two manifests disagree (prefix shadowing plus `./` aliasing) is rejected before any authorization, so a publish can no longer be bound to one package name while npm installs another. Reading is bounded on every axis — compressed bytes actually read, decompressed output, member size, member count and manifest size — so a high-ratio archive can no longer stall the host before authorization completes.
31
+ - **The registry readback owns its deadline and body budget.** Post-publish reconciliation reads the exact-version registry document under a plugin-owned total deadline combined with the caller's cancellation, streams the response under a hard byte budget, and releases the reader on every exit. A slow, hanging or oversized registry ends within the recorded budget with a stable refusal; the attempt stays in flight, no settlement is written from a refused readback, and a publish is never re-sent.
32
+ - **Private storage protection follows the official working directory.** The Bash/Pwsh guard now reads the official `workdir` parameter (absolute, relative or symlink-aliased) instead of a field no host sends, resolves relative file targets against the caller's trusted effective directory — the last committed working-directory epoch — and fails closed when a relative target has no provable base. The same matrix is enforced through the registered production guard, not just the helper.
33
+ - **File readback binds to the directory that governed the call.** After a committed `working-directory/change`, the independent file observer reads a relative edit target against the cwd epoch of the call's own sequence, not the immutable header directory and not the current end-of-log directory. A later directory change can no longer rebind a completed effect to a different same-named file; an unreadable timeline refuses relative targets while absolute targets stay observable.
34
+ - **Sanitization now strips URL credentials and the documented token families.** `user:password@` is removed from URLs by structure, and the bounded GitHub token spellings (`ghp_`/`gho_`/`ghu_`/`ghs_`/`ghr_`/`github_pat_`) are redacted before normalized text, URL subjects or recovery packets are stored. The [privacy note](docs/PRIVACY.md) states the exact pattern set and its limits; capture→replay digests stay deterministic and historical digests are never silently recomputed.
35
+ - **One interrupted anchor write no longer damages other sessions.** A torn final line in the shared session-anchors file is treated as an uncommitted append: every complete line stays authoritative for its session, the next lock holder repairs the tail before appending, and invalid middle lines or conflicting anchors still refuse for every session.
36
+ - **A qualified first creation survives a brief writer-lock race.** When a new startup session's activation write loses a short lock race, the runtime retries the same creation while its intent is still provable — within a bounded budget — and then reports the explicit `activation_writer_unavailable` status. The retry is same-value and idempotent, and never applies to resume, late attach or a deleted binding.
37
+ - **Plain forks are root conversations again.** `parentSession` is fork lineage, not delegation: first-step boundary and guidance, work units and confirmation semantics now apply to ordinary and resumed forks, while the host's explicit subagent markers (`origin=subagent`, positive `delegationDepth`) keep the delegated restrictions. Contradictory markers stay delegated.
38
+ - The rc.3 core graph has registry-verified package identities and implementation digests. Its official macOS arm64 and Windows x64 Desktop distributions have separately registered vendor signatures and signed archive identities. Installation, lifecycle, real-model and UI performance acceptance remain separate gates.
39
+ - **The release tgz identity survives file growth.** The audited tar reader now reads to a confirmed end of file in bounded chunks and binds the identity to the complete bytes actually read, so an artifact that grows after the metadata check can no longer be accepted on its old prefix digest. Private-storage protection refuses a shell or file call whose default directory cannot be proven (no trusted working directory), and URL credential stripping follows URL authority semantics for any scheme, case-insensitively, without treating a legal authority quote as a terminator. Observing an activation binding from any writer permanently retires the new-session first-creation retry, so a later deletion can never recreate the file. Registry reconciliation releases every response body — including error responses and bodies that stall — under the combined deadline. The dependency advisory gate now honors the scanner's exit protocol (a failed scan never reads as clean), matches exceptions against every installed finding version, and records real GitHub advisory identifiers. Anchor writes inject real boundary faults (partial write, failed fsync, failed tail repair) in the regression suite: committed peers stay readable and the next writer repairs an uncommitted tail.
40
+ - **Migration inventories accept `0.10.x` as the previous package version**, so upgrading from 0.10.0 keeps the documented activation-migration path; earlier-version rules are unchanged.
41
+ - **A fail-closed dependency advisory gate is now part of required CI.** The new `dependency-scan` job blocks on any unaccepted high/critical advisory and fails when the scan itself cannot complete; accepted exceptions live in a validated, expiring table documented in [the dependency advisory gate](docs/DEPENDENCY_SCAN.md). The development chain moved to vitest 4.1.12 (dropping the vulnerable tinypool 1.x pool) with compatible vite and source-map-js floors.
42
+
43
+ ## 0.10.0
44
+
45
+ - **Upgrade DSH before installing Guard 0.10.0.** The minimum host is `0.2.1-rc.2`, with no implied upper limit. Preserve old-session modes and configuration, upgrade the host, install Guard, then rebuild and read back each profile's host lock before re-enabling it. Old locks and completion certificates do not transfer to a changed graph. See [compatibility and upgrade boundaries](docs/COMPATIBILITY.md#0100-dsh-021-rc2) for the reviewed host identities and the separate market, load and admission checks.
46
+ - **Job lifecycle events refine external waits without ever completing work.** A validated `job/registered`/`job/settled` pair owned by the current session can end its pending external wait; a healthy orphan settlement remains audit-only: a `completed` settlement counts as finished only when the producer itself reported fulfilment; killed and failed settlements are explicit failures, and an unreported completion stays unconfirmed. A settlement never certifies resource cleanup, file readback or a user obligation — the model still owes the verification. The recorded owner never transfers to a forked or resumed copy of the history.
47
+ - **Working-directory changes no longer re-interpret captured evidence.** Each committed `working-directory/change` opens a new cwd epoch: targets, paths and receipts keep the meaning of the epoch they were captured in, and the session's original project directory stays immutable in the header. Shell workdir receipts bind the audited cwd provider and an epoch-bound v2 shape. A directory change while a call is in flight leaves its cwd-dependent execution unconfirmed; replay cannot reassign it to the new directory. Historical logs without cwd-change events preserve the 0.9.0 frozen projection under the same host binding, and preserve its evidence fields and digests, including explicit relative workdirs; later events cannot rewrite completed legacy facts.
48
+ - **Experimental `plugin:` records are retained-and-skipped.** They never trigger capture, never authorize anything and never break tool pairing; Guard's own private ledger is not migrated onto them. Guard never imported the removed upstream invariant companions, and synchronous `snapshotEvents()` reads remain valid on the pinned host.
49
+ - **Qualify retained official Desktop distribution files separately.** Exact release/header and independently reproduced source-byte pins cover eight retained invariant companions without adding them to the registry inventory. Vendor signatures, ordinary module bytes and active routes remain mandatory. Physical pnpm `11.7.0` and `11.28.5` profiles must agree with the carrier; both v2 no-op gates remain strict. Native fixtures bind newly allocated temporary roots to physical paths before deriving evidence targets, preserving exact readback assertions. See [Desktop distribution qualification](docs/COMPATIBILITY.md#official-desktop-distribution-bytes).
50
+ - **Subagent, Team inbox and Goal-waiting semantics carry over unchanged.** A `subagent` tool result stays bounded evidence that cannot close a parent obligation; direct inbox delivery records reception, not execution; waiting for a subtask, a plan-review end turn or a paused Goal neither fabricates nor consumes a completion.
51
+ - **Migration inventories now accept `0.9.x` as the previous package version**, so upgrading from 0.9.0 keeps the documented activation-migration path; earlier-version rules are unchanged. Development dependencies pin DSH `0.2.1-rc.2`, and the shipped floor is pinned against the official app-boot consumer's real admission decisions.
52
+
53
+ ## 0.9.0
8
54
 
9
- - **Major default-mode change:** new root sessions default to `always`, with no Guard T0 log writes and protection from the first real input. Existing sessions retain their pre-upgrade effective mode via verified write-once bindings. Prepare old-mode inventory before upgrade and use the packaged inspect/adopt/verify migration flow; mixed cohorts need exact mappings. Unknown, damaged or conflicting bindings refuse certification. Explicit configuration selects new root sessions; persisted off/on stays effective. Policy remains `standard`, with no automatic authority or certificate grant.
10
- - Per-session adoption preserves the old replay epoch and valid certificates without rewriting history or re-signing. Fresh restore reads the binding on every sync; deletion or replacement invalidates cached certification. Forks inherit the verified parent mode and the official host's exact inherited cut. See [migration and rollback](docs/ACTIVATION_MIGRATION.md) for partial recovery and storage capability limits.
11
- - Repeated session syncs reuse proofs of fully frozen event subtrees, avoiding another recursive walk of unchanged history after an append. Mutable, accessor-backed, cyclic and unfinished graphs stay ineligible for reuse; Goal, private-ledger and host-sensitive decisions retain their fresh checks. Desktop audits share ASAR indexes and verified bytes only within one audit operation. These reduce component work; they do not establish faster history-window opening or UI end-to-end latency.
12
- - Adds a read-only local-history measurement script that reports anonymous per-session read, decompression, JSON parsing and pure Guard-fold timings. It inventories historical log generations without migrating or certifying them and excludes runtime migration, private-ledger, host audits, IPC and rendering.
55
+ - **New root sessions now default to `always` when `activation` is omitted.** Explicit `opt-in` remains supported. Protection begins with the first real input; Guard adds no session events before it. Existing sessions, including empty ones, keep their verified pre-upgrade mode. Saved `off`/`on` remains effective. Explicit settings that contradict a bound mode are refused; [omit the override after migration](docs/GETTING_STARTED.md#choose-the-default-for-new-sessions) to use the new default while preserving old modes. The default policy stays `standard`: activation grants no execution or publication authority and does not automatically certify completion.
56
+ - **Upgrade existing installations before reopening sessions.** Stop the relevant writers, preserve the old package and effective mode sources, and freeze the old-session inventory before replacement. After installation, rebuild the host lock, adopt the preserved modes and verify them before startup. Missing, conflicting or damaged bindings remain uncertified. History and valid old certificates are retained without rewriting or re-signing. See [migration and rollback](docs/ACTIVATION_MIGRATION.md).
57
+ - **Expect a history-loading wait.** First opening or restoring a session with history loads it and rebuilds Guard state; “载入历史” may appear, and later visits can still wait. The cache reuses completed history checks only when it can verify that the history is unchanged and the results are safe to reuse; a single Desktop installation check also reuses application files already read and verified. Each operation still checks the current mode and performs the required fresh checks of Goal state, private records and the host environment. The official host's history-view lifecycle and decode cache are unchanged; this is not a promise to eliminate UI waits. A read-only measurement script separates local read, decompression, JSON parsing and pure Guard replay timings from runtime migration, IPC and rendering.
58
+ - **Migrate an explicitly chosen readable subset when the official host refuses old formats.** `inventory` reports the full scope; `select` freezes chosen IDs. Use the same `--selection` throughout inspect/adopt/verify. Exclusions retain their original logs and mode sources and remain pending; `selected_complete` does not mean the whole inventory completed. Other errors still abort. The [guide](docs/ACTIVATION_MIGRATION.md) includes commands, recovery and copyable AI prompts.
13
59
 
14
60
  ## 0.8.4
15
61
 
@@ -186,8 +232,7 @@ exact-artifact native annexes attached to the versioned Release.
186
232
 
187
233
  ### Validation
188
234
 
189
- This is a source release candidate. Local checks and remaining CI,
190
- native T06, exact-artifact and publication gates are recorded in
235
+ At preparation, this entry recorded a source release candidate. Its local checks and then-pending CI, native T06, exact-artifact and publication gates are recorded in
191
236
  [local acceptance](docs/LOCAL_ACCEPTANCE.md) and the
192
237
  [release plan](https://github.com/GreenLv/dsh-completion-guard/blob/784b5452b0da366a351dff6490fa46eeed2839a9/docs/RELEASE_PLAN_0_6_2.md).
193
238
 
@@ -205,7 +250,128 @@ Repairs attachment handling, conservative request interpretation, discovery pagi
205
250
 
206
251
  The new interpretation records and reasons are additive. Attachment capture text retains its 0.6.0 bytes; an old log without interpretation records keeps pending attachments. Source checks, CI, frozen-artifact acceptance and native Web/Headless acceptance are separate results recorded in [LOCAL_ACCEPTANCE](docs/LOCAL_ACCEPTANCE.md). The local test-host cleanup now disposes persistence hosts explicitly to prevent FileHandle garbage-collection errors. No platform or publication result is implied by this changelog.
207
252
 
208
- ## 0.6.0 third repair round after targeted review (2026-09-14)
253
+ ## 0.6.0 - 2026-09-14
254
+
255
+ Brings ordinary DSH tasks through entry, execution, delivery and recovery under one rule set, adding selected shared Context Guard behaviors. Cross-language parity and a formal v2 mirror were not yet established in this version. Everything before the new protocol boundary keeps its original meaning; nothing is reinterpreted or relabelled.
256
+
257
+ The repair rounds below belong to this same version, not additional releases. They retain the original findings, scope decisions and test evidence; read the initial candidate behavior together with these corrections.
258
+
259
+ ### Added
260
+
261
+ - **Answer delivery is tracked separately from execution certification.** A
262
+ question or explanation is closed only by the host's own evidence: an
263
+ `assistant/message` in the turn's final step, with no interrupted marker,
264
+ followed by `turn/end` with `reason.kind: "completed"`. A status summary, a
265
+ draft, an intermediate reply, another turn's answer, a subagent's answer, or
266
+ an aborted turn never closes anything. `answered` means "the answer was
267
+ handed over" — never that it was right, complete, or executed.
268
+ - **Work units with a required-descendant closure.** Tasks are grouped into
269
+ derived units. A delegation-marked instruction opens a child unit whose open
270
+ work is required by the parent's closure, so delegating a sub-task can never
271
+ drop the parent's own work; an ordinary task switch opens a sibling that does
272
+ not block the newer task. A subagent's result is bounded evidence: it is
273
+ recorded and visible, and it never closes a parent obligation.
274
+ - **Ancestor constraints stay in force.** A prohibition or an unsatisfied
275
+ condition the root declared in an earlier unit continues to govern the same
276
+ action and target in a later one, and the certifier refuses those bindings
277
+ before examining evidence.
278
+ - **Proof v2 with a real capability matrix.** Five new proof kinds — input
279
+ asset check, output visual readback, object/URL readback, execution fact, and
280
+ external fact — each bind a current subject, a declared source, and a real
281
+ operation. A successful tool call is only ever an execution fact: a browser
282
+ call that merely returned cannot prove an image was looked at, an input asset
283
+ check must be a prior-state fact, and a delegated subagent result is never a
284
+ proof source. When the installed host exposes no producer, the result is
285
+ `unavailable`, never a silent pass. The old three-kind manifest and its digest
286
+ domain are unchanged and remain readable.
287
+ - **Explicit release tickets.** A release contract is adopted only by an
288
+ explicit root command. Once adopted, each operation spends one reservation,
289
+ written before the effect and settled afterwards from a trusted readback.
290
+ Wrong candidate SHA, ref, artifact digest or version, an expired or
291
+ unevaluable ticket, a consumed ticket, a replay, an operation that is already
292
+ in flight, an unresolved target, and an opaque runner are all refused before
293
+ any effect. A "release" keyword, a loaded Skill, or an installation never
294
+ adopts a contract.
295
+ - **A strict proof tier.** On top of the default `standard` tier, a visual or
296
+ complete-scope verification the user explicitly asked for must be discharged
297
+ by a real readback fact. Strict adds no approval step to ordinary actions, and
298
+ installing never enters the `release` tier.
299
+ - **One diagnosis language.** Every incomplete item now reports one of seven
300
+ classes — parameter missing, source insufficient, condition unmet, producer
301
+ capability unavailable, historical gap, integrity failure, policy boundary —
302
+ next to its exact reason code. `/context-guard migration` reports which rule
303
+ set is in force, which obligations keep their pre-0.6.0 rules, and what a
304
+ rollback requires.
305
+ - **A host-neutral v2 conformance fixture** covering S01–S12 through the real
306
+ derive/delivery/closure/Goal chains. Every expectation is compared against a
307
+ value computed from the events and the production projection alone; the runner
308
+ never reads an expectation to decide an actual result.
309
+
310
+ ### Changed
311
+
312
+ - A document "update" or "modify" is decided by the object, not by the verb:
313
+ a recognized document noun becomes a bounded `modify` the assistant may
314
+ resolve to an exact file inside the captured scope and type, while an
315
+ unrecognized object keeps its honest unresolved reading instead of being
316
+ forced into an action.
317
+ - A trusted answer from the host's own question tool now narrows where a
318
+ bounded file choice may land, and is recorded separately from sandbox
319
+ approvals. Pasted or restated answer text forms nothing.
320
+ - A later root instruction that contains a pending generic obligation verbatim
321
+ supersedes it atomically, keeping both revisions. Explanations, prohibitions
322
+ and waits never delete an obligation by similar wording.
323
+ - `/context-guard status` reports the active policy tier, the reason-class
324
+ histogram, the migration facts, and the release state.
325
+
326
+ ### Fixed
327
+
328
+ - The first step of a session now sees the input persisted in that same step,
329
+ and a failed durability flush reports an explicit unavailability instead of
330
+ serving a stale projection.
331
+ - The v2 conformance runner computes `interpreted`, `closure`, `delivery`,
332
+ `turn_bound` and the correction decision from production state instead of from
333
+ the fixture's own expectations.
334
+ - A malformed release record is reported as a bounded diagnostic and never
335
+ marks the whole session corrupt, so damaged release state cannot block
336
+ unrelated ordinary work.
337
+
338
+ ### Migration and rollback
339
+
340
+ - The 0.6.0 semantics start at the new `Context Guard protocol boundary:
341
+ v5.0.0` notice, written at the first real root-input step of a new session.
342
+ An older binary ignores that notice, so a rollback fails closed instead of
343
+ misreading new records.
344
+ - A session that never wrote the boundary keeps the previous whole-session
345
+ contract, version-1 certificates, and its old digest domains.
346
+ - A session that wrote it keeps pre-boundary obligations under their birth
347
+ rules while new work uses units, delivery and version-2 certificates.
348
+ - Rolling back to 0.5.x requires restoring a 0.5.x state snapshot. Replaying a
349
+ 0.6.0 log with 0.5.x fails closed with `certificate_replay_mismatch`; never
350
+ migrate new-schema data down by hand.
351
+
352
+ ### Not yet established
353
+
354
+ - **Cross-language parity and the canonical mirror are not done.** The
355
+ upstream `codex-context-guard` repository has not landed a frozen v2 fixture,
356
+ so the v2 file here is explicitly a DSH-authored *candidate*
357
+ (`2.0.0-candidate.1`, `status: "dsh-candidate"`). `UPSTREAM_PIN.json` still
358
+ pins the unchanged v1 mirrors and is not refreshed by this release.
359
+ - The `release` tier protects only surfaces Guard itself routes. Publishing an
360
+ npm artifact through the Guard-owned action tool is protected; `git tag`, the
361
+ GitHub Release operations, and any composite runner have no interception
362
+ point in this host and are refused before effect rather than pretended to be
363
+ covered. A trusted in-process caller that bypasses Guard entirely is a host
364
+ trust boundary, documented rather than denied.
365
+ - After a publish, the settlement stays `unconfirmed` unless the registry
366
+ readback producer answers; an unconfirmed operation is never re-sent.
367
+ - Deterministic tests, CI, native macOS/Windows acceptance, publication and
368
+ installation are separate evidence scopes. This release records source and
369
+ deterministic evidence; native acceptance and publication follow separately.
370
+
371
+ <details>
372
+ <summary>Pre-release review and repair details for 0.6.0</summary>
373
+
374
+ ### 0.6.0 third repair round after targeted review (2026-09-14)
209
375
 
210
376
  Two findings from the targeted review of `fcc3813`, both fixed.
211
377
 
@@ -233,13 +399,15 @@ projection still valid), a certificate that existed at adoption is frozen by
233
399
  identity and survives a later obligation,
234
400
  and invalid/mistyped adopt input leaves a valid contract usable.
235
401
 
236
- ## 0.6.0 second repair round after follow-up review (2026-09-14)
402
+ ### 0.6.0 second repair round after follow-up review (2026-09-14)
237
403
 
238
404
  A follow-up review of the repair commit found five remaining defects in the new
239
405
  wiring. All five reproduced and are fixed. The reviewer's counterexamples are
240
406
  kept as permanent regression cases in the suites they belong to.
241
407
 
242
- ### Fixed
408
+ The changes below also include a new recovery entrypoint supporting those fixes; the list is not a one-to-one count of the five findings.
409
+
410
+ #### Fixed
243
411
 
244
412
  - **Adding the v5 boundary no longer answers a pre-v5 question.** Deliveries were
245
413
  only gated by the watermark of their own turn; appending the boundary at the
@@ -284,7 +452,7 @@ kept as permanent regression cases in the suites they belong to.
284
452
  valid certificate. Signing, persistence and replay use the same call argument,
285
453
  and the Goal gate consumes only a certificate whose proof still binds.
286
454
 
287
- ### Verification
455
+ #### Verification
288
456
 
289
457
  - The reviewer's five follow-up counterexamples pass and remain as regression
290
458
  cases: pre-v5 delivery, read-only status, the frozen candidate closure, the
@@ -302,7 +470,7 @@ kept as permanent regression cases in the suites they belong to.
302
470
  - The proof suite gained the missing-proof, Goal-consumption and
303
471
  accurate-evidence-boundary cases.
304
472
 
305
- ### Evidence boundary
473
+ #### Evidence boundary
306
474
 
307
475
  The release chain test pins the audited host cohort through an explicit
308
476
  `RuntimeExecutorSeams.hostLock` acceptance seam, because the host-lock
@@ -311,13 +479,13 @@ host-lock evaluation; the release gate, the reservation and settlement records,
311
479
  the evidence producers and the replay are the production ones, and the host lock
312
480
  keeps its own suites and native acceptance.
313
481
 
314
- ## 0.6.0 repairs after concentrated review (2026-09-14)
482
+ ### 0.6.0 repairs after concentrated review (2026-09-14)
315
483
 
316
484
  A concentrated review of the `0dce898` candidate produced fifteen targeted
317
485
  counterexamples; all fifteen reproduced a real defect. This section records the
318
486
  repair. The stable finding numbers (`F01`–`F08`, `R1`–`R15`) are the reviewer's.
319
487
 
320
- ### Fixed
488
+ #### Fixed
321
489
 
322
490
  - **F01 certificate replay was timing-dependent.** Deliveries were applied after
323
491
  the whole log was replayed, so a checkpoint recorded in a later turn was
@@ -373,7 +541,7 @@ repair. The stable finding numbers (`F01`–`F08`, `R1`–`R15`) are the reviewe
373
541
  production-chain suite drives producer → persisted log → derive → checkpoint →
374
542
  replay.
375
543
 
376
- ### Scope rulings (coordinator, 2026-09-14)
544
+ #### Scope rulings (coordinator, 2026-09-14)
377
545
 
378
546
  Two scope facts were decided once, and both are recorded as fact rather than as
379
547
  a general parity claim:
@@ -393,7 +561,7 @@ a general parity claim:
393
561
  The plugin therefore does not claim "C01–C12 core alignment" with Codex Context
394
562
  Guard, and it does not claim a complete release coverage surface.
395
563
 
396
- ### Verification
564
+ #### Verification
397
565
 
398
566
  The reviewer's fifteen counterexamples are kept as
399
567
  `tests/domain/review-counterexamples.test.ts` and now pass; the expectations
@@ -404,124 +572,7 @@ cases, including a real certified closure and every identity refusal), and the
404
572
  extended v2 fixture (S09 proof binding, per-timeline release probes, and the
405
573
  scope-attribution table).
406
574
 
407
- ## 0.6.0 - 2026-09-14
408
-
409
- This release makes ordinary DSH work enter, execute, deliver, and resume under
410
- one set of rules. It also closes the substantive gaps against the shared
411
- Context Guard semantics. Everything before the new protocol boundary keeps its
412
- old meaning; nothing is re-read or re-labelled.
413
-
414
- ### Added
415
-
416
- - **Answer delivery is tracked separately from execution certification.** A
417
- question or explanation is closed only by the host's own evidence: an
418
- `assistant/message` in the turn's final step, with no interrupted marker,
419
- followed by `turn/end` with `reason.kind: "completed"`. A status summary, a
420
- draft, an intermediate reply, another turn's answer, a subagent's answer, or
421
- an aborted turn never closes anything. `answered` means "the answer was
422
- handed over" — never that it was right, complete, or executed.
423
- - **Work units with a required-descendant closure.** Tasks are grouped into
424
- derived units. A delegation-marked instruction opens a child unit whose open
425
- work is required by the parent's closure, so delegating a sub-task can never
426
- drop the parent's own work; an ordinary task switch opens a sibling that does
427
- not block the newer task. A subagent's result is bounded evidence: it is
428
- recorded and visible, and it never closes a parent obligation.
429
- - **Ancestor constraints stay in force.** A prohibition or an unsatisfied
430
- condition the root declared in an earlier unit continues to govern the same
431
- action and target in a later one, and the certifier refuses those bindings
432
- before examining evidence.
433
- - **Proof v2 with a real capability matrix.** Five new proof kinds — input
434
- asset check, output visual readback, object/URL readback, execution fact, and
435
- external fact — each bind a current subject, a declared source, and a real
436
- operation. A successful tool call is only ever an execution fact: a browser
437
- call that merely returned cannot prove an image was looked at, an input asset
438
- check must be a prior-state fact, and a delegated subagent result is never a
439
- proof source. When the installed host exposes no producer, the result is
440
- `unavailable`, never a silent pass. The old three-kind manifest and its digest
441
- domain are unchanged and remain readable.
442
- - **Explicit release tickets.** A release contract is adopted only by an
443
- explicit root command. Once adopted, each operation spends one reservation,
444
- written before the effect and settled afterwards from a trusted readback.
445
- Wrong candidate SHA, ref, artifact digest or version, an expired or
446
- unevaluable ticket, a consumed ticket, a replay, an operation that is already
447
- in flight, an unresolved target, and an opaque runner are all refused before
448
- any effect. A "release" keyword, a loaded Skill, or an installation never
449
- adopts a contract.
450
- - **A strict proof tier.** On top of the default `standard` tier, a visual or
451
- complete-scope verification the user explicitly asked for must be discharged
452
- by a real readback fact. Strict adds no approval step to ordinary actions, and
453
- installing never enters the `release` tier.
454
- - **One diagnosis language.** Every incomplete item now reports one of seven
455
- classes — parameter missing, source insufficient, condition unmet, producer
456
- capability unavailable, historical gap, integrity failure, policy boundary —
457
- next to its exact reason code. `/context-guard migration` reports which rule
458
- set is in force, which obligations keep their pre-0.6.0 rules, and what a
459
- rollback requires.
460
- - **A host-neutral v2 conformance fixture** covering S01–S12 through the real
461
- derive/delivery/closure/Goal chains. Every expectation is compared against a
462
- value computed from the events and the production projection alone; the runner
463
- never reads an expectation to decide an actual result.
464
-
465
- ### Changed
466
-
467
- - A document "update" or "modify" is decided by the object, not by the verb:
468
- a recognized document noun becomes a bounded `modify` the assistant may
469
- resolve to an exact file inside the captured scope and type, while an
470
- unrecognized object keeps its honest unresolved reading instead of being
471
- forced into an action.
472
- - A trusted answer from the host's own question tool now narrows where a
473
- bounded file choice may land, and is recorded separately from sandbox
474
- approvals. Pasted or restated answer text forms nothing.
475
- - A later root instruction that contains a pending generic obligation verbatim
476
- supersedes it atomically, keeping both revisions. Explanations, prohibitions
477
- and waits never delete an obligation by similar wording.
478
- - `/context-guard status` reports the active policy tier, the reason-class
479
- histogram, the migration facts, and the release state.
480
-
481
- ### Fixed
482
-
483
- - The first step of a session now sees the input persisted in that same step,
484
- and a failed durability flush reports an explicit unavailability instead of
485
- serving a stale projection.
486
- - The v2 conformance runner computes `interpreted`, `closure`, `delivery`,
487
- `turn_bound` and the correction decision from production state instead of from
488
- the fixture's own expectations.
489
- - A malformed release record is reported as a bounded diagnostic and never
490
- marks the whole session corrupt, so damaged release state cannot block
491
- unrelated ordinary work.
492
-
493
- ### Migration and rollback
494
-
495
- - The 0.6.0 semantics start at the new `Context Guard protocol boundary:
496
- v5.0.0` notice, written at the first real root-input step of a new session.
497
- An older binary ignores that notice, so a rollback fails closed instead of
498
- misreading new records.
499
- - A session that never wrote the boundary keeps the previous whole-session
500
- contract, version-1 certificates, and its old digest domains.
501
- - A session that wrote it keeps pre-boundary obligations under their birth
502
- rules while new work uses units, delivery and version-2 certificates.
503
- - Rolling back to 0.5.x requires restoring a 0.5.x state snapshot. Replaying a
504
- 0.6.0 log with 0.5.x fails closed with `certificate_replay_mismatch`; never
505
- migrate new-schema data down by hand.
506
-
507
- ### Not yet established
508
-
509
- - **Cross-language parity and the canonical mirror are not done.** The
510
- upstream `codex-context-guard` repository has not landed a frozen v2 fixture,
511
- so the v2 file here is explicitly a DSH-authored *candidate*
512
- (`2.0.0-candidate.1`, `status: "dsh-candidate"`). `UPSTREAM_PIN.json` still
513
- pins the unchanged v1 mirrors and is not refreshed by this release.
514
- - The `release` tier protects only surfaces Guard itself routes. Publishing an
515
- npm artifact through the Guard-owned action tool is protected; `git tag`, the
516
- GitHub Release operations, and any composite runner have no interception
517
- point in this host and are refused before effect rather than pretended to be
518
- covered. A trusted in-process caller that bypasses Guard entirely is a host
519
- trust boundary, documented rather than denied.
520
- - After a publish, the settlement stays `unconfirmed` unless the registry
521
- readback producer answers; an unconfirmed operation is never re-sent.
522
- - Deterministic tests, CI, native macOS/Windows acceptance, publication and
523
- installation are separate evidence scopes. This release records source and
524
- deterministic evidence; native acceptance and publication follow separately.
575
+ </details>
525
576
 
526
577
  ## 0.5.3 - 2026-09-14
527
578