devrites 6.5.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 +16 -0
- package/README.md +1 -1
- package/docs/engine/commands.md +1 -1
- package/engine/help.go +1 -1
- package/engine/internal/lib/dispatch.go +15 -5
- package/engine/internal/lib/dispatch_packet.go +51 -0
- package/pack/.claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -2
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +4 -0
- package/pack/.claude/skills/rite-plan/SKILL.md +4 -0
- package/pack/generated/claude/skills/devrites-lib/reference/parallel-dispatch.md +4 -2
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +4 -0
- package/pack/generated/claude/skills/rite-plan/SKILL.md +4 -0
- package/pack/generated/codex/skills/devrites-lib/reference/parallel-dispatch.md +4 -2
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +4 -0
- package/pack/generated/codex/skills/rite-plan/SKILL.md +4 -0
- package/pack/generated/devin/skills/devrites-lib/reference/parallel-dispatch.md +4 -2
- package/pack/generated/devin/skills/rite-autocomplete/SKILL.md +4 -0
- package/pack/generated/devin/skills/rite-plan/SKILL.md +4 -0
- package/pack/generated/omp/skills/devrites-lib/reference/parallel-dispatch.md +4 -2
- package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +4 -0
- package/pack/generated/omp/skills/rite-plan/SKILL.md +4 -0
- package/pack/generated/pi/skills/devrites-lib/reference/parallel-dispatch.md +4 -2
- package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +4 -0
- package/pack/generated/pi/skills/rite-plan/SKILL.md +4 -0
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,22 @@
|
|
|
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
|
+
|
|
15
|
+
## [6.6.0](https://github.com/ViktorsBaikers/DevRites/compare/v6.5.0...v6.6.0) (2026-10-17)
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
* **devrites:** swap the mechanism before pinning a pressured seam again ([#122](https://github.com/ViktorsBaikers/DevRites/issues/122)) ([92de92e](https://github.com/ViktorsBaikers/DevRites/commit/92de92e7e77d9d134f9fec46d5367a457f84fa67))
|
|
20
|
+
|
|
5
21
|
## [6.5.0](https://github.com/ViktorsBaikers/DevRites/compare/v6.4.5...v6.5.0) (2026-10-17)
|
|
6
22
|
|
|
7
23
|
### 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.
|
|
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
|
|
package/docs/engine/commands.md
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
@@ -115,6 +115,10 @@ Before classifying any Reslice, read `.claude/skills/devrites-lib/reference/stan
|
|
|
115
115
|
else 1) so the threshold is counted rather than judged; a packet that reports the same
|
|
116
116
|
seam without the counter is malformed. At the third
|
|
117
117
|
same-seam packet, mark it `convergence_pressure: true` with the seam named.
|
|
118
|
+
Under pressure the drafter first asks whether a different mechanism removes the
|
|
119
|
+
recurring failure class (read content-addressed Git objects instead of walking a live
|
|
120
|
+
directory; a bounded parser instead of hand checks) and proposes that swap before
|
|
121
|
+
another pin; acceptance stays unchanged. Accreting checks on one seam is the loop.
|
|
118
122
|
Under pressure the drafter may close a finding marked as a refinement of an
|
|
119
123
|
already-pinned clause by folding an explicit, bounded declared
|
|
120
124
|
residual/limitation into the contract text instead of another precision
|
|
@@ -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
|
-
|
|
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.
|
|
@@ -117,6 +117,10 @@ Before classifying any Reslice, read `.claude/skills/devrites-lib/reference/stan
|
|
|
117
117
|
else 1) so the threshold is counted rather than judged; a packet that reports the same
|
|
118
118
|
seam without the counter is malformed. At the third
|
|
119
119
|
same-seam packet, mark it `convergence_pressure: true` with the seam named.
|
|
120
|
+
Under pressure the drafter first asks whether a different mechanism removes the
|
|
121
|
+
recurring failure class (read content-addressed Git objects instead of walking a live
|
|
122
|
+
directory; a bounded parser instead of hand checks) and proposes that swap before
|
|
123
|
+
another pin; acceptance stays unchanged. Accreting checks on one seam is the loop.
|
|
120
124
|
Under pressure the drafter may close a finding marked as a refinement of an
|
|
121
125
|
already-pinned clause by folding an explicit, bounded declared
|
|
122
126
|
residual/limitation into the contract text instead of another precision
|
|
@@ -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
|
-
|
|
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.
|
|
@@ -117,6 +117,10 @@ Before classifying any Reslice, read `.agents/skills/devrites-lib/reference/stan
|
|
|
117
117
|
else 1) so the threshold is counted rather than judged; a packet that reports the same
|
|
118
118
|
seam without the counter is malformed. At the third
|
|
119
119
|
same-seam packet, mark it `convergence_pressure: true` with the seam named.
|
|
120
|
+
Under pressure the drafter first asks whether a different mechanism removes the
|
|
121
|
+
recurring failure class (read content-addressed Git objects instead of walking a live
|
|
122
|
+
directory; a bounded parser instead of hand checks) and proposes that swap before
|
|
123
|
+
another pin; acceptance stays unchanged. Accreting checks on one seam is the loop.
|
|
120
124
|
Under pressure the drafter may close a finding marked as a refinement of an
|
|
121
125
|
already-pinned clause by folding an explicit, bounded declared
|
|
122
126
|
residual/limitation into the contract text instead of another precision
|
|
@@ -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
|
-
|
|
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.
|
|
@@ -116,6 +116,10 @@ Before classifying any Reslice, read `.devin/skills/devrites-lib/reference/stand
|
|
|
116
116
|
else 1) so the threshold is counted rather than judged; a packet that reports the same
|
|
117
117
|
seam without the counter is malformed. At the third
|
|
118
118
|
same-seam packet, mark it `convergence_pressure: true` with the seam named.
|
|
119
|
+
Under pressure the drafter first asks whether a different mechanism removes the
|
|
120
|
+
recurring failure class (read content-addressed Git objects instead of walking a live
|
|
121
|
+
directory; a bounded parser instead of hand checks) and proposes that swap before
|
|
122
|
+
another pin; acceptance stays unchanged. Accreting checks on one seam is the loop.
|
|
119
123
|
Under pressure the drafter may close a finding marked as a refinement of an
|
|
120
124
|
already-pinned clause by folding an explicit, bounded declared
|
|
121
125
|
residual/limitation into the contract text instead of another precision
|
|
@@ -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
|
-
|
|
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.
|
|
@@ -117,6 +117,10 @@ Before classifying any Reslice, read `.omp/skills/devrites-lib/reference/standar
|
|
|
117
117
|
else 1) so the threshold is counted rather than judged; a packet that reports the same
|
|
118
118
|
seam without the counter is malformed. At the third
|
|
119
119
|
same-seam packet, mark it `convergence_pressure: true` with the seam named.
|
|
120
|
+
Under pressure the drafter first asks whether a different mechanism removes the
|
|
121
|
+
recurring failure class (read content-addressed Git objects instead of walking a live
|
|
122
|
+
directory; a bounded parser instead of hand checks) and proposes that swap before
|
|
123
|
+
another pin; acceptance stays unchanged. Accreting checks on one seam is the loop.
|
|
120
124
|
Under pressure the drafter may close a finding marked as a refinement of an
|
|
121
125
|
already-pinned clause by folding an explicit, bounded declared
|
|
122
126
|
residual/limitation into the contract text instead of another precision
|
|
@@ -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
|
-
|
|
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.
|
|
@@ -117,6 +117,10 @@ Before classifying any Reslice, read `.pi/skills/devrites-lib/reference/standard
|
|
|
117
117
|
else 1) so the threshold is counted rather than judged; a packet that reports the same
|
|
118
118
|
seam without the counter is malformed. At the third
|
|
119
119
|
same-seam packet, mark it `convergence_pressure: true` with the seam named.
|
|
120
|
+
Under pressure the drafter first asks whether a different mechanism removes the
|
|
121
|
+
recurring failure class (read content-addressed Git objects instead of walking a live
|
|
122
|
+
directory; a bounded parser instead of hand checks) and proposes that swap before
|
|
123
|
+
another pin; acceptance stays unchanged. Accreting checks on one seam is the loop.
|
|
120
124
|
Under pressure the drafter may close a finding marked as a refinement of an
|
|
121
125
|
already-pinned clause by folding an explicit, bounded declared
|
|
122
126
|
residual/limitation into the contract text instead of another precision
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devrites",
|
|
3
|
-
"version": "6.
|
|
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",
|