space-architect 4.0.0 → 5.1.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/CHANGELOG.md +137 -0
- data/README.md +11 -7
- data/lib/space_architect/architect_project.rb +236 -70
- data/lib/space_architect/cli/architect.rb +128 -60
- data/lib/space_core/cli/run.rb +3 -2
- data/lib/space_core/version.rb +1 -1
- data/skill/architect/SKILL.md +26 -5
- data/skill/architect/dispatch.md +26 -16
- metadata +15 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: '09d047544f9e1b3a29c56cc1e982a9624f72d45c2198429fcd7ab4564c31da41'
|
|
4
|
+
data.tar.gz: ea4e880ceda1c31ba11b390448d2380ca6d45d39394aeef2963c80a0e59a0901
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 01d09d4cd267afe17f189606d3620bdfa284802c4ccd506a2526172864b85c1124b8096aa3a5ed3fe61cfc3f18929d0aeb8f00d7d9c6238dfdf331ce1e2f8048
|
|
7
|
+
data.tar.gz: 313a4cf3c9dc69d5cb82d5d8bb1b95fa5d133de711d9ab5e320145525abddff4aebe8fc89cf58e0552d83147fae79ce697b567dce5a8ac387313f5064f58bf2b
|
data/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,143 @@ All notable changes to this project are documented in this file.
|
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
7
7
|
|
|
8
|
+
## [5.1.0] - 2026-07-19
|
|
9
|
+
|
|
10
|
+
### Added
|
|
11
|
+
|
|
12
|
+
- **`architect integrate --into <branch>`** — merge a lane into a named branch
|
|
13
|
+
instead of the slug-derived `project/<slug>` default (#47). Outside-touch-set
|
|
14
|
+
conflict message gains an `--into` hint; inside-touch conflict keeps "spec
|
|
15
|
+
defect".
|
|
16
|
+
- **Conductor commit-mode** — `commit_mode: conductor` in `space.yaml` plus a
|
|
17
|
+
`--commit-mode` CLI flag on `verify`/`integrate`: canonical conductor commits
|
|
18
|
+
are classified as non-builder in the lane mechanical check, with canonical
|
|
19
|
+
message-shape matching (#55).
|
|
20
|
+
- **`architect sync` subcommand** (`--ff-only`, per-repo status) plus a
|
|
21
|
+
`ground` stale-repo WARNING with behind count and `--into` hint. **No
|
|
22
|
+
auto-sync** — the operator runs `sync` (#49).
|
|
23
|
+
- **`architect freeze --force` / `section --force`** — re-freeze an iteration
|
|
24
|
+
whose frozen region changed since the last freeze, or write a frozen section
|
|
25
|
+
after the freeze (pre-dispatch amend paths). Both refuse if any lane has
|
|
26
|
+
`dispatched_at` OR `integrate_sha` — moving `freeze_sha` or rewriting a frozen
|
|
27
|
+
section after a builder has run against the AC breaks the cardinal invariant
|
|
28
|
+
(AC freeze before results exist; judging quotes the freeze commit). The guard
|
|
29
|
+
names the offending lane and the reason.
|
|
30
|
+
- **`architect merge --into <branch>` / `--commit-mode <mode>`** — wires the
|
|
31
|
+
existing `merge_lane!` `into:`/`commit_mode:` kwargs through the `Merge` CLI,
|
|
32
|
+
matching `Integrate`'s surface.
|
|
33
|
+
- **`architect provision --force` / `worktree add --force`** — `worktree_add`
|
|
34
|
+
gains a `force: false` kwarg. When a worktree dir exists but is unknown to git
|
|
35
|
+
(stale, e.g. left by an aborted provision), `force: true` clears it via
|
|
36
|
+
`FileUtils.rm_rf` and re-creates; without `force` it still raises with a
|
|
37
|
+
`--force` hint so a genuine git-tracked dir is never silently destroyed.
|
|
38
|
+
`ensure_lane_materialized` (the auto-recovery path) stays non-force —
|
|
39
|
+
auto-recovery never silently `rm -rf`s; only an explicit operator `--force`.
|
|
40
|
+
|
|
41
|
+
### Changed
|
|
42
|
+
|
|
43
|
+
- **`dir/**` in-bounds touch glob is now recursive** — matches
|
|
44
|
+
`Dir.glob('**/**')` semantics; single-star `*` stays non-recursive.
|
|
45
|
+
Deep-globbed files inside a lane's declared touch set are in-bounds; outside
|
|
46
|
+
is still a spec defect (#52, #54).
|
|
47
|
+
- **`dispatched_at` recorded in `space.yaml` at dispatch time** (#18).
|
|
48
|
+
|
|
49
|
+
### Fixed
|
|
50
|
+
|
|
51
|
+
- **Canonical `section`/`freeze` commit message shape** — per-section commits
|
|
52
|
+
and the freeze commit carry the correct canonical prefix and body.
|
|
53
|
+
- **`space run --help` steers to the `--` separator** — a quoted multi-word
|
|
54
|
+
command otherwise arrives as one argv token → opaque in-guest failure; the
|
|
55
|
+
desc/argument/example now show the `--` form, with a subprocess test (#28).
|
|
56
|
+
- **Dropped a load-time "assigned but unused variable" warning** — `build_dir`
|
|
57
|
+
in `worktree_add` was computed but never read.
|
|
58
|
+
|
|
59
|
+
## [5.0.0] - 2026-07-06
|
|
60
|
+
|
|
61
|
+
### Added
|
|
62
|
+
|
|
63
|
+
- **`architect dispatch --prompt <file>`** — the lane prompt is authored anywhere
|
|
64
|
+
(a fresh scratch file) and dispatch copies it byte-for-byte to the canonical
|
|
65
|
+
`build/<id>-<lane>/prompt.md` before launch, announcing the copy. The CLI owns
|
|
66
|
+
the canonical path; the architect never blind-writes it (#48, #42).
|
|
67
|
+
- **`architect brief new --from <file>` / `--stdin`** — write the authored brief
|
|
68
|
+
in one step instead of filling a pre-seeded template. Bare `brief new` still
|
|
69
|
+
scaffolds the placeholder, and now says so
|
|
70
|
+
(`Brief ready: … (template — Read it before editing)`).
|
|
71
|
+
- **Flexible commit messages on every committing loop command** — `init`, `new`,
|
|
72
|
+
`freeze`, `brief new`, `section`, `verdict`, `evidence`, `merge`, and
|
|
73
|
+
`integrate` all take `-m`/`--message` and `--message-from <file>`. The first
|
|
74
|
+
line completes the subject after a short canonical prefix (`I01 spec: <your
|
|
75
|
+
subject>`, `lane <lane>: <your subject>`); remaining lines become the commit
|
|
76
|
+
body. Without the flags, the canonical messages are unchanged. The space's git
|
|
77
|
+
log is the loop's durable memory — detailed bodies are the point.
|
|
78
|
+
|
|
79
|
+
### Changed
|
|
80
|
+
|
|
81
|
+
- **`worktree add`/`provision` no longer pre-seed `prompt.md` with a placeholder
|
|
82
|
+
stub.** The unannounced stub made the architect's first `Write` trip the
|
|
83
|
+
harness read-before-write guard on every single lane (a failed-write → read →
|
|
84
|
+
rewrite round trip; 40 occurrences mined from real transcripts). Dispatch
|
|
85
|
+
still refuses a missing, empty, or legacy-stub prompt (#48, #42).
|
|
86
|
+
- **`architect merge --message` semantics** — the message now composes with the
|
|
87
|
+
canonical `lane <lane>:` prefix (subject + body) instead of replacing the
|
|
88
|
+
whole message, matching every other committing command.
|
|
89
|
+
- **Skill prose** — the architect authors all content (lane prompts, brief, PR
|
|
90
|
+
bodies) in fresh timestamped scratch files and hands them to the CLI via
|
|
91
|
+
`--from`/`--prompt`; PR bodies land at
|
|
92
|
+
`build/land/<repo>-pr-body-<yyyymmdd-hhmm>.md`; committing commands should
|
|
93
|
+
carry detailed `--message-from` bodies.
|
|
94
|
+
|
|
95
|
+
## [4.0.0] - 2026-07-05
|
|
96
|
+
|
|
97
|
+
Backfilled — the bump shipped without an entry. Five iterations run through the
|
|
98
|
+
Architect Loop against `space-architect`'s own live-loop papercuts (#46), plus
|
|
99
|
+
the `dispatched_at` producer (#45) and a test-suite hygiene pass (#32).
|
|
100
|
+
|
|
101
|
+
### Added
|
|
102
|
+
|
|
103
|
+
- **`architect provision <iteration> [--base <ref>] [--lane <name>]`** — materializes
|
|
104
|
+
every declared lane's worktree + `lane/<id>-<lane>` branch in one shot from the
|
|
105
|
+
frozen lane plan (idempotent; base resolves `--base`, else `project/<slug>` HEAD,
|
|
106
|
+
else the repo's default branch). `dispatch`/`integrate`/`gate`/`verify`
|
|
107
|
+
auto-materialize a missing worktree from the frozen declaration, so the flow
|
|
108
|
+
can't dead-end (#26).
|
|
109
|
+
- **Fenced ` ```lanes ` block in the Specification** — `name`, `repo`, `touch`
|
|
110
|
+
globs, parsed at **freeze** into `space.yaml` lane entries, making the lane plan
|
|
111
|
+
(including the out-of-bounds touch-set contract) part of the frozen spec (#26).
|
|
112
|
+
- **`space.yaml` schema v2** — the never-bumped `version` key now means something:
|
|
113
|
+
canonicalize on save, read + self-heal the two known v1 variants (v1a
|
|
114
|
+
`architect:`, v1b `project:`+`version: 1`) on load; a both-keys conflict refuses
|
|
115
|
+
and names both blocks rather than silently picking one (#33).
|
|
116
|
+
- **`dispatched_at` on lane entries** — every dispatch stamps an ISO 8601 launch
|
|
117
|
+
time after preflight, before the run, on both foreground and detached paths
|
|
118
|
+
(#18, producer landed via #45).
|
|
119
|
+
- **Self-verifying dispatch liveness** — a transient fiber inside dispatch checks
|
|
120
|
+
the launched run matches intent (model, growth of `run.jsonl`), retiring the
|
|
121
|
+
manual "canary" ceremony (#43, #44).
|
|
122
|
+
- **`architect help` grouped by loop phase** — Spec / Build / Judge / Land /
|
|
123
|
+
Project, commands in loop order, with an embedded loop-status block when run
|
|
124
|
+
inside a project space; `space status` reports on a bare call and still sets on
|
|
125
|
+
`space status <value>`.
|
|
126
|
+
|
|
127
|
+
### Changed
|
|
128
|
+
|
|
129
|
+
- **Lane declaration is single-source-of-truth** — lanes were declared twice
|
|
130
|
+
(Specification prose + `worktree add` flags) with the touch-set divorced from
|
|
131
|
+
the frozen spec; the ` ```lanes ` block at freeze is now the one declaration.
|
|
132
|
+
The single-lane "dispatch in the repo checkout" fast path is removed (it never
|
|
133
|
+
worked with `merge_lane!`); manual `worktree add` remains as the internal
|
|
134
|
+
primitive `provision` wraps (#26).
|
|
135
|
+
- **Skill prose** (`SKILL.md` §4–§6, `dispatch.md`) rewritten to the
|
|
136
|
+
declare → freeze → provision → dispatch lane lifecycle.
|
|
137
|
+
|
|
138
|
+
### Fixed
|
|
139
|
+
|
|
140
|
+
- **`architect integrate <it> --teardown`** (no `--lanes`) backtraced; teardown-only
|
|
141
|
+
mode now deletes per-lane branches and worktrees, never `project/<slug>` or
|
|
142
|
+
`main` (#30).
|
|
143
|
+
- **Test suite hygiene** — zero warnings, zero stray output, 58.8s → 49.1s (#32).
|
|
144
|
+
|
|
8
145
|
## [3.0.0] - 2026-07-01
|
|
9
146
|
|
|
10
147
|
### Added
|
data/README.md
CHANGED
|
@@ -271,8 +271,12 @@ build/
|
|
|
271
271
|
```
|
|
272
272
|
|
|
273
273
|
**Iteration file anatomy** — one file, grown section by section. You author the
|
|
274
|
-
*content
|
|
275
|
-
|
|
274
|
+
*content* in fresh scratch files; the CLI owns the *persistence* (each command
|
|
275
|
+
writes the section, commits it, and prints back what changed). Every committing
|
|
276
|
+
command takes `-m`/`--message` and `--message-from <file>` — your first line
|
|
277
|
+
completes the subject after a short canonical prefix (`I01 spec: <subject>`),
|
|
278
|
+
the rest becomes the body. The space's git log is the loop's durable memory:
|
|
279
|
+
write detailed messages.
|
|
276
280
|
|
|
277
281
|
| Section | Holds | How you persist it |
|
|
278
282
|
|---------|-------|--------------------|
|
|
@@ -299,12 +303,12 @@ inside a lane worktree are never grounded.
|
|
|
299
303
|
|
|
300
304
|
```sh
|
|
301
305
|
architect init # scaffold ARCHITECT.md + the space.yaml project: block + SessionStart hook
|
|
302
|
-
architect brief new
|
|
306
|
+
architect brief new --from <f> # write the durable project BRIEF.md (authored in a scratch file)
|
|
303
307
|
architect new <iteration> # scaffold architecture/I<NN>-<iteration>.md
|
|
304
|
-
architect section <it> <section> --from <f> # write + commit a section
|
|
308
|
+
architect section <it> <section> --from <f> # write + commit a section (add -m/--message-from for a detailed commit)
|
|
305
309
|
architect freeze <iteration> # freeze the Acceptance Criteria ❄️
|
|
306
310
|
architect worktree add <repo> <it> <lane> # isolated worktree per lane (2–4 lanes)
|
|
307
|
-
architect dispatch <it> <lane>
|
|
311
|
+
architect dispatch <it> <lane> --prompt <f> # copy the lane prompt in + dispatch a builder (--detach to survive long runs)
|
|
308
312
|
architect verify <iteration> # post-flight mechanical checks (reports only)
|
|
309
313
|
architect evidence <it> --lane <lane> # transcribe the builder's report verbatim
|
|
310
314
|
architect gate <iteration> # run the frozen gate commands, stream raw output
|
|
@@ -326,9 +330,9 @@ A typical session:
|
|
|
326
330
|
```sh
|
|
327
331
|
architect init # first time
|
|
328
332
|
architect new my-feature # scaffold I01-my-feature.md
|
|
329
|
-
architect section my-feature specification --from spec.md
|
|
333
|
+
architect section my-feature specification --from spec.md -m "pull-based dispatcher seam"
|
|
330
334
|
architect freeze my-feature # lock it ❄️
|
|
331
|
-
architect dispatch my-feature lane-a --detach
|
|
335
|
+
architect dispatch my-feature lane-a --prompt tmp/prompts/I01-lane-a.md --detach # send a builder; poll the report
|
|
332
336
|
architect verify my-feature # mechanical post-flight checks
|
|
333
337
|
architect evidence my-feature --lane lane-a # transcribe raw evidence
|
|
334
338
|
architect gate my-feature # run the frozen gates yourself
|