devrites 3.2.5 → 3.2.6
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 +6 -0
- package/README.md +1 -1
- package/docs/cli.md +0 -1
- package/docs/command-map.md +1 -1
- package/docs/orchestration.md +1 -2
- package/engine/commands.go +1 -1
- package/engine/internal/lib/reconcile.go +1 -1
- package/engine/internal/lib/reconcile_test.go +4 -12
- package/engine/internal/lib/util.go +2 -2
- package/engine/main.go +0 -3
- package/engine/root_routing_test.go +0 -1
- package/pack/.claude/skills/rite-build/reference/forge.md +2 -2
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +11 -20
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +2 -5
- package/pack/.claude/skills/rite-prove/reference/acceptance-proof.md +0 -1
- package/pack/.claude/skills/rite-seal/reference/final-evidence.md +0 -1
- package/pack/generated/claude/skills/rite-build/reference/forge.md +2 -2
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +11 -20
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +2 -5
- package/pack/generated/claude/skills/rite-prove/reference/acceptance-proof.md +0 -1
- package/pack/generated/claude/skills/rite-seal/reference/final-evidence.md +0 -1
- package/pack/generated/codex/skills/rite-build/reference/forge.md +2 -2
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +11 -20
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +2 -5
- package/pack/generated/codex/skills/rite-prove/reference/acceptance-proof.md +0 -1
- package/pack/generated/codex/skills/rite-seal/reference/final-evidence.md +0 -1
- package/package.json +1 -1
- package/scripts/build-release-tarball.sh +1 -0
- package/scripts/validate.sh +0 -1
- package/engine/internal/lib/packageexistence.go +0 -968
- package/engine/internal/lib/packageexistence_test.go +0 -506
- package/engine/testdata/golden/TestParityPackageExistence/declared.golden +0 -2
- package/engine/testdata/golden/TestParityPackageExistence/default-import-subpath.golden +0 -2
- package/engine/tests/parity_packageexistence_test.go +0 -64
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
|
+
## [3.2.6](https://github.com/ViktorsBaikers/DevRites/compare/v3.2.5...v3.2.6) (2026-07-25)
|
|
6
|
+
|
|
7
|
+
### Changed
|
|
8
|
+
|
|
9
|
+
* **devrites:** remove package-existence gate ([4cbcbe9](https://github.com/ViktorsBaikers/DevRites/commit/4cbcbe9002eaf97f8f921e13e97b4dcfc6b61b34))
|
|
10
|
+
|
|
5
11
|
## [3.2.5](https://github.com/ViktorsBaikers/DevRites/compare/v3.2.4...v3.2.5) (2026-07-25)
|
|
6
12
|
|
|
7
13
|
### Fixed
|
package/README.md
CHANGED
|
@@ -25,7 +25,7 @@ final commit, push, and tag, and it requires a typed `GO` confirmation.
|
|
|
25
25
|
Unattended runs may create local WIP checkpoint commits along the way, but only
|
|
26
26
|
Ship collapses and pushes them.
|
|
27
27
|
|
|
28
|
-
**Status:** [`v3.2.
|
|
28
|
+
**Status:** [`v3.2.6`](https://github.com/ViktorsBaikers/DevRites/releases/tag/v3.2.6): see [`CHANGELOG.md`](CHANGELOG.md) for release notes.
|
|
29
29
|
|
|
30
30
|
## Quick start
|
|
31
31
|
|
package/docs/cli.md
CHANGED
|
@@ -21,7 +21,6 @@ devrites-engine recovery route <class> # typed owner/action; JSON re
|
|
|
21
21
|
devrites-engine recovery check|record|clear ... # durable three-failure budget; record/clear accept --class
|
|
22
22
|
devrites-engine reconcile snapshot|check|close [slug] # retained writer baseline
|
|
23
23
|
devrites-engine test-integrity [slug] # reject weakened tests against that baseline
|
|
24
|
-
devrites-engine package-existence [slug] # verify new imports are declared
|
|
25
24
|
devrites-engine evidence-fresh [slug] # proof freshness gate (exit 0 fresh · 3 stale)
|
|
26
25
|
devrites-engine check-acceptance <dir> # acceptance gate (exit 0 proven · 1 gap)
|
|
27
26
|
devrites-engine ledger sync <dir> # fold a feature's spec deltas into the living capability ledger
|
package/docs/command-map.md
CHANGED
|
@@ -41,7 +41,7 @@ these lanes so its owner is clear:
|
|
|
41
41
|
|
|
42
42
|
| Lane | Commands | Owner |
|
|
43
43
|
|---|---|---|
|
|
44
|
-
| Workflow gates | `preamble`, `build-readiness`, `readiness-digest`, `spec-skeleton`, `spec-validate`, `check-acceptance`, `evidence-fresh`, `coverage`, `doubt-coverage`, `budget`, `test-integrity`, `mutation-gate`, `
|
|
44
|
+
| Workflow gates | `preamble`, `build-readiness`, `readiness-digest`, `spec-skeleton`, `spec-validate`, `check-acceptance`, `evidence-fresh`, `coverage`, `doubt-coverage`, `budget`, `test-integrity`, `mutation-gate`, `review-integrity`, `footprint`, `reconcile`, `conventions`, `learnings`, `review-fingerprints`, `timeline`, `health`, `progress` | Called by the relevant `rite-*` workflow or shared reply contract. |
|
|
45
45
|
| Workspace utilities | `status`, `snapshot`, `analyze`, `archive-search`, `clarify-return`, `recovery`, `resolve`, `close-out`, `stuck`, `tick-afk`, `ledger`, `profile` | Called by a specific utility/phase when its condition is met. |
|
|
46
46
|
| Low-level completeness API | `readiness`, `seal` | Available for scripts/CI and documented engine use. Feature rites use stricter phase-specific gates (`build-readiness`, `/rite-seal` phase contract) instead of auto-running these weaker aggregate checks. |
|
|
47
47
|
| Install / operator / CI | `install`, `update`, `uninstall`, `doctor`, `migrate`, `validate-pack`, `harness-matrix`, `extensions`, `overrides`, `reviewers`, `hook`, `version` | Called by `npx devrites ...`, `/rite-doctor`, hooks, CI, or a human operator; do not auto-run during feature work just because the command exists. |
|
package/docs/orchestration.md
CHANGED
|
@@ -65,8 +65,7 @@ Each dispatch follows the retained-baseline sequence:
|
|
|
65
65
|
2. The sole wright returns code/tests; the root validates its typed identity and
|
|
66
66
|
exact changed-file set.
|
|
67
67
|
3. `reconcile check` rejects anything outside the root allowlist.
|
|
68
|
-
4. `test-integrity`
|
|
69
|
-
baseline.
|
|
68
|
+
4. `test-integrity` runs against the retained baseline.
|
|
70
69
|
5. After proof and decision checks pass, `reconcile close` retires the private
|
|
71
70
|
window; only then does the root write canonical records.
|
|
72
71
|
|
package/engine/commands.go
CHANGED
|
@@ -34,7 +34,7 @@ func rootModeFor(command string, args []string) rootMode {
|
|
|
34
34
|
case "first-task", "spec-dedupe", "evidence-fresh", "coverage",
|
|
35
35
|
"doubt-coverage", "budget", "preamble", "progress",
|
|
36
36
|
"build-readiness", "readiness-digest", "analyze", "mutation-gate",
|
|
37
|
-
"test-integrity", "review-integrity",
|
|
37
|
+
"test-integrity", "review-integrity",
|
|
38
38
|
"archive-search", "config", "reviewers", "outside-voice", "docs-stale",
|
|
39
39
|
"secret-scan", "lanes", "overrides":
|
|
40
40
|
return rootLenient
|
|
@@ -34,7 +34,7 @@ const (
|
|
|
34
34
|
// clean check, another snapshot re-arms only the dispatch state for a retry while
|
|
35
35
|
// retaining the original source baseline.
|
|
36
36
|
// `check` compares the captured state with the current state and retains the
|
|
37
|
-
// immutable baseline for the later test-integrity
|
|
37
|
+
// immutable baseline for the later test-integrity gate.
|
|
38
38
|
// `close` explicitly ends the window and removes its private artifacts.
|
|
39
39
|
//
|
|
40
40
|
// 0 clean check, snapshot/close completed, or skipped (not a git repo)
|
|
@@ -408,15 +408,13 @@ func TestReconcileCheckFailsClosedWhenObjectDatabaseIsCorrupt(t *testing.T) {
|
|
|
408
408
|
}
|
|
409
409
|
}
|
|
410
410
|
|
|
411
|
-
func
|
|
411
|
+
func TestPostSliceTestIntegrityUsesBaselineUntilClose(t *testing.T) {
|
|
412
412
|
gitRoot := newGitRepo(t)
|
|
413
413
|
root := workspace(t, "feat")
|
|
414
|
-
writeFile(t, filepath.Join(gitRoot, "
|
|
415
|
-
commitAll(t, gitRoot, "
|
|
414
|
+
writeFile(t, filepath.Join(gitRoot, "README.md"), "fixture\n")
|
|
415
|
+
commitAll(t, gitRoot, "baseline")
|
|
416
416
|
|
|
417
|
-
//
|
|
418
|
-
// must not be blamed on the wright by package-existence.
|
|
419
|
-
writeFile(t, filepath.Join(gitRoot, "src/user-delta.ts"), `import ghost from "preexisting-user-package";`+"\n")
|
|
417
|
+
// This user delta predates the slice and must not be blamed on the wright.
|
|
420
418
|
writeFile(t, filepath.Join(gitRoot, "tests/user_delta_test.go"), "package tests\n\nfunc TestUserDelta(t *testing.T) { t.Fatal(\"baseline\") }\n")
|
|
421
419
|
writeWrightAllowlist(t, root, "feat", "seed.go")
|
|
422
420
|
|
|
@@ -432,12 +430,6 @@ func TestPostSliceGatesShareBaselineUntilClose(t *testing.T) {
|
|
|
432
430
|
if code := TestIntegrity(root, []string{"feat"}, &stdout, &stderr); code != 0 {
|
|
433
431
|
t.Fatalf("test-integrity = %d, want 0\nstdout: %s\nstderr: %s", code, stdout.String(), stderr.String())
|
|
434
432
|
}
|
|
435
|
-
stdout.Reset()
|
|
436
|
-
stderr.Reset()
|
|
437
|
-
if code := PackageExistence(root, []string{"feat"}, &stdout, &stderr); code != 0 {
|
|
438
|
-
t.Fatalf("package-existence = %d, want 0\nstdout: %s\nstderr: %s", code, stdout.String(), stderr.String())
|
|
439
|
-
}
|
|
440
|
-
|
|
441
433
|
if code, out := runReconcile(t, root, "close", "feat"); code != 0 {
|
|
442
434
|
t.Fatalf("close = %d, want 0\n%s", code, out)
|
|
443
435
|
}
|
|
@@ -7,8 +7,8 @@ import (
|
|
|
7
7
|
)
|
|
8
8
|
|
|
9
9
|
// gitToplevel returns the absolute path of the git working tree containing dir,
|
|
10
|
-
// or "" when dir is not inside a repository. The git-backed gates
|
|
11
|
-
//
|
|
10
|
+
// or "" when dir is not inside a repository. The git-backed gates
|
|
11
|
+
// (test-integrity and reconcile) skip rather than block when it is empty.
|
|
12
12
|
func gitToplevel(dir string) string {
|
|
13
13
|
out, err := exec.Command("git", "-C", dir, "rev-parse", "--show-toplevel").Output()
|
|
14
14
|
if err != nil {
|
package/engine/main.go
CHANGED
|
@@ -56,7 +56,6 @@ Usage:
|
|
|
56
56
|
devrites-engine mutation-gate [slug] Advisory: detect the mutation runner and scope it
|
|
57
57
|
devrites-engine test-integrity [slug] Gate: no test deleted, skipped, or de-asserted
|
|
58
58
|
devrites-engine review-integrity [slug] Gate: no adversarial review axis is silent (zero findings, no justification)
|
|
59
|
-
devrites-engine package-existence [slug] Gate: every new import is declared in a manifest
|
|
60
59
|
devrites-engine reconcile <sub> [slug] A1 gate: snapshot|check|close the wright's source writes
|
|
61
60
|
devrites-engine resolve <qid> "<ans>" Resolve an open question; keep state.md consistent
|
|
62
61
|
devrites-engine close-out <slug> Archive a shipped feature and clear ACTIVE
|
|
@@ -239,8 +238,6 @@ func run(args []string, stdin io.Reader, stdout, stderr io.Writer) int {
|
|
|
239
238
|
return lib.TestIntegrity(root, args[1:], stdout, stderr)
|
|
240
239
|
case "review-integrity":
|
|
241
240
|
return lib.ReviewIntegrity(root, args[1:], stdout, stderr)
|
|
242
|
-
case "package-existence":
|
|
243
|
-
return lib.PackageExistence(root, args[1:], stdout, stderr)
|
|
244
241
|
case "reconcile":
|
|
245
242
|
return lib.Reconcile(root, args[1:], stdout, stderr)
|
|
246
243
|
case "resolve":
|
|
@@ -45,7 +45,6 @@ func TestRootModeForCoversReadAndWriteSurfaces(t *testing.T) {
|
|
|
45
45
|
{name: "mutation gate", command: "mutation-gate", want: rootLenient},
|
|
46
46
|
{name: "test integrity", command: "test-integrity", want: rootLenient},
|
|
47
47
|
{name: "review integrity", command: "review-integrity", want: rootLenient},
|
|
48
|
-
{name: "package existence", command: "package-existence", want: rootLenient},
|
|
49
48
|
{name: "reconcile snapshot", command: "reconcile", args: []string{"snapshot"}, want: rootStrict},
|
|
50
49
|
{name: "reconcile check", command: "reconcile", args: []string{"check"}, want: rootStrict},
|
|
51
50
|
{name: "reconcile close", command: "reconcile", args: []string{"close"}, want: rootStrict},
|
|
@@ -166,8 +166,8 @@ decision.
|
|
|
166
166
|
|
|
167
167
|
Hand the winner's structured artifact to the normal cycle. Run immediate
|
|
168
168
|
reconciliation, doubt every stood decision, and complete test-integrity,
|
|
169
|
-
|
|
170
|
-
|
|
169
|
+
targeted, browser, and other slice proof. Only after every required gate is
|
|
170
|
+
green:
|
|
171
171
|
|
|
172
172
|
```bash
|
|
173
173
|
devrites-engine forge record "$RUN_ID" verification verified \
|
|
@@ -73,14 +73,13 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
|
|
|
73
73
|
(reported in its `Principles` field, or that you detect against `.devrites/principles.md`) is
|
|
74
74
|
handled here like an irreversible-risk item: block, route to a human-approved scoped
|
|
75
75
|
exception in the register or stop; never doubt-and-accept a principle violation into the slice.
|
|
76
|
-
5. **Run retained-baseline integrity
|
|
76
|
+
5. **Run the retained-baseline integrity gate, then recover any objective red.**
|
|
77
77
|
```bash
|
|
78
78
|
devrites-engine test-integrity; echo "test-integrity rc=$?"
|
|
79
|
-
devrites-engine package-existence; echo "package-existence rc=$?"
|
|
80
79
|
```
|
|
81
|
-
If the wright's `Gates` were red (targeted tests / types / lint),
|
|
82
|
-
failed, or
|
|
83
|
-
|
|
80
|
+
If the wright's `Gates` were red (targeted tests / types / lint), `test-integrity`
|
|
81
|
+
failed, or proof could not be verified: do **not** mark the slice `built`, and **do not
|
|
82
|
+
fix the code yourself**.
|
|
84
83
|
Classify each causal fingerprint through
|
|
85
84
|
[`cleanup-and-classify.md`](../../devrites-debug-recovery/reference/cleanup-and-classify.md),
|
|
86
85
|
run `devrites-engine recovery route <class>`, and follow the `recovery-route/v1`
|
|
@@ -95,9 +94,9 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
|
|
|
95
94
|
`recovery clear --class <class> "<root cause>" <slug>` only after green. Before every
|
|
96
95
|
re-dispatch, update the root-owned allowlist only for an accepted in-slice path and run
|
|
97
96
|
`reconcile snapshot`: after a clean check this refreshes canonical-state scope while
|
|
98
|
-
retaining the original source baseline. Repeat reconcile and
|
|
99
|
-
return. This owns red
|
|
100
|
-
|
|
97
|
+
retaining the original source baseline. Repeat reconcile and the integrity gate on every
|
|
98
|
+
return. This owns red gates, missing coverage, browser/runtime failures, and
|
|
99
|
+
workflow-tool defects.
|
|
101
100
|
After recovery:
|
|
102
101
|
- green → continue to record;
|
|
103
102
|
- product-contract/acceptance ambiguity or irreversible risk → open the genuine human gate
|
|
@@ -106,22 +105,14 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
|
|
|
106
105
|
- exhausted objective failure → preserve reproduction/dead ends, set `Status: blocked` and
|
|
107
106
|
`Next step: /rite-plan unblock`, then STOP without a question or `/rite-resolve`.
|
|
108
107
|
6. **Close the retained baseline, then record. You are the canonical writer.**
|
|
109
|
-
Reconciliation ran immediately on return and
|
|
108
|
+
Reconciliation ran immediately on return and `test-integrity` ran in step 5.
|
|
110
109
|
**Exit 3 → hard STOP:** a test was deleted, skipped, or de-asserted since the slice base: the
|
|
111
110
|
slice went green by weakening its tests, a Critical protocol violation. Revert the weakening and
|
|
112
111
|
re-dispatch the wright; do **not** mark the slice `built`.
|
|
113
112
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
`requirements.txt`, `pyproject.toml`, `Pipfile`, `Cargo.toml`): the classic shape of a
|
|
118
|
-
hallucinated or typo-squatted dependency. Confirm the name on the registry and declare it via the
|
|
119
|
-
package manager, or remove the import; do **not** mark the slice `built`. The gate is deterministic
|
|
120
|
-
and fail-open (not a git repo / no manifest / stdlib-only import → rc 0). If the nearest
|
|
121
|
-
manifest declares the package, treat the mismatch as a workflow-tool defect under bounded
|
|
122
|
-
recovery, not a plan repair or retry-authorization question. Once every gate and doubt
|
|
123
|
-
verdict is accepted, a forged slice records successful verification and runs
|
|
124
|
-
manifest-only cleanup per [`forge.md`](forge.md). Then close the private window:
|
|
113
|
+
Once every gate and doubt verdict is accepted, a forged slice records successful
|
|
114
|
+
verification and runs manifest-only cleanup per [`forge.md`](forge.md). Then close the
|
|
115
|
+
private window:
|
|
125
116
|
```bash
|
|
126
117
|
devrites-engine reconcile close
|
|
127
118
|
```
|
|
@@ -66,15 +66,12 @@ and exact changed-file set. Before the root writes any canonical record, run:
|
|
|
66
66
|
```bash
|
|
67
67
|
devrites-engine reconcile check; echo "reconcile rc=$?"
|
|
68
68
|
devrites-engine test-integrity; echo "test-integrity rc=$?"
|
|
69
|
-
devrites-engine package-existence; echo "package-existence rc=$?"
|
|
70
69
|
```
|
|
71
70
|
|
|
72
71
|
- Reconcile `5`: reject the result. Preserve pre-snapshot user work; restore only the
|
|
73
72
|
unauthorized slice delta; never widen scope from the writer's self-report.
|
|
74
73
|
- Test integrity `3`: a test was deleted, muted, focused, or de-asserted. Treat it as a
|
|
75
74
|
Critical protocol failure and correct it through the wright.
|
|
76
|
-
- Package existence `3`: verify the exact package/version and fix the bounded workflow
|
|
77
|
-
or dependency defect through recovery. It is not a reason to ask for retry approval.
|
|
78
75
|
- A setup/corrupt-baseline error blocks acceptance; never fall back silently to `HEAD`.
|
|
79
76
|
|
|
80
77
|
The clean reconcile check records that source has not changed since inspection. The
|
|
@@ -105,13 +102,13 @@ Before every retry:
|
|
|
105
102
|
|
|
106
103
|
That refresh requires the prior clean check, re-fingerprints root-owned state, and keeps
|
|
107
104
|
the original source baseline. Re-dispatch with the exact output, attempt count, and dead
|
|
108
|
-
ends. Then repeat reconcile and
|
|
105
|
+
ends. Then repeat reconcile and `test-integrity` from zero. Clear recovery only after
|
|
109
106
|
green with `recovery clear --class <class> "<root cause>" <slug>`. An exhausted objective
|
|
110
107
|
failure becomes a technical blocker with its reproduction, not a `rite-resolve` question.
|
|
111
108
|
|
|
112
109
|
## Close and record
|
|
113
110
|
|
|
114
|
-
When reconciliation, integrity,
|
|
111
|
+
When reconciliation, integrity, proof, and doubt gates all pass:
|
|
115
112
|
|
|
116
113
|
```bash
|
|
117
114
|
devrites-engine reconcile close
|
|
@@ -53,7 +53,6 @@ gates:
|
|
|
53
53
|
```bash
|
|
54
54
|
devrites-engine test-integrity; echo "test-integrity rc=$?" # exit 3 = a test deleted/skipped/loosened → Critical NO-GO
|
|
55
55
|
devrites-engine mutation-gate # changed-files mutation score — band the verdict; survivors are unproven behaviours
|
|
56
|
-
devrites-engine package-existence; echo "package-existence rc=$?" # exit 3 = a new import isn't declared in any manifest (hallucinated/typo-squatted dep) → Critical NO-GO
|
|
57
56
|
```
|
|
58
57
|
A test weakened since the slice base is a **Critical NO-GO**: the suite went green by lowering the
|
|
59
58
|
bar, not by the code being right. Record the mutation score in `seal.md`; under
|
|
@@ -166,8 +166,8 @@ decision.
|
|
|
166
166
|
|
|
167
167
|
Hand the winner's structured artifact to the normal cycle. Run immediate
|
|
168
168
|
reconciliation, doubt every stood decision, and complete test-integrity,
|
|
169
|
-
|
|
170
|
-
|
|
169
|
+
targeted, browser, and other slice proof. Only after every required gate is
|
|
170
|
+
green:
|
|
171
171
|
|
|
172
172
|
```bash
|
|
173
173
|
devrites-engine forge record "$RUN_ID" verification verified \
|
|
@@ -73,14 +73,13 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
|
|
|
73
73
|
(reported in its `Principles` field, or that you detect against `.devrites/principles.md`) is
|
|
74
74
|
handled here like an irreversible-risk item: block, route to a human-approved scoped
|
|
75
75
|
exception in the register or stop; never doubt-and-accept a principle violation into the slice.
|
|
76
|
-
5. **Run retained-baseline integrity
|
|
76
|
+
5. **Run the retained-baseline integrity gate, then recover any objective red.**
|
|
77
77
|
```bash
|
|
78
78
|
devrites-engine test-integrity; echo "test-integrity rc=$?"
|
|
79
|
-
devrites-engine package-existence; echo "package-existence rc=$?"
|
|
80
79
|
```
|
|
81
|
-
If the wright's `Gates` were red (targeted tests / types / lint),
|
|
82
|
-
failed, or
|
|
83
|
-
|
|
80
|
+
If the wright's `Gates` were red (targeted tests / types / lint), `test-integrity`
|
|
81
|
+
failed, or proof could not be verified: do **not** mark the slice `built`, and **do not
|
|
82
|
+
fix the code yourself**.
|
|
84
83
|
Classify each causal fingerprint through
|
|
85
84
|
[`cleanup-and-classify.md`](../../devrites-debug-recovery/reference/cleanup-and-classify.md),
|
|
86
85
|
run `devrites-engine recovery route <class>`, and follow the `recovery-route/v1`
|
|
@@ -95,9 +94,9 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
|
|
|
95
94
|
`recovery clear --class <class> "<root cause>" <slug>` only after green. Before every
|
|
96
95
|
re-dispatch, update the root-owned allowlist only for an accepted in-slice path and run
|
|
97
96
|
`reconcile snapshot`: after a clean check this refreshes canonical-state scope while
|
|
98
|
-
retaining the original source baseline. Repeat reconcile and
|
|
99
|
-
return. This owns red
|
|
100
|
-
|
|
97
|
+
retaining the original source baseline. Repeat reconcile and the integrity gate on every
|
|
98
|
+
return. This owns red gates, missing coverage, browser/runtime failures, and
|
|
99
|
+
workflow-tool defects.
|
|
101
100
|
After recovery:
|
|
102
101
|
- green → continue to record;
|
|
103
102
|
- product-contract/acceptance ambiguity or irreversible risk → open the genuine human gate
|
|
@@ -106,22 +105,14 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
|
|
|
106
105
|
- exhausted objective failure → preserve reproduction/dead ends, set `Status: blocked` and
|
|
107
106
|
`Next step: /rite-plan unblock`, then STOP without a question or `/rite-resolve`.
|
|
108
107
|
6. **Close the retained baseline, then record. You are the canonical writer.**
|
|
109
|
-
Reconciliation ran immediately on return and
|
|
108
|
+
Reconciliation ran immediately on return and `test-integrity` ran in step 5.
|
|
110
109
|
**Exit 3 → hard STOP:** a test was deleted, skipped, or de-asserted since the slice base: the
|
|
111
110
|
slice went green by weakening its tests, a Critical protocol violation. Revert the weakening and
|
|
112
111
|
re-dispatch the wright; do **not** mark the slice `built`.
|
|
113
112
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
`requirements.txt`, `pyproject.toml`, `Pipfile`, `Cargo.toml`): the classic shape of a
|
|
118
|
-
hallucinated or typo-squatted dependency. Confirm the name on the registry and declare it via the
|
|
119
|
-
package manager, or remove the import; do **not** mark the slice `built`. The gate is deterministic
|
|
120
|
-
and fail-open (not a git repo / no manifest / stdlib-only import → rc 0). If the nearest
|
|
121
|
-
manifest declares the package, treat the mismatch as a workflow-tool defect under bounded
|
|
122
|
-
recovery, not a plan repair or retry-authorization question. Once every gate and doubt
|
|
123
|
-
verdict is accepted, a forged slice records successful verification and runs
|
|
124
|
-
manifest-only cleanup per [`forge.md`](forge.md). Then close the private window:
|
|
113
|
+
Once every gate and doubt verdict is accepted, a forged slice records successful
|
|
114
|
+
verification and runs manifest-only cleanup per [`forge.md`](forge.md). Then close the
|
|
115
|
+
private window:
|
|
125
116
|
```bash
|
|
126
117
|
devrites-engine reconcile close
|
|
127
118
|
```
|
|
@@ -66,15 +66,12 @@ and exact changed-file set. Before the root writes any canonical record, run:
|
|
|
66
66
|
```bash
|
|
67
67
|
devrites-engine reconcile check; echo "reconcile rc=$?"
|
|
68
68
|
devrites-engine test-integrity; echo "test-integrity rc=$?"
|
|
69
|
-
devrites-engine package-existence; echo "package-existence rc=$?"
|
|
70
69
|
```
|
|
71
70
|
|
|
72
71
|
- Reconcile `5`: reject the result. Preserve pre-snapshot user work; restore only the
|
|
73
72
|
unauthorized slice delta; never widen scope from the writer's self-report.
|
|
74
73
|
- Test integrity `3`: a test was deleted, muted, focused, or de-asserted. Treat it as a
|
|
75
74
|
Critical protocol failure and correct it through the wright.
|
|
76
|
-
- Package existence `3`: verify the exact package/version and fix the bounded workflow
|
|
77
|
-
or dependency defect through recovery. It is not a reason to ask for retry approval.
|
|
78
75
|
- A setup/corrupt-baseline error blocks acceptance; never fall back silently to `HEAD`.
|
|
79
76
|
|
|
80
77
|
The clean reconcile check records that source has not changed since inspection. The
|
|
@@ -105,13 +102,13 @@ Before every retry:
|
|
|
105
102
|
|
|
106
103
|
That refresh requires the prior clean check, re-fingerprints root-owned state, and keeps
|
|
107
104
|
the original source baseline. Re-dispatch with the exact output, attempt count, and dead
|
|
108
|
-
ends. Then repeat reconcile and
|
|
105
|
+
ends. Then repeat reconcile and `test-integrity` from zero. Clear recovery only after
|
|
109
106
|
green with `recovery clear --class <class> "<root cause>" <slug>`. An exhausted objective
|
|
110
107
|
failure becomes a technical blocker with its reproduction, not a `rite-resolve` question.
|
|
111
108
|
|
|
112
109
|
## Close and record
|
|
113
110
|
|
|
114
|
-
When reconciliation, integrity,
|
|
111
|
+
When reconciliation, integrity, proof, and doubt gates all pass:
|
|
115
112
|
|
|
116
113
|
```bash
|
|
117
114
|
devrites-engine reconcile close
|
|
@@ -53,7 +53,6 @@ gates:
|
|
|
53
53
|
```bash
|
|
54
54
|
devrites-engine test-integrity; echo "test-integrity rc=$?" # exit 3 = a test deleted/skipped/loosened → Critical NO-GO
|
|
55
55
|
devrites-engine mutation-gate # changed-files mutation score — band the verdict; survivors are unproven behaviours
|
|
56
|
-
devrites-engine package-existence; echo "package-existence rc=$?" # exit 3 = a new import isn't declared in any manifest (hallucinated/typo-squatted dep) → Critical NO-GO
|
|
57
56
|
```
|
|
58
57
|
A test weakened since the slice base is a **Critical NO-GO**: the suite went green by lowering the
|
|
59
58
|
bar, not by the code being right. Record the mutation score in `seal.md`; under
|
|
@@ -166,8 +166,8 @@ decision.
|
|
|
166
166
|
|
|
167
167
|
Hand the winner's structured artifact to the normal cycle. Run immediate
|
|
168
168
|
reconciliation, doubt every stood decision, and complete test-integrity,
|
|
169
|
-
|
|
170
|
-
|
|
169
|
+
targeted, browser, and other slice proof. Only after every required gate is
|
|
170
|
+
green:
|
|
171
171
|
|
|
172
172
|
```bash
|
|
173
173
|
devrites-engine forge record "$RUN_ID" verification verified \
|
|
@@ -73,14 +73,13 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
|
|
|
73
73
|
(reported in its `Principles` field, or that you detect against `.devrites/principles.md`) is
|
|
74
74
|
handled here like an irreversible-risk item: block, route to a human-approved scoped
|
|
75
75
|
exception in the register or stop; never doubt-and-accept a principle violation into the slice.
|
|
76
|
-
5. **Run retained-baseline integrity
|
|
76
|
+
5. **Run the retained-baseline integrity gate, then recover any objective red.**
|
|
77
77
|
```bash
|
|
78
78
|
devrites-engine test-integrity; echo "test-integrity rc=$?"
|
|
79
|
-
devrites-engine package-existence; echo "package-existence rc=$?"
|
|
80
79
|
```
|
|
81
|
-
If the wright's `Gates` were red (targeted tests / types / lint),
|
|
82
|
-
failed, or
|
|
83
|
-
|
|
80
|
+
If the wright's `Gates` were red (targeted tests / types / lint), `test-integrity`
|
|
81
|
+
failed, or proof could not be verified: do **not** mark the slice `built`, and **do not
|
|
82
|
+
fix the code yourself**.
|
|
84
83
|
Classify each causal fingerprint through
|
|
85
84
|
[`cleanup-and-classify.md`](../../devrites-debug-recovery/reference/cleanup-and-classify.md),
|
|
86
85
|
run `devrites-engine recovery route <class>`, and follow the `recovery-route/v1`
|
|
@@ -95,9 +94,9 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
|
|
|
95
94
|
`recovery clear --class <class> "<root cause>" <slug>` only after green. Before every
|
|
96
95
|
re-dispatch, update the root-owned allowlist only for an accepted in-slice path and run
|
|
97
96
|
`reconcile snapshot`: after a clean check this refreshes canonical-state scope while
|
|
98
|
-
retaining the original source baseline. Repeat reconcile and
|
|
99
|
-
return. This owns red
|
|
100
|
-
|
|
97
|
+
retaining the original source baseline. Repeat reconcile and the integrity gate on every
|
|
98
|
+
return. This owns red gates, missing coverage, browser/runtime failures, and
|
|
99
|
+
workflow-tool defects.
|
|
101
100
|
After recovery:
|
|
102
101
|
- green → continue to record;
|
|
103
102
|
- product-contract/acceptance ambiguity or irreversible risk → open the genuine human gate
|
|
@@ -106,22 +105,14 @@ See also [`one-slice-cycle.md`](one-slice-cycle.md).
|
|
|
106
105
|
- exhausted objective failure → preserve reproduction/dead ends, set `Status: blocked` and
|
|
107
106
|
`Next step: $rite-plan unblock`, then STOP without a question or `$rite-resolve`.
|
|
108
107
|
6. **Close the retained baseline, then record. You are the canonical writer.**
|
|
109
|
-
Reconciliation ran immediately on return and
|
|
108
|
+
Reconciliation ran immediately on return and `test-integrity` ran in step 5.
|
|
110
109
|
**Exit 3 → hard STOP:** a test was deleted, skipped, or de-asserted since the slice base: the
|
|
111
110
|
slice went green by weakening its tests, a Critical protocol violation. Revert the weakening and
|
|
112
111
|
re-dispatch the wright; do **not** mark the slice `built`.
|
|
113
112
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
`requirements.txt`, `pyproject.toml`, `Pipfile`, `Cargo.toml`): the classic shape of a
|
|
118
|
-
hallucinated or typo-squatted dependency. Confirm the name on the registry and declare it via the
|
|
119
|
-
package manager, or remove the import; do **not** mark the slice `built`. The gate is deterministic
|
|
120
|
-
and fail-open (not a git repo / no manifest / stdlib-only import → rc 0). If the nearest
|
|
121
|
-
manifest declares the package, treat the mismatch as a workflow-tool defect under bounded
|
|
122
|
-
recovery, not a plan repair or retry-authorization question. Once every gate and doubt
|
|
123
|
-
verdict is accepted, a forged slice records successful verification and runs
|
|
124
|
-
manifest-only cleanup per [`forge.md`](forge.md). Then close the private window:
|
|
113
|
+
Once every gate and doubt verdict is accepted, a forged slice records successful
|
|
114
|
+
verification and runs manifest-only cleanup per [`forge.md`](forge.md). Then close the
|
|
115
|
+
private window:
|
|
125
116
|
```bash
|
|
126
117
|
devrites-engine reconcile close
|
|
127
118
|
```
|
|
@@ -66,15 +66,12 @@ and exact changed-file set. Before the root writes any canonical record, run:
|
|
|
66
66
|
```bash
|
|
67
67
|
devrites-engine reconcile check; echo "reconcile rc=$?"
|
|
68
68
|
devrites-engine test-integrity; echo "test-integrity rc=$?"
|
|
69
|
-
devrites-engine package-existence; echo "package-existence rc=$?"
|
|
70
69
|
```
|
|
71
70
|
|
|
72
71
|
- Reconcile `5`: reject the result. Preserve pre-snapshot user work; restore only the
|
|
73
72
|
unauthorized slice delta; never widen scope from the writer's self-report.
|
|
74
73
|
- Test integrity `3`: a test was deleted, muted, focused, or de-asserted. Treat it as a
|
|
75
74
|
Critical protocol failure and correct it through the wright.
|
|
76
|
-
- Package existence `3`: verify the exact package/version and fix the bounded workflow
|
|
77
|
-
or dependency defect through recovery. It is not a reason to ask for retry approval.
|
|
78
75
|
- A setup/corrupt-baseline error blocks acceptance; never fall back silently to `HEAD`.
|
|
79
76
|
|
|
80
77
|
The clean reconcile check records that source has not changed since inspection. The
|
|
@@ -105,13 +102,13 @@ Before every retry:
|
|
|
105
102
|
|
|
106
103
|
That refresh requires the prior clean check, re-fingerprints root-owned state, and keeps
|
|
107
104
|
the original source baseline. Re-dispatch with the exact output, attempt count, and dead
|
|
108
|
-
ends. Then repeat reconcile and
|
|
105
|
+
ends. Then repeat reconcile and `test-integrity` from zero. Clear recovery only after
|
|
109
106
|
green with `recovery clear --class <class> "<root cause>" <slug>`. An exhausted objective
|
|
110
107
|
failure becomes a technical blocker with its reproduction, not a `rite-resolve` question.
|
|
111
108
|
|
|
112
109
|
## Close and record
|
|
113
110
|
|
|
114
|
-
When reconciliation, integrity,
|
|
111
|
+
When reconciliation, integrity, proof, and doubt gates all pass:
|
|
115
112
|
|
|
116
113
|
```bash
|
|
117
114
|
devrites-engine reconcile close
|
|
@@ -53,7 +53,6 @@ gates:
|
|
|
53
53
|
```bash
|
|
54
54
|
devrites-engine test-integrity; echo "test-integrity rc=$?" # exit 3 = a test deleted/skipped/loosened → Critical NO-GO
|
|
55
55
|
devrites-engine mutation-gate # changed-files mutation score — band the verdict; survivors are unproven behaviours
|
|
56
|
-
devrites-engine package-existence; echo "package-existence rc=$?" # exit 3 = a new import isn't declared in any manifest (hallucinated/typo-squatted dep) → Critical NO-GO
|
|
57
56
|
```
|
|
58
57
|
A test weakened since the slice base is a **Critical NO-GO**: the suite went green by lowering the
|
|
59
58
|
bar, not by the code being right. Record the mutation score in `seal.md`; under
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "devrites",
|
|
3
|
-
"version": "3.2.
|
|
3
|
+
"version": "3.2.6",
|
|
4
4
|
"description": "DevRites: a disciplined senior-engineer workflow pack for Claude Code and Codex",
|
|
5
5
|
"license": "SEE LICENSE IN LICENSE",
|
|
6
6
|
"homepage": "https://github.com/ViktorsBaikers/DevRites#readme",
|
|
@@ -59,6 +59,7 @@ for item in "${PAYLOAD[@]}"; do
|
|
|
59
59
|
if [[ -e "$item" ]]; then
|
|
60
60
|
if [[ "$item" == "engine" ]] && git rev-parse --is-inside-work-tree >/dev/null 2>&1; then
|
|
61
61
|
while IFS= read -r -d '' path; do
|
|
62
|
+
[[ -e "$path" ]] || continue
|
|
62
63
|
if [[ "$path" == engine/testdata/golden/* ]]; then
|
|
63
64
|
continue
|
|
64
65
|
fi
|
package/scripts/validate.sh
CHANGED