devrites 6.4.1 → 6.4.3

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,18 @@
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.4.3](https://github.com/ViktorsBaikers/DevRites/compare/v6.4.2...v6.4.3) (2026-10-16)
6
+
7
+ ### Fixed
8
+
9
+ * **devrites:** wrights use mktemp scratch and the edit tool ([#117](https://github.com/ViktorsBaikers/DevRites/issues/117)) ([0b274e8](https://github.com/ViktorsBaikers/DevRites/commit/0b274e8375445c61421390c5e69105695a8f9fad))
10
+
11
+ ## [6.4.2](https://github.com/ViktorsBaikers/DevRites/compare/v6.4.1...v6.4.2) (2026-10-16)
12
+
13
+ ### Changed
14
+
15
+ * **devrites:** slim slice bundles; keep verdicts out of contracts ([#116](https://github.com/ViktorsBaikers/DevRites/issues/116)) ([d4cffbe](https://github.com/ViktorsBaikers/DevRites/commit/d4cffbe8a7980ec937ce0f8040bf9df10ae90065))
16
+
5
17
  ## [6.4.1](https://github.com/ViktorsBaikers/DevRites/compare/v6.4.0...v6.4.1) (2026-10-16)
6
18
 
7
19
  ### Fixed
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.4.1`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v6.4.1): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
34
+ **Status:** [`v6.4.3`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v6.4.3): 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
 
@@ -33,7 +33,7 @@ workflow strategy.
33
33
  | `next [slug]` | Print the minimal remaining lifecycle path plus advisory skips. |
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
- | `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 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`. |
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
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. |
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). |
@@ -46,8 +46,9 @@ Emits one deduplicated context bundle for a phase or standalone skill
46
46
  reads a single file. With --skill, slug may be omitted; then --out is
47
47
  required and no workspace section is included. --slice scopes the
48
48
  workspace section to one slice: tasks.md contributes that slice's block,
49
- and an artifact over its line/byte budget becomes a by-reference index
50
- (path, SHA-256, headings, and line hits for every ID the block cites).
49
+ and an artifact over its line/byte budget or over 16 KiB (spec.md excepted)
50
+ becomes a by-reference index (path, SHA-256, headings, and line hits for
51
+ every ID the block cites).
51
52
  Repeat --slice for a recheck that spans several slices.
52
53
  `
53
54
 
@@ -348,9 +349,16 @@ func expandIncludes(abs string, data []byte) []byte {
348
349
  })
349
350
  }
350
351
 
352
+ // sliceInlineMaxBytes caps a workspace artifact inlined whole into a --slice
353
+ // bundle. Planning budgets size a whole feature, not one slice's read; a
354
+ // larger artifact goes by reference so the slice's agent reads only the
355
+ // sections its block cites. spec.md, the acceptance source, stays whole.
356
+ const sliceInlineMaxBytes = 16 << 10
357
+
351
358
  // writeSliceEntry writes one workspace artifact of a --slice or root bundle:
352
- // with a slice, tasks.md as the slice block plus a by-reference index; any
353
- // canonical artifact over its line/byte budget as a by-reference index;
359
+ // with a slice, tasks.md as the slice block plus a by-reference index and any
360
+ // other artifact but spec.md over sliceInlineMaxBytes as a by-reference index;
361
+ // any canonical artifact over its line/byte budget as a by-reference index;
354
362
  // everything else whole.
355
363
  func writeSliceEntry(bundle *strings.Builder, project, abs, label, slice, block string, ids []citedID, seen map[string]bool) (loaded, byRef bool) {
356
364
  if seen[abs] {
@@ -361,6 +369,8 @@ func writeSliceEntry(bundle *strings.Builder, project, abs, label, slice, block
361
369
  if err == nil && name == "tasks.md" && slice != "" {
362
370
  seen[abs] = true
363
371
  fmt.Fprintf(bundle, "===== %s (%s block) =====\n%s\n", label, slice, block)
372
+ } else if err == nil && slice != "" && name != "spec.md" && len(data) > sliceInlineMaxBytes {
373
+ seen[abs] = true
364
374
  } else if status, ok := state.ArtifactBudget(name, data); err != nil || !ok || !status.Over {
365
375
  return writeContextEntry(bundle, abs, label, seen, false), false
366
376
  } else {
@@ -119,6 +119,10 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
119
119
  loosening an assertion. A test that genuinely must change is an **Escalation**,
120
120
  not a quiet edit. The root inspects the returned diff and dedicated test
121
121
  analysis treats a weakened test as a Critical STOP.
122
+ **Scratch** for probes and copies is one fresh `mktemp -d` directory you own,
123
+ never a fixed name such as `/tmp/x`: writing a path you did not create is an
124
+ unproven overwrite and stops the run for the owner. Edit allowlisted files with
125
+ the edit tool; a blocked edit is a gap to report, never routed around.
122
126
  For non-trivial failure, invoke `devrites-debug-recovery` with the exact error,
123
127
  hypotheses, and dead ends. Caller and recovery share three no-progress attempts per
124
128
  exact causal fingerprint. Count only corrections whose recheck preserves the same
@@ -95,7 +95,9 @@ live foreign session releases the retained claim and stops the dispatch, per
95
95
  [`agents.md`](../../devrites-lib/reference/standards/agents.md). `.devrites/**`
96
96
  is never a task path; see [Workflow Artifact admission](../../devrites-lib/reference/standards/workflow-artifacts.md).
97
97
  Write the exact contract, with its `Writer-safe checks:` line, to
98
- `packets/<wave>.contract.md` and hand the wright that text verbatim. Ask the host
98
+ `packets/<wave>.contract.md` and hand the wright that text verbatim. Reviewers read
99
+ that file, so it states each defect to fix with its anchor, never a reviewer's verdict,
100
+ count, or pass status ("code review is no-findings" voids the next review). Ask the host
99
101
  for the exact writer in fresh context; a repair round on the same slice whose
100
102
  returned wright the host can still continue goes to that wright on its existing
101
103
  handle instead, so it does not re-read the slice from scratch. Wait, and track it
@@ -119,6 +119,10 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
119
119
  loosening an assertion. A test that genuinely must change is an **Escalation**,
120
120
  not a quiet edit. The root inspects the returned diff and dedicated test
121
121
  analysis treats a weakened test as a Critical STOP.
122
+ **Scratch** for probes and copies is one fresh `mktemp -d` directory you own,
123
+ never a fixed name such as `/tmp/x`: writing a path you did not create is an
124
+ unproven overwrite and stops the run for the owner. Edit allowlisted files with
125
+ the edit tool; a blocked edit is a gap to report, never routed around.
122
126
  For non-trivial failure, invoke `devrites-debug-recovery` with the exact error,
123
127
  hypotheses, and dead ends. Caller and recovery share three no-progress attempts per
124
128
  exact causal fingerprint. Count only corrections whose recheck preserves the same
@@ -95,7 +95,9 @@ live foreign session releases the retained claim and stops the dispatch, per
95
95
  [`agents.md`](../../devrites-lib/reference/standards/agents.md). `.devrites/**`
96
96
  is never a task path; see [Workflow Artifact admission](../../devrites-lib/reference/standards/workflow-artifacts.md).
97
97
  Write the exact contract, with its `Writer-safe checks:` line, to
98
- `packets/<wave>.contract.md` and hand the wright that text verbatim. Ask the host
98
+ `packets/<wave>.contract.md` and hand the wright that text verbatim. Reviewers read
99
+ that file, so it states each defect to fix with its anchor, never a reviewer's verdict,
100
+ count, or pass status ("code review is no-findings" voids the next review). Ask the host
99
101
  for the exact writer in fresh context; a repair round on the same slice whose
100
102
  returned wright the host can still continue goes to that wright on its existing
101
103
  handle instead, so it does not re-read the slice from scratch. Wait, and track it
@@ -117,6 +117,10 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
117
117
  loosening an assertion. A test that genuinely must change is an **Escalation**,
118
118
  not a quiet edit. The root inspects the returned diff and dedicated test
119
119
  analysis treats a weakened test as a Critical STOP.
120
+ **Scratch** for probes and copies is one fresh `mktemp -d` directory you own,
121
+ never a fixed name such as `/tmp/x`: writing a path you did not create is an
122
+ unproven overwrite and stops the run for the owner. Edit allowlisted files with
123
+ the edit tool; a blocked edit is a gap to report, never routed around.
120
124
  For non-trivial failure, invoke `devrites-debug-recovery` with the exact error,
121
125
  hypotheses, and dead ends. Caller and recovery share three no-progress attempts per
122
126
  exact causal fingerprint. Count only corrections whose recheck preserves the same
@@ -95,7 +95,9 @@ live foreign session releases the retained claim and stops the dispatch, per
95
95
  [`agents.md`](../../devrites-lib/reference/standards/agents.md). `.devrites/**`
96
96
  is never a task path; see [Workflow Artifact admission](../../devrites-lib/reference/standards/workflow-artifacts.md).
97
97
  Write the exact contract, with its `Writer-safe checks:` line, to
98
- `packets/<wave>.contract.md` and hand the wright that text verbatim. Ask the host
98
+ `packets/<wave>.contract.md` and hand the wright that text verbatim. Reviewers read
99
+ that file, so it states each defect to fix with its anchor, never a reviewer's verdict,
100
+ count, or pass status ("code review is no-findings" voids the next review). Ask the host
99
101
  for the exact writer in fresh context; a repair round on the same slice whose
100
102
  returned wright the host can still continue goes to that wright on its existing
101
103
  handle instead, so it does not re-read the slice from scratch. Wait, and track it
@@ -124,6 +124,10 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
124
124
  loosening an assertion. A test that genuinely must change is an **Escalation**,
125
125
  not a quiet edit. The root inspects the returned diff and dedicated test
126
126
  analysis treats a weakened test as a Critical STOP.
127
+ **Scratch** for probes and copies is one fresh `mktemp -d` directory you own,
128
+ never a fixed name such as `/tmp/x`: writing a path you did not create is an
129
+ unproven overwrite and stops the run for the owner. Edit allowlisted files with
130
+ the edit tool; a blocked edit is a gap to report, never routed around.
127
131
  For non-trivial failure, invoke `devrites-debug-recovery` with the exact error,
128
132
  hypotheses, and dead ends. Caller and recovery share three no-progress attempts per
129
133
  exact causal fingerprint. Count only corrections whose recheck preserves the same
@@ -95,7 +95,9 @@ live foreign session releases the retained claim and stops the dispatch, per
95
95
  [`agents.md`](../../devrites-lib/reference/standards/agents.md). `.devrites/**`
96
96
  is never a task path; see [Workflow Artifact admission](../../devrites-lib/reference/standards/workflow-artifacts.md).
97
97
  Write the exact contract, with its `Writer-safe checks:` line, to
98
- `packets/<wave>.contract.md` and hand the wright that text verbatim. Ask the host
98
+ `packets/<wave>.contract.md` and hand the wright that text verbatim. Reviewers read
99
+ that file, so it states each defect to fix with its anchor, never a reviewer's verdict,
100
+ count, or pass status ("code review is no-findings" voids the next review). Ask the host
99
101
  for the exact writer in fresh context; a repair round on the same slice whose
100
102
  returned wright the host can still continue goes to that wright on its existing
101
103
  handle instead, so it does not re-read the slice from scratch. Wait, and track it
@@ -117,6 +117,10 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
117
117
  loosening an assertion. A test that genuinely must change is an **Escalation**,
118
118
  not a quiet edit. The root inspects the returned diff and dedicated test
119
119
  analysis treats a weakened test as a Critical STOP.
120
+ **Scratch** for probes and copies is one fresh `mktemp -d` directory you own,
121
+ never a fixed name such as `/tmp/x`: writing a path you did not create is an
122
+ unproven overwrite and stops the run for the owner. Edit allowlisted files with
123
+ the edit tool; a blocked edit is a gap to report, never routed around.
120
124
  For non-trivial failure, invoke `devrites-debug-recovery` with the exact error,
121
125
  hypotheses, and dead ends. Caller and recovery share three no-progress attempts per
122
126
  exact causal fingerprint. Count only corrections whose recheck preserves the same
@@ -95,7 +95,9 @@ live foreign session releases the retained claim and stops the dispatch, per
95
95
  [`agents.md`](skill://devrites-lib/reference/standards/agents.md). `.devrites/**`
96
96
  is never a task path; see [Workflow Artifact admission](skill://devrites-lib/reference/standards/workflow-artifacts.md).
97
97
  Write the exact contract, with its `Writer-safe checks:` line, to
98
- `packets/<wave>.contract.md` and hand the wright that text verbatim. Ask the host
98
+ `packets/<wave>.contract.md` and hand the wright that text verbatim. Reviewers read
99
+ that file, so it states each defect to fix with its anchor, never a reviewer's verdict,
100
+ count, or pass status ("code review is no-findings" voids the next review). Ask the host
99
101
  for the exact writer in fresh context; a repair round on the same slice whose
100
102
  returned wright the host can still continue goes to that wright on its existing
101
103
  handle instead, so it does not re-read the slice from scratch. Wait, and track it
@@ -118,6 +118,10 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
118
118
  loosening an assertion. A test that genuinely must change is an **Escalation**,
119
119
  not a quiet edit. The root inspects the returned diff and dedicated test
120
120
  analysis treats a weakened test as a Critical STOP.
121
+ **Scratch** for probes and copies is one fresh `mktemp -d` directory you own,
122
+ never a fixed name such as `/tmp/x`: writing a path you did not create is an
123
+ unproven overwrite and stops the run for the owner. Edit allowlisted files with
124
+ the edit tool; a blocked edit is a gap to report, never routed around.
121
125
  For non-trivial failure, invoke `devrites-debug-recovery` with the exact error,
122
126
  hypotheses, and dead ends. Caller and recovery share three no-progress attempts per
123
127
  exact causal fingerprint. Count only corrections whose recheck preserves the same
@@ -95,7 +95,9 @@ live foreign session releases the retained claim and stops the dispatch, per
95
95
  [`agents.md`](../../devrites-lib/reference/standards/agents.md). `.devrites/**`
96
96
  is never a task path; see [Workflow Artifact admission](../../devrites-lib/reference/standards/workflow-artifacts.md).
97
97
  Write the exact contract, with its `Writer-safe checks:` line, to
98
- `packets/<wave>.contract.md` and hand the wright that text verbatim. Ask the host
98
+ `packets/<wave>.contract.md` and hand the wright that text verbatim. Reviewers read
99
+ that file, so it states each defect to fix with its anchor, never a reviewer's verdict,
100
+ count, or pass status ("code review is no-findings" voids the next review). Ask the host
99
101
  for the exact writer in fresh context; a repair round on the same slice whose
100
102
  returned wright the host can still continue goes to that wright on its existing
101
103
  handle instead, so it does not re-read the slice from scratch. Wait, and track it
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "devrites",
3
- "version": "6.4.1",
3
+ "version": "6.4.3",
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",