Skip to Content
ArchitectureWhy it is shaped this way

Why it is shaped this way

Everything else in this section can be checked against a file. This page cannot: it is the reasoning behind decisions that look arbitrary from the outside and are not, recorded while the reasoning is still recoverable.

Each one is stated with the failure that produced it, because a decision without its failure reads as taste, and taste is the first thing a later contributor overrides.

Why the design stage runs its own interview

It looks like the requirements interview repeated. It is not, and the reason is structural: the requirement set cannot carry technology context, so the design stage either asks or invents.

The precise form of that claim matters, because the loose form is false. No requirement in .sdlc/requirements/ commits to a technology — the requirements content linter treats implementation bias at the business and stakeholder tiers as a defect, and the critic holds the line by judgment at its gate. But .sdlc/requirements/ is not only requirements. The project-level companions carry technology words on purpose: the tamagotchi example’s assumptions.md has a Q-4 asking which of Electron, Tauri or a native toolkit to choose. An open question naming the options is exactly what an unresolved technology decision should look like at that stage.

So the honest statement is: the requirement set names no technology as a requirement, and hands forward the technology questions it could not close. Which still leaves the design stage with two options, ask or invent, and the project’s own history settled which — an earlier build took an unexamined Electron recommendation and paid to rip it out later.

plugin/skills/design/SKILL.md:124-125 currently states the broader version, that nothing in .sdlc/requirements/ says “Tauri” or “Postgres”. Its own worked example contradicts it. Filed as STO-269 #3; the narrow true form is what this page and the design stage guide publish.

Why the component/interface cycle is broken with prose capabilities

A component declares depends_on: [IF-…] and an interface declares provider: CMP-…, so whichever specialist runs first would have to cite IDs the other has not allocated. The pipeline breaks that cycle with transient capability fields written in prose, and the orchestrator does the wiring mechanically afterwards.

This is the pipeline’s least self-evident decision and the one most likely to be “simplified” by someone who has not hit the cycle. The full account, with what each specialist returns and where each transient dies, is on the hand-off contracts page.

Why structural gates run at the formatter, not the critic

Because the artifacts do not exist when the critic runs.

That is the whole reason, and it is worth stating flatly, because the alternative sounds better on paper: catch structural problems before writing anything. It cannot be done. At gate time the set is an in-memory object; in the requirements stage, two of the files the validator hard-gates — assumptions.md and glossary.md — are not assembled until the stage after the gate passes, precisely so the critic’s glossary findings can feed the merge.

The consequence is the division on the invariants page: the critic owns judgment, the formatter owns structure, and the formatter both writes the set and answers for it. Two agent files have stated it wrongly and been fixed — STO-215 and STO-207 — which is why it is written down in three places now.

Why every artifact is atomic

One artifact per file, rather than one document per stage. Four things follow from it, and none of them survive the document form.

A diff shows which artifact changed. A traceability edge addresses a file, so validate_traceability.py can resolve CMP-003 → FR-002 rather than searching prose for a mention. A critic can reject one requirement and re-dispatch it without re-litigating everything around it. And a schema can gate every artifact identically, because every artifact is the same shape: one YAML frontmatter block and a body.

The cost is real — a requirement set is dozens of files, and reading one end-to-end means reading a directory. index.yaml exists to make that cheaper, and is derived rather than authoritative for exactly that reason.

Why the QA stage emits atomic artifacts, not the document its ticket asked for

STO-103 asked for a QA strategy document — test types and rationale, scope by component, risk-based prioritisation, tooling, and coverage targets, written to .sdlc/qa/qa-strategy.md. The stage still writes that file. It is just not the artifact: it is rendered from one.

The reason is the one above, applied to a stage whose own ticket asked for the document form. STO-104’s Definition of Done and STO-105’s traceability graph both consume this stage’s output, and prose is neither a citable gate nor a graph node — the same gap a single prose document would have left unaddressed for either downstream ticket. So the emitted set is atomic TS- files, schema-gated like every other artifact in the pipeline, and qa-strategy.md is projected from that set at the formatter rather than authored directly — the same relationship generate_c4.py’s diagrams have to the component graph — so the document a reader opens and the artifacts a validator gates can never disagree.

What the standards buy

Groundwork does not adopt standards for their authority. Each one is doing a specific job, and a contributor changing a specialist needs to know which job that specialist is answering to.

BABOK tiers (business → stakeholder → solution → transition) stop a stakeholder’s wish from being written as a system behaviour. The tier is the question “whose statement is this?”, answered before anything else, and it is what keeps a business goal from arriving as an untestable FR.

EARS gives functional requirements five sentence patterns instead of free prose. The value is not the grammar; it is that choosing the wrong pattern is visible, and an ambiguous trigger has nowhere to hide once the sentence has to name one.

INCOSE / ISO 29148 is the per-requirement quality checklist the requirements critic applies — unambiguous, verifiable, singular, feasible. It is what the critic’s first phase is, rather than a general standard of care.

ISO/IEC 25010:2023 gives the NFR specialist nine quality characteristics to walk, plus the extensions Groundwork adds (observability, deployability, compliance, cost). It buys protection against omission: the failure mode for non-functional requirements is not writing them badly, it is not thinking of them at all.

ISO/IEC/IEEE 42010 is the architecture-description standard behind the design critic’s per-artifact gate — that an artifact states its concerns and is intelligible to the people who hold them.

ATAM, in the lightweight form the critic runs, requires each architecturally significant requirement to be addressed with its tradeoffs and sensitivity points named. It buys the sentence a decomposition usually omits: what this choice costs, and which requirement moves if it changes.

MADR 4.0 is the ADR format. Its value is the rejected options: a decision record with one option is a description, and the ADR generator skips an entry whose alternatives cannot be recovered rather than manufacturing them.

C4 gives the diagrams three fixed altitudes — context, container, component — so a diagram cannot mix them. The views are projected from the component graph by generate_c4.py, not drawn, which means they cannot disagree with the artifacts they are drawn from.


This page is the why. For the runnable version — what each stage asks, what it writes, and what to do when a gate fails — the user guide is the place to start.

Last updated on