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.
@@ -1,12 +1,13 @@
1
1
  # Builder dispatch reference
2
2
 
3
- Verified against the `claude` CLI (Claude Code) headless mode, June 2026. The
4
- builder is `claude -p` (`--print`, the non-interactive headless mode) pinned to
5
- `claude-sonnet-4-6` the *same binary the architect runs, one tier down*. Key
6
- facts the skill encodes: lane-prompts go in on **stdin** (Claude Code has no
7
- `@file`, and a big quoted lane-prompt as a shell argument gets mangled); the
8
- model is pinned with `--model claude-sonnet-4-6` (the `sonnet` alias floats to
9
- the latest Sonnet pin the full id); there is **no `-C`/working-dir flag**, so
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 claude-sonnet-4-6 --max-turns 1`). No API key —
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 to `claude-sonnet-4-6`,
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 multi-hour
44
- run.
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 multi-hour run and reports completion per lane.
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 claude-sonnet-4-6 \
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 (architect-only, after per-lane post-flight passes)
105
+ ### Integration (judging session — after per-lane post-flight passes)
104
106
 
105
- You decide which lanes pass; the CLI does the git mechanics. Canonical path:
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 `lane/<iteration>` integration branch, in order. It
115
- **refuses** a lane that left builder commits or wrote out-of-bounds (the
116
- mechanical post-flight checks), and aborts on a merge conflict. A merge conflict
117
- = the lane plan wasn't disjoint = a spec defect: kill the conflicting lane and
118
- re-spec; don't hand-resolve builder conflicts. It runs **no gates and makes no
119
- verdict** — `architect gate` streams the raw gate output for you to judge.
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
- git -C repos/<repo> checkout -b lane/<iteration> <repo-base>
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 (multi-hour runs are normal); read
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
- claude-sonnet-4-6`). The `sonnet` alias floats to the latest Sonnet fine
143
- interactively, but automations pin the full id so a model bump can't silently
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
- - Cross-model review gate (high-stakes iterations): the architect is Opus 4.8
170
- and the builder is Sonnet 4.6 both Claude Code, so this is a
171
- cross-*tier* read inside one lab, not cross-vendor (see `DESIGN.md` R3). The
172
- architect (Opus) reading the diff is already the stronger-model fresh-context
173
- pass. For an extra adversarial pass, pipe the instruction + diff to a fresh
174
- read-only reviewer:
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 claude-sonnet-4-6 --allowedTools 'Read,Grep,Glob'
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, one tier down —
291
- nothing extra to install. `architect dispatch` pins the model per dispatch
292
- (`--model claude-sonnet-4-6`); a `~/.claude/settings.json` `"model"` default
293
- is fine interactively, but automations pin it explicitly so a default can't
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
@@ -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 (Sonnet 4.6, no Edit/Write/Bash) and `architect research wait` to
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 claude-sonnet-4-6 \
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 mission-scope, and continue there.
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, mission, iteration, lane, brief, builder, architect,
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 human, or Claude Opus 4.8 in judgment
34
- mode): arbitrates disagreements, writes and freezes iteration files, calls
35
- kill/continue, merges builder output. Never writes implementation code.
36
- - **builder** — the implementation role: Claude Sonnet 4.6 run headless via
37
- `architect dispatch` (`claude -p`), one per lane in its own worktree. Reports
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 `architect:` block (mission state — iterations, freeze shas,
47
+ tags, plus the `project:` block (project state — iterations, freeze shas,
47
48
  lanes).
48
- - **mission** — an Architect Loop instance living inside a space; spans the
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*: exact gate commands + thresholds; this is
58
- what gets frozen.
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 mission contract
74
- that spans iterations; frozen at the mission level and cited as **BRIEF §N**.
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 mission-wide state.
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 frozen verification command + threshold (test/lint/typecheck/
82
- build). `architect gate` runs them and streams raw output it is a runner,
83
- never a judge.
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 `evergreen_dir`, `architect` copies it into
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
- vendored `src` engine keeps those evergreen checkouts tended.
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 + mission state (the architect: block)
121
+ space.yaml # identity + project state (the project: block)
119
122
  README.md
120
- repos/ # the repos the mission spans
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 # mission state: iterations, freeze shas, lanes, verdicts
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.rc1
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/architect_mission.rb
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