devrites 7.3.9 → 7.3.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,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
+ ## [7.3.10](https://github.com/ViktorsBaikers/DevRites/compare/v7.3.9...v7.3.10) (2026-11-12)
6
+
7
+ ### Fixed
8
+
9
+ * **devrites:** recover autocomplete owner when ACTIVE is empty ([#213](https://github.com/ViktorsBaikers/DevRites/issues/213)) ([7014453](https://github.com/ViktorsBaikers/DevRites/commit/70144532ef53e9d6df9021b53523828b44ffc4f3))
10
+
5
11
  ## [7.3.9](https://github.com/ViktorsBaikers/DevRites/compare/v7.3.8...v7.3.9) (2026-11-10)
6
12
 
7
13
  ### Fixed
@@ -77,6 +83,8 @@ All notable changes to DevRites are documented here. The format follows [Keep a
77
83
 
78
84
  ### Fixed
79
85
 
86
+ - Pin the engine and workflow-artifact fixture to Go 1.27.4 to address
87
+ GO-2026-6859 in `net/http`.
80
88
  - Mark only the slice a checked state.md item names first as built; a later
81
89
  `SLICE-###` reference in the same line no longer inflates regression, next, or
82
90
  parallel admission. Baselines written under the old all-token parsing re-ratchet
@@ -103,6 +111,9 @@ All notable changes to DevRites are documented here. The format follows [Keep a
103
111
  complete writer allowlist against live foreign claims, including symlink
104
112
  aliases, even when optional claim flags are absent or name unrelated paths.
105
113
 
114
+ - Recover Autocomplete's recorded live sequence owner when ACTIVE is missing or
115
+ empty before requesting a workspace handoff; retain ambiguity, metadata repair,
116
+ human gates, and read-only recovery without changing ACTIVE.
106
117
  - Use `GH_TOKEN`, then `GITHUB_TOKEN`, then optional bounded noninteractive GitHub
107
118
  CLI credential lookup for release API requests. Keep credentials off release
108
119
  assets and off-origin redirects, fail explicit invalid credentials, and document
package/README.md CHANGED
@@ -31,7 +31,7 @@ history can't lose it. After you clear the conversation, switch hosts, or hand
31
31
  the feature to another engineer, the next session reads the same plan,
32
32
  decisions, and evidence before it continues.
33
33
 
34
- **Status:** [`v7.3.9`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v7.3.9): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
34
+ **Status:** [`v7.3.10`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v7.3.10): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
35
35
 
36
36
  This is the latest published release; `main` may contain unreleased work.
37
37
 
@@ -35,7 +35,7 @@ workflow strategy.
35
35
  | `orient <slug>` | Alias for `observe summary`. |
36
36
  | `observe slice <slug> <SLICE-ID>` | Print one `SLICE-###` section of `tasks.md` so Build reads a slice, not the file. |
37
37
  | `next [slug]` | Print the minimal remaining lifecycle path plus advisory skips; in Build also `eligible_now:`, `batch:` and the `select-command:` (`parallel select --root <project> --slug <slug> --cap N --from-plan`, N = AFK max_parallel else 10) that reproduces the batch. Prints `blocked: unattributed root edit: ...` after `open-questions:` and exits `3` while the ADR-0038 tripwire flags a product path; the rest of the output still prints. |
38
- | `frontier [slug]` | Read-only report across exact recorded sequence relations, including archived intermediaries and live descendants. Emits `frontier: actionable\|waiting\|blocked\|clear` (`none` for a non-sequence source), `frontier-source:`, and `frontier-workspace:` rows with location, `inspect\|prepare\|repair\|wait\|complete` action, and reason. Emits `frontier-select-command:`, `frontier-picks:`, `frontier-selection: blocked`, `frontier-prepare:`, or `frontier-review-sequence:` where applicable. Explicit slug may be archived; absent ACTIVE recovery requires a unique archived terminal tip with a recorded native Spec edge, otherwise refuses ambiguity. One explicit `roadmap.md` owner anywhere in the related live/archive chain may supersede historical maps for scheduling: both `Sequence root:` and `Decision:` headers, a unique owner-local decision heading, and one contiguous position/workspace table must match recorded identities and successors. Either header claims this format; invalid authority fails closed without legacy fallback. Headerless maps retain legacy parsing. Native normalization preserves historical bytes; structural identity is not semantic approval. Never changes ACTIVE, restores archives, creates workspaces, or launches writers. Native preparation and semantic admission remain required; see [sequence frontier](../cli.md#sequence-frontier). |
38
+ | `frontier [slug]` | Read-only report across exact recorded sequence relations, including archived intermediaries and live descendants. Emits `frontier: actionable\|waiting\|blocked\|clear` (`none` for a non-sequence source or no recorded sequence evidence), `frontier-source:`, and `frontier-workspace:` rows with location, `inspect\|prepare\|repair\|wait\|complete` action, and reason. Emits `frontier-select-command:`, `frontier-picks:`, `frontier-selection: blocked`, `frontier-prepare:`, or `frontier-review-sequence:` where applicable. Explicit slug may be archived. Without a slug and with missing/empty ACTIVE, recovers the earliest live owner of a unique validated recorded sequence (parent links or a numbered root with a sequence counter), or a unique archived terminal tip with an exact native next Spec edge and no children. Related live members share one sequence; equally earliest live siblings or unrelated eligible sequences refuse ambiguity, and invalid competing metadata requires repair. Without sequence evidence, `none` permits a fresh idea rather than forcing workspace selection. Standalone or loose directories, names, mtimes, and chat never identify a source. Explicit workspace overrides and retained controller constraints remain authoritative. Carry the returned `frontier-source:` explicitly to `handoff`, `context`, and `check continuation`. One explicit `roadmap.md` owner anywhere in the related live/archive chain may supersede historical maps for scheduling: both `Sequence root:` and `Decision:` headers, a unique owner-local decision heading, and one contiguous position/workspace table must match recorded identities and successors. Either header claims this format; invalid authority fails closed without legacy fallback. Headerless maps retain legacy parsing. Native normalization preserves historical bytes; structural identity is not semantic approval. Never changes ACTIVE, restores archives, creates workspaces, or launches writers. Native preparation and semantic admission remain required; see [sequence frontier](../cli.md#sequence-frontier). |
39
39
  | `handoff [slug] [--resume]` | Emit the deterministic resume record: cursor fields, `awaiting_human`, open `questions.md` gate kinds, the `gates.md` reduction with unmet/stale/abandoned ids, `decisions.md` dead ends, in-flight dispatch waves (`inflight_wave:` lines: phase, state, pending roles, slices), missing required files, the canonical read-next order, and the same `continuation:` lines as `check continuation`. Read-only unless `--resume`, which appends one `resume` event (role root) to `metrics.jsonl`; `metrics summary` then reports minutes from each resume to the next dispatch. The `/rite-handoff` spine and the compaction-fallback entry point. |
40
40
  | `recall --paths <p1,p2,...> [--limit n]` | Read-time query over `.devrites/archive/`: list archived features whose `touched-files.md` candidate manifest covers a queried project-relative path (exact or directory prefix, case-folded), ranked by overlap count, then newest archive-directory mtime, then slug (default 10 features). Each feature prints up to 8 `archive/<slug>/<file>:<line>` pointers, then `+N more`: `decisions.md` `DEC-###` entries and `## Carry-forward constraints` bullets whose `Files:` overlap (or a constraint naming no files), plus `review.md`/`seal.md`/`drift.md` lines that mention a queried path; fenced examples are ignored. Never writes, caches, or indexes (no metric either); symlinked archive entries are refused. An unreadable archive file prints `unreadable:` and the scan continues. Exit `0` (including `recall: no archive`), `1` invalid archive directory, `2` usage. |
41
41
  | `context [slug] (--phase <p>\|--skill <name>) [--role <r>] [--slice <SLICE-ID>] [--recheck <inventory>] [--trigger a,b] [--inline-contract] [--whole]` | Emit one deduplicated read-set bundle per phase/role/skill from each skill's `loads:` manifest; `--skill` works without a workspace when `--out` is given. A root `--phase build\|autocomplete` bundle (no `--role`, no `--slice`) defaults to `--slice <active_slice>` while the state.md cursor phase is `build` and active_slice names a slice present in tasks.md (prints `scope: slice SLICE-### (auto from state.md) ...`), unless `.devrites/AFK` `max_parallel` is 2 or more or a parallel lease is `running` (the bundle stays whole); `--whole` opts out. Every bundle opens, after its header comments, with a table of contents: one `L<start>-<end> <section label>` line per `===== label =====` section, giving its exact line range in the bundle file. A bundle without `--role` (the root's own read) gives over-budget artifacts as by-reference indexes; a `--role` bundle leads with the role's agent contract and names the manifest's `rootOnly` paths instead of inlining them. When the contract resolves under `.claude/agents`, `.omp/agents`, or `.codex/agents` (the host loads it as the agent's system prompt), the bundle writes one header line naming its path, size, and SHA-256 instead of the body; other layouts (pi, devin, unknown) and `--inline-contract` (only with `--role`) inline the body, and a missing contract still exits `3`. Inside inlined files, a `--role` bundle replaces each `<!-- root-only -->`…`<!-- /root-only -->` block with a one-line stub naming the omitted heading, and does the same for each `<!-- model-surface -->` block unless the role is `security-auditor`, the feature has an `ai-spec.md`, or `spec.md`/`plan.md`/`tasks.md`/`design-brief.md` are absent or (outside the spec template's `AI-SPEC annex`) name a model, agent, RAG, or tool surface; an unbalanced or headingless marker exits `2`. `--slice` inlines that slice's `tasks.md` block and turns each over-budget artifact, and each artifact over 16 KiB except `spec.md`, into a by-reference index (path, SHA-256, headings, line hits for every ID the block cites); repeat `--slice` for several slices; an unknown slice exits `3`. In phase `build`, a `--role` bundle other than `slice-wright` without `--slice` exits `3` (`unscoped build reviewer bundle`). `--recheck <inventory>` (phase `build`, with `--role` and `--slice`; path relative to the workspace) writes `<phase>-<role>.<slice>.recheck.bundle.md`: the inventory file and `core.md` inline whole, every other non-`rootOnly` pack file becomes a by-reference index (path, SHA-256, headings with line numbers) followed by each section the inventory cites as `<file>.md § <heading>`; workspace handling matches `--slice`. A missing or empty inventory exits `2`. First reviews, full-inventory rechecks, Vet, `/rite-review`, and Seal do not use it. |
package/engine/go.mod CHANGED
@@ -2,4 +2,4 @@ module github.com/devrites/devrites
2
2
 
3
3
  go 1.26
4
4
 
5
- toolchain go1.27.3
5
+ toolchain go1.27.4
@@ -5,6 +5,7 @@ import (
5
5
  "io"
6
6
  "os"
7
7
  "path/filepath"
8
+ "sort"
8
9
  "strconv"
9
10
  "strings"
10
11
 
@@ -22,6 +23,7 @@ type frontierWorkspace struct {
22
23
  slug, dir, location, parent, phase, status, next, question string
23
24
  position, remaining int
24
25
  hasPosition, hasRemaining bool
26
+ hasParent bool
25
27
  selectionHeld, agentOwnedPlanning bool
26
28
  problem error
27
29
  }
@@ -92,7 +94,10 @@ func frontierRead(root, slug, location string) *frontierWorkspace {
92
94
  }{
93
95
  {state.CursorSequenceParent, &n.parent}, {state.CursorPhase, &n.phase}, {state.CursorStatus, &n.status}, {state.CursorNextAction, &n.next}, {state.CursorQuestionID, &n.question},
94
96
  } {
95
- value, _, err := frontierField(lines, field.key)
97
+ value, present, err := frontierField(lines, field.key)
98
+ if field.key == state.CursorSequenceParent {
99
+ n.hasParent = present
100
+ }
96
101
  *field.dst = value
97
102
  if err != nil {
98
103
  n.problem = err
@@ -238,6 +243,75 @@ func frontierTerminal(n *frontierWorkspace) bool {
238
243
 
239
244
  func frontierQuote(s string) string { return "'" + strings.ReplaceAll(s, "'", "'\"'\"'") + "'" }
240
245
 
246
+ func frontierRecoverSource(nodes map[string]*frontierWorkspace) (string, error) {
247
+ names := make([]string, 0, len(nodes))
248
+ hasChild := make(map[string]bool, len(nodes))
249
+ for name, n := range nodes {
250
+ names = append(names, name)
251
+ hasChild[n.parent] = true
252
+ }
253
+ sort.Strings(names)
254
+ owners := map[string]string{}
255
+ depths := map[string]int{}
256
+ ambiguous := map[string]bool{}
257
+ recorded := false
258
+ var tips []struct{ slug, anchor string }
259
+ for _, name := range names {
260
+ n := nodes[name]
261
+ tip := n.location == "archive" && frontierTerminal(n) && frontierSpecTarget(n) != "" && !hasChild[name]
262
+ recorded = recorded || n.parent != "" || n.hasPosition || n.hasRemaining || hasChild[name] || tip
263
+ if !n.hasParent && !n.hasPosition && !n.hasRemaining && !hasChild[name] && !tip {
264
+ continue
265
+ }
266
+ chain, err := frontierChain(nodes, name)
267
+ if err != nil {
268
+ return "", fmt.Errorf("empty ACTIVE: invalid recorded sequence at %s: %w; repair native sequence metadata before recovery", name, err)
269
+ }
270
+ anchor := chain[len(chain)-1]
271
+ if len(chain) > 1 || hasChild[name] || n.hasPosition && n.hasRemaining {
272
+ for i := len(chain) - 1; i >= 0; i-- {
273
+ member := chain[i]
274
+ if nodes[member].location != "live" {
275
+ continue
276
+ }
277
+ depth := len(chain) - i
278
+ old := owners[anchor]
279
+ if old == "" || depth < depths[anchor] {
280
+ owners[anchor], depths[anchor] = member, depth
281
+ ambiguous[anchor] = false
282
+ } else if depth == depths[anchor] && member != old {
283
+ ambiguous[anchor] = true
284
+ }
285
+ break
286
+ }
287
+ }
288
+ if tip {
289
+ tips = append(tips, struct{ slug, anchor string }{name, anchor})
290
+ }
291
+ }
292
+ if !recorded {
293
+ return "", nil
294
+ }
295
+ for _, name := range names {
296
+ if ambiguous[name] {
297
+ return "", fmt.Errorf("empty ACTIVE: sequence %s has multiple equally earliest live owners; repair native sequence ownership before recovery", name)
298
+ }
299
+ }
300
+ var sources []string
301
+ for _, owner := range owners {
302
+ sources = append(sources, owner)
303
+ }
304
+ for _, tip := range tips {
305
+ if owners[tip.anchor] == "" {
306
+ sources = append(sources, tip.slug)
307
+ }
308
+ }
309
+ if len(sources) != 1 {
310
+ return "", fmt.Errorf("empty ACTIVE: need a unique recorded live sequence owner or unique archived terminal sequence tip with exact next Spec edge; found %d", len(sources))
311
+ }
312
+ return sources[0], nil
313
+ }
314
+
241
315
  // FrontierLines reports structural obligations, never semantic authorization or Ship approval.
242
316
  func FrontierLines(root, slug string) ([]string, error) {
243
317
  mode, err := autocompleteMode(root)
@@ -266,26 +340,13 @@ func FrontierLines(root, slug string) ([]string, error) {
266
340
  return nil, err
267
341
  }
268
342
  if slug == "" {
269
- var tips []string
270
- for name, n := range nodes {
271
- if n.location != "archive" || !frontierTerminal(n) || frontierSpecTarget(n) == "" {
272
- continue
273
- }
274
- if _, err := frontierChain(nodes, name); err != nil {
275
- continue
276
- }
277
- hasChild := false
278
- for _, child := range nodes {
279
- hasChild = hasChild || child.parent == name
280
- }
281
- if !hasChild {
282
- tips = append(tips, name)
283
- }
343
+ slug, err = frontierRecoverSource(nodes)
344
+ if err != nil {
345
+ return nil, err
284
346
  }
285
- if len(tips) != 1 {
286
- return nil, fmt.Errorf("empty ACTIVE: need a unique archived terminal sequence tip with exact next Spec edge; found %d", len(tips))
347
+ if slug == "" {
348
+ return []string{"frontier: none"}, nil
287
349
  }
288
- slug = tips[0]
289
350
  }
290
351
  source := nodes[slug]
291
352
  if source == nil {
@@ -60,12 +60,9 @@ executable controller/harness/bundle bytes or a missing writer, read
60
60
  - Do not stop on `--max-slices`, sentinel `max_slices`, `max_agents`,
61
61
  `max_minutes`, or `max_review_queue`. Count failed, malformed, and
62
62
  unavailable leaf calls.
63
- - Never end the turn with a progress note while a wave runs or a next step
64
- exists: on a headless host a text-only reply ends the session and kills
65
- running children. Wait with the host's wait tool and keep working; end only
66
- at a recorded stop. A host reminder or rule notice (style rule, advisory) is
67
- not a stop either: follow it in your next tool call, never in a text-only
68
- acknowledgement.
63
+ - While waves run or next steps exist, use host tools/wait; text replies kill
64
+ headless sessions/children. End only at recorded stops; reminders/advisories
65
+ require tools, not acknowledgements.
69
66
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
70
67
  `--parallel`, `--full`, `--cross-model`, and `--lookahead` activate only as exact standalone
71
68
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -84,23 +81,30 @@ With `--lookahead` (trigger `lookahead`), follow
84
81
  [`lookahead.md`](reference/lookahead.md) instead of the steps below: plan the
85
82
  next sequence continuation through Vet in a second session, then stop.
86
83
 
87
- 1. **Orient and parse.** Resolve source per [phase target binding](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding).
88
- Read its existing cursor; a fresh idea starts empty at step 2. Normalize this
89
- invocation to idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
84
+ 1. **Orient and parse.** Bind [source](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding);
85
+ Keep validated overrides. With no source/override and missing/empty
86
+ `ACTIVE`, run `devrites-engine frontier` without slug first. Use unique
87
+ `frontier-source:` before asking. `frontier: none` without sequence
88
+ evidence permits fresh Spec at step 2; ambiguity/invalidity gates recovery.
89
+ Recovery never changes ACTIVE/flags or binds source from chat/recency.
90
+ Read existing `state.md` cursor.
91
+ Bind source in `devrites-engine`: `handoff <source> --resume`,
92
+ `context <source> --phase autocomplete`, `check continuation <source>`.
93
+ Arguments: idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
90
94
  `parallel: N|default`, `profile: standard|full`, `cross_model: yes|no`.
91
- Apply the loop's [AFK contract](reference/loop.md#arm-afk-once) to an existing
92
- sentinel: upsert `mode: autocomplete`, plus capacity only for explicit
93
- `--parallel N`. Mode identifies this controller, never grants authority.
94
- Run `devrites-engine frontier <source>` before local recovery; execute the
95
+ Apply [AFK contract](reference/loop.md#arm-afk-once) to existing sentinel:
96
+ upsert `mode: autocomplete`; capacity only for explicit `--parallel N`.
97
+ Mode identifies controller, grants no authority. Run
98
+ `devrites-engine frontier <source>` before local recovery; execute
95
99
  [global pass](../devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier).
96
- Reconcile blocked/terminal cursors against retained action evidence and exact
97
- fingerprint attempts; resume offline recovery below its cap. This explicit
98
- invocation reopens parked fingerprints. Reconstruct missing return cursors
99
- only from the current phase and approved `test-plan.md`/evidence action.
100
+ Reconcile blocked/terminal cursors with retained action evidence/exact fingerprint
101
+ attempts; resume below-cap offline recovery and reopen parked fingerprints.
102
+ Reconstruct missing return cursors only from current phase and approved
103
+ `test-plan.md`/evidence action, never chat.
100
104
  <!-- workflow-artifact-adapter: {"module":"devrites-lib/reference/standards/workflow-artifacts.md","entry":"lifecycle cursor encounters admitted set or resumable journal","action":"invoke classifier; execute returned route internally","return":"saved phase/action; zero intermediate reply"} -->
101
- After compaction/resume, run `devrites-engine handoff <source> --resume`
102
- and open its `read_next` artifacts per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
103
- **Completion:** arguments/source are unambiguous; local cursor and handles survive.
105
+ On compaction/resume, first run `devrites-engine handoff <source> --resume`;
106
+ read only its `read_next` per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
107
+ **Completion:** unambiguous arguments/source; cursor and handles intact.
104
108
  2. **Specify and clarify.** Run `devrites-interview`, `/rite-spec`, and
105
109
  `/rite-clarify` as one window. `open` material coverage never arms
106
110
  AFK. **Completion:** `Decision coverage: CLEAR` is durable.
@@ -147,15 +151,12 @@ next sequence continuation through Vet in a second session, then stop.
147
151
 
148
152
  ## Reply and resume
149
153
 
150
- HITL Build returns after one slice; Autocomplete ignores `--max-slices`, chaining
151
- pending slices. Each Autocomplete invocation owns internal backtracking. Context pressure, compaction, or a nested completion footer does
152
- not create a stop; persist and resume the cursor.
153
-
154
- Reply only at final state: text-only turns end the run. Keep
155
- calling tools after compaction or phase changes. Before any user-visible reply,
156
- `devrites-engine check continuation` must print `continuation: clear`
157
- (`handoff` prints the same lines). `required` means invoke `invoke:` now.
158
- `stopped` is not a phase token. Print this card only after `clear`:
154
+ HITL Build returns after one slice; Autocomplete chains pending slices, ignoring
155
+ `--max-slices`, and owns backtracking. Context pressure, compaction, and nested
156
+ completion footers never stop it; persist/resume the cursor and keep calling tools.
157
+ Before replying, `devrites-engine check continuation <source>` must print
158
+ `continuation: clear` (`handoff` emits it too); `required` means execute `invoke:`
159
+ now. `stopped` is no phase token. Only after `clear`, print:
159
160
 
160
161
  ```text
161
162
  Autocomplete: <slug>
@@ -62,12 +62,9 @@ executable controller/harness/bundle bytes or a missing writer, read
62
62
  - Do not stop on `--max-slices`, sentinel `max_slices`, `max_agents`,
63
63
  `max_minutes`, or `max_review_queue`. Count failed, malformed, and
64
64
  unavailable leaf calls.
65
- - Never end the turn with a progress note while a wave runs or a next step
66
- exists: on a headless host a text-only reply ends the session and kills
67
- running children. Wait with the host's wait tool and keep working; end only
68
- at a recorded stop. A host reminder or rule notice (style rule, advisory) is
69
- not a stop either: follow it in your next tool call, never in a text-only
70
- acknowledgement.
65
+ - While waves run or next steps exist, use host tools/wait; text replies kill
66
+ headless sessions/children. End only at recorded stops; reminders/advisories
67
+ require tools, not acknowledgements.
71
68
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
72
69
  `--parallel`, `--full`, `--cross-model`, and `--lookahead` activate only as exact standalone
73
70
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -86,23 +83,30 @@ With `--lookahead` (trigger `lookahead`), follow
86
83
  [`lookahead.md`](reference/lookahead.md) instead of the steps below: plan the
87
84
  next sequence continuation through Vet in a second session, then stop.
88
85
 
89
- 1. **Orient and parse.** Resolve source per [phase target binding](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding).
90
- Read its existing cursor; a fresh idea starts empty at step 2. Normalize this
91
- invocation to idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
86
+ 1. **Orient and parse.** Bind [source](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding);
87
+ Keep validated overrides. With no source/override and missing/empty
88
+ `ACTIVE`, run `devrites-engine frontier` without slug first. Use unique
89
+ `frontier-source:` before asking. `frontier: none` without sequence
90
+ evidence permits fresh Spec at step 2; ambiguity/invalidity gates recovery.
91
+ Recovery never changes ACTIVE/flags or binds source from chat/recency.
92
+ Read existing `state.md` cursor.
93
+ Bind source in `devrites-engine`: `handoff <source> --resume`,
94
+ `context <source> --phase autocomplete`, `check continuation <source>`.
95
+ Arguments: idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
92
96
  `parallel: N|default`, `profile: standard|full`, `cross_model: yes|no`.
93
- Apply the loop's [AFK contract](reference/loop.md#arm-afk-once) to an existing
94
- sentinel: upsert `mode: autocomplete`, plus capacity only for explicit
95
- `--parallel N`. Mode identifies this controller, never grants authority.
96
- Run `devrites-engine frontier <source>` before local recovery; execute the
97
+ Apply [AFK contract](reference/loop.md#arm-afk-once) to existing sentinel:
98
+ upsert `mode: autocomplete`; capacity only for explicit `--parallel N`.
99
+ Mode identifies controller, grants no authority. Run
100
+ `devrites-engine frontier <source>` before local recovery; execute
97
101
  [global pass](../devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier).
98
- Reconcile blocked/terminal cursors against retained action evidence and exact
99
- fingerprint attempts; resume offline recovery below its cap. This explicit
100
- invocation reopens parked fingerprints. Reconstruct missing return cursors
101
- only from the current phase and approved `test-plan.md`/evidence action.
102
+ Reconcile blocked/terminal cursors with retained action evidence/exact fingerprint
103
+ attempts; resume below-cap offline recovery and reopen parked fingerprints.
104
+ Reconstruct missing return cursors only from current phase and approved
105
+ `test-plan.md`/evidence action, never chat.
102
106
  <!-- workflow-artifact-adapter: {"module":"devrites-lib/reference/standards/workflow-artifacts.md","entry":"lifecycle cursor encounters admitted set or resumable journal","action":"invoke classifier; execute returned route internally","return":"saved phase/action; zero intermediate reply"} -->
103
- After compaction/resume, run `devrites-engine handoff <source> --resume`
104
- and open its `read_next` artifacts per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
105
- **Completion:** arguments/source are unambiguous; local cursor and handles survive.
107
+ On compaction/resume, first run `devrites-engine handoff <source> --resume`;
108
+ read only its `read_next` per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
109
+ **Completion:** unambiguous arguments/source; cursor and handles intact.
106
110
  2. **Specify and clarify.** Run `devrites-interview`, `/rite-spec`, and
107
111
  `/rite-clarify` as one window. `open` material coverage never arms
108
112
  AFK. **Completion:** `Decision coverage: CLEAR` is durable.
@@ -149,15 +153,12 @@ next sequence continuation through Vet in a second session, then stop.
149
153
 
150
154
  ## Reply and resume
151
155
 
152
- HITL Build returns after one slice; Autocomplete ignores `--max-slices`, chaining
153
- pending slices. Each Autocomplete invocation owns internal backtracking. Context pressure, compaction, or a nested completion footer does
154
- not create a stop; persist and resume the cursor.
155
-
156
- Reply only at final state: text-only turns end the run. Keep
157
- calling tools after compaction or phase changes. Before any user-visible reply,
158
- `devrites-engine check continuation` must print `continuation: clear`
159
- (`handoff` prints the same lines). `required` means invoke `invoke:` now.
160
- `stopped` is not a phase token. Print this card only after `clear`:
156
+ HITL Build returns after one slice; Autocomplete chains pending slices, ignoring
157
+ `--max-slices`, and owns backtracking. Context pressure, compaction, and nested
158
+ completion footers never stop it; persist/resume the cursor and keep calling tools.
159
+ Before replying, `devrites-engine check continuation <source>` must print
160
+ `continuation: clear` (`handoff` emits it too); `required` means execute `invoke:`
161
+ now. `stopped` is no phase token. Only after `clear`, print:
161
162
 
162
163
  ```text
163
164
  Autocomplete: <slug>
@@ -62,12 +62,9 @@ executable controller/harness/bundle bytes or a missing writer, read
62
62
  - Do not stop on `--max-slices`, sentinel `max_slices`, `max_agents`,
63
63
  `max_minutes`, or `max_review_queue`. Count failed, malformed, and
64
64
  unavailable leaf calls.
65
- - Never end the turn with a progress note while a wave runs or a next step
66
- exists: on a headless host a text-only reply ends the session and kills
67
- running children. Wait with the host's wait tool and keep working; end only
68
- at a recorded stop. A host reminder or rule notice (style rule, advisory) is
69
- not a stop either: follow it in your next tool call, never in a text-only
70
- acknowledgement.
65
+ - While waves run or next steps exist, use host tools/wait; text replies kill
66
+ headless sessions/children. End only at recorded stops; reminders/advisories
67
+ require tools, not acknowledgements.
71
68
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
72
69
  `--parallel`, `--full`, `--cross-model`, and `--lookahead` activate only as exact standalone
73
70
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -86,23 +83,30 @@ With `--lookahead` (trigger `lookahead`), follow
86
83
  [`lookahead.md`](reference/lookahead.md) instead of the steps below: plan the
87
84
  next sequence continuation through Vet in a second session, then stop.
88
85
 
89
- 1. **Orient and parse.** Resolve source per [phase target binding](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding).
90
- Read its existing cursor; a fresh idea starts empty at step 2. Normalize this
91
- invocation to idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
86
+ 1. **Orient and parse.** Bind [source](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding);
87
+ Keep validated overrides. With no source/override and missing/empty
88
+ `ACTIVE`, run `devrites-engine frontier` without slug first. Use unique
89
+ `frontier-source:` before asking. `frontier: none` without sequence
90
+ evidence permits fresh Spec at step 2; ambiguity/invalidity gates recovery.
91
+ Recovery never changes ACTIVE/flags or binds source from chat/recency.
92
+ Read existing `state.md` cursor.
93
+ Bind source in `devrites-engine`: `handoff <source> --resume`,
94
+ `context <source> --phase autocomplete`, `check continuation <source>`.
95
+ Arguments: idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
92
96
  `parallel: N|default`, `profile: standard|full`, `cross_model: yes|no`.
93
- Apply the loop's [AFK contract](reference/loop.md#arm-afk-once) to an existing
94
- sentinel: upsert `mode: autocomplete`, plus capacity only for explicit
95
- `--parallel N`. Mode identifies this controller, never grants authority.
96
- Run `devrites-engine frontier <source>` before local recovery; execute the
97
+ Apply [AFK contract](reference/loop.md#arm-afk-once) to existing sentinel:
98
+ upsert `mode: autocomplete`; capacity only for explicit `--parallel N`.
99
+ Mode identifies controller, grants no authority. Run
100
+ `devrites-engine frontier <source>` before local recovery; execute
97
101
  [global pass](../devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier).
98
- Reconcile blocked/terminal cursors against retained action evidence and exact
99
- fingerprint attempts; resume offline recovery below its cap. This explicit
100
- invocation reopens parked fingerprints. Reconstruct missing return cursors
101
- only from the current phase and approved `test-plan.md`/evidence action.
102
+ Reconcile blocked/terminal cursors with retained action evidence/exact fingerprint
103
+ attempts; resume below-cap offline recovery and reopen parked fingerprints.
104
+ Reconstruct missing return cursors only from current phase and approved
105
+ `test-plan.md`/evidence action, never chat.
102
106
  <!-- workflow-artifact-adapter: {"module":"devrites-lib/reference/standards/workflow-artifacts.md","entry":"lifecycle cursor encounters admitted set or resumable journal","action":"invoke classifier; execute returned route internally","return":"saved phase/action; zero intermediate reply"} -->
103
- After compaction/resume, run `devrites-engine handoff <source> --resume`
104
- and open its `read_next` artifacts per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
105
- **Completion:** arguments/source are unambiguous; local cursor and handles survive.
107
+ On compaction/resume, first run `devrites-engine handoff <source> --resume`;
108
+ read only its `read_next` per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
109
+ **Completion:** unambiguous arguments/source; cursor and handles intact.
106
110
  2. **Specify and clarify.** Run `devrites-interview`, `$rite-spec`, and
107
111
  `$rite-clarify` as one window. `open` material coverage never arms
108
112
  AFK. **Completion:** `Decision coverage: CLEAR` is durable.
@@ -149,15 +153,12 @@ next sequence continuation through Vet in a second session, then stop.
149
153
 
150
154
  ## Reply and resume
151
155
 
152
- HITL Build returns after one slice; Autocomplete ignores `--max-slices`, chaining
153
- pending slices. Each Autocomplete invocation owns internal backtracking. Context pressure, compaction, or a nested completion footer does
154
- not create a stop; persist and resume the cursor.
155
-
156
- Reply only at final state: text-only turns end the run. Keep
157
- calling tools after compaction or phase changes. Before any user-visible reply,
158
- `devrites-engine check continuation` must print `continuation: clear`
159
- (`handoff` prints the same lines). `required` means invoke `invoke:` now.
160
- `stopped` is not a phase token. Print this card only after `clear`:
156
+ HITL Build returns after one slice; Autocomplete chains pending slices, ignoring
157
+ `--max-slices`, and owns backtracking. Context pressure, compaction, and nested
158
+ completion footers never stop it; persist/resume the cursor and keep calling tools.
159
+ Before replying, `devrites-engine check continuation <source>` must print
160
+ `continuation: clear` (`handoff` emits it too); `required` means execute `invoke:`
161
+ now. `stopped` is no phase token. Only after `clear`, print:
161
162
 
162
163
  ```text
163
164
  Autocomplete: <slug>
@@ -61,12 +61,9 @@ executable controller/harness/bundle bytes or a missing writer, read
61
61
  - Do not stop on `--max-slices`, sentinel `max_slices`, `max_agents`,
62
62
  `max_minutes`, or `max_review_queue`. Count failed, malformed, and
63
63
  unavailable leaf calls.
64
- - Never end the turn with a progress note while a wave runs or a next step
65
- exists: on a headless host a text-only reply ends the session and kills
66
- running children. Wait with the host's wait tool and keep working; end only
67
- at a recorded stop. A host reminder or rule notice (style rule, advisory) is
68
- not a stop either: follow it in your next tool call, never in a text-only
69
- acknowledgement.
64
+ - While waves run or next steps exist, use host tools/wait; text replies kill
65
+ headless sessions/children. End only at recorded stops; reminders/advisories
66
+ require tools, not acknowledgements.
70
67
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
71
68
  `--parallel`, `--full`, `--cross-model`, and `--lookahead` activate only as exact standalone
72
69
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -85,23 +82,30 @@ With `--lookahead` (trigger `lookahead`), follow
85
82
  [`lookahead.md`](reference/lookahead.md) instead of the steps below: plan the
86
83
  next sequence continuation through Vet in a second session, then stop.
87
84
 
88
- 1. **Orient and parse.** Resolve source per [phase target binding](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding).
89
- Read its existing cursor; a fresh idea starts empty at step 2. Normalize this
90
- invocation to idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
85
+ 1. **Orient and parse.** Bind [source](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding);
86
+ Keep validated overrides. With no source/override and missing/empty
87
+ `ACTIVE`, run `devrites-engine frontier` without slug first. Use unique
88
+ `frontier-source:` before asking. `frontier: none` without sequence
89
+ evidence permits fresh Spec at step 2; ambiguity/invalidity gates recovery.
90
+ Recovery never changes ACTIVE/flags or binds source from chat/recency.
91
+ Read existing `state.md` cursor.
92
+ Bind source in `devrites-engine`: `handoff <source> --resume`,
93
+ `context <source> --phase autocomplete`, `check continuation <source>`.
94
+ Arguments: idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
91
95
  `parallel: N|default`, `profile: standard|full`, `cross_model: yes|no`.
92
- Apply the loop's [AFK contract](reference/loop.md#arm-afk-once) to an existing
93
- sentinel: upsert `mode: autocomplete`, plus capacity only for explicit
94
- `--parallel N`. Mode identifies this controller, never grants authority.
95
- Run `devrites-engine frontier <source>` before local recovery; execute the
96
+ Apply [AFK contract](reference/loop.md#arm-afk-once) to existing sentinel:
97
+ upsert `mode: autocomplete`; capacity only for explicit `--parallel N`.
98
+ Mode identifies controller, grants no authority. Run
99
+ `devrites-engine frontier <source>` before local recovery; execute
96
100
  [global pass](../devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier).
97
- Reconcile blocked/terminal cursors against retained action evidence and exact
98
- fingerprint attempts; resume offline recovery below its cap. This explicit
99
- invocation reopens parked fingerprints. Reconstruct missing return cursors
100
- only from the current phase and approved `test-plan.md`/evidence action.
101
+ Reconcile blocked/terminal cursors with retained action evidence/exact fingerprint
102
+ attempts; resume below-cap offline recovery and reopen parked fingerprints.
103
+ Reconstruct missing return cursors only from current phase and approved
104
+ `test-plan.md`/evidence action, never chat.
101
105
  <!-- workflow-artifact-adapter: {"module":"devrites-lib/reference/standards/workflow-artifacts.md","entry":"lifecycle cursor encounters admitted set or resumable journal","action":"invoke classifier; execute returned route internally","return":"saved phase/action; zero intermediate reply"} -->
102
- After compaction/resume, run `devrites-engine handoff <source> --resume`
103
- and open its `read_next` artifacts per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
104
- **Completion:** arguments/source are unambiguous; local cursor and handles survive.
106
+ On compaction/resume, first run `devrites-engine handoff <source> --resume`;
107
+ read only its `read_next` per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
108
+ **Completion:** unambiguous arguments/source; cursor and handles intact.
105
109
  2. **Specify and clarify.** Run `devrites-interview`, `/rite-spec`, and
106
110
  `/rite-clarify` as one window. `open` material coverage never arms
107
111
  AFK. **Completion:** `Decision coverage: CLEAR` is durable.
@@ -148,15 +152,12 @@ next sequence continuation through Vet in a second session, then stop.
148
152
 
149
153
  ## Reply and resume
150
154
 
151
- HITL Build returns after one slice; Autocomplete ignores `--max-slices`, chaining
152
- pending slices. Each Autocomplete invocation owns internal backtracking. Context pressure, compaction, or a nested completion footer does
153
- not create a stop; persist and resume the cursor.
154
-
155
- Reply only at final state: text-only turns end the run. Keep
156
- calling tools after compaction or phase changes. Before any user-visible reply,
157
- `devrites-engine check continuation` must print `continuation: clear`
158
- (`handoff` prints the same lines). `required` means invoke `invoke:` now.
159
- `stopped` is not a phase token. Print this card only after `clear`:
155
+ HITL Build returns after one slice; Autocomplete chains pending slices, ignoring
156
+ `--max-slices`, and owns backtracking. Context pressure, compaction, and nested
157
+ completion footers never stop it; persist/resume the cursor and keep calling tools.
158
+ Before replying, `devrites-engine check continuation <source>` must print
159
+ `continuation: clear` (`handoff` emits it too); `required` means execute `invoke:`
160
+ now. `stopped` is no phase token. Only after `clear`, print:
160
161
 
161
162
  ```text
162
163
  Autocomplete: <slug>
@@ -62,12 +62,9 @@ executable controller/harness/bundle bytes or a missing writer, read
62
62
  - Do not stop on `--max-slices`, sentinel `max_slices`, `max_agents`,
63
63
  `max_minutes`, or `max_review_queue`. Count failed, malformed, and
64
64
  unavailable leaf calls.
65
- - Never end the turn with a progress note while a wave runs or a next step
66
- exists: on a headless host a text-only reply ends the session and kills
67
- running children. Wait with the host's wait tool and keep working; end only
68
- at a recorded stop. A host reminder or rule notice (style rule, advisory) is
69
- not a stop either: follow it in your next tool call, never in a text-only
70
- acknowledgement.
65
+ - While waves run or next steps exist, use host tools/wait; text replies kill
66
+ headless sessions/children. End only at recorded stops; reminders/advisories
67
+ require tools, not acknowledgements.
71
68
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
72
69
  `--parallel`, `--full`, `--cross-model`, and `--lookahead` activate only as exact standalone
73
70
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -86,23 +83,30 @@ With `--lookahead` (trigger `lookahead`), follow
86
83
  [`lookahead.md`](reference/lookahead.md) instead of the steps below: plan the
87
84
  next sequence continuation through Vet in a second session, then stop.
88
85
 
89
- 1. **Orient and parse.** Resolve source per [phase target binding](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding).
90
- Read its existing cursor; a fresh idea starts empty at step 2. Normalize this
91
- invocation to idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
86
+ 1. **Orient and parse.** Bind [source](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding);
87
+ Keep validated overrides. With no source/override and missing/empty
88
+ `ACTIVE`, run `devrites-engine frontier` without slug first. Use unique
89
+ `frontier-source:` before asking. `frontier: none` without sequence
90
+ evidence permits fresh Spec at step 2; ambiguity/invalidity gates recovery.
91
+ Recovery never changes ACTIVE/flags or binds source from chat/recency.
92
+ Read existing `state.md` cursor.
93
+ Bind source in `devrites-engine`: `handoff <source> --resume`,
94
+ `context <source> --phase autocomplete`, `check continuation <source>`.
95
+ Arguments: idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
92
96
  `parallel: N|default`, `profile: standard|full`, `cross_model: yes|no`.
93
- Apply the loop's [AFK contract](reference/loop.md#arm-afk-once) to an existing
94
- sentinel: upsert `mode: autocomplete`, plus capacity only for explicit
95
- `--parallel N`. Mode identifies this controller, never grants authority.
96
- Run `devrites-engine frontier <source>` before local recovery; execute the
97
+ Apply [AFK contract](reference/loop.md#arm-afk-once) to existing sentinel:
98
+ upsert `mode: autocomplete`; capacity only for explicit `--parallel N`.
99
+ Mode identifies controller, grants no authority. Run
100
+ `devrites-engine frontier <source>` before local recovery; execute
97
101
  [global pass](../devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier).
98
- Reconcile blocked/terminal cursors against retained action evidence and exact
99
- fingerprint attempts; resume offline recovery below its cap. This explicit
100
- invocation reopens parked fingerprints. Reconstruct missing return cursors
101
- only from the current phase and approved `test-plan.md`/evidence action.
102
+ Reconcile blocked/terminal cursors with retained action evidence/exact fingerprint
103
+ attempts; resume below-cap offline recovery and reopen parked fingerprints.
104
+ Reconstruct missing return cursors only from current phase and approved
105
+ `test-plan.md`/evidence action, never chat.
102
106
  <!-- workflow-artifact-adapter: {"module":"devrites-lib/reference/standards/workflow-artifacts.md","entry":"lifecycle cursor encounters admitted set or resumable journal","action":"invoke classifier; execute returned route internally","return":"saved phase/action; zero intermediate reply"} -->
103
- After compaction/resume, run `devrites-engine handoff <source> --resume`
104
- and open its `read_next` artifacts per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
105
- **Completion:** arguments/source are unambiguous; local cursor and handles survive.
107
+ On compaction/resume, first run `devrites-engine handoff <source> --resume`;
108
+ read only its `read_next` per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
109
+ **Completion:** unambiguous arguments/source; cursor and handles intact.
106
110
  2. **Specify and clarify.** Run `devrites-interview`, `/rite-spec`, and
107
111
  `/rite-clarify` as one window. `open` material coverage never arms
108
112
  AFK. **Completion:** `Decision coverage: CLEAR` is durable.
@@ -149,15 +153,12 @@ next sequence continuation through Vet in a second session, then stop.
149
153
 
150
154
  ## Reply and resume
151
155
 
152
- HITL Build returns after one slice; Autocomplete ignores `--max-slices`, chaining
153
- pending slices. Each Autocomplete invocation owns internal backtracking. Context pressure, compaction, or a nested completion footer does
154
- not create a stop; persist and resume the cursor.
155
-
156
- Reply only at final state: text-only turns end the run. Keep
157
- calling tools after compaction or phase changes. Before any user-visible reply,
158
- `devrites-engine check continuation` must print `continuation: clear`
159
- (`handoff` prints the same lines). `required` means invoke `invoke:` now.
160
- `stopped` is not a phase token. Print this card only after `clear`:
156
+ HITL Build returns after one slice; Autocomplete chains pending slices, ignoring
157
+ `--max-slices`, and owns backtracking. Context pressure, compaction, and nested
158
+ completion footers never stop it; persist/resume the cursor and keep calling tools.
159
+ Before replying, `devrites-engine check continuation <source>` must print
160
+ `continuation: clear` (`handoff` emits it too); `required` means execute `invoke:`
161
+ now. `stopped` is no phase token. Only after `clear`, print:
161
162
 
162
163
  ```text
163
164
  Autocomplete: <slug>
@@ -62,12 +62,9 @@ executable controller/harness/bundle bytes or a missing writer, read
62
62
  - Do not stop on `--max-slices`, sentinel `max_slices`, `max_agents`,
63
63
  `max_minutes`, or `max_review_queue`. Count failed, malformed, and
64
64
  unavailable leaf calls.
65
- - Never end the turn with a progress note while a wave runs or a next step
66
- exists: on a headless host a text-only reply ends the session and kills
67
- running children. Wait with the host's wait tool and keep working; end only
68
- at a recorded stop. A host reminder or rule notice (style rule, advisory) is
69
- not a stop either: follow it in your next tool call, never in a text-only
70
- acknowledgement.
65
+ - While waves run or next steps exist, use host tools/wait; text replies kill
66
+ headless sessions/children. End only at recorded stops; reminders/advisories
67
+ require tools, not acknowledgements.
71
68
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
72
69
  `--parallel`, `--full`, `--cross-model`, and `--lookahead` activate only as exact standalone
73
70
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -86,23 +83,30 @@ With `--lookahead` (trigger `lookahead`), follow
86
83
  [`lookahead.md`](reference/lookahead.md) instead of the steps below: plan the
87
84
  next sequence continuation through Vet in a second session, then stop.
88
85
 
89
- 1. **Orient and parse.** Resolve source per [phase target binding](skill://devrites-lib/reference/parallel-workspaces.md#phase-target-binding).
90
- Read its existing cursor; a fresh idea starts empty at step 2. Normalize this
91
- invocation to idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
86
+ 1. **Orient and parse.** Bind [source](skill://devrites-lib/reference/parallel-workspaces.md#phase-target-binding);
87
+ Keep validated overrides. With no source/override and missing/empty
88
+ `ACTIVE`, run `devrites-engine frontier` without slug first. Use unique
89
+ `frontier-source:` before asking. `frontier: none` without sequence
90
+ evidence permits fresh Spec at step 2; ambiguity/invalidity gates recovery.
91
+ Recovery never changes ACTIVE/flags or binds source from chat/recency.
92
+ Read existing `state.md` cursor.
93
+ Bind source in `devrites-engine`: `handoff <source> --resume`,
94
+ `context <source> --phase autocomplete`, `check continuation <source>`.
95
+ Arguments: idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
92
96
  `parallel: N|default`, `profile: standard|full`, `cross_model: yes|no`.
93
- Apply the loop's [AFK contract](reference/loop.md#arm-afk-once) to an existing
94
- sentinel: upsert `mode: autocomplete`, plus capacity only for explicit
95
- `--parallel N`. Mode identifies this controller, never grants authority.
96
- Run `devrites-engine frontier <source>` before local recovery; execute the
97
+ Apply [AFK contract](reference/loop.md#arm-afk-once) to existing sentinel:
98
+ upsert `mode: autocomplete`; capacity only for explicit `--parallel N`.
99
+ Mode identifies controller, grants no authority. Run
100
+ `devrites-engine frontier <source>` before local recovery; execute
97
101
  [global pass](skill://devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier).
98
- Reconcile blocked/terminal cursors against retained action evidence and exact
99
- fingerprint attempts; resume offline recovery below its cap. This explicit
100
- invocation reopens parked fingerprints. Reconstruct missing return cursors
101
- only from the current phase and approved `test-plan.md`/evidence action.
102
+ Reconcile blocked/terminal cursors with retained action evidence/exact fingerprint
103
+ attempts; resume below-cap offline recovery and reopen parked fingerprints.
104
+ Reconstruct missing return cursors only from current phase and approved
105
+ `test-plan.md`/evidence action, never chat.
102
106
  <!-- workflow-artifact-adapter: {"module":"devrites-lib/reference/standards/workflow-artifacts.md","entry":"lifecycle cursor encounters admitted set or resumable journal","action":"invoke classifier; execute returned route internally","return":"saved phase/action; zero intermediate reply"} -->
103
- After compaction/resume, run `devrites-engine handoff <source> --resume`
104
- and open its `read_next` artifacts per [context hygiene](skill://devrites-lib/reference/standards/context-hygiene.md).
105
- **Completion:** arguments/source are unambiguous; local cursor and handles survive.
107
+ On compaction/resume, first run `devrites-engine handoff <source> --resume`;
108
+ read only its `read_next` per [context hygiene](skill://devrites-lib/reference/standards/context-hygiene.md).
109
+ **Completion:** unambiguous arguments/source; cursor and handles intact.
106
110
  2. **Specify and clarify.** Run `devrites-interview`, `/rite-spec`, and
107
111
  `/rite-clarify` as one window. `open` material coverage never arms
108
112
  AFK. **Completion:** `Decision coverage: CLEAR` is durable.
@@ -149,15 +153,12 @@ next sequence continuation through Vet in a second session, then stop.
149
153
 
150
154
  ## Reply and resume
151
155
 
152
- HITL Build returns after one slice; Autocomplete ignores `--max-slices`, chaining
153
- pending slices. Each Autocomplete invocation owns internal backtracking. Context pressure, compaction, or a nested completion footer does
154
- not create a stop; persist and resume the cursor.
155
-
156
- Reply only at final state: text-only turns end the run. Keep
157
- calling tools after compaction or phase changes. Before any user-visible reply,
158
- `devrites-engine check continuation` must print `continuation: clear`
159
- (`handoff` prints the same lines). `required` means invoke `invoke:` now.
160
- `stopped` is not a phase token. Print this card only after `clear`:
156
+ HITL Build returns after one slice; Autocomplete chains pending slices, ignoring
157
+ `--max-slices`, and owns backtracking. Context pressure, compaction, and nested
158
+ completion footers never stop it; persist/resume the cursor and keep calling tools.
159
+ Before replying, `devrites-engine check continuation <source>` must print
160
+ `continuation: clear` (`handoff` emits it too); `required` means execute `invoke:`
161
+ now. `stopped` is no phase token. Only after `clear`, print:
161
162
 
162
163
  ```text
163
164
  Autocomplete: <slug>
@@ -62,12 +62,9 @@ executable controller/harness/bundle bytes or a missing writer, read
62
62
  - Do not stop on `--max-slices`, sentinel `max_slices`, `max_agents`,
63
63
  `max_minutes`, or `max_review_queue`. Count failed, malformed, and
64
64
  unavailable leaf calls.
65
- - Never end the turn with a progress note while a wave runs or a next step
66
- exists: on a headless host a text-only reply ends the session and kills
67
- running children. Wait with the host's wait tool and keep working; end only
68
- at a recorded stop. A host reminder or rule notice (style rule, advisory) is
69
- not a stop either: follow it in your next tool call, never in a text-only
70
- acknowledgement.
65
+ - While waves run or next steps exist, use host tools/wait; text replies kill
66
+ headless sessions/children. End only at recorded stops; reminders/advisories
67
+ require tools, not acknowledgements.
71
68
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
72
69
  `--parallel`, `--full`, `--cross-model`, and `--lookahead` activate only as exact standalone
73
70
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -86,23 +83,30 @@ With `--lookahead` (trigger `lookahead`), follow
86
83
  [`lookahead.md`](reference/lookahead.md) instead of the steps below: plan the
87
84
  next sequence continuation through Vet in a second session, then stop.
88
85
 
89
- 1. **Orient and parse.** Resolve source per [phase target binding](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding).
90
- Read its existing cursor; a fresh idea starts empty at step 2. Normalize this
91
- invocation to idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
86
+ 1. **Orient and parse.** Bind [source](../devrites-lib/reference/parallel-workspaces.md#phase-target-binding);
87
+ Keep validated overrides. With no source/override and missing/empty
88
+ `ACTIVE`, run `devrites-engine frontier` without slug first. Use unique
89
+ `frontier-source:` before asking. `frontier: none` without sequence
90
+ evidence permits fresh Spec at step 2; ambiguity/invalidity gates recovery.
91
+ Recovery never changes ACTIVE/flags or binds source from chat/recency.
92
+ Read existing `state.md` cursor.
93
+ Bind source in `devrites-engine`: `handoff <source> --resume`,
94
+ `context <source> --phase autocomplete`, `check continuation <source>`.
95
+ Arguments: idea, `ship_preflight: yes|no`, `max_slices: unlimited`,
92
96
  `parallel: N|default`, `profile: standard|full`, `cross_model: yes|no`.
93
- Apply the loop's [AFK contract](reference/loop.md#arm-afk-once) to an existing
94
- sentinel: upsert `mode: autocomplete`, plus capacity only for explicit
95
- `--parallel N`. Mode identifies this controller, never grants authority.
96
- Run `devrites-engine frontier <source>` before local recovery; execute the
97
+ Apply [AFK contract](reference/loop.md#arm-afk-once) to existing sentinel:
98
+ upsert `mode: autocomplete`; capacity only for explicit `--parallel N`.
99
+ Mode identifies controller, grants no authority. Run
100
+ `devrites-engine frontier <source>` before local recovery; execute
97
101
  [global pass](../devrites-lib/reference/parallel-workspaces.md#continuous-global-frontier).
98
- Reconcile blocked/terminal cursors against retained action evidence and exact
99
- fingerprint attempts; resume offline recovery below its cap. This explicit
100
- invocation reopens parked fingerprints. Reconstruct missing return cursors
101
- only from the current phase and approved `test-plan.md`/evidence action.
102
+ Reconcile blocked/terminal cursors with retained action evidence/exact fingerprint
103
+ attempts; resume below-cap offline recovery and reopen parked fingerprints.
104
+ Reconstruct missing return cursors only from current phase and approved
105
+ `test-plan.md`/evidence action, never chat.
102
106
  <!-- workflow-artifact-adapter: {"module":"devrites-lib/reference/standards/workflow-artifacts.md","entry":"lifecycle cursor encounters admitted set or resumable journal","action":"invoke classifier; execute returned route internally","return":"saved phase/action; zero intermediate reply"} -->
103
- After compaction/resume, run `devrites-engine handoff <source> --resume`
104
- and open its `read_next` artifacts per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
105
- **Completion:** arguments/source are unambiguous; local cursor and handles survive.
107
+ On compaction/resume, first run `devrites-engine handoff <source> --resume`;
108
+ read only its `read_next` per [context hygiene](../devrites-lib/reference/standards/context-hygiene.md).
109
+ **Completion:** unambiguous arguments/source; cursor and handles intact.
106
110
  2. **Specify and clarify.** Run `devrites-interview`, `/rite-spec`, and
107
111
  `/rite-clarify` as one window. `open` material coverage never arms
108
112
  AFK. **Completion:** `Decision coverage: CLEAR` is durable.
@@ -149,15 +153,12 @@ next sequence continuation through Vet in a second session, then stop.
149
153
 
150
154
  ## Reply and resume
151
155
 
152
- HITL Build returns after one slice; Autocomplete ignores `--max-slices`, chaining
153
- pending slices. Each Autocomplete invocation owns internal backtracking. Context pressure, compaction, or a nested completion footer does
154
- not create a stop; persist and resume the cursor.
155
-
156
- Reply only at final state: text-only turns end the run. Keep
157
- calling tools after compaction or phase changes. Before any user-visible reply,
158
- `devrites-engine check continuation` must print `continuation: clear`
159
- (`handoff` prints the same lines). `required` means invoke `invoke:` now.
160
- `stopped` is not a phase token. Print this card only after `clear`:
156
+ HITL Build returns after one slice; Autocomplete chains pending slices, ignoring
157
+ `--max-slices`, and owns backtracking. Context pressure, compaction, and nested
158
+ completion footers never stop it; persist/resume the cursor and keep calling tools.
159
+ Before replying, `devrites-engine check continuation <source>` must print
160
+ `continuation: clear` (`handoff` emits it too); `required` means execute `invoke:`
161
+ now. `stopped` is no phase token. Only after `clear`, print:
161
162
 
162
163
  ```text
163
164
  Autocomplete: <slug>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devrites",
3
- "version": "7.3.9",
3
+ "version": "7.3.10",
4
4
  "description": "DevRites: a disciplined senior-engineer workflow pack for Claude Code, Codex, omp, pi, and Devin CLI",
5
5
  "license": "SEE LICENSE IN LICENSE",
6
6
  "homepage": "https://github.com/ViktorsBaikers/DevRites#readme",