space-architect 2.0.0.rc1 → 2.0.0.rc2
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/README.md +34 -18
- data/lib/space_architect/{architect_mission.rb → architect_project.rb} +396 -77
- data/lib/space_architect/cli/architect.rb +170 -60
- data/lib/space_architect/cli/research.rb +1 -1
- data/lib/space_architect/gate_evaluator.rb +65 -0
- data/lib/space_architect/gate_lint.rb +140 -0
- data/lib/space_architect/harness.rb +24 -3
- data/lib/space_architect/templates/architect.md.erb +15 -4
- data/lib/space_architect/templates/brief.md.erb +5 -5
- data/lib/space_architect/templates/iteration.md.erb +17 -6
- data/lib/space_architect.rb +3 -1
- data/lib/space_core/cli/build.rb +27 -0
- data/lib/space_core/cli/help.rb +15 -2
- data/lib/space_core/cli/pack.rb +29 -0
- data/lib/space_core/cli/repo.rb +1 -1
- data/lib/space_core/cli/run.rb +29 -0
- data/lib/space_core/cli.rb +6 -0
- data/lib/space_core/oci_builder.rb +56 -0
- data/lib/space_core/oci_packer.rb +99 -0
- data/lib/space_core/oci_runner.rb +73 -0
- data/lib/space_core/space.rb +10 -2
- data/lib/space_core/space_store.rb +1 -1
- data/lib/space_core/templates/oci/dockerfile.erb +63 -0
- data/lib/space_core/templates/oci/dockerignore.erb +17 -0
- data/lib/space_core/templates/oci/entrypoint.sh.erb +10 -0
- data/lib/space_core/version.rb +1 -1
- data/skill/architect/SKILL.md +109 -53
- data/skill/architect/dispatch.md +147 -39
- data/skill/architect/research.md +1 -1
- data/skill/architect-research/SKILL.md +2 -2
- data/skill/architect-vocabulary/SKILL.md +24 -21
- metadata +13 -2
data/skill/architect/dispatch.md
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
# Builder dispatch reference
|
|
2
2
|
|
|
3
|
-
Verified against the `claude` CLI (Claude Code) headless mode
|
|
4
|
-
builder is `claude -p` (`--print`, the non-interactive
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
3
|
+
Verified against the `claude` CLI (Claude Code) headless mode — the reference
|
|
4
|
+
harness — June 2026. The builder is `claude -p` (`--print`, the non-interactive
|
|
5
|
+
headless mode) pinned to the configured builder model (`<builder-model>`) — a
|
|
6
|
+
cheaper model run headless via the same harness the architect uses. Key facts the
|
|
7
|
+
skill encodes: lane-prompts go in on **stdin** (Claude Code has no `@file`, and a
|
|
8
|
+
big quoted lane-prompt as a shell argument gets mangled); the model is pinned with
|
|
9
|
+
`--model <builder-model>` (a floating alias drifts to whatever ships next — pin
|
|
10
|
+
the full id); there is **no `-C`/working-dir flag**, so
|
|
10
11
|
per-lane dispatch `cd`s into the worktree; permissions are the **tool
|
|
11
12
|
allow/deny lists** (`--allowedTools`/`--disallowedTools`) plus
|
|
12
13
|
`--permission-mode`, not a sandbox; web access is the built-in
|
|
@@ -27,21 +28,22 @@ If a lane committed, treat the worktree as tampered: reset and re-dispatch.
|
|
|
27
28
|
|
|
28
29
|
**Preflight (once per environment):** run `claude --version`, and confirm the
|
|
29
30
|
builder model resolves with a one-shot canary
|
|
30
|
-
(`echo ok | claude -p --model
|
|
31
|
+
(`echo ok | claude -p --model <builder-model> --max-turns 1`). No API key —
|
|
31
32
|
the builder runs on your Claude plan — but note headless `claude -p` draws on
|
|
32
33
|
the Agent SDK credit pool (separate from interactive usage since June 15 2026;
|
|
33
|
-
see `DESIGN.md` §4). On the first real dispatch in a new environment, launch
|
|
34
|
+
see `docs/DESIGN.md` §4). On the first real dispatch in a new environment, launch
|
|
34
35
|
ONE canary lane and confirm it starts cleanly before fanning anything out.
|
|
35
36
|
|
|
36
37
|
## Canonical dispatch — `architect dispatch <iteration> <lane>`
|
|
37
38
|
|
|
38
39
|
The canonical path is `architect dispatch <iteration> <lane>`. The tool
|
|
39
|
-
assembles the canonical `claude -p` argv, pins the model
|
|
40
|
+
assembles the canonical `claude -p` argv, pins the builder model (the lane's
|
|
41
|
+
configured model or the CLI's reference default; see `docs/DESIGN.md` §4),
|
|
40
42
|
reads the lane prompt from `build/<id>-<lane>/prompt.md` on stdin, and streams
|
|
41
43
|
`--output-format stream-json --verbose` output to
|
|
42
44
|
`build/<id>-<lane>/run.jsonl`. Run each lane as its own **background Bash tool
|
|
43
|
-
call** (`run_in_background`) so your turn doesn't block for the full
|
|
44
|
-
|
|
45
|
+
call** (`run_in_background`) so your turn doesn't block for the full run (30–60
|
|
46
|
+
minutes is typical).
|
|
45
47
|
|
|
46
48
|
Write the lane's prompt to `build/<id>-<lane>/prompt.md` first (never pass a
|
|
47
49
|
big prompt as a shell argument — shells mangle quotes), then:
|
|
@@ -72,7 +74,7 @@ reaps those now-orphaned `claude` processes, and every lane dies at once with no
|
|
|
72
74
|
`result` — partial diffs, no reports (this exact failure has happened: three
|
|
73
75
|
lanes killed at the same second, zero output). One blocking dispatch per
|
|
74
76
|
background Bash tool keeps each lane attached to a harness-tracked task that
|
|
75
|
-
survives the full
|
|
77
|
+
survives the full run and reports completion per lane.
|
|
76
78
|
|
|
77
79
|
### What the tool runs under the hood
|
|
78
80
|
|
|
@@ -82,7 +84,7 @@ and as the manual fallback:
|
|
|
82
84
|
```bash
|
|
83
85
|
# write prompt to build/<id>-<lane>/prompt.md first, then:
|
|
84
86
|
( cd build/<id>-<lane>/wt && \
|
|
85
|
-
claude -p --model
|
|
87
|
+
claude -p --model <builder-model> \
|
|
86
88
|
--permission-mode acceptEdits \
|
|
87
89
|
--allowedTools 'Read,Edit,Write,Grep,Glob,Bash,WebSearch,WebFetch' \
|
|
88
90
|
--disallowedTools 'Bash(git commit:*),Bash(git push:*),Bash(git reset:*),Bash(git merge:*),Bash(git rebase:*),Bash(git checkout:*),Bash(git branch:*)' \
|
|
@@ -100,48 +102,153 @@ over the allow list (deny always takes precedence) as the runtime first line
|
|
|
100
102
|
against commits. Redirect stderr (`2>&1`) into the run-log so a dispatch error
|
|
101
103
|
lands somewhere instead of vanishing.
|
|
102
104
|
|
|
103
|
-
### Integration (
|
|
105
|
+
### Integration (judging session — after per-lane post-flight passes)
|
|
104
106
|
|
|
105
|
-
|
|
107
|
+
This block runs in the judging session, not the dispatch session — the dispatch
|
|
108
|
+
session's job ends when builders finish (see SKILL.md §5–6). You decide which
|
|
109
|
+
lanes pass; the CLI does the git mechanics. Canonical path:
|
|
106
110
|
|
|
107
111
|
```bash
|
|
108
112
|
architect integrate <iteration> --lanes <passing-set> # e.g. --lanes lane-a,lane-b
|
|
109
113
|
architect gate <iteration> # integration smoke (raw output; verdict stays yours)
|
|
110
114
|
architect integrate <iteration> --lanes <passing-set> --teardown # or remove worktrees + lane branches after
|
|
115
|
+
architect land # end of project: prints gh pr create --base main --head project/<slug>
|
|
111
116
|
```
|
|
112
117
|
|
|
113
118
|
`architect integrate` commits each named lane on its branch and merges it
|
|
114
|
-
`--no-ff` into the repo's `
|
|
115
|
-
**refuses** a lane that left
|
|
116
|
-
mechanical post-flight checks), and
|
|
117
|
-
= the lane plan wasn't disjoint = a
|
|
118
|
-
re-spec; don't hand-resolve builder
|
|
119
|
-
verdict** — `architect gate` streams
|
|
119
|
+
`--no-ff` into the repo's stable `project/<slug>` branch (slug of `space.title`,
|
|
120
|
+
persistent across all iterations), in order. It **refuses** a lane that left
|
|
121
|
+
builder commits or wrote out-of-bounds (the mechanical post-flight checks), and
|
|
122
|
+
aborts on a merge conflict. A merge conflict = the lane plan wasn't disjoint = a
|
|
123
|
+
spec defect: kill the conflicting lane and re-spec; don't hand-resolve builder
|
|
124
|
+
conflicts. It runs **no gates and makes no verdict** — `architect gate` streams
|
|
125
|
+
the raw gate output for you to judge. `--teardown` deletes only the per-lane
|
|
126
|
+
`lane/<iteration>-<lane>` branches and worktrees; it never deletes the
|
|
127
|
+
`project/<slug>` branch.
|
|
120
128
|
|
|
121
129
|
Under the hood / manual fallback (one lane shown):
|
|
122
130
|
|
|
123
131
|
```bash
|
|
124
|
-
|
|
132
|
+
# check out or create the project integration branch:
|
|
133
|
+
git -C repos/<repo> checkout project/<slug> 2>/dev/null || \
|
|
134
|
+
git -C repos/<repo> checkout -b project/<slug> <repo-base>
|
|
125
135
|
git -C build/<id>-<lane>/wt add -A
|
|
126
136
|
git -C build/<id>-<lane>/wt commit -m "lane <lane>: <what>"
|
|
127
137
|
git -C repos/<repo> merge --no-ff lane/<iteration>-<lane>
|
|
128
138
|
<run the gate commands> # integration smoke after every merge
|
|
129
139
|
architect worktree remove <iteration> <lane>
|
|
130
140
|
git -C repos/<repo> branch -d lane/<iteration>-<lane>
|
|
141
|
+
# at project end:
|
|
142
|
+
architect land # prints gh pr create --base main --head project/<slug>
|
|
131
143
|
```
|
|
132
144
|
|
|
145
|
+
### Parallel + fast-follow
|
|
146
|
+
|
|
147
|
+
Use when an iteration is near-disjoint — all but a thin shared seam (a
|
|
148
|
+
registration line, an index entry, a shared require). Route the seam into a
|
|
149
|
+
dedicated fast-follow lane; the parallel lanes stay genuinely disjoint and
|
|
150
|
+
integrate without conflict.
|
|
151
|
+
|
|
152
|
+
**Recipe:**
|
|
153
|
+
|
|
154
|
+
1. **Spec the seam out of the parallel lanes.** Assign the seam file(s) to the
|
|
155
|
+
fast-follow lane's `--touch` set and exclude them from every parallel lane's
|
|
156
|
+
touch-set — so the parallel set is disjoint by construction.
|
|
157
|
+
|
|
158
|
+
2. **Create worktrees and dispatch the parallel lanes** (off the repo base):
|
|
159
|
+
```bash
|
|
160
|
+
architect worktree add <repo> <iteration> lane-a
|
|
161
|
+
architect worktree add <repo> <iteration> lane-b
|
|
162
|
+
architect dispatch <iteration> lane-a # own background Bash call each
|
|
163
|
+
architect dispatch <iteration> lane-b
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
3. **Judging session — integrate the parallel set.** `project/<slug>` advances
|
|
167
|
+
to their merged tip:
|
|
168
|
+
```bash
|
|
169
|
+
architect integrate <iteration> --lanes lane-a,lane-b
|
|
170
|
+
architect gate <iteration>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
4. **Create the fast-follow lane off the integrated tip.** `--base` accepts any
|
|
174
|
+
git ref — passing `project/<slug>` roots the new worktree at the merged tip
|
|
175
|
+
(the keystone move):
|
|
176
|
+
```bash
|
|
177
|
+
architect worktree add <repo> <iteration> ff --base project/<slug>
|
|
178
|
+
architect dispatch <iteration> ff
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
5. **Judging session — integrate the fast-follow lane.** Because it descends
|
|
182
|
+
directly from `project/<slug>`, the `--no-ff` merge appends cleanly with no
|
|
183
|
+
conflicts:
|
|
184
|
+
```bash
|
|
185
|
+
architect integrate <iteration> --lanes ff
|
|
186
|
+
architect gate <iteration>
|
|
187
|
+
```
|
|
188
|
+
|
|
189
|
+
**Invariant:** the parallel lanes must stay disjoint — a conflict among them is
|
|
190
|
+
still a disjointness defect (kill and re-spec; never hand-resolve). The
|
|
191
|
+
fast-follow lane is the sanctioned home for the seam and never conflicts because
|
|
192
|
+
it is a descendant of the integrated tip.
|
|
193
|
+
|
|
194
|
+
### Serial deferred judgment
|
|
195
|
+
|
|
196
|
+
Use when several iterations (or serial same-file lanes within one iteration)
|
|
197
|
+
should run to gates-green without a judging session between each — batching cold
|
|
198
|
+
AC judgment into one later session.
|
|
199
|
+
|
|
200
|
+
**Recipe:**
|
|
201
|
+
|
|
202
|
+
Per iteration, freeze and dispatch as normal. In a fresh judging session, run
|
|
203
|
+
post-flight, integrate, and gate — but **withhold `architect verdict`**:
|
|
204
|
+
|
|
205
|
+
```bash
|
|
206
|
+
# judging session (per iteration) — stop before verdict:
|
|
207
|
+
architect integrate <iteration> --lanes <passing-set>
|
|
208
|
+
architect gate <iteration>
|
|
209
|
+
# do NOT run: architect verdict <iteration> continue|kill
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
Each integrated-but-unjudged iteration surfaces as `awaiting-verdict` in
|
|
213
|
+
`architect status`:
|
|
214
|
+
|
|
215
|
+
```bash
|
|
216
|
+
architect status
|
|
217
|
+
# II Iteration … Verdict
|
|
218
|
+
# 03 some-feature … awaiting-verdict
|
|
219
|
+
# 04 another-feature … awaiting-verdict
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
One later batch judging session evaluates all `awaiting-verdict` iterations,
|
|
223
|
+
oldest-first. For each: read its own frozen AC from its freeze commit, run its
|
|
224
|
+
gates cold, and record the verdict:
|
|
225
|
+
|
|
226
|
+
```bash
|
|
227
|
+
architect gate <iteration> # run the frozen gates cold
|
|
228
|
+
architect verdict <iteration> continue # or: kill
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
**§1 preserved:** each verdict is cold and fresh-session — the batch judging
|
|
232
|
+
session did not dispatch any of these iterations, so the §1
|
|
233
|
+
fresh-session-judgment rule holds for every verdict in the batch.
|
|
234
|
+
|
|
235
|
+
**Deliberate risk:** iteration N+1 integrated on top of N's not-yet-judged work
|
|
236
|
+
rests on a foundation that a later KILL at N would revert. Accept this coupling
|
|
237
|
+
only consciously, and always judge oldest-first so a KILL stops you before you
|
|
238
|
+
compound it.
|
|
239
|
+
|
|
133
240
|
## Operating guidance
|
|
134
241
|
|
|
135
242
|
- Background each lane as its own harness task and let the **per-lane
|
|
136
|
-
completion notification** bring you back (
|
|
243
|
+
completion notification** bring you back (long runs — 30–60 minutes — are normal); read
|
|
137
244
|
`build/<id>-<lane>/run.jsonl` and the repo state afterwards. Do not write a
|
|
138
245
|
blocking `while pgrep …; sleep` wait loop as a Bash command — that is itself
|
|
139
246
|
a launcher that ties up a turn. When you return to a lane, check liveness via
|
|
140
247
|
run-log growth (the stall rules below still apply unchanged).
|
|
141
248
|
- Pin the model explicitly. The tool does this automatically (`--model
|
|
142
|
-
|
|
143
|
-
interactively, but automations pin the full id so a
|
|
144
|
-
change builder behavior mid-project.
|
|
249
|
+
<builder-model>`). A floating alias (a bare "latest"/tier tag) drifts to
|
|
250
|
+
whatever ships next — fine interactively, but automations pin the full id so a
|
|
251
|
+
model bump can't silently change builder behavior mid-project.
|
|
145
252
|
- Effort = thinking budget. Claude Code has no per-invocation effort flag the
|
|
146
253
|
way Codex exposed `model_reasoning_effort`; the builder sets thinking depth
|
|
147
254
|
**in the block** via the escalation keywords (`think` < `think hard` <
|
|
@@ -166,16 +273,17 @@ git -C repos/<repo> branch -d lane/<iteration>-<lane>
|
|
|
166
273
|
`claude -p --continue …`, never a `&` loop (a `&` launcher orphans the
|
|
167
274
|
resumed lanes exactly as it does fresh ones). Never resume across iterations —
|
|
168
275
|
every iteration gets a fresh context.
|
|
169
|
-
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
architect
|
|
173
|
-
|
|
174
|
-
|
|
276
|
+
- Capability-gap review gate (high-stakes iterations): the architect outranks the
|
|
277
|
+
builder, so the architect reading the diff is already a stronger-model,
|
|
278
|
+
fresh-context pass over it. How independent that read is depends on the pairing
|
|
279
|
+
— a same-lab architect/builder shares the builder's blind spots (the frozen
|
|
280
|
+
gates stay the independent check), a cross-vendor pairing is more independent
|
|
281
|
+
(see `docs/DESIGN.md` §1/R3). For an extra adversarial pass, pipe the
|
|
282
|
+
instruction + diff to a fresh read-only reviewer:
|
|
175
283
|
```bash
|
|
176
284
|
{ echo "Review this diff against the spec. Flag ONLY correctness/requirement/invariant gaps with file:line evidence. No style."; \
|
|
177
285
|
git -C <repo-root> diff <base>...HEAD; } \
|
|
178
|
-
| claude -p --model
|
|
286
|
+
| claude -p --model <builder-model> --allowedTools 'Read,Grep,Glob'
|
|
179
287
|
```
|
|
180
288
|
- `build/` is already gitignored by the space, so no extra `.gitignore` entry
|
|
181
289
|
is needed. Scratch never reaches the space repo; only `architecture/` is
|
|
@@ -287,11 +395,11 @@ against them, do not edit or work around) ===
|
|
|
287
395
|
|
|
288
396
|
## Builder-side standing setup (one time per machine/repo)
|
|
289
397
|
|
|
290
|
-
- The builder is the same `claude` binary as the architect
|
|
291
|
-
nothing extra to install. `architect dispatch` pins
|
|
292
|
-
(`--model
|
|
293
|
-
is fine interactively, but automations pin it explicitly so a
|
|
294
|
-
silently swap the builder.
|
|
398
|
+
- The builder is the same `claude` binary as the architect (reference harness),
|
|
399
|
+
running a cheaper model — nothing extra to install. `architect dispatch` pins
|
|
400
|
+
the model per dispatch (`--model <builder-model>`); a `~/.claude/settings.json`
|
|
401
|
+
`"model"` default is fine interactively, but automations pin it explicitly so a
|
|
402
|
+
default can't silently swap the builder.
|
|
295
403
|
- Repo `CLAUDE.md` is the builder's standing context — Claude Code loads it
|
|
296
404
|
root-down automatically. Put exact build/test commands and repo gotchas there;
|
|
297
405
|
the loop's PHASE rules stay in the dispatch block so they version with the
|
data/skill/architect/research.md
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Read this only when a research trigger fires (see SKILL.md step 3). The fan-out
|
|
4
4
|
uses `architect research dispatch` to launch parallel read-only `claude -p`
|
|
5
|
-
researchers (
|
|
5
|
+
researchers (a cheaper model, read-only — no Edit/Write/Bash) and `architect research wait` to
|
|
6
6
|
collect their results. The architect keeps all judgment: it verifies
|
|
7
7
|
load-bearing claims and writes the iteration's **Grounds** section itself.
|
|
8
8
|
|
|
@@ -74,7 +74,7 @@ toolset (`Read,Grep,Glob`) plus the web tools (`WebSearch,WebFetch`); the
|
|
|
74
74
|
report is the redirected stdout:
|
|
75
75
|
|
|
76
76
|
```bash
|
|
77
|
-
claude -p --model
|
|
77
|
+
claude -p --model <researcher-model> \
|
|
78
78
|
--allowedTools 'Read,Grep,Glob,WebSearch,WebFetch' \
|
|
79
79
|
--max-turns 40 \
|
|
80
80
|
< build/research/<NN>-<lane>.prompt.md \
|
|
@@ -161,5 +161,5 @@ Commit the report. Raw findings stay in `build/research/` (gitignored).
|
|
|
161
161
|
|
|
162
162
|
If this feeds the build loop: distill the report into the iteration's **Grounds**
|
|
163
163
|
section (`architecture/I<NN>-<name>.md`) per `/architect`, or into
|
|
164
|
-
`architecture/BRIEF.md` §sections when it is
|
|
164
|
+
`architecture/BRIEF.md` §sections when it is project-scope, and continue there.
|
|
165
165
|
The builder's PHASE 0 will challenge Grounds' claims — that's a feature.
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: architect-vocabulary
|
|
3
3
|
description: >
|
|
4
4
|
Load the Architect system's vocabulary and a short "where you are"
|
|
5
|
-
orientation — space,
|
|
5
|
+
orientation — space, project, iteration, lane, brief, builder, architect,
|
|
6
6
|
gate, freeze, verdict, research, variant set — for when you're standing in a
|
|
7
7
|
space-architect workspace (or working on the skill itself) and need the terms
|
|
8
8
|
understood in conversation but do NOT want to run the loop. Reference only:
|
|
@@ -30,11 +30,12 @@ the loop.
|
|
|
30
30
|
|
|
31
31
|
**Roles**
|
|
32
32
|
|
|
33
|
-
- **architect** — the judgment role (a
|
|
34
|
-
mode): arbitrates disagreements, writes and freezes iteration files,
|
|
35
|
-
kill/continue, merges builder output. Never writes implementation code.
|
|
36
|
-
- **builder** — the implementation role:
|
|
37
|
-
`architect dispatch` (`claude -p`), one per lane in its own
|
|
33
|
+
- **architect** — the judgment role (a strong reasoning model, or a human, in
|
|
34
|
+
judgment mode): arbitrates disagreements, writes and freezes iteration files,
|
|
35
|
+
calls kill/continue, merges builder output. Never writes implementation code.
|
|
36
|
+
- **builder** — the implementation role: a cheaper model run headless via
|
|
37
|
+
`architect dispatch` (reference harness: `claude -p`), one per lane in its own
|
|
38
|
+
worktree. Reports
|
|
38
39
|
raw evidence; never grades its own work; never edits `architecture/`.
|
|
39
40
|
|
|
40
41
|
**The workspace**
|
|
@@ -43,9 +44,9 @@ the loop.
|
|
|
43
44
|
artifacts under one root. `architect` finds it by walking up from `$PWD` to the
|
|
44
45
|
nearest `space.yaml`.
|
|
45
46
|
- **space.yaml** — the space's identity file: id, title, status, repos, notes,
|
|
46
|
-
tags, plus the `
|
|
47
|
+
tags, plus the `project:` block (project state — iterations, freeze shas,
|
|
47
48
|
lanes).
|
|
48
|
-
- **
|
|
49
|
+
- **project** — an Architect Loop instance living inside a space; spans the
|
|
49
50
|
repos under `repos/`.
|
|
50
51
|
|
|
51
52
|
**The unit of work**
|
|
@@ -54,8 +55,9 @@ the loop.
|
|
|
54
55
|
file `architecture/I<NN>-<name>.md`, grown section by section. Its sections:
|
|
55
56
|
- **Grounds** — *why*: research/brief distilled (optional).
|
|
56
57
|
- **Specification** — *what/how*: the full delegation contract.
|
|
57
|
-
- **Acceptance Criteria** — *proof*:
|
|
58
|
-
|
|
58
|
+
- **Acceptance Criteria** — *proof*: prose conditions (AC1, AC2, …) the
|
|
59
|
+
architect judges against, plus a fenced ` ```gates ` block of runnable checks;
|
|
60
|
+
this is what gets frozen.
|
|
59
61
|
- **Builder Prompt** — the exact lane-prompt(s) dispatched.
|
|
60
62
|
- **Builder Report** — raw evidence, transcribed verbatim from build scratch.
|
|
61
63
|
- **Verdict** — rulings + per-AC PASS/FAIL/INVALID + KILL/CONTINUE.
|
|
@@ -70,17 +72,18 @@ the loop.
|
|
|
70
72
|
|
|
71
73
|
**Contracts and checkpoints**
|
|
72
74
|
|
|
73
|
-
- **brief** (`architecture/BRIEF.md`) — the durable, §-numbered
|
|
74
|
-
that spans iterations; frozen at the
|
|
75
|
+
- **brief** (`architecture/BRIEF.md`) — the durable, §-numbered project contract
|
|
76
|
+
that spans iterations; frozen at the project level and cited as **BRIEF §N**.
|
|
75
77
|
- **ARCHITECT.md** (`architecture/ARCHITECT.md`) — the cross-iteration index /
|
|
76
|
-
table of contents and
|
|
78
|
+
table of contents and project-wide state.
|
|
77
79
|
- **freeze** ❄️ — committing the frozen region (Grounds / Specification /
|
|
78
80
|
Acceptance Criteria) *before* dispatch (`architect freeze`). Records the
|
|
79
81
|
**freeze_sha** in `space.yaml`; any later change to those sections is an
|
|
80
82
|
automatic iteration FAIL.
|
|
81
|
-
- **gate** — a
|
|
82
|
-
|
|
83
|
-
|
|
83
|
+
- **gate** — a structured entry in the ` ```gates ` block: `id`, `ac`, `cmd`,
|
|
84
|
+
optional `cwd`, and an `expect` hash (exit_code / stdout_match / threshold).
|
|
85
|
+
`architect gate` runs each gate's `cmd` and streams raw output — it is a runner,
|
|
86
|
+
never a judge. `architect freeze` lints the gates block before committing.
|
|
84
87
|
|
|
85
88
|
**Outcomes**
|
|
86
89
|
|
|
@@ -106,18 +109,18 @@ the loop.
|
|
|
106
109
|
**Repos**
|
|
107
110
|
|
|
108
111
|
- **evergreen** / copy-on-write / **`src` engine** — repo provisioning: when an
|
|
109
|
-
up-to-date local copy exists under `
|
|
112
|
+
up-to-date local copy exists under `src_dir`, `architect` copies it into
|
|
110
113
|
the space (copy-on-write on APFS) instead of cloning over the network. The
|
|
111
|
-
|
|
114
|
+
`src` engine (`space-src`) keeps those evergreen checkouts tended.
|
|
112
115
|
|
|
113
116
|
## Where you are
|
|
114
117
|
|
|
115
118
|
A space's directory layout:
|
|
116
119
|
|
|
117
120
|
```text
|
|
118
|
-
space.yaml # identity +
|
|
121
|
+
space.yaml # identity + project state (the project: block)
|
|
119
122
|
README.md
|
|
120
|
-
repos/ # the repos the
|
|
123
|
+
repos/ # the repos the project spans
|
|
121
124
|
notes/ # scratch, prompts, logs
|
|
122
125
|
architecture/ # ARCHITECT.md index + I<NN>-<name>.md iteration files (+ BRIEF.md)
|
|
123
126
|
build/ # lane worktrees + scratch: build/<id>-<lane>/
|
|
@@ -127,7 +130,7 @@ tmp/ # workspace-local temp — use instead of /tmp
|
|
|
127
130
|
Safe **read-only** commands to orient yourself (these don't run the loop):
|
|
128
131
|
|
|
129
132
|
```sh
|
|
130
|
-
architect status #
|
|
133
|
+
architect status # project state: iterations, freeze shas, lanes, verdicts
|
|
131
134
|
architect space show # the space you're standing in
|
|
132
135
|
architect space list # all your spaces
|
|
133
136
|
```
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: space-architect
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.0.0.
|
|
4
|
+
version: 2.0.0.rc2
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Eric Jacobs
|
|
@@ -239,13 +239,15 @@ files:
|
|
|
239
239
|
- exe/space
|
|
240
240
|
- exe/src
|
|
241
241
|
- lib/space_architect.rb
|
|
242
|
-
- lib/space_architect/
|
|
242
|
+
- lib/space_architect/architect_project.rb
|
|
243
243
|
- lib/space_architect/cli.rb
|
|
244
244
|
- lib/space_architect/cli/architect.rb
|
|
245
245
|
- lib/space_architect/cli/research.rb
|
|
246
246
|
- lib/space_architect/cli/space.rb
|
|
247
247
|
- lib/space_architect/cli/src.rb
|
|
248
248
|
- lib/space_architect/dispatcher.rb
|
|
249
|
+
- lib/space_architect/gate_evaluator.rb
|
|
250
|
+
- lib/space_architect/gate_lint.rb
|
|
249
251
|
- lib/space_architect/harness.rb
|
|
250
252
|
- lib/space_architect/research.rb
|
|
251
253
|
- lib/space_architect/research/mux.rb
|
|
@@ -262,6 +264,7 @@ files:
|
|
|
262
264
|
- lib/space_core/atomic_write.rb
|
|
263
265
|
- lib/space_core/cli.rb
|
|
264
266
|
- lib/space_core/cli/base_command.rb
|
|
267
|
+
- lib/space_core/cli/build.rb
|
|
265
268
|
- lib/space_core/cli/config.rb
|
|
266
269
|
- lib/space_core/cli/current.rb
|
|
267
270
|
- lib/space_core/cli/help.rb
|
|
@@ -269,9 +272,11 @@ files:
|
|
|
269
272
|
- lib/space_core/cli/init.rb
|
|
270
273
|
- lib/space_core/cli/list.rb
|
|
271
274
|
- lib/space_core/cli/new.rb
|
|
275
|
+
- lib/space_core/cli/pack.rb
|
|
272
276
|
- lib/space_core/cli/path.rb
|
|
273
277
|
- lib/space_core/cli/repeatable_options.rb
|
|
274
278
|
- lib/space_core/cli/repo.rb
|
|
279
|
+
- lib/space_core/cli/run.rb
|
|
275
280
|
- lib/space_core/cli/shell.rb
|
|
276
281
|
- lib/space_core/cli/show.rb
|
|
277
282
|
- lib/space_core/cli/status.rb
|
|
@@ -280,6 +285,9 @@ files:
|
|
|
280
285
|
- lib/space_core/errors.rb
|
|
281
286
|
- lib/space_core/git_client.rb
|
|
282
287
|
- lib/space_core/mise_client.rb
|
|
288
|
+
- lib/space_core/oci_builder.rb
|
|
289
|
+
- lib/space_core/oci_packer.rb
|
|
290
|
+
- lib/space_core/oci_runner.rb
|
|
283
291
|
- lib/space_core/repo_reference.rb
|
|
284
292
|
- lib/space_core/repo_resolver.rb
|
|
285
293
|
- lib/space_core/shell_integration.rb
|
|
@@ -287,6 +295,9 @@ files:
|
|
|
287
295
|
- lib/space_core/space.rb
|
|
288
296
|
- lib/space_core/space_store.rb
|
|
289
297
|
- lib/space_core/state.rb
|
|
298
|
+
- lib/space_core/templates/oci/dockerfile.erb
|
|
299
|
+
- lib/space_core/templates/oci/dockerignore.erb
|
|
300
|
+
- lib/space_core/templates/oci/entrypoint.sh.erb
|
|
290
301
|
- lib/space_core/terminal.rb
|
|
291
302
|
- lib/space_core/version.rb
|
|
292
303
|
- lib/space_core/warnings.rb
|