devrites 4.0.0 → 4.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,21 @@
2
2
 
3
3
  All notable changes to DevRites are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and DevRites adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Releases are generated automatically by [semantic-release](https://semantic-release.gitbook.io/) from Conventional Commits on `main`.
4
4
 
5
+ ## [4.0.2](https://github.com/ViktorsBaikers/DevRites/compare/v4.0.1...v4.0.2) (2026-08-05)
6
+
7
+ ### Fixed
8
+
9
+ * **deps:** resolve blocking npm audit advisories ([5181daa](https://github.com/ViktorsBaikers/DevRites/commit/5181daa5e93e6edc4a862caa7db5bc11b40c978c))
10
+ * **installer:** remove deprecated tar type check ([1ed3e0d](https://github.com/ViktorsBaikers/DevRites/commit/1ed3e0d600fc48ae020e958ea06d6cb945031994))
11
+ * **installer:** restore self-contained engine updates ([3d851c6](https://github.com/ViktorsBaikers/DevRites/commit/3d851c67e4d740d793695e1f7caa30fddc8d832b))
12
+ * **tests:** avoid flaky unknown-command pipe ([da584aa](https://github.com/ViktorsBaikers/DevRites/commit/da584aaf0d4195ed57ef6d1b21789f00ac81e390))
13
+
14
+ ## [4.0.1](https://github.com/ViktorsBaikers/DevRites/compare/v4.0.0...v4.0.1) (2026-08-03)
15
+
16
+ ### Fixed
17
+
18
+ * **installer:** clean legacy Codex hooks during v4 updates ([4908945](https://github.com/ViktorsBaikers/DevRites/commit/49089453ade730a9fede6c9fade180457d8ce2f9))
19
+
5
20
  ## [4.0.0](https://github.com/ViktorsBaikers/DevRites/compare/v3.2.28...v4.0.0) (2026-08-03)
6
21
 
7
22
  ### ⚠ BREAKING CHANGES
package/README.md CHANGED
@@ -28,7 +28,7 @@ project-conventional push, tag, or PR action, and archive the workspace.
28
28
  Unattended runs may create local WIP checkpoint commits along the way, but they
29
29
  remain local unless Ship's disclosed plan includes an approved remote action.
30
30
 
31
- **Status:** [`v4.0.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v4.0.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
31
+ **Status:** [`v4.0.2`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v4.0.2): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
32
32
 
33
33
  This is the latest published release; `main` may contain unreleased work.
34
34
 
@@ -105,8 +105,12 @@ Some work needs a different route:
105
105
  cursor form alone never triggers repair; it is not a lifecycle phase.
106
106
  - [`/rite`](pack/.claude/skills/rite/SKILL.md) shows the command menu.
107
107
 
108
- The npm or shell updater acquires a local install candidate and uses
109
- `devrites-engine update` to refresh the installed engine and pack offline.
108
+ Run `devrites-engine update` from an installed project to acquire the latest
109
+ stable release and update both the engine and pack. `npx devrites@latest update`
110
+ and the verified release `install.sh` remain equivalent adapter routes. If an
111
+ older engine instead reports `missing codex/hooks.json` or asks for
112
+ `--source-dir`, use the npm or verified shell route once to cross to a release
113
+ with the self-contained updater.
110
114
  `/rite-upgrade` is the separate native, preservation-first route for reconciling
111
115
  an unfinished workspace. It proves a current-contract defect before routing
112
116
  Clarify, Plan repair, Converge, Vet, Prove, Polish, Review, or Seal; it never
@@ -244,6 +248,10 @@ npx devrites@latest update
244
248
  npx devrites@latest update --check
245
249
  npx devrites@latest uninstall
246
250
  npx devrites@latest uninstall --keep-binary
251
+
252
+ # The installed engine can update itself and the project pack directly
253
+ devrites-engine update
254
+ devrites-engine update --check
247
255
  ```
248
256
 
249
257
  Useful install flags:
@@ -331,11 +339,12 @@ path must report that version in a new process. The installer keeps a backup in
331
339
  the same directory until the second check passes. On failure, it restores the
332
340
  previous binary or removes a bad first install.
333
341
 
334
- The Go installer never downloads or selects a release. npm and the Bash
335
- bootstrap acquire the exact-release bundle and checksummed binary first,
336
- then invoke the engine with local paths. `update --check` compares the installed
337
- manifest version with that local candidate; release selectors belong to the
338
- acquisition layer, not the engine.
342
+ Direct `devrites-engine update` resolves the latest stable release, acquires its
343
+ bundle and platform binary, and hands local paths to the downloaded engine. The
344
+ candidate engine therefore validates its own payload before replacing the
345
+ installed pack and binary. npm and Bash may supply the same local candidate
346
+ paths directly. `update --check` resolves and compares the latest version
347
+ without downloading release assets.
339
348
 
340
349
  Network acquisition resolves an exact SemVer release, permits HTTPS at every
341
350
  redirect hop, requires an exact-filename SHA-256 sidecar, and uses private
@@ -407,11 +416,12 @@ configured engine, download the exact release binary with its mandatory checksum
407
416
  build a temporary engine from package-local Go source, or use `devrites-engine`
408
417
  on `PATH`. Remote fetches are HTTPS-only and bounded. Use
409
418
  `--no-binary` or `DEVRITES_NO_BINARY=1` to avoid keeping a shared binary outside
410
- the project. npm or the Bash bootstrap also acquires update candidates and
411
- checksums before invoking the offline engine operation. The engine itself is
412
- network-free, and install, update, and uninstall do not inspect target-project
413
- Git. Retained safety operations such as `secret-scan --staged` intentionally
414
- read the exact Git index and staged blobs they validate.
419
+ the project. npm, Bash, and direct engine update all require checksummed release
420
+ assets. Engine network access is isolated to bounded latest-release acquisition;
421
+ the downloaded engine performs the local manifest-owned update. Install, update,
422
+ and uninstall do not inspect target-project Git. Retained safety operations such
423
+ as `secret-scan --staged` intentionally read the exact Git index and staged blobs
424
+ they validate.
415
425
 
416
426
  Production Git subprocesses remove repository/config/object/ref/pathspec
417
427
  retargeting `GIT_*` variables while preserving unrelated Git environment. Seal
package/SECURITY.md CHANGED
@@ -119,8 +119,8 @@ and `.codex/config.toml` without replacing unrelated user settings. The shared
119
119
  `devrites-engine` executable is the only allowed artifact outside the project.
120
120
  It is installed to `DEVRITES_BIN_DIR`, a writable `~/.local/bin`, or a writable
121
121
  `/usr/local/bin`; `--no-binary` / `DEVRITES_NO_BINARY=1` skips it. The bootstrap
122
- path may fetch the release bundle and checksummed engine assets. It never invokes
123
- `sudo` or edits shell startup files.
122
+ and direct updater may fetch the release bundle and checksummed engine assets.
123
+ They never invoke `sudo` or edit shell startup files.
124
124
 
125
125
  The documented Node-free boundary downloads the release-owned `install.sh` and
126
126
  its exact-name sidecar before execution; mutable default-branch scripts are not
@@ -133,14 +133,15 @@ exact-filename SHA-256 sidecar. Every redirect hop must remain HTTPS, private
133
133
  temporary-directory creation must succeed, and unchecked raw/source/default-
134
134
  branch fallbacks are absent. Representative in-stream ceilings are 1 MiB for
135
135
  release metadata, 4 KiB for a sidecar, and 64 MiB for an archive or binary, with
136
- at most five Node redirect hops. Archive preflight streams metadata first and
137
- paths second, permits at most 10,000 members, 4,096-byte paths, and 256 MiB of
138
- expanded regular files, and aborts the producer on the first breach before
139
- extraction. Failures retain only safe tag/asset and status, redirect, size,
140
- checksum, or preflight context, never response bodies. The adversarial contract is exercised by
136
+ at most five Node or ten Go redirect hops. Archive handling rejects unsafe types
137
+ and paths, permits at most 10,000 members and 256 MiB regular files across all
138
+ routes, and applies stricter route-specific count, file, and expanded-byte caps
139
+ where configured. Failures retain only safe tag/asset and status, redirect,
140
+ size, checksum, or archive context, never response bodies. The adversarial
141
+ contract is exercised by `engine/internal/release/release_test.go`,
141
142
  `tests/bootstrap-security-test.sh`, `tests/npx-pack-smoke.sh`, and
142
143
  `tests/release-tarball-test.sh`; [ADR-0026](docs/adr/0026-content-bound-proof-and-bounded-inputs.md)
143
- owns the rationale.
144
+ and [ADR-0028](docs/adr/0028-self-contained-engine-update.md) own the rationale.
144
145
 
145
146
  ### npx install path
146
147
 
@@ -1,6 +1,6 @@
1
1
  # ADR-0024: Native policy and offline installer boundary
2
2
 
3
- - **Status:** Accepted
3
+ - **Status:** Accepted in part; offline engine-update clause superseded by 0028
4
4
  - **Date:** 2026-08-01
5
5
 
6
6
  ## Context
@@ -0,0 +1,66 @@
1
+ # ADR-0028: Self-contained engine update
2
+
3
+ - **Status:** Accepted
4
+ - **Date:** 2026-08-03
5
+
6
+ ## Context
7
+
8
+ ADR-0024 moved release acquisition out of the Go engine. That made update
9
+ application deterministic, but it also changed the established public contract:
10
+ running `devrites-engine update` inside an installed project no longer updated
11
+ DevRites. It instead required undocumented knowledge of a separately acquired
12
+ release source and generated payload.
13
+
14
+ The split also left old engines responsible for validating new payloads before
15
+ installing the new engine. A payload-schema change could therefore prevent the
16
+ upgrade that would have installed the compatible validator.
17
+
18
+ ## Decision
19
+
20
+ - `devrites-engine update` with no local-candidate flags resolves the latest
21
+ stable GitHub release, downloads its release bundle and platform engine, and
22
+ verifies both against mandatory exact-filename SHA-256 sidecars.
23
+ - The downloaded engine performs the update from the extracted local source and
24
+ payload. The running old engine does not interpret the new payload first.
25
+ - `--check` resolves and compares the latest version without downloading release
26
+ assets. An already-current update also avoids asset downloads unless `--force`
27
+ is explicit.
28
+ - `--source-dir` plus `--payload-dir` remains the local update path used by npm,
29
+ shell adapters, source checkouts, and tests. A local `--check` needs only the
30
+ source version; applying the candidate requires both paths.
31
+ - Release acquisition is isolated in `engine/internal/release`. It accepts exact
32
+ SemVer tags and repository names, bounds responses and extraction, permits
33
+ HTTPS redirects only, rejects unsafe archive entries, and has no raw,
34
+ default-branch, or unchecked source-archive fallback.
35
+ - The engine remains model-free. Network imports are allowed only in the release
36
+ acquisition package; workspace policy, state, proof, and installation packages
37
+ remain network-free.
38
+ - `--to` and `--pre` remain unsupported. The public command updates to the latest
39
+ stable release.
40
+
41
+ This supersedes ADR-0024 only where it requires engine update to be offline and
42
+ caller-supplied. ADR-0024's local install/uninstall behavior and other policy
43
+ boundaries remain in force.
44
+
45
+ ## Alternatives considered
46
+
47
+ | Option | Why not |
48
+ |---|---|
49
+ | Keep direct engine update local-only | Breaks the established v3 command contract and makes the normal command unusable without adapter internals. |
50
+ | Download the bundle but apply it with the running engine | Repeats the cross-version payload-schema failure: the old validator can reject the release that contains its replacement. |
51
+ | Shell out to npm or Bash | Adds a runtime dependency and weakens Windows portability when the engine can acquire the same verified release directly. |
52
+ | Restore arbitrary tag and prerelease selectors | The requirement is latest-stable update; extra selection policy is unnecessary. |
53
+
54
+ ## Consequences
55
+
56
+ Direct engine updates again work from an installed project. npm and shell remain
57
+ supported acquisition adapters and continue using the local-candidate path.
58
+ Release networking is duplicated across entrypoints, but the public binary no
59
+ longer depends on another runtime, and the network boundary remains small and
60
+ guarded. Major upgrades hand off before candidate validation, so the candidate's
61
+ own engine owns its payload schema.
62
+
63
+ Regression coverage lives in
64
+ `engine/internal/install.TestUpdateAcquiresLatestReleaseAndHandsOff`,
65
+ `engine/internal/release`, and
66
+ `engine/tests.TestNetworkImportsStayInReleaseBoundary`.
@@ -69,7 +69,8 @@ architecture; per-feature `decisions.md` files stay scoped to that feature.
69
69
  | [0021](0021-observable-workspace-compatibility.md) | Observable and reversible workspace compatibility | Superseded by 0022 | historical |
70
70
  | [0022](0022-native-orchestration-thin-engine.md) | Native orchestration with a thin deterministic engine | Accepted in part; snapshot/JSON-output clauses superseded by 0023; retained policy-command/install clauses narrowed by 0024 | `engine/root_routing_test.go`, `engine/internal/gate/gate_test.go`, `engine/internal/lib/cursor_compat_test.go`, `tests/native-orchestration-contract-test.sh` |
71
71
  | [0023](0023-native-workspace-reads-line-output.md) | Native workspace reads and line-oriented engine output | Accepted in part; AFK/recovery/doctor retention superseded by 0024 | `engine/root_routing_test.go`, `engine/internal/gate/gate_test.go`, `tests/native-orchestration-contract-test.sh`, `tests/npx-pack-smoke.sh` |
72
- | [0024](0024-native-policy-offline-installer-boundary.md) | Native policy and offline installer boundary | Accepted | `tests/native-orchestration-contract-test.sh`, `tests/phase-gate-routing-test.sh`, `tests/install-smoke.sh`, `tests/host-artifacts-test.sh` |
72
+ | [0024](0024-native-policy-offline-installer-boundary.md) | Native policy and offline installer boundary | Accepted in part; offline engine-update clause superseded by 0028 | `tests/native-orchestration-contract-test.sh`, `tests/phase-gate-routing-test.sh`, `tests/install-smoke.sh`, `tests/host-artifacts-test.sh` |
73
73
  | [0025](0025-evidence-gated-workspace-upgrades.md) | Evidence-gated semantic workspace upgrades | Accepted | `tests/phase-gate-routing-test.sh`, `tests/host-artifacts-test.sh` |
74
74
  | [0026](0026-content-bound-proof-and-bounded-inputs.md) | Content-bound proof and bounded inputs | Accepted | `engine/internal/lib/candidate_test.go`, `engine/internal/lib/evidencefresh_test.go`, `engine/internal/gate/gate_test.go`, `engine/root_routing_test.go`, `engine/tests/parity_githelpers_test.go`, `tests/native-orchestration-contract-test.sh`, `tests/phase-gate-routing-test.sh`, `tests/install-smoke.sh`, `tests/update-smoke.sh`, `tests/npx-pack-smoke.sh`, `tests/release-tarball-test.sh` |
75
75
  | [0027](0027-content-bound-build-readiness.md) | Content-bound build readiness | Accepted | `engine/tests/adr_0027_readiness_binding_test.go` |
76
+ | [0028](0028-self-contained-engine-update.md) | Self-contained engine update | Accepted | `engine/internal/install/install_test.go`, `engine/internal/release/release_test.go`, `engine/tests/meta_test.go` |
@@ -143,20 +143,24 @@ re-read, qid allocation, Clarify cursor transitions, AFK/recovery accounting,
143
143
  and read-only diagnostics. `devrites-lib` documents that boundary and links common
144
144
  references; it does not implement an orchestration protocol.
145
145
 
146
- ### Why install policy is local and acquisition stays at the edge
146
+ ### Why update acquisition is isolated from local installation
147
147
  `engine/internal/install` validates the pre-generated host payload and implements
148
148
  install, update, and uninstall behavior: manifest writing and pruning,
149
149
  shared-file marker merging and removal, legacy Codex hook removal, dry-run
150
- output, binary lifecycle, rollback, and install-flag replay. These operations
151
- consume only caller-supplied local source, payload, and binary candidates; the
152
- engine does not select releases or perform network I/O. `update --check`
153
- compares the installed manifest version with that local candidate. Engine
154
- `--to` and `--pre` selectors do not exist.
150
+ output, binary lifecycle, rollback, and install-flag replay. Those mutations
151
+ consume only local source, payload, and binary candidates.
152
+
153
+ Direct `devrites-engine update` uses the separate `engine/internal/release`
154
+ boundary to resolve the latest stable release and acquire its checksummed bundle
155
+ and platform engine. It then invokes the downloaded engine with local paths, so
156
+ the candidate validates its own payload schema. `update --check` resolves only
157
+ release metadata and downloads no assets. Engine `--to` and `--pre` selectors do
158
+ not exist.
155
159
  The shell entrypoints
156
160
  (`install.sh`, `uninstall.sh`, `update.sh`) and npm entrypoint
157
- (`bin/devrites.mjs`) are acquisition adapters. They acquire and verify the
158
- exact-release bundle or binary, then pass local paths and user flags through to
159
- the deterministic engine operation. Network paths require exact SemVer,
161
+ (`bin/devrites.mjs`) remain equivalent acquisition adapters. They acquire and
162
+ verify the exact-release bundle or binary, then pass local paths and user flags
163
+ through to the deterministic engine operation. All network paths require exact SemVer,
160
164
  HTTPS-only redirects, exact-filename SHA-256 sidecars, private temporary
161
165
  directories, bounded transfers, and full archive preflight. They provide no
162
166
  unchecked raw, source-archive, tag, or default-branch fallback.
@@ -406,9 +410,10 @@ contract.
406
410
  - **Scope**: clarify → seal (decide) → ship (read-only preflight → type-GO →
407
411
  commit → optional approved push/tag/PR by project convention) → close. The CI
408
412
  pipeline stays with the project.
409
- - **Install**: project-local, manifest-managed host artifacts; shell/npm owns
410
- acquisition, the engine performs offline local mutation, and the optional
411
- shared engine binary is the only allowed global artifact.
413
+ - **Install**: project-local, manifest-managed host artifacts; direct update,
414
+ shell, or npm may acquire a verified release, local install application owns
415
+ mutation, and the optional shared engine binary is the only allowed global
416
+ artifact.
412
417
 
413
418
  Candidate identity and bounded-input rationale are recorded in
414
419
  [ADR-0026](adr/0026-content-bound-proof-and-bounded-inputs.md). The
package/docs/cli.md CHANGED
@@ -34,6 +34,20 @@ migration command.
34
34
  `check candidate` is additive; no existing engine command or public `/rite-*`
35
35
  workflow was removed or renamed.
36
36
 
37
+ ## Updates
38
+
39
+ Run `devrites-engine update` in an installed project to resolve the latest
40
+ stable release and update the project pack plus shared engine binary. The
41
+ command downloads the release bundle and platform engine, verifies both exact
42
+ filenames against their SHA-256 sidecars, then hands the extracted candidate to
43
+ the downloaded engine. This avoids asking an old engine to validate a newer
44
+ payload schema.
45
+
46
+ `devrites-engine update --check` resolves and compares release metadata without
47
+ downloading assets. `--source-dir` and `--payload-dir` remain the advanced local
48
+ update path for npm, shell, source-checkout, and test callers; a local `--check`
49
+ needs only `--source-dir`.
50
+
37
51
  ## npm adapter
38
52
 
39
53
  The `npx devrites` adapter accepts `add` as an alias for `install`, `upgrade` for
@@ -41,10 +55,15 @@ The `npx devrites` adapter accepts `add` as an alias for `install`, `upgrade` fo
41
55
  `devrites-engine` aliases; documentation and automation should prefer the
42
56
  canonical command names.
43
57
 
44
- Use `npx devrites update --check` to compare the installed manifest version with
45
- the exact release candidate selected by the adapter without changing the
46
- installation. Use `npx devrites uninstall --keep-binary` to remove managed host
47
- artifacts while retaining the shared `devrites-engine` binary.
58
+ Use `npx devrites update --check` to perform the equivalent adapter-level
59
+ comparison without changing the installation. Use
60
+ `npx devrites uninstall --keep-binary` to remove managed host artifacts while
61
+ retaining the shared `devrites-engine` binary.
62
+
63
+ If an older direct engine reports `missing codex/hooks.json` or asks for
64
+ `--source-dir`, run `npx devrites@latest update`, or use a checksum-verified
65
+ release `install.sh` and run `bash ./install.sh update` once to install a release
66
+ with the self-contained updater.
48
67
 
49
68
  ## Checks
50
69
 
@@ -121,14 +140,14 @@ selection exits `2`; a malformed/unsafe manifest or candidate mismatch prints
121
140
  `DEVRITES_WORKSPACE` may select one explicit contained workspace. Mutating
122
141
  commands refuse ambiguous, escaped, symlinked, or otherwise unsafe roots.
123
142
 
124
- Install, update, and uninstall remain manifest-owned operations and perform no
125
- network acquisition. Shell and npm entrypoints acquire the local candidate
126
- bundle and optional checksummed binary before invoking them. Remote acquisition
127
- uses exact SemVer, HTTPS-only redirect hops, mandatory exact-filename SHA-256
128
- sidecars, private temporary directories, and byte/archive bounds; it has no
129
- unchecked raw/source/default-branch fallback. Update
130
- accepts `--check` to compare the installed manifest version with that local
131
- candidate; remote-selector flags such as `--to` and `--pre` are unsupported.
143
+ Install, update application, and uninstall remain manifest-owned local
144
+ operations. Direct engine update, shell, and npm may acquire a release candidate;
145
+ all remote acquisition uses exact SemVer, HTTPS-only redirect hops, mandatory
146
+ exact-filename SHA-256 sidecars, private temporary directories, and byte/archive
147
+ bounds, with no unchecked raw/source/default-branch fallback. Update accepts
148
+ `--check` to compare the installed manifest version with the latest stable
149
+ release without downloading assets. Remote-selector flags such as `--to` and
150
+ `--pre` are unsupported.
132
151
  `/rite-upgrade` is a native compatibility audit, not an engine migration. Its
133
152
  read-only planner must cite a current rule and exact workspace defect; admitted
134
153
  repairs run through the current Clarify, Plan, Converge, Vet, Prove, Polish,
@@ -43,7 +43,7 @@ The Go surface is intentionally closed and deterministic:
43
43
  | Candidate and deterministic checks | `check candidate`, `check readiness [--emit-binding]`, `check seal` | Candidate validates/hashes the strict project manifest; readiness checks phase files or emits the vetted Build-input binding; seal checks final files/open gates, that binding, then exact candidate bindings. |
44
44
  | Atomic workspace state | `state resolve`, `state close` | Go owns answer/drop/batch resolution and transactional close. |
45
45
  | Security | `secret-scan` | `/rite-ship`, safe hooks, or an operator scans staged blobs, stdin, or touched files. |
46
- | Install/operator | `install`, `update`, `uninstall`, `version` | npm/bootstrap or a human operator supplies local candidates; the engine performs deterministic local changes. |
46
+ | Install/operator | `install`, `update`, `uninstall`, `version` | Direct update acquires latest; npm/bootstrap may supply local candidates; the engine performs manifest-owned local changes. |
47
47
  | Native policy | no engine command | Skills/root own spec grammar re-read, qid allocation, Clarify cursor edits, AFK/recovery accounting, and read-only `/rite-doctor`. |
48
48
 
49
49
  `devrites-engine help` exhaustively lists the operational engine commands.
@@ -67,9 +67,11 @@ replacement objects disabled. `--stdin` accepts text through process stdin.
67
67
  Scans cap captured input at 64 MiB and entries/findings at 4,096; findings expose
68
68
  metadata only and source or limit errors fail closed.
69
69
 
70
- The shell/npm updater acquires the exact-release pack/binary, then invokes
71
- the offline local `devrites-engine update`. Its `--check` compares installed and
72
- local candidate versions; engine release selectors are unsupported.
70
+ Direct `devrites-engine update` acquires the latest exact-release pack and
71
+ platform binary, then hands local paths to the downloaded engine. Shell/npm may
72
+ perform the same acquisition before invoking the local path. `--check` compares
73
+ the installed version with latest release metadata without downloading assets;
74
+ engine release selectors are unsupported.
73
75
  `/rite-upgrade` separately audits an older active workspace. Only a cited
74
76
  current-contract defect may route a repair through its existing Clarify, Plan
75
77
  repair, Converge, Vet, Prove, Polish, Review, or Seal owner.
@@ -53,18 +53,20 @@ explicit root-owned native procedures. The workflow owns reproduction,
53
53
  hypothesis ranking, tool selection, and routing. No replacement scripts or
54
54
  counter artifacts are introduced.
55
55
 
56
- ## Offline install boundary
57
-
58
- The engine's install/update/uninstall operations accept an already-local source,
59
- pre-generated host payload, and optional staged binary. They never select a
60
- release or download a bundle/binary. Shell and npm entrypoints own acquisition
61
- and checksum verification, then invoke the local deterministic operation.
62
- `update --check` compares the installed manifest version with the supplied
63
- local candidate. `--to` and `--pre` are not supported engine flags.
64
-
65
- Remote acquisition is exact-SemVer, HTTPS-only at every redirect, bounded, and
66
- requires an exact-filename SHA-256 sidecar. Archive preflight completes before
67
- extraction and unchecked raw/source/default-branch fallbacks are absent.
56
+ ## Install and update boundary
57
+
58
+ Install application and uninstall accept local source, pre-generated host
59
+ payload, and optional staged binary inputs. Direct `devrites-engine update`
60
+ selects the latest stable release, downloads its bundle and platform engine,
61
+ then invokes that downloaded engine with local candidate paths. Shell and npm
62
+ may instead acquire and pass the same local inputs. `update --check` compares
63
+ installed and latest release metadata without downloading assets. `--to` and
64
+ `--pre` are not supported engine flags.
65
+
66
+ Remote acquisition is isolated to the release boundary, exact-SemVer,
67
+ HTTPS-only at every redirect, bounded, and requires exact-filename SHA-256
68
+ sidecars. Archive validation completes during bounded extraction and unchecked
69
+ raw/source/default-branch fallbacks are absent.
68
70
 
69
71
  ## Secret scanning
70
72
 
package/docs/release.md CHANGED
@@ -22,9 +22,9 @@ its payload. Package and release installs validate and copy
22
22
  source checkout whose generated payload is incomplete, the shim may regenerate
23
23
  the missing host payload before handing that local candidate to the engine. The
24
24
  engine itself only validates and copies host payloads; it never generates them.
25
- The npm entrypoint and the verified release installer acquire only an exact-SemVer
26
- release bundle or platform binary with its mandatory exact-filename SHA-256
27
- sidecar.
25
+ The npm entrypoint, verified release installer, and direct engine updater acquire
26
+ only an exact-SemVer release bundle or platform binary with its mandatory
27
+ exact-filename SHA-256 sidecar.
28
28
  Every redirect hop remains HTTPS; downloads use private temporary directories
29
29
  and fixed in-stream byte ceilings. The bootstrap first streams archive metadata,
30
30
  then paths, aborting the producer on a type, count, expanded-size, containment,
@@ -33,10 +33,10 @@ or path breach before extraction (at most 10,000 members, 4,096-byte paths, and
33
33
  archives/binaries at 64 MiB, and the Node adapter follows at most five redirects.
34
34
  There is no raw, source-archive, tag, or default-branch acquisition fallback;
35
35
  exact-release guarantees begin at the checksummed release `install.sh` asset.
36
- The Go install/update/uninstall core receives only local
37
- candidates and performs no network I/O. Its update `--check` compares the
38
- installed manifest with that local candidate; `--to` and `--pre` release
39
- selection belongs outside the engine and is not accepted there.
36
+ The Go release boundary may acquire the latest stable candidate; the downloaded
37
+ engine then supplies local paths to the manifest-owned update core. Engine
38
+ `update --check` resolves release metadata but downloads no assets. `--to` and
39
+ `--pre` release selection is not accepted.
40
40
 
41
41
  `bash scripts/validate.sh` is the single repository-validation authority. It
42
42
  performs strict recursive pack JSON parsing and render-to-temporary parity for
@@ -93,6 +93,12 @@ var CodexConfigMerge = MarkerMerge{
93
93
  MarkerText: ".codex/config.toml contains the DevRites read-only-root permission profile.",
94
94
  }
95
95
 
96
+ var LegacyCodexHooksMerge = ManagedMerge{
97
+ MarkerRel: ".claude/devrites.codex-hooks-merge",
98
+ TargetRel: ".codex/hooks.json",
99
+ DryRun: ".codex/hooks.json legacy DevRites hooks",
100
+ }
101
+
96
102
  var managedMerges = []ManagedMerge{
97
103
  {
98
104
  MarkerRel: CodexAgentsMerge.MarkerRel,
@@ -113,6 +119,7 @@ var managedMerges = []ManagedMerge{
113
119
  TargetRel: ClaudeSettingsMerge.TargetRel,
114
120
  DryRun: ".claude/settings.json DevRites permissions",
115
121
  },
122
+ LegacyCodexHooksMerge,
116
123
  }
117
124
 
118
125
  func RequiredPayload(withCodex bool) []string {