devrites 6.6.0 → 6.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,16 @@
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
+ ## [6.7.0](https://github.com/ViktorsBaikers/DevRites/compare/v6.6.0...v6.7.0) (2026-10-17)
6
+
7
+ ### Added
8
+
9
+ * **devrites:** lint reviewer packets at dispatch open ([#124](https://github.com/ViktorsBaikers/DevRites/issues/124)) ([2baeaf3](https://github.com/ViktorsBaikers/DevRites/commit/2baeaf380a68509e845abe1219a889fd2e710148))
10
+
11
+ ### Fixed
12
+
13
+ * **no-release:** autocomplete never ends a turn on a progress note ([#123](https://github.com/ViktorsBaikers/DevRites/issues/123)) ([33d3746](https://github.com/ViktorsBaikers/DevRites/commit/33d374697cdf374292a54027dd2148c5289b762b))
14
+
5
15
  ## [6.6.0](https://github.com/ViktorsBaikers/DevRites/compare/v6.5.0...v6.6.0) (2026-10-17)
6
16
 
7
17
  ### Added
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:** [`v6.6.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v6.6.0): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
34
+ **Status:** [`v6.7.0`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v6.7.0): 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
 
@@ -34,7 +34,7 @@ workflow strategy.
34
34
  | `handoff [slug]` | 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, missing required files, and the canonical read-next order. Read-only; the `/rite-handoff` spine and the compaction-fallback entry point. |
35
35
  | `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. |
36
36
  | `context [slug] (--phase <p>\|--skill <name>) [--role <r>] [--slice <SLICE-ID>] [--trigger a,b]` | 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 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. `--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`. |
37
- | `dispatch <slug> <open\|start\|seal\|return\|status\|abandon>` | Launch-wave barrier for parallel dispatch: seal needs a handle per role, return needs seal; start/return auto-record metrics. A build wave with a wright role needs `--slice <SLICE-ID>` per slice, and a slice-bound vet wave takes it too; every 5 rounds of either kind on one slice, `open` exits `3` until `--reslice-review <DRIFT-ID>` names an unused `drift.md` `## <DRIFT-ID>` heading for that slice. `open` also warns when an earlier wave for the same slice never returned. |
37
+ | `dispatch <slug> <open\|start\|seal\|return\|status\|abandon>` | Launch-wave barrier for parallel dispatch: seal needs a handle per role, return needs seal; start/return auto-record metrics. A build wave with a wright role needs `--slice <SLICE-ID>` per slice, and a slice-bound vet wave takes it too; a reviewer, auditor, or test-analyst wave needs `--packet <file>` and `open` exits `3` on a packet that seeds a conclusion (gate `*-PASS` token, `no-findings`, an `Outcome:`/`Counts:` line, an "already passed" claim, or zero Critical/Important counts); every 5 rounds of either kind on one slice, `open` exits `3` until `--reslice-review <DRIFT-ID>` names an unused `drift.md` `## <DRIFT-ID>` heading for that slice. `open` also warns when an earlier wave for the same slice never returned. |
38
38
  | `metrics record <slug> --phase <p> --event <e> [--role r] [--bytes n] [--note s]` | Append an event to the workspace's `metrics.jsonl` ledger. |
39
39
  | `metrics summary [slug] [--by-slice]` | Reduce `metrics.jsonl` into a per-phase roll-up. `--by-slice` reads `dispatch.json` instead: per slice, build wright rounds, slice-bound Vet rechecks, and agent-minutes (role start to `returned_at`; abandoned waves excluded). |
40
40
  | `claim <add\|release\|list\|check>` | Advisory session-scoped file claims in `.devrites/claims.jsonl` (append-only). `add` records intent to write a path set with a TTL (1–240 min, default 30); a live claim by another session exits `3` and names the holder. `release` appends a release event owned by the claiming session. `list` shows live claims (`--all` includes expired/released); a claim whose holding session has provably exited on this host shows `dead` and no longer conflicts. `check` is the read-only preflight for a path set. Coordination aid only — never a substitute for one-writer-per-worktree. |
package/engine/help.go CHANGED
@@ -58,7 +58,7 @@ const (
58
58
  metrics record <slug> --phase <p> --event <e> [--role r] [--bytes n] [--note s]
59
59
  metrics summary [slug] [--by-slice]
60
60
  `
61
- dispatchUsage = `usage: devrites-engine dispatch <slug> <open|start|seal|return|status|abandon> [--phase p] [--wave w] [--role r] [--handle h] [--reason s] [--slice SLICE-###] [--reslice-review <DRIFT-ID>] [--contract <file>]`
61
+ dispatchUsage = `usage: devrites-engine dispatch <slug> <open|start|seal|return|status|abandon> [--phase p] [--wave w] [--role r] [--handle h] [--reason s] [--slice SLICE-###] [--reslice-review <DRIFT-ID>] [--contract <file>] [--packet <file>]`
62
62
  claimUsageText = `usage: devrites-engine claim <add|release|list|check> ...
63
63
 
64
64
  claim add --session <id> [--ttl <minutes>] [--reason <s>] <path>...
@@ -21,9 +21,9 @@ import (
21
21
  // fan-out cannot silently degrade to serial (open -> every role started ->
22
22
  // seal -> returns -> complete). start/return also auto-record metrics events.
23
23
  //
24
- // devrites-engine dispatch <slug> <sub> [--phase p] [--wave w] [--role r] [--handle h] [--reason s] [--slice SLICE-###] [--reslice-review <DRIFT-ID>] [--contract <file>]
24
+ // devrites-engine dispatch <slug> <sub> [--phase p] [--wave w] [--role r] [--handle h] [--reason s] [--slice SLICE-###] [--reslice-review <DRIFT-ID>] [--contract <file>] [--packet <file>]
25
25
 
26
- const dispatchUsage = `usage: devrites-engine dispatch <slug> <open|start|seal|return|status|abandon> [--phase p] [--wave w] [--role r] [--handle h] [--reason s] [--slice SLICE-###] [--reslice-review <DRIFT-ID>] [--contract <file>]
26
+ const dispatchUsage = `usage: devrites-engine dispatch <slug> <open|start|seal|return|status|abandon> [--phase p] [--wave w] [--role r] [--handle h] [--reason s] [--slice SLICE-###] [--reslice-review <DRIFT-ID>] [--contract <file>] [--packet <file>]
27
27
 
28
28
  Wave barrier for parallel agent dispatch: seal fails until every declared
29
29
  role has a distinct handle; return fails before seal. status --wave exits
@@ -117,7 +117,7 @@ func nowStamp() string { return time.Now().UTC().Format(time.RFC3339) }
117
117
 
118
118
  // RunDispatch implements the dispatch wave state machine.
119
119
  func RunDispatch(root string, args []string, stdout, stderr io.Writer) int {
120
- var slug, sub, phase, wave, role, handle, reason, review, contract string
120
+ var slug, sub, phase, wave, role, handle, reason, review, contract, packet string
121
121
  var roles, sliceIDs []string
122
122
  var positional []string
123
123
  for i := 0; i < len(args); i++ {
@@ -140,6 +140,8 @@ func RunDispatch(root string, args []string, stdout, stderr io.Writer) int {
140
140
  review = value
141
141
  case "--contract":
142
142
  contract = value
143
+ case "--packet":
144
+ packet = value
143
145
  default:
144
146
  if strings.HasPrefix(args[i], "-") {
145
147
  fmt.Fprintf(stderr, "dispatch: unknown flag %q\n", args[i])
@@ -163,7 +165,7 @@ func RunDispatch(root string, args []string, stdout, stderr io.Writer) int {
163
165
  // an update and strand the wave short of complete.
164
166
  code := 0
165
167
  if err := state.WithFeatureLock(root, slug, func() error {
166
- code = dispatchLocked(root, slug, sub, phase, wave, role, handle, reason, roles, sliceIDs, review, contract, stdout, stderr)
168
+ code = dispatchLocked(root, slug, sub, phase, wave, role, handle, reason, roles, sliceIDs, review, contract, packet, stdout, stderr)
167
169
  return nil
168
170
  }); err != nil {
169
171
  fmt.Fprintf(stderr, "dispatch: %v\n", err)
@@ -172,7 +174,7 @@ func RunDispatch(root string, args []string, stdout, stderr io.Writer) int {
172
174
  return code
173
175
  }
174
176
 
175
- func dispatchLocked(root, slug, sub, phase, wave, role, handle, reason string, roles, sliceIDs []string, review, contract string, stdout, stderr io.Writer) int {
177
+ func dispatchLocked(root, slug, sub, phase, wave, role, handle, reason string, roles, sliceIDs []string, review, contract, packet string, stdout, stderr io.Writer) int {
176
178
  f, path, err := loadDispatch(root, slug)
177
179
  if err != nil {
178
180
  fmt.Fprintf(stderr, "dispatch: %v\n", err)
@@ -216,6 +218,14 @@ func dispatchLocked(root, slug, sub, phase, wave, role, handle, reason string, r
216
218
  return fail("BLOCKED: %v", err)
217
219
  }
218
220
  }
221
+ for _, r := range roles {
222
+ if isReviewerRole(r) {
223
+ if err := lintReviewerPacket(packet); err != nil {
224
+ return fail("BLOCKED: %v", err)
225
+ }
226
+ break
227
+ }
228
+ }
219
229
  f.Waves[wave] = w
220
230
  if err := saveDispatch(path, f); err != nil {
221
231
  return fail("%v", err)
@@ -0,0 +1,51 @@
1
+ package lib
2
+
3
+ import (
4
+ "fmt"
5
+ "regexp"
6
+ "strings"
7
+ )
8
+
9
+ // seedingRE matches packet text that hands a reviewer a conclusion instead of
10
+ // scope: a gate's success token, a reviewer outcome or count, or a claim that
11
+ // something already passed. Each one voids an independent review.
12
+ var seedingRE = regexp.MustCompile(`\b[A-Z][A-Z0-9]*(?:-[A-Z0-9]+)+-PASS\b` +
13
+ `|(?i:\bno-findings\b)` +
14
+ `|(?i:^\s*(?:outcome|counts|verdict)\s*:\s*[^<\s])` +
15
+ `|(?i:\b(?:already|previously)\s+(?:passed|passes|green|printed|verified|approved|clean)\b)` +
16
+ `|(?i:\b(?:critical|important)\s*[:=]?\s*0\b)`)
17
+
18
+ // isReviewerRole reports whether role is an independent read-only reviewer:
19
+ // a *-reviewer, *-auditor, or test-analyst, with an optional ".lane" suffix.
20
+ func isReviewerRole(role string) bool {
21
+ base, _, _ := strings.Cut(role, ".")
22
+ return strings.HasSuffix(base, "-reviewer") || strings.HasSuffix(base, "-auditor") || base == "test-analyst"
23
+ }
24
+
25
+ // lintReviewerPacket refuses a reviewer packet that seeds a conclusion, so a
26
+ // voided review is rejected before launch rather than discovered after it.
27
+ // Placeholder text inside <...> (an output template) is not a conclusion.
28
+ func lintReviewerPacket(path string) error {
29
+ if path == "" {
30
+ return fmt.Errorf("a reviewer wave needs --packet <file> holding the exact packet the reviewers receive")
31
+ }
32
+ raw, err := readBoundedRegularFile(path, maxContractBytes)
33
+ if err != nil {
34
+ return fmt.Errorf("reviewer packet %s: %w", path, err)
35
+ }
36
+ for i, line := range strings.Split(string(raw), "\n") {
37
+ for _, loc := range seedingRE.FindAllStringIndex(line, -1) {
38
+ if insidePlaceholder(line, loc[0], loc[1]) {
39
+ continue
40
+ }
41
+ return fmt.Errorf("reviewer packet %s:%d seeds a conclusion (%q); a packet carries scope, paths, diff and rubric only — never a gate result, a reviewer outcome or count, or a claim that something already passed. Weigh root proof at reconciliation instead",
42
+ path, i+1, strings.TrimSpace(line[loc[0]:loc[1]]))
43
+ }
44
+ }
45
+ return nil
46
+ }
47
+
48
+ func insidePlaceholder(line string, start, end int) bool {
49
+ open := strings.LastIndex(line[:start], "<")
50
+ return open >= 0 && open > strings.LastIndex(line[:start], ">") && strings.Contains(line[end:], ">")
51
+ }
@@ -47,8 +47,10 @@ If the candidate diff has no matching surfaces, record
47
47
  (`auto=[agents]` in the output). The command prints `unselected=[...]`; an
48
48
  omitted applicable trigger is a gap, not a shortcut.
49
49
  3. Enforce the launch barrier through the engine, not prose. Open the wave
50
- (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`),
51
- launch every native agent nonblocking, record each returned host handle
50
+ (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`;
51
+ a reviewer, auditor, or test-analyst wave adds `--packet <file>`, the exact packet
52
+ those agents receive, and `open` refuses one that seeds a gate result, outcome,
53
+ count, or "already passed" claim), launch every native agent nonblocking, record each returned host handle
52
54
  (`dispatch ... start --wave <w> --role <r> --handle <id>`), then `seal` —
53
55
  seal fails until every declared role has a distinct handle, which makes a
54
56
  serial launch-then-wait pattern impossible to record. Record each completion
@@ -60,6 +60,10 @@ 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.
63
67
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
64
68
  `--parallel`, `--full`, and `--cross-model` activate only as exact standalone
65
69
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -47,8 +47,10 @@ If the candidate diff has no matching surfaces, record
47
47
  (`auto=[agents]` in the output). The command prints `unselected=[...]`; an
48
48
  omitted applicable trigger is a gap, not a shortcut.
49
49
  3. Enforce the launch barrier through the engine, not prose. Open the wave
50
- (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`),
51
- launch every native agent nonblocking, record each returned host handle
50
+ (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`;
51
+ a reviewer, auditor, or test-analyst wave adds `--packet <file>`, the exact packet
52
+ those agents receive, and `open` refuses one that seeds a gate result, outcome,
53
+ count, or "already passed" claim), launch every native agent nonblocking, record each returned host handle
52
54
  (`dispatch ... start --wave <w> --role <r> --handle <id>`), then `seal` —
53
55
  seal fails until every declared role has a distinct handle, which makes a
54
56
  serial launch-then-wait pattern impossible to record. Record each completion
@@ -62,6 +62,10 @@ 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.
65
69
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
66
70
  `--parallel`, `--full`, and `--cross-model` activate only as exact standalone
67
71
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -47,8 +47,10 @@ If the candidate diff has no matching surfaces, record
47
47
  (`auto=[agents]` in the output). The command prints `unselected=[...]`; an
48
48
  omitted applicable trigger is a gap, not a shortcut.
49
49
  3. Enforce the launch barrier through the engine, not prose. Open the wave
50
- (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`),
51
- launch every native agent nonblocking, record each returned host handle
50
+ (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`;
51
+ a reviewer, auditor, or test-analyst wave adds `--packet <file>`, the exact packet
52
+ those agents receive, and `open` refuses one that seeds a gate result, outcome,
53
+ count, or "already passed" claim), launch every native agent nonblocking, record each returned host handle
52
54
  (`dispatch ... start --wave <w> --role <r> --handle <id>`), then `seal` —
53
55
  seal fails until every declared role has a distinct handle, which makes a
54
56
  serial launch-then-wait pattern impossible to record. Record each completion
@@ -62,6 +62,10 @@ 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.
65
69
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
66
70
  `--parallel`, `--full`, and `--cross-model` activate only as exact standalone
67
71
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -47,8 +47,10 @@ If the candidate diff has no matching surfaces, record
47
47
  (`auto=[agents]` in the output). The command prints `unselected=[...]`; an
48
48
  omitted applicable trigger is a gap, not a shortcut.
49
49
  3. Enforce the launch barrier through the engine, not prose. Open the wave
50
- (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`),
51
- launch every native agent nonblocking, record each returned host handle
50
+ (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`;
51
+ a reviewer, auditor, or test-analyst wave adds `--packet <file>`, the exact packet
52
+ those agents receive, and `open` refuses one that seeds a gate result, outcome,
53
+ count, or "already passed" claim), launch every native agent nonblocking, record each returned host handle
52
54
  (`dispatch ... start --wave <w> --role <r> --handle <id>`), then `seal` —
53
55
  seal fails until every declared role has a distinct handle, which makes a
54
56
  serial launch-then-wait pattern impossible to record. Record each completion
@@ -61,6 +61,10 @@ 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.
64
68
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
65
69
  `--parallel`, `--full`, and `--cross-model` activate only as exact standalone
66
70
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -47,8 +47,10 @@ If the candidate diff has no matching surfaces, record
47
47
  (`auto=[agents]` in the output). The command prints `unselected=[...]`; an
48
48
  omitted applicable trigger is a gap, not a shortcut.
49
49
  3. Enforce the launch barrier through the engine, not prose. Open the wave
50
- (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`),
51
- launch every native agent nonblocking, record each returned host handle
50
+ (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`;
51
+ a reviewer, auditor, or test-analyst wave adds `--packet <file>`, the exact packet
52
+ those agents receive, and `open` refuses one that seeds a gate result, outcome,
53
+ count, or "already passed" claim), launch every native agent nonblocking, record each returned host handle
52
54
  (`dispatch ... start --wave <w> --role <r> --handle <id>`), then `seal` —
53
55
  seal fails until every declared role has a distinct handle, which makes a
54
56
  serial launch-then-wait pattern impossible to record. Record each completion
@@ -62,6 +62,10 @@ 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.
65
69
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
66
70
  `--parallel`, `--full`, and `--cross-model` activate only as exact standalone
67
71
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
@@ -47,8 +47,10 @@ If the candidate diff has no matching surfaces, record
47
47
  (`auto=[agents]` in the output). The command prints `unselected=[...]`; an
48
48
  omitted applicable trigger is a gap, not a shortcut.
49
49
  3. Enforce the launch barrier through the engine, not prose. Open the wave
50
- (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`),
51
- launch every native agent nonblocking, record each returned host handle
50
+ (`devrites-engine dispatch <slug> open --phase <p> --wave <w> --role <r>...`;
51
+ a reviewer, auditor, or test-analyst wave adds `--packet <file>`, the exact packet
52
+ those agents receive, and `open` refuses one that seeds a gate result, outcome,
53
+ count, or "already passed" claim), launch every native agent nonblocking, record each returned host handle
52
54
  (`dispatch ... start --wave <w> --role <r> --handle <id>`), then `seal` —
53
55
  seal fails until every declared role has a distinct handle, which makes a
54
56
  serial launch-then-wait pattern impossible to record. Record each completion
@@ -62,6 +62,10 @@ 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.
65
69
  - Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
66
70
  `--parallel`, `--full`, and `--cross-model` activate only as exact standalone
67
71
  tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devrites",
3
- "version": "6.6.0",
3
+ "version": "6.7.0",
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",