devrites 7.0.3 → 7.0.5
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 +13 -0
- package/README.md +1 -1
- package/docs/cli.md +5 -3
- package/docs/command-map.md +1 -1
- package/docs/engine/commands.md +2 -2
- package/engine/help.go +1 -1
- package/engine/internal/acceptance/cli.go +37 -7
- package/engine/internal/lib/dispatch_contract.go +1 -1
- package/engine/internal/lib/packet.go +4 -4
- package/engine/internal/lib/slicecheck.go +63 -31
- package/engine/internal/lib/taskgraph.go +39 -0
- package/engine/main.go +15 -0
- package/pack/.claude/agents/devrites-slice-wright.md +2 -1
- package/pack/.claude/skills/devrites-lib/reference/standards/agents.md +6 -0
- package/pack/.claude/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +3 -1
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +3 -2
- package/pack/.claude/skills/rite-vet/SKILL.md +2 -1
- package/pack/generated/claude/agents/devrites-slice-wright.md +2 -1
- package/pack/generated/claude/skills/devrites-lib/reference/standards/agents.md +6 -0
- package/pack/generated/claude/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +3 -1
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +3 -2
- package/pack/generated/claude/skills/rite-vet/SKILL.md +2 -1
- package/pack/generated/codex/agents/devrites-slice-wright.toml +2 -1
- package/pack/generated/codex/skills/devrites-lib/reference/standards/agents.md +6 -0
- package/pack/generated/codex/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +3 -1
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +3 -2
- package/pack/generated/codex/skills/rite-vet/SKILL.md +2 -1
- package/pack/generated/devin/agents/devrites-slice-wright.md +2 -1
- package/pack/generated/devin/skills/devrites-lib/reference/standards/agents.md +6 -0
- package/pack/generated/devin/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
- package/pack/generated/devin/skills/rite-build/reference/phase-contract.md +3 -1
- package/pack/generated/devin/skills/rite-build/reference/wright-dispatch.md +3 -2
- package/pack/generated/devin/skills/rite-vet/SKILL.md +2 -1
- package/pack/generated/omp/agents/devrites-slice-wright.md +2 -1
- package/pack/generated/omp/skills/devrites-lib/reference/standards/agents.md +6 -0
- package/pack/generated/omp/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
- package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +3 -1
- package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +3 -2
- package/pack/generated/omp/skills/rite-vet/SKILL.md +2 -1
- package/pack/generated/pi/agents/devrites-slice-wright.md +2 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/agents.md +6 -0
- package/pack/generated/pi/skills/devrites-lib/reference/workspace-artifact-schema.md +14 -0
- package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +3 -1
- package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +3 -2
- package/pack/generated/pi/skills/rite-vet/SKILL.md +2 -1
- 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.5](https://github.com/ViktorsBaikers/DevRites/compare/v7.0.4...v7.0.5) (2026-10-22)
|
|
6
|
+
|
|
7
|
+
### Fixed
|
|
8
|
+
|
|
9
|
+
* **devrites:** catch Build-entry slice defects at Vet ([#158](https://github.com/ViktorsBaikers/DevRites/issues/158)) ([34b65b7](https://github.com/ViktorsBaikers/DevRites/commit/34b65b7d819c308b46dc609d215ff698315b4b44))
|
|
10
|
+
* **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))
|
|
11
|
+
|
|
12
|
+
## [7.0.4](https://github.com/ViktorsBaikers/DevRites/compare/v7.0.3...v7.0.4) (2026-10-21)
|
|
13
|
+
|
|
14
|
+
### Fixed
|
|
15
|
+
|
|
16
|
+
* **devrites:** a leaf's last message is its full return ([#157](https://github.com/ViktorsBaikers/DevRites/issues/157)) ([929ab9e](https://github.com/ViktorsBaikers/DevRites/commit/929ab9e65b963c4729125289e45e677fa3c1b533))
|
|
17
|
+
|
|
5
18
|
## [7.0.3](https://github.com/ViktorsBaikers/DevRites/compare/v7.0.2...v7.0.3) (2026-10-21)
|
|
6
19
|
|
|
7
20
|
### Changed
|
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.
|
|
34
|
+
**Status:** [`v7.0.5`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v7.0.5): 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
|
|
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
|
package/docs/command-map.md
CHANGED
|
@@ -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
|
|
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`. |
|
package/docs/engine/commands.md
CHANGED
|
@@ -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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
179
|
-
|
|
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
|
|
@@ -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
|
|
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
|
|
@@ -191,6 +191,12 @@ return is the bundle the root writes) and the wright's change evidence.
|
|
|
191
191
|
`no-findings`.
|
|
192
192
|
- No restated task, preamble, approach narrative or closing summary. An optional
|
|
193
193
|
`Notes:` block carries at most five lines that no row can hold.
|
|
194
|
+
- Your last message is your return; the host delivers only that message. If a
|
|
195
|
+
hook, rule judge or system reminder arrives after your report, reply with the
|
|
196
|
+
complete report again, head first, with any correction inside it. Never end on a
|
|
197
|
+
reply that only answers the reminder. **Failing case:** a rule judge flagged a
|
|
198
|
+
simplifier's finished report; it answered the flag, and the host delivered that
|
|
199
|
+
answer instead of its rows.
|
|
194
200
|
- Point, don't paste: cite `file:line` with at most one quoted line (160
|
|
195
201
|
characters); for a command, give the exact command, its exit code and the one
|
|
196
202
|
decisive output line. Never paste whole files, diffs, logs or test output.
|
|
@@ -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
|
|
|
@@ -87,8 +87,9 @@ worktrees stay forbidden.
|
|
|
87
87
|
them: a wright that cannot execute writes blind and its failures surface a
|
|
88
88
|
whole review round later. Only artifact-producing, consumptive, or full
|
|
89
89
|
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
|
|
90
|
+
gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
|
|
91
|
+
(those gates, minus ones only other unbuilt slices own, plus `check windows`;
|
|
92
|
+
never evidence, root still runs every gate).
|
|
92
93
|
3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
|
|
93
94
|
unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
|
|
94
95
|
baseline status before asking the host for isolation. **Failing case:** paths that
|
|
@@ -209,7 +209,8 @@ 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
|
|
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`). A `sequence_lookahead: yes` workspace also records one
|
|
213
214
|
`Predecessor readiness: <predecessor> <digest>` line from the predecessor's
|
|
214
215
|
`--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
|
|
215
216
|
`devrites-engine check drift <slug> --record` — a later stale binding then
|
|
@@ -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
|
|
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
|
|
@@ -191,6 +191,12 @@ return is the bundle the root writes) and the wright's change evidence.
|
|
|
191
191
|
`no-findings`.
|
|
192
192
|
- No restated task, preamble, approach narrative or closing summary. An optional
|
|
193
193
|
`Notes:` block carries at most five lines that no row can hold.
|
|
194
|
+
- Your last message is your return; the host delivers only that message. If a
|
|
195
|
+
hook, rule judge or system reminder arrives after your report, reply with the
|
|
196
|
+
complete report again, head first, with any correction inside it. Never end on a
|
|
197
|
+
reply that only answers the reminder. **Failing case:** a rule judge flagged a
|
|
198
|
+
simplifier's finished report; it answered the flag, and the host delivered that
|
|
199
|
+
answer instead of its rows.
|
|
194
200
|
- Point, don't paste: cite `file:line` with at most one quoted line (160
|
|
195
201
|
characters); for a command, give the exact command, its exit code and the one
|
|
196
202
|
decisive output line. Never paste whole files, diffs, logs or test output.
|
|
@@ -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
|
|
|
@@ -87,8 +87,9 @@ worktrees stay forbidden.
|
|
|
87
87
|
them: a wright that cannot execute writes blind and its failures surface a
|
|
88
88
|
whole review round later. Only artifact-producing, consumptive, or full
|
|
89
89
|
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
|
|
90
|
+
gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
|
|
91
|
+
(those gates, minus ones only other unbuilt slices own, plus `check windows`;
|
|
92
|
+
never evidence, root still runs every gate).
|
|
92
93
|
3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
|
|
93
94
|
unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
|
|
94
95
|
baseline status before asking the host for isolation. **Failing case:** paths that
|
|
@@ -211,7 +211,8 @@ 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
|
|
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`). A `sequence_lookahead: yes` workspace also records one
|
|
215
216
|
`Predecessor readiness: <predecessor> <digest>` line from the predecessor's
|
|
216
217
|
`--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
|
|
217
218
|
`devrites-engine check drift <slug> --record` — a later stale binding then
|
|
@@ -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
|
|
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
|
|
@@ -191,6 +191,12 @@ return is the bundle the root writes) and the wright's change evidence.
|
|
|
191
191
|
`no-findings`.
|
|
192
192
|
- No restated task, preamble, approach narrative or closing summary. An optional
|
|
193
193
|
`Notes:` block carries at most five lines that no row can hold.
|
|
194
|
+
- Your last message is your return; the host delivers only that message. If a
|
|
195
|
+
hook, rule judge or system reminder arrives after your report, reply with the
|
|
196
|
+
complete report again, head first, with any correction inside it. Never end on a
|
|
197
|
+
reply that only answers the reminder. **Failing case:** a rule judge flagged a
|
|
198
|
+
simplifier's finished report; it answered the flag, and the host delivered that
|
|
199
|
+
answer instead of its rows.
|
|
194
200
|
- Point, don't paste: cite `file:line` with at most one quoted line (160
|
|
195
201
|
characters); for a command, give the exact command, its exit code and the one
|
|
196
202
|
decisive output line. Never paste whole files, diffs, logs or test output.
|
|
@@ -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
|
|
|
@@ -87,8 +87,9 @@ worktrees stay forbidden.
|
|
|
87
87
|
them: a wright that cannot execute writes blind and its failures surface a
|
|
88
88
|
whole review round later. Only artifact-producing, consumptive, or full
|
|
89
89
|
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
|
|
90
|
+
gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
|
|
91
|
+
(those gates, minus ones only other unbuilt slices own, plus `check windows`;
|
|
92
|
+
never evidence, root still runs every gate).
|
|
92
93
|
3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
|
|
93
94
|
unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
|
|
94
95
|
baseline status before asking the host for isolation. **Failing case:** paths that
|
|
@@ -211,7 +211,8 @@ 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
|
|
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`). A `sequence_lookahead: yes` workspace also records one
|
|
215
216
|
`Predecessor readiness: <predecessor> <digest>` line from the predecessor's
|
|
216
217
|
`--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
|
|
217
218
|
`devrites-engine check drift <slug> --record` — a later stale binding then
|
|
@@ -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
|
|
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
|
|
@@ -191,6 +191,12 @@ return is the bundle the root writes) and the wright's change evidence.
|
|
|
191
191
|
`no-findings`.
|
|
192
192
|
- No restated task, preamble, approach narrative or closing summary. An optional
|
|
193
193
|
`Notes:` block carries at most five lines that no row can hold.
|
|
194
|
+
- Your last message is your return; the host delivers only that message. If a
|
|
195
|
+
hook, rule judge or system reminder arrives after your report, reply with the
|
|
196
|
+
complete report again, head first, with any correction inside it. Never end on a
|
|
197
|
+
reply that only answers the reminder. **Failing case:** a rule judge flagged a
|
|
198
|
+
simplifier's finished report; it answered the flag, and the host delivered that
|
|
199
|
+
answer instead of its rows.
|
|
194
200
|
- Point, don't paste: cite `file:line` with at most one quoted line (160
|
|
195
201
|
characters); for a command, give the exact command, its exit code and the one
|
|
196
202
|
decisive output line. Never paste whole files, diffs, logs or test output.
|
|
@@ -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
|
|
|
@@ -87,8 +87,9 @@ worktrees stay forbidden.
|
|
|
87
87
|
them: a wright that cannot execute writes blind and its failures surface a
|
|
88
88
|
whole review round later. Only artifact-producing, consumptive, or full
|
|
89
89
|
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
|
|
90
|
+
gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
|
|
91
|
+
(those gates, minus ones only other unbuilt slices own, plus `check windows`;
|
|
92
|
+
never evidence, root still runs every gate).
|
|
92
93
|
3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
|
|
93
94
|
unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
|
|
94
95
|
baseline status before asking the host for isolation. **Failing case:** paths that
|
|
@@ -210,7 +210,8 @@ 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
|
|
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`). A `sequence_lookahead: yes` workspace also records one
|
|
214
215
|
`Predecessor readiness: <predecessor> <digest>` line from the predecessor's
|
|
215
216
|
`--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
|
|
216
217
|
`devrites-engine check drift <slug> --record` — a later stale binding then
|
|
@@ -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
|
|
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
|
|
@@ -191,6 +191,12 @@ return is the bundle the root writes) and the wright's change evidence.
|
|
|
191
191
|
`no-findings`.
|
|
192
192
|
- No restated task, preamble, approach narrative or closing summary. An optional
|
|
193
193
|
`Notes:` block carries at most five lines that no row can hold.
|
|
194
|
+
- Your last message is your return; the host delivers only that message. If a
|
|
195
|
+
hook, rule judge or system reminder arrives after your report, reply with the
|
|
196
|
+
complete report again, head first, with any correction inside it. Never end on a
|
|
197
|
+
reply that only answers the reminder. **Failing case:** a rule judge flagged a
|
|
198
|
+
simplifier's finished report; it answered the flag, and the host delivered that
|
|
199
|
+
answer instead of its rows.
|
|
194
200
|
- Point, don't paste: cite `file:line` with at most one quoted line (160
|
|
195
201
|
characters); for a command, give the exact command, its exit code and the one
|
|
196
202
|
decisive output line. Never paste whole files, diffs, logs or test output.
|
|
@@ -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
|
|
|
@@ -87,8 +87,9 @@ worktrees stay forbidden.
|
|
|
87
87
|
them: a wright that cannot execute writes blind and its failures surface a
|
|
88
88
|
whole review round later. Only artifact-producing, consumptive, or full
|
|
89
89
|
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
|
|
90
|
+
gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
|
|
91
|
+
(those gates, minus ones only other unbuilt slices own, plus `check windows`;
|
|
92
|
+
never evidence, root still runs every gate).
|
|
92
93
|
3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
|
|
93
94
|
unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
|
|
94
95
|
baseline status before asking the host for isolation. **Failing case:** paths that
|
|
@@ -211,7 +211,8 @@ 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
|
|
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`). A `sequence_lookahead: yes` workspace also records one
|
|
215
216
|
`Predecessor readiness: <predecessor> <digest>` line from the predecessor's
|
|
216
217
|
`--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
|
|
217
218
|
`devrites-engine check drift <slug> --record` — a later stale binding then
|
|
@@ -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
|
|
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
|
|
@@ -191,6 +191,12 @@ return is the bundle the root writes) and the wright's change evidence.
|
|
|
191
191
|
`no-findings`.
|
|
192
192
|
- No restated task, preamble, approach narrative or closing summary. An optional
|
|
193
193
|
`Notes:` block carries at most five lines that no row can hold.
|
|
194
|
+
- Your last message is your return; the host delivers only that message. If a
|
|
195
|
+
hook, rule judge or system reminder arrives after your report, reply with the
|
|
196
|
+
complete report again, head first, with any correction inside it. Never end on a
|
|
197
|
+
reply that only answers the reminder. **Failing case:** a rule judge flagged a
|
|
198
|
+
simplifier's finished report; it answered the flag, and the host delivered that
|
|
199
|
+
answer instead of its rows.
|
|
194
200
|
- Point, don't paste: cite `file:line` with at most one quoted line (160
|
|
195
201
|
characters); for a command, give the exact command, its exit code and the one
|
|
196
202
|
decisive output line. Never paste whole files, diffs, logs or test output.
|
|
@@ -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
|
|
|
@@ -87,8 +87,9 @@ worktrees stay forbidden.
|
|
|
87
87
|
them: a wright that cannot execute writes blind and its failures surface a
|
|
88
88
|
whole review round later. Only artifact-producing, consumptive, or full
|
|
89
89
|
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
|
|
90
|
+
gate, the checks include `devrites-engine gates precheck <slug> --worktree <path> --slice <SLICE-ID>`
|
|
91
|
+
(those gates, minus ones only other unbuilt slices own, plus `check windows`;
|
|
92
|
+
never evidence, root still runs every gate).
|
|
92
93
|
3. Run `devrites-engine check diff-scope <slug> --snapshot` before dispatch so
|
|
93
94
|
unrelated work remains distinguishable (it fingerprints every dirty path). For an isolated pilot, also record committed base SHA and exact
|
|
94
95
|
baseline status before asking the host for isolation. **Failing case:** paths that
|
|
@@ -211,7 +211,8 @@ 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
|
|
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`). A `sequence_lookahead: yes` workspace also records one
|
|
215
216
|
`Predecessor readiness: <predecessor> <digest>` line from the predecessor's
|
|
216
217
|
`--emit-binding` hex; readiness re-checks it. Record the per-input drift baseline alongside it:
|
|
217
218
|
`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.
|
|
3
|
+
"version": "7.0.5",
|
|
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.
|
|
93
|
+
"npm": "11.21.1"
|
|
94
94
|
},
|
|
95
95
|
"fast-uri": "3.1.8",
|
|
96
96
|
"js-yaml": "4.3.2"
|