devrites 7.0.4 → 7.0.6

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.
Files changed (49) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +1 -1
  3. package/docs/cli.md +5 -3
  4. package/docs/command-map.md +1 -1
  5. package/docs/engine/commands.md +2 -2
  6. package/engine/help.go +1 -1
  7. package/engine/internal/acceptance/cli.go +37 -7
  8. package/engine/internal/lib/dispatch_contract.go +1 -1
  9. package/engine/internal/lib/packet.go +4 -4
  10. package/engine/internal/lib/slicecheck.go +63 -31
  11. package/engine/internal/lib/taskgraph.go +39 -0
  12. package/engine/main.go +15 -0
  13. package/pack/.claude/agents/devrites-plan-reviewer.md +7 -0
  14. package/pack/.claude/agents/devrites-slice-wright.md +2 -1
  15. package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
  16. package/pack/.claude/skills/rite-build/reference/phase-contract.md +3 -1
  17. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +6 -3
  18. package/pack/.claude/skills/rite-vet/SKILL.md +4 -1
  19. package/pack/generated/claude/agents/devrites-plan-reviewer.md +7 -0
  20. package/pack/generated/claude/agents/devrites-slice-wright.md +2 -1
  21. package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
  22. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +3 -1
  23. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +6 -3
  24. package/pack/generated/claude/skills/rite-vet/SKILL.md +4 -1
  25. package/pack/generated/codex/agents/devrites-plan-reviewer.toml +7 -0
  26. package/pack/generated/codex/agents/devrites-slice-wright.toml +2 -1
  27. package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
  28. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +3 -1
  29. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +6 -3
  30. package/pack/generated/codex/skills/rite-vet/SKILL.md +4 -1
  31. package/pack/generated/devin/agents/devrites-plan-reviewer.md +7 -0
  32. package/pack/generated/devin/agents/devrites-slice-wright.md +2 -1
  33. package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
  34. package/pack/generated/devin/skills/rite-build/reference/phase-contract.md +3 -1
  35. package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +6 -3
  36. package/pack/generated/devin/skills/rite-vet/SKILL.md +4 -1
  37. package/pack/generated/omp/agents/devrites-plan-reviewer.md +7 -0
  38. package/pack/generated/omp/agents/devrites-slice-wright.md +2 -1
  39. package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
  40. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +3 -1
  41. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +6 -3
  42. package/pack/generated/omp/skills/rite-vet/SKILL.md +4 -1
  43. package/pack/generated/pi/agents/devrites-plan-reviewer.md +7 -0
  44. package/pack/generated/pi/agents/devrites-slice-wright.md +2 -1
  45. package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
  46. package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +3 -1
  47. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +6 -3
  48. package/pack/generated/pi/skills/rite-vet/SKILL.md +4 -1
  49. package/package.json +2 -2
package/CHANGELOG.md CHANGED
@@ -2,6 +2,19 @@
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
+ ## [7.0.6](https://github.com/ViktorsBaikers/DevRites/compare/v7.0.5...v7.0.6) (2026-10-22)
6
+
7
+ ### Fixed
8
+
9
+ * **devrites:** close every slice's write set at Vet ([#160](https://github.com/ViktorsBaikers/DevRites/issues/160)) ([dce9587](https://github.com/ViktorsBaikers/DevRites/commit/dce9587c61660e1ae59c1bd5a0a8afd6de423575))
10
+
11
+ ## [7.0.5](https://github.com/ViktorsBaikers/DevRites/compare/v7.0.4...v7.0.5) (2026-10-22)
12
+
13
+ ### Fixed
14
+
15
+ * **devrites:** catch Build-entry slice defects at Vet ([#158](https://github.com/ViktorsBaikers/DevRites/issues/158)) ([34b65b7](https://github.com/ViktorsBaikers/DevRites/commit/34b65b7d819c308b46dc609d215ff698315b4b44))
16
+ * **devrites:** clear expiring audit exceptions and Windows race flake ([#159](https://github.com/ViktorsBaikers/DevRites/issues/159)) ([0e6a85a](https://github.com/ViktorsBaikers/DevRites/commit/0e6a85a7726d80b6e259a68975bf2892ad621a51))
17
+
5
18
  ## [7.0.4](https://github.com/ViktorsBaikers/DevRites/compare/v7.0.3...v7.0.4) (2026-10-21)
6
19
 
7
20
  ### Fixed
package/README.md CHANGED
@@ -31,7 +31,7 @@ history can't lose it. After you clear the conversation, switch hosts, or hand
31
31
  the feature to another engineer, the next session reads the same plan,
32
32
  decisions, and evidence before it continues.
33
33
 
34
- **Status:** [`v7.0.4`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v7.0.4): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
34
+ **Status:** [`v7.0.6`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v7.0.6): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
35
35
 
36
36
  This is the latest published release; `main` may contain unreleased work.
37
37
 
package/docs/cli.md CHANGED
@@ -122,7 +122,9 @@ self-contained updater.
122
122
 
123
123
  - `check readiness <slug>` verifies the files required to leave the workspace's
124
124
  current phase, the `tasks.md` slice graph once that artifact is required, and,
125
- once `eng-review.md` is required, its exact stable Build-input binding.
125
+ once `eng-review.md` is required, its exact stable Build-input binding. Leaving
126
+ Vet, it also runs the Build-entry `check slice` contract on every slice
127
+ `state.md` does not check built, except a deferred `Satisfies: none` slice.
126
128
  - `check readiness --emit-binding <slug>` renders the exact stable Build-input
127
129
  binding for Vet to record after semantic review.
128
130
  - `check preconditions <slug>` runs the preflight rows whose `Run at` is `vet`
@@ -221,8 +223,8 @@ or CI.
221
223
  `gates` operates the `gates.md` ledger inside a feature workspace: one gate per
222
224
  required outcome, runnable (`CHECK`+`EXPECT`, optional `CWD`) or manual
223
225
  (`EVIDENCE` only). Subcommands: `scaffold`, `status`, `run`, `reverify`,
224
- `lint`, `precheck --worktree <path>` (the wright's pre-return run of `RUN: writer`
225
- gates and `check windows`; writes no ledger, EVIDENCE line or transcript, though `check windows` still logs its metric; never evidence), `attest <id> <note>`,
226
+ `lint`, `precheck --worktree <path> [--slice <SLICE-ID>]` (the wright's pre-return run of `RUN: writer`
227
+ gates and `check windows`; `--slice` skips a gate only other unbuilt slices own; writes no ledger, EVIDENCE line or transcript, though `check windows` still logs its metric; never evidence), `attest <id> <note>`,
226
228
  `abandon <id> <why>`.
227
229
 
228
230
  A runnable gate executes only when its `(CHECK, CWD)` pair exactly matches a
@@ -45,7 +45,7 @@ The Go surface is intentionally closed and deterministic:
45
45
  | Workspace observation | `observe summary`, `orient`, `observe slice <slug> <SLICE-ID>`, `next`, `handoff` | JSON workspace snapshot for agents (cursor, task graph, `artifact_budgets`, `bulk_files`); `orient` is an alias for `observe summary`. `observe slice` prints one `SLICE-###` section of `tasks.md` so Build reads a slice, not the file. `next` prints the minimal remaining lifecycle path plus advisory skips (e.g. clarify at zero open questions). `handoff` emits the deterministic resume record (cursor, `awaiting_human`, blocking question gates, ledger reduction with unmet/stale ids, dead ends, read-next order) — the `/rite-handoff` spine and compaction-fallback entry. |
46
46
  | Context packets, dispatch waves, metrics, claims, notes | `context [slug] (--phase <p> \| --skill <name>) [--role <r>] [--trigger a,b]`, `dispatch <slug> <open\|start\|seal\|return\|status\|abandon>`, `candidate freeze`, `packet`, `metrics record`, `metrics summary`, `claim <add\|release\|list\|check>`, `note <add\|list\|check\|rm>` | `context` emits one deduplicated read-set bundle per phase/role/skill from each skill's `loads:` manifest — a dispatch target reads it instead of selecting files; `--skill` works without a workspace when `--out` is given. `dispatch` owns the launch-wave barrier (seal needs a handle per role; return needs seal; the last start seals; open --claim-session/--claim takes the wave's file claim, released by the completing return or abandon --release) and auto-records dispatch/return metrics. `candidate freeze` writes a wave's frozen `packets/<w>.diff` + `.sha256`; `packet` renders and lints one role's by-reference packet. `metrics` owns the append-only `metrics.jsonl` ledger. `claim` owns the append-only `.devrites/claims.jsonl` ledger — advisory, session-scoped file claims with TTL so concurrent same-tree sessions see each other's write intent before edits collide (conflict exits 3; never a substitute for one-writer-per-worktree). `note` owns the anchored `notes.md` ledger — notes bound to verbatim code quotes, regraded `exact`/`moved`/`stale`/`ambiguous`/`lost` as the code drifts; `check seal` refuses non-`exact` anchors. `check diff-scope` is the mechanical changed-paths ⊆ allowlist gate run before reviewer dispatch. |
47
47
  | Atomic workspace state | `state resolve`, `state merge-manifest`, `state apply-bundle <slug> <bundle.json>... [--dry-run]`, `state set <slug> key=value... [--unset key]`, `state append <slug> <ledger.md> --heading <text> --body-file <path\|->`, `state close`, `migrate [--dry-run] [--answer id=choice]` | Go owns answer/drop/batch resolution, the recorded predecessor-chain manifest union for a release milestone, the all-or-nothing apply of plan-drafter hunk bundles (base-hash pins, unique non-overlapping anchors, no lost IDs, no new task-graph or budget defect, no appended dated delta section), cursor writes (known phase, engine-owned schema, no return-cursor overwrite; an AFK pause names auto-pickable questions), append-only ledger sections that refuse a duplicate heading, transactional close, and fail-closed v5 schema normalization. |
48
- | Acceptance ledger | `gates scaffold`, `gates status`, `gates run [--timeout N]`, `gates reverify [--timeout N]`, `gates lint [--strict]`, `gates precheck <slug> --worktree <path>`, `gates attest <id> <note>`, `gates abandon <id> <why>` | Go owns the `gates.md` ledger: per-outcome gates whose runnable `CHECK`/`CWD` must exactly match a `test-plan.md` Build-entry preflight row, evidence bound to the gate definition digest (stale = unmet), `ABANDON:` handoffs, oracle lint, and the wright's never-evidence `precheck` of `RUN: writer` gates. Readiness/seal require a parse-clean, all-met ledger whenever `gates.md` is a required artifact. |
48
+ | Acceptance ledger | `gates scaffold`, `gates status`, `gates run [--timeout N]`, `gates reverify [--timeout N]`, `gates lint [--strict]`, `gates precheck <slug> --worktree <path> [--slice <SLICE-ID>]`, `gates attest <id> <note>`, `gates abandon <id> <why>` | Go owns the `gates.md` ledger: per-outcome gates whose runnable `CHECK`/`CWD` must exactly match a `test-plan.md` Build-entry preflight row, evidence bound to the gate definition digest (stale = unmet), `ABANDON:` handoffs, oracle lint, and the wright's never-evidence `precheck` of `RUN: writer` gates. Readiness/seal require a parse-clean, all-met ledger whenever `gates.md` is a required artifact. |
49
49
  | Security | `secret-scan` | `/rite-ship`, safe hooks, or an operator scans staged blobs, stdin, or touched files. |
50
50
  | Install/operator | `install`, `update`, `uninstall`, `version` | Direct update acquires latest; npm/bootstrap may supply local candidates; the engine performs manifest-owned local changes. |
51
51
  | 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`. |
@@ -12,7 +12,7 @@ workflow strategy.
12
12
  | `update [flags]` | Refresh an existing managed installation. |
13
13
  | `uninstall [flags]` | Remove managed artifacts while preserving runtime workspace state. |
14
14
  | `check candidate <slug>` | Validate the strict manifest and compute the content-bound project-candidate identity. Exits `3` when the manifest omits a path the feature's `WIP(<slug>):` checkpoint commits changed (net from the feature base to HEAD). Also exits `3` with `unattributed root edit: <paths>` while the feature's `tree-baseline.json` tripwire flags a product path (ADR-0038; see `dispatch`). |
15
- | `check readiness <slug>` | Check target-Phase files, open human gates from Clarify onward, the `tasks.md` slice graph when that artifact is required, canonical `AC-###` presence in `tasks.md`/`test-plan.md` when those artifacts are required, and the current stable Build-input binding when applicable. Leaving Vet with a `Run at` column, a slice whose `Files likely touched`/`Writer allowlist` names a dependency manifest or lockfile needs a `dependency-dry-run SLICE-###` row at `vet` with a passing transcript. |
15
+ | `check readiness <slug>` | Check target-Phase files, open human gates from Clarify onward, the `tasks.md` slice graph when that artifact is required, canonical `AC-###` presence in `tasks.md`/`test-plan.md` when those artifacts are required, and the current stable Build-input binding when applicable. Leaving Vet with a `Run at` column, a slice whose `Files likely touched`/`Writer allowlist` names a dependency manifest or lockfile needs a `dependency-dry-run SLICE-###` row at `vet` with a passing transcript. Leaving Vet, every slice `state.md` does not check built (a deferred `Satisfies: none` slice excepted) must also pass the Build-entry `check slice` contract; each failure prints one `invariant: slice-check:` line naming the slice and its exact `check slice` reason, to fix in `/rite-plan` before READY. |
16
16
  | `check readiness --emit-binding <slug>` | Render the exact stable Build-input binding for Vet to record after review. |
17
17
  | `check preconditions <slug> [--slice SLICE-###] [--timeout N]` | Run the `test-plan.md` Build-entry preflight rows whose optional `Run at` cell is `vet` (with `--slice`, `pre-dispatch <SLICE>`); `action` rows and rows without the cell never run. Writes one candidate-bound transcript per row under `references/gates/preflight-*/`; a row passes on exit 0. Exit `3` on any failure or an invalid `Run at` value. |
18
18
  | `check seal <slug>` | Check files required by target Phase `seal`, open human gates, the `tasks.md` slice graph, canonical `AC-###` presence when `tasks.md`/`test-plan.md` are required, the stable Build-input binding, and exact candidate bindings. `check readiness` and `check seal` also block a `scripts/` test driver that a tasks.md Writer allowlist plans or touched-files.md lists when no gates.md `CHECK` runs it and no `Driver waiver: <path> — DEC-### <reason>` line cites a recorded decision; waived drivers print as `note: unexecuted driver (waived by DEC-###): <path>` lines, on pass or block. |
@@ -44,7 +44,7 @@ workflow strategy.
44
44
  | `metrics summary [slug] [--by-slice]` | Reduce `metrics.jsonl` into a per-phase roll-up. `--by-slice` reads `dispatch.json` instead: per slice, build wright rounds, slice-bound Vet rechecks, and agent-minutes (role start to `returned_at`; abandoned waves excluded). When the ledger has `resume` events it adds `resumes count=N minutes_to_dispatch=...` (each resume timed to the next `dispatch` event; `none` when another resume came first, `open` when none followed). |
45
45
  | `claim <add\|release\|list\|check>` | Advisory session-scoped file claims in `.devrites/claims.jsonl` (append-only). `add` records intent to write a path set with a TTL (1–240 min, default 30); a live claim by another session exits `3` and names the holder. `release` appends a release event owned by the claiming session. `list` shows every unreleased claim (live, expired, dead) plus one `N released (use --all)` count; `--all` includes released rows; a claim whose holding session has provably exited on this host shows `dead` and no longer conflicts. `check` is the read-only preflight for a path set. Coordination aid only — never a substitute for one-writer-per-worktree. |
46
46
  | `note <add\|list\|check\|rm> <slug> ...` | Anchored workspace notes in `notes.md`: `add <slug> <subject> <quote> <title> [body]` binds a note to a verbatim quote in one repository file and assigns `NOTE-###`; `list` and `check` regrade each anchor `exact`/`moved`/`stale`/`ambiguous`/`lost` by searching the repo for the quote (dependency and workspace trees excluded); `check --repair` rewrites a `moved` subject to its new file; `rm` deletes by ID. `check seal` refuses a malformed `notes.md` and any non-`exact` anchor. |
47
- | `gates <scaffold\|status\|run\|reverify\|lint\|precheck\|attest\|abandon> <slug>` | Operate the `gates.md` acceptance ledger: seed per-AC gates, execute runnable gates bound to `test-plan.md` preflight rows, attest manual gates, and reduce to `all-met`/`not-met`/`handoff`/`malformed`. A gate with `INPUTS:` records its files' content digest and is reused by `run` and `reverify` while they are unchanged. `run`/`reverify --transcripts` writes a redacted, candidate-bound transcript per executed or reused gate under `references/gates/<gate-id>/`. `precheck <slug> --worktree <path>` runs every `RUN: writer` gate and `check windows` against the wright's worktree, prints PASS/FAIL per gate id, exits `3` on any FAIL or on a malformed ledger, and writes no ledger, EVIDENCE line or transcript (`check windows` still appends its metric event); its output is never evidence. |
47
+ | `gates <scaffold\|status\|run\|reverify\|lint\|precheck\|attest\|abandon> <slug>` | Operate the `gates.md` acceptance ledger: seed per-AC gates, execute runnable gates bound to `test-plan.md` preflight rows, attest manual gates, and reduce to `all-met`/`not-met`/`handoff`/`malformed`. A gate with `INPUTS:` records its files' content digest and is reused by `run` and `reverify` while they are unchanged. `run`/`reverify --transcripts` writes a redacted, candidate-bound transcript per executed or reused gate under `references/gates/<gate-id>/`. `precheck <slug> --worktree <path> [--slice <SLICE-ID>]` runs every `RUN: writer` gate and `check windows` against the wright's worktree (with `--slice`, it prints `SKIP <gate-id>` for a gate whose id only other unbuilt slices name in `tasks.md`, since gate ids reuse `AC-###` ids; a gate no slice names still runs), prints PASS/FAIL per gate id, exits `3` on any FAIL or on a malformed ledger, and writes no ledger, EVIDENCE line or transcript (`check windows` still appends its metric event); its output is never evidence. |
48
48
  | `state resolve <qid> "<answer>"` | Resolve an open question and update `questions.md` plus `state.md` atomically. |
49
49
  | `state merge-manifest <slug> [pred...]` | Fold the recorded predecessor chain's manifests into the release candidate manifest. |
50
50
  | `state set <slug> <key>=<value>... [--unset <key>]...` | Write `state.md` cursor fields all-or-nothing under the feature lock. Refuses an unknown `phase`, the engine-owned `schema` row, a pipe or line break in a value, and an overwrite of a saved `return_phase`/`return_next_action`. Setting `status=awaiting_human` under `.devrites/AFK` prints each open question the sentinel's `allow_gates` auto-picks. |
package/engine/help.go CHANGED
@@ -109,7 +109,7 @@ const (
109
109
  gates reverify <slug> [--timeout N] [--transcripts] Re-execute every runnable gate, demoting stale passes
110
110
  (--transcripts: one redacted, candidate-bound file per gate in references/gates/)
111
111
  gates lint <slug> [--strict] Audit oracle quality without executing
112
- gates precheck <slug> --worktree <path> Run RUN: writer gates + check windows in <path>; no ledger, EVIDENCE or transcript write (check windows logs its metric); never evidence
112
+ gates precheck <slug> --worktree <path> [--slice <SLICE-ID>] Run RUN: writer gates + check windows in <path>; --slice skips gates owned only by other unbuilt slices; no ledger, EVIDENCE or transcript write (check windows logs its metric); never evidence
113
113
  gates attest <slug> <id> <note> Record human evidence on a manual gate
114
114
  gates abandon <slug> <id> <why> Record a terminal ABANDON handoff on a gate
115
115
  `
@@ -33,10 +33,11 @@ Subcommands:
33
33
  (--transcripts writes one redacted, candidate-bound
34
34
  file per gate under references/gates/<gate-id>/)
35
35
  lint <slug> [--strict] Audit oracle quality without executing
36
- precheck <slug> --worktree <path>
36
+ precheck <slug> --worktree <path> [--slice <SLICE-ID>]
37
37
  Run every RUN: writer gate, then check windows, in
38
38
  <path>; writes no ledger, EVIDENCE line or
39
- transcript (check windows still logs its metric)
39
+ transcript (check windows still logs its metric);
40
+ --slice skips gates owned only by other unbuilt slices
40
41
  attest <slug> <id> <note> Record human evidence on a manual gate
41
42
  abandon <slug> <id> <why> Record a terminal ABANDON handoff on a gate
42
43
 
@@ -373,18 +374,27 @@ func cmdLint(root string, args []string, stdout, stderr io.Writer) int {
373
374
  // lib.RunCheckWindows because acceptance cannot import lib (lib imports it).
374
375
  var WindowsCheck func(root string, args []string, stdout, stderr io.Writer) int
375
376
 
377
+ // PrecheckSkips maps each writer gate id `gates precheck --slice` skips to the
378
+ // unbuilt slices that own it; main wires it to lib.PrecheckSkips for the same
379
+ // reason as WindowsCheck.
380
+ var PrecheckSkips func(root, slug, slice string, gateIDs []string) (map[string]string, error)
381
+
376
382
  // cmdPrecheck is the wright's pre-return run of the `RUN: writer` gates and
377
383
  // `check windows` against its worktree. It reads gates.md but writes no
378
384
  // ledger, EVIDENCE line or transcript: nothing it prints is evidence, and the
379
- // root still runs every gate canonically.
385
+ // root still runs every gate canonically. --slice skips the gates that only
386
+ // other unbuilt slices own, whose capability the worktree cannot have yet.
380
387
  func cmdPrecheck(root string, args []string, stdout, stderr io.Writer) int {
381
- const usage = "usage: devrites-engine gates precheck <slug> --worktree <path>"
382
- var slug, worktree string
388
+ const usage = "usage: devrites-engine gates precheck <slug> --worktree <path> [--slice <SLICE-ID>]"
389
+ var slug, worktree, slice string
383
390
  for i := 0; i < len(args); i++ {
384
391
  switch {
385
392
  case args[i] == "--worktree" && i+1 < len(args) && worktree == "":
386
393
  worktree = args[i+1]
387
394
  i++
395
+ case args[i] == "--slice" && i+1 < len(args) && slice == "":
396
+ slice = args[i+1]
397
+ i++
388
398
  case strings.HasPrefix(args[i], "-") || slug != "":
389
399
  fmt.Fprintln(stderr, usage)
390
400
  return ExitUsage
@@ -392,7 +402,7 @@ func cmdPrecheck(root string, args []string, stdout, stderr io.Writer) int {
392
402
  slug = args[i]
393
403
  }
394
404
  }
395
- if slug == "" || worktree == "" {
405
+ if slug == "" || worktree == "" || (slice != "" && !state.ValidSliceID(slice)) {
396
406
  fmt.Fprintln(stderr, usage)
397
407
  return ExitUsage
398
408
  }
@@ -426,9 +436,29 @@ func cmdPrecheck(root string, args []string, stdout, stderr io.Writer) int {
426
436
  fmt.Fprintln(stdout, "precheck: fail (not evidence; fix before returning)")
427
437
  return ExitBlocked
428
438
  }
439
+ writers := doc.WriterGates()
440
+ var skips map[string]string
441
+ if slice != "" {
442
+ if PrecheckSkips == nil {
443
+ fmt.Fprintln(stderr, "gates precheck: --slice is not wired into this engine")
444
+ return ExitBlocked
445
+ }
446
+ ids := make([]string, len(writers))
447
+ for i, gate := range writers {
448
+ ids[i] = gate.ID
449
+ }
450
+ if skips, err = PrecheckSkips(root, slug, slice, ids); err != nil {
451
+ fmt.Fprintf(stderr, "gates precheck: %v\n", err)
452
+ return ExitBlocked
453
+ }
454
+ }
429
455
  failed := false
430
456
  approved := loadTestPlan(testPlanPath)
431
- for _, gate := range doc.WriterGates() {
457
+ for _, gate := range writers {
458
+ if owners := skips[gate.ID]; owners != "" {
459
+ fmt.Fprintf(stdout, "SKIP %s (owned by unbuilt %s, not %s)\n", gate.ID, owners, slice)
460
+ continue
461
+ }
432
462
  expectation, expectErr := CompileExpect(gate.Expect)
433
463
  switch {
434
464
  case gate.Check == "":
@@ -124,7 +124,7 @@ func lintWrightContractFor(root, slug, path string) error {
124
124
  block = block[:loc[1]-1-loc[0]+end[0]]
125
125
  }
126
126
  if !strings.Contains(string(block), "gates precheck") {
127
- return fmt.Errorf("wright contract %s: %s marks %s `RUN: writer`, so its `Writer-safe checks:` must include `devrites-engine gates precheck %s --worktree <path>`; the wright runs those rows and `check windows` and fixes failures before returning",
127
+ return fmt.Errorf("wright contract %s: %s marks %s `RUN: writer`, so its `Writer-safe checks:` must include `devrites-engine gates precheck %s --worktree <path> --slice <SLICE-ID>`; the wright runs those rows and `check windows` and fixes failures before returning",
128
128
  path, acceptance.GatesFile, writers[0].ID, slug)
129
129
  }
130
130
  return nil
@@ -137,7 +137,7 @@ func RunPacket(root string, args []string, stdout, stderr io.Writer) int {
137
137
  fmt.Fprintf(&b, "- %s\n", p)
138
138
  }
139
139
  if checks != "" {
140
- lines, err := writerSafeChecks(root, slug, checks)
140
+ lines, err := writerSafeChecks(root, slug, slice, checks)
141
141
  if err != nil {
142
142
  return fail(err)
143
143
  }
@@ -249,8 +249,8 @@ func frozenCandidate(workspace, wave string) (sums string, partial bool, err err
249
249
 
250
250
  // writerSafeChecks resolves each named gates.md gate to its CHECK, refusing an
251
251
  // unknown gate or a CHECK no approved test-plan.md preflight row vets, and adds
252
- // `gates precheck` when the ledger marks a gate `RUN: writer`.
253
- func writerSafeChecks(root, slug, ids string) (string, error) {
252
+ // `gates precheck --slice <slice>` when the ledger marks a gate `RUN: writer`.
253
+ func writerSafeChecks(root, slug, slice, ids string) (string, error) {
254
254
  ledger, err := readWorkspaceArtifact(root, slug, acceptance.GatesFile)
255
255
  if err != nil {
256
256
  return "", fmt.Errorf("--checks: %w", err)
@@ -288,7 +288,7 @@ func writerSafeChecks(root, slug, ids string) (string, error) {
288
288
  fmt.Fprintf(&rows, "- %s (cwd %s): `%s`\n", id, cwd, gate.Check)
289
289
  }
290
290
  if len(doc.WriterGates()) > 0 {
291
- fmt.Fprintf(&rows, "- gates precheck (cwd repository root): `devrites-engine gates precheck %s --worktree .`\n", slug)
291
+ fmt.Fprintf(&rows, "- gates precheck (cwd repository root): `devrites-engine gates precheck %s --worktree . --slice %s`\n", slug, slice)
292
292
  }
293
293
  return "Writer-safe checks: " + strings.Join(names, ", ") + "\n" + rows.String(), nil
294
294
  }
@@ -126,7 +126,55 @@ func RunCheckSlice(root string, args []string, stdout, stderr io.Writer) int {
126
126
  fmt.Fprintf(stderr, "check slice: %s not found in tasks.md\n", sliceID)
127
127
  return 3
128
128
  }
129
+ spec, specErr := readWorkspaceArtifact(root, slug, "spec.md")
130
+ problems := sliceContractProblems(block, spec, specErr)
129
131
 
132
+ if n, over := sliceSizeAdvisory(block); over {
133
+ fmt.Fprintf(stdout, "check slice: ADVISORY size: %s has %d Writer allowlist files (>= %d); consider an acceptance-preserving split\n", sliceID, n, sliceFileAdvisory)
134
+ }
135
+ printProportion(root, slug, sliceID, stdout)
136
+ if len(problems) > 0 {
137
+ fmt.Fprintf(stdout, "check slice: %s BLOCKED\n", sliceID)
138
+ for _, p := range problems {
139
+ fmt.Fprintf(stdout, " - %s\n", p)
140
+ }
141
+ return 3
142
+ }
143
+ allow, _ := fieldValue(sliceFields(block), "writer allowlist")
144
+ fmt.Fprintf(stdout, "check slice: %s ok (paths=%d acs=%d)\n", sliceID, len(parsePathList(allow)), len(sliceACRe.FindAllString(block, -1)))
145
+ return 0
146
+ }
147
+
148
+ // UnbuiltSliceProblems replays sliceContractProblems over every tasks.md slice
149
+ // state.md does not check built, so Vet fails on the defects Build-entry
150
+ // `check slice` would otherwise find one dispatch at a time. A deferred
151
+ // `Satisfies: none` slice is never dispatched and is skipped.
152
+ func UnbuiltSliceProblems(root, slug string) []string {
153
+ tasks, err := readWorkspaceArtifact(root, slug, "tasks.md")
154
+ if err != nil {
155
+ return []string{fmt.Sprintf("slice contracts cannot be checked: %v", err)}
156
+ }
157
+ built, err := builtSlices(root, slug)
158
+ if err != nil {
159
+ return []string{fmt.Sprintf("slice contracts cannot be checked: %v", err)}
160
+ }
161
+ spec, specErr := readWorkspaceArtifact(root, slug, "spec.md")
162
+ var problems []string
163
+ for _, s := range ParseTaskGraph(tasks).Slices {
164
+ block, _ := state.ExtractTaskSlice(tasks, s.ID)
165
+ if satisfies, _ := fieldValue(sliceFields(block), "satisfies"); built[sliceNumber(s.ID)] || strings.EqualFold(satisfies, "none") {
166
+ continue
167
+ }
168
+ for _, p := range sliceContractProblems(block, spec, specErr) {
169
+ problems = append(problems, fmt.Sprintf("%s would fail Build-entry `check slice`: %s; fix it in /rite-plan before READY", s.ID, p))
170
+ }
171
+ }
172
+ return problems
173
+ }
174
+
175
+ // sliceContractProblems returns every problem `check slice` blocks a slice's
176
+ // dispatch on. Each reads only the slice block and spec.md, never build state.
177
+ func sliceContractProblems(block string, spec []byte, specErr error) []string {
130
178
  var problems []string
131
179
  fields := sliceFields(block)
132
180
 
@@ -158,44 +206,28 @@ func RunCheckSlice(root string, args []string, stdout, stderr io.Writer) int {
158
206
  acs := sliceACRe.FindAllString(block, -1)
159
207
  if len(acs) == 0 {
160
208
  problems = append(problems, "no AC-### coverage declared — every slice must satisfy acceptance criteria")
209
+ } else if specErr != nil {
210
+ problems = append(problems, fmt.Sprintf("spec.md unavailable — cannot verify %d AC reference(s)", len(acs)))
161
211
  } else {
162
- spec, specErr := readWorkspaceArtifact(root, slug, "spec.md")
163
- if specErr != nil {
164
- problems = append(problems, fmt.Sprintf("spec.md unavailable — cannot verify %d AC reference(s)", len(acs)))
165
- } else {
166
- specText := string(spec)
167
- seen := map[string]bool{}
168
- var unknown []string
169
- for _, ac := range acs {
170
- if seen[ac] {
171
- continue
172
- }
173
- seen[ac] = true
174
- if !strings.Contains(specText, ac) {
175
- unknown = append(unknown, ac)
176
- }
212
+ specText := string(spec)
213
+ seen := map[string]bool{}
214
+ var unknown []string
215
+ for _, ac := range acs {
216
+ if seen[ac] {
217
+ continue
177
218
  }
178
- for _, ac := range unknown {
179
- problems = append(problems, fmt.Sprintf("%s is referenced but not declared in spec.md", ac))
219
+ seen[ac] = true
220
+ if !strings.Contains(specText, ac) {
221
+ unknown = append(unknown, ac)
180
222
  }
181
223
  }
224
+ for _, ac := range unknown {
225
+ problems = append(problems, fmt.Sprintf("%s is referenced but not declared in spec.md", ac))
226
+ }
182
227
  }
183
228
 
184
229
  if proof, ok := fieldValue(fields, "tests/proof", "tests", "proof"); !ok || proof == "" {
185
230
  problems = append(problems, "Tests/proof field missing or empty — no evidence plan for the slice")
186
231
  }
187
-
188
- if n, over := sliceSizeAdvisory(block); over {
189
- fmt.Fprintf(stdout, "check slice: ADVISORY size: %s has %d Writer allowlist files (>= %d); consider an acceptance-preserving split\n", sliceID, n, sliceFileAdvisory)
190
- }
191
- printProportion(root, slug, sliceID, stdout)
192
- if len(problems) > 0 {
193
- fmt.Fprintf(stdout, "check slice: %s BLOCKED\n", sliceID)
194
- for _, p := range problems {
195
- fmt.Fprintf(stdout, " - %s\n", p)
196
- }
197
- return 3
198
- }
199
- fmt.Fprintf(stdout, "check slice: %s ok (paths=%d acs=%d)\n", sliceID, len(allowlist), len(acs))
200
- return 0
232
+ return problems
201
233
  }
@@ -116,6 +116,45 @@ func PlanReady(repoRoot, slug string) ([]parallel.SlicePaths, error) {
116
116
  return planReady(filepath.Join(repoRoot, devritespaths.DevritesRootName), slug)
117
117
  }
118
118
 
119
+ // PrecheckSkips maps each gate id `gates precheck --slice <slice>` skips to the
120
+ // slices that own it. Gate ids reuse AC-### ids, so a gate's owners are the
121
+ // tasks.md slices whose block names its id; it is skipped only when no owner is
122
+ // slice or built. A gate no slice names still runs. root is the .devrites
123
+ // directory.
124
+ func PrecheckSkips(root, slug, slice string, gateIDs []string) (map[string]string, error) {
125
+ raw, err := readWorkspaceArtifact(root, slug, "tasks.md")
126
+ if err != nil {
127
+ return nil, err
128
+ }
129
+ if _, ok := state.ExtractTaskSlice(raw, slice); !ok {
130
+ return nil, fmt.Errorf("%s not found in tasks.md", slice)
131
+ }
132
+ built, err := builtSlices(root, slug)
133
+ if err != nil {
134
+ return nil, err
135
+ }
136
+ live := map[string]bool{}
137
+ owners := map[string][]string{}
138
+ for _, s := range ParseTaskGraph(raw).Slices {
139
+ block, _ := state.ExtractTaskSlice(raw, s.ID)
140
+ for _, ac := range sliceACRe.FindAllString(block, -1) {
141
+ switch {
142
+ case s.ID == slice || built[sliceNumber(s.ID)]:
143
+ live[ac] = true
144
+ case !slices.Contains(owners[ac], s.ID):
145
+ owners[ac] = append(owners[ac], s.ID)
146
+ }
147
+ }
148
+ }
149
+ skips := map[string]string{}
150
+ for _, id := range gateIDs {
151
+ if !live[id] && len(owners[id]) > 0 {
152
+ skips[id] = strings.Join(owners[id], ", ")
153
+ }
154
+ }
155
+ return skips, nil
156
+ }
157
+
119
158
  // planReady lists, in plan order, the tasks.md slices state.md does not check
120
159
  // built whose dependencies it all checks built, each with its sliceWritePaths
121
160
  // plus its dependency manifest and lockfile when it declares external
package/engine/main.go CHANGED
@@ -16,6 +16,7 @@ import (
16
16
  "github.com/devrites/devrites/internal/overhaul"
17
17
  "github.com/devrites/devrites/internal/parallel"
18
18
  "github.com/devrites/devrites/internal/rootfacts"
19
+ "github.com/devrites/devrites/internal/state"
19
20
  "github.com/devrites/devrites/internal/version"
20
21
  )
21
22
 
@@ -124,6 +125,8 @@ func init() {
124
125
  parallel.PlanReady = lib.PlanReady
125
126
  // `gates precheck` runs `check windows` through this hook for the same reason.
126
127
  acceptance.WindowsCheck = lib.RunCheckWindows
128
+ // ...and `gates precheck --slice` learns which writer gates to skip.
129
+ acceptance.PrecheckSkips = lib.PrecheckSkips
127
130
  }
128
131
 
129
132
  // run is the testable entry point. It returns the process exit code.
@@ -329,6 +332,18 @@ func cmdGate(root string, kind gate.Kind, args []string, stdout, stderr io.Write
329
332
  fmt.Fprintf(stderr, "devrites: %v\n", err)
330
333
  return exitUsage
331
334
  }
335
+ // Leaving Vet, every unbuilt slice must already pass Build-entry `check
336
+ // slice`. The gate package reads no workspace path itself, so the CLI
337
+ // composes this lib check onto its result, as seal does below.
338
+ if kind == gate.Readiness && result.Phase == state.PhaseVet && len(result.MissingFiles) == 0 {
339
+ for _, problem := range lib.UnbuiltSliceProblems(root, args[0]) {
340
+ result.StateProblems = append(result.StateProblems, "slice-check: "+problem)
341
+ if !result.Blocked {
342
+ result.Blocked = true
343
+ result.ReasonID = gate.ResultReasonID(kind, true)
344
+ }
345
+ }
346
+ }
332
347
  if result.Blocked {
333
348
  fmt.Fprint(stdout, result.Render())
334
349
  return exitBlocked
@@ -72,6 +72,13 @@ line, and then assign the band. Do not choose a score and justify it afterward:
72
72
  speculate about micro-optimizations.
73
73
  6. **Reversibility & blast radius:** treat auth, migration, public API, and data
74
74
  model changes conservatively. Every destructive step needs a rollback.
75
+ Close every unbuilt slice's write set against the live tree: real callers and
76
+ consumers of what it changes (`trace_path` inbound), tests that exercise
77
+ behavior it changes or retires, build/runtime/config files and generated
78
+ outputs its result needs, and tooling it relies on must each be owned by that
79
+ slice or an earlier one. Each gap is a `kind: contract` row naming the exact
80
+ path and owning slice. **Failing case:** a slice that moves startup into a
81
+ constructor omits the `main.go` caller, found only at its Build entry.
75
82
  7. **Failure-mode coverage:** for each new codepath, find a realistic failure such
76
83
  as a timeout, nil value, race, or stale state. A silent failure with **no test AND
77
84
  no error handling** is a critical gap. For every consumptive action under
@@ -107,7 +107,8 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
107
107
  in product source, tests, comments, or filenames.
108
108
  4. **VERIFY (fail-on-red).** Run writer-safe tests/types/lint: `Tests/proof` plus
109
109
  tests of changed code; `## Feature gates` rows are root-owned, except that when the
110
- contract lists `gates precheck` you run it on your worktree and fix every FAIL
110
+ contract lists `gates precheck --slice <SLICE-ID>` you run it on your worktree
111
+ (`SKIP` rows are gates of unbuilt slices) and fix every FAIL
111
112
  in your paths before returning; a FAIL you cannot fix there is an Escalation
112
113
  (its output is never evidence). Writer-safe means
113
114
  local and non-consumptive — syntax/type/lint, unit and self-check suites, and a
@@ -6,6 +6,19 @@ cursor forms remain readable, but a cursor with no `schema` row needs
6
6
  `devrites-engine migrate <slug>` before the engine accepts it. `/rite-upgrade` audits
7
7
  without path/alias/format migration.
8
8
 
9
+ ## Contents
10
+
11
+ - [Slug identity](#slug-identity)
12
+ - [Required by phase](#required-by-phase)
13
+ - [What each file owns](#what-each-file-owns)
14
+ - [Candidate manifest and bindings](#candidate-manifest-and-bindings)
15
+ - [Anchored notes](#anchored-notes)
16
+ - [Native readiness ownership](#native-readiness-ownership)
17
+ - [Canonical slice grammar](#canonical-slice-grammar)
18
+ - [Read next by phase](#read-next-by-phase)
19
+ - [Do not duplicate](#do-not-duplicate)
20
+ - [ID contract](#id-contract)
21
+
9
22
  ## Slug identity
10
23
 
11
24
  New slugs derive from the objective: lowercase ASCII kebab-case matching
@@ -214,6 +227,7 @@ Consumes / Produces: <interfaces read and exposed>
214
227
  Known-Gotchas: <ordering hazards and framework footguns | none>
215
228
  Prior-slice learnings: <constraints learned earlier | none>
216
229
  Files likely touched: <real paths>
230
+ Writer allowlist: <exact project-relative files the wright may edit (a superset of Files likely touched)>
217
231
  Tests/proof: <exact command + cwd + expected signal + prerequisites/provenance inputs>
218
232
  Browser proof required: <yes | no>
219
233
  Frontend craft required: <yes | no>
@@ -76,7 +76,9 @@ With a `test-plan.md` `## Feature gates` section, step 6 runs `Tests/proof` and
76
76
  other row; feature gates run once per parallel landing, on control, while worktree
77
77
  wrights continue. The next landing and Prove wait for them; red is a fingerprint
78
78
  against slices landed since the last green run. Serial same-worktree mode, and plans
79
- without the section, run every row each round.
79
+ without the section, run every row each round. Run gate, benchmark and proof commands
80
+ through the host's shell tool, never a code-evaluation subprocess, whose environment
81
+ can lack the owner's exported variables.
80
82
 
81
83
  ## Independent Build review
82
84
 
@@ -65,7 +65,9 @@ worktrees stay forbidden.
65
65
  A target composed only of vetted executable workflow artifacts routes to the
66
66
  controlling root under
67
67
  [`workflow-artifacts.md`](../../devrites-lib/reference/standards/workflow-artifacts.md);
68
- its rejection here is not a blocker.
68
+ its rejection here is not a blocker. Vet already closed the slice's write
69
+ set; re-check only consumers of files earlier slices changed since the
70
+ readiness binding, and fold a gap through `/rite-plan` before dispatch.
69
71
  2. Goal, verbatim acceptance, exclusions, context, `test-plan.md` proof
70
72
  commands, and applicable standards reach the wright through the slice bundle
71
73
  its contract names; only a native-worktree pilot contract adds the exact
@@ -87,8 +89,9 @@ worktrees stay forbidden.
87
89
  them: a wright that cannot execute writes blind and its failures surface a
88
90
  whole review round later. Only artifact-producing, consumptive, or full
89
91
  canonical feature gates stay root-owned; when `gates.md` has a `RUN: writer`
90
- gate, the checks include `devrites-engine gates precheck <slug> --worktree <path>`
91
- (those gates plus `check windows`; never evidence, root still runs every gate).
92
+ gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
93
+ (those gates, minus ones only other unbuilt slices own, plus `check windows`;
94
+ never evidence, root still runs every gate).
92
95
  3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
93
96
  unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
94
97
  baseline status before asking the host for isolation. **Failing case:** paths that
@@ -209,7 +209,10 @@ plan declares a root-authored executable workflow file, read
209
209
  `marker sweep:` line is recorded in `eng-review.md`; a kept hit blocks READY. Write phase/next step and emit one
210
210
  `Readiness inputs SHA-256` with
211
211
  `devrites-engine check readiness --emit-binding <slug>`; normal readiness check
212
- must pass. A `sequence_lookahead: yes` workspace also records one
212
+ must pass, and it replays Build-entry `check slice` on every unbuilt slice, so
213
+ READY needs each to pass (fix failures in `/rite-plan`). READY also needs every
214
+ unbuilt slice's write set closed against the live tree (plan-reviewer
215
+ dimension 6), so frontier gaps fold in one Plan repair, not one per slice. A `sequence_lookahead: yes` workspace also records one
213
216
  `Predecessor readiness: <predecessor> <digest>` line from the predecessor's
214
217
  `--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
215
218
  `devrites-engine check drift <slug> --record` — a later stale binding then
@@ -78,6 +78,13 @@ line, and then assign the band. Do not choose a score and justify it afterward:
78
78
  speculate about micro-optimizations.
79
79
  6. **Reversibility & blast radius:** treat auth, migration, public API, and data
80
80
  model changes conservatively. Every destructive step needs a rollback.
81
+ Close every unbuilt slice's write set against the live tree: real callers and
82
+ consumers of what it changes (`trace_path` inbound), tests that exercise
83
+ behavior it changes or retires, build/runtime/config files and generated
84
+ outputs its result needs, and tooling it relies on must each be owned by that
85
+ slice or an earlier one. Each gap is a `kind: contract` row naming the exact
86
+ path and owning slice. **Failing case:** a slice that moves startup into a
87
+ constructor omits the `main.go` caller, found only at its Build entry.
81
88
  7. **Failure-mode coverage:** for each new codepath, find a realistic failure such
82
89
  as a timeout, nil value, race, or stale state. A silent failure with **no test AND
83
90
  no error handling** is a critical gap. For every consumptive action under
@@ -107,7 +107,8 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
107
107
  in product source, tests, comments, or filenames.
108
108
  4. **VERIFY (fail-on-red).** Run writer-safe tests/types/lint: `Tests/proof` plus
109
109
  tests of changed code; `## Feature gates` rows are root-owned, except that when the
110
- contract lists `gates precheck` you run it on your worktree and fix every FAIL
110
+ contract lists `gates precheck --slice <SLICE-ID>` you run it on your worktree
111
+ (`SKIP` rows are gates of unbuilt slices) and fix every FAIL
111
112
  in your paths before returning; a FAIL you cannot fix there is an Escalation
112
113
  (its output is never evidence). Writer-safe means
113
114
  local and non-consumptive — syntax/type/lint, unit and self-check suites, and a
@@ -6,6 +6,19 @@ cursor forms remain readable, but a cursor with no `schema` row needs
6
6
  `devrites-engine migrate <slug>` before the engine accepts it. `/rite-upgrade` audits
7
7
  without path/alias/format migration.
8
8
 
9
+ ## Contents
10
+
11
+ - [Slug identity](#slug-identity)
12
+ - [Required by phase](#required-by-phase)
13
+ - [What each file owns](#what-each-file-owns)
14
+ - [Candidate manifest and bindings](#candidate-manifest-and-bindings)
15
+ - [Anchored notes](#anchored-notes)
16
+ - [Native readiness ownership](#native-readiness-ownership)
17
+ - [Canonical slice grammar](#canonical-slice-grammar)
18
+ - [Read next by phase](#read-next-by-phase)
19
+ - [Do not duplicate](#do-not-duplicate)
20
+ - [ID contract](#id-contract)
21
+
9
22
  ## Slug identity
10
23
 
11
24
  New slugs derive from the objective: lowercase ASCII kebab-case matching
@@ -214,6 +227,7 @@ Consumes / Produces: <interfaces read and exposed>
214
227
  Known-Gotchas: <ordering hazards and framework footguns | none>
215
228
  Prior-slice learnings: <constraints learned earlier | none>
216
229
  Files likely touched: <real paths>
230
+ Writer allowlist: <exact project-relative files the wright may edit (a superset of Files likely touched)>
217
231
  Tests/proof: <exact command + cwd + expected signal + prerequisites/provenance inputs>
218
232
  Browser proof required: <yes | no>
219
233
  Frontend craft required: <yes | no>
@@ -76,7 +76,9 @@ With a `test-plan.md` `## Feature gates` section, step 6 runs `Tests/proof` and
76
76
  other row; feature gates run once per parallel landing, on control, while worktree
77
77
  wrights continue. The next landing and Prove wait for them; red is a fingerprint
78
78
  against slices landed since the last green run. Serial same-worktree mode, and plans
79
- without the section, run every row each round.
79
+ without the section, run every row each round. Run gate, benchmark and proof commands
80
+ through the host's shell tool, never a code-evaluation subprocess, whose environment
81
+ can lack the owner's exported variables.
80
82
 
81
83
  ## Independent Build review
82
84
 
@@ -65,7 +65,9 @@ worktrees stay forbidden.
65
65
  A target composed only of vetted executable workflow artifacts routes to the
66
66
  controlling root under
67
67
  [`workflow-artifacts.md`](../../devrites-lib/reference/standards/workflow-artifacts.md);
68
- its rejection here is not a blocker.
68
+ its rejection here is not a blocker. Vet already closed the slice's write
69
+ set; re-check only consumers of files earlier slices changed since the
70
+ readiness binding, and fold a gap through `/rite-plan` before dispatch.
69
71
  2. Goal, verbatim acceptance, exclusions, context, `test-plan.md` proof
70
72
  commands, and applicable standards reach the wright through the slice bundle
71
73
  its contract names; only a native-worktree pilot contract adds the exact
@@ -87,8 +89,9 @@ worktrees stay forbidden.
87
89
  them: a wright that cannot execute writes blind and its failures surface a
88
90
  whole review round later. Only artifact-producing, consumptive, or full
89
91
  canonical feature gates stay root-owned; when `gates.md` has a `RUN: writer`
90
- gate, the checks include `devrites-engine gates precheck <slug> --worktree <path>`
91
- (those gates plus `check windows`; never evidence, root still runs every gate).
92
+ gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
93
+ (those gates, minus ones only other unbuilt slices own, plus `check windows`;
94
+ never evidence, root still runs every gate).
92
95
  3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
93
96
  unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
94
97
  baseline status before asking the host for isolation. **Failing case:** paths that
@@ -211,7 +211,10 @@ plan declares a root-authored executable workflow file, read
211
211
  `marker sweep:` line is recorded in `eng-review.md`; a kept hit blocks READY. Write phase/next step and emit one
212
212
  `Readiness inputs SHA-256` with
213
213
  `devrites-engine check readiness --emit-binding <slug>`; normal readiness check
214
- must pass. A `sequence_lookahead: yes` workspace also records one
214
+ must pass, and it replays Build-entry `check slice` on every unbuilt slice, so
215
+ READY needs each to pass (fix failures in `/rite-plan`). READY also needs every
216
+ unbuilt slice's write set closed against the live tree (plan-reviewer
217
+ dimension 6), so frontier gaps fold in one Plan repair, not one per slice. A `sequence_lookahead: yes` workspace also records one
215
218
  `Predecessor readiness: <predecessor> <digest>` line from the predecessor's
216
219
  `--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
217
220
  `devrites-engine check drift <slug> --record` — a later stale binding then
@@ -76,6 +76,13 @@ line, and then assign the band. Do not choose a score and justify it afterward:
76
76
  speculate about micro-optimizations.
77
77
  6. **Reversibility & blast radius:** treat auth, migration, public API, and data
78
78
  model changes conservatively. Every destructive step needs a rollback.
79
+ Close every unbuilt slice's write set against the live tree: real callers and
80
+ consumers of what it changes (`trace_path` inbound), tests that exercise
81
+ behavior it changes or retires, build/runtime/config files and generated
82
+ outputs its result needs, and tooling it relies on must each be owned by that
83
+ slice or an earlier one. Each gap is a `kind: contract` row naming the exact
84
+ path and owning slice. **Failing case:** a slice that moves startup into a
85
+ constructor omits the `main.go` caller, found only at its Build entry.
79
86
  7. **Failure-mode coverage:** for each new codepath, find a realistic failure such
80
87
  as a timeout, nil value, race, or stale state. A silent failure with **no test AND
81
88
  no error handling** is a critical gap. For every consumptive action under
@@ -105,7 +105,8 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
105
105
  in product source, tests, comments, or filenames.
106
106
  4. **VERIFY (fail-on-red).** Run writer-safe tests/types/lint: `Tests/proof` plus
107
107
  tests of changed code; `## Feature gates` rows are root-owned, except that when the
108
- contract lists `gates precheck` you run it on your worktree and fix every FAIL
108
+ contract lists `gates precheck --slice <SLICE-ID>` you run it on your worktree
109
+ (`SKIP` rows are gates of unbuilt slices) and fix every FAIL
109
110
  in your paths before returning; a FAIL you cannot fix there is an Escalation
110
111
  (its output is never evidence). Writer-safe means
111
112
  local and non-consumptive — syntax/type/lint, unit and self-check suites, and a
@@ -6,6 +6,19 @@ cursor forms remain readable, but a cursor with no `schema` row needs
6
6
  `devrites-engine migrate <slug>` before the engine accepts it. `$rite-upgrade` audits
7
7
  without path/alias/format migration.
8
8
 
9
+ ## Contents
10
+
11
+ - [Slug identity](#slug-identity)
12
+ - [Required by phase](#required-by-phase)
13
+ - [What each file owns](#what-each-file-owns)
14
+ - [Candidate manifest and bindings](#candidate-manifest-and-bindings)
15
+ - [Anchored notes](#anchored-notes)
16
+ - [Native readiness ownership](#native-readiness-ownership)
17
+ - [Canonical slice grammar](#canonical-slice-grammar)
18
+ - [Read next by phase](#read-next-by-phase)
19
+ - [Do not duplicate](#do-not-duplicate)
20
+ - [ID contract](#id-contract)
21
+
9
22
  ## Slug identity
10
23
 
11
24
  New slugs derive from the objective: lowercase ASCII kebab-case matching
@@ -214,6 +227,7 @@ Consumes / Produces: <interfaces read and exposed>
214
227
  Known-Gotchas: <ordering hazards and framework footguns | none>
215
228
  Prior-slice learnings: <constraints learned earlier | none>
216
229
  Files likely touched: <real paths>
230
+ Writer allowlist: <exact project-relative files the wright may edit (a superset of Files likely touched)>
217
231
  Tests/proof: <exact command + cwd + expected signal + prerequisites/provenance inputs>
218
232
  Browser proof required: <yes | no>
219
233
  Frontend craft required: <yes | no>
@@ -76,7 +76,9 @@ With a `test-plan.md` `## Feature gates` section, step 6 runs `Tests/proof` and
76
76
  other row; feature gates run once per parallel landing, on control, while worktree
77
77
  wrights continue. The next landing and Prove wait for them; red is a fingerprint
78
78
  against slices landed since the last green run. Serial same-worktree mode, and plans
79
- without the section, run every row each round.
79
+ without the section, run every row each round. Run gate, benchmark and proof commands
80
+ through the host's shell tool, never a code-evaluation subprocess, whose environment
81
+ can lack the owner's exported variables.
80
82
 
81
83
  ## Independent Build review
82
84
 
@@ -65,7 +65,9 @@ worktrees stay forbidden.
65
65
  A target composed only of vetted executable workflow artifacts routes to the
66
66
  controlling root under
67
67
  [`workflow-artifacts.md`](../../devrites-lib/reference/standards/workflow-artifacts.md);
68
- its rejection here is not a blocker.
68
+ its rejection here is not a blocker. Vet already closed the slice's write
69
+ set; re-check only consumers of files earlier slices changed since the
70
+ readiness binding, and fold a gap through `$rite-plan` before dispatch.
69
71
  2. Goal, verbatim acceptance, exclusions, context, `test-plan.md` proof
70
72
  commands, and applicable standards reach the wright through the slice bundle
71
73
  its contract names; only a native-worktree pilot contract adds the exact
@@ -87,8 +89,9 @@ worktrees stay forbidden.
87
89
  them: a wright that cannot execute writes blind and its failures surface a
88
90
  whole review round later. Only artifact-producing, consumptive, or full
89
91
  canonical feature gates stay root-owned; when `gates.md` has a `RUN: writer`
90
- gate, the checks include `devrites-engine gates precheck <slug> --worktree <path>`
91
- (those gates plus `check windows`; never evidence, root still runs every gate).
92
+ gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
93
+ (those gates, minus ones only other unbuilt slices own, plus `check windows`;
94
+ never evidence, root still runs every gate).
92
95
  3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
93
96
  unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
94
97
  baseline status before asking the host for isolation. **Failing case:** paths that
@@ -211,7 +211,10 @@ plan declares a root-authored executable workflow file, read
211
211
  `marker sweep:` line is recorded in `eng-review.md`; a kept hit blocks READY. Write phase/next step and emit one
212
212
  `Readiness inputs SHA-256` with
213
213
  `devrites-engine check readiness --emit-binding <slug>`; normal readiness check
214
- must pass. A `sequence_lookahead: yes` workspace also records one
214
+ must pass, and it replays Build-entry `check slice` on every unbuilt slice, so
215
+ READY needs each to pass (fix failures in `$rite-plan`). READY also needs every
216
+ unbuilt slice's write set closed against the live tree (plan-reviewer
217
+ dimension 6), so frontier gaps fold in one Plan repair, not one per slice. A `sequence_lookahead: yes` workspace also records one
215
218
  `Predecessor readiness: <predecessor> <digest>` line from the predecessor's
216
219
  `--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
217
220
  `devrites-engine check drift <slug> --record` — a later stale binding then
@@ -80,6 +80,13 @@ line, and then assign the band. Do not choose a score and justify it afterward:
80
80
  speculate about micro-optimizations.
81
81
  6. **Reversibility & blast radius:** treat auth, migration, public API, and data
82
82
  model changes conservatively. Every destructive step needs a rollback.
83
+ Close every unbuilt slice's write set against the live tree: real callers and
84
+ consumers of what it changes (`trace_path` inbound), tests that exercise
85
+ behavior it changes or retires, build/runtime/config files and generated
86
+ outputs its result needs, and tooling it relies on must each be owned by that
87
+ slice or an earlier one. Each gap is a `kind: contract` row naming the exact
88
+ path and owning slice. **Failing case:** a slice that moves startup into a
89
+ constructor omits the `main.go` caller, found only at its Build entry.
83
90
  7. **Failure-mode coverage:** for each new codepath, find a realistic failure such
84
91
  as a timeout, nil value, race, or stale state. A silent failure with **no test AND
85
92
  no error handling** is a critical gap. For every consumptive action under
@@ -112,7 +112,8 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
112
112
  in product source, tests, comments, or filenames.
113
113
  4. **VERIFY (fail-on-red).** Run writer-safe tests/types/lint: `Tests/proof` plus
114
114
  tests of changed code; `## Feature gates` rows are root-owned, except that when the
115
- contract lists `gates precheck` you run it on your worktree and fix every FAIL
115
+ contract lists `gates precheck --slice <SLICE-ID>` you run it on your worktree
116
+ (`SKIP` rows are gates of unbuilt slices) and fix every FAIL
116
117
  in your paths before returning; a FAIL you cannot fix there is an Escalation
117
118
  (its output is never evidence). Writer-safe means
118
119
  local and non-consumptive — syntax/type/lint, unit and self-check suites, and a
@@ -6,6 +6,19 @@ cursor forms remain readable, but a cursor with no `schema` row needs
6
6
  `devrites-engine migrate <slug>` before the engine accepts it. `/rite-upgrade` audits
7
7
  without path/alias/format migration.
8
8
 
9
+ ## Contents
10
+
11
+ - [Slug identity](#slug-identity)
12
+ - [Required by phase](#required-by-phase)
13
+ - [What each file owns](#what-each-file-owns)
14
+ - [Candidate manifest and bindings](#candidate-manifest-and-bindings)
15
+ - [Anchored notes](#anchored-notes)
16
+ - [Native readiness ownership](#native-readiness-ownership)
17
+ - [Canonical slice grammar](#canonical-slice-grammar)
18
+ - [Read next by phase](#read-next-by-phase)
19
+ - [Do not duplicate](#do-not-duplicate)
20
+ - [ID contract](#id-contract)
21
+
9
22
  ## Slug identity
10
23
 
11
24
  New slugs derive from the objective: lowercase ASCII kebab-case matching
@@ -214,6 +227,7 @@ Consumes / Produces: <interfaces read and exposed>
214
227
  Known-Gotchas: <ordering hazards and framework footguns | none>
215
228
  Prior-slice learnings: <constraints learned earlier | none>
216
229
  Files likely touched: <real paths>
230
+ Writer allowlist: <exact project-relative files the wright may edit (a superset of Files likely touched)>
217
231
  Tests/proof: <exact command + cwd + expected signal + prerequisites/provenance inputs>
218
232
  Browser proof required: <yes | no>
219
233
  Frontend craft required: <yes | no>
@@ -76,7 +76,9 @@ With a `test-plan.md` `## Feature gates` section, step 6 runs `Tests/proof` and
76
76
  other row; feature gates run once per parallel landing, on control, while worktree
77
77
  wrights continue. The next landing and Prove wait for them; red is a fingerprint
78
78
  against slices landed since the last green run. Serial same-worktree mode, and plans
79
- without the section, run every row each round.
79
+ without the section, run every row each round. Run gate, benchmark and proof commands
80
+ through the host's shell tool, never a code-evaluation subprocess, whose environment
81
+ can lack the owner's exported variables.
80
82
 
81
83
  ## Independent Build review
82
84
 
@@ -65,7 +65,9 @@ worktrees stay forbidden.
65
65
  A target composed only of vetted executable workflow artifacts routes to the
66
66
  controlling root under
67
67
  [`workflow-artifacts.md`](../../devrites-lib/reference/standards/workflow-artifacts.md);
68
- its rejection here is not a blocker.
68
+ its rejection here is not a blocker. Vet already closed the slice's write
69
+ set; re-check only consumers of files earlier slices changed since the
70
+ readiness binding, and fold a gap through `/rite-plan` before dispatch.
69
71
  2. Goal, verbatim acceptance, exclusions, context, `test-plan.md` proof
70
72
  commands, and applicable standards reach the wright through the slice bundle
71
73
  its contract names; only a native-worktree pilot contract adds the exact
@@ -87,8 +89,9 @@ worktrees stay forbidden.
87
89
  them: a wright that cannot execute writes blind and its failures surface a
88
90
  whole review round later. Only artifact-producing, consumptive, or full
89
91
  canonical feature gates stay root-owned; when `gates.md` has a `RUN: writer`
90
- gate, the checks include `devrites-engine gates precheck <slug> --worktree <path>`
91
- (those gates plus `check windows`; never evidence, root still runs every gate).
92
+ gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
93
+ (those gates, minus ones only other unbuilt slices own, plus `check windows`;
94
+ never evidence, root still runs every gate).
92
95
  3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
93
96
  unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
94
97
  baseline status before asking the host for isolation. **Failing case:** paths that
@@ -210,7 +210,10 @@ plan declares a root-authored executable workflow file, read
210
210
  `marker sweep:` line is recorded in `eng-review.md`; a kept hit blocks READY. Write phase/next step and emit one
211
211
  `Readiness inputs SHA-256` with
212
212
  `devrites-engine check readiness --emit-binding <slug>`; normal readiness check
213
- must pass. A `sequence_lookahead: yes` workspace also records one
213
+ must pass, and it replays Build-entry `check slice` on every unbuilt slice, so
214
+ READY needs each to pass (fix failures in `/rite-plan`). READY also needs every
215
+ unbuilt slice's write set closed against the live tree (plan-reviewer
216
+ dimension 6), so frontier gaps fold in one Plan repair, not one per slice. A `sequence_lookahead: yes` workspace also records one
214
217
  `Predecessor readiness: <predecessor> <digest>` line from the predecessor's
215
218
  `--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
216
219
  `devrites-engine check drift <slug> --record` — a later stale binding then
@@ -77,6 +77,13 @@ line, and then assign the band. Do not choose a score and justify it afterward:
77
77
  speculate about micro-optimizations.
78
78
  6. **Reversibility & blast radius:** treat auth, migration, public API, and data
79
79
  model changes conservatively. Every destructive step needs a rollback.
80
+ Close every unbuilt slice's write set against the live tree: real callers and
81
+ consumers of what it changes (`trace_path` inbound), tests that exercise
82
+ behavior it changes or retires, build/runtime/config files and generated
83
+ outputs its result needs, and tooling it relies on must each be owned by that
84
+ slice or an earlier one. Each gap is a `kind: contract` row naming the exact
85
+ path and owning slice. **Failing case:** a slice that moves startup into a
86
+ constructor omits the `main.go` caller, found only at its Build entry.
80
87
  7. **Failure-mode coverage:** for each new codepath, find a realistic failure such
81
88
  as a timeout, nil value, race, or stale state. A silent failure with **no test AND
82
89
  no error handling** is a critical gap. For every consumptive action under
@@ -105,7 +105,8 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
105
105
  in product source, tests, comments, or filenames.
106
106
  4. **VERIFY (fail-on-red).** Run writer-safe tests/types/lint: `Tests/proof` plus
107
107
  tests of changed code; `## Feature gates` rows are root-owned, except that when the
108
- contract lists `gates precheck` you run it on your worktree and fix every FAIL
108
+ contract lists `gates precheck --slice <SLICE-ID>` you run it on your worktree
109
+ (`SKIP` rows are gates of unbuilt slices) and fix every FAIL
109
110
  in your paths before returning; a FAIL you cannot fix there is an Escalation
110
111
  (its output is never evidence). Writer-safe means
111
112
  local and non-consumptive — syntax/type/lint, unit and self-check suites, and a
@@ -6,6 +6,19 @@ cursor forms remain readable, but a cursor with no `schema` row needs
6
6
  `devrites-engine migrate <slug>` before the engine accepts it. `/rite-upgrade` audits
7
7
  without path/alias/format migration.
8
8
 
9
+ ## Contents
10
+
11
+ - [Slug identity](#slug-identity)
12
+ - [Required by phase](#required-by-phase)
13
+ - [What each file owns](#what-each-file-owns)
14
+ - [Candidate manifest and bindings](#candidate-manifest-and-bindings)
15
+ - [Anchored notes](#anchored-notes)
16
+ - [Native readiness ownership](#native-readiness-ownership)
17
+ - [Canonical slice grammar](#canonical-slice-grammar)
18
+ - [Read next by phase](#read-next-by-phase)
19
+ - [Do not duplicate](#do-not-duplicate)
20
+ - [ID contract](#id-contract)
21
+
9
22
  ## Slug identity
10
23
 
11
24
  New slugs derive from the objective: lowercase ASCII kebab-case matching
@@ -214,6 +227,7 @@ Consumes / Produces: <interfaces read and exposed>
214
227
  Known-Gotchas: <ordering hazards and framework footguns | none>
215
228
  Prior-slice learnings: <constraints learned earlier | none>
216
229
  Files likely touched: <real paths>
230
+ Writer allowlist: <exact project-relative files the wright may edit (a superset of Files likely touched)>
217
231
  Tests/proof: <exact command + cwd + expected signal + prerequisites/provenance inputs>
218
232
  Browser proof required: <yes | no>
219
233
  Frontend craft required: <yes | no>
@@ -76,7 +76,9 @@ With a `test-plan.md` `## Feature gates` section, step 6 runs `Tests/proof` and
76
76
  other row; feature gates run once per parallel landing, on control, while worktree
77
77
  wrights continue. The next landing and Prove wait for them; red is a fingerprint
78
78
  against slices landed since the last green run. Serial same-worktree mode, and plans
79
- without the section, run every row each round.
79
+ without the section, run every row each round. Run gate, benchmark and proof commands
80
+ through the host's shell tool, never a code-evaluation subprocess, whose environment
81
+ can lack the owner's exported variables.
80
82
 
81
83
  ## Independent Build review
82
84
 
@@ -65,7 +65,9 @@ worktrees stay forbidden.
65
65
  A target composed only of vetted executable workflow artifacts routes to the
66
66
  controlling root under
67
67
  [`workflow-artifacts.md`](skill://devrites-lib/reference/standards/workflow-artifacts.md);
68
- its rejection here is not a blocker.
68
+ its rejection here is not a blocker. Vet already closed the slice's write
69
+ set; re-check only consumers of files earlier slices changed since the
70
+ readiness binding, and fold a gap through `/rite-plan` before dispatch.
69
71
  2. Goal, verbatim acceptance, exclusions, context, `test-plan.md` proof
70
72
  commands, and applicable standards reach the wright through the slice bundle
71
73
  its contract names; only a native-worktree pilot contract adds the exact
@@ -87,8 +89,9 @@ worktrees stay forbidden.
87
89
  them: a wright that cannot execute writes blind and its failures surface a
88
90
  whole review round later. Only artifact-producing, consumptive, or full
89
91
  canonical feature gates stay root-owned; when `gates.md` has a `RUN: writer`
90
- gate, the checks include `devrites-engine gates precheck <slug> --worktree <path>`
91
- (those gates plus `check windows`; never evidence, root still runs every gate).
92
+ gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
93
+ (those gates, minus ones only other unbuilt slices own, plus `check windows`;
94
+ never evidence, root still runs every gate).
92
95
  3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
93
96
  unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
94
97
  baseline status before asking the host for isolation. **Failing case:** paths that
@@ -211,7 +211,10 @@ plan declares a root-authored executable workflow file, read
211
211
  `marker sweep:` line is recorded in `eng-review.md`; a kept hit blocks READY. Write phase/next step and emit one
212
212
  `Readiness inputs SHA-256` with
213
213
  `devrites-engine check readiness --emit-binding <slug>`; normal readiness check
214
- must pass. A `sequence_lookahead: yes` workspace also records one
214
+ must pass, and it replays Build-entry `check slice` on every unbuilt slice, so
215
+ READY needs each to pass (fix failures in `/rite-plan`). READY also needs every
216
+ unbuilt slice's write set closed against the live tree (plan-reviewer
217
+ dimension 6), so frontier gaps fold in one Plan repair, not one per slice. A `sequence_lookahead: yes` workspace also records one
215
218
  `Predecessor readiness: <predecessor> <digest>` line from the predecessor's
216
219
  `--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
217
220
  `devrites-engine check drift <slug> --record` — a later stale binding then
@@ -78,6 +78,13 @@ line, and then assign the band. Do not choose a score and justify it afterward:
78
78
  speculate about micro-optimizations.
79
79
  6. **Reversibility & blast radius:** treat auth, migration, public API, and data
80
80
  model changes conservatively. Every destructive step needs a rollback.
81
+ Close every unbuilt slice's write set against the live tree: real callers and
82
+ consumers of what it changes (`trace_path` inbound), tests that exercise
83
+ behavior it changes or retires, build/runtime/config files and generated
84
+ outputs its result needs, and tooling it relies on must each be owned by that
85
+ slice or an earlier one. Each gap is a `kind: contract` row naming the exact
86
+ path and owning slice. **Failing case:** a slice that moves startup into a
87
+ constructor omits the `main.go` caller, found only at its Build entry.
81
88
  7. **Failure-mode coverage:** for each new codepath, find a realistic failure such
82
89
  as a timeout, nil value, race, or stale state. A silent failure with **no test AND
83
90
  no error handling** is a critical gap. For every consumptive action under
@@ -106,7 +106,8 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
106
106
  in product source, tests, comments, or filenames.
107
107
  4. **VERIFY (fail-on-red).** Run writer-safe tests/types/lint: `Tests/proof` plus
108
108
  tests of changed code; `## Feature gates` rows are root-owned, except that when the
109
- contract lists `gates precheck` you run it on your worktree and fix every FAIL
109
+ contract lists `gates precheck --slice <SLICE-ID>` you run it on your worktree
110
+ (`SKIP` rows are gates of unbuilt slices) and fix every FAIL
110
111
  in your paths before returning; a FAIL you cannot fix there is an Escalation
111
112
  (its output is never evidence). Writer-safe means
112
113
  local and non-consumptive — syntax/type/lint, unit and self-check suites, and a
@@ -6,6 +6,19 @@ cursor forms remain readable, but a cursor with no `schema` row needs
6
6
  `devrites-engine migrate <slug>` before the engine accepts it. `/rite-upgrade` audits
7
7
  without path/alias/format migration.
8
8
 
9
+ ## Contents
10
+
11
+ - [Slug identity](#slug-identity)
12
+ - [Required by phase](#required-by-phase)
13
+ - [What each file owns](#what-each-file-owns)
14
+ - [Candidate manifest and bindings](#candidate-manifest-and-bindings)
15
+ - [Anchored notes](#anchored-notes)
16
+ - [Native readiness ownership](#native-readiness-ownership)
17
+ - [Canonical slice grammar](#canonical-slice-grammar)
18
+ - [Read next by phase](#read-next-by-phase)
19
+ - [Do not duplicate](#do-not-duplicate)
20
+ - [ID contract](#id-contract)
21
+
9
22
  ## Slug identity
10
23
 
11
24
  New slugs derive from the objective: lowercase ASCII kebab-case matching
@@ -214,6 +227,7 @@ Consumes / Produces: <interfaces read and exposed>
214
227
  Known-Gotchas: <ordering hazards and framework footguns | none>
215
228
  Prior-slice learnings: <constraints learned earlier | none>
216
229
  Files likely touched: <real paths>
230
+ Writer allowlist: <exact project-relative files the wright may edit (a superset of Files likely touched)>
217
231
  Tests/proof: <exact command + cwd + expected signal + prerequisites/provenance inputs>
218
232
  Browser proof required: <yes | no>
219
233
  Frontend craft required: <yes | no>
@@ -76,7 +76,9 @@ With a `test-plan.md` `## Feature gates` section, step 6 runs `Tests/proof` and
76
76
  other row; feature gates run once per parallel landing, on control, while worktree
77
77
  wrights continue. The next landing and Prove wait for them; red is a fingerprint
78
78
  against slices landed since the last green run. Serial same-worktree mode, and plans
79
- without the section, run every row each round.
79
+ without the section, run every row each round. Run gate, benchmark and proof commands
80
+ through the host's shell tool, never a code-evaluation subprocess, whose environment
81
+ can lack the owner's exported variables.
80
82
 
81
83
  ## Independent Build review
82
84
 
@@ -65,7 +65,9 @@ worktrees stay forbidden.
65
65
  A target composed only of vetted executable workflow artifacts routes to the
66
66
  controlling root under
67
67
  [`workflow-artifacts.md`](../../devrites-lib/reference/standards/workflow-artifacts.md);
68
- its rejection here is not a blocker.
68
+ its rejection here is not a blocker. Vet already closed the slice's write
69
+ set; re-check only consumers of files earlier slices changed since the
70
+ readiness binding, and fold a gap through `/rite-plan` before dispatch.
69
71
  2. Goal, verbatim acceptance, exclusions, context, `test-plan.md` proof
70
72
  commands, and applicable standards reach the wright through the slice bundle
71
73
  its contract names; only a native-worktree pilot contract adds the exact
@@ -87,8 +89,9 @@ worktrees stay forbidden.
87
89
  them: a wright that cannot execute writes blind and its failures surface a
88
90
  whole review round later. Only artifact-producing, consumptive, or full
89
91
  canonical feature gates stay root-owned; when `gates.md` has a `RUN: writer`
90
- gate, the checks include `devrites-engine gates precheck <slug> --worktree <path>`
91
- (those gates plus `check windows`; never evidence, root still runs every gate).
92
+ gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
93
+ (those gates, minus ones only other unbuilt slices own, plus `check windows`;
94
+ never evidence, root still runs every gate).
92
95
  3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
93
96
  unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
94
97
  baseline status before asking the host for isolation. **Failing case:** paths that
@@ -211,7 +211,10 @@ plan declares a root-authored executable workflow file, read
211
211
  `marker sweep:` line is recorded in `eng-review.md`; a kept hit blocks READY. Write phase/next step and emit one
212
212
  `Readiness inputs SHA-256` with
213
213
  `devrites-engine check readiness --emit-binding <slug>`; normal readiness check
214
- must pass. A `sequence_lookahead: yes` workspace also records one
214
+ must pass, and it replays Build-entry `check slice` on every unbuilt slice, so
215
+ READY needs each to pass (fix failures in `/rite-plan`). READY also needs every
216
+ unbuilt slice's write set closed against the live tree (plan-reviewer
217
+ dimension 6), so frontier gaps fold in one Plan repair, not one per slice. A `sequence_lookahead: yes` workspace also records one
215
218
  `Predecessor readiness: <predecessor> <digest>` line from the predecessor's
216
219
  `--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
217
220
  `devrites-engine check drift <slug> --record` — a later stale binding then
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devrites",
3
- "version": "7.0.4",
3
+ "version": "7.0.6",
4
4
  "description": "DevRites: a disciplined senior-engineer workflow pack for Claude Code, Codex, omp, pi, and Devin CLI",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://github.com/ViktorsBaikers/DevRites#readme",
@@ -90,7 +90,7 @@
90
90
  "@semantic-release/commit-analyzer": "14.0.0-beta.4",
91
91
  "@semantic-release/release-notes-generator": "15.0.0-beta.3",
92
92
  "@semantic-release/npm": {
93
- "npm": "11.20.0"
93
+ "npm": "11.21.1"
94
94
  },
95
95
  "fast-uri": "3.1.8",
96
96
  "js-yaml": "4.3.2"