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 +186 -135
- package/CHANGELOG.zh-CN.md +112 -57
- package/README.md +45 -92
- package/README.zh-CN.md +45 -92
- package/bin/dsh-completion-guard-activation.mjs +3 -1
- package/bin/dsh-completion-guard-host-lock.mjs +29 -8
- package/dist/domain/index.d.ts +2 -2
- package/dist/domain/index.js +2 -2
- package/dist/{domain-CE_dWoec.js → domain-rozEDKXB.js} +9314 -4256
- package/dist/{index-qKK3BJW1.d.ts → index-ClmcMWbM.d.ts} +107 -20
- package/dist/index.d.ts +10 -2
- package/dist/index.js +431 -81
- package/docs/ACTIVATION_MIGRATION.md +19 -11
- package/docs/ARCHITECTURE.md +24 -21
- package/docs/COMPATIBILITY.md +59 -1
- package/docs/DEPENDENCY_SCAN.md +123 -0
- package/docs/GETTING_STARTED.md +110 -0
- package/docs/HOST_LOCK_UPGRADE.md +22 -12
- package/docs/LOCAL_ACCEPTANCE.md +11 -3
- package/docs/PRIVACY.md +15 -1
- package/docs/README.md +1 -1
- package/docs/THIRD_PARTY_LICENSES.md +29 -1
- package/docs/UI_PERFORMANCE.md +75 -0
- package/manifests/desktop-distribution.v1.json +163 -0
- package/manifests/rc021-rc2-byte-audit.json +989 -0
- package/manifests/rc021-rc3-byte-audit.json +989 -0
- package/manifests/supported-host.v1.json +370 -107
- package/package.json +43 -39
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
|
-
|
|
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
|
-
-
|
|
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
|
-
- **
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|