devrites 5.7.2 → 5.9.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 +2 -2
- package/docs/architecture.md +4 -4
- package/docs/command-map.md +3 -3
- package/docs/engine/commands.md +1 -0
- package/docs/engine/workspace-schema.md +1 -1
- package/docs/flow.md +4 -2
- package/docs/orchestration.md +2 -2
- package/docs/skills.md +1 -1
- package/docs/usage.md +11 -10
- package/engine/internal/parallel/cli.go +69 -0
- package/engine/internal/parallel/git.go +8 -0
- package/engine/internal/parallel/ops.go +40 -12
- package/engine/internal/parallel/ops_test.go +29 -1
- package/engine/internal/parallel/parallel_test.go +26 -14
- package/engine/internal/parallel/select.go +76 -0
- package/engine/internal/parallel/select_test.go +95 -0
- package/pack/.claude/agents/devrites-slice-wright.md +18 -9
- package/pack/.claude/settings.json +1 -0
- package/pack/.claude/skills/devrites-lib/reference/standards/afk-hitl.md +4 -3
- package/pack/.claude/skills/rite-autocomplete/SKILL.md +18 -18
- package/pack/.claude/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/.claude/skills/rite-autocomplete/reference/loop.md +18 -25
- package/pack/.claude/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/.claude/skills/rite-build/SKILL.md +13 -8
- package/pack/.claude/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/.claude/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/.claude/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/.claude/skills/rite-build/reference/one-slice-cycle.md +5 -4
- package/pack/.claude/skills/rite-build/reference/parallel-batch.md +30 -23
- package/pack/.claude/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/.claude/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/.claude/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/.claude/skills/rite-polish/SKILL.md +3 -1
- package/pack/.claude/skills/rite-prove/SKILL.md +3 -0
- package/pack/.claude/skills/rite-review/SKILL.md +3 -1
- package/pack/.claude/skills/rite-temper/SKILL.md +6 -6
- package/pack/.claude/skills/rite-temper/reference/significance.md +3 -3
- package/pack/generated/claude/agents/devrites-slice-wright.md +18 -9
- package/pack/generated/claude/settings.json +1 -0
- package/pack/generated/claude/skills/devrites-lib/reference/standards/afk-hitl.md +4 -3
- package/pack/generated/claude/skills/rite-autocomplete/SKILL.md +18 -18
- package/pack/generated/claude/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/generated/claude/skills/rite-autocomplete/reference/loop.md +18 -25
- package/pack/generated/claude/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/generated/claude/skills/rite-build/SKILL.md +13 -8
- package/pack/generated/claude/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/generated/claude/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/generated/claude/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/generated/claude/skills/rite-build/reference/one-slice-cycle.md +5 -4
- package/pack/generated/claude/skills/rite-build/reference/parallel-batch.md +30 -23
- package/pack/generated/claude/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/generated/claude/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/generated/claude/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/generated/claude/skills/rite-polish/SKILL.md +3 -1
- package/pack/generated/claude/skills/rite-prove/SKILL.md +3 -0
- package/pack/generated/claude/skills/rite-review/SKILL.md +3 -1
- package/pack/generated/claude/skills/rite-temper/SKILL.md +6 -6
- package/pack/generated/claude/skills/rite-temper/reference/significance.md +3 -3
- package/pack/generated/codex/agents/devrites-slice-wright.toml +18 -9
- package/pack/generated/codex/skills/devrites-lib/reference/standards/afk-hitl.md +4 -3
- package/pack/generated/codex/skills/rite-autocomplete/SKILL.md +18 -18
- package/pack/generated/codex/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/generated/codex/skills/rite-autocomplete/reference/loop.md +18 -25
- package/pack/generated/codex/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/generated/codex/skills/rite-build/SKILL.md +13 -8
- package/pack/generated/codex/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/generated/codex/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/generated/codex/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/generated/codex/skills/rite-build/reference/one-slice-cycle.md +5 -4
- package/pack/generated/codex/skills/rite-build/reference/parallel-batch.md +30 -23
- package/pack/generated/codex/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/generated/codex/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/generated/codex/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/generated/codex/skills/rite-polish/SKILL.md +3 -1
- package/pack/generated/codex/skills/rite-prove/SKILL.md +3 -0
- package/pack/generated/codex/skills/rite-review/SKILL.md +3 -1
- package/pack/generated/codex/skills/rite-temper/SKILL.md +6 -6
- package/pack/generated/codex/skills/rite-temper/reference/significance.md +3 -3
- package/pack/generated/omp/agents/devrites-slice-wright.md +18 -9
- package/pack/generated/omp/skills/devrites-lib/reference/standards/afk-hitl.md +4 -3
- package/pack/generated/omp/skills/rite-autocomplete/SKILL.md +18 -18
- package/pack/generated/omp/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/generated/omp/skills/rite-autocomplete/reference/loop.md +18 -25
- package/pack/generated/omp/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/generated/omp/skills/rite-build/SKILL.md +13 -8
- package/pack/generated/omp/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/generated/omp/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/generated/omp/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/generated/omp/skills/rite-build/reference/one-slice-cycle.md +5 -4
- package/pack/generated/omp/skills/rite-build/reference/parallel-batch.md +30 -23
- package/pack/generated/omp/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/generated/omp/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/generated/omp/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/generated/omp/skills/rite-polish/SKILL.md +3 -1
- package/pack/generated/omp/skills/rite-prove/SKILL.md +3 -0
- package/pack/generated/omp/skills/rite-review/SKILL.md +3 -1
- package/pack/generated/omp/skills/rite-temper/SKILL.md +6 -6
- package/pack/generated/omp/skills/rite-temper/reference/significance.md +3 -3
- package/pack/generated/pi/agents/devrites-code-reviewer.md +1 -1
- package/pack/generated/pi/agents/devrites-devex-reviewer.md +1 -1
- package/pack/generated/pi/agents/devrites-doubt-reviewer.md +1 -1
- package/pack/generated/pi/agents/devrites-evidence-scout.md +1 -1
- package/pack/generated/pi/agents/devrites-frontend-reviewer.md +1 -1
- package/pack/generated/pi/agents/devrites-performance-reviewer.md +1 -1
- package/pack/generated/pi/agents/devrites-plan-drafter.md +1 -1
- package/pack/generated/pi/agents/devrites-plan-reviewer.md +1 -1
- package/pack/generated/pi/agents/devrites-proof-runner.md +1 -1
- package/pack/generated/pi/agents/devrites-retrospector.md +1 -1
- package/pack/generated/pi/agents/devrites-security-auditor.md +1 -1
- package/pack/generated/pi/agents/devrites-simplifier-reviewer.md +1 -1
- package/pack/generated/pi/agents/devrites-slice-wright.md +19 -10
- package/pack/generated/pi/agents/devrites-spec-reviewer.md +1 -1
- package/pack/generated/pi/agents/devrites-strategy-reviewer.md +1 -1
- package/pack/generated/pi/agents/devrites-test-analyst.md +1 -1
- package/pack/generated/pi/agents/devrites-upgrade-planner.md +1 -1
- package/pack/generated/pi/skills/devrites-lib/reference/standards/afk-hitl.md +4 -3
- package/pack/generated/pi/skills/rite-autocomplete/SKILL.md +18 -18
- package/pack/generated/pi/skills/rite-autocomplete/reference/decision-policy.md +2 -3
- package/pack/generated/pi/skills/rite-autocomplete/reference/loop.md +18 -25
- package/pack/generated/pi/skills/rite-autocomplete/reference/stop-conditions.md +10 -11
- package/pack/generated/pi/skills/rite-build/SKILL.md +13 -8
- package/pack/generated/pi/skills/rite-build/reference/afk-discipline.md +3 -1
- package/pack/generated/pi/skills/rite-build/reference/anti-patterns.md +4 -0
- package/pack/generated/pi/skills/rite-build/reference/checkpoint.md +33 -21
- package/pack/generated/pi/skills/rite-build/reference/one-slice-cycle.md +5 -4
- package/pack/generated/pi/skills/rite-build/reference/parallel-batch.md +30 -23
- package/pack/generated/pi/skills/rite-build/reference/phase-contract.md +4 -2
- package/pack/generated/pi/skills/rite-build/reference/wright-dispatch.md +16 -9
- package/pack/generated/pi/skills/rite-plan/reference/slicing.md +4 -3
- package/pack/generated/pi/skills/rite-polish/SKILL.md +3 -1
- package/pack/generated/pi/skills/rite-prove/SKILL.md +3 -0
- package/pack/generated/pi/skills/rite-review/SKILL.md +3 -1
- package/pack/generated/pi/skills/rite-temper/SKILL.md +6 -6
- package/pack/generated/pi/skills/rite-temper/reference/significance.md +3 -3
- package/package.json +1 -1
- package/scripts/pi-generate.sh +52 -1
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
package parallel
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"fmt"
|
|
5
|
+
"strings"
|
|
6
|
+
)
|
|
7
|
+
|
|
8
|
+
// SelectGreedy returns the largest plan-order pairwise-disjoint subset of ready
|
|
9
|
+
// whose size is ≤ cap. ready must already be dependency-satisfied and in plan
|
|
10
|
+
// order. cap is 1–MaxParallelSlices; 1 is a legal one-slice round, not a latch.
|
|
11
|
+
func SelectGreedy(cap int, ready []SlicePaths, root string) ([]SlicePaths, error) {
|
|
12
|
+
if cap < 1 || cap > MaxParallelSlices {
|
|
13
|
+
return nil, fmt.Errorf("cap must be 1-%d (got %d)", MaxParallelSlices, cap)
|
|
14
|
+
}
|
|
15
|
+
normalized := make([]SlicePaths, 0, len(ready))
|
|
16
|
+
seen := make(map[string]struct{}, len(ready))
|
|
17
|
+
for i, item := range ready {
|
|
18
|
+
label := fmt.Sprintf("slice %d", i)
|
|
19
|
+
if item.ID != "" {
|
|
20
|
+
if err := validateSliceID(item.ID); err != nil {
|
|
21
|
+
return nil, fmt.Errorf("%s: %w", label, err)
|
|
22
|
+
}
|
|
23
|
+
label = fmt.Sprintf("slice %q", item.ID)
|
|
24
|
+
} else {
|
|
25
|
+
return nil, fmt.Errorf("%s: missing id", label)
|
|
26
|
+
}
|
|
27
|
+
if _, ok := seen[item.ID]; ok {
|
|
28
|
+
return nil, fmt.Errorf("duplicate slice id %q", item.ID)
|
|
29
|
+
}
|
|
30
|
+
seen[item.ID] = struct{}{}
|
|
31
|
+
paths, err := validateSlicePaths(item.Paths, label, root)
|
|
32
|
+
if err != nil {
|
|
33
|
+
return nil, err
|
|
34
|
+
}
|
|
35
|
+
normalized = append(normalized, SlicePaths{ID: item.ID, Paths: paths})
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
selected := make([]SlicePaths, 0, min(cap, len(normalized)))
|
|
39
|
+
for _, cand := range normalized {
|
|
40
|
+
if len(selected) >= cap {
|
|
41
|
+
break
|
|
42
|
+
}
|
|
43
|
+
if len(selected) == 0 {
|
|
44
|
+
selected = append(selected, cand)
|
|
45
|
+
continue
|
|
46
|
+
}
|
|
47
|
+
trial := append(append([]SlicePaths{}, selected...), cand)
|
|
48
|
+
if _, err := CheckPathDisjoint(trial, root); err != nil {
|
|
49
|
+
if strings.Contains(err.Error(), "overlap") {
|
|
50
|
+
continue
|
|
51
|
+
}
|
|
52
|
+
return nil, err
|
|
53
|
+
}
|
|
54
|
+
selected = trial
|
|
55
|
+
}
|
|
56
|
+
return selected, nil
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
func selectMode(n int) string {
|
|
60
|
+
switch {
|
|
61
|
+
case n <= 0:
|
|
62
|
+
return "none"
|
|
63
|
+
case n == 1:
|
|
64
|
+
return "serial"
|
|
65
|
+
default:
|
|
66
|
+
return "parallel"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
func formatSelect(selected []SlicePaths) string {
|
|
71
|
+
ids := make([]string, len(selected))
|
|
72
|
+
for i, item := range selected {
|
|
73
|
+
ids[i] = item.ID
|
|
74
|
+
}
|
|
75
|
+
return fmt.Sprintf("select: n_eff=%d mode=%s slices=%s", len(selected), selectMode(len(selected)), strings.Join(ids, ","))
|
|
76
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
package parallel
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"bytes"
|
|
5
|
+
"strings"
|
|
6
|
+
"testing"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
func TestSelectGreedyOneThenMany(t *testing.T) {
|
|
10
|
+
t.Parallel()
|
|
11
|
+
round1, err := SelectGreedy(5, []SlicePaths{
|
|
12
|
+
{ID: "SLICE-001", Paths: []string{"src/a.go"}},
|
|
13
|
+
}, "")
|
|
14
|
+
if err != nil {
|
|
15
|
+
t.Fatal(err)
|
|
16
|
+
}
|
|
17
|
+
if len(round1) != 1 || round1[0].ID != "SLICE-001" {
|
|
18
|
+
t.Fatalf("round1=%#v", round1)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
round2, err := SelectGreedy(5, []SlicePaths{
|
|
22
|
+
{ID: "SLICE-002", Paths: []string{"src/b.go"}},
|
|
23
|
+
{ID: "SLICE-003", Paths: []string{"src/c.go"}},
|
|
24
|
+
{ID: "SLICE-004", Paths: []string{"src/d.go"}},
|
|
25
|
+
{ID: "SLICE-005", Paths: []string{"src/e.go"}},
|
|
26
|
+
}, "")
|
|
27
|
+
if err != nil {
|
|
28
|
+
t.Fatal(err)
|
|
29
|
+
}
|
|
30
|
+
if len(round2) != 4 {
|
|
31
|
+
t.Fatalf("after a one-slice round, cap 5 with 4 ready must select 4, got %d (%#v)", len(round2), round2)
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
func TestSelectGreedySkipsOverlapKeepsCap(t *testing.T) {
|
|
36
|
+
t.Parallel()
|
|
37
|
+
got, err := SelectGreedy(5, []SlicePaths{
|
|
38
|
+
{ID: "SLICE-001", Paths: []string{"src/shared.go"}},
|
|
39
|
+
{ID: "SLICE-002", Paths: []string{"src/shared.go", "src/b.go"}},
|
|
40
|
+
{ID: "SLICE-003", Paths: []string{"src/c.go"}},
|
|
41
|
+
}, "")
|
|
42
|
+
if err != nil {
|
|
43
|
+
t.Fatal(err)
|
|
44
|
+
}
|
|
45
|
+
if len(got) != 2 || got[0].ID != "SLICE-001" || got[1].ID != "SLICE-003" {
|
|
46
|
+
t.Fatalf("got %#v", got)
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
func TestSelectGreedyRejectsBadCap(t *testing.T) {
|
|
51
|
+
t.Parallel()
|
|
52
|
+
if _, err := SelectGreedy(0, nil, ""); err == nil {
|
|
53
|
+
t.Fatal("cap 0 should fail")
|
|
54
|
+
}
|
|
55
|
+
if _, err := SelectGreedy(11, nil, ""); err == nil {
|
|
56
|
+
t.Fatal("cap 11 should fail")
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
func TestSelectCLIOneThenMany(t *testing.T) {
|
|
61
|
+
t.Parallel()
|
|
62
|
+
var stdout, stderr bytes.Buffer
|
|
63
|
+
in := strings.NewReader(`{"slices":[{"id":"SLICE-001","paths":["src/a.go"]}]}`)
|
|
64
|
+
code := Run("parallel", []string{"select", "--cap", "5", "-"}, in, &stdout, &stderr)
|
|
65
|
+
if code != ExitOK {
|
|
66
|
+
t.Fatalf("code=%d stderr=%s", code, stderr.String())
|
|
67
|
+
}
|
|
68
|
+
if got := stdout.String(); got != "select: n_eff=1 mode=serial slices=SLICE-001\n" {
|
|
69
|
+
t.Fatalf("round1 got %q", got)
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
stdout.Reset()
|
|
73
|
+
stderr.Reset()
|
|
74
|
+
in = strings.NewReader(`{"slices":[
|
|
75
|
+
{"id":"SLICE-002","paths":["src/b.go"]},
|
|
76
|
+
{"id":"SLICE-003","paths":["src/c.go"]},
|
|
77
|
+
{"id":"SLICE-004","paths":["src/d.go"]}
|
|
78
|
+
]}`)
|
|
79
|
+
code = Run("parallel", []string{"select", "--cap", "5", "-"}, in, &stdout, &stderr)
|
|
80
|
+
if code != ExitOK {
|
|
81
|
+
t.Fatalf("code=%d stderr=%s", code, stderr.String())
|
|
82
|
+
}
|
|
83
|
+
if got := stdout.String(); got != "select: n_eff=3 mode=parallel slices=SLICE-002,SLICE-003,SLICE-004\n" {
|
|
84
|
+
t.Fatalf("round2 got %q; must not stay n_eff=1", got)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
func TestSelectCLIRequiresCap(t *testing.T) {
|
|
89
|
+
t.Parallel()
|
|
90
|
+
var stdout, stderr bytes.Buffer
|
|
91
|
+
code := Run("parallel", []string{"select", "-"}, strings.NewReader(`{"slices":[]}`), &stdout, &stderr)
|
|
92
|
+
if code != ExitUsage {
|
|
93
|
+
t.Fatalf("code=%d want %d stderr=%s", code, ExitUsage, stderr.String())
|
|
94
|
+
}
|
|
95
|
+
}
|
|
@@ -31,16 +31,20 @@ the target stack's idiom. Never plan, choose scope, design, or perform independe
|
|
|
31
31
|
8. **Isolated worktree transfer is explicit.** Only when the dispatch contract names
|
|
32
32
|
`Isolation: native-worktree`, run `git rev-parse HEAD` as the first command and
|
|
33
33
|
require exact equality with supplied `worktree_base` before reading or editing.
|
|
34
|
-
Mismatch returns a gap with no write. After
|
|
35
|
-
transfer commit
|
|
36
|
-
|
|
34
|
+
Mismatch returns a gap with no write. After writer-safe proof, create one local
|
|
35
|
+
unpushed **worktree-branch** transfer commit with the contract `WIP(<slug>):`
|
|
36
|
+
subject (no slice id) — transport only, not a control/primary commit. Never push,
|
|
37
|
+
merge, rebase, or remove the worktree. Without that exact mode, do not commit.
|
|
37
38
|
|
|
38
39
|
## The contract you receive
|
|
39
40
|
The orchestrator supplies these inline or by path, relative to **Workspace root**:
|
|
40
41
|
- **Slice:** id/name, goal, acceptance criteria, **scope boundary** (what it will and will
|
|
41
42
|
**not** touch), mode (HITL/AFK + any budget).
|
|
42
43
|
- **Isolation:** `same-worktree` or `native-worktree`; native mode also supplies the
|
|
43
|
-
exact committed `worktree_base` SHA and requires a local transfer commit
|
|
44
|
+
exact committed `worktree_base` SHA and requires a local transfer commit whose
|
|
45
|
+
subject is the supplied `WIP(<slug>): <imperative summary>` (no slice id).
|
|
46
|
+
Same-worktree leaves the diff uncommitted; the orchestrator commits that subject
|
|
47
|
+
at RECORD.
|
|
44
48
|
- **Targets:** the exact project-relative paths listed in the dispatch task,
|
|
45
49
|
plus interfaces and signatures to match. Your return cannot widen this set.
|
|
46
50
|
- **Context to read yourself:** the relevant owning sections of `spec.md`, `plan.md`, `decisions.md`, `assumptions.md`,
|
|
@@ -97,6 +101,8 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
|
|
|
97
101
|
`$devrites-source-driven` on Codex. Verify the fact in installed source,
|
|
98
102
|
official documentation, or context7 for current upstream behavior, then include
|
|
99
103
|
that source in the result. Never invent an API.
|
|
104
|
+
- **No process residue.** Do not put `SLICE-###`, slice numbers, or "this slice"
|
|
105
|
+
in product source, tests, comments, or filenames.
|
|
100
106
|
4. **VERIFY (fail-on-red).** Run writer-safe tests/types/lint. Report required
|
|
101
107
|
build/browser/E2E as `not-run` (root-owned, artifact-producing gates), and only
|
|
102
108
|
when the exact command, cwd, and prerequisites already appear in the unchanged
|
|
@@ -118,9 +124,11 @@ unclear boundary is underspecified: return `Escalation` without proceeding.
|
|
|
118
124
|
in-scope gaps together, rerun affected proof, and report remaining gaps. Self-check
|
|
119
125
|
never replaces independent review; green tests do not prove all possible cases.
|
|
120
126
|
5. **TRANSFER when isolated.** After green writer-safe proof, verify the diff again,
|
|
121
|
-
stage only exact task paths, and create one new local commit
|
|
122
|
-
the slice
|
|
123
|
-
|
|
127
|
+
stage only exact task paths, and create one new local commit on **this worktree
|
|
128
|
+
branch** with the contract `WIP(<slug>):` subject (no slice id). Record its SHA.
|
|
129
|
+
This is transport for later orchestrator landing — not a control/primary commit
|
|
130
|
+
and not "the slice is done". If the commit fails or includes any extra path,
|
|
131
|
+
return the failure and preserve the worktree; never bypass hooks or amend.
|
|
124
132
|
In `same-worktree` mode skip this step and leave the approved diff uncommitted.
|
|
125
133
|
6. **RETURN** the structured artifact (below) and stop.
|
|
126
134
|
|
|
@@ -197,8 +205,9 @@ human-owned choices. Never silently ship a known gap.
|
|
|
197
205
|
## Tools / read-write mode
|
|
198
206
|
|
|
199
207
|
Write code/tests only at exact contract paths; no `.devrites/` bookkeeping. Only
|
|
200
|
-
`native-worktree` permits staging and one local transfer commit of those paths
|
|
201
|
-
All other Git mutation and remote actions
|
|
208
|
+
`native-worktree` permits staging and one local transfer commit of those paths
|
|
209
|
+
(contract `WIP(<slug>):` subject). All other Git mutation and remote actions
|
|
210
|
+
remain forbidden.
|
|
202
211
|
|
|
203
212
|
## Composition
|
|
204
213
|
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"Bash(devrites-engine orient *)",
|
|
14
14
|
"Bash(devrites-engine observe *)",
|
|
15
15
|
"Bash(devrites-engine parallel status *)",
|
|
16
|
+
"Bash(devrites-engine parallel select *)",
|
|
16
17
|
"Bash(devrites-engine parallel create *)",
|
|
17
18
|
"Bash(devrites-engine parallel record-green *)",
|
|
18
19
|
"Bash(devrites-engine parallel integrate *)",
|
|
@@ -110,8 +110,8 @@ candidate manifest to cover the whole recorded chain — run
|
|
|
110
110
|
qualify; no recorded next entry, or the cap/review-queue bound reached, stops
|
|
111
111
|
with the winning reason.
|
|
112
112
|
- Milestones are **not** shipped: they stay sealed and unarchived in `.devrites/work/`
|
|
113
|
-
with `Next step: /rite-ship` preserved.
|
|
114
|
-
land
|
|
113
|
+
with `Next step: /rite-ship` preserved. Local `WIP(<slug>):` checkpoints still
|
|
114
|
+
land ([checkpoint.md](../../../rite-build/reference/checkpoint.md)), so the tree
|
|
115
115
|
stays clean and crash-safe.
|
|
116
116
|
- Git stays human-gated. The release ship is one disclosed plan, one literal `GO`, and
|
|
117
117
|
one native approval; it collapses the sequence's `WIP` commits into the single
|
|
@@ -120,7 +120,8 @@ candidate manifest to cover the whole recorded chain — run
|
|
|
120
120
|
run exactly as without this field.
|
|
121
121
|
|
|
122
122
|
`max_parallel` caps a Build batch for unattended runs; `1` forces the serial cycle.
|
|
123
|
-
Unattended runs take the largest eligible set ≤ cap and recompute after every
|
|
123
|
+
Unattended runs take the largest eligible set ≤ cap and recompute after every completed
|
|
124
|
+
round (serial slice or parallel integrate)
|
|
124
125
|
([parallel-batch.md § Dynamic selection and re-batching](../../../rite-build/reference/parallel-batch.md#dynamic-selection-and-re-batching));
|
|
125
126
|
an explicit `/rite-build --parallel N` cap wins for that invocation.
|
|
126
127
|
|
|
@@ -9,7 +9,7 @@ user-invocable: true
|
|
|
9
9
|
|
|
10
10
|
Run every phase after one clarification window. Irreversible-risk,
|
|
11
11
|
blocking/escalating,<!-- pack-scan-ignore: negated statement: gates are NOT disabled -->
|
|
12
|
-
NO-GO
|
|
12
|
+
and NO-GO still pause. Use the Standard native
|
|
13
13
|
profile by default and Full for high-risk scope or explicit `--full`; see
|
|
14
14
|
[`orchestration-profiles.md`](../devrites-lib/reference/orchestration-profiles.md).
|
|
15
15
|
|
|
@@ -48,20 +48,19 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
48
48
|
- Every exact causal fingerprint gets at most three no-progress corrections.
|
|
49
49
|
Closing one is progress; a distinct Critical/Important invariant has its own
|
|
50
50
|
budget. Lower severity cannot prolong recovery.
|
|
51
|
-
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
that reduces the queue.
|
|
51
|
+
- Do not stop on `--max-slices`, sentinel `max_slices`, `max_agents`,
|
|
52
|
+
`max_minutes`, or `max_review_queue`. Count failed, malformed, and
|
|
53
|
+
unavailable leaf calls.
|
|
55
54
|
- Parse flags only from this invocation. `--ship`, `--yolo`, `--max-slices`,
|
|
56
55
|
`--parallel`, `--full`, and `--cross-model` activate only as exact standalone
|
|
57
56
|
tokens in `$ARGUMENTS`; examples or earlier messages can never arm them.
|
|
58
57
|
`--max-slices` must occur once and be followed by a positive base-10 integer;
|
|
59
58
|
`--parallel` must occur once and be followed by a base-10 integer in `1`–`10`.
|
|
60
59
|
Missing, repeated, malformed, or conflicting values stop before any write.
|
|
61
|
-
- Temper always runs after Clarify.
|
|
62
|
-
`
|
|
60
|
+
- Temper always runs after Clarify. Auto-apply the recommended mode, including
|
|
61
|
+
`expand` and extra acceptance; record the ADR and fold via Spec Drift Guard.
|
|
62
|
+
Irreversible-risk still pauses.
|
|
63
63
|
- Vet every plan. Cross-model is off unless the current invocation arms it.
|
|
64
|
-
Never auto-grow accepted scope.
|
|
65
64
|
|
|
66
65
|
## Workflow
|
|
67
66
|
|
|
@@ -77,7 +76,7 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
77
76
|
from chat. After compaction or a resumed session, read `.devrites/ACTIVE`, then
|
|
78
77
|
the `state.md` cursor, `questions.md`, `decisions.md`, and `test-plan.md`/`evidence.md`.
|
|
79
78
|
Normalize current arguments to idea, `ship_preflight: yes|no`,
|
|
80
|
-
`max_slices:
|
|
79
|
+
`max_slices: unlimited`, `parallel: N|default`, `profile: standard|full`,
|
|
81
80
|
and `cross_model: yes|no`.
|
|
82
81
|
**Completion:** normalized state is unambiguous and no sentinel or workspace file has been written.
|
|
83
82
|
2. **Specify and clarify.** Run `devrites-interview`, `/rite-spec`, and
|
|
@@ -85,7 +84,7 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
85
84
|
AFK. **Completion:** `Decision coverage: CLEAR` is durable.
|
|
86
85
|
3. **Arm AFK once.** Apply the loop's
|
|
87
86
|
[one-write AFK contract](reference/loop.md#arm-afk-once): preserve valid
|
|
88
|
-
existing bytes or create the
|
|
87
|
+
existing bytes or create the sentinel once (`allow_gates: [advisory, validating]`); never
|
|
89
88
|
rewrite it after Vet. Preserve an existing sentinel byte-for-byte.
|
|
90
89
|
**Completion:** a valid read-only AFK sentinel exists.
|
|
91
90
|
4. **Drive phases.** Follow [the loop](reference/loop.md): `/rite-spec` →
|
|
@@ -94,15 +93,16 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
94
93
|
`/rite-review` → `/rite-seal`. Read and execute each skill; durable files, not
|
|
95
94
|
chat, carry state. Apply the mutable post-vet budget before first Build.
|
|
96
95
|
Build runs the largest eligible path-disjoint batch (cap: `--parallel N`, else
|
|
97
|
-
sentinel `max_parallel`, else 10) and recomputes after every
|
|
98
|
-
pending slice remains;
|
|
99
|
-
host
|
|
96
|
+
sentinel `max_parallel`, else 10) and recomputes after every completed round until no
|
|
97
|
+
pending slice remains; a one-slice round is serial for that round only, then
|
|
98
|
+
selection runs again (host isolation still forces serial when concurrent writers
|
|
99
|
+
cannot be separated).
|
|
100
100
|
**Completion:** loop reaches Seal GO or persists a valid stop before any later phase.
|
|
101
101
|
5. **Apply stops.** At every gate use
|
|
102
102
|
[stop-conditions.md](reference/stop-conditions.md). A `blocked` label alone is not a stop condition:
|
|
103
103
|
route agent-owned red results through bounded recovery.
|
|
104
104
|
Red gates block forward advancement and enter caller-owned recovery. Stop on
|
|
105
|
-
hard risk, human-owned blocking/escalating/NO-GO,
|
|
105
|
+
hard risk, human-owned blocking/escalating/NO-GO, or the
|
|
106
106
|
exact fingerprint's proven exhaustion. Technical exhaustion records terminal
|
|
107
107
|
`Next step: none`, never a routine phase command. **Completion:** no stop is active, or its cursor and reason are durable.
|
|
108
108
|
6. **Seal boundary.** Without a ship flag, stop at Seal GO with `/rite-ship` —
|
|
@@ -115,8 +115,8 @@ executable controller/harness/bundle bytes or a missing writer, read
|
|
|
115
115
|
|
|
116
116
|
## Reply and resume
|
|
117
117
|
|
|
118
|
-
HITL Build returns after one slice;
|
|
119
|
-
|
|
118
|
+
HITL Build returns after one slice; Autocomplete ignores `--max-slices` and
|
|
119
|
+
keeps chaining pending slices. One Autocomplete invocation owns all internal
|
|
120
120
|
backtracking. Context pressure, compaction, or a nested completion footer does
|
|
121
121
|
not create a stop; persist and resume the cursor.
|
|
122
122
|
|
|
@@ -128,5 +128,5 @@ spec <done|stopped> · clarify <clear|stopped> · temper <done|stopped> · defin
|
|
|
128
128
|
```
|
|
129
129
|
|
|
130
130
|
Final state is `Shipped`, `Stopped`, `Awaiting human`, `NO-GO`, or `GO`; do not
|
|
131
|
-
write a narrative recap. Require a clean or accepted baseline,
|
|
132
|
-
|
|
131
|
+
write a narrative recap. Require a clean or accepted baseline, land a local
|
|
132
|
+
unpushed checkpoint after each green check, and never auto-pass a red gate.
|
|
@@ -36,6 +36,5 @@ not pick the option that's merely easiest to implement.
|
|
|
36
36
|
|
|
37
37
|
## When a choice is NOT autocomplete's to make
|
|
38
38
|
|
|
39
|
-
Human-owned
|
|
40
|
-
|
|
41
|
-
answers *how*, never *what to build* beyond the settled interview.
|
|
39
|
+
Human-owned blocking/escalating, irreversible-risk, and access stay human.
|
|
40
|
+
Recommended temper `expand` auto-applies; do not invent product intent.
|
|
@@ -13,11 +13,8 @@ routine phases. Acceptance-preserving Reslice authority is
|
|
|
13
13
|
## Arm AFK once
|
|
14
14
|
|
|
15
15
|
```yaml
|
|
16
|
-
allow_gates: [advisory]
|
|
17
|
-
max_slices:
|
|
18
|
-
max_agents: 32
|
|
19
|
-
max_minutes: 120
|
|
20
|
-
max_review_queue: 8
|
|
16
|
+
allow_gates: [advisory, validating]
|
|
17
|
+
# max_slices / max_agents / max_minutes / max_review_queue omitted: unlimited
|
|
21
18
|
# continue_sequence: true # opt-in: chain recorded continuations after Seal GO
|
|
22
19
|
# max_workspaces: 5 # sequence budget when chaining
|
|
23
20
|
# max_parallel: 10 # Build batch cap; 1 = serial (default: eligible, cap 10)
|
|
@@ -27,32 +24,28 @@ max_review_queue: 8
|
|
|
27
24
|
```
|
|
28
25
|
|
|
29
26
|
Read an existing sentinel first. Preserve it byte-for-byte when valid; stop if
|
|
30
|
-
|
|
31
|
-
`
|
|
32
|
-
|
|
27
|
+
malformed. Do not stop because it names `max_slices` / `max_agents` /
|
|
28
|
+
`max_minutes` / `max_review_queue` or only `[advisory]`. If absent, write it
|
|
29
|
+
once after clarity. Never write `max_slices` from `--max-slices`.
|
|
33
30
|
It is read-only: never rewrite it after Vet or reset it on resume. Leftover
|
|
34
31
|
`expires_at` is ignored and never rewritten.
|
|
35
32
|
|
|
36
33
|
### Derive the mutable post-vet budget
|
|
37
34
|
|
|
38
|
-
After Vet,
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
or reinitialize it. AFK configuration itself stays unchanged.
|
|
35
|
+
After Vet, seed `afk_slices_remaining` from the pending count so every pending
|
|
36
|
+
slice can run. Ignore `--max-slices`, sentinel `max_slices`, and leftover
|
|
37
|
+
remaining. AFK configuration itself stays unchanged.
|
|
42
38
|
|
|
43
39
|
### Admit each unattended cycle
|
|
44
40
|
|
|
45
|
-
Before every phase, review fan-out, recovery, or writer dispatch
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
reconciliation that reduces the queue may run. Any reached or unobservable
|
|
50
|
-
bound stops before more work and persists the winning reason. A new activation
|
|
51
|
-
gets fresh activation-local counters but retains durable slice/recovery state
|
|
52
|
-
and recomputed queue.
|
|
41
|
+
Before every phase, review fan-out, recovery, or writer dispatch: cheapest
|
|
42
|
+
readiness check first; reject overlap. Do not stop on `max_agents`,
|
|
43
|
+
`max_minutes`, or `max_review_queue`. Count every leaf result. A new activation
|
|
44
|
+
gets fresh activation-local counters but retains durable slice/recovery state.
|
|
53
45
|
|
|
54
|
-
|
|
55
|
-
|
|
46
|
+
When driving `/rite-build`, ignore afk-discipline remaining-0, `--max-slices`,
|
|
47
|
+
and parallel AFK headroom. Close validating questions
|
|
48
|
+
(recommended pick) instead of queuing them.
|
|
56
49
|
|
|
57
50
|
## Phase arc
|
|
58
51
|
|
|
@@ -62,17 +55,17 @@ Workspace files carry state; chat does not. Read and execute each phase skill:
|
|
|
62
55
|
| --- | --- | --- |
|
|
63
56
|
| 1 | `/rite-spec` | investigate and write testable intent |
|
|
64
57
|
| 2 | `/rite-clarify` | topology-first scan; require `Decision coverage: CLEAR`, then arm AFK |
|
|
65
|
-
| 3 | `/rite-temper` | harden or
|
|
58
|
+
| 3 | `/rite-temper` | harden, reduce, or expand; irreversible risk still pauses |
|
|
66
59
|
| 4 | `/rite-define` | approved plan/tasks/traceability |
|
|
67
60
|
| 5 | `/rite-vet` | every plan; derive mutable budget after READY |
|
|
68
|
-
| 6 | `/rite-build` batch loop | largest eligible path-disjoint set (cap 10;
|
|
61
|
+
| 6 | `/rite-build` batch loop | largest eligible path-disjoint set (cap 10; one-slice round when <2 eligible); recompute after each round; charge once per green built slice |
|
|
69
62
|
| 7 | `/rite-prove` | all slices built; approved proof; recovery on red |
|
|
70
63
|
| 8 | `/rite-polish` | re-prove after code edits |
|
|
71
64
|
| 9 | `/rite-review` | in-scope correction then fresh proof |
|
|
72
65
|
| 10 | `/rite-seal` | GO/NO-GO; no Git |
|
|
73
66
|
| 11 | `/rite-ship` | only after GO; `--ship` never authorizes Git; stop at literal-GO/native approval |
|
|
74
67
|
|
|
75
|
-
Before advancing, check
|
|
68
|
+
Before advancing, check
|
|
76
69
|
[stop-conditions.md](stop-conditions.md). After source edits, discard stale pass
|
|
77
70
|
evidence. Re-read the active workspace before each phase.
|
|
78
71
|
|
|
@@ -59,22 +59,21 @@ exhausted.
|
|
|
59
59
|
<!-- workflow-artifact-adapter: {"module":"devrites-lib/reference/standards/workflow-artifacts.md","entry":"classifier returns owner-busy, exhausted, or existing hard gate","action":"stop on exact WAIT_ACTIVE_OWNER, BLOCKED_EXHAUSTED, or BLOCKED_GATE result","return":"unchanged cursor plus fixed route-owned output"} -->
|
|
60
60
|
## Other stop classes
|
|
61
61
|
|
|
62
|
-
- **Gate severity:** blocking or escalating gate
|
|
63
|
-
|
|
64
|
-
|
|
62
|
+
- **Gate severity:** blocking or escalating gate. Validating: auto-pick the
|
|
63
|
+
recommended option, close the question, continue.
|
|
64
|
+
- **Temper:** `expand` and extra acceptance auto-apply (record + Drift Guard).
|
|
65
|
+
Irreversible-risk still pauses. `hold-rigor`, `reduce-to-MVP`, and a skip do not pause.
|
|
65
66
|
- **Clarify:** material Partial/Missing/unowned decision coverage or a
|
|
66
67
|
low-confidence high-consequence assumption. Continue the initial interview;
|
|
67
68
|
never arm AFK early.
|
|
68
69
|
- **Seal:** NO-GO, with every blocker and fix direction. Never round up to GO.
|
|
69
70
|
- **Reslice:** execute its marked action before deciding continue/stop.
|
|
70
|
-
- **Slice budget:**
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
- **Resource envelope:** missing
|
|
75
|
-
|
|
76
|
-
above cap. At cap, only queue-reducing reconciliation may run. Persist winning
|
|
77
|
-
bound and observed usage; a new activation does not reset durable budgets.
|
|
71
|
+
- **Slice budget:** do not stop on `--max-slices`. Leftover
|
|
72
|
+
pre-existing remaining value, explicit flag, sentinel cap, or post-vet pending count
|
|
73
|
+
does not stop. Zero with no pending slices is normal completion.
|
|
74
|
+
Malformed flag stops before any write.
|
|
75
|
+
- **Resource envelope:** overlapping run or missing AFK after arm still stops.
|
|
76
|
+
Do not stop on `--max-slices`, `max_agents`, `max_minutes`, or `max_review_queue`.
|
|
78
77
|
- **Confidence:** intent still cannot become testable acceptance after interview.
|
|
79
78
|
- **Repeated failure:** the exact fingerprint's bounded recovery is exhausted.
|
|
80
79
|
|
|
@@ -60,12 +60,15 @@ Wright applies anti-slop; root verifies returns and never patches source.
|
|
|
60
60
|
|
|
61
61
|
Omitted/`1` ≡ serial; `2`–`10` is a **cap** — the root runs the largest eligible
|
|
62
62
|
path-disjoint set it can start now (`N_eff`), takes fewer when the cap cannot be
|
|
63
|
-
filled, and recomputes after every
|
|
63
|
+
filled, and recomputes after every completed round (serial slice or parallel
|
|
64
|
+
integrate) until no pending slice remains
|
|
64
65
|
([`parallel-batch.md` § Dynamic selection](reference/parallel-batch.md#dynamic-selection-and-re-batching)).
|
|
65
66
|
Unattended runs (`/rite-autocomplete`, `.devrites/AFK` `max_parallel`) repeat batches
|
|
66
67
|
inside the same run; HITL stops after each batch. Non-integer/`N≤0`/`N>10` hard refuse.
|
|
67
|
-
All-green
|
|
68
|
-
|
|
68
|
+
All-green (independent review + proof) then integrate as one local `WIP(<slug>):`
|
|
69
|
+
commit per sibling onto the current control branch (never pushed). Do not
|
|
70
|
+
integrate a sibling because the wright returned. A red/gap sibling gets a bounded repair
|
|
71
|
+
round in its own worktree — never rebuilt from scratch while budget remains.
|
|
69
72
|
Post-writer inventory and affected rechecks follow `phase-contract.md` § Independent
|
|
70
73
|
Build review; fold accounts before one repair-all wright.
|
|
71
74
|
Plan-owned gaps still route through Spec Drift Guard
|
|
@@ -88,9 +91,11 @@ the next slice automatically; AFK obeys remaining budget; Prove requires all sli
|
|
|
88
91
|
|
|
89
92
|
## Phase exit
|
|
90
93
|
|
|
91
|
-
**Complete when:**
|
|
92
|
-
`git diff --name-only` ⊆ allowlist,
|
|
93
|
-
|
|
94
|
+
**Complete when:** Independent Build review and fail-on-red proof are green,
|
|
95
|
+
`git diff --name-only` ⊆ allowlist, no open Critical/Important, `state.md` cursor
|
|
96
|
+
advances with recorded evidence, and the control-branch checkpoint has landed
|
|
97
|
+
per [`checkpoint.md`](reference/checkpoint.md).
|
|
94
98
|
|
|
95
|
-
**Failing case:** wright reports "done" but
|
|
96
|
-
|
|
99
|
+
**Failing case:** wright reports "done" but independent review or proof was
|
|
100
|
+
skipped, red, or followed by an uncommitted repair → slice incomplete; do not
|
|
101
|
+
advance cursor or commit on control.
|
|
@@ -16,7 +16,9 @@ control; irreversible work (destructive/auth/public API) always pauses.
|
|
|
16
16
|
The controlling root owns the cap:
|
|
17
17
|
|
|
18
18
|
1. **Before every dispatch**, re-read `.devrites/AFK`, `state.md`, and the
|
|
19
|
-
selected slice.
|
|
19
|
+
selected slice. When `--parallel N` or sentinel `max_parallel` is greater than
|
|
20
|
+
1, recompute `N_eff` via `parallel select` before the next dispatch — a prior
|
|
21
|
+
one-slice round does not keep the run serial. A configured `max_slices` and any existing
|
|
20
22
|
`afk_slices_remaining` value, including its released bullet form, must each
|
|
21
23
|
be a decimal nonnegative integer. A missing
|
|
22
24
|
`state.md` or malformed configured value fails closed; an omitted cap is the
|
|
@@ -21,3 +21,7 @@ Pack-wide rationalizations and red flags live in
|
|
|
21
21
|
- Writing a `try/catch` block wider than what you handle.
|
|
22
22
|
- A comment that restates what the next line does.
|
|
23
23
|
- Touching files that aren't in `touched-files.md` for "tidiness".
|
|
24
|
+
- A comment, filename, test name, or commit subject that mentions `SLICE-###`,
|
|
25
|
+
a slice number, or "this slice".
|
|
26
|
+
- Committing onto control when the wright returns, or before Independent Build
|
|
27
|
+
review and fail-on-red proof are green.
|
|
@@ -1,28 +1,46 @@
|
|
|
1
|
-
# Checkpoint:
|
|
1
|
+
# Checkpoint: land local WIP only after the check loop is green
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
3
|
+
The wright does not commit onto the control/primary branch. Independent review
|
|
4
|
+
and fail-on-red proof run first; a red or gap finding dispatches another wright.
|
|
5
|
+
Only when that loop is green does the orchestrator land the local unpushed
|
|
6
|
+
`WIP(<slug>):` commit. Same rule for `/rite-build`, `/rite-prove`, `/rite-polish`,
|
|
7
|
+
`/rite-review`, and `/rite-autocomplete`. Never push. `.devrites/CHECKPOINT` is
|
|
8
|
+
not a gate.
|
|
6
9
|
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
|
|
10
|
+
## When (and when not)
|
|
11
|
+
|
|
12
|
+
- **Do:** after Independent Build review (or the phase's independent validators)
|
|
13
|
+
and fail-on-red proof are green, with no open Critical/Important and no repair
|
|
14
|
+
wright still in flight. Serial: git recipe below (skip empty index) or isolated
|
|
15
|
+
FF of a matching `transfer_commit`. Parallel: `devrites-engine parallel
|
|
16
|
+
integrate --apply-to-control` (no second control `git commit`).
|
|
17
|
+
- **Do not:** when a wright returns; before review/proof; with red/gap findings;
|
|
18
|
+
fast-forward an isolated transfer onto control before those checks.
|
|
19
|
+
|
|
20
|
+
A native-worktree `transfer_commit` is transport on the worker branch only.
|
|
21
|
+
|
|
22
|
+
## The commit
|
|
23
|
+
Stage the exact candidate paths from the manifest, each as its own argv.
|
|
10
24
|
Never stage `touched-files.md`, a directory, glob, unrelated path, or user change.
|
|
11
|
-
Verify the staged set, then commit locally
|
|
25
|
+
Verify the staged set, then commit locally.
|
|
26
|
+
|
|
27
|
+
Subject: `WIP(<slug>):` plus an imperative summary of the change (from the
|
|
28
|
+
goal). Never a slice id, `SLICE-###`, a slice number, or "this slice"
|
|
29
|
+
(`WIP(admin-report): add CSV export for usage rows`, not `SLICE-003` or
|
|
30
|
+
`complete slice 3`). Product source, tests, comments, and filenames omit the
|
|
31
|
+
same marks; they stay in `.devrites/` only.
|
|
12
32
|
|
|
13
33
|
```bash
|
|
14
|
-
git commit -m "WIP(<slug>): <
|
|
34
|
+
git commit -m "WIP(<slug>): <imperative summary>" -m "$(cat <<'BODY'
|
|
15
35
|
[devrites-context]
|
|
16
|
-
decisions: <one-line delta this
|
|
17
|
-
remaining: <pending
|
|
18
|
-
dead-ends: <approaches ruled out
|
|
36
|
+
decisions: <one-line delta this work added to decisions.md>
|
|
37
|
+
remaining: <pending count>
|
|
38
|
+
dead-ends: <approaches ruled out, if any>
|
|
19
39
|
BODY
|
|
20
40
|
)"
|
|
21
41
|
```
|
|
22
42
|
|
|
23
|
-
|
|
24
|
-
is staged and the step no-ops. **Local-only:** never push a checkpoint or let
|
|
25
|
-
scratch work trigger CI.
|
|
43
|
+
**Local-only:** never push or let scratch work trigger CI.
|
|
26
44
|
|
|
27
45
|
## Restore
|
|
28
46
|
After a crash, a fresh session may read the last `WIP(<slug>)` body as crash context.
|
|
@@ -36,9 +54,3 @@ WIP commits are scratch and never reach shared history. `/rite-ship` folds them
|
|
|
36
54
|
one atomic feature commit before the Conventional-Commit ladder: see the collapse step in
|
|
37
55
|
[git-ship.md](../../rite-ship/reference/git-ship.md). Result: one clean commit, bisect
|
|
38
56
|
stays green.
|
|
39
|
-
|
|
40
|
-
## Autocomplete
|
|
41
|
-
Checkpoints are unconditional; `/rite-autocomplete` needs no sentinel arming.
|
|
42
|
-
Each wright returns after one slice; HITL stops, while explicit `.devrites/AFK`
|
|
43
|
-
lets the controlling Build root chain another green slice only under its cap
|
|
44
|
-
and pause rules.
|