← Context/ loops
Loop through a spec — write the plan, implement, test, changelog, commit, repeat until Shipped
The phase loop that took Augment-From-DB-Flow from Signed-Off to Shipped in one day: plan, implement, prove, changelog, commit — per phase.
context-v/loops/is an experimental folder (per the context-vigilance skill) and this is its first occupant here. Expect the shape to drift as more loops get codified.This one was codified retrospectively — the run came first because there was no example to write against. Next time, invert it: author (or update) the loop doc before running, using this file as the template. The doc is the durable definition; the session is the execution.
What this loop is
A per-phase execution cadence for a spec that is already Signed-Off and decomposed into phases. The spec is the contract; each iteration turns one phase into a plan, lands it, proves it, records it, and pushes it — so the repo is never more than one phase away from a green, documented, pushed state. First proven on Augment From DB Flow (five phases in one session, 2026-07-22).
Preconditions: a Signed-Off spec with a phase decomposition whose Phase 1 is service/data-layer work (surfaces come after their capabilities — this ordering is what makes later phases UI-only and cheap); a proof-script convention; the changelog and git-conventions skills.
The loop at a glance
flowchart TD
SPEC["Spec: Signed-Off,<br/>phases 1..N"] --> PICK["Take next phase"]
PICK --> PLAN["1 · Author plan<br/>re-ground against LIVE code;<br/>correct spec drift explicitly"]
PLAN --> IMPL["2 · Implement<br/>from named in-repo templates"]
IMPL --> TEST["3 · Test, scriptable-first<br/>(the ladder, below)"]
TEST --> GREEN{proof green?}
GREEN -- "no" --> STOP1(["STOP — surface it;<br/>never build a phase on red"])
GREEN -- "yes" --> LOG["4 · Changelog entry<br/>honest about what was NOT tested"]
LOG --> FLIP["5 · Status flips<br/>plan → Shipped + post_ship_note;<br/>spec → Implementing / Shipped"]
FLIP --> COMMIT["6 · Commit + push<br/>attempt(flow, capability, stepN)<br/>explicit paths only"]
COMMIT --> MORE{phases left?}
MORE -- "yes" --> PICK
MORE -- "no" --> MILE["milestone(flow): verdict<br/>empty marker commit"]
MILE --> DONE(["Loop ends.<br/>Usability iteration = a NEW loop"])
PLAN -. "spec turns out WRONG<br/>(not just drifted)" .-> STOP2(["STOP — revise spec<br/>with the user, resume"])The iteration (one phase per pass)
Author the plan —
context-v/plans/<Spec>-Phase-N-<Name>.md,spec_referencein frontmatter. Before writing steps, re-ground against the live code: read the exact files the phase touches. Where reality diverges from the spec's anticipated snippets, the plan corrects the spec and says so explicitly (Phase 1 found three such divergences; Phase 2 found a whole missing verb). The plan names its verification before implementation starts.Implement — smallest dependency-ordered steps, every new file copied from a named in-repo template (the plan lists which). Service verbs cross their three files (handler → capabilities map+timeout → typed client wrapper); remotes follow the scaffold of the newest shipped remote.
Test, scriptable-first — climb the ladder, cheapest to dearest; stop climbing only where the next rung would pollute shared data:
TEXTcost/risk ▲ ┌──────────────────────────────────────────────────────┐ 6 │ operator browser walk-through ── NAMED, not faked │ humans only ────┼──────────────────────────────────────────────────────┤ ───────────── 5 │ live end-to-end, side-effect-safe only │ │ ✓ stream-scan flip test ✗ test persons in canon │ 4 │ container rebuild + raw-NATS proof of new verbs │ │ (the running stack is OLD code until you rebuild) │ 3 │ standing regression: prove-<spec>-capabilities.mjs │ every phase, │ written in Phase 1, re-run every phase │ scripted 2 │ dev-server smoke: curl :PORT/remoteEntry.js │ 1 │ builds — each remote + THE SHELL (catches │ │ federation-registration typos) │ 0 │ svelte-check + tsc --noEmit on everything touched │ └──────────────────────────────────────────────────────┘Changelog — one entry per phase, changelog-conventions shape, honest about what was NOT tested and why.
Status flips — plan →
Shipped+date_first_published+post_ship_noterecording deviations and skipped checks; spec →Implementingon the first phase,Shipped(+ post_ship_note listing what remains human-only) when the last phase lands.Commit + push — one commit per phase:
attempt(<flow-slug>, <capability>, stepN): <impact-first headline>, body per git-conventions (why before how, proof summary included). Stage explicit paths only — never sweep in unrelated dirty state (submodules likeclients/*stay untouched for deliberate tidying). Push each phase; don't batch.
What one pass leaves behind (the artifact trail)
Every iteration deposits the same four artifacts plus one commit — this is the proving run's Phase 2, but every phase leaves the identical shape:
augment-it/
├── context-v/
│ ├── specs/Augment-From-DB-Flow.md ← status flip (+ post_ship_note at the end)
│ └── plans/
│ └── Augment-From-DB-Phase-2-….md ← NEW: the plan, → Shipped + post_ship_note
├── changelog/
│ └── 2026-07-22_02_Org-Workbench-….md ← NEW: one entry, honest about untested legs
├── apps/ | services/ | shell/ ← the code, from named in-repo templates
└── (git) attempt(augment-from-db, org-workbench, step2): … ← one pushed commitStatus lifecycles the loop drives
stateDiagram-v2
direction LR
state "Spec" as S {
[*] --> SignedOff
SignedOff --> Implementing: first phase starts
Implementing --> Shipped: last phase lands
note right of Shipped: post_ship_note lists what stays human-only
}
state "Each phase's Plan" as P {
[*] --> Draft
Draft --> Shipped_: proof green, same day
note right of Shipped_: date_first_published + post_ship_note record deviations and skipped checks
}Exit conditions
All phases shipped → an empty
milestone(<flow-slug>): <verdict>marker commit naming the step range and the known follow-ups. Then stop — usability iteration is a NEW loop with its own findings, not a tail on this one.A phase's proof won't go green → stop the loop, surface it; don't proceed to a phase that builds on red.
The spec turns out wrong mid-phase (not just drifted — wrong) → stop, revise the spec with the user, resume.
Hard-won rules (from the first run)
Quote YAML
revisions:entries. Any list item containing:breaks standard YAML parsers ("mapping values are not allowed in this context"). Double-quote every revision string at write time — this bit four files, two of them pre-existing.The proof script is the loop's spine. Written once in Phase 1, re-run every phase; it converts "did we break the floor?" from a worry into a ten-second check.
svelte-check is not optional even when the build passes — it caught a prop declared in a type but missing from the destructure that rsbuild happily bundled.
Existing seams beat new machinery. Phase 5 was a half-day because
curated_index_urlsalready existed; the plan-authoring step's job is to find that seam BEFORE writing code.Splash content needs
git add -f(the.gitignorecontentrule silently dropssplash/src/content/*), and splash deploys only frommain— a card authored on a work branch ships at reconciliation.Cross-service needs go through NATS verbs, never shared DB access — the dedup read (
content.urls.check) is the pattern, per the domains.ts precedent.
Related
Augment From DB Flow — the proving run's spec (Shipped)
Augment From DB Phase 1 Service Capabilities through Augment From DB Phase 5 Stream Scan Mode — the five iterations
changelog/2026-07-22_01…_05— the paper trail, one per passcontext-vigilance skill §Experimental tier — what
loops/is for; changelog-conventions + git-conventions skills — the formats steps 4 and 6 follow