How a product
gets built

The same seven stages, every product.

AI does most of the typing; the decisions are mine.

Principle 01

Software is measured by how well it performs, not how beautifully it was written.

Process is earned, not default. Components everything else depends on carry five-stage quality gates and self-updating indexes; the ones that quietly do their job carry almost nothing — until they have to. Rigour applied before a thing has justified its existence is just cost.

Principle 02

Why we are building it — and what it has to do — is settled before a single line of code is written.

Four of the seven stages happen before implementation begins. The two where AI writes the most are the two that need the tightest direction, which is why judgment concentrates exactly where no tool can help.

  • 01
    DecideStages 01–04 · no code yetAI: none

    Is it worth building at all

    The kill decision. Most ideas do not survive it, and the ones that don't survive save the most time.

    In practice

    Gastrotator v2 is designed but unbuilt. The features that would justify it depend on on-device intelligence, and that has not reached the market penetration to make building it worthwhile yet. Not cancelled — waiting on a condition outside my control.

    Tooling

    No tooling — this stage is thinking
    LLMs used as a very fast, very wide search engine. Nothing to automate: the output is a yes or a no.
  • 02
    DecideStages 01–04 · no code yetAI: sounding board
    Discovery Skill

    What the product actually is

    Deciding the shape — and cutting whole feature areas when they stop serving the product.

    In practice

    Pellucid began as two apps in one, with GitHub in between as a black box: an author and an editor working on the same project, the editor raising feedback the author would pick up. The editor view was cut: I have no real insight into what an editor needs, and guessing would have produced a worse tool than none at all.

    In practice

    Pellucid began as two apps in one, with GitHub in between as a black box: an author and an editor working on the same project, the editor raising feedback the author would pick up. The editor view was cut: I have no real insight into what an editor needs, and guessing would have produced a worse tool than none at all. GitHub became Google Drive, because durability mattered less than the destination being somewhere the intended user already understands.

    Tooling

    Skill for architecture and feature discovery · stages 02–03
    One pass that defines what the product is, what it must run on, and what there is to prioritise — so stages 02 and 03 share a single source of understanding. Undergoing polishing and pruning before it gets its public repo.
  • 03
    DecideStages 01–04 · no code yetAI: research
    Discovery Skill

    What it runs on

    Architecture follows the product, never the reverse. The stack is chosen to satisfy what stage 02 defined — reach, compliance limits, and what the intended users already understand.

    In practice

    Every app is Flutter, because every app is meant to be multiplatform. This site is not Flutter: a static page gains nothing from it. The tooling splits the same way, by purpose rather than preference — Python where it parses code and drives files, JavaScript where the ecosystem is the better fit.

    In practice

    Every app is Flutter, because every app is meant to be multiplatform. This site is not Flutter: a static page gains nothing from it. The tooling splits the same way, by purpose rather than preference — Python where it parses code and drives files, JavaScript where the ecosystem is the better fit. And some tooling is not a program at all: where the job is to direct an agent rather than run a process, it ships as a Skill instead.

    Tooling

    Skill for architecture and feature discovery · stages 02–03
    The same discovery pass surfaces the platform and compliance constraints the stack has to satisfy. Judgment still makes the call; prior lessons come from the memory layer.
  • 04
    DecideStages 01–04 · no code yetAI: sounding board
    Concinnity

    What earns v1, what gets deferred

    A release train rather than a wish list: each version gets a coherent story, and everything else waits its turn.

    In practice
    • Kalkra: multiplayer was built, then cut from v1. It stays out until there is evidence anyone wants it.
    • Pellucid: desktop first, iPad second, two-way sync in 1.2, iCloud in 1.3. Deferred deliberately, not forgotten.
    • Aulos: the inverse. It never reaches v1 on purpose.

    In practice

    • Kalkra: multiplayer was built, then cut from v1. It stays out until there is evidence anyone wants it.
    • Gastrotator: bring-your-own Gemini key was a late addition to v1, added precisely so the hobby project could be shared with other people. It is not a service I want to be paid for, and carrying inference costs for everyone would have made it one.
    • Pellucid: desktop first, iPad second, two-way sync in 1.2, iCloud in 1.3. Deferred deliberately, not forgotten.
    • Aulos: the inverse. It never reaches v1 on purpose. Staying a living codebase is the point, because that is what the framework has to be proven against.

    Tooling

    Concinnity
    Ideas captured into lanes, then ranked head-to-head on an Elo model. Every comparison is stored with rationale and before/after ratings and published as an immutable ranking run, so a scope decision can be replayed months later instead of re-argued. Pending: the discovery pass from stages 02–03 should record its output straight into Concinnity — that hand-off is not built yet.
  • 05
    BuildStages 05–06 · AI does the typingAI: lead
    KarstLoreContextHistory

    Let AI run

    Everything above exists to make this stage possible. Stages 01 to 04 do not produce a document; they produce an executable brief — and given that, the agent can genuinely be let loose.

    In practice

    For anything headed to a storefront, the gates go up first — static analysis, a size ratchet, structural rules, hermetic tests, coverage — so test-driven development is enforced deterministically from the first token, rather than depending on an agent choosing to be disciplined.

    Everything above exists to make this stage possible. Stages 01 to 04 do not produce a document; they produce an executable brief — a sequenced plan, scoped so agents can be handed disjoint pieces, every feature carrying both its objective and the reason it exists, against an architecture already decided. Given that, the agent can genuinely be let loose.

    In practice

    For anything headed to a storefront, the stage starts before the code: the gates go up first — static analysis, a size ratchet, structural rules, hermetic tests, coverage — so test-driven development is enforced deterministically from the first token, rather than depending on an agent choosing to be disciplined. Small experiments skip this entirely; process is earned, not default.

    Work then fans out rather than queues: a lead model decomposing the brief and dispatching each piece to the cheapest model that can carry it, or a provider's swarm mode where one exists. File-level fences keep parallel agents off each other's work.

    This is the only stage I am genuinely hands-off for — my involvement is granting permissions. What comes back is not snippets or a scaffold but one working codebase. With the gates in place it cannot arrive any other way — running is not a hope, it is the precondition of getting through. Which makes it complete enough to argue with. That is precisely what stage 06 needs. You cannot give specific, directed feedback on something you have only imagined.

    This is the stage where the model earns its keep.

    Tooling

    Karst
    Agents get a knowledge graph instead of grep: tree-sitter parsing into SQLite, hybrid semantic and lexical search, kept current by a pre-commit hook that re-indexes changed files.
    Lore
    Hands the agent lessons already paid for elsewhere, so a mistake made once in one project is not made again in another.
    ContextHistory
    Supplies the accumulated project context, so a fresh agent session begins with the history rather than re-deriving it from the code.
  • 06
    BuildStages 05–06 · AI does the typingAI: pair
    KarstLoreContextHistory

    Prune and polish, together

    The longest stage, and the one that cannot be delegated. The gates guarantee the code runs; nothing guarantees it is worth using.

    In practice

    Pellucid looked like Notepad until this stage. Every widget was in place and everything worked — but the entire premise of the app was to get out of the writer's way. The Whisper UI was built here, in the pass after the code already ran. Stage 05 produced a text editor. Stage 06 produced Pellucid.

    The longest stage, and the one that cannot be delegated. The gates guarantee the code runs; nothing guarantees it is worth using. This is where the product acquires the quality that justified building it — the part no brief can specify, no test can assert, and an agent has no way to know is missing, because everything it was asked for is present and working.

    In practice

    Pellucid looked like Notepad until this stage. Every widget was in place and everything worked — a text box with a crowd of controls around it. But the entire premise of the app was to get out of the writer's way, and none of that existed yet. The Whisper UI — chrome that recedes as you type and returns when you reach for it — was built here, in the pass after the code already ran.

    Stage 05 produced a text editor. Stage 06 produced Pellucid.

    The same pass cuts what the first cut over-built. Agents are generous with abstraction and features; most of what gets removed here was never asked for. And it is where defects surface that no gate catches — the ones visible only in how the thing behaves, not in whether it passes.

    This page is in that pass now. Stage 05 produced a structure that worked; everything since has been deciding what stays, what gets added, what is cut, and how it should look. You are reading the output of the stage you are reading about.

    Tooling

    Karst
    The same graph makes pruning safe — dependents and dependencies resolve in milliseconds, and a background scanner flags dangerous patterns as they land.
    Lore
    The direction reverses: what this pass teaches gets written back, so the next project inherits the finding instead of paying for it again.
    ContextHistory
    Records what changed and why, so the reasoning behind a decision outlives the session it was made in.
  • 07
    ShipStage 07 · and everything afterAI: assistant
    store-launch-kit

    Submission, review, and beyond

    The stage most side projects never reach, and the one that decides whether any of it counted. A storefront wants far more than a binary — miss any one item and nothing ships.

    In practice

    Almost none of it is invented at submission time. Kalkra can answer “Data Not Collected” because multiplayer and telemetry were cut, not because the form was filled in optimistically.

    A storefront wants far more than a binary. Screenshots at exact per-device sizes for every form factor, an icon set, a name, subtitle, description, keywords and release notes each under a different character limit; privacy, support and marketing URLs; a data-collection declaration answered item by item; an age-rating questionnaire; export-compliance answers — on top of signing, entitlements and sandboxing being exactly right. Miss any one of them and nothing ships.

    In practice

    Almost none of it is invented at submission time. The reasoning from stages 01 and 02 becomes the description and the release notes. The scope decisions from 03 and 04 are what make the privacy declaration truthful rather than hopeful — Kalkra can answer “Data Not Collected” because multiplayer and telemetry were cut, not because the form was filled in optimistically. The tooling then checks that everything the target store requires is present, and in the shape that store wants, before anything is uploaded.

    Then the review itself, which is a negotiation as much as a checklist. An automated scan once flagged an entitlement as unused. It wasn't — I answered with evidence rather than rebuilding, which kept the release date instead of restarting the clock.

    Tooling

    store-launch-kit
    The checklist made executable — a deterministic answer to whether every asset a given storefront demands actually exists, at the right dimensions and within the right limits. Built because assembling one submission by hand cost weeks.
  • ALL
    OrchestrationBelongs to no single stage

    MCePtion

    The one layer that belongs to no single stage, because it runs the rest.

    The service manager the rest plug into. Discovers servers from a directory contract, validates their manifests, probes health and starts/stops them — across three lifecycle shapes (command-per-client, daemon, external) over stdio or streamable HTTP, behind a single meta MCP endpoint with a manager API and a local dashboard.

    It also serves authoring guidelines to agents writing new servers, so the next one is consistent by construction. The hard rule: every child server stays independently usable, never rewritten behind a proxy.

  • Where the parts live

    None of these was built first and then found a use. Each one exists because a stage asked for something the stage before it couldn't supply — the method came first, and the parts accumulated behind it. The memory layer runs in both directions: Lore and ContextHistory feed a fresh agent session in 05, then take back what 06 teaches.

    ComponentStagesBuilt becauseRepo
    Discovery Skill02–03Product shape and stack were being decided twice, from two different understandingsIn polishing
    Concinnity04A scope decision that isn't recorded gets re-argued three months laterrepo →
    Karst05–06Agents were reading a codebase with greprepo →
    Lore05–06The same mistake was being paid for in a second projectrepo →
    ContextHistory05–06Every new session re-derived the project's history from the coderepo →
    store-launch-kit07Assembling one submission by hand cost weeksPrivate
    MCePtionallSix tools, six lifecycles, no single way to run themrepo →