dsh-completion-guard 0.8.0 → 0.8.1
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 +8 -1
- package/CHANGELOG.zh-CN.md +7 -0
- package/README.md +9 -9
- package/README.zh-CN.md +9 -9
- package/bin/dsh-completion-guard-host-lock.mjs +13 -4
- package/dist/domain/index.d.ts +2 -2
- package/dist/domain/index.js +2 -2
- package/dist/{domain-D0zTh3O_.js → domain-Jo13xgPJ.js} +7091 -670
- package/dist/{index-DMr57AgL.d.ts → index-jKw6mANp.d.ts} +167 -28
- package/dist/index.d.ts +21 -2
- package/dist/index.js +155 -79
- package/docs/COMPATIBILITY.md +25 -10
- package/docs/HISTORICAL_INCIDENT_COVERAGE.md +148 -0
- package/docs/HOST_LOCK_UPGRADE.md +49 -21
- package/docs/LOCAL_ACCEPTANCE.md +2 -2
- package/docs/THIRD_PARTY_LICENSES.md +27 -0
- package/manifests/rc020-rc1-byte-audit.json +944 -0
- package/manifests/supported-host.v1.json +93 -93
- package/package.json +39 -38
package/docs/COMPATIBILITY.md
CHANGED
|
@@ -1,10 +1,26 @@
|
|
|
1
1
|
# Compatibility
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Guard binds each accepted installation to its exact package identities, implementation bytes and dependency routes. Version admission and implementation qualification are separate checks; a matching version alone does not establish compatibility.
|
|
4
4
|
|
|
5
|
-
## 0.8.
|
|
5
|
+
## 0.8.1: DSH >=0.2.0-rc.1
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Version admission uses strict SemVer precedence, including later-tuple RCs and ignoring build metadata. The floor is `0.2.0-rc.1`, with no upper limit. Below-floor and malformed versions are refused. Cordis has a separate `>=4.0.4` peer range and qualification; a DSH version does not establish arbitrary Cordis compatibility.
|
|
8
|
+
|
|
9
|
+
The reviewed host baseline is DSH `0.2.0-rc.1` / Cordis `4.0.4`, with 46 package identities and published implementation digests in `manifests/rc020-rc1-byte-audit.json`. Real installed-graph source entry measurements exist for that baseline. Native acceptance of the final Guard artifact on each platform remains a separate gate; no native validation of a future host is claimed.
|
|
10
|
+
|
|
11
|
+
A newer compatible installation can be rebound with `--rebind-registry`, without adding an internal version row. The generator checks exact official registry metadata, archive SRI, installed manifests/modules and both CJS/ESM routes.
|
|
12
|
+
|
|
13
|
+
Qualification binds ordered entry-selection fields (`exports`, `main`, `imports`, package type and dependency declarations) as well as the reviewed ECMAScript programs. A changed entry or dependency cannot inherit qualification merely because the old file remains unchanged. `guard-host-contract/v2` probes use actual bare package resolution in separate ESM and CJS processes, including the acquired dependencies. Critical adapter entries must resolve to the same authenticated target in both lanes; auxiliary libraries may have separate authenticated lane implementations. Changed compatible entries can qualify without a version row; incompatible API, Session or guarded-effect behavior fails the contract.
|
|
14
|
+
|
|
15
|
+
A deterministic per-profile receipt binds all qualified bytes, dependency identities and actual Node startup conditions. Old v1 receipts require rebinding. If Node cannot execute an ESM package through `require`, the receipt explicitly records resolution-only CJS coverage; it does not claim CJS behavior was executed. Runtime and pre-install inspection verify the binding and recheck loading routes; a verified download or self-reported compatibility cannot establish qualification.
|
|
16
|
+
|
|
17
|
+
An unqualified optional Goal implementation disables only Goal integration and reports `host_contract_goal_qualification_required`; independent core work stays available. Different dependency package versions are allowed when their individual identities and routes agree. New graph/module expectations create a new digest, so prior certificates cannot transfer. See [rebinding](HOST_LOCK_UPGRADE.md#rebinding-compatible-package-versions).
|
|
18
|
+
|
|
19
|
+
The plain npm/node-semver expression `>=0.2.0-rc.1` excludes later-tuple prereleases by default. The installed DSH `0.2.0-rc.1` plugin manager and market discovery explicitly include prereleases: input probes accept `0.2.1-rc.1` and `0.3.0-rc.1`, and reject below-floor values without exemptions. pnpm 11.22.0's peer helper uses `includePrerelease: true`, and isolated version-form registry fixtures resolve those RCs. In the tested install mode it also resolved a below-floor peer despite strict-peer flags; package installation is therefore not a version-admission proof. The DSH and Guard floor checks independently reject that version. Other consumers must opt into equivalent semantics; plain npm matching is not the runtime version rule.
|
|
20
|
+
|
|
21
|
+
## 0.8.0: DSH 0.1.7-rc.2 (historical fact, unchanged)
|
|
22
|
+
|
|
23
|
+
0.8.0 metadata and its production selector accepted exactly `0.1.7-rc.2`, with Cordis `4.0.4`, cohort `dsh-0.1.7-rc.2-core-v1`, manifest `manifests/rc017-rc2-byte-audit.json`. That historical support scope is a property of the released 0.8.0 and is not rewritten by the 0.8.1 adaptation.
|
|
8
24
|
|
|
9
25
|
Missing, duplicated, mixed, escaped or modified critical packages fail closed. A matching version or `allow-version` cannot bypass host identity. `auditedPlatforms: []` remains empty: local graph/module verification is separate from native acceptance of a frozen Guard tgz. See the [A01–A16 record](DSH_0_1_7_RC2_ACCEPTANCE.md).
|
|
10
26
|
|
|
@@ -61,7 +77,7 @@ Version 0.5.2 advertises only DSH `0.1.5-rc.2` and `0.1.5-rc.1`, with rc.1 retai
|
|
|
61
77
|
## Historical compatibility cohorts
|
|
62
78
|
|
|
63
79
|
These are verification records, not support entries. An installed runtime built
|
|
64
|
-
from any of them fails closed under the 0.8.0 policy.
|
|
80
|
+
from any of them fails closed under the 0.8.0–0.8.1 policy.
|
|
65
81
|
|
|
66
82
|
- DSH `0.1.1-rc.2` + dshmarket `1.36.0` + Cordis `4.0.1` is a retained, published-line cohort.
|
|
67
83
|
- DSH `0.1.2-alpha.2` + dshmarket `1.38.1` + Cordis `4.0.2` is the published 0.3.2 cohort checked natively on macOS and Windows.
|
|
@@ -73,7 +89,7 @@ from any of them fails closed under the 0.8.0 policy.
|
|
|
73
89
|
|
|
74
90
|
## Rejection rules
|
|
75
91
|
|
|
76
|
-
The
|
|
92
|
+
The reviewed baseline core graph is recorded in [`../manifests/supported-host.v1.json`](../manifests/supported-host.v1.json); older graphs remain only in historical test fixtures. For the baseline lock all core rows must match that graph. For a registry rebind, exact individual identities and qualified module expectations bind the new graph. Mixed dependency versions are allowed; missing required, duplicate, untrusted or integrity-drifted identities and wrong critical routes reject certification.
|
|
77
93
|
|
|
78
94
|
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.
|
|
79
95
|
|
|
@@ -93,7 +109,7 @@ The plugin accepts an `activation` configuration value of `opt-in` or `always`.
|
|
|
93
109
|
|
|
94
110
|
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.
|
|
95
111
|
|
|
96
|
-
Since 0.4.3, the generator injects `hostLockPolicy: dsh-core/v1`, the runtime/profile source roots, `hostLockPackages`, `hostLockPlatform`, and `hostLockProfile` together.
|
|
112
|
+
Since 0.4.3, the generator injects `hostLockPolicy: dsh-core/v1`, the runtime/profile source roots, `hostLockPackages`, `hostLockPlatform`, and `hostLockProfile` together. Mount and protected entries recheck those actual graph sources; ordinary replay uses the mount result; 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 reachable instances, untrusted, or drifted rows fail closed. The audited identities are defined in [`../manifests/supported-host.v1.json`](../manifests/supported-host.v1.json).
|
|
97
113
|
|
|
98
114
|
### Capability groups
|
|
99
115
|
|
|
@@ -123,17 +139,16 @@ The ordinary runtime packages are host-provided peers:
|
|
|
123
139
|
- `@deepseek-ai/dsh-session`; and
|
|
124
140
|
- `@deepseek-ai/dsh-tools`.
|
|
125
141
|
|
|
126
|
-
Goal support uses two
|
|
142
|
+
Goal support uses two identity-bound optional peers as one capability. `@deepseek-ai/dsh-goal` owns Goal state, while `@deepseek-ai/dsh-tool-goal` owns the audited `update_goal` name, schema, and arguments. Both host-graph rows and the live Goal service and tool must agree. A profile without this complete pair can still load, but Goal-dependent integration stays inactive.
|
|
127
143
|
|
|
128
|
-
|
|
144
|
+
The historical 0.5.2 artifact publishes `0.1.5-rc.2 || 0.1.5-rc.1` in top-level
|
|
129
145
|
`engines.dsh`, nested `dsh.engines.dsh`, and every DSH peer dependency. Cordis
|
|
130
146
|
is versioned independently and remains `^4.0.2`. Plugin markets and package
|
|
131
147
|
managers therefore see the same two exact host releases as the host-lock
|
|
132
148
|
registry; neither an unregistered stable release nor a future version is
|
|
133
149
|
implicitly admitted.
|
|
134
150
|
|
|
135
|
-
|
|
136
|
-
baseline. Historical peer declarations belong to their own release sections
|
|
151
|
+
That historical artifact retained exact `0.1.5-rc.1` development pins. The current build pins DSH `0.2.0-rc.1` while public DSH peers declare the floor range. Historical peer declarations belong to their own release sections
|
|
137
152
|
above and are not part of the 0.5.2 contract.
|
|
138
153
|
|
|
139
154
|
## Terminal outcome contract
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# Historical incident coverage
|
|
2
|
+
|
|
3
|
+
Verification date: 2026-09-28 (two evidence rounds). The adjudication round
|
|
4
|
+
ran its working tree on the `1e88176` lineage and the four adaptation cases it
|
|
5
|
+
introduced were first committed in `f4a9497`; the review-repair round added the
|
|
6
|
+
scope-aware auditor fix, the 040 compaction/restore chain and the 042 A–E
|
|
7
|
+
authorization-continuation chain on top; the third repair round fixed the
|
|
8
|
+
core-v2 action-evidence mismatch (a Git operation can no longer satisfy a
|
|
9
|
+
different same-repository action, and same-root clauses bind only their own
|
|
10
|
+
evidence) and made the fully observed 042 chain certify. This document therefore binds each
|
|
11
|
+
row to the NAMED CASE CONTENT and to the commit that first contained it — a
|
|
12
|
+
bare base-commit number is never the evidence. The release candidate commit is
|
|
13
|
+
a later, separate fact and is never referenced from packaged documentation.
|
|
14
|
+
|
|
15
|
+
## Method and verdict vocabulary
|
|
16
|
+
|
|
17
|
+
Every one of the 28 records gets its own row and one of four verdicts. A
|
|
18
|
+
verdict is never inherited from a file-level or family-level green run.
|
|
19
|
+
|
|
20
|
+
- `executed_pass` — the DSH adaptation of the record's failure family is
|
|
21
|
+
pinned by named `it()` cases with named assertions, and those cases pass at
|
|
22
|
+
the base commit. Family members may share one case; the case is named for
|
|
23
|
+
each member.
|
|
24
|
+
- `not_applicable` — the incident surface does not exist in DSH (product
|
|
25
|
+
boundary). The row must still name the positive/negative controls that pin
|
|
26
|
+
the analogous invariant DSH does keep.
|
|
27
|
+
- `analogue_only` — the input surface exists in DSH but the original expected
|
|
28
|
+
behavior is intentionally different. The row must name the tests that prove
|
|
29
|
+
DSH's actual path in both directions plus the documented difference.
|
|
30
|
+
- `pending` — no replayable DSH evidence exists yet. The row must list the
|
|
31
|
+
missing minimal events, trigger steps, and observation conditions.
|
|
32
|
+
|
|
33
|
+
## Library binding
|
|
34
|
+
|
|
35
|
+
- Historical evidence lives in the maintainer's sanitized historical
|
|
36
|
+
regression set, kept outside this repository; raw records, private session
|
|
37
|
+
material and machine-local mappings are never copied into public files.
|
|
38
|
+
The per-record table below is a historical producer statement for a former
|
|
39
|
+
28-record subset and is superseded for acceptance purposes by the current
|
|
40
|
+
full-library adjudication (56 cases / 45 active — 29 Codex, 16 DSH — plus a
|
|
41
|
+
frozen 16-record legacy lineage), whose per-case verdicts, execution lanes
|
|
42
|
+
and candidate binding are tracked in that sanitized set.
|
|
43
|
+
|
|
44
|
+
## New adaptation tests added for this adjudication
|
|
45
|
+
|
|
46
|
+
1. `tests/v6-recovery-feedback.test.ts` — "a legal correction after the armed
|
|
47
|
+
follow-up ends the turn safely with the work still pending" (014/023 full
|
|
48
|
+
chain, see row).
|
|
49
|
+
2. `tests/runtime.test.ts` — "keeps the protocol correction message
|
|
50
|
+
fixed-size regardless of session debt" (020/029).
|
|
51
|
+
3. `tests/domain/v030-manifests.test.ts` — "routes simulation variants through
|
|
52
|
+
the same stateful mutation lane as the real mutation" (019/028).
|
|
53
|
+
4. `tests/runtime.test.ts` — "a cleanup request never carries mutation
|
|
54
|
+
authority for product repair" (012).
|
|
55
|
+
|
|
56
|
+
Review-repair round additions:
|
|
57
|
+
|
|
58
|
+
5. `tests/v6-recovery-feedback.test.ts` — "an answered explicit question is
|
|
59
|
+
not re-injected after compaction and restore while the open one stays
|
|
60
|
+
current" plus the conversational-phrasing boundary control (040).
|
|
61
|
+
6. `tests/native-file-v2.test.ts` — the CGI-2026-042 A–E describe: one root
|
|
62
|
+
commit-and-push authorization across five edit/commit shapes, with the
|
|
63
|
+
fully observed chain certifying through the registered checkpoint tool (042).
|
|
64
|
+
7. `tests/native-file-v2.test.ts` — the action-mismatch review block: a Git
|
|
65
|
+
operation cannot satisfy a different same-repository action, and a compound
|
|
66
|
+
root satisfied by only one action keeps the other clause insufficient.
|
|
67
|
+
|
|
68
|
+
## Per-record verdicts
|
|
69
|
+
|
|
70
|
+
| ID | Original oracle (sanitized) | DSH production path / adapter | Regression evidence (exact case + assertion) | Verdict |
|
|
71
|
+
| --- | --- | --- | --- | --- |
|
|
72
|
+
| CGI-2026-009 | A-tier high-risk action (tag/release creation) observed with no pre-action decision and no ticket | `authorizeMutationFromProjection` fail-closed chain; every stateful mutation request needs an exact pending root-owned item | `tests/runtime.test.ts` "authorizes a mutation only for the exact pending root-owned action and target" asserts `mutation_contract_item_missing` when no item exists, plus revision/action/target mismatch denials; `tests/runtime.test.ts` it.each "rejects incomplete %s root authority before mutation" denies `publish`/`push` with incomplete root targets; `tests/v081-production-entry-drift.test.ts` "charges one validation to the checkpoint entry and one to the whole publish entry, and refuses drift between entries" pins real production entries to fresh validation | executed_pass |
|
|
73
|
+
| CGI-2026-010 | Declared deferred disposition overrode observed authorized remaining work; disposition was not validated against its owner | `decideTurnBoundary` takes no assistant text at all; declared dispositions are bounded diagnostics only; a typed boundary needs an immutable root qualification | `tests/domain/v030-stop-boundary.test.ts` "keeps completion prose diagnostic-only and protocol decisions metamorphic"; `tests/domain/v030-stop-boundary.test.ts` "accepts user_wait only from a current immutable wait authorization"; `tests/runtime.test.ts` "steers exactly once for root persistence and yields to an active armed Goal" | executed_pass |
|
|
74
|
+
| CGI-2026-011 | Quoted/annotated text was treated as a root correction superseding a prior requirement | Supersession requires an explicit mechanism: identical re-statement, or an explicit rebind confirmation with a proposal id; wrapped/misplaced control is ambiguous | `tests/domain/core.test.ts` "derives distinct IDs and supersedes identical re-statements" (R001 superseded only by an identical re-statement, `supersededBy` pinned); `tests/domain/v050-confirm.test.ts` "a valid control line that is not the first line is ambiguous, never applied" and "two different proposals in one message stay ambiguous without partial effect"; `tests/domain/v061-conservative-interpretation.test.ts` "a verbatim concrete instruction supersedes an unresolved clause (review repro: clarification lane)" names the only legal supersession lane | executed_pass |
|
|
75
|
+
| CGI-2026-012 | Authorized cleanup scope silently continued into new product repair without separate authorization | Cleanup grants no mutation authority; a repair needs its own pending root-owned item with a matching semantic action and target | `tests/runtime.test.ts` "a cleanup request never carries mutation authority for product repair" — `authorizeMutationFromProjection` denies `modify` citing a cleanup item; `tests/domain/v062-capability-and-layers.test.ts` "only dependency_free enters the removal set" and "a clean tree or an empty worktree list never proves \"no dependants\"" bound the cleanup scope itself; `tests/v6-recovery-feedback.test.ts` "a cleanup request keeps the dependency-free condition at every budget and view state" | executed_pass |
|
|
76
|
+
| CGI-2026-013 | Every prompt chained a child work unit; historical items kept entering Stop gating | Units open only from delegation-marked roots; a task switch opens a sibling; stale siblings never join the current view | `tests/domain/v060-unit-closure.test.ts` "an ordinary task switch opens a sibling that never blocks the newer unit"; `tests/domain/v060-unit-closure.test.ts` "the delegation vocabulary is closed: a subagent mention without an act never opens a unit"; `tests/v6-recovery-feedback.test.ts` "a stale pending sibling-unit record does not join the current recovery rows" | executed_pass |
|
|
77
|
+
| CGI-2026-014 | Checkpoint gap re-triggered visible continuations far beyond one bounded correction | Checkpoint rejection arms one bounded follow-up; repeats dedup; a legal correction ends the turn safely; unfinished work is never marked complete | `tests/v6-recovery-feedback.test.ts` "invalid-proof: reminders do not repeat after a persisted continue and the same rejection" and the `failed-flush` twin (0 after 3 rejections); `tests/v6-recovery-feedback.test.ts` "a legal correction after the armed follow-up ends the turn safely with the work still pending" — full chain: reject → one injection → real successful host test → `observed` checkpoint → zero follow-ups → `handleGuardTurnStopping` returns `safe_yield_pending_preserved`, steers nothing, no certificate exists, item stays `pending`; `tests/domain/v051-host-loop.test.ts` "disarms the armed goal and stops further rounds and model calls" (real host loop: two production decisions then the bounded stop, zero further model calls) | executed_pass |
|
|
78
|
+
| CGI-2026-015 | Declared user_wait/deferred were judged mismatched against an observed external_wait and each produced a visible continuation | Dispositions are strictly typed against their qualification source, not lexically compared: external_wait needs a live trusted-adapter operation, user_wait needs a root wait authorization | `tests/tools/boundary-integration.test.ts` "round-trips live jobs readback through derive, boundary tool, and persisted replay" (only a real `running` operation qualifies `external_wait`); it.each "maps pinned ctx.jobs status %s to %s without parsing output text"; `tests/runtime.test.ts` "live-requalifies every external_wait job immediately before effectuation" — a completed job yields `boundary_pre_effect_failure`, never a continuation; `tests/domain/v030-stop-boundary.test.ts` "requalifies a live external operation before yielding or disarming" | executed_pass |
|
|
79
|
+
| CGI-2026-016 | hooks.json attached a statusMessage to every allow event and injected receipts on normal prompts | No DSH counterpart: DSH has no hooks.json surface and no statusMessage writer (`grep statusMessage src/` = 0 hits). Allow-path silence is pinned by controls. The one additional-context producer is the bounded read-only shell-workdir observation on bash/pwsh (`src/runtime.ts` workdir receipt), an evidence channel, not an allow-path status writer | Controls: `tests/v6-recovery-feedback.test.ts` "T0 stays silent; the first root carries the boundary once; …"; `tests/domain/v062-capability-and-layers.test.ts` "an ordinary business tool call gains no Guard approval requirement" and "a pending obligation can end silently without being reported as complete"; `tests/host-workdir-v070.test.ts` "records the same passive notice through the real Cordis tool waterfall" (the bounded receipt's exact scope) | not_applicable |
|
|
80
|
+
| CGI-2026-017 | A-tier mutations always demanded an exact ticket even though no release contract was ever adopted | Release class needs an adopted contract AND the protected release surface; non-release stateful mutations need only root authority; adoption is explicit and durable | `tests/tools/v060-release-chain.test.ts` "publishes under a real adopted contract, reserves, settles, and reconciles" (the only allow path); `tests/domain/v060-release-migration.test.ts` "a keyword, a Skill or an installation never adopts a contract" and "a contract naming an unprotectable operation is refused at adoption"; `tests/domain/review-counterexamples.test.ts` "R2: missing observed repository/ref and invented readiness must not grant" (`releasePreEffectDecision` denied) | executed_pass |
|
|
81
|
+
| CGI-2026-018 | Command classifier accepted any token whose basename matched git/gh, so echo/search arguments became tier-A/B actions | Whitelisted single-command parser: only the executable position is consulted; quoted/argument command words never become executables | `tests/domain/core.test.ts` "parses shell commands quote-aware (P0-2 / P1-2)" asserts `parseShellCommand('echo "ignored; pnpm test"').executables` is exactly `['echo']` and wrappers fail closed; "does not let quoted text invent an executable method (P0-2 negative)" and "does not let echo-only bash close a create requirement (P0-1 negative)" pin the denial side | executed_pass |
|
|
82
|
+
| CGI-2026-019 | Explicit no-side-effect variants (`npm publish --dry-run`) consumed real-mutation authorization (false deny without recourse) | DSH deliberately has no simulation lane: the dry-run spelling classifies as the same stateful `publish` action. The verified boundary is the classification lane; the authorization/reservation/effect behavior beyond it is governed by the named release surfaces, not asserted here | `tests/domain/v030-manifests.test.ts` "routes simulation variants through the same stateful mutation lane as the real mutation" (`npm publish --dry-run` → `publish`, `git push --dry-run origin main` → `push`, both `isStatefulAction`, identical to the real spellings); prose-mention control: `tests/domain/v051-instruction-semantics.test.ts` "explaining a command is not executing it (0.6.1: unresolved, closable only via the interpretation route)" asserts no `publish` obligation from the explanation probe; the release-side denial controls live in `tests/domain/review-counterexamples.test.ts` (R1–R3: identity kind mismatch, invented readiness, failed-without-readback all denied) | analogue_only |
|
|
83
|
+
| CGI-2026-020 | Stop correction message appended every requirement/acceptance id in the session, far beyond the 240-char budget | The real correction message is a fixed notice handed to the model by the production turn-stopping entry; its size is independent of open-item count | `tests/runtime.test.ts` "keeps the protocol correction message fixed-size regardless of session debt" — with 60 extra open items the steered message is byte-identical to the 1-item message, equals `PROTOCOL_CORRECTION_NOTICE`, ≤240 chars, and contains no item ids; packet budgets are a separate, existing surface (`tests/tools/v042-feedback.test.ts` "T08 reserves rules and next steps even after an oversized item") | executed_pass |
|
|
84
|
+
| CGI-2026-021 | MCP thread-read alias set matched only the short name, so the real event never bound a readback subject | No DSH counterpart: DSH has no MCP thread-read tool or alias table (`grep read_thread\\|THREAD_READ src/` = 0 hits). Subject binding happens only through structured native-observation metadata and known adapters | Controls: `tests/domain/v030-capture-targets.test.ts` "$action captures root identity and rejects adapter target substitution" (it.each); `tests/native-file-v2.test.ts` "certifies an observed edit without a Guard execution qualification or resolution call" asserts a text-only or tampered state row yields `insufficient`/`incomplete` — echoed text can never bind as state evidence | not_applicable |
|
|
85
|
+
| CGI-2026-022 | Reproduced supersedes CGI-2026-013 (same work-unit lifecycle family) | Same production path as CGI-2026-013 | Same three named cases as CGI-2026-013 | executed_pass |
|
|
86
|
+
| CGI-2026-023 | Reproduced supersedes CGI-2026-014 (checkpoint failure cascade family) | Same production path as CGI-2026-014 | Same named cases as CGI-2026-014, plus `tests/runtime.test.ts` "steers exactly once for root persistence and yields to an active armed Goal" pinning `protocol_correction_already_issued` on the second attempt at the same boundary | executed_pass |
|
|
87
|
+
| CGI-2026-024 | Reproduced supersedes CGI-2026-015 (disposition subclass family) | Same production path as CGI-2026-015 | Same named cases as CGI-2026-015 | executed_pass |
|
|
88
|
+
| CGI-2026-025 | Reproduced supersedes CGI-2026-016 (allow-path status/ receipt family) | Same product boundary as CGI-2026-016 | Same controls as CGI-2026-016 | not_applicable |
|
|
89
|
+
| CGI-2026-026 | Reproduced supersedes CGI-2026-017 (release machinery without adoption family) | Same production path as CGI-2026-017 | Same named cases as CGI-2026-017 | executed_pass |
|
|
90
|
+
| CGI-2026-027 | Reproduced supersedes CGI-2026-018 (executable-position family) | Same production path as CGI-2026-018 | Same named cases as CGI-2026-018 | executed_pass |
|
|
91
|
+
| CGI-2026-028 | Reproduced supersedes CGI-2026-019 (simulation classification family) | Same production path and verified classification boundary as CGI-2026-019 | Same named cases as CGI-2026-019 | analogue_only |
|
|
92
|
+
| CGI-2026-029 | Reproduced supersedes CGI-2026-020 (unbounded Stop feedback family) | Same production path as CGI-2026-020 | Same named cases as CGI-2026-020 | executed_pass |
|
|
93
|
+
| CGI-2026-030 | Reproduced supersedes CGI-2026-021 (thread readback binding family) | Same product boundary as CGI-2026-021 | Same controls as CGI-2026-021 | not_applicable |
|
|
94
|
+
| CGI-2026-040 | An answered question was replayed into the recovery view after resume; the unit stayed active | Recovery injection consumes the current confirmed view: closed/answered work is not re-injected, unchanged packets dedup, re-injection needs real content change | Full compaction/restore chain: `tests/v6-recovery-feedback.test.ts` "an answered explicit question is not re-injected after compaction and restore while the open one stays current" — question A captured and answered in its own turn, question B captured and left open, then `compaction/summary` and a strict `Session.fromRestore` into a new session; the resumed registered pre-step injects nothing containing A and the restored contract keeps A `answered` while B stays `pending`. Input boundary controls, same file: "the original conversational question phrasing stays outside the contract entirely" (the original record's bare question is conversational in DSH and never becomes an obligation) and the existing resume/dedup lane "injects nothing for an observed ordinary closure after resume", "injects the unmet view after resume, dedups repeats, and follows real changes", `tests/runtime.test.ts` "does not re-arm recovery from a historical compaction summary". The original private question texts are not reproduced; the chain uses structure-preserving sanitized fixtures, so this row is the DSH adaptation of the failure family, not a claimed precise replay of the original inputs | executed_pass |
|
|
95
|
+
| CGI-2026-041 | A mixed update+cleanup request collapsed to cleanup-only and the patch was denied | Mixed requests keep every execution obligation through prepare and the authorizer; answered information ranges are not re-listed | `tests/tools/v063-host-materialization.test.ts` "a mixed request keeps its execution obligations through prepare and the authorizer" — the prepared list keeps both execution items and each commit/push obligation is denied only for the real reason (missing authority), never collapsed; `tests/domain/v063-holdout-round35.test.ts` "an agreeing pair is inherited whole" / "a conflicting pair leaves only the branch open" pin clause-level preservation | executed_pass |
|
|
96
|
+
| CGI-2026-042 | Ordinary host edit/commit/push forced re-authorization when the observer missed edit provenance; insufficient observation still denied | Authorization identity comes from the root contract items and never re-arms; each clause is satisfiable only by observations of its OWN semantic action (`src/core-v2/session.ts` evidence-applicability gate); certification tracks the shared-core closure | `tests/native-file-v2.test.ts` CGI-2026-042 describe, it.each over the five original shapes (A python-recorded edit/direct shell commit, B observed edit/direct commit, C explicit file edit/direct commit, D python-recorded edit/commit, E recognized edit/text-only result; the Python shapes are session-recorded adaptation forms, not native Python-process runs): ONE root message authorizes modify+commit+push, all three items share `sourceMessageId`, and `authorizeMutationFromProjection` authorizes the commit and push from those same root items with no new root input in every shape. The fully observed B chain certifies through the REGISTERED `context_guard_checkpoint` tool with per-clause bindings, each citing exactly its own effect+state ids; A/C/D/E keep the edit (and, for D, the wrapper commit) insufficient and refuse any certificate naming only `current_closure_unmet`, never the push binding. Supporting surfaces: "certifies an observed edit without a Guard execution qualification or resolution call" (tampered/missing observation → `insufficient`, `certifiable: false`), "reads back a native commit and push from fixed Git queries after persisted results" (wrong branch → `incomplete`; unbound amend output → `unavailable`), `tests/host-workdir-v070.test.ts` "does not retrospectively grant old calls that lack a call-time receipt". The same file pins the action-mismatch family directly: a Git operation cannot satisfy a different same-repository action (cross observations rejected, matching actions accepted) and a compound root satisfied by only one action keeps the other clause insufficient with the closure uncertifiable | executed_pass |
|
|
97
|
+
| CGI-20260913-codex-archive-043 (archive 043) | Report-level (Windows 0.12.1): repeated authorized-commit denials after real commits | Analogue surface exists (`tests/native-file-v2.test.ts` commit/push readback; `tests/domain/v051-target-identity.test.ts` refused push targets) but the record itself has no replay | Missing minimal events: (1) the root message binding commit-and-push intent, (2) the real `git commit` in both the compound and independent forms, (3) the denial event with its exact reason code per push attempt, (4) the persisted projection showing the commit evidence at denial time. Trigger steps: fresh Windows rc.2 host, current candidate, ordinary repo, one explicit authorization, edit→commit→push via both command forms. Observation conditions: full hook/session log with reason codes; no private repo content in the record; native Windows only — CI or synthetic hosts do not qualify A cold/warm first-open measurement does NOT produce any of these events and is not acceptance for this record; remaining input: a dedicated native commit/push denial run (owner: coordinator native batch). | pending |
|
|
98
|
+
| CGI-20260913-codex-archive-044 (archive 044) | Report-level (Windows 0.12.1): an unnecessary supersession clarification on an ordinary follow-up | Analogue surface exists (`tests/domain/v061-conservative-interpretation.test.ts` conservative supersession) but the record has no replay and its own pure probes did not reproduce | Missing minimal events: (1) the prior durable state with ≥2 unfinished requirements, (2) the exact follow-up prompt, (3) the emitted clarification event (or its absence) with reason code, (4) a current-version pure-probe run for contrast. Trigger steps: rebuild the two-open-requirement chain on a current host, send the follow-up, compare legacy-state vs pure-probe event streams. Observation conditions: durable session logs on both runs; same version/platform; the comparison, not either run alone, is the evidence A cold/warm first-open measurement does not exercise this chain; remaining input: the paired legacy-state/probe run (owner: coordinator native batch). | pending |
|
|
99
|
+
| CGI-20260913-codex-archive-045 (archive 045) | Report-level (Windows 0.12.1): a generated private diagnostic control was rejected as malformed, with no successful diagnosis | No DSH analog can be named without the control grammar; the record explicitly omits the raw control and the rejecting event is unresolved | Missing minimal events: (1) the regenerated control value with its documented grammar, lifetime and wrapper, (2) the emitting tool/event identity, (3) the exact rejection event with reason code, (4) one accepted-control run for contrast. Trigger steps: on a current host invoke the diagnostic lane with a valid current control and invalid controls; capture accept/reject per input. Observation conditions: rejection captured from the session log; no real private control value archived; the accepting run must show the bounded diagnosis the record never observed A cold/warm first-open measurement exercises none of this; remaining input: regenerated control grammar + paired accept/reject run (owner: coordinator native batch, after the grammar is recovered). | pending |
|
|
100
|
+
|
|
101
|
+
## Denominator and totals
|
|
102
|
+
|
|
103
|
+
- `executed_pass`: **19** (009, 010, 011, 012, 013, 014, 015, 017, 018, 020,
|
|
104
|
+
022, 023, 024, 026, 027, 029, 040, 041, 042)
|
|
105
|
+
- `not_applicable` (Codex-only surface, with controls): **4** (016, 021, 025, 030)
|
|
106
|
+
- `analogue_only` (documented intentional difference, both directions proven): **2** (019, 028)
|
|
107
|
+
- `pending` (report-level, no replay conditions met): **3** (043, 044, 045)
|
|
108
|
+
|
|
109
|
+
Only the Codex Python/runtime suites of the private library were treated as
|
|
110
|
+
upstream evidence; no row above counts a Codex-runtime pass as a DSH pass.
|
|
111
|
+
|
|
112
|
+
## Regression suite runs used for this adjudication
|
|
113
|
+
|
|
114
|
+
- Adjudication round (working tree at `1e88176`, cases first committed in
|
|
115
|
+
`f4a9497`): batch 1 — `tests/v6-recovery-feedback.test.ts`,
|
|
116
|
+
`tests/runtime.test.ts`, `tests/domain/v030-manifests.test.ts`: 3 files,
|
|
117
|
+
105 passed; batch 2 — the 23 remaining evidence files named in the table:
|
|
118
|
+
23 files, 448 passed, 1 skipped (pre-existing platform skip), 0 failed.
|
|
119
|
+
- Review-repair round: reviewer repro patches verified RED at `b1ae3b6`
|
|
120
|
+
(4 negative scope cases + the full `revalidateCoreLock` entry), then GREEN
|
|
121
|
+
after the scope-aware auditor fix; `tests/domain/host-dependency-audit.test.ts`
|
|
122
|
+
20 passed; rc017-adaptation family 143 passed / 3 skipped; upgrade,
|
|
123
|
+
target-identity and qualification families 246 passed; full matrix and CI at
|
|
124
|
+
`a0bf01f` green.
|
|
125
|
+
- Action-mismatch repair round: reviewer patch verified RED at `a0bf01f`
|
|
126
|
+
(2 failed / 2 passed), then GREEN after the evidence-applicability fix in
|
|
127
|
+
`src/core-v2/session.ts`; `tests/native-file-v2.test.ts` 16 passed;
|
|
128
|
+
rc017-adaptation 143 passed / 3 skipped, qualification 172, target-identity
|
|
129
|
+
168, upgrade 82; mirror/conformance/portable-semantics/081 entries
|
|
130
|
+
207 passed / 1 skipped. Full deterministic matrix, CI, and packaging stay
|
|
131
|
+
governed by the candidate freeze record; this page pins per-case evidence
|
|
132
|
+
only.
|
|
133
|
+
|
|
134
|
+
## Explicit gaps carried forward
|
|
135
|
+
|
|
136
|
+
1. 043–045 stay pending on their own listed minimal events. A cold/warm
|
|
137
|
+
first-open latency measurement produces none of those events (no
|
|
138
|
+
commit/push denial chain, no legacy-state clarification chain, no
|
|
139
|
+
diagnostic-control grammar), so it is not an acceptance vehicle for them;
|
|
140
|
+
each row names its remaining input and owner.
|
|
141
|
+
2. 019/028 remain an intentional architectural difference at the verified
|
|
142
|
+
classification boundary: DSH classifies simulation spellings as their real
|
|
143
|
+
stateful mutation. If DSH ever grows a simulation lane, the family needs a
|
|
144
|
+
dedicated regression before release.
|
|
145
|
+
3. 016/021/025/030 are Codex-product-only surfaces; they cannot regress on
|
|
146
|
+
DSH and stay recorded for cross-product audits, with the controls named in
|
|
147
|
+
their rows re-checked if DSH grows an allow-path status writer or an MCP
|
|
148
|
+
thread-read adapter.
|
|
@@ -1,6 +1,20 @@
|
|
|
1
1
|
# Upgrading the core host lock
|
|
2
2
|
|
|
3
|
-
Version 0.8.
|
|
3
|
+
Version 0.8.1 requires DSH `>=0.2.0-rc.1` and qualified Cordis `>=4.0.4`. Upgrade order and what each step produces:
|
|
4
|
+
|
|
5
|
+
1. Stop the host, upgrade DSH to `0.2.0-rc.1` or a later version, then install this Guard version.
|
|
6
|
+
2. Rebuild the host lock for each Guard profile by running `inspect`, `inject` and `verify-dump` from an accepted package or matching source checkout:
|
|
7
|
+
`node bin/dsh-completion-guard-host-lock.mjs inject --runtime-root <DSH runtime> --profile-root <profile>` — then verify with `... verify-dump --dump-config <file>`. A successful rebuild reads back `supported` with `audit_provenance` stating how the graph was established.
|
|
8
|
+
3. Start each Web/Headless profile when needed so it reads the rebuilt lock. The checks above do not require a running host.
|
|
9
|
+
|
|
10
|
+
Failure readbacks distinguish these cases:
|
|
11
|
+
|
|
12
|
+
- `host_lock_migration_required`: the configuration lacks the policy or source roots. Supply `--runtime-root` and `--profile-root` when rebuilding the lock.
|
|
13
|
+
- `host_lock_version_below_minimum`: DSH is older than `0.2.0-rc.1`. Upgrade DSH first.
|
|
14
|
+
- `host_lock_version_mismatch`: the installed graph differs from the reviewed baseline in version or integrity. For a later compatible version, use `--rebind-registry` to acquire and qualify the published graph. For the baseline, restore the recorded identities.
|
|
15
|
+
- `host_lock_installed_graph_drift`: installed bytes or routes changed after the audit. Inspect the change before rebuilding the lock.
|
|
16
|
+
|
|
17
|
+
The floor is `>=0.2.0-rc.1` with no upper bound. Passing the version check does not establish native validation; validated versions are recorded separately. Guard's exact DSH core is separate from optional market versions.
|
|
4
18
|
A normal market update no longer changes the core digest. A plugin that changes
|
|
5
19
|
which core packages actually resolve still invalidates the lock.
|
|
6
20
|
|
|
@@ -31,32 +45,26 @@ dsh --profile web --dump-config | "$GUARD_HOST_LOCK" verify-dump --runtime-root
|
|
|
31
45
|
|
|
32
46
|
**Run this block after the runtime is already on the target DSH version, not
|
|
33
47
|
before.** `inject` records the absolute runtime and profile roots and binds the
|
|
34
|
-
graph it finds there, and
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
runtime,
|
|
48
|
+
graph it finds there, and each session mount validates those same roots once,
|
|
49
|
+
with every security-sensitive entry validating them again at its own decision.
|
|
50
|
+
Injecting against the old runtime therefore writes a lock that describes a graph
|
|
51
|
+
the new runtime no longer has, and it will fail at the next mount or the next
|
|
52
|
+
protected entry. Order: stop the host, upgrade DSH and install Guard, inspect/inject/verify each profile, then start it when needed.
|
|
38
53
|
|
|
39
54
|
`inject` **writes to `<profile>/cordis.patch.yml`** — it replaces or adds Guard's
|
|
40
55
|
managed block in that file. Back the file up first. The same file is the one
|
|
41
56
|
`docs/LOCAL_ACCEPTANCE.md` tells you to preserve.
|
|
42
57
|
|
|
43
|
-
**
|
|
44
|
-
commands print a JSON object whose `status` is the verdict — `supported`,
|
|
45
|
-
`unsupported` or `unavailable` — together with `cohort_id`, `host_lock_digest` and
|
|
46
|
-
`audit_provenance`. Note that `inspect`, `inject` and `verify-dump` exit **0** even
|
|
47
|
-
when that status is `unsupported`; only `inspect-graph` exits non-zero on an
|
|
48
|
-
unsupported graph, and only a thrown error produces `status: "unavailable"` with a
|
|
49
|
-
`reason_code` on stderr and exit 1. So a shell check of `$?` alone will not tell
|
|
50
|
-
you whether the graph was accepted.
|
|
58
|
+
**Check both the JSON verdict and the exit status.** Accepted commands print `status: "supported"`. A missing graph, drift, incompatible implementation or untrusted registry description reports a specific `reason_code` on stderr and exits 1. `inspect-graph` is a pre-install graph check; it does not grant runtime authority.
|
|
51
59
|
|
|
52
|
-
For Headless, use its profile path and
|
|
60
|
+
For Headless, use its profile path for the host-lock commands and `dsh --profile headless --dump-config` for the dump. On Windows, use the
|
|
53
61
|
installed `.cmd` launcher and Windows absolute paths. A strict repeat leaves
|
|
54
62
|
the package and profile contents unchanged. Restarting or enabling a daily
|
|
55
63
|
profile remains a separate user action.
|
|
56
64
|
|
|
57
65
|
## Check a Headless profile before installation
|
|
58
66
|
|
|
59
|
-
A DSH
|
|
67
|
+
A DSH 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.
|
|
60
68
|
|
|
61
69
|
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.
|
|
62
70
|
|
|
@@ -65,11 +73,15 @@ The result labels `inspection_scope: pre_install_target` and `profile_graph.stat
|
|
|
65
73
|
## What changes in the lock
|
|
66
74
|
|
|
67
75
|
The generator writes `hostLockPolicy: dsh-core/v1`, the actual runtime/profile
|
|
68
|
-
source roots, platform/profile kind and the
|
|
69
|
-
core manifest is version 2.
|
|
70
|
-
|
|
76
|
+
source roots, platform/profile kind and the actual core package graph (46 rows in the reviewed baseline). The
|
|
77
|
+
core manifest is version 2. Each session mount validates those graph sources
|
|
78
|
+
exactly once; ordinary replay (resume, compaction, step and command refresh)
|
|
79
|
+
consumes that result without rescanning, and every entry that grants
|
|
80
|
+
certificate authority — completion certificates, mutation authorization,
|
|
81
|
+
release pre-effect decisions and Goal/Stop boundaries — validates the lock
|
|
82
|
+
freshly at the moment of its own decision.
|
|
71
83
|
|
|
72
|
-
Version 0.8.
|
|
84
|
+
Version 0.8.1 registers `dsh-0.2.0-rc.1-core-v1` as the audited baseline cohort and derives graph cohorts for compatible hosts above the version floor (see the compatibility guide). Runtime checks authenticate the mapped files and verify that each critical dependency resolves to the mapped instance. Installation imports use native Node resolution; Profile imports use the host's local-first routing and installation fallback only when no local package is selected. A nearer shadow, missing edge, wrong export target or escaped path is rejected even when the recorded versions match.
|
|
73
85
|
|
|
74
86
|
The manifest's `registry-derived-pending-native-audit` provenance and empty `auditedPlatforms` list describe its immutable source audit, which is part of the lock digest. Native acceptance belongs to each exact artifact's separate Release annexes; it does not rewrite that digest. Inspection, injection and dump verification report `audit_provenance` alongside the cohort and digest.
|
|
75
87
|
|
|
@@ -88,7 +100,7 @@ that matters for deciding whether you are migrating or just drifting:
|
|
|
88
100
|
a DSH upgrade, and both are cured by re-running inspect, inject and verify against
|
|
89
101
|
the new runtime rather than by editing the lock.
|
|
90
102
|
|
|
91
|
-
Historical requirements and session records are retained; old certificates do not become certificates for the new lock. Historical host cohorts are test data only and are not accepted by 0.8.
|
|
103
|
+
Historical requirements and session records are retained; old certificates do not become certificates for the new lock. Historical host cohorts are test data only and are not accepted by 0.8.1.
|
|
92
104
|
The shared digest-v3 encoder and its upstream fixtures are unchanged.
|
|
93
105
|
|
|
94
106
|
## Market and restart
|
|
@@ -120,4 +132,20 @@ exact artifact and platform; publication is recorded on its GitHub Release.
|
|
|
120
132
|
|
|
121
133
|
## Historical 0.5.1 evidence
|
|
122
134
|
|
|
123
|
-
Version 0.5.1 registered DSH `0.1.5-rc.1` and `0.1.5-rc.2` with 33 critical packages. Its macOS and Windows results belong only to that artifact and those hosts; see the [0.5.1 release annexes](https://github.com/GreenLv/dsh-completion-guard/releases/tag/v0.5.1). These are historical records, not installation targets for 0.8.
|
|
135
|
+
Version 0.5.1 registered DSH `0.1.5-rc.1` and `0.1.5-rc.2` with 33 critical packages. Its macOS and Windows results belong only to that artifact and those hosts; see the [0.5.1 release annexes](https://github.com/GreenLv/dsh-completion-guard/releases/tag/v0.5.1). These are historical records, not installation targets for 0.8.1.
|
|
136
|
+
|
|
137
|
+
## Rebinding compatible package versions
|
|
138
|
+
|
|
139
|
+
For a newer compatible installation, add `--rebind-registry` to `inspect-graph`, `inspect`, `inject` and `verify-dump` in the upgrade example above. This acquires the exact official archives and qualifies their consumed API contract. Changed programs run bounded probes in an isolated Node process; the command does not start DSH or install packages. A successful result binds a new lock. Keep the backup until dump verification succeeds.
|
|
140
|
+
|
|
141
|
+
The version floor admits later releases and RCs by SemVer precedence. A new version does not by itself prove that Guard can read its events or authorize its effects. Rebinding separates published installation identity from adapter qualification:
|
|
142
|
+
|
|
143
|
+
- Published identity is acquired from the official npm registry for each exact installed `name@version`. The registry integrity must agree with the installed lock, and the downloaded archive must reproduce that integrity. The archive supplies the manifest and module digests; local manifests and local lockfile SRI alone never establish provenance.
|
|
144
|
+
- Qualification is independent of version rows. Comments and formatting can retain reviewed program identity; unrelated unconsumed modules are allowed. Equivalence also checks ordered entry-selection fields and the consumed dependency graph. Changing `exports`, `main`, `imports` or an active dependency requires qualification of the actual selected entry, even when the old file remains intact. Changed programs must pass `guard-host-contract/v2` API and Session V4 behavior checks using actual bare package resolution in separate ESM/CJS Node processes. These check immutable, contiguous event snapshots, restore preservation/refusal, fork recovery and unknown tool outcomes, plus consumed service APIs. A contract failure refuses the affected implementation. Optional Goal failures disable Goal integration while independent core work remains available.
|
|
145
|
+
- The probe uses verified archives and exact installed dependency identities in a temporary directory. It receives no user environment or credentials, cannot write files or launch child processes, and has its network entrypoints disabled. It has bounded time/output and does not boot a host, run installation scripts or contact model providers. This is a finite contract check of official code, not certification of every possible host behavior.
|
|
146
|
+
- CJS and ESM behavior results are recorded separately. Critical adapter routes must agree on one authenticated target; auxiliary dependencies may use separately authenticated CJS/ESM files. When Node lacks ESM-through-`require` execution, CJS resolution is checked and its behavior remains explicitly unavailable.
|
|
147
|
+
- The generator stores a deterministic qualification receipt under the declared profile's `.dsh-completion-guard/host-contracts/` directory and puts its binding in managed configuration. The receipt binds exact package/module bytes and Node startup conditions; a package compatibility declaration or a descriptor without its issued receipt cannot establish qualification. Earlier v1 receipts are refused; run the same rebind commands to issue v2 receipts. Pre-install `inspect-graph` uses the same qualifier and byte/route audit. Inspection and authorization recheck the mixed-version graph, qualified bytes and both CJS/ESM routes in one fresh audit session; they do not repeat the behavioral probes.
|
|
148
|
+
- Route checks use actual startup conditions from command-line flags and `NODE_OPTIONS`, including custom conditions, disabled addons and `module-sync` availability. Changing these inputs creates a new binding. Custom loaders or ambiguous configuration are refused rather than approximated.
|
|
149
|
+
- A changed graph or trust description creates a new lock identity. Existing completion certificates and private authority records retain their old digest and cannot transfer. Reinject the lock, restart the profile under the user's control, and obtain new evidence.
|
|
150
|
+
|
|
151
|
+
Rebinding writes only its qualification receipt and, for `inject`, the managed lock configuration. It does not start DSH, install packages, publish, or mutate session history. Foreground/default-workdir interpretations retain their narrower reviewed-byte qualification. Native acceptance of a later DSH version remains separate from this source-level compatibility rule.
|
package/docs/LOCAL_ACCEPTANCE.md
CHANGED
|
@@ -875,7 +875,7 @@ replaces it:
|
|
|
875
875
|
| documentation audit | `python3 scripts/audit_repository_documentation.py .` | 27 markdown files, 0 errors, 0 warnings |
|
|
876
876
|
| documentation audit test | `python3 -m pytest tests -q` | 84 passed |
|
|
877
877
|
| whitespace | `git diff --check` | clean |
|
|
878
|
-
| reviewer probes (supplementary evidence, not the acceptance) | the fourteen counterexample files under
|
|
878
|
+
| reviewer probes (supplementary evidence, not the acceptance) | the fourteen counterexample files under maintainer-local review workspaces, run from `tests/domain/` | all fourteen files passed against the final source; every copy was removed afterwards |
|
|
879
879
|
| recorded 0.6.2 fixture | `node scripts/record_legacy_upgrade_fixture.mjs --module-dir <baseline dist> --commit 63326f2… --output tests/fixtures/upgrade/legacy-0.6.2.json` | exit 0; re-running reproduces the committed fixture byte for byte |
|
|
880
880
|
|
|
881
881
|
`NODE_PATH` was unset for the test runs. The DSH harness injects a `NODE_PATH`
|
|
@@ -1877,7 +1877,7 @@ pnpm pack --dry-run --json
|
|
|
1877
1877
|
## Isolated profile composition (macOS, no real ~/.dsh)
|
|
1878
1878
|
|
|
1879
1879
|
```sh
|
|
1880
|
-
export DSH_HOME
|
|
1880
|
+
export DSH_HOME=<local smoke directory>
|
|
1881
1881
|
DSH=/path/to/dsh
|
|
1882
1882
|
"$DSH" plugin --profile web add "file:/abs/path/to/dsh-context-guard"
|
|
1883
1883
|
"$DSH" --profile web --dump-config | grep context-guard
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Bundled third-party license
|
|
2
|
+
|
|
3
|
+
The runtime bundles Acorn 8.15.0 for ECMAScript program parsing. Its license is reproduced below.
|
|
4
|
+
|
|
5
|
+
```text
|
|
6
|
+
MIT License
|
|
7
|
+
|
|
8
|
+
Copyright (C) 2012-2022 by various contributors (see AUTHORS)
|
|
9
|
+
|
|
10
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
11
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
12
|
+
in the Software without restriction, including without limitation the rights
|
|
13
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
14
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
15
|
+
furnished to do so, subject to the following conditions:
|
|
16
|
+
|
|
17
|
+
The above copyright notice and this permission notice shall be included in
|
|
18
|
+
all copies or substantial portions of the Software.
|
|
19
|
+
|
|
20
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
21
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
22
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
23
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
24
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
25
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
26
|
+
THE SOFTWARE.
|
|
27
|
+
```
|