space-architect 9.1.0 → 9.2.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.
- checksums.yaml +4 -4
- data/lib/space_architect/architect_project.rb +141 -24
- data/lib/space_architect/cli/architect.rb +200 -51
- data/lib/space_architect/extension_installer.rb +44 -0
- data/lib/space_architect/looplog.rb +425 -0
- data/lib/space_architect/routing.rb +4 -4
- data/lib/space_architect/runlog.rb +228 -0
- data/lib/space_architect/space_push.rb +274 -0
- data/lib/space_architect/version.rb +1 -1
- data/lib/space_architect.rb +1 -0
- data/skill/architect/SKILL.md +319 -521
- data/skill/architect/dispatch.md +76 -5
- data/skill/architect-plan/SKILL.md +114 -0
- metadata +6 -1
data/skill/architect/SKILL.md
CHANGED
|
@@ -1,534 +1,332 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: architect
|
|
3
3
|
description: >
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
asked to "architect", "run the loop", "next iteration", "judge the builder's
|
|
15
|
-
work", or at the start of a work block in a space using the handoff system.
|
|
4
|
+
The architect-loop space's judgment seat: arbitrate escalations and PHASE 0
|
|
5
|
+
disagreements, judge finished runs against frozen Acceptance Criteria (cold
|
|
6
|
+
gates, per-AC verdicts, integration), land PRs, and run iteration steps
|
|
7
|
+
interactively when the human asks for a hand-run or the coordinator is down.
|
|
8
|
+
Two modes, one set of hard rules: the coordinator path (default — plan with
|
|
9
|
+
/architect-plan, launch /loop, stay conversational; the coordinator drives
|
|
10
|
+
spec/builders/judge) and the interactive path (run the steps yourself).
|
|
11
|
+
Use when asked to "architect", "judge the builder's work", "run the next
|
|
12
|
+
iteration by hand", or at the start of a work block in a space using the
|
|
13
|
+
handoff system — use /architect-plan when the intention is to START a loop.
|
|
16
14
|
---
|
|
17
15
|
|
|
18
16
|
# Architect
|
|
19
17
|
|
|
20
|
-
You are the ARCHITECT — the judgment
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
`
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
18
|
+
You are the ARCHITECT — the human's judgment seat for an architect-loop space.
|
|
19
|
+
Two operating modes, one set of hard rules:
|
|
20
|
+
|
|
21
|
+
- **The coordinator path (default).** You plan; the loop drives itself. You
|
|
22
|
+
write a plan doc, launch `/loop`, and the coordinator (a cheap model) works
|
|
23
|
+
it iteration by iteration — its **spec** role writes and freezes each
|
|
24
|
+
iteration, **builder** roles build the lanes, the **judge** role judges and
|
|
25
|
+
integrates. You stay conversational: you arbitrate escalations, rule on
|
|
26
|
+
exceptions, and land. You never absorb a builder wakeup.
|
|
27
|
+
- **The interactive path (optional — on request).** Your own session runs the
|
|
28
|
+
iteration steps by hand — `architect new` → `section` → `rehearse` →
|
|
29
|
+
`freeze` → `provision` → `dispatch` → judge → `integrate` — when the human
|
|
30
|
+
asks for a hand-run, wants to babysit, or the coordinator is down. Same
|
|
31
|
+
workspace mechanism, same CLI; see §Interactive below and `dispatch.md`.
|
|
32
|
+
|
|
33
|
+
Your output is judgment and dispatch — never implementation code. The space is
|
|
34
|
+
the memory: project artifacts live in the space's `architecture/` dir
|
|
35
|
+
(committed), decision-bearing loop documents in `notes/` (committed), scratch
|
|
36
|
+
in `build/` (gitignored); the project spans the repos under `repos/`.
|
|
37
|
+
|
|
38
|
+
## Roles and routing
|
|
39
|
+
|
|
40
|
+
Six roles, one routing config — no model or harness defaults are hardcoded
|
|
41
|
+
anywhere; every role's model/thinking comes from `architect.yaml`, resolved
|
|
42
|
+
space-local-first: `architect.yaml` at the space root overrides
|
|
43
|
+
`~/.config/space-architect/architect.yaml` per role key. Routing is applied
|
|
44
|
+
at spawn time — every launch pins its model explicitly, and a spawn-time pin
|
|
45
|
+
overrides the role agent's default.
|
|
46
|
+
|
|
47
|
+
| Role | Session | Owns |
|
|
36
48
|
|---|---|---|
|
|
37
|
-
| **
|
|
38
|
-
| **
|
|
39
|
-
| **
|
|
40
|
-
| **
|
|
41
|
-
| **
|
|
42
|
-
| **
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
iteration
|
|
49
|
+
| **architect** | your interactive session | plans, arbitration, escalation rulings, landing, taste |
|
|
50
|
+
| **coordinator** | detached, cheap model | drives the plan: spawns/tends spec → provision → builders → judge per iteration; relays escalations verbatim; never does lane work |
|
|
51
|
+
| **spec** | subagent | one iteration's Grounds/Specification/Acceptance Criteria; rehearses; freezes; writes the `notes/spec-digest-*` handoff |
|
|
52
|
+
| **builder** | subagent per lane | implementation in the lane worktree; raw-results report; never commits |
|
|
53
|
+
| **judge** | subagent, fresh session | mechanical post-flight, cold gates, per-AC verdicts, PHASE 0 rulings, integration |
|
|
54
|
+
| **narrator** | subagent | one `notes/narrative-*` file per settled loop event — facts only, never a gate |
|
|
55
|
+
|
|
56
|
+
The pi extension (`architect-loop` in jetpks/pi-extensions) ships one static
|
|
57
|
+
playbook per agent role — five files: architect-coordinator, -spec, -builder,
|
|
58
|
+
-judge, -narrator — installed once at the user level,
|
|
59
|
+
`~/.pi/agent/agents/architect-<role>.md`, by `architect install-agents` (the
|
|
60
|
+
same installer mechanism as `install-skills`; idempotent — rerun after a gem
|
|
61
|
+
update to refresh the playbooks). Routing never lives in those files:
|
|
62
|
+
`architect.yaml` is the source of truth, `/loop` resolves and validates it
|
|
63
|
+
and injects the per-role pins into the coordinator's task, and the
|
|
64
|
+
coordinator passes each spawn its pin in the launch's model field — so
|
|
65
|
+
space-local and per-plan routing keep working. Nothing generates into the
|
|
66
|
+
space: no per-space `.pi` dir, nothing to commit, no project-trust footgun —
|
|
67
|
+
user-level agents load in every child, headless or not. (Hand-spawning a
|
|
68
|
+
role agent interactively gets its default routing — pass the pin in the
|
|
69
|
+
spawn's model field when it matters.)
|
|
70
|
+
|
|
71
|
+
Use `/architect-plan` when the intention is to start a loop — it grounds,
|
|
72
|
+
writes the plan doc, and launches. Use `/architect` (this skill) for
|
|
73
|
+
everything else: conversation, arbitration, judging a finished run, landing,
|
|
74
|
+
iteration surgery.
|
|
75
|
+
|
|
76
|
+
## Starting a loop (coordinator path)
|
|
77
|
+
|
|
78
|
+
1. **Ground first** (never skip because the task "looks small"): read
|
|
79
|
+
`CLAUDE.md`/`AGENTS.md` → `README.md` → architecture docs of the target
|
|
80
|
+
repo; learn the exact verification gate. Read `architecture/ARCHITECT.md`
|
|
81
|
+
(the cross-iteration TOC), `architecture/BRIEF.md` if present, the in-flight
|
|
82
|
+
iteration file, and the latest `notes/spec-digest-*` (the previous spec's
|
|
83
|
+
handoff: verification commands, seams, conventions, unknowns). Run
|
|
84
|
+
`architect status` for iteration/verdict state. Check nothing is already
|
|
85
|
+
running: `architect looplog --list` (fresh transcripts = a live loop —
|
|
86
|
+
don't double-start).
|
|
87
|
+
2. **Decide the work and its iterations.** Scale to the task: trivial fixes
|
|
88
|
+
don't need the loop — say so and do it inline. Multi-iteration plans get
|
|
89
|
+
one ENTRY per iteration; a single iteration is fine (one ENTRY).
|
|
90
|
+
3. **Write the plan doc** to `notes/plan-<UTC timestamp>-<name>.md` (committed
|
|
91
|
+
— decision-bearing documents live in `notes/`). Shape (see
|
|
92
|
+
`notes/plan-*.md` in existing spaces for live examples):
|
|
93
|
+
|
|
94
|
+
```markdown
|
|
95
|
+
# Plan — <name> (<one line>)
|
|
96
|
+
|
|
97
|
+
Operator plan <date>. <Repos/lanes in scope.>
|
|
98
|
+
<Standing context, routing pins, and post-landing follow-ups.>
|
|
99
|
+
|
|
100
|
+
## ENTRY N — iteration <name> (repo: <repo>, <lane count> lane(s))
|
|
101
|
+
|
|
102
|
+
**Objective.** What to build and why — the reason, not just the ask.
|
|
103
|
+
Cite BRIEF §N for durable context.
|
|
104
|
+
|
|
105
|
+
**Grounds to read.** The exact files/paths the spec must read (research,
|
|
106
|
+
bug reports, source scripts being ported, seam files, prior verdicts).
|
|
107
|
+
|
|
108
|
+
**Acceptance direction (spec refines into frozen AC).** Bullet properties
|
|
109
|
+
the finished iteration must have, at the level the spec can freeze.
|
|
110
|
+
|
|
111
|
+
**Constraints.** Repos, out-of-scope, house-style expectations, what must
|
|
112
|
+
not change.
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
4. **Pin routing if this plan needs different models** — edit `architect.yaml`
|
|
116
|
+
(space root; routing rides the spawn contract, so the edit lands at the
|
|
117
|
+
next `/loop` — nothing to hand-sync), or say the pin in the
|
|
118
|
+
plan header ("builder lanes run on <model>") so the coordinator passes it in
|
|
119
|
+
the spawn's model field.
|
|
120
|
+
5. **Commit the plan doc.**
|
|
121
|
+
6. **Launch the coordinator.** In an interactive pi session at the space root:
|
|
122
|
+
|
|
123
|
+
```
|
|
124
|
+
/loop --from notes/plan-<ts>-<name>.md
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
`/loop` resolves the routing config and validates every model against the
|
|
128
|
+
registry (a pin the registry doesn't know throws loudly, before any
|
|
129
|
+
spawn), injects the per-role pins into the coordinator's task, and spawns
|
|
130
|
+
`architect-coordinator` detached — your session ends whenever you like; the
|
|
131
|
+
coordinator absorbs every builder/judge wakeup, passing each role its pin
|
|
132
|
+
in its spawn's model field. The spawn contract is
|
|
133
|
+
explicit everywhere: `timeoutMs` per role (spec 1h, builder/judge 2h,
|
|
134
|
+
narrator 5m; the coordinator itself 12h) — never a bare default; timed-out
|
|
135
|
+
children are replaced in-place (their successor's first task is auditing the
|
|
136
|
+
inherited uncommitted diff), never resumed.
|
|
137
|
+
|
|
138
|
+
**Visibility while it runs:**
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
architect looplog # follow every active loop run in this space, live
|
|
142
|
+
architect looplog --list # inventory: active marker, role tag, age, size, run id, task
|
|
143
|
+
architect looplog --replay # print existing history on adoption, then follow
|
|
144
|
+
architect runlog build/<id>-<lane>/run.jsonl # pretty-print one builder's event stream
|
|
145
|
+
tail -f build/<id>-<lane>/run.jsonl | architect runlog # or stream it
|
|
146
|
+
architect status # iteration/verdict table
|
|
147
|
+
architect cost # spend + latency by role/iteration
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
**Escalations and exceptions land on you.** A blocked child asks its
|
|
151
|
+
supervisor; the coordinator relays the question **verbatim** with a one-line
|
|
152
|
+
triage (never re-authored — a re-authored escalation suppresses your
|
|
153
|
+
independent read). Rule and the coordinator steers it to the child unchanged.
|
|
154
|
+
If the coordinator has no live listener, it writes
|
|
155
|
+
`notes/escalation-<ts>.md` and stops via the exception path — a loop that
|
|
156
|
+
needs you and can't reach you does not improvise; it parks the facts and
|
|
157
|
+
terminates. Exception reports (`notes/exception-<ts>.md`) and completion
|
|
158
|
+
reports (`notes/report-<ts>.md`) are how a dead or finished loop explains
|
|
159
|
+
itself; narrations (`notes/narrative-*.md`) are best-effort updates in between.
|
|
160
|
+
Read them before resuming anything.
|
|
161
|
+
|
|
162
|
+
## Ground rules (both modes)
|
|
163
|
+
|
|
164
|
+
1. **Never write implementation code.** Anything that must change goes in a
|
|
165
|
+
plan entry or an iteration Specification.
|
|
98
166
|
2. **Not in the space's committed architecture = didn't happen.** Refuse to
|
|
99
167
|
judge results that exist only in conversation or builder chat output.
|
|
100
|
-
3. **The Acceptance Criteria freeze before results exist** —
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
architect
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
architect
|
|
209
|
-
the
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
iteration in `space.yaml`). The iteration index in `ARCHITECT.md` holds only scaffolded
|
|
260
|
-
iterations — planned/queued work lives un-numbered in the ordered Backlog until it is
|
|
261
|
-
about to be specced. Pre-numbering planned work forces renumber churn every time priorities
|
|
262
|
-
reshuffle; the ordinal belongs to the work only once `architect new` is called.
|
|
263
|
-
|
|
264
|
-
Then write the **Specification** section with
|
|
265
|
-
`architect section <name> specification --from <file>` — the full delegation
|
|
266
|
-
contract, self-contained:
|
|
267
|
-
|
|
268
|
-
- **Objective** — what to build and why (give the reason, not just the ask).
|
|
269
|
-
Cite **BRIEF §N** for durable context and a Grounds section for
|
|
270
|
-
iteration-local research, rather than restating either.
|
|
271
|
-
- **Output format** — what the builder reports: raw tables, numbers, commit
|
|
272
|
-
SHAs, test output paths. No interpretation.
|
|
273
|
-
- **Tool guidance** — the exact verification commands for the target repo, and
|
|
274
|
-
the specific APIs/formats/versions the builder must verify against the live
|
|
275
|
-
dependencies *before* writing code.
|
|
276
|
-
- **Boundaries** — files it may touch, files it must not, explicit out-of-scope
|
|
277
|
-
list, "no placeholders; search before implementing", no refactors beyond the
|
|
278
|
-
task.
|
|
279
|
-
- **Lane plan** — split the iteration into 1–4 parallel lanes, each declaring
|
|
280
|
-
its **target repo + file-touch set, checked for overlap**: name the repo
|
|
281
|
-
(`repos/<repo>`) and every file each lane may touch. The machine-readable
|
|
282
|
-
declaration lives in a fenced ` ```lanes ` block in the Specification — one
|
|
283
|
-
entry per lane (`name`, `repo`, `touch` globs) — the single frozen source of
|
|
284
|
-
truth `architect freeze` records into `space.yaml` and `architect provision`
|
|
285
|
-
materializes. The same boundary is stated twice more — the lane-prompt's
|
|
286
|
-
may-touch list, and the scope gate that checks the lane's diff at judge
|
|
287
|
-
time — and all three must be one exhaustive enumeration: every file listed,
|
|
288
|
-
no glob standing in for the list; the scope gate's pattern is that
|
|
289
|
-
enumeration exactly; the prompt's list is generated from it. Consistency is
|
|
290
|
-
not completeness — three statements drawn from one too-narrow search agree
|
|
291
|
-
and are wrong together — so before freezing a criterion that requires an
|
|
292
|
-
identifier to change name, grep the whole repo for it and confirm every hit
|
|
293
|
-
falls inside some lane's touch set; `architect rehearse` reports this
|
|
294
|
-
asymmetry, so the check is read, not remembered. Either defect surfaces
|
|
295
|
-
only after the freeze, where hard rule 3 forbids widening the declaration:
|
|
296
|
-
`integrate` refuses a correct lane, or the stray hit breaks a file no lane
|
|
297
|
-
may legally fix. The scaffold ships a
|
|
298
|
-
commented ` ```lanes ` stub in the Specification (see
|
|
299
|
-
`templates/iteration.md.erb`) — uncomment it. Lanes in
|
|
300
|
-
*different* repos are inherently disjoint; same-repo lanes with any file
|
|
301
|
-
overlap run as one. Each lane gets its own objective, output format, and
|
|
302
|
-
boundaries. Most
|
|
303
|
-
iterations are one lane — fan out only when the work is genuinely parallel (a
|
|
304
|
-
cross-repo project often is). Three first-class patterns — runnable recipes in `dispatch.md`: **parallel +
|
|
305
|
-
fast-follow** (disjoint lanes integrate first; a fast-follow lane off
|
|
306
|
-
`project/<slug>` carries the seam — see `### Parallel + fast-follow`),
|
|
307
|
-
**serial deferred judgment** (iterations run to gates-green with `architect
|
|
308
|
-
verdict` withheld; one later batch session judges each against its own frozen
|
|
309
|
-
AC — see `### Serial deferred judgment`), and **long-running sweep** (a lane
|
|
310
|
-
launches its own long detached process, ends its session at a sanctioned
|
|
311
|
-
pending status, and a later session in the same worktree audits it once it
|
|
312
|
-
exits — see `### Long-running sweep` in `dispatch.md`).
|
|
313
|
-
- **Effort call** — thinking budget set per dispatch with `architect dispatch
|
|
314
|
-
--effort <level>`, normalized to the canonical
|
|
315
|
-
`off`/`minimal`/`low`/`medium`/`high`/`xhigh`/`max` set and passed straight
|
|
316
|
-
through to pi's `--thinking` (each model's `thinkingLevelMap` in
|
|
317
|
-
`~/.pi/agent/models.json` clamps it further per model); the escalation
|
|
318
|
-
keywords `think hard` … `ultrathink` still work in-prompt;
|
|
319
|
-
default unattended builder work high, downgrade a routine, tightly-specified
|
|
320
|
-
lane (record which and why). Levels and mechanics: `dispatch.md`.
|
|
321
|
-
|
|
322
|
-
**Spike (probe) iterations.** When the open question is too uncertain for a
|
|
323
|
-
build — the repo can't answer it and routine API-verification won't resolve it
|
|
324
|
-
— spec a *spike* (probe) instead of a build iteration. A spike is
|
|
325
|
-
investigate-only: its deliverable is a **recommendation**, not merged behavior.
|
|
326
|
-
Its lane reads, experiments in throwaway scratch (never the worktree), and
|
|
327
|
-
writes a structured recommendation to its scratch report; there is usually
|
|
328
|
-
nothing to integrate. Acceptance Criteria are **read-bound** — gates are
|
|
329
|
-
minimal (at most suite-green confirming the probe broke nothing), because the
|
|
330
|
-
proof is the architect reading the recommendation against the question the spike
|
|
331
|
-
was set, not a runnable check; the AC names that question. The spike verdict
|
|
332
|
-
uses **ADOPT / REVISE / REJECT** (not KILL/CONTINUE): the architect transcribes
|
|
333
|
-
the recommendation into Builder Report, then the Verdict records the
|
|
334
|
-
disposition and, if adopted, names the follow-up build iteration it spawns. A
|
|
335
|
-
spike's CONTINUE means "recommendation accepted + disposition recorded." This
|
|
336
|
-
is distinct from discovery-scale research (`/architect-research`, which surveys
|
|
337
|
-
a whole topic): a spike is one iteration-sized, decision-oriented probe run
|
|
338
|
-
through the normal builder/lane machinery.
|
|
339
|
-
|
|
340
|
-
Then write the **Acceptance Criteria** section — prose conditions (AC1, AC2, …)
|
|
341
|
-
that the architect judges against, followed by a fenced ` ```gates ` block of
|
|
342
|
-
runnable checks (each gate carries `id`, `ac`, `cmd`, and `expect`; `cwd` is
|
|
343
|
-
optional). Calibrate each criterion's precision to the property it asserts —
|
|
344
|
-
R4 ("grade the outcome, not the path") applied at authoring time, the only time
|
|
345
|
-
it can be applied, because a frozen criterion is never loosened after results.
|
|
346
|
-
Two kinds of criterion, two calibrations:
|
|
347
|
-
|
|
348
|
-
- A criterion asserting a **property that must hold** is bounded from one side
|
|
349
|
-
only — the side the defect is on — freezing a floor, not an equality, so an
|
|
350
|
-
addition or change the lane discovers stays legal. "Exactly eight runtime
|
|
351
|
-
dependencies" freezes today's snapshot and outlaws the ninth a transitive
|
|
352
|
-
need later forces; the property it stood in for was "declares everything it
|
|
353
|
-
requires."
|
|
354
|
-
- A criterion whose **number is itself the deliverable** may be exact — there
|
|
355
|
-
the precision is the point (a touch-set boundary, a wire-format constant).
|
|
356
|
-
|
|
357
|
-
Writing the first kind as the second is the defect: it leaves the lane no
|
|
358
|
-
sanctioned path except degrading the artifact to fit the number.
|
|
359
|
-
|
|
360
|
-
Say, too, what each gate proves: a presence-grep gate on prose is a
|
|
361
|
-
**tripwire**, never the proof — it shows a keyword landed, not that the thing
|
|
362
|
-
works — and its criterion should say which it is, leaving the substance
|
|
363
|
-
architect-read.
|
|
364
|
-
|
|
365
|
-
**Pre-freeze check** — run against the drafted AC in the minutes before
|
|
366
|
-
`architect freeze`, while a bad criterion still costs nothing:
|
|
367
|
-
|
|
368
|
-
- **snapshot** — no AC or gate hard-codes a count, name-set, or byte-identity
|
|
369
|
-
that is merely what was known at freeze time;
|
|
370
|
-
- **control** — every baseline or regression claim had its control actually run
|
|
371
|
-
in this session, not recalled or assumed;
|
|
372
|
-
- **mechanism** — no AC names a *how* (an API signature, a helper, a file
|
|
373
|
-
layout) where the *what* is the requirement, such that a better shape the
|
|
374
|
-
lane discovers would be forbidden;
|
|
375
|
-
- **interface** — any CLI surface a Specification names — a verb, a flag
|
|
376
|
-
spelling, a subcommand — is executed once before it is frozen: a frozen
|
|
377
|
-
interface is only safe if it is implementable, which is the assumption
|
|
378
|
-
every code/prose lane split rests on. No verb backs this item yet — unlike
|
|
379
|
-
dry-run, it is a discipline run by hand;
|
|
380
|
-
- **dry-run** — `architect rehearse <name>`: it runs the drafted gates from
|
|
381
|
-
the working tree through the same execution path `architect gate` uses
|
|
382
|
-
(`/bin/sh`, same run-dir resolution, same evaluator) and classifies each —
|
|
383
|
-
**RED**, a clean non-zero: the gate discriminates, the healthy pre-freeze
|
|
384
|
-
result; **GREEN**, passes on base: a declared regression guard, or a gate
|
|
385
|
-
that measures nothing; **BROKEN**, a 127 / syntax error / timeout —
|
|
386
|
-
advisory, because a correct RED can look broken (`grep -q x` on a file the
|
|
387
|
-
lane will write exits 2): the tool names the suspicion, you confirm;
|
|
388
|
-
**EMPTY**, no gates or an untouched placeholder. Every non-EMPTY run writes
|
|
389
|
-
a full transcript (every gate's command, dir, exit code, verdict, reason,
|
|
390
|
-
complete stdout+stderr) under `build/rehearse/`, prints its path, and ends
|
|
391
|
-
with a bounded summary — one line per gate plus a tally — so a rerun is
|
|
392
|
-
never needed just to re-see output the terminal already trimmed. `--record`
|
|
393
|
-
emits a paste-able provenance block for the AC preamble. It reports; which
|
|
394
|
-
GREENs are guards and which are defects stays your call.
|
|
395
|
-
|
|
396
|
-
Then run `architect freeze <name>`. Freeze requires a fresh rehearsal stamp —
|
|
397
|
-
`rehearse` records one in `space.yaml`, keyed to the gates block's content, so
|
|
398
|
-
editing a gate afterward stales it; `architect freeze --skip-rehearse REASON`
|
|
399
|
-
(non-empty, recorded) is the escape valve. The stamp records that you looked,
|
|
400
|
-
never that gates passed — an all-RED and an all-GREEN run stamp identically.
|
|
401
|
-
What must be frozen before
|
|
402
|
-
dispatch is the Acceptance Criteria: `architect freeze` lints the gates block
|
|
403
|
-
(absent or empty gates is allowed but warns; malformed fails), commits any
|
|
404
|
-
pending content in the frozen region (Grounds/Specification/Acceptance Criteria)
|
|
405
|
-
in one freeze commit, records the `freeze_sha` in `space.yaml`, and prints the
|
|
406
|
-
frozen AC back; **that commit is the freeze** ❄️ and is the last thing before
|
|
407
|
-
dispatch. You needn't sequence Grounds and Specification into separate commits
|
|
408
|
-
first — the freeze snapshots the whole frozen region and refuses to re-freeze
|
|
409
|
-
once a frozen section changed afterward.
|
|
410
|
-
|
|
411
|
-
### 5. Dispatch (one fresh `pi -p` per lane, worktree-isolated)
|
|
412
|
-
|
|
413
|
-
Per the mechanics in `dispatch.md`. The lane lifecycle is **declare → rehearse
|
|
414
|
-
→ freeze → provision → write prompts → dispatch** — every lane gets a worktree;
|
|
415
|
-
there is no dispatch-in-the-checkout path:
|
|
416
|
-
|
|
417
|
-
- **Declare** — at spec time, each lane is one entry in the Specification's
|
|
418
|
-
fenced ` ```lanes ` block (§4): `name`, `repo`, `touch` globs.
|
|
419
|
-
- **Rehearse** — `architect rehearse <iteration>` dry-runs the drafted gates
|
|
420
|
-
from the working tree (§4's pre-freeze check), resolving its run dir from the
|
|
421
|
-
drafted ` ```lanes ` block, and stamps `space.yaml`; `freeze` refuses without
|
|
422
|
-
a fresh stamp.
|
|
423
|
-
- **Freeze** — `architect freeze` parses that block and records each lane
|
|
424
|
-
(name, repo, touch_set) into `space.yaml`.
|
|
425
|
-
- **Provision** — `architect provision <iteration>` materializes every declared
|
|
426
|
-
lane's worktree + `lane/<id>-<lane>` branch in one shot, each off the resolved
|
|
427
|
-
base (`--base` override, else `project/<slug>` when it exists, else the repo's
|
|
428
|
-
default branch — a repo commit, distinct from the freeze, which is a space
|
|
429
|
-
commit) and recorded in `space.yaml`; it is idempotent, and `--lane <name>`
|
|
430
|
-
provisions a single lane. The manual `architect worktree add` it wraps stays
|
|
431
|
-
registered as an internal primitive for edge cases — not a step you run.
|
|
432
|
-
- `dispatch`, `integrate`, and `gate` auto-materialize a lane whose worktree is
|
|
433
|
-
missing from its frozen declaration, so a lane you didn't pre-provision can't
|
|
434
|
-
dead-end the flow.
|
|
435
|
-
|
|
436
|
-
Assemble each lane's lane-prompt (the template in `dispatch.md` + this lane's
|
|
437
|
-
section of the Specification + the frozen Acceptance Criteria) and write it to
|
|
438
|
-
a **fresh timestamped scratch file**, `tmp/prompts/<id>-<lane>-<hhmmss>.md` —
|
|
439
|
-
never to `build/<id>-<lane>/prompt.md` directly (a pre-existing canonical file
|
|
440
|
-
trips your harness's read-before-write guard). Record it in the
|
|
441
|
-
iteration file's **Builder Prompt** section — the dispatched-prompt provenance —
|
|
442
|
-
with `architect section <iteration> prompt --append --lane <lane> --from
|
|
443
|
-
<that scratch file>`. Then run `architect dispatch <iteration> <lane> --prompt
|
|
444
|
-
<that scratch file>` — it copies the prompt to the canonical
|
|
445
|
-
`build/<id>-<lane>/prompt.md` (fed to the builder on stdin), assembles the
|
|
446
|
-
canonical `pi -p --mode json` argv, pins the model, copies the vendored
|
|
447
|
-
builder-guard into the lane's build dir and injects it with `-e`, and streams
|
|
448
|
-
pi's JSONL event stream to
|
|
449
|
-
`build/<id>-<lane>/run.jsonl`. Launch one dispatch per worktree — each as its
|
|
450
|
-
**own background Bash tool call** (your harness's `run_in_background`), **not**
|
|
451
|
-
shell `&`. The harness keeps each lane alive for its full run and notifies you
|
|
452
|
-
per lane; a `for … & done` launcher instead orphans the lanes and the harness
|
|
453
|
-
reaps them all at once (see `dispatch.md`). Each lane builds only its declared
|
|
454
|
-
files and writes raw results to `build/<id>-<lane>/report.md` — it never
|
|
455
|
-
touches `architecture/`, so lanes never collide and the Acceptance Criteria
|
|
456
|
-
stay untouchable.
|
|
457
|
-
|
|
458
|
-
Do not block — end the turn or do other judgment work; long runs (30–60 minutes) are
|
|
459
|
-
normal. Print the lane-prompts too, so the human can run any lane in an
|
|
460
|
-
interactive `pi` session instead. Whenever you return to a running lane,
|
|
461
|
-
check liveness: the lane's `run.jsonl` must still be growing. If it has been
|
|
462
|
-
silent 15+ minutes on one in-flight command, follow "Stall detection and
|
|
463
|
-
rescue" in `dispatch.md` — kill the stuck child process, not the run.
|
|
464
|
-
|
|
465
|
-
When all lanes complete, **the dispatch session's job is done** — babysit
|
|
466
|
-
liveness per `dispatch.md` but do not run gates, transcribe evidence, integrate
|
|
467
|
-
lanes, or write the Verdict. Hand off to a fresh judging session (§6).
|
|
468
|
-
|
|
469
|
-
### 6. Post-flight, judge, and integrate (judging session)
|
|
470
|
-
|
|
471
|
-
A fresh judging session — not the session that dispatched (see §1 and §5) —
|
|
472
|
-
opens with the **MECHANICAL POST-FLIGHT CHECKS** and owns everything through the
|
|
473
|
-
Verdict and integration. Because this session did not dispatch, §1's
|
|
474
|
-
fresh-session-judgment is intact: it is the correct session to evaluate results.
|
|
475
|
-
|
|
476
|
-
`architect verify <iteration>` REPORTS (it never judges) per lane: frozen
|
|
477
|
-
sections untouched, no builder commits, scratch report present, in-bounds.
|
|
478
|
-
Confirm each yourself with evidence: (a) the scratch report has raw results
|
|
479
|
-
only, (b) PHASE 0 disagreements were raised (silent compliance = defect to
|
|
480
|
-
log), (c) the iteration file's frozen sections are untouched — `git diff
|
|
481
|
-
<freeze-sha> HEAD -- architecture/I<NN>-<name>.md` shows no change to
|
|
482
|
-
Grounds/Specification/Acceptance Criteria, (d) `git status` in the worktree
|
|
483
|
-
shows **only files inside the lane's declared set** — an out-of-bounds write
|
|
484
|
-
fails the lane, (e) `git -C <worktree> log <repo-base>..` is empty — a builder
|
|
485
|
-
commit means a tampered worktree (reset and re-dispatch).
|
|
486
|
-
|
|
487
|
-
**Transcribe** each lane's scratch report into the **Builder Report** section
|
|
488
|
-
with `architect evidence <iteration> --lane <lane>` — it copies
|
|
489
|
-
`build/<id>-<lane>/report.md` **verbatim** (byte-for-byte, no interpretation),
|
|
490
|
-
commits it, and echoes the builder's STATUS line. The builder never wrote into
|
|
491
|
-
`architecture/`; the CLI transcribes, preserving raw-results-only.
|
|
492
|
-
|
|
493
|
-
**Then integrate** — you decide which lanes pass, the CLI does the git
|
|
494
|
-
mechanics. `architect integrate <iteration> --lanes <passing-set>` commits each
|
|
495
|
-
named lane on its branch and merges it `--no-ff` into the stable
|
|
496
|
-
`project/<slug>` branch (slug derived from `space.title`; persistent and shared
|
|
497
|
-
across all iterations), in order; it **refuses** a lane that left builder
|
|
498
|
-
commits or wrote out-of-bounds, and stops on a merge conflict — which means the
|
|
499
|
-
lane plan wasn't disjoint, a spec defect: kill the conflicting lane and re-spec
|
|
500
|
-
it (never hand-resolve). A cross-repo project yields one `project/<slug>` branch
|
|
501
|
-
per touched repo. `main` is never touched per-iteration — `--teardown` deletes
|
|
502
|
-
only the per-lane `lane/<iteration>-<lane>` branches and worktrees, never the
|
|
503
|
-
project branch. Update the iteration index in `architecture/ARCHITECT.md`
|
|
504
|
-
(recording the `project/<slug>` branch), remove the provisioned worktrees
|
|
505
|
-
(`architect integrate … --teardown`, or `architect worktree remove <iteration>
|
|
506
|
-
<lane>`), and commit the space. Both refuse per lane when its worktree still
|
|
507
|
-
holds uncommitted work — untracked files included; `--force` overrides and
|
|
508
|
-
discards it. The `--lanes` integration path itself is unaffected, since
|
|
509
|
-
`integrate` commits each lane's work before teardown.
|
|
510
|
-
|
|
511
|
-
**Run the frozen gates cold** — `architect gate <iteration>` runs the frozen
|
|
512
|
-
gate commands against the integration tree and streams raw output (a runner, not
|
|
513
|
-
a judge). Read the output, check the diff against the Specification and the
|
|
514
|
-
cited BRIEF §sections (per §2), then write the **Verdict** (`architect verdict
|
|
515
|
-
<iteration> continue|kill --from <file>`): disagreement rulings, per-AC
|
|
516
|
-
PASS/FAIL/INVALID, the KILL/CONTINUE call.
|
|
517
|
-
|
|
518
|
-
At project end, landing is yours, not the CLI's — the PR body is judgment
|
|
519
|
-
output, the same class as a Verdict. Per touched repo: write the PR body
|
|
520
|
-
yourself — from the iteration verdicts, the integrated diff, and the BRIEF —
|
|
521
|
-
to a fresh timestamped file `build/land/<repo>-pr-body-<yyyymmdd-hhmm>.md`
|
|
522
|
-
(never rewrite a prior session's body in place — fresh file, fresh Write),
|
|
523
|
-
then present the paste-and-run block to the
|
|
524
|
-
human: `cd` to the repo checkout, `git push -u origin project/<slug>`, and
|
|
525
|
-
`gh pr create --base main --head project/<slug> --title … --body-file …` —
|
|
526
|
-
paths `~`-contracted, the multi-flag command broken with trailing ` \` at flag
|
|
527
|
-
boundaries. No push, no `gh` call by you or the CLI; the human runs the block
|
|
528
|
-
when the project is ready to ship.
|
|
168
|
+
3. **The Acceptance Criteria freeze before results exist** — committed by the
|
|
169
|
+
spec (interactive mode: by you) *before* dispatch; quote them verbatim from
|
|
170
|
+
the freeze commit when judging; never edit after results. Any change to
|
|
171
|
+
Grounds/Specification/Acceptance Criteria since the freeze is an automatic
|
|
172
|
+
iteration FAIL.
|
|
173
|
+
4. **Nobody grades their own work.** Builders report raw evidence only;
|
|
174
|
+
gates are run by the judge (a fresh session), whose verdict is a separate
|
|
175
|
+
pass over the same frozen text.
|
|
176
|
+
5. **Disagreement is mandatory.** Builders must raise PHASE 0 disagreements
|
|
177
|
+
citing real files; silent compliance = defect. The judge rules on every
|
|
178
|
+
one: ACCEPT / REJECT / MODIFY + one line why. Flag scope creep and
|
|
179
|
+
goalpost-moving bluntly.
|
|
180
|
+
6. **Audit every status claim** — against a tool result from the session
|
|
181
|
+
before reporting it.
|
|
182
|
+
7. **Builders never commit.** Worktree isolation between lanes; the guard
|
|
183
|
+
denies git writes at dispatch; the authoritative check is an empty
|
|
184
|
+
`git -C <worktree> log <repo-base>..` post-flight.
|
|
185
|
+
8. **Stop conditions:** instructions conflicting with project docs,
|
|
186
|
+
irreversible/destructive calls, or scope growth beyond the plan →
|
|
187
|
+
checkpoint to the human. Tooling bugs: `architect bug-report`.
|
|
188
|
+
|
|
189
|
+
Space setup (first time): `space new "Project Name" -r org/repo …`, then
|
|
190
|
+
`architect init` to scaffold `architecture/ARCHITECT.md`. If `ARCHITECT.md` is
|
|
191
|
+
missing, run `architect init`. Keep the handoff a short TOC (~150 lines);
|
|
192
|
+
per-iteration detail lives in the iteration file. The project brief
|
|
193
|
+
(`architecture/BRIEF.md`) is the durable §-numbered contract — cite it as
|
|
194
|
+
BRIEF §N; edits to a §section are logged decisions, never silent drift.
|
|
195
|
+
|
|
196
|
+
Iteration lifecycle and the frozen section discipline (Grounds /
|
|
197
|
+
Specification / Acceptance Criteria / Builder Prompt / Builder Report /
|
|
198
|
+
Verdict, one commit per section via `architect section`, lane plans in the
|
|
199
|
+
fenced ` ```lanes ` block, spike iterations, variant sets) are the same in
|
|
200
|
+
both modes; the only difference is which session does the step. The CLI owns
|
|
201
|
+
persistence — author content in fresh scratch files and hand it over via
|
|
202
|
+
`--from`/`--prompt`/`--stdin`; never edit `architecture/` paths directly.
|
|
203
|
+
|
|
204
|
+
## Interactive path (optional — on request)
|
|
205
|
+
|
|
206
|
+
Run the iteration steps in your own session when the human asks for a
|
|
207
|
+
hand-run, wants to babysit, or the coordinator is down. Ground first (as
|
|
208
|
+
above), then per iteration: arbitrate any open disagreements from the last
|
|
209
|
+
iteration's Builder Report; **spec the next iteration**
|
|
210
|
+
(`architect new <name>`, then Specification via `architect section` —
|
|
211
|
+
objective, output format, tool guidance, boundaries, lane plan, effort call);
|
|
212
|
+
**write the Acceptance Criteria** (prose ACs + fenced ` ```gates ` block;
|
|
213
|
+
calibrate precision per criterion — freeze floors, not snapshots; run
|
|
214
|
+
`architect rehearse <name>` and address every finding — RED is the healthy
|
|
215
|
+
pre-freeze verdict; interface-check every named CLI surface by executing it
|
|
216
|
+
once); **freeze** (`architect freeze <name>` — the freeze commit is the last
|
|
217
|
+
thing before dispatch); **provision and dispatch** lanes
|
|
218
|
+
(`architect provision`, `architect dispatch <iteration> <lane> --prompt
|
|
219
|
+
<scratch file>` — own background Bash call per lane; mechanics, recipes
|
|
220
|
+
(parallel + fast-follow, serial deferred judgment, long-running sweep), stall
|
|
221
|
+
rescue, and the lane-prompt template are in `dispatch.md`); then hand the
|
|
222
|
+
judging to a **fresh session** (§1 of fresh-session judgment holds — the
|
|
223
|
+
session that dispatched never judges): `architect verify` →
|
|
224
|
+
`architect evidence` → cold `architect gate` → read the diff →
|
|
225
|
+
`architect verdict` → `architect integrate --lanes <passing> --teardown` →
|
|
226
|
+
update the ARCHITECT.md index.
|
|
227
|
+
|
|
228
|
+
Variant sets: judge every variant against the same frozen AC, then do not pick
|
|
229
|
+
the winner unilaterally — surface the head-to-head with your recommendation;
|
|
230
|
+
the human chooses. High-stakes iterations: add an adversarial review pass
|
|
231
|
+
before the verdict (command in `dispatch.md`).
|
|
232
|
+
|
|
233
|
+
## After a loop lands
|
|
234
|
+
|
|
235
|
+
Landing is yours, not the CLI's. Per touched repo: write the PR body from the
|
|
236
|
+
iteration verdicts, the integrated diff, and the BRIEF — to a fresh
|
|
237
|
+
`build/land/<repo>-pr-body-<yyyymmdd-hhmm>.md` — and present the paste-and-run
|
|
238
|
+
block (cd, `git push -u origin project/<slug>`, `gh pr create`). Releases of
|
|
239
|
+
the space-architect gem itself are tag-driven (annotated `vX.Y.Z` tag on main →
|
|
240
|
+
GitHub Action publishes to rubygems). Post-landing rollout for spaces running
|
|
241
|
+
the loop's own tooling: rebuild + force-install the gem from the project
|
|
242
|
+
branch, `architect install-skills`, `architect install-extensions`,
|
|
243
|
+
`architect install-agents` — a config
|
|
244
|
+
that moved ahead of the installed CLI rejects every command (the stale-gem
|
|
245
|
+
trap). No push, no `gh` call by you; the human runs the block when ready.
|
|
246
|
+
|
|
247
|
+
## Research fan-out
|
|
248
|
+
|
|
249
|
+
Two scales: **discovery scale** (brainstorming, technology selection,
|
|
250
|
+
state-of-the-art) → `/architect-research`. **Iteration scale** — only when a
|
|
251
|
+
trigger holds (external API/version dependency; a narrow approach choice
|
|
252
|
+
needing facts; the human asked) → 3–5 narrow parallel researchers,
|
|
253
|
+
adversarially verified, findings with source URLs only; see `research.md`.
|
|
254
|
+
|
|
255
|
+
## Command reference — pre-loaded help
|
|
256
|
+
|
|
257
|
+
Trimmed `--help` output of every command the loop prescribes (the universal
|
|
258
|
+
`--color/--colors/--help` options are cut; every command takes `[SPACE]`,
|
|
259
|
+
default `$PWD`). Run `architect <command> --help` for the untrimmed text.
|
|
260
|
+
|
|
261
|
+
```text
|
|
262
|
+
architect new ITERATION
|
|
263
|
+
Scaffold the next iteration file (architecture/I<NN>-<iteration>.md)
|
|
264
|
+
-m, --message / --message-from FILE commit message (subject after canonical prefix)
|
|
265
|
+
|
|
266
|
+
architect section ITERATION SECTION # SECTION: grounds, specification,
|
|
267
|
+
# acceptance-criteria, prompt, verdict
|
|
268
|
+
--from FILE | --body | --stdin section body (author in fresh scratch files)
|
|
269
|
+
--append --lane LANE append a per-lane subsection (Builder Prompt/Report)
|
|
270
|
+
--force write a frozen section (pre-dispatch only)
|
|
271
|
+
|
|
272
|
+
architect rehearse ITERATION
|
|
273
|
+
Dry-run the DRAFTED gates; classify RED/GREEN/BROKEN/EMPTY; never judges
|
|
274
|
+
--record paste-able provenance block for the AC preamble
|
|
275
|
+
|
|
276
|
+
architect freeze ITERATION
|
|
277
|
+
Freeze the frozen region; record the freeze SHA in space.yaml
|
|
278
|
+
--skip-rehearse REASON escape valve (recorded); bare freeze refuses
|
|
279
|
+
without a fresh rehearsal stamp
|
|
280
|
+
|
|
281
|
+
architect provision ITERATION
|
|
282
|
+
Materialize declared lanes (worktree + lane/<id>-<lane> branch)
|
|
283
|
+
--base REF cut exactly this ref (skips the sync)
|
|
284
|
+
--lane LANE provision only this lane
|
|
285
|
+
|
|
286
|
+
architect dispatch ITERATION LANE
|
|
287
|
+
Dispatch a builder (streams to build/<id>-<lane>/run.jsonl)
|
|
288
|
+
--prompt FILE lane prompt (copied to build/<id>-<lane>/prompt.md)
|
|
289
|
+
--model ID pin the builder model (full id, never an alias)
|
|
290
|
+
--effort LEVEL off|minimal|low|medium|high|xhigh|max
|
|
291
|
+
--timeout SECONDS wall-clock (0 disables; default 4h)
|
|
292
|
+
--detach return immediately with PID
|
|
293
|
+
|
|
294
|
+
architect verify ITERATION
|
|
295
|
+
Post-flight mechanical lane checks (reports only, no judgment)
|
|
296
|
+
|
|
297
|
+
architect evidence ITERATION
|
|
298
|
+
Transcribe a lane's scratch report VERBATIM into Builder Report
|
|
299
|
+
--lane LANE per-lane subsection
|
|
300
|
+
|
|
301
|
+
architect gate ITERATION [LANE]
|
|
302
|
+
Run the frozen gate commands; report PASS/FAIL; writes the full transcript
|
|
303
|
+
to build/gate/<id>-<ts>.md and prints the path (the terminal report is
|
|
304
|
+
bounded — the file is the record)
|
|
305
|
+
|
|
306
|
+
architect integrate ITERATION
|
|
307
|
+
Merge the passing lanes --no-ff into project/<slug>, in order; stops on conflict
|
|
308
|
+
--lanes A,B you decide the passing set
|
|
309
|
+
--teardown remove worktrees + lane branches after
|
|
310
|
+
|
|
311
|
+
architect verdict ITERATION continue|kill
|
|
312
|
+
Record the iteration verdict; --from FILE carries the body
|
|
313
|
+
(disagreement rulings + per-AC rollup)
|
|
314
|
+
|
|
315
|
+
architect status iteration/verdict table (read-only)
|
|
316
|
+
architect cost loop spend + latency from pi session artifacts
|
|
317
|
+
--json --by-iteration --latency --precise --since WHEN --space PATH
|
|
318
|
+
architect looplog [--list|--replay|--all|--space PATH]
|
|
319
|
+
Follow every active loop run in this space, live (--list: inventory only)
|
|
320
|
+
architect runlog [FILE]
|
|
321
|
+
Pretty-print a pi run.jsonl (FILE or stdin; RUNLOG_LIMIT, NO_COLOR honored)
|
|
322
|
+
architect install-skills bundled skills for a harness (--provider)
|
|
323
|
+
architect install-extensions reconcile the architect-loop pi extension package
|
|
324
|
+
architect install-agents role playbooks to ~/.pi/agent/agents (pi)
|
|
325
|
+
architect bug-report prefilled GitHub issue template for the CLI
|
|
326
|
+
```
|
|
529
327
|
|
|
530
328
|
## Maintenance
|
|
531
329
|
|
|
532
|
-
Re-read this skill against each new model generation and delete what the
|
|
533
|
-
now do unprompted — over-prescription degrades current-model output.
|
|
534
|
-
above are invariants; everything else is prunable.
|
|
330
|
+
Re-read this skill against each new model generation and delete what the
|
|
331
|
+
models now do unprompted — over-prescription degrades current-model output.
|
|
332
|
+
The rules above are invariants; everything else is prunable.
|