First-pass design doc codifying the Spire development cycle: six stages (brainstorm → research → design → plan → athanor → review), review decision tree, Athanor queuing rules, workpad mapping. Session journal and fix reports included.
82 lines
5.2 KiB
Markdown
82 lines
5.2 KiB
Markdown
# Design: The Spire Development Cycle
|
|
|
|
**Date**: 2026-09-22
|
|
**Source**: Gitea issue #5, journal `journals/2026-09-21-14-agent-rails.md`
|
|
**Status**: first pass — expect refinement
|
|
|
|
## The shape
|
|
|
|
The cycle is a loop, not a pipeline. Review is the decision point; it can send work back to any earlier stage, but almost always one step.
|
|
|
|
```
|
|
brainstorm ──> research ──> design ──> plan ──> athanor ──> review ──> done
|
|
^ ^ ^ |
|
|
| | '── medium+ issues ──' short loop (common)
|
|
| '──────── design is wrong ─────' long loop (rare)
|
|
'──────────────────── new problem space ────' long loop (rare)
|
|
```
|
|
|
|
A **goal** anchors the loop. Goals are user-owned (`goals/`, read-only to agents; Igor may draft one on the user's behalf) and do not change during a cycle. A changed goal is a new cycle.
|
|
|
|
## Stages
|
|
|
|
| Stage | Who | Input | Output |
|
|
|---|---|---|---|
|
|
| 1. Brainstorm | Igor with user (or Pinky) | goal or hunch | `brainstorm/` — options, no commitment |
|
|
| 2. Research | researcher / adept | open questions | `research/` — findings |
|
|
| 3. Design | independent Opus agent (never the planner or Athanor) | goal + research | `designs/` — one approach, buildable |
|
|
| 4. Plan | independent Opus planning agent (never the designer or Athanor) | a design | `plans/` — steps, files, completion criteria; may be several |
|
|
| 5. Implement | **Athanor** | one plan | code on a branch; run report in `reports/` |
|
|
| 6. Review | fresh Opus reviewer (never the Athanor that cooked it) | diff + plan | `reports/` — findings with severity |
|
|
|
|
**Brainstorm** usually precedes the cycle proper; skip it when direction is clear.
|
|
|
|
**Research** is the most-skipped and most-decisive stage. If a design stalls on an unknown, research it — do not guess.
|
|
|
|
**Design** is convergent. Igor resolves open questions by picking the most likely answer and flagging it inline (`**Assumed:** ...`). A question becomes a blocker only when a wrong pick would waste the implementation — then it goes to research or the user.
|
|
|
|
**Plan** is the entry to the implementation loop: before it is thinking, after it is production. A plan must run in the Athanor without conversation.
|
|
|
|
**Implement**: the Athanor is the oven. A plan goes in, code comes out. It does not talk, ask, or surface partials mid-run.
|
|
|
|
**Review** measures output against the plan and design, not taste. Severity: `low` (nits), `medium` (wrong but contained), `high` (load-bearing, or plan not fulfilled).
|
|
|
|
## Review decision tree
|
|
|
|
1. **None or low only** — done. Lows stay in the report; fold into a later plan or drop. Never loop for lows.
|
|
2. **Any medium or high** — collect all findings into a new plan (step 4). The normal short loop; expect two or three turns.
|
|
3. **The approach is wrong, not the code** — back to design (step 3). Append a dated amendment; do not rewrite.
|
|
4. **An unresearched unknown surfaced** — back to research (step 2). Only for a genuinely new problem space, never for iteration.
|
|
5. **The goal is wrong** — stop. The user's call.
|
|
|
|
Igor routes and journals the decision. Default to the shortest loop that fits; long loops need a stated reason.
|
|
|
|
## Athanor queuing
|
|
|
|
Plans enter the Athanor **sequentially**; Igor holds the queue.
|
|
|
|
- Multiple plans from one design run in dependency order; each starts from the committed result of the previous, with review between.
|
|
- **A new plan arriving mid-run waits.** The door is closed; Igor sends nothing into a running Athanor. It is dispatched when the current run reports back.
|
|
- **If a new plan invalidates the one cooking**, Igor stops the run (`TaskStop`), shelves the partial output, and dispatches the replacement. **Assumed:** rare enough that manual stop suffices.
|
|
- Parallel Athanors only for disjoint code, each in its own worktree. Default is one.
|
|
|
|
## Cycle and workpad
|
|
|
|
Each stage writes to one folder; moving forward creates a new file, never mutates the previous one. The trail through the folders *is* the record of the cycle. A re-plan is a new dated file in `plans/` linking to the review report; a design amendment is a dated section on the existing design.
|
|
|
|
`journals/` is cross-cutting — every dispatch, routing decision, and loop-back gets a line. `specs/` sits outside the cycle: written when a cycle produces something that must not drift.
|
|
|
|
## Not part of the cycle
|
|
|
|
- **Conversation** — reasoning with the user, deciding direction. Igor's own job.
|
|
- **Ad-hoc questions** — a scout or adept answers; nothing enters the loop.
|
|
- **One-off tasks** — typo, commit, obvious small fix. Direct Sonnet/Haiku dispatch; no plan, no review.
|
|
- **Maintenance** — curation, adept handoffs, Zathras. Alongside the cycle, not inside it.
|
|
|
|
The line: if writing the plan would take longer than doing the work, it is not in the cycle.
|
|
|
|
## Settled rules
|
|
|
|
- **Plans and designs are always written by independent agents** — not Igor, not the Athanor. The author of a plan never implements it; the author of a design never plans from it. Separation keeps review honest.
|
|
- **The Athanor commits** — on its branch, per plan step. Nobody opens PRs.
|