devrites 5.8.0 → 5.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/README.md +2 -2
- package/docs/architecture.md +4 -4
- package/docs/command-map.md +2 -2
- package/docs/engine/workspace-schema.md +1 -1
- package/docs/flow.md +4 -2
- package/docs/skills.md +1 -1
- package/docs/usage.md +11 -10
- package/engine/internal/parallel/git.go +8 -0
- package/engine/internal/parallel/ops.go +40 -12
- package/engine/internal/parallel/ops_test.go +29 -1
- package/engine/internal/parallel/parallel_test.go +26 -14
- package/pack/.claude/agents/devrites-slice-wright.md +18 -9
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +14 -15
- package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +17 -24
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/.claude/skills/rite-build/SKILL.md +11 -7
- package/pack/.claude/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/.claude/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
- package/pack/.claude/skills/rite-build/reference/parallel-batch.md +13 -10
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/.claude/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/.claude/skills/rite-polish/SKILL.md +3 -1
- package/pack/.claude/skills/rite-prove/SKILL.md +3 -0
- package/pack/.claude/skills/rite-review/SKILL.md +3 -1
- package/pack/.claude/skills/rite-temper/SKILL.md +6 -6
- package/pack/.claude/skills/rite-temper/reference/significance.md +3 -3
- package/pack/generated/claude/agents/devrites-slice-wright.md +18 -9
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +14 -15
- package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +17 -24
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/generated/claude/skills/rite-build/SKILL.md +11 -7
- package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
- package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +13 -10
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/generated/claude/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/generated/claude/skills/rite-polish/SKILL.md +3 -1
- package/pack/generated/claude/skills/rite-prove/SKILL.md +3 -0
- package/pack/generated/claude/skills/rite-review/SKILL.md +3 -1
- package/pack/generated/claude/skills/rite-temper/SKILL.md +6 -6
- package/pack/generated/claude/skills/rite-temper/reference/significance.md +3 -3
- package/pack/generated/codex/agents/devrites-slice-wright.toml +18 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +14 -15
- package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +17 -24
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/generated/codex/skills/rite-build/SKILL.md +11 -7
- package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +4 -3
- package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +13 -10
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/generated/codex/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/generated/codex/skills/rite-polish/SKILL.md +3 -1
- package/pack/generated/codex/skills/rite-prove/SKILL.md +3 -0
- package/pack/generated/codex/skills/rite-review/SKILL.md +3 -1
- package/pack/generated/codex/skills/rite-temper/SKILL.md +6 -6
- package/pack/generated/codex/skills/rite-temper/reference/significance.md +3 -3
- package/pack/generated/omp/agents/devrites-slice-wright.md +18 -9
- package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
- package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +14 -15
- package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +17 -24
- package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/generated/omp/skills/rite-build/SKILL.md +11 -7
- package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/generated/omp/skills/rite-build/reference/one-slice-cycle.md +4 -3
- package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +13 -10
- package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/generated/omp/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/generated/omp/skills/rite-polish/SKILL.md +3 -1
- package/pack/generated/omp/skills/rite-prove/SKILL.md +3 -0
- package/pack/generated/omp/skills/rite-review/SKILL.md +3 -1
- package/pack/generated/omp/skills/rite-temper/SKILL.md +6 -6
- package/pack/generated/omp/skills/rite-temper/reference/significance.md +3 -3
- package/pack/generated/pi/agents/devrites-slice-wright.md +18 -9
- package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
- package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +14 -15
- package/pack/generated/pi/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +17 -24
- package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/generated/pi/skills/rite-build/SKILL.md +11 -7
- package/pack/generated/pi/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/generated/pi/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/generated/pi/skills/rite-build/reference/one-slice-cycle.md +4 -3
- package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +13 -10
- package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/generated/pi/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/generated/pi/skills/rite-polish/SKILL.md +3 -1
- package/pack/generated/pi/skills/rite-prove/SKILL.md +3 -0
- package/pack/generated/pi/skills/rite-review/SKILL.md +3 -1
- package/pack/generated/pi/skills/rite-temper/SKILL.md +6 -6
- package/pack/generated/pi/skills/rite-temper/reference/significance.md +3 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,12 @@
|
|
|
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
|
+
## [5.9.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.8.0...v5.9.0) (2026-09-15)
|
|
6
|
+
|
|
7
|
+
### Added
|
|
8
|
+
|
|
9
|
+
* **rite:** land proven WIP commits and keep autocomplete running ([#75](https://github.com/ViktorsBaikers/DevRites/issues/75)) ([73bf932](https://github.com/ViktorsBaikers/DevRites/commit/73bf932568d7bae34ea20ce6476c33842b123467))
|
|
10
|
+
|
|
5
11
|
## [5.8.0](https://github.com/ViktorsBaikers/DevRites/compare/v5.7.2...v5.8.0) (2026-09-14)
|
|
6
12
|
|
|
7
13
|
### Added
|
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@ project-conventional push, tag, or PR action, and archive the workspace.
|
|
|
33
33
|
Unattended runs may create local WIP checkpoint commits along the way, but they
|
|
34
34
|
remain local unless Ship's disclosed plan includes an approved remote action.
|
|
35
35
|
|
|
36
|
-
**Status:** [`v5.
|
|
36
|
+
**Status:** [`v5.9.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v5.9.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
|
|
37
37
|
|
|
38
38
|
This is the latest published release; `main` may contain unreleased work.
|
|
39
39
|
|
|
@@ -152,7 +152,7 @@ the original decisions and proof.
|
|
|
152
152
|
.devrites/
|
|
153
153
|
ACTIVE # active feature slug
|
|
154
154
|
AFK # optional unattended-mode configuration
|
|
155
|
-
CHECKPOINT #
|
|
155
|
+
CHECKPOINT # reserved path; not a commit gate
|
|
156
156
|
principles.md # project rules that gate the workflow
|
|
157
157
|
specs/ # living structured capabilities
|
|
158
158
|
work/<slug>/
|
package/docs/architecture.md
CHANGED
|
@@ -336,10 +336,10 @@ workflow. It carries state through workspace files rather than chat. A vague
|
|
|
336
336
|
prompt starts `devrites-interview`; `/rite-spec` and `/rite-clarify` then
|
|
337
337
|
finish the only interactive window. After decision coverage is CLEAR it runs unattended,
|
|
338
338
|
choosing the recommended option at each soft gate and recording the rationale
|
|
339
|
-
in `decisions.md`. It does **not** weaken
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
339
|
+
in `decisions.md`. It does **not** weaken blocking/escalating or irreversible-risk
|
|
340
|
+
gates: human-only access/actions, those gates, a NO-GO, or low confidence still
|
|
341
|
+
pause. Temper expand, validating gates, and default slice/agent/time/review-queue
|
|
342
|
+
caps do not. `--max-slices` is ignored the same way. Agents use bounded recovery for red tests, runtime failures, and
|
|
343
343
|
missing technical coverage. By default the workflow stops at Seal GO with `/rite-ship` as the next step.
|
|
344
344
|
The `--ship` flag (alias `--yolo`) continues through Ship preflight, discloses
|
|
345
345
|
the exact Git plan, and still stops for a fresh literal `GO` plus native host
|
package/docs/command-map.md
CHANGED
|
@@ -91,7 +91,7 @@ See [`cli.md`](cli.md).
|
|
|
91
91
|
| [`/rite-define`](../pack/.claude/skills/rite-define/SKILL.md) | define → plan | `[slug]` | Authors architecture, plan, vertical `SLICE-###` tasks, and traceability. A changed provider/consumer boundary names one canonical shared contract plus consuming provider/consumer tests; no change uses a justified no-impact statement. | `spec.md` + `decision-coverage.md` (+ `strategy.md`) + references | `architecture.md`, `plan.md`, `tasks.md`, `traceability.md`, `state.md`, `decisions.md` |
|
|
92
92
|
| [`/rite-vet`](../pack/.claude/skills/rite-vet/SKILL.md) | vet | `[slug] [--cross-model] [--full]` | **Before build: every feature.** Engineering review of the defined plan: scope challenge (reuse / minimum-diff / complexity smell) + architecture / plan code-quality / test-coverage design / performance, confidence-banded with a quote-the-source verification gate; failure-mode and dependency-safety review. Hardens `plan.md` / `tasks.md` in place; writes the build-readable `test-plan.md` and a semantic `READY` verdict reconciled by the exact native reviewer; acceptance-changing deltas route via the Spec Drift Guard. Runs on every plan: depth scales to stakes (light pass on simple plans, full on big/risky), never skipped; **always in `/rite-autocomplete`**. Reviewer: `devrites-plan-reviewer` (+ optional `--cross-model`). | `plan.md` + `tasks.md` + `spec.md` (+ `strategy.md`) | `eng-review.md`, `test-plan.md`, `plan.md`, `tasks.md`, `decisions.md`, `state.md` |
|
|
93
93
|
| [`/rite-plan`](../pack/.claude/skills/rite-plan/SKILL.md) | repair → plan | `[mode]` | Reslice / repair / re-order / split / unblock an active plan and return to the `plan` checkpoint; `revise` is artifact-only and `/rite-vet` is the normal resume. | spec/plan/tasks/state/drift + diff | `plan.md`, `tasks.md`, `state.md`, `decisions.md` |
|
|
94
|
-
| [`/rite-build`](../pack/.claude/skills/rite-build/SKILL.md) | build | `[slice]` | In HITL, orchestrates one vertical slice through the sole wright; an explicit `.devrites/AFK` sentinel may chain bounded low-risk slices. Every task states exact project-relative paths; after return, the root rejects extra paths or weakened tests, runs repository proof, and maintains the strict candidate manifest. | workspace + diff
|
|
94
|
+
| [`/rite-build`](../pack/.claude/skills/rite-build/SKILL.md) | build | `[slice]` | In HITL, orchestrates one vertical slice through the sole wright; an explicit `.devrites/AFK` sentinel may chain bounded low-risk slices. Every task states exact project-relative paths; after return, the root rejects extra paths or weakened tests, runs independent review and repository proof, and maintains the strict candidate manifest. Lands a local `WIP(<slug>):` commit only after that check loop is green (never on wright return). | workspace + diff | code + `state.md`, `evidence.md`, `traceability.md`, `touched-files.md` (+ local `WIP(<slug>):` after checks; never a slice id) |
|
|
95
95
|
| [`/rite-converge`](../pack/.claude/skills/rite-converge/SKILL.md) | converge | `[slug]` | **Recovery.** Compare live code with clarified intent, append each unmet piece as a traceable `SLICE-###`, and invalidate the old vet verdict so changed work returns through `/rite-vet`. `tasks.md` stays byte-identical when already converged. | clarified spec + plan/tasks + principles + live code | `tasks.md` (appended), `traceability.md`, `state.md`, `eng-review.md` (invalidated), `decisions.md` |
|
|
96
96
|
| [`/rite-upgrade`](../pack/.claude/skills/rite-upgrade/SKILL.md) | compatibility | `[slug]` | **Conditional recovery.** Audit an older released workspace against current contracts. Only cited defects route through Clarify, Plan repair, Converge, Vet, Prove, Polish, Review, or Seal. Ambiguous candidate scope is a gap; age/cursor form alone is never a defect, and old passes are never synthesized. | active workspace + named current contracts | admitted unfinished artifacts via their owning rite |
|
|
97
97
|
| [`/rite-prove`](../pack/.claude/skills/rite-prove/SKILL.md) | prove | `[feature-slug]` | Positive, discriminating tests + build/runtime/browser proof; checks the same candidate before/after commands and binds evidence to its digest. | `traceability.md` + workspace + candidate | `evidence.md`, `browser-evidence.md`, `traceability.md`, `state.md` |
|
|
@@ -99,7 +99,7 @@ See [`cli.md`](cli.md).
|
|
|
99
99
|
| [`/rite-review`](../pack/.claude/skills/rite-review/SKILL.md) | review | `[scope: slice N \| feature] [--full]` | Feature-scoped parallel Spec + Standards review of the closed candidate; binds `review.md` to its digest. | workspace + candidate | `review.md`, `evidence.md`, `state.md` |
|
|
100
100
|
| [`/rite-seal`](../pack/.claude/skills/rite-seal/SKILL.md) | seal | `[feature-slug] [--full]` | Candidate-bound GO / NO-GO **decision**. Rechecks exact proof/review bindings and runs no git; on GO sets `Next step: /rite-ship`. | all artifacts + candidate | `seal.md`, `state.md` |
|
|
101
101
|
| [`/rite-ship`](../pack/.claude/skills/rite-ship/SKILL.md) | ship | `[slug]` | Starts with a read-only Seal/candidate check and exact plan disclosure, then requires fresh literal `GO`. Only then may it collapse checkpoints, stage exact candidate paths, validate staged scope/bytes/bindings/secrets, commit and reverify, perform optional separately approved push/tag/PR actions, and archive/close. | `seal.md` + candidate + Git index | `ship.md`, `state.md`, archive |
|
|
102
|
-
| [`/rite-autocomplete`](../pack/.claude/skills/rite-autocomplete/SKILL.md) | (orchestrator) | `[idea] [--ship\|--yolo] [--max-slices N] [--full] [--cross-model]` | Full lifecycle (spec → clarify → … → seal → ship). Spec + clarify form the one interactive window; AFK/checkpoint mode arms only after decision coverage is CLEAR. Pauses for
|
|
102
|
+
| [`/rite-autocomplete`](../pack/.claude/skills/rite-autocomplete/SKILL.md) | (orchestrator) | `[idea] [--ship\|--yolo] [--max-slices N] [--full] [--cross-model]` | Full lifecycle (spec → clarify → … → seal → ship). Spec + clarify form the one interactive window; AFK/checkpoint mode arms only after decision coverage is CLEAR. Pauses for irreversible risk, blocking/escalating, human-only access, or NO-GO — not temper expand, validating gates, `--max-slices`, or default resource caps. Objective red checks use bounded technical recovery. Default stops at Seal GO; `--ship` (`--yolo`) reaches Ship preflight but still requires fresh literal `GO` and native approval; `--full` selects the Full profile and `--cross-model` arms Vet's second opinion. | idea + workspace | whole workspace (drives every phase) |
|
|
103
103
|
| [`/rite-quick`](../pack/.claude/skills/rite-quick/SKILL.md) | (express) | `<change>` | Express lane for a **small, reversible, unambiguous** change: one-line contract → TDD build → scoped prove → review-lite → ship, no full artifact tree. **Significance gate first**: auth / migration / public-API / destructive / multi-slice / ambiguous → escalates to `/rite-spec`. Triggers: "quick fix", "small change", "tiny tweak", "just do X". | the change + codebase | code + commit (optional `brief.md` / `evidence.md`) |
|
|
104
104
|
| [`/rite-frame`](../pack/.claude/skills/rite-frame/SKILL.md) | lens | `[ask \| diff]` | Pre-flight + self-audit lens for ad-hoc work the lifecycle gates never see: **FRAME** turns an imperative ask into a falsifiable success criterion + verify command before code; **AUDIT** checks a raw diff against the four LLM coding failure modes (silent assumption / overcomplication / out-of-scope edit / unverifiable goal). Top of `/rite-quick` or before a plain "just do X". | the ask / a raw diff | success criterion + verify command (inline) |
|
|
105
105
|
| [`/rite-adopt`](../pack/.claude/skills/rite-adopt/SKILL.md) | onboard | `[path or area to adopt] [+ what you want to build next]` | Reverse-derive the existing baseline and next objective; propose any durable project guidance in the nearest native instruction file. | codebase + project instructions | workspace spec/state artifacts + optional guidance proposal |
|
|
@@ -21,7 +21,7 @@ budgets, IDs, and read order live in
|
|
|
21
21
|
.devrites/
|
|
22
22
|
ACTIVE
|
|
23
23
|
AFK # optional run-mode sentinel
|
|
24
|
-
CHECKPOINT #
|
|
24
|
+
CHECKPOINT # reserved path; not a commit gate
|
|
25
25
|
principles.md # ratified project invariants
|
|
26
26
|
specs/ # living capability Markdown, maintained by skills
|
|
27
27
|
work/
|
package/docs/flow.md
CHANGED
|
@@ -304,8 +304,10 @@ Each workspace-operating lifecycle skill reads durable state from
|
|
|
304
304
|
`.devrites/work/<feature-slug>/` before acting and reports the owning create or
|
|
305
305
|
selection command when no workspace is active. Utility and on-ramp skills use
|
|
306
306
|
their own stated preconditions. The optional `.devrites/AFK` sentinel sits
|
|
307
|
-
beside `ACTIVE` and toggles the session-level run mode
|
|
308
|
-
|
|
307
|
+
beside `ACTIVE` and toggles the session-level run mode. Local `WIP(<slug>):`
|
|
308
|
+
checkpoints land after independent review and fail-on-red proof are green, not
|
|
309
|
+
when a wright returns; `.devrites/CHECKPOINT` is a reserved
|
|
310
|
+
path, not a gate.
|
|
309
311
|
|
|
310
312
|
```mermaid
|
|
311
313
|
erDiagram
|
package/docs/skills.md
CHANGED
|
@@ -222,7 +222,7 @@ and `Shipped`. Utility commands keep the same compact labels and one-next-action
|
|
|
222
222
|
|
|
223
223
|
| Skill | What It Does | Use When |
|
|
224
224
|
|---|---|---|
|
|
225
|
-
| [`rite-autocomplete`](../pack/.claude/skills/rite-autocomplete/SKILL.md) | Runs the lifecycle unattended (spec → clarify → … → seal → ship), choosing the recommended option at each soft gate and recording the rationale in `decisions.md`.<br>A vague prompt gets one up-front spec/clarify window; after CLEAR it does not iterate per phase.<br>It pauses only for
|
|
225
|
+
| [`rite-autocomplete`](../pack/.claude/skills/rite-autocomplete/SKILL.md) | Runs the lifecycle unattended (spec → clarify → … → seal → ship), choosing the recommended option at each soft gate and recording the rationale in `decisions.md`.<br>A vague prompt gets one up-front spec/clarify window; after CLEAR it does not iterate per phase.<br>It pauses only for irreversible risk, blocking/escalating gates, human-only access, or NO-GO — not temper expand, validating gates, or default slice/agent/time/review-queue caps.<br>Objective red checks use bounded technical recovery, including cold-resume from retained one-shot evidence and one-time migration of stale missing-writer stops when an upgraded contract supplies the first supported writer. That migration applies once; the first real materializer failure is attempt one under normal bounded recovery. Internal `NEEDS_REPLAN` and new agent-owned review findings stay caller-owned backward edges, not user-facing stops. Spending an action authorization blocks another real execution, not offline repair.<br>Default stops at Seal GO. `--ship` (alias `--yolo`) reaches Ship preflight but still requires a fresh literal `GO` and native approval. | "Autocomplete", "do the whole thing", "run the full cycle", "one-shot this feature". |
|
|
226
226
|
| [`rite-zoom-out`](../pack/.claude/skills/rite-zoom-out/SKILL.md) | Map the modules, callers, callees, and decisions in an unfamiliar area using the project's domain glossary. | Explicit-only: `/rite-zoom-out` / `/rite zoom-out`. |
|
|
227
227
|
| [`rite-prototype`](../pack/.claude/skills/rite-prototype/SKILL.md) | Throwaway code answering ONE design question: logic harness OR 2 to 4 UI variations on one route. | Explicit-only: `/rite-prototype` / `/rite prototype`. |
|
|
228
228
|
| [`rite-handoff`](../pack/.claude/skills/rite-handoff/SKILL.md) | Compact chat session → handoff doc. References existing `.devrites/work/<slug>/` artifacts by path. | Explicit-only: `/rite-handoff` / `/rite handoff`. |
|
package/docs/usage.md
CHANGED
|
@@ -69,7 +69,7 @@ Project-root sentinel (outside the workspace):
|
|
|
69
69
|
| File | Created by | Holds |
|
|
70
70
|
|---|---|---|
|
|
71
71
|
| `.devrites/AFK` | you (presence = AFK mode active) | optional YAML: `max_slices`, `notify`, `allow_gates`. Empty file = AFK with defaults. See [`pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md`](../pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md). |
|
|
72
|
-
| `.devrites/CHECKPOINT` |
|
|
72
|
+
| `.devrites/CHECKPOINT` | unused as a gate | reserved path (not a candidate). After Independent Build review and fail-on-red proof are green (not when a wright returns), `/rite-build` / `/rite-prove` / `/rite-polish` / `/rite-review` land a local `WIP(<slug>): <imperative summary>` commit (serial: checkpoint git recipe or no-op if nothing staged; parallel: `devrites-engine parallel integrate`); `/rite-ship` later collapses an eligible WIP run. See [`pack/.claude/skills/rite-build/reference/checkpoint.md`](../pack/.claude/skills/rite-build/reference/checkpoint.md). |
|
|
73
73
|
|
|
74
74
|
The shape of this directory is also documented in
|
|
75
75
|
[`flow.md` § Workspace state model](flow.md#7-workspace-state-model).
|
|
@@ -368,7 +368,7 @@ full list.
|
|
|
368
368
|
## 11) Full unattended lifecycle: `/rite-autocomplete`
|
|
369
369
|
|
|
370
370
|
```text
|
|
371
|
-
/rite-autocomplete "add CSV export for admins"
|
|
371
|
+
/rite-autocomplete "add CSV export for admins"
|
|
372
372
|
→ vague idea → runs devrites-interview, then /rite-spec + /rite-clarify in
|
|
373
373
|
the only interactive window
|
|
374
374
|
→ Decision coverage: CLEAR → arms AFK, then drives: /rite-temper →
|
|
@@ -384,17 +384,18 @@ You: GO # → commit, optional approved push/tag/PR, then
|
|
|
384
384
|
|
|
385
385
|
Add `--ship` (alias `--yolo`) to continue through `/rite-ship` preflight.
|
|
386
386
|
Autocomplete discloses the exact Git plan, then still stops for a fresh literal
|
|
387
|
-
`GO` and native host approval. It also pauses for
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
instead. Args:
|
|
387
|
+
`GO` and native host approval. It also pauses for irreversible risk, human-only access/actions, blocking or
|
|
388
|
+
escalating gates, a NO-GO, or low confidence — not for temper expand, validating
|
|
389
|
+
gates, `--max-slices`, or default slice/agent/time/review-queue caps.
|
|
390
|
+
Objective red checks use bounded recovery instead. Args:
|
|
391
391
|
`[idea] [--ship|--yolo] [--max-slices N] [--full] [--cross-model]`.
|
|
392
392
|
Optional flags are inactive unless their exact token occurs in the invocation;
|
|
393
|
-
`--max-slices` requires one positive base-10 integer
|
|
393
|
+
`--max-slices` requires one positive base-10 integer and does not cap this run.
|
|
394
|
+
`--full` selects the Full
|
|
394
395
|
execution profile, and `--cross-model` arms Vet's second opinion.
|
|
395
|
-
Autocomplete never rewrites an existing `.devrites/AFK`. After Vet
|
|
396
|
-
pending-slice count
|
|
397
|
-
|
|
396
|
+
Autocomplete never rewrites an existing `.devrites/AFK`. After Vet it seeds
|
|
397
|
+
remaining from the pending-slice count and ignores leftover remaining and
|
|
398
|
+
`--max-slices`.
|
|
398
399
|
|
|
399
400
|
## Checking in
|
|
400
401
|
|
|
@@ -211,6 +211,10 @@ func mergeFFOnly(repo, commit string) error {
|
|
|
211
211
|
return err
|
|
212
212
|
}
|
|
213
213
|
|
|
214
|
+
func commitSubject(repo, rev string) (string, error) {
|
|
215
|
+
return git(repo, "log", "-1", "--format=%s", rev)
|
|
216
|
+
}
|
|
217
|
+
|
|
214
218
|
func cherryPickNoCommit(repo, fromExclusive, toInclusive string) error {
|
|
215
219
|
_, err := git(repo, "cherry-pick", "-n", fromExclusive+".."+toInclusive)
|
|
216
220
|
return err
|
|
@@ -219,3 +223,7 @@ func cherryPickNoCommit(repo, fromExclusive, toInclusive string) error {
|
|
|
219
223
|
func cherryPickAbort(repo string) {
|
|
220
224
|
_, _ = git(repo, "cherry-pick", "--abort")
|
|
221
225
|
}
|
|
226
|
+
|
|
227
|
+
func cherryPickQuit(repo string) {
|
|
228
|
+
_, _ = git(repo, "cherry-pick", "--quit")
|
|
229
|
+
}
|
|
@@ -5,6 +5,7 @@ import (
|
|
|
5
5
|
"fmt"
|
|
6
6
|
"os"
|
|
7
7
|
"path/filepath"
|
|
8
|
+
"regexp"
|
|
8
9
|
"sort"
|
|
9
10
|
"strings"
|
|
10
11
|
|
|
@@ -285,10 +286,8 @@ func integrateLocked(opts IntegrateOpts) (tip string, lease *Lease, err error) {
|
|
|
285
286
|
}
|
|
286
287
|
|
|
287
288
|
union := make([]string, 0, len(lease.Slices))
|
|
288
|
-
ids := make([]string, 0, len(lease.Slices))
|
|
289
289
|
for _, sl := range lease.Slices {
|
|
290
290
|
union = append(union, sl.Paths...)
|
|
291
|
-
ids = append(ids, sl.ID)
|
|
292
291
|
}
|
|
293
292
|
if opts.ApplyToControl {
|
|
294
293
|
// FF into control must not silently absorb or clobber the user's
|
|
@@ -381,14 +380,19 @@ func integrateLocked(opts IntegrateOpts) (tip string, lease *Lease, err error) {
|
|
|
381
380
|
|
|
382
381
|
if err := cherryPickNoCommit(stageWT, base, tc); err != nil {
|
|
383
382
|
cherryPickAbort(stageWT)
|
|
384
|
-
return fail(fmt.Errorf("
|
|
383
|
+
return fail(fmt.Errorf("apply failed for slice %s: %w", sl.ID, err))
|
|
385
384
|
}
|
|
385
|
+
subj, err := commitSubject(opts.Root, tc)
|
|
386
|
+
if err != nil {
|
|
387
|
+
return fail(fmt.Errorf("transfer subject for %s: %w", sl.ID, err))
|
|
388
|
+
}
|
|
389
|
+
if _, err = stagePathsAndCommit(stageWT, controlCommitMessage(opts.Slug, subj), sl.Paths); err != nil {
|
|
390
|
+
return fail(fmt.Errorf("control commit for %s: %w", sl.ID, err))
|
|
391
|
+
}
|
|
392
|
+
cherryPickQuit(stageWT)
|
|
386
393
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
opts.Slug, lease.BatchID, strings.Join(ids, ", "), strings.Join(ids, ", "), base)
|
|
390
|
-
if tip, err = stagePathsAndCommit(stageWT, msg, union); err != nil {
|
|
391
|
-
return fail(fmt.Errorf("squash commit: %w", err))
|
|
394
|
+
if tip, err = headSHA(stageWT); err != nil {
|
|
395
|
+
return fail(fmt.Errorf("integrate tip: %w", err))
|
|
392
396
|
}
|
|
393
397
|
if err := removeWorktree(opts.Root, stageWT); err != nil {
|
|
394
398
|
if _, statErr := os.Stat(stageWT); statErr == nil {
|
|
@@ -414,12 +418,36 @@ func integrateLocked(opts IntegrateOpts) (tip string, lease *Lease, err error) {
|
|
|
414
418
|
} else if err := ensureControlAtBase(opts.Root, base); err != nil {
|
|
415
419
|
return fail(err)
|
|
416
420
|
}
|
|
417
|
-
// Without --apply-to-control the lease stays running: the
|
|
418
|
-
//
|
|
419
|
-
// non-forced cleanup from discarding the refs that hold
|
|
421
|
+
// Without --apply-to-control the lease stays running: the integrate
|
|
422
|
+
// commits live only on the integrate branch, and a running lease keeps a
|
|
423
|
+
// non-forced cleanup from discarding the refs that hold them.
|
|
420
424
|
return tip, lease, nil
|
|
421
425
|
}
|
|
422
426
|
|
|
427
|
+
var (
|
|
428
|
+
sliceTaskID = regexp.MustCompile(`(?i)\bSLICE-\d+\b`)
|
|
429
|
+
sliceProcessMark = regexp.MustCompile(`(?i)\bthis slice\b|\bslice\s+\d+\b`)
|
|
430
|
+
existingWIPPrefix = regexp.MustCompile(`(?i)^WIP\([^)]+\):\s*`)
|
|
431
|
+
)
|
|
432
|
+
|
|
433
|
+
// controlCommitMessage is the local unpushed subject/body landed on control.
|
|
434
|
+
// Ship collapse still keys off the WIP(<slug>): prefix; the rest is a human
|
|
435
|
+
// summary with DevRites process marks stripped (SLICE-###, "this slice",
|
|
436
|
+
// "slice N"). Ordinary English such as "array slice" is left intact.
|
|
437
|
+
func controlCommitMessage(slug, transferSubject string) string {
|
|
438
|
+
prefix := fmt.Sprintf("WIP(%s): ", slug)
|
|
439
|
+
line := strings.TrimSpace(strings.SplitN(transferSubject, "\n", 2)[0])
|
|
440
|
+
line = existingWIPPrefix.ReplaceAllString(line, "")
|
|
441
|
+
line = sliceTaskID.ReplaceAllString(line, "")
|
|
442
|
+
line = sliceProcessMark.ReplaceAllString(line, "")
|
|
443
|
+
line = strings.TrimSpace(strings.Trim(line, ":-"))
|
|
444
|
+
line = strings.Join(strings.Fields(line), " ")
|
|
445
|
+
if line == "" {
|
|
446
|
+
line = "land proven work"
|
|
447
|
+
}
|
|
448
|
+
return prefix + line + "\n\n[devrites-context]\n"
|
|
449
|
+
}
|
|
450
|
+
|
|
423
451
|
func pathListsEqual(a, b []string) bool {
|
|
424
452
|
if len(a) != len(b) {
|
|
425
453
|
return false
|
|
@@ -470,7 +498,7 @@ func salvageSlice(sl LeaseSlice, batchID string) (string, error) {
|
|
|
470
498
|
return "", nil
|
|
471
499
|
}
|
|
472
500
|
return stagePathsAndCommit(sl.WorktreePath,
|
|
473
|
-
fmt.Sprintf("devrites: salvage
|
|
501
|
+
fmt.Sprintf("devrites: salvage WIP (%s)", batchID), sl.Paths)
|
|
474
502
|
}
|
|
475
503
|
|
|
476
504
|
// Cleanup removes worker worktrees and clears the lease. A complete batch
|
|
@@ -19,7 +19,7 @@ func commitIn(t *testing.T, wt, file, marker string) string {
|
|
|
19
19
|
t.Fatal(err)
|
|
20
20
|
}
|
|
21
21
|
gitOk(t, wt, "add", file)
|
|
22
|
-
gitOk(t, wt, "commit", "-m", "
|
|
22
|
+
gitOk(t, wt, "commit", "-m", "WIP(demo-feature): add "+marker+" helper")
|
|
23
23
|
return gitOk(t, wt, "rev-parse", "HEAD")
|
|
24
24
|
}
|
|
25
25
|
|
|
@@ -426,3 +426,31 @@ func TestCleanupWarnsOnFailedBranchCleanup(t *testing.T) {
|
|
|
426
426
|
t.Fatalf("cleanup should still clear the lease, got %v", err)
|
|
427
427
|
}
|
|
428
428
|
}
|
|
429
|
+
|
|
430
|
+
func TestControlCommitMessage(t *testing.T) {
|
|
431
|
+
t.Parallel()
|
|
432
|
+
got := controlCommitMessage("admin-report", "WIP(admin-report): SLICE-003 add CSV export")
|
|
433
|
+
wantPrefix := "WIP(admin-report): add CSV export\n"
|
|
434
|
+
if !strings.HasPrefix(got, wantPrefix) {
|
|
435
|
+
t.Fatalf("subject %q want prefix %q", got, wantPrefix)
|
|
436
|
+
}
|
|
437
|
+
if strings.Contains(got, "SLICE-") || strings.Contains(strings.ToLower(got), "slice-003") {
|
|
438
|
+
t.Fatalf("message still names a slice id: %q", got)
|
|
439
|
+
}
|
|
440
|
+
got = controlCommitMessage("admin-report", "WIP(other): complete slice 3")
|
|
441
|
+
if !strings.HasPrefix(got, "WIP(admin-report): complete\n") {
|
|
442
|
+
t.Fatalf("foreign WIP prefix / slice N: %q", got)
|
|
443
|
+
}
|
|
444
|
+
got = controlCommitMessage("admin-report", "add this slice CSV")
|
|
445
|
+
if !strings.HasPrefix(got, "WIP(admin-report): add CSV\n") {
|
|
446
|
+
t.Fatalf("this slice: %q", got)
|
|
447
|
+
}
|
|
448
|
+
got = controlCommitMessage("admin-report", "keep array slice helper")
|
|
449
|
+
if !strings.HasPrefix(got, "WIP(admin-report): keep array slice helper\n") {
|
|
450
|
+
t.Fatalf("ordinary English stripped: %q", got)
|
|
451
|
+
}
|
|
452
|
+
got = controlCommitMessage("admin-report", "SLICE-001")
|
|
453
|
+
if !strings.HasPrefix(got, "WIP(admin-report): land proven work\n") {
|
|
454
|
+
t.Fatalf("empty summary after strip: %q", got)
|
|
455
|
+
}
|
|
456
|
+
}
|
|
@@ -216,6 +216,13 @@ func TestCleanupSalvagesAbortedWork(t *testing.T) {
|
|
|
216
216
|
if body := gitOk(t, repo, "show", sb.Commit+":src/b_new.go"); !strings.Contains(body, "Bnew") {
|
|
217
217
|
t.Fatalf("salvaged file content missing: %q", body)
|
|
218
218
|
}
|
|
219
|
+
subj := gitOk(t, repo, "log", "-1", "--format=%s", sb.Commit)
|
|
220
|
+
if strings.Contains(subj, "slice-b") || strings.Contains(subj, "SLICE-") {
|
|
221
|
+
t.Fatalf("salvage subject names a slice id: %q", subj)
|
|
222
|
+
}
|
|
223
|
+
if !strings.HasPrefix(subj, "devrites: salvage WIP (") {
|
|
224
|
+
t.Fatalf("salvage subject %q", subj)
|
|
225
|
+
}
|
|
219
226
|
|
|
220
227
|
// Worktrees removed, lease cleared, kept branches still resolve.
|
|
221
228
|
for _, wt := range []string{wtA, wtB, wtC} {
|
|
@@ -375,14 +382,14 @@ func TestIntegrateDivergentSiblings(t *testing.T) {
|
|
|
375
382
|
t.Fatal(err)
|
|
376
383
|
}
|
|
377
384
|
gitOk(t, wtA, "add", "src/a.go")
|
|
378
|
-
gitOk(t, wtA, "commit", "-m", "
|
|
385
|
+
gitOk(t, wtA, "commit", "-m", "WIP(demo-feature): add A helper")
|
|
379
386
|
tcA := gitOk(t, wtA, "rev-parse", "HEAD")
|
|
380
387
|
|
|
381
388
|
if err := os.WriteFile(filepath.Join(wtB, "src", "b.go"), []byte("package main\n\nfunc B() {}\n"), 0o644); err != nil {
|
|
382
389
|
t.Fatal(err)
|
|
383
390
|
}
|
|
384
391
|
gitOk(t, wtB, "add", "src/b.go")
|
|
385
|
-
gitOk(t, wtB, "commit", "-m", "
|
|
392
|
+
gitOk(t, wtB, "commit", "-m", "WIP(demo-feature): add B helper")
|
|
386
393
|
tcB := gitOk(t, wtB, "rev-parse", "HEAD")
|
|
387
394
|
|
|
388
395
|
if _, err := RecordGreen(repo, slug, "slice-a", tcA); err != nil {
|
|
@@ -406,12 +413,17 @@ func TestIntegrateDivergentSiblings(t *testing.T) {
|
|
|
406
413
|
if head != tip {
|
|
407
414
|
t.Fatalf("control head %s want tip %s", head, tip)
|
|
408
415
|
}
|
|
409
|
-
if n := gitOk(t, repo, "rev-list", "--count", base+"..HEAD"); n != "
|
|
410
|
-
t.Fatalf("control should gain
|
|
416
|
+
if n := gitOk(t, repo, "rev-list", "--count", base+"..HEAD"); n != "2" {
|
|
417
|
+
t.Fatalf("control should gain one commit per sibling, got %s", n)
|
|
411
418
|
}
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
419
|
+
log := gitOk(t, repo, "log", "--format=%s", base+"..HEAD")
|
|
420
|
+
for _, subj := range strings.Split(log, "\n") {
|
|
421
|
+
if !strings.HasPrefix(subj, "WIP(demo-feature):") {
|
|
422
|
+
t.Fatalf("control subject %q missing WIP(demo-feature): prefix", subj)
|
|
423
|
+
}
|
|
424
|
+
if strings.Contains(strings.ToUpper(subj), "SLICE-") {
|
|
425
|
+
t.Fatalf("control subject %q still names a slice id", subj)
|
|
426
|
+
}
|
|
415
427
|
}
|
|
416
428
|
a := mustRead(t, filepath.Join(repo, "src", "a.go"))
|
|
417
429
|
b := mustRead(t, filepath.Join(repo, "src", "b.go"))
|
|
@@ -428,7 +440,7 @@ func TestIntegrateDivergentSiblings(t *testing.T) {
|
|
|
428
440
|
}
|
|
429
441
|
|
|
430
442
|
// TestIntegrateWithoutApplyKeepsLeaseRunning proves a flag-less integrate
|
|
431
|
-
// stages the
|
|
443
|
+
// stages the per-sibling commits on the integrate branch but leaves the lease
|
|
432
444
|
// running and control at base, so a later non-forced cleanup cannot discard
|
|
433
445
|
// the only refs holding the integrated tree.
|
|
434
446
|
func TestIntegrateWithoutApplyKeepsLeaseRunning(t *testing.T) {
|
|
@@ -441,7 +453,7 @@ func TestIntegrateWithoutApplyKeepsLeaseRunning(t *testing.T) {
|
|
|
441
453
|
t.Fatal(err)
|
|
442
454
|
}
|
|
443
455
|
if tip == "" || tip == base {
|
|
444
|
-
t.Fatalf("expected staged
|
|
456
|
+
t.Fatalf("expected staged integrate tip, got %s", tip)
|
|
445
457
|
}
|
|
446
458
|
if lease.Status != StatusRunning {
|
|
447
459
|
t.Fatalf("status=%s want running without --apply-to-control", lease.Status)
|
|
@@ -451,13 +463,13 @@ func TestIntegrateWithoutApplyKeepsLeaseRunning(t *testing.T) {
|
|
|
451
463
|
}
|
|
452
464
|
ibranch := IntegrateBranchName(slug, batch)
|
|
453
465
|
if got := gitOk(t, repo, "rev-parse", ibranch); got != tip {
|
|
454
|
-
t.Fatalf("integrate branch %s want
|
|
466
|
+
t.Fatalf("integrate branch %s want integrate tip %s", got, tip)
|
|
455
467
|
}
|
|
456
468
|
if _, err := Cleanup(repo, slug, false); err == nil {
|
|
457
469
|
t.Fatal("cleanup on running lease must refuse without --force")
|
|
458
470
|
}
|
|
459
471
|
// Forced cleanup salvages then removes; the integrate branch holds the
|
|
460
|
-
//
|
|
472
|
+
// integrate tip, so it is kept and reported rather than deleted.
|
|
461
473
|
if _, err := Cleanup(repo, slug, true); err != nil {
|
|
462
474
|
t.Fatal(err)
|
|
463
475
|
}
|
|
@@ -468,7 +480,7 @@ func TestIntegrateWithoutApplyKeepsLeaseRunning(t *testing.T) {
|
|
|
468
480
|
|
|
469
481
|
// TestIntegrateFailedLeaseRepairsAndRetries proves integrate-failed is not a
|
|
470
482
|
// dead end: a repaired transfer re-records on the failed lease and a retried
|
|
471
|
-
// integrate completes into one
|
|
483
|
+
// integrate completes into one control commit per sibling.
|
|
472
484
|
func TestIntegrateFailedLeaseRepairsAndRetries(t *testing.T) {
|
|
473
485
|
repo, base := setupRepo(t)
|
|
474
486
|
slug, batch := "demo-feature", "batch1"
|
|
@@ -506,8 +518,8 @@ func TestIntegrateFailedLeaseRepairsAndRetries(t *testing.T) {
|
|
|
506
518
|
} else if lease.Status != StatusComplete {
|
|
507
519
|
t.Fatalf("status=%s want complete", lease.Status)
|
|
508
520
|
}
|
|
509
|
-
if n := gitOk(t, repo, "rev-list", "--count", base+"..HEAD"); n != "
|
|
510
|
-
t.Fatalf("expected one
|
|
521
|
+
if n := gitOk(t, repo, "rev-list", "--count", base+"..HEAD"); n != "2" {
|
|
522
|
+
t.Fatalf("expected one control commit per sibling, got %s", n)
|
|
511
523
|
}
|
|
512
524
|
}
|
|
513
525
|
|
|
@@ -31,16 +31,20 @@ the target stack's idiom. Never plan, choose scope, design, or perform independe
|
|
|
31
31
|
8. **Isolated worktree transfer is explicit.** Only when the dispatch contract names
|
|
32
32
|
`Isolation: native-worktree`, run `git rev-parse HEAD` as the first command and
|
|
33
33
|
require exact equality with supplied `worktree_base` before reading or editing.
|
|
34
|
-
Mismatch returns a gap with no write. After
|
|
35
|
-
transfer commit
|
|
36
|
-
|
|
34
|
+
Mismatch returns a gap with no write. After writer-safe proof, create one local
|
|
35
|
+
unpushed **worktree-branch** transfer commit with the contract `WIP(<slug>):`
|
|
36
|
+
subject (no slice id) — transport only, not a control/primary commit. Never push,
|
|
37
|
+
merge, rebase, or remove the worktree. Without that exact mode, do not commit.
|
|
37
38
|
|
|
38
39
|
## The contract you receive
|
|
39
40
|
The orchestrator supplies these inline or by path, relative to **Workspace root**:
|
|
40
41
|
- **Slice:** id/name, goal, acceptance criteria, **scope boundary** (what it will and will
|
|
41
42
|
**not** touch), mode (HITL/AFK + any budget).
|
|
42
43
|
- **Isolation:** `same-worktree` or `native-worktree`; native mode also supplies the
|
|
43
|
-
exact committed `worktree_base` SHA and requires a local transfer commit
|
|
44
|
+
exact committed `worktree_base` SHA and requires a local transfer commit whose
|
|
45
|
+
subject is the supplied `WIP(<slug>): <imperative summary>` (no slice id).
|
|
46
|
+
Same-worktree leaves the diff uncommitted; the orchestrator commits that subject
|
|
47
|
+
at RECORD.
|
|
44
48
|
- **Targets:** the exact project-relative paths listed in the dispatch task,
|
|
45
49
|
plus interfaces and signatures to match. Your return cannot widen this set.
|
|
46
50
|
- **Context to read yourself:** the relevant owning sections of `spec.md`, `plan.md`, `decisions.md`, `assumptions.md`,
|
|
@@ -97,6 +101,8 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
|
|
|
97
101
|
`$devrites-source-driven` on Codex. Verify the fact in installed source,
|
|
98
102
|
official documentation, or context7 for current upstream behavior, then include
|
|
99
103
|
that source in the result. Never invent an API.
|
|
104
|
+
- **No process residue.** Do not put `SLICE-###`, slice numbers, or "this slice"
|
|
105
|
+
in product source, tests, comments, or filenames.
|
|
100
106
|
4. **VERIFY (fail-on-red).** Run writer-safe tests/types/lint. Report required
|
|
101
107
|
build/browser/E2E as `not-run` (root-owned, artifact-producing gates), and only
|
|
102
108
|
when the exact command, cwd, and prerequisites already appear in the unchanged
|
|
@@ -118,9 +124,11 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
|
|
|
118
124
|
in-scope gaps together, rerun affected proof, and report remaining gaps. Self-check
|
|
119
125
|
never replaces independent review; green tests do not prove all possible cases.
|
|
120
126
|
5. **TRANSFER when isolated.** After green writer-safe proof, verify the diff again,
|
|
121
|
-
stage only exact task paths, and create one new local commit
|
|
122
|
-
the slice
|
|
123
|
-
|
|
127
|
+
stage only exact task paths, and create one new local commit on **this worktree
|
|
128
|
+
branch** with the contract `WIP(<slug>):` subject (no slice id). Record its SHA.
|
|
129
|
+
This is transport for later orchestrator landing — not a control/primary commit
|
|
130
|
+
and not "the slice is done". If the commit fails or includes any extra path,
|
|
131
|
+
return the failure and preserve the worktree; never bypass hooks or amend.
|
|
124
132
|
In `same-worktree` mode skip this step and leave the approved diff uncommitted.
|
|
125
133
|
6. **RETURN** the structured artifact (below) and stop.
|
|
126
134
|
|
|
@@ -197,8 +205,9 @@ human-owned choices. Never silently ship a known gap.
|
|
|
197
205
|
## Tools / read-write mode
|
|
198
206
|
|
|
199
207
|
Write code/tests only at exact contract paths; no `.devrites/` bookkeeping. Only
|
|
200
|
-
`native-worktree` permits staging and one local transfer commit of those paths
|
|
201
|
-
All other Git mutation and remote actions
|
|
208
|
+
`native-worktree` permits staging and one local transfer commit of those paths
|
|
209
|
+
(contract `WIP(<slug>):` subject). All other Git mutation and remote actions
|
|
210
|
+
remain forbidden.
|
|
202
211
|
|
|
203
212
|
## Composition
|
|
204
213
|
|
|
@@ -110,8 +110,8 @@ candidate manifest to cover the whole recorded chain — run
|
|
|
110
110
|
qualify; no recorded next entry, or the cap/review-queue bound reached, stops
|
|
111
111
|
with the winning reason.
|
|
112
112
|
- Milestones are **not** shipped: they stay sealed and unarchived in `.devrites/work/`
|
|
113
|
-
with `Next step: /rite-ship` preserved.
|
|
114
|
-
land
|
|
113
|
+
with `Next step: /rite-ship` preserved. Local `WIP(<slug>):` checkpoints still
|
|
114
|
+
land ([checkpoint.md](../../../rite-build/reference/checkpoint.md)), so the tree
|
|
115
115
|
stays clean and crash-safe.
|
|
116
116
|
- Git stays human-gated. The release ship is one disclosed plan, one literal `GO`, and
|
|
117
117
|
one native approval; it collapses the sequence's `WIP` commits into the single
|
|
@@ -9,7 +9,7 @@ user-invocable: true
|
|
|
9
9
|
|
|
10
10
|
Run every phase after one clarification window. Irreversible-risk,
|
|
11
11
|
blocking/escalating,<!-- pack-scan-ignore: negated statement: gates are NOT disabled -->
|
|
12
|
-
NO-GO
|
|
12
|
+
and NO-GO still pause. Use the Standard native
|
|
13
13
|
profile by default and Full for high-risk scope or explicit `--full`; see
|
|
14
14
|
[`orchestration-profiles.md`](../devrites-lib/reference/orchestration-profiles.md).
|
|
15
15
|
|
|
@@ -48,20 +48,19 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
48
48
|
- Every exact causal fingerprint gets at most three no-progress corrections.
|
|
49
49
|
Closing one is progress; a distinct Critical/Important invariant has its own
|
|
50
50
|
budget. Lower severity cannot prolong recovery.
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
that reduces the queue.
|
|
51
|
+
- Do not stop on `--max-slices`, sentinel `max_slices`, `max_agents`,
|
|
52
|
+
`max_minutes`, or `max_review_queue`. Count failed, malformed, and
|
|
53
|
+
unavailable leaf calls.
|
|
55
54
|
- Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
|
|
56
55
|
`--parallel`, `--full`, and `--cross-model` activate only as exact standalone
|
|
57
56
|
tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
|
|
58
57
|
`--max-slices` must occur once and be followed by a positive base-10 integer;
|
|
59
58
|
`--parallel` must occur once and be followed by a base-10 integer in `1`–`10`.
|
|
60
59
|
Missing, repeated, malformed, or conflicting values stop before any write.
|
|
61
|
-
- Temper always runs after Clarify.
|
|
62
|
-
`
|
|
60
|
+
- Temper always runs after Clarify. Auto-apply the recommended mode, including
|
|
61
|
+
`expand` and extra acceptance; record the ADR and fold via Spec Drift Guard.
|
|
62
|
+
Irreversible-risk still pauses.
|
|
63
63
|
- Vet every plan. Cross-model is off unless the current invocation arms it.
|
|
64
|
-
Never auto-grow accepted scope.
|
|
65
64
|
|
|
66
65
|
## Workflow
|
|
67
66
|
|
|
@@ -77,7 +76,7 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
77
76
|
from chat. After compaction or a resumed session, read `.devrites/ACTIVE`, then
|
|
78
77
|
the `state.md` cursor, `questions.md`, `decisions.md`, and `test-plan.md`/`evidence.md`.
|
|
79
78
|
Normalize current arguments to idea, `ship_preflight: yes|no`,
|
|
80
|
-
`max_slices:
|
|
79
|
+
`max_slices: unlimited`, `parallel: N|default`, `profile: standard|full`,
|
|
81
80
|
and `cross_model: yes|no`.
|
|
82
81
|
**Completion:** normalized state is unambiguous and no sentinel or workspace file has been written.
|
|
83
82
|
2. **Specify and clarify.** Run `devrites-interview`, `/rite-spec`, and
|
|
@@ -85,7 +84,7 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
85
84
|
AFK. **Completion:** `Decision coverage: CLEAR` is durable.
|
|
86
85
|
3. **Arm AFK once.** Apply the loop's
|
|
87
86
|
[one-write AFK contract](reference/loop.md#arm-afk-once): preserve valid
|
|
88
|
-
existing bytes or create the
|
|
87
|
+
existing bytes or create the sentinel once (`allow_gates: [advisory, validating]`); never
|
|
89
88
|
rewrite it after Vet. Preserve an existing sentinel byte-for-byte.
|
|
90
89
|
**Completion:** a valid read-only AFK sentinel exists.
|
|
91
90
|
4. **Drive phases.** Follow [the loop](reference/loop.md): `/rite-spec` →
|
|
@@ -103,7 +102,7 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
103
102
|
[stop-conditions.md](reference/stop-conditions.md). A `blocked` label alone is not a stop condition:
|
|
104
103
|
route agent-owned red results through bounded recovery.
|
|
105
104
|
Red gates block forward advancement and enter caller-owned recovery. Stop on
|
|
106
|
-
hard risk, human-owned blocking/escalating/NO-GO,
|
|
105
|
+
hard risk, human-owned blocking/escalating/NO-GO, or the
|
|
107
106
|
exact fingerprint's proven exhaustion. Technical exhaustion records terminal
|
|
108
107
|
`Next step: none`, never a routine phase command. **Completion:** no stop is active, or its cursor and reason are durable.
|
|
109
108
|
6. **Seal boundary.** Without a ship flag, stop at Seal GO with `/rite-ship` —
|
|
@@ -116,8 +115,8 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
116
115
|
|
|
117
116
|
## Reply and resume
|
|
118
117
|
|
|
119
|
-
HITL Build returns after one slice;
|
|
120
|
-
|
|
118
|
+
HITL Build returns after one slice; Autocomplete ignores `--max-slices` and
|
|
119
|
+
keeps chaining pending slices. One Autocomplete invocation owns all internal
|
|
121
120
|
backtracking. Context pressure, compaction, or a nested completion footer does
|
|
122
121
|
not create a stop; persist and resume the cursor.
|
|
123
122
|
|
|
@@ -129,5 +128,5 @@ spec <done|stopped> · clarify <clear|stopped> · temper <done|stopped> · defin
|
|
|
129
128
|
```
|
|
130
129
|
|
|
131
130
|
Final state is `Shipped`, `Stopped`, `Awaiting human`, `NO-GO`, or `GO`; do not
|
|
132
|
-
write a narrative recap. Require a clean or accepted baseline,
|
|
133
|
-
|
|
131
|
+
write a narrative recap. Require a clean or accepted baseline, land a local
|
|
132
|
+
unpushed checkpoint after each green check, and never auto-pass a red gate.
|
|
@@ -36,6 +36,5 @@ not pick the option that's merely easiest to implement.
|
|
|
36
36
|
|
|
37
37
|
## When a choice is NOT autocomplete's to make
|
|
38
38
|
|
|
39
|
-
Human-owned
|
|
40
|
-
|
|
41
|
-
answers *how*, never *what to build* beyond the settled interview.
|
|
39
|
+
Human-owned blocking/escalating, irreversible-risk, and access stay human.
|
|
40
|
+
Recommended temper `expand` auto-applies; do not invent product intent.
|