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.
Files changed (108) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/README.md +2 -2
  3. package/docs/architecture.md +4 -4
  4. package/docs/command-map.md +2 -2
  5. package/docs/engine/workspace-schema.md +1 -1
  6. package/docs/flow.md +4 -2
  7. package/docs/skills.md +1 -1
  8. package/docs/usage.md +11 -10
  9. package/engine/internal/parallel/git.go +8 -0
  10. package/engine/internal/parallel/ops.go +40 -12
  11. package/engine/internal/parallel/ops_test.go +29 -1
  12. package/engine/internal/parallel/parallel_test.go +26 -14
  13. package/pack/.claude/agents/devrites-slice-wright.md +18 -9
  14. package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
  15. package/pack/.claude/skills/rite-autocomplete/SKILL.md +14 -15
  16. package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +2 -3
  17. package/pack/.claude/skills/rite-autocomplete/reference/loop.md +17 -24
  18. package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
  19. package/pack/.claude/skills/rite-build/SKILL.md +11 -7
  20. package/pack/.claude/skills/rite-build/reference/anti-patterns.md +4 -0
  21. package/pack/.claude/skills/rite-build/reference/checkpoint.md +33 -21
  22. package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
  23. package/pack/.claude/skills/rite-build/reference/parallel-batch.md +13 -10
  24. package/pack/.claude/skills/rite-build/reference/phase-contract.md +4 -2
  25. package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +16 -9
  26. package/pack/.claude/skills/rite-plan/reference/slicing.md +4 -3
  27. package/pack/.claude/skills/rite-polish/SKILL.md +3 -1
  28. package/pack/.claude/skills/rite-prove/SKILL.md +3 -0
  29. package/pack/.claude/skills/rite-review/SKILL.md +3 -1
  30. package/pack/.claude/skills/rite-temper/SKILL.md +6 -6
  31. package/pack/.claude/skills/rite-temper/reference/significance.md +3 -3
  32. package/pack/generated/claude/agents/devrites-slice-wright.md +18 -9
  33. package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
  34. package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +14 -15
  35. package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +2 -3
  36. package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +17 -24
  37. package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
  38. package/pack/generated/claude/skills/rite-build/SKILL.md +11 -7
  39. package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +4 -0
  40. package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +33 -21
  41. package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +4 -3
  42. package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +13 -10
  43. package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +4 -2
  44. package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +16 -9
  45. package/pack/generated/claude/skills/rite-plan/reference/slicing.md +4 -3
  46. package/pack/generated/claude/skills/rite-polish/SKILL.md +3 -1
  47. package/pack/generated/claude/skills/rite-prove/SKILL.md +3 -0
  48. package/pack/generated/claude/skills/rite-review/SKILL.md +3 -1
  49. package/pack/generated/claude/skills/rite-temper/SKILL.md +6 -6
  50. package/pack/generated/claude/skills/rite-temper/reference/significance.md +3 -3
  51. package/pack/generated/codex/agents/devrites-slice-wright.toml +18 -9
  52. package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
  53. package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +14 -15
  54. package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +2 -3
  55. package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +17 -24
  56. package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
  57. package/pack/generated/codex/skills/rite-build/SKILL.md +11 -7
  58. package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +4 -0
  59. package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +33 -21
  60. package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +4 -3
  61. package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +13 -10
  62. package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +4 -2
  63. package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +16 -9
  64. package/pack/generated/codex/skills/rite-plan/reference/slicing.md +4 -3
  65. package/pack/generated/codex/skills/rite-polish/SKILL.md +3 -1
  66. package/pack/generated/codex/skills/rite-prove/SKILL.md +3 -0
  67. package/pack/generated/codex/skills/rite-review/SKILL.md +3 -1
  68. package/pack/generated/codex/skills/rite-temper/SKILL.md +6 -6
  69. package/pack/generated/codex/skills/rite-temper/reference/significance.md +3 -3
  70. package/pack/generated/omp/agents/devrites-slice-wright.md +18 -9
  71. package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
  72. package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +14 -15
  73. package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +2 -3
  74. package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +17 -24
  75. package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
  76. package/pack/generated/omp/skills/rite-build/SKILL.md +11 -7
  77. package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +4 -0
  78. package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +33 -21
  79. package/pack/generated/omp/skills/rite-build/reference/one-slice-cycle.md +4 -3
  80. package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +13 -10
  81. package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +4 -2
  82. package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +16 -9
  83. package/pack/generated/omp/skills/rite-plan/reference/slicing.md +4 -3
  84. package/pack/generated/omp/skills/rite-polish/SKILL.md +3 -1
  85. package/pack/generated/omp/skills/rite-prove/SKILL.md +3 -0
  86. package/pack/generated/omp/skills/rite-review/SKILL.md +3 -1
  87. package/pack/generated/omp/skills/rite-temper/SKILL.md +6 -6
  88. package/pack/generated/omp/skills/rite-temper/reference/significance.md +3 -3
  89. package/pack/generated/pi/agents/devrites-slice-wright.md +18 -9
  90. package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +2 -2
  91. package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +14 -15
  92. package/pack/generated/pi/skills/rite-autocomplete/reference/decision-policy.md +2 -3
  93. package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +17 -24
  94. package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
  95. package/pack/generated/pi/skills/rite-build/SKILL.md +11 -7
  96. package/pack/generated/pi/skills/rite-build/reference/anti-patterns.md +4 -0
  97. package/pack/generated/pi/skills/rite-build/reference/checkpoint.md +33 -21
  98. package/pack/generated/pi/skills/rite-build/reference/one-slice-cycle.md +4 -3
  99. package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +13 -10
  100. package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +4 -2
  101. package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +16 -9
  102. package/pack/generated/pi/skills/rite-plan/reference/slicing.md +4 -3
  103. package/pack/generated/pi/skills/rite-polish/SKILL.md +3 -1
  104. package/pack/generated/pi/skills/rite-prove/SKILL.md +3 -0
  105. package/pack/generated/pi/skills/rite-review/SKILL.md +3 -1
  106. package/pack/generated/pi/skills/rite-temper/SKILL.md +6 -6
  107. package/pack/generated/pi/skills/rite-temper/reference/significance.md +3 -3
  108. 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.8.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v5.8.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
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 # optional local WIP checkpoint mode
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>/
@@ -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 the safety gates: genuine
340
- product/scope/policy decisions, irreversible risk, human-only access/actions,
341
- an open human-owned gate, a NO-GO, exhausted `max_slices`, or low confidence
342
- still pause. Agents use bounded recovery for red tests, runtime failures, and
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
@@ -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 + `.devrites/CHECKPOINT` | code + `state.md`, `evidence.md`, `traceability.md`, `touched-files.md` (+ local `WIP(<slug>)` commit in checkpoint mode) |
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 genuine human-owned decisions/actions, NO-GO, or budget exhaustion; 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) |
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 # optional local WIP checkpoint sentinel
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; `.devrites/CHECKPOINT`
308
- separately enables eligible local WIP checkpoint commits.
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 genuine product/scope/policy decisions, irreversible risk, human-only access, NO-GO, or budget exhaustion.<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". |
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` | you or `/rite-autocomplete` (presence = checkpoint mode) | empty sentinel. When set, `/rite-build` commits each proven slice local-only as `WIP(<slug>)` so a crash mid-build loses neither source nor reasoning; after literal `GO`, `/rite-ship` collapses an eligible disclosed WIP run into the feature commit. See [`pack/.claude/skills/rite-build/reference/checkpoint.md`](../pack/.claude/skills/rite-build/reference/checkpoint.md). |
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" --max-slices 8
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 genuine product/scope/policy
388
- decisions, irreversible risk, human-only access/actions, a NO-GO, exhausted
389
- `max_slices`, or low confidence. Objective red checks use bounded recovery
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. `--full` selects the Full
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 fixes the
396
- pending-slice count, it stores the lower effective budget in `state.md`; an
397
- existing remaining counter can only stay the same or decrease.
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("squash apply failed for slice %s: %w", sl.ID, err))
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
- msg := fmt.Sprintf("WIP(%s): parallel batch %s (%s)\n\n[devrites-context]\nslices: %s\nbase: %s",
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 squash commit
418
- // lives only on the integrate branch, and a running lease keeps a
419
- // non-forced cleanup from discarding the refs that hold it.
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 %s WIP (%s)", sl.ID, batchID), sl.Paths)
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", "slice "+marker)
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", "slice-a green")
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", "slice-b green")
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 != "1" {
410
- t.Fatalf("control should gain exactly one squash commit, got %s", n)
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
- subj := gitOk(t, repo, "log", "-1", "--format=%s")
413
- if !strings.HasPrefix(subj, "WIP(demo-feature):") {
414
- t.Fatalf("squash subject %q missing WIP(demo-feature): prefix", subj)
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 squash commit on the integrate branch but leaves the lease
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 squash tip, got %s", tip)
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 squash tip %s", got, tip)
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
- // squash tip, so it is kept and reported rather than deleted.
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 squash commit on control.
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 != "1" {
510
- t.Fatalf("expected one squash commit on control, got %s", n)
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 green proof, create one local, unpushed
35
- transfer commit. Never push, merge, rebase, or remove the worktree. Without that
36
- exact mode, do not commit.
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 whose message names
122
- the slice transfer. Record its SHA. If the commit fails or includes any extra
123
- path, return the failure and preserve the worktree; never bypass hooks or amend.
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 remain forbidden.
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. Per-slice `WIP(<slug>)` checkpoints still
114
- land locally ([checkpoint.md](../../../rite-build/reference/checkpoint.md)), so the tree
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, resource, and human-owned gates still pause. Use the Standard native
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
- - Enforce `--max-slices`, the AFK sentinel, review queue, and native
52
- agent/token/cost/time limits before every phase or dispatch. Count failed,
53
- malformed, and unavailable leaf calls. At the review cap, permit only work
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. Unattended mode auto-applies only
62
- `hold-rigor` and `reduce-to-MVP`; any `expand` or added acceptance pauses.
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: N|default`, `parallel: N|default`, `profile: standard|full`,
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 bounded advisory-only sentinel once; never
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, resource exhaustion, or the
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; explicit valid AFK may chain only green
120
- slices within every cap. One Autocomplete invocation owns all internal
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, arm checkpoint
133
- mode, and never auto-pass a red gate.
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 contract, data-model, security, and product choices are not discretionary.
40
- Use owning elicitation/safety gates and the topology marked action. Autocomplete
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.