dsh-completion-guard 0.4.2 → 0.5.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.
@@ -2,11 +2,15 @@
2
2
 
3
3
  Compatibility is pinned to exact host package sets. A nearby version or a partial package match is not treated as supported.
4
4
 
5
- ## 0.4.2 source candidate (unreleased)
5
+ ## 0.5.0 support policy
6
6
 
7
- The repair candidate retains the existing five audited host cohorts and peer dependency ranges. It does not change the Codex upstream pin, host package identities, or digest-v3 fixtures. The package version is `0.4.2`; no CI, frozen-package, native-platform or publication result is implied by that version field.
7
+ The active support target is exactly DSH `0.1.2-rc.1` with Cordis `4.0.2`. The npm peer dependencies advertise only `0.1.2-rc.1`, and the active host allowlist contains that single audited core graph. Alpha package sets and older RC sets remain recorded as historical identities in the shipped manifest and source registry so previously accepted annexes stay verifiable, but an installed runtime built from one of those sets fails closed (`host_lock_version_mismatch`) instead of certifying. No floating version range and no alpha support is claimed; future compatibility work starts from the next upstream RC.
8
8
 
9
- For old pending requirements, use the new proposal/confirmation flow rather than editing the session log. Old events remain under their recorded capture version. Checkpoint output is paged and byte-bounded; clients must follow each list's cursor or query an ID instead of assuming that `open_items` or `available_evidence` on the first page is exhaustive. `bindings` and the top-level `certified|incomplete|unknown` meanings are unchanged. Generic execution and GUI/visual checks still cannot certify user-level completion. See the [architecture](ARCHITECTURE.md) for the schema and the [acceptance record](LOCAL_ACCEPTANCE.md) for remaining gates.
9
+ ## 0.4.3 core-lock policy
10
+
11
+ `dsh-core/v1` uses manifest version 2 and four exact 33-package DSH core graphs, retaining the previously audited DSH and Cordis versions. Market is not a core row. Its transitive dependencies remain part of active-graph traversal, so replacing or duplicating a core dependency still blocks certification. No floating DSH version range is introduced.
12
+
13
+ The package keeps the same Codex semantic fixtures and digest-v3 encoder. The new manifest/cohort/policy values create a different host identity; an old injected lock requires fresh inspection and injection, and an old certificate stays historical. See [migration](HOST_LOCK_UPGRADE.md). Package version alone does not establish CI, native acceptance or publication.
10
14
 
11
15
  ## Recorded 0.4.0 release baseline
12
16
 
@@ -32,12 +36,12 @@ DSH rc.1 replaces the public `Session.events` getter with `snapshotEvents()` and
32
36
 
33
37
  ## Upstream adaptation policy
34
38
 
35
- Version 0.4.0 remains frozen on the alpha.3 setup above. Alpha.4 and later alpha releases are not new adaptation targets. Compatibility work resumed with DSH `0.1.2-rc.1`; that cohort is included in the published `0.4.1-rc.1` prerelease and retained by the 0.4.2 candidate. The upstream [tags page](https://github.com/deepseek-ai/deepseek-harness/tags) tracks later releases; a newer tag does not establish support.
39
+ Version 0.5.0 targets DSH `0.1.2-rc.1`; alpha releases are observed for trend only and are never adaptation or validation targets. A newer upstream tag does not establish support by itself; support starts when that exact RC or release is added as its own audited cohort with source, CI, and native acceptance. The upstream [tags page](https://github.com/deepseek-ai/deepseek-harness/tags) tracks later releases.
36
40
 
37
41
  ## Platform and release evidence
38
42
 
39
43
  - **Source and CI:** the release commit must pass the repository matrix and the Ubuntu, macOS, and Windows Node.js 22/24 CI jobs.
40
- - **Exact package:** the repository packer emits one deterministic 26-file tgz with its full source commit in `gitHead`. That same SHA-256 must be used on both native platforms and published to npm without repacking.
44
+ - **Exact package:** the repository packer emits one deterministic tgz with the declared package inventory with its full source commit in `gitHead`. That same SHA-256 must be used on both native platforms and published to npm without repacking.
41
45
  - **Native scope:** macOS and Windows acceptance separately cover isolated Web and Headless installation, complete host-lock readback, repeated injection, Web restart and recovery, intentional Headless credential failure, daily-profile preservation, and scoped cleanup.
42
46
  - **Public identity:** the annotated tag, npm manifest and downloaded tgz, GitHub Release target, checksum, and platform annexes must all resolve to the same release commit and package bytes.
43
47
  - **Daily profiles:** upgrading a user's daily DSH profile is a separate action and is not implied by release acceptance.
@@ -50,11 +54,9 @@ Version 0.4.0 remains frozen on the alpha.3 setup above. Alpha.4 and later alpha
50
54
 
51
55
  ## Rejection rules
52
56
 
53
- The five exact host sets are recorded in [`../manifests/supported-host.v1.json`](../manifests/supported-host.v1.json). Each set is a complete list of required packages and versions. Every row must match one set.
54
-
55
- Missing, mixed, duplicate, unidentified, unknown, or integrity-drifted rows leave the Guard unavailable. Unregistered substitutions such as alpha.3 with dshmarket `1.38.1` are rejected as mixed graphs. dshmarket is an authoritative lock input; skin-center is not.
57
+ Current core graphs and original historical cohorts are recorded separately in [`../manifests/supported-host.v1.json`](../manifests/supported-host.v1.json). All core rows must match one complete graph. Missing, mixed, duplicate, unknown or integrity-drifted core rows reject certification.
56
58
 
57
- The selected set is part of the host-lock digest. Changing sets invalidates earlier certificates, and a platform is marked supported only after its complete set passes native checks there.
59
+ Market versions do not select a core cohort. Market restart has its own protocol and loaded-instance checks; an unavailable adapter does not disable the core or erase pending restart work. Changing the actual core graph changes its digest and invalidates earlier certificates.
58
60
 
59
61
  ## Evidence links
60
62
 
@@ -66,13 +68,13 @@ The selected set is part of the host-lock digest. Changing sets invalidates earl
66
68
 
67
69
  The package exposes a named `apply(ctx)` function and a named `inject` array (`['sessions', 'commands']`) with no default export. Its `dsh.bundle.patch` points at `cordis.patch.yml`, which inserts the `context-guard` bundle row.
68
70
 
69
- The plugin accepts an `activation` configuration value of `opt-in` or `always`. The default is `opt-in`; `always` initializes the projection as enabled before the persisted session log is replayed. Invalid values fail during plugin configuration instead of silently falling back. A DSH profile can select `always` with an ID-targeted `config` override in its `cordis.patch.yml`; see the README quick start for the complete example and the replay implications for existing sessions.
71
+ The plugin accepts an `activation` configuration value of `opt-in` or `always`. The default is `opt-in`; `always` means every session is protected automatically from its first real user message. Since 0.5.0, session start writes nothing into the session log: the versioned protocol boundary and first-step guidance are delivered inside the same step batch as and ahead of — the first real user message, so a new session stays blank (`seq === 0`) and a DSH preset can be selected before anything is sent. An explicit `off` suppresses `always` in that session until the next `on`. Invalid values fail during plugin configuration instead of silently falling back. A DSH profile can select `always` with an ID-targeted `config` override in its `cordis.patch.yml`; see the README quick start for the complete example.
70
72
 
71
73
  ### Host-lock setup
72
74
 
73
75
  Before the Guard can certify work, generate and verify the host lock from the active DSH runtime and profile. Use the packaged `dsh-completion-guard-host-lock inspect|inject|verify-dump` flow in the README. The default patch has no `hostLockPackages`, so the Guard fails closed until this flow succeeds.
74
76
 
75
- Version 0.3 accepts the generated `hostLockPackages`, `hostLockPlatform`, and `hostLockProfile` values. Each critical package row records the exact resolved version and registry tarball integrity. The Guard does not infer a missing identity from a nearby lockfile: missing, duplicate, multi-version, or drifted rows fail closed. The audited identities are defined in [`../manifests/supported-host.v1.json`](../manifests/supported-host.v1.json).
77
+ Version 0.4.3 injects `hostLockPolicy: dsh-core/v1`, the runtime/profile source roots, `hostLockPackages`, `hostLockPlatform`, and `hostLockProfile` together. Replay rechecks those actual graph sources; legacy configuration without the policy and roots reports `host_lock_migration_required`. Each critical package row records the exact resolved version and registry tarball integrity. The Guard does not infer a missing identity from a nearby lockfile: missing, duplicate, multi-version, or drifted rows fail closed. The audited identities are defined in [`../manifests/supported-host.v1.json`](../manifests/supported-host.v1.json).
76
78
 
77
79
  ### Capability groups
78
80
 
@@ -87,9 +89,9 @@ The host lock evaluates these groups independently:
87
89
  - Web control; and
88
90
  - jobs.
89
91
 
90
- A missing platform- or action-specific group disables only the path that depends on it. For example, a valid terminal or jobs group remains usable when the filesystem group is unavailable.
92
+ Action-specific checks select their required groups only after the complete core graph is valid. An invalid core graph blocks certification; a missing optional market adapter blocks only its dependent operation.
91
93
 
92
- The filesystem group has a narrower contract of its own. It freezes the registered `read`, `write`, and `edit` tools; their closed result and presentation shapes; the local or sandbox `ctx.fs` implementation; the read-before-mutation observation policy; the sandbox policy; and the approval provider. A missing or drifted filesystem row disables `create`, `modify`, and ordinary filesystem facts without disabling unrelated capability groups.
94
+ The filesystem group has a narrower contract of its own. It freezes the registered `read`, `write`, and `edit` tools; their closed result and presentation shapes; the local or sandbox `ctx.fs` implementation; the read-before-mutation observation policy; the sandbox policy; and the approval provider. A missing or drifted filesystem core row keeps the core lock unavailable.
93
95
 
94
96
  ## Peer dependencies
95
97
 
@@ -134,7 +136,9 @@ certifying capability, and has unknown outcome.
134
136
 
135
137
  ## Verified surfaces
136
138
 
137
- ### Current visible behavior
139
+ ### Previously verified runtime behavior
140
+
141
+ These observations belong to the historical native records linked below. Each new core-lock artifact requires fresh native acceptance.
138
142
 
139
143
  - `dsh --profile web --dump-config` and `--profile headless --dump-config` both include `context-guard`.
140
144
  - A real Headless boot loads the plugin: `apply`, `ctx.sessions` access, and listener registration succeed before the run reaches the intentional missing-provider-credentials boundary.
@@ -203,7 +207,7 @@ The action is rejected before executable inspection, command execution, HTTP, or
203
207
  ### Package operations
204
208
 
205
209
  - `install` requires the exact package id, version, and profile, and the package must be absent.
206
- - `apply` requires the exact package id, version, and profile, plus an existing package with a changed version or integrity.
210
+ - `apply` requires the exact package id, version, and profile, plus an existing package with a changed version or integrity. It executes through the DSH CLI and verifies disk package identity. It does not prove a live process, UI or restart outcome; those requirements remain separate.
207
211
  - `publish` requires the exact artifact id, version, and canonical registry. Version 0.3 does not authorize `latest` or a version range.
208
212
 
209
213
  Publish executes the exact resolved tgz with `--ignore-scripts`. Capture, argv, and standard packument readback use the same canonical HTTPS registry base. Registries containing credentials, a query, fragment, encoded separator, control character, or ambiguous path segment are rejected.
@@ -222,7 +226,9 @@ Create and modify bind to the frozen target and expected transition described be
222
226
 
223
227
  ### Restart
224
228
 
225
- Restart requires the exact service id. It persists an intent before POST and closes only after the restored process reports a changed boot ID.
229
+ Restart requires an exact service, compatible protocol and a trusted binding from the host to the loaded provider, profile, loopback origin, package identity and process generation. HTTP capability claims and disk manifests alone do not establish that binding. Current DSH provides no production verifier, so the market restart adapter is unavailable even when the core lock is supported.
230
+
231
+ The version-2 service adapter binds provider and instance digests into its generation string. A persisted intent permits the intended new instance only for the same provider; arbitrary process drift, provider replacement and old version-1 credentials cannot close the action. This pre-execute check is not isolation against a concurrently malicious same-user process. Native direct market restart checks are not evidence that Guard can certify a market restart.
226
232
 
227
233
  ### Windows command shims
228
234
 
@@ -0,0 +1,83 @@
1
+ # Upgrading the core host lock
2
+
3
+ The 0.4.3 line separates Guard's exact DSH core from optional market versions.
4
+ A normal market update no longer changes the core digest. A plugin that changes
5
+ which core packages actually resolve still invalidates the lock.
6
+
7
+ ## Upgrade an existing profile
8
+
9
+ Choose the published Guard package and DSH version from the
10
+ [compatibility guide](COMPATIBILITY.md). Keep the existing profile backup and
11
+ its disabled/activation settings. Installation does not authorize enablement.
12
+ Web and Headless are separate profiles and must be checked separately.
13
+
14
+ If the profile still declares `dsh-context-guard`, replace it through DSH's
15
+ plugin manager rather than loading both package names. Its internal
16
+ `context-guard` id remains unchanged. Preserve session files and user settings;
17
+ if a profile override names the old package, change only that package name.
18
+ Headless does not need market added as part of this migration.
19
+
20
+ After the new package is installed, use absolute paths for the actual runtime
21
+ and profile. The following example targets a POSIX shell:
22
+
23
+ ```sh
24
+ DSH_RUNTIME_ROOT=/absolute/path/to/.dsh-runtime
25
+ DSH_PROFILE_ROOT=/absolute/path/to/.dsh/profiles/web
26
+ GUARD_HOST_LOCK="$DSH_PROFILE_ROOT/node_modules/.bin/dsh-completion-guard-host-lock"
27
+ "$GUARD_HOST_LOCK" inspect --runtime-root "$DSH_RUNTIME_ROOT" --profile-root "$DSH_PROFILE_ROOT"
28
+ "$GUARD_HOST_LOCK" inject --runtime-root "$DSH_RUNTIME_ROOT" --profile-root "$DSH_PROFILE_ROOT"
29
+ dsh --profile web --dump-config | "$GUARD_HOST_LOCK" verify-dump --runtime-root "$DSH_RUNTIME_ROOT" --profile-root "$DSH_PROFILE_ROOT" --dump-config -
30
+ ```
31
+
32
+ For Headless, use its profile path and `--profile headless`. On Windows, use the
33
+ installed `.cmd` launcher and Windows absolute paths. A strict repeat leaves
34
+ the package and profile contents unchanged. Restarting or enabling a daily
35
+ profile remains a separate user action.
36
+
37
+ ## Check a Headless profile before installation
38
+
39
+ A DSH `0.1.2-rc.1` Headless profile can have no external dependencies and no private `node_modules` or lockfile. From an accepted package or matching source checkout, `node bin/dsh-completion-guard-host-lock.mjs inspect-graph --runtime-root <runtime> --profile-root <profile>` checks that state without initializing or launching the profile.
40
+
41
+ This narrow case requires exactly the installation-owned `dsh-base` and `dsh-headless` bundles, a complete audited runtime core, and matching bundle versions, package-map origins and patch files. Declared but uninstalled dependencies, partial map/lock pairs, unexplained local modules and foreign parent-module fallbacks are rejected. Existing profiles with both graph files retain their active-importer checks; damaged files are not treated as an empty graph.
42
+
43
+ The result labels `inspection_scope: pre_install_target` and `profile_graph.state: dependency_free_headless`, with the manifest hash and bundle identities. Its package rows describe the verified runtime core used for this installation target, not a private profile importer or a live boot. After installing Guard, the `inspect`, `inject` and runtime replay checks still require the profile's package map, lockfile and installed plugin binding. This pre-install result cannot replace those checks.
44
+
45
+ ## What changes in the lock
46
+
47
+ The generator writes `hostLockPolicy: dsh-core/v1`, the actual runtime/profile
48
+ source roots, platform/profile kind and the complete 33-row core graph. The
49
+ core manifest is version 2. Runtime replay re-reads those graph sources and
50
+ requires the same exact core before using certificate authority.
51
+
52
+ An older injected configuration reports `host_lock_migration_required`.
53
+ Removing its market row by hand is not migration. Reinspect, inject and verify
54
+ the actual environment. Historical cohorts, requirements and session records
55
+ are retained; old certificates do not become certificates for the new lock.
56
+ The shared digest-v3 encoder and its upstream fixtures are unchanged.
57
+
58
+ ## Market and restart
59
+
60
+ Core compatibility does not certify the optional market restart adapter.
61
+ Market's current HTTP capability response and a matching disk manifest cannot
62
+ prove which provider bytes the service has loaded. Current DSH provides no
63
+ independent loaded-instance verifier, so this adapter remains unavailable.
64
+ An explicit restart requirement stays pending with a binding-unavailable
65
+ reason. Other guarded work continues; package apply proves disk state only.
66
+
67
+ A trusted embedding can supply a loaded-instance verifier to the version-2
68
+ service adapter. Its provider identity binds the actual version, integrity,
69
+ loaded tree, profile, origin and protocol. Its instance identity additionally
70
+ binds the process and boot. Only a persisted restart intent may connect the
71
+ expected old instance to a verified new instance of the same provider.
72
+ Provider replacement, arbitrary process drift and old version-1 credentials
73
+ cannot close that intent. These checks do not isolate a process from a
74
+ concurrently malicious process running as the same user.
75
+
76
+ ## Acceptance records
77
+
78
+ Use the [native entrypoint](LOCAL_ACCEPTANCE.md) with explicit core targets
79
+ and a Web market version. Supplied daily target paths are read-only preflight
80
+ inputs. The driver creates its own isolated profiles, with no market in
81
+ Headless. Real market HTTP lifecycle checks and protocol unit fixtures are
82
+ separate from Guard adapter certification. Each native annex belongs to one
83
+ exact artifact and platform; publication is recorded on its GitHub Release.
@@ -2,28 +2,38 @@
2
2
 
3
3
  Each section names its evidence boundary. Deterministic checks, isolated DSH_HOME composition, native-platform lifecycle runs, model sessions, CI, and public release readback are separate claims; none substitutes for another.
4
4
 
5
- ## v0.4.2 repair candidate (unreleased)
5
+ ## Host-bound acceptance for the 0.4.3 line
6
6
 
7
- This source candidate adds bounded feedback and root-confirmed rebinding. Local regression tests exercise compound capture, source authority, one-to-many replacement, stale/partial replay, target matching, large pages, snapshot changes, small recovery budgets and qualified pending boundaries. Local tests and the existence of a host driver do not establish native DSH acceptance.
7
+ This line separates core and optional-provider acceptance while retaining completion feedback and root-confirmed rebinding. Local regression tests exercise compound capture, source authority, one-to-many replacement, stale/partial replay, target matching, large pages, snapshot changes, small recovery budgets and qualified pending boundaries. Local tests and the existence of a host driver do not establish native DSH acceptance.
8
8
 
9
- The versioned entrypoint is `scripts/native_acceptance.py`. Its default `portable_artifact` profile checks exact source/tgz identity, isolated installation, installed-file parity, second-install no-op and JavaScript syntax. `--gate-profile host_bound --runtime-root <audited-runtime>` additionally creates isolated Web and Headless profiles, injects and reads back their host locks, then runs `scripts/native_host_probe.mjs` inside the real DSH composition. The probe uses the host AgentRegistry, ToolRuntime and durable Session services for nonempty test certification, generic refusal, rebind confirmation, history queries, compact/resume and a qualified pending boundary. Web checks also require wrong-origin restart denial, same-origin acceptance, changed boot/process identities and listener cleanup. The installed launcher shim is checked separately.
9
+ The versioned entrypoint is `scripts/native_acceptance.py`. Its default `portable_artifact` profile checks exact source/tgz identity, isolated installation, installed-file parity, second-install no-op and JavaScript syntax. `--gate-profile host_bound --runtime-root <audited-runtime>` additionally creates isolated Web and Headless profiles, injects and reads back their host locks, then runs `scripts/native_host_probe.mjs` inside the real DSH composition. The probe uses the host AgentRegistry, ToolRuntime and durable Session services for nonempty test certification, generic refusal, rebind confirmation, history queries, compact/resume and a qualified pending boundary. Web checks require an owned-host restart, a different host process, persisted-session recovery and listener cleanup; they do not depend on a market restart API. The installed launcher shim is checked separately.
10
+
11
+ Supplied daily target paths use the [read-only installation preflight](HOST_LOCK_UPGRADE.md#check-a-headless-profile-before-installation). A dependency-free rc.1 Headless target may have no private map or lockfile; the preflight verifies its installation-owned bundles and labels that state separately. The isolated lifecycle still installs Guard before checking its private graph, lock and second-install no-op. A successful target preflight alone is not a native gate result or proof of live adoption.
10
12
 
11
13
  The host driver deliberately makes no model request. It first checks that the normal Headless task driver stops with `MISSING_CREDENTIAL` in the isolated environment, then disables that task driver for the separate real-service probe. A required package-update probe installs an inert local fixture at version 1, then clarifies and confirms a generic requirement, applies version 2 through the real producer/action tools, independently reads it back and requires a nonempty certificate. Capability skips appear in the returned annex. Never treat a synthetic test or an empty probe case set as a passed native run.
12
14
 
13
15
  After exact-candidate portability CI passes and one clean commit's tgz has been frozen, a native owner can run the following with Python 3.11+ (the same artifact is used on both platforms):
14
16
 
15
17
  ```text
16
- python scripts/native_acceptance.py --gate-profile host_bound --repo-root <clean-checkout> --runtime-root <audited-runtime> --artifact <frozen.tgz> --artifact-sha256 <sha256> --source-commit <full-commit> --output <outside-repository-annex.json>
18
+ python scripts/native_acceptance.py --gate-profile host_bound --repo-root <clean-checkout> --runtime-root <audited-runtime> --web-cohort <exact-core-id> --headless-cohort <exact-core-id> --web-market-version <exact-version-or-none> --artifact <frozen.tgz> --artifact-sha256 <sha256> --source-commit <full-commit> --output <outside-repository-annex.json>
17
19
  ```
18
20
 
21
+ Use `--target-web-profile` and `--target-headless-profile` together to compare actual consumer targets read-only before isolated installation. Both core identities are explicit; the Web market version is also explicit, and Headless installs no market. A target mismatch fails instead of selecting a historical fixture.
22
+
19
23
  The driver creates a new temporary DSH_HOME, explicit temporary HOME/USERPROFILE and credential-free environment; it does not select or enable a daily profile. It binds the annex to the artifact, source commit, host lock and probe bytes, and checks owned processes, ports and temporary-file cleanup. Do not run it from a dirty source tree, substitute a rebuilt package, or copy raw temporary logs into the repository.
20
24
 
21
- The earlier 0.4.2 candidate at `6b92b3b7a5eb642686df9f2a1b4d66d54455f503` passed [candidate CI](https://github.com/GreenLv/dsh-completion-guard/actions/runs/34128172642). Its frozen tgz SHA-256 was `9d3e0a0bb948b137f27303a98ad38d3ecc8a901c5c579ce7e3b3c664530c3b4a`. Native macOS and Windows each passed all 28 required host-bound gates, including the normal Headless credential boundary and package-update probe, with cleanup passed. Both annexes retained the `real_model_request` capability skip. These are historical candidate results, not a release or evidence for later package bytes.
25
+ The historical 0.4.2 candidate at `6b92b3b7a5eb642686df9f2a1b4d66d54455f503` passed [candidate CI](https://github.com/GreenLv/dsh-completion-guard/actions/runs/34128172642). Its frozen tgz SHA-256 was `9d3e0a0bb948b137f27303a98ad38d3ecc8a901c5c579ce7e3b3c664530c3b4a`. Native macOS and Windows each passed all 28 required host-bound gates, including the normal Headless credential boundary and package-update probe, with cleanup passed. Both annexes retained the `real_model_request` capability skip. These are historical candidate results, not a release or evidence for later package bytes.
22
26
 
23
- The annex uses `native-acceptance/v2` with the DSH-specific `capability_skips`, `host_driver_sha256`, and `host_lock_digests` fields. A generic closed v2 validator correctly rejects those extensions. A consumer that provides the explicit `dsh-host-bound/v1` contract profile must validate the original annex with independently supplied expected commit, artifact SHA-256, and probe SHA-256; do not remove fields to make it pass. `host_driver_sha256` identifies `native_host_probe.mjs`, not the Python wrapper. Windows checkout CRLF bytes can produce a different probe hash from macOS LF bytes; bind each platform to its actual reviewed file bytes. Failed probe annexes may additionally contain bounded `host_probe_failures` diagnostics. The profile consumer is separate tooling and is not installed by this npm package.
27
+ The core annex uses `native-acceptance/v2`, gate profile `host_bound_core`, and the DSH-specific `capability_skips`, `host_driver_sha256`, `host_lock_digests`, `host_lock_policy` and `market_interface` fields. A generic closed v2 validator correctly rejects those extensions. The historical 0.4.2 `host_bound` annex retains its original `dsh-host-bound/v1` contract; v1 and v2 are not interchangeable. A consumer that provides the explicit `dsh-host-bound/v2` contract profile must validate the original annex with independently supplied expected commit, artifact SHA-256, and probe SHA-256; do not remove fields to make it pass. `host_driver_sha256` identifies `native_host_probe.mjs`, not the Python wrapper. Windows checkout CRLF bytes can produce a different probe hash from macOS LF bytes; bind each platform to its actual reviewed file bytes. Failed probe annexes may additionally contain bounded `host_probe_failures` diagnostics. The profile consumer is separate tooling and is not installed by this npm package.
24
28
 
25
29
  Every subsequent frozen package needs its own CI and same-byte native annexes, recorded outside its packaged documentation. Publication and public readback are separate gates. A disabled daily installation remains disabled until the user separately requests an upgrade and enablement.
26
30
 
31
+ ## Historical 0.4.2 release
32
+
33
+ The [0.4.2 release](https://github.com/GreenLv/dsh-completion-guard/releases/tag/v0.4.2) binds commit `df19d84db35369afb5b3a8041b6e5051db367155` and tgz SHA-256 `87deac307922fdff3391f1d6e0fa1b537c5b57e3a99e1d0943b0dc44b4e90068`. Its published annexes and public readback are specific to those bytes and the old market-1.41 fixture. They do not establish compatibility with a market-1.44 daily profile or the new core-lock policy.
34
+
35
+ Direct market HTTP lifecycle checks exercise the installed market's actual interface. They do not substitute for the independent loaded-instance binding required by Guard's optional restart adapter. An unavailable adapter must leave an explicit restart requirement pending while core work remains protected.
36
+
27
37
  ## v0.4.0 release gates (2026-09-02, passed)
28
38
 
29
39
  Version 0.4.0 targets DSH `0.1.2-alpha.3` with dshmarket `1.39.0` and Cordis `4.0.2`. The repository does not place a candidate's own commit, checksum, or public status inside that candidate's packaged documentation: those facts are generated after the package bytes are frozen and are attached to the GitHub Release.
@@ -126,9 +126,11 @@ DSH needs a deliberate follow-up, not a line-for-line port. The highest-value sh
126
126
 
127
127
  Work-unit scope and correction attribution are also shared semantic gaps and should gain portable regression cases before implementation. Stop-disposition handling is partly equivalent already, so it should be compared with the 0.11.0 cases before code is changed. Codex cache repair, Hook trust, and plugin installation remain Codex-only. Incident-corpus tooling may remain owned by Codex, while reviewed platform-neutral cases continue to be mirrored here.
128
128
 
129
- ## 0.4.2 candidate boundary
129
+ ## 0.4.2 and 0.4.3 product boundaries
130
130
 
131
- The 0.4.2 candidate retains these exact mirrored fixtures and the recorded upstream pin. Its DSH-native rebinding, bounded checkpoint output, and recovery changes do not establish parity with later Codex releases. `upstream-deltas.json` is the dated 2026-09-03 comparison snapshot: its `currentRelease` fields name the releases compared then, not a live latest-version lookup. Refreshing that comparison requires a separate upstream audit; it does not happen merely because either product releases a newer version.
131
+ The 0.4.2 release retained these exact mirrored fixtures and the recorded upstream pin. Its DSH-native rebinding, bounded checkpoint output, and recovery changes do not establish parity with later Codex releases. `upstream-deltas.json` is the dated 2026-09-03 comparison snapshot: its `currentRelease` fields name the releases compared then, not a live latest-version lookup. Refreshing that comparison requires a separate upstream audit; it does not happen merely because either product releases a newer version.
132
+
133
+ The 0.4.3 core policy changes DSH-specific manifest values, not the shared digest-v3 encoding or byte-mirrored fixtures. Core manifest version 2 and `dsh-core/v1` produce a fresh identity after actual-graph inspection. Legacy cohorts remain historical inputs. Market service adapter `context-guard.service.v2` uses version `2.0.0`; old restart credentials cannot become new-instance credentials. Package apply remains a disk-state operation, and unavailable restart work remains pending.
132
134
 
133
135
  ## Validation boundaries
134
136
 
@@ -6,7 +6,7 @@
6
6
  "context-guard.git.v1": "1.0.0",
7
7
  "context-guard.package.v1": "1.0.0",
8
8
  "context-guard.artifact.v1": "1.0.0",
9
- "context-guard.service.v1": "1.0.0",
9
+ "context-guard.service.v2": "2.0.0",
10
10
  "context-guard.registry.v1": "1.0.0"
11
11
  },
12
12
  "actions": {
@@ -1,6 +1,6 @@
1
1
  {
2
- "registryVersion": 1,
3
- "description": "Audited host cohort registry. Each cohort is one exactly extracted package graph; a runtime graph must atomically match one cohort. Mixed, missing, duplicate, or unknown rows fail closed.",
2
+ "registryVersion": 2,
3
+ "description": "Exact DSH core graphs. The active support target is exactly dsh-0.1.2-rc.1-core-v1. Optional dshmarket instances are verified independently by the action adapter; their dependencies still participate in core graph resolution. Legacy cohorts are historical identities only and are not active support entries.",
4
4
  "packageGroups": {
5
5
  "base": [
6
6
  "@deepseek-ai/cordis",
@@ -38,7 +38,6 @@
38
38
  "@deepseek-ai/dsh-host-plugin-inventory"
39
39
  ],
40
40
  "web_control": [
41
- "dshmarket",
42
41
  "@deepseek-ai/dsh-host-webserver",
43
42
  "@deepseek-ai/dsh-web-app"
44
43
  ],
@@ -61,6 +60,224 @@
61
60
  ]
62
61
  },
63
62
  "cohorts": [
63
+ {
64
+ "id": "dsh-0.1.2-rc.1-core-v1",
65
+ "manifestVersion": 2,
66
+ "supportedGoalVersions": [
67
+ "0.1.2-rc.1"
68
+ ],
69
+ "auditedPlatforms": [
70
+ "posix",
71
+ "windows"
72
+ ],
73
+ "platformAuditNote": "posix: exact graph extracted from the isolated 2026-09-03 native macOS rc.1 runtime with dshmarket 1.41.0. windows: exact graph extracted from the 2026-09-04 native Windows rc.1 runtime with dshmarket 1.41.0 and verified row-for-row identical (name, version, registry integrity) to the posix extraction; audited on the live Windows host via host-lock inspect/inject, composed-config verify-dump, and a cold Web boot. The Guard adapts the Session snapshotEvents API; unlisted host cohorts still fail closed.",
74
+ "capabilityExpectations": {
75
+ "goal_complete_precommit_guard": "required",
76
+ "goal_disarm_readback": "required",
77
+ "session_flush_before_control": "required",
78
+ "tool_guard_monotonic": "required",
79
+ "host_capability_model": "action-platform-v1",
80
+ "external_wait_jobs_readback": "dsh.jobs.v1",
81
+ "filesystem_tool_contract": "dsh.fs-tools.v1",
82
+ "host_lock_policy": "dsh-core/v1"
83
+ },
84
+ "supportedActions": [
85
+ "inspect_remote_updates",
86
+ "install",
87
+ "apply",
88
+ "create",
89
+ "modify",
90
+ "test",
91
+ "verify",
92
+ "pull",
93
+ "fetch",
94
+ "commit",
95
+ "push",
96
+ "restart",
97
+ "publish",
98
+ "generic_run"
99
+ ],
100
+ "packages": [
101
+ {
102
+ "name": "@deepseek-ai/cordis",
103
+ "version": "4.0.2",
104
+ "integrity": "sha512-asOnXP1TzFSFQlHb1iegDZp0z/8WD1c7YNrwJR/Tx2bzNuMXfcekE/I67Iv6SQXeLB4csxqCngzQKANP7gdw0g=="
105
+ },
106
+ {
107
+ "name": "@deepseek-ai/dsh-agent",
108
+ "version": "0.1.2-rc.1",
109
+ "integrity": "sha512-lfaqN34vUCWvbn1kJVHrhfJ6Dvt1HDHCm33ZCpmKkl07/5q6FxWqVv6rOdVX5QnM/9xz/uYiN0nQwUtBg4+Skg=="
110
+ },
111
+ {
112
+ "name": "@deepseek-ai/dsh-commands",
113
+ "version": "0.1.2-rc.1",
114
+ "integrity": "sha512-uBh4JTX7pOkFhmbWjXjVLnOQOawyccC7+DazbHrLRN6/wy4OgTRH+DaW0+ibLq+XRAO19OvBTtuoh3x/KkJx1Q=="
115
+ },
116
+ {
117
+ "name": "@deepseek-ai/dsh-goal",
118
+ "version": "0.1.2-rc.1",
119
+ "integrity": "sha512-djzY1oNZV5RwnOFXmDeWFbyswInV9RVWAD0qryxMznQtEDF31PUJ8BQfqs9tVrTV36V3a0neYrZP0DDvRP8ZCA=="
120
+ },
121
+ {
122
+ "name": "@deepseek-ai/dsh-llm",
123
+ "version": "0.1.2-rc.1",
124
+ "integrity": "sha512-7VYsha5AXsVLnsAwYJffWXz9bwUbElw8i5N8tlTSdai9Bupk3sMbsotzPf8ZbsuGAxQYErahMwQwgGEu4qZO6g=="
125
+ },
126
+ {
127
+ "name": "@deepseek-ai/dsh-session",
128
+ "version": "0.1.2-rc.1",
129
+ "integrity": "sha512-jRGNPTbQcvIx1F2MVmmkoiHLgpC3Btqo1wkl/3JDLlOWRVWKOuaC+5fQiMrFPOYfno6YiX/c2UvmA0td8qB92w=="
130
+ },
131
+ {
132
+ "name": "@deepseek-ai/dsh-tools",
133
+ "version": "0.1.2-rc.1",
134
+ "integrity": "sha512-W9kUio00s7WbM8kEwniyd4hfb3CeUxVczsjXbOcKtakfiTywNLeyRWkpx2fvwRAH2rBfg3qCgczVfS0DOw1csg=="
135
+ },
136
+ {
137
+ "name": "@deepseek-ai/dsh-tool-goal",
138
+ "version": "0.1.2-rc.1",
139
+ "integrity": "sha512-ooHKN6Eqy3owNS/oCDO7mR+UalEE4AxJMXou29waahIdSQsFAlk4pPApvhrwg1lpchF5CKwBPOtsVmjq2HfBKQ=="
140
+ },
141
+ {
142
+ "name": "@deepseek-ai/dsh-agent-loop",
143
+ "version": "0.1.2-rc.1",
144
+ "integrity": "sha512-4h16Gn/5oXLTFeorehdlKe5xmDKscR/eRsUu3cs6clKgaTrn6YvnWNB0XkYEg+AXiXbsyfl5MW5Bs4576t7vZw=="
145
+ },
146
+ {
147
+ "name": "@deepseek-ai/dsh-tool-bash",
148
+ "version": "0.1.2-rc.1",
149
+ "integrity": "sha512-xKc4oXVDBwM/PaicpjGdWEaJ1N14B7KPmOzdpQ7ynE4gKUnvGU/eTg18EHamdyDOidh5ox0fNUnxk0rQjVo2+Q=="
150
+ },
151
+ {
152
+ "name": "@deepseek-ai/dsh-tool-pwsh",
153
+ "version": "0.1.2-rc.1",
154
+ "integrity": "sha512-LaImOCdizIGkQnxzzkoaqzRWGZLsuDuqqF2adgJ3zeG0nDwan4Sz+1wYz4YSp0Gg6mJ79CYacsbYmGhYYyKY/g=="
155
+ },
156
+ {
157
+ "name": "@deepseek-ai/dsh-shell",
158
+ "version": "0.1.2-rc.1",
159
+ "integrity": "sha512-uFrSY0nNKzh5orGl2B0B4RfK7wTdIlwhPQc7aLA44jyjioLlqhF7PUek/NWtye2scwp3YHOw158XeOQUD8qTFg=="
160
+ },
161
+ {
162
+ "name": "@deepseek-ai/dsh-subprocess-local",
163
+ "version": "0.1.2-rc.1",
164
+ "integrity": "sha512-Spc/IXWvjEteGysifGr6JvCokcH8T88z0mdxIGcu9SFdgDyY8HKR+h5yq73+rbo4RYzT7+TBE43TIZy5LfmzgQ=="
165
+ },
166
+ {
167
+ "name": "@deepseek-ai/dsh-bash-sandbox",
168
+ "version": "0.1.2-rc.1",
169
+ "integrity": "sha512-dF9PfBWus80Juj3VjUmndbGw1/6cT1BY7BLFuXUi7SDMV1fA4iwA2c7HuvezYFGvpE/8QRZ+c5ZiRfxbWGYktw=="
170
+ },
171
+ {
172
+ "name": "@deepseek-ai/dsh-pwsh-sandbox",
173
+ "version": "0.1.2-rc.1",
174
+ "integrity": "sha512-QjJzrM/tJDkgvtVzYz2bmCxBzdSUo/YwI/rPBJeTwLbWBuehyhX6BueCwU6Ja1Bsdm9crz2D7rVc/DU/xrFttw=="
175
+ },
176
+ {
177
+ "name": "@deepseek-ai/dsh-shell-env",
178
+ "version": "0.1.2-rc.1",
179
+ "integrity": "sha512-o1VqxyHp1OrMB8aHnzYAPwuU4giUErCxBg0yr035r6f3Le36viS0sUHsnjcAsMdbaQJf/XvzbaokYDVrdVHE4A=="
180
+ },
181
+ {
182
+ "name": "@deepseek-ai/dsh",
183
+ "version": "0.1.2-rc.1",
184
+ "integrity": "sha512-RPq48TzxvwpdT9/7W1tbhZDBMmeK+bxDrX9cqQC27Wx/LqtgJF8PSa3b3xriU8oxtvhwYmk21w2cej3uMQrnVA=="
185
+ },
186
+ {
187
+ "name": "@deepseek-ai/dsh-host-plugin-inventory",
188
+ "version": "0.1.2-rc.1",
189
+ "integrity": "sha512-MyLA5XncFdfk9btv29FZSg+ojFOOsHEiPkGWAQiRw+EG/2HlVUEm/9KqPxh2jxB5eFge9GahTg2e7x3Veziadw=="
190
+ },
191
+ {
192
+ "name": "@deepseek-ai/dsh-host-webserver",
193
+ "version": "0.1.2-rc.1",
194
+ "integrity": "sha512-QVcaf4qnIa1t215Y8TRiRhqkEz4Lu5/F+KqvWT+4sHOiyWmZr8g1JndqlwP6MBnMQEPmp0I/EKYJ7PWMV32gkA=="
195
+ },
196
+ {
197
+ "name": "@deepseek-ai/dsh-web-app",
198
+ "version": "0.1.2-rc.1",
199
+ "integrity": "sha512-QGh+XWRgrsVktKD3YHw+cY/knwBESq+2TtyOGNc+V7GU3LG9qL6EPB0M8pIDjxF1jLls+M71LIVbevuFx3oZ6Q=="
200
+ },
201
+ {
202
+ "name": "@deepseek-ai/dsh-jobs",
203
+ "version": "0.1.2-rc.1",
204
+ "integrity": "sha512-VuNPXosjgRbEg0tp+GXsdAqkicwSk5Ynl2AezUQheJgpmw5cvWy3rLEg79B686xGc72tIA6pCW6eBbZGnKOmIg=="
205
+ },
206
+ {
207
+ "name": "@deepseek-ai/dsh-jobs-local",
208
+ "version": "0.1.2-rc.1",
209
+ "integrity": "sha512-bfNV6IJRG7vPWg+Rp3siRCA0BVK8rB1aqn0BG2nPKzCIA2coKqeJ8uPbEm+GuyW/naMR4uCOrrCVLyrwBuMwzg=="
210
+ },
211
+ {
212
+ "name": "@deepseek-ai/dsh-tool-jobs",
213
+ "version": "0.1.2-rc.1",
214
+ "integrity": "sha512-ya7E6zToAdJ+GvNeZFPx8jNx0CfI52tlp0NCGzXHeB0S74haGWCV0iFe1nyoDJg7SDiN1xc1d2nV9klOqWtd5g=="
215
+ },
216
+ {
217
+ "name": "@deepseek-ai/dsh-tool-fs",
218
+ "version": "0.1.2-rc.1",
219
+ "integrity": "sha512-9a1lcPGD4Z3p7OLTMkkCdwN0w7Gl96Jlypq6qopUA0WMkKai83VfeLZvramPnTJo6ezpuPXcLFWGm/2UDSlbcA=="
220
+ },
221
+ {
222
+ "name": "@deepseek-ai/dsh-fs",
223
+ "version": "0.1.2-rc.1",
224
+ "integrity": "sha512-BSIB2j8WvATQ1mf7wUIpHPftDwbzz246qp6aUpLGSzBWGmLBdX3O1oDhyNV1YhgPmDQlwovac2odcAb62tuDdw=="
225
+ },
226
+ {
227
+ "name": "@deepseek-ai/dsh-fs-local",
228
+ "version": "0.1.2-rc.1",
229
+ "integrity": "sha512-tFHHKtD11tIk3FpkWF0vBKdX05zKbwqXQW9LhreA5hErCKEsulUsQLamf+kF1D8fuKqa8Yb+yWQIfYS93cy39w=="
230
+ },
231
+ {
232
+ "name": "@deepseek-ai/dsh-fs-sandbox",
233
+ "version": "0.1.2-rc.1",
234
+ "integrity": "sha512-nnZnsOYLWrN2AnoB0qvQBLhh2VdU4A39AqOgWwsxnT3JrScGpvBcBMCt4fpLP9l5VjOY1qhIbLf6xd5p93C/6Q=="
235
+ },
236
+ {
237
+ "name": "@deepseek-ai/dsh-fs-observation-policy",
238
+ "version": "0.1.2-rc.1",
239
+ "integrity": "sha512-Uw3ErcPwQZUvXylLSf+CDjzfAza5ZVNOMkG4hIJjvgG4WBg3tqoCOY2OQk4O1DGTie4EzL4mHpAe5auwoV4JTw=="
240
+ },
241
+ {
242
+ "name": "@deepseek-ai/dsh-sandbox",
243
+ "version": "0.1.2-rc.1",
244
+ "integrity": "sha512-nTO350NlVo9cvKzbeILcPIRIk9ijidrv29snRjTOx7kP5aO/BI2b4KxsRCYoXg8WGAMbIkGbsmZKUD4qz7hyXQ=="
245
+ },
246
+ {
247
+ "name": "@deepseek-ai/dsh-sandbox-policy",
248
+ "version": "0.1.2-rc.1",
249
+ "integrity": "sha512-nLARL84X6K4DCUJsqRWINg3+1EVxsw70hbP+Yl92W/PsquQVs/UJQc55gnhYGmIMf6eJ0vQv39fziNSnAxdx5A=="
250
+ },
251
+ {
252
+ "name": "@deepseek-ai/dsh-user-approval",
253
+ "version": "0.1.2-rc.1",
254
+ "integrity": "sha512-oYkLE4a/TwqVNi299pUf/QP1Yku6KScdUCTUyYbjaRBcN+/pXPpHikl2aoE2thH9D0uT/Kj6T2kz+wDDcFd9Xg=="
255
+ },
256
+ {
257
+ "name": "@deepseek-ai/dsh-attachment",
258
+ "version": "0.1.2-rc.1",
259
+ "integrity": "sha512-QISKUjEITusLvAkqPLRn70xDUt+GjjY41pISjtPKYcZ4EGmayzhgZ3VJNYEcC+rbaF44hs2o/0VhOwHA7lyxjw=="
260
+ },
261
+ {
262
+ "name": "@deepseek-ai/dsh-system-prompt",
263
+ "version": "0.1.2-rc.1",
264
+ "integrity": "sha512-7W93PZKIk4CHvjZGgLIxrrEKpk+6t8nQXje1vKR5vG73dfXH0t1MJ5WWH/fngadYc7c6KzM84ihQ66tJqJqyNQ=="
265
+ }
266
+ ]
267
+ }
268
+ ],
269
+ "runtimeIdentity": {
270
+ "source": "active-profile-package-graph",
271
+ "injectionConfigKeys": [
272
+ "hostLockPackages",
273
+ "hostLockPlatform",
274
+ "hostLockProfile"
275
+ ],
276
+ "missingBehavior": "fail-closed",
277
+ "cohortDigestBinding": "host_cohort capability row in hostLockDigest v3"
278
+ },
279
+ "lockPolicy": "dsh-core/v1",
280
+ "legacyCohorts": [
64
281
  {
65
282
  "id": "dsh-0.1.1-rc.2",
66
283
  "manifestVersion": 1,
@@ -1105,15 +1322,5 @@
1105
1322
  }
1106
1323
  ]
1107
1324
  }
1108
- ],
1109
- "runtimeIdentity": {
1110
- "source": "active-profile-package-graph",
1111
- "injectionConfigKeys": [
1112
- "hostLockPackages",
1113
- "hostLockPlatform",
1114
- "hostLockProfile"
1115
- ],
1116
- "missingBehavior": "fail-closed",
1117
- "cohortDigestBinding": "host_cohort capability row in hostLockDigest v3"
1118
- }
1325
+ ]
1119
1326
  }