The N1 Spec System — How we design & build with Claude
The N1 Spec System
Section titled “The N1 Spec System”01 What this is, in one minute
Section titled “01 What this is, in one minute”Every piece of work at N1 — a feature, a bug fix, a new platform service, a product idea, a clinical change — starts life as a spec: a short, structured document that says what we’re doing and how we’ll know it’s done. We write specs with Claude, store them in one repo, and build against them.
The point is to remove drift: the same request producing five different shapes of work depending on who asked and where. The spec is the shared contract. You write it once, properly, and everyone — every teammate and every Claude — reads it the same way.
- You don’t need to be a project-management expert. The format does that work for you.
- A skill called
/specwalks you through it, section by section, and won’t let you skip the parts that matter. - When the spec is done, it goes into the
blueprintsrepo, and that’s what gets built.
The short version: Idea → write a spec (with /spec) → land it in blueprints → Claude Code builds it and opens a pull request → a human reviews and merges. The spec is the thing everything else hangs off.
02 Three Claudes, one repo
Section titled “02 Three Claudes, one repo”We use Claude in three places, each good at a different job. They cannot talk to each other directly — the only thing they share is the repo. So the spec file in git is the bridge between all of them.
- Claude Chat / Desktop (Projects) — where you think, argue, decide, and write the spec.
- Claude Design — where you explore what a frontend should look and feel like; you export the result and link it from the spec.
- Claude Code — where the work actually gets built and a pull request opens.
The Three Surfaces
Section titled “The Three Surfaces”| Surface | Role |
|---|---|
| Claude Chat / Desktop | Think · decide · write the spec. Reads the repo; ends by producing a finished spec you submit. |
| Claude Design | Explore the frontend. Export screens/prototypes into blueprints/design/ for the spec to link to. |
| Claude Code | Build against the committed spec, open the PR. Runs in the terminal, on the web, or from Slack. |
| The repo is the single bridge between them. Because the repo is the only bridge, the repo is the single source of truth. A brilliant idea in a chat that never becomes a committed spec simply doesn’t exist as far as the rest of the team and Claude Code are concerned. |
03 The one rule
Section titled “03 The one rule”The golden rule: Anything that matters gets written into blueprints as a spec. The chat is where you reason; the repo is what persists and what gets built. If a decision lives only in a chat or a Slack thread, it doesn’t exist.
Everything else on this page is just how to follow that rule well.
04 Which spec do I need?
Section titled “04 Which spec do I need?”There are eight types. They are not eight unrelated forms — they all share the same backbone (next section) and each just adds the one or two things unique to it. Pick by the litmus question: the first one you can answer “yes” to is your type. If you’re unsure, /spec asks you these same questions and picks for you.
Spec Types
Section titled “Spec Types”| Type | Pick it when… | What it adds (beyond the backbone) | Layer |
|---|---|---|---|
| Bug Fix | Existing behaviour is wrong versus what it should be. | A reproduction, the root cause, and a permanent regression test (non-negotiable). | either |
| Refactor | When done, the system behaves exactly the same from the outside. | The invariant (“no observable change”) + characterization tests proving it. | either |
| Architecture Decision (ADR) | You’re choosing between options with long-lived consequences and want to record the why. | The decision + the alternatives weighed + the consequences. (Building follows in another spec.) | platform |
| Clinical / CHR | Correctness here is clinical — a wrong output could mislead a clinician. | The clinical claim, the mechanism, the evidence (NLM/NCBI). Organised by mechanism, not organ. | product |
| Contract | It’s an interface two services must agree on, where changing it breaks the other side. | The interface itself — producer, consumers, the binding shape — defined before either side builds. | platform |
| Service | It’s a reusable capability many products could use, knowing none of them. | A clean charter, its public door, and what data it owns. (If it knows “CHR”, it’s not a service.) | platform |
| Product / Initiative Brief | You’re deciding whether and what to build for a user — a new offering, no API yet. | Users/customers and success metrics. The output is a go/no-go and a shape, not code. | product |
| Feature | None of the above — a decided, scoped change inside one codebase. | Data model · API surface · behaviour · frontend (every UI state). | product (usually) |
Common Mix-ups
Section titled “Common Mix-ups”- Bug vs Feature: the system is wrong → Bug; the system is right but you want more → Feature.
- Refactor vs Feature: the test is observable behaviour. Faster but identical output → Refactor. Faster and a new flag → Feature.
- Feature vs Service: one product uses it → Feature; many products could, and it knows none of them → Service.
- ADR vs Service: “we decided to extract identity” → ADR; “here is identity, built” → Service. Big extractions are usually an ADR then a Service spec.
The full criteria, the worked examples, and the templates themselves live in blueprints/specs/_templates/ — start at its README.md (the criteria) or open index.html for the visual “which template?” guide.
05 Every spec: the backbone & the two gates
Section titled “05 Every spec: the backbone & the two gates”Whatever the type, every spec answers the same underlying questions. Most carry all ten sections below; the slim types (Bug, ADR) use tailored headers for the top few but always keep the two gates and the closing checks. The two ⛨ gates are non-skippable — you either fill them in, or write N/A — <why>. They are N1’s two existential pillars, clinical accuracy and security, turned into structure no one can scroll past.
The Spine (Ten Sections)
Section titled “The Spine (Ten Sections)”- Problem — What’s broken or wanted, why now, who’s hurt if we don’t. The one core thing.
- Outcome / Definition of done — What is observably true when finished — checkable from outside, not “the code is written.”
- Scope & non-goals — The boundary — what we are explicitly NOT doing.
- Approach — How, and why this way over the alternatives you weighed. Simplest reliable design.
- Clinical-accuracy gate — Does it touch PHI or change clinical output? If yes: the claim, the evidence (NLM/NCBI — cited, not from memory), and how a wrong output is caught before a clinician sees it. Else
N/A — why. - Security gate — Does it touch auth / data / PHI / secrets / infra? If yes: the boundary, the default-deny posture, where enforcement lives (server side), how it fails secure. Else
N/A — why. - Risks & failure modes — What breaks, the blast radius, and how each failure fails loud / non-zero.
- Verification — How we prove it works — failure/edge tests first (named), the repo gate that must pass, the evidence a reviewer can see.
- Acceptance criteria — A checklist a reviewer ticks against the diff — each line verifiable.
- Open questions — Must be empty before the spec is
ready. Resolve, don’t defer.
When is a spec “ready”?
Section titled “When is a spec “ready”?”A spec is status: ready only when every section is filled, no TBD survives in a load-bearing section, both gates are resolved, and Open questions is empty. That single, checkable rule is the bar. Below it, it’s still a draft.
06 Platform vs product — one field keeps them honest
Section titled “06 Platform vs product — one field keeps them honest”N1’s direction is “AWS for Health Tech”: a platform, with products built on top of it — including our own. forge-runner is the platform; the CHR workflows are products that run on it. Every spec declares which side it’s on with one frontmatter field, layer: platform | product.
Product Layer
Section titled “Product Layer”Things we sell or deliver, built on the platform.
Example: each CHR workflow · white-label products · clinical-trial tooling. Spec types: Product Brief, Feature, Clinical/CHR.
Reaches the platform only through the public door — the Contract Spec
Platform Layer
Section titled “Platform Layer”Reusable primitives behind one clean charter. Product-agnostic.
Example: forge-runner (agentic runtime) · identity · billing · ingestion · data. Spec types: Service, Contract, ADR.
The Boundary Rule
Section titled “The Boundary Rule”A platform service carries zero product-specific logic — forge-runner must not know “CHR” exists. A product reaches a platform service only through its published Contract Spec — never into its basement. If a CHR workflow needs something forge-runner doesn’t offer, that’s a Contract change reviewed at the platform layer, not a quiet reach-in.
Why we bother: “Platform + products” rots when a product team adds “just one product-specific thing” into the platform because it’s faster — and six months later forge-runner is a CHR engine that can’t run anything else. The layer field plus the contract discipline make that leak visible in the spec and the diff before it’s a problem.
07 What a spec actually looks like
Section titled “07 What a spec actually looks like”So you can feel the bar. The top block (the “frontmatter”) is the machine-readable header; the body is the backbone from section 05. This is a Feature spec — every type looks like this, with its own one or two extra sections.
--- frontmatter: the machine-readable header ---type: feature # product-brief|service|contract|feature|refactor|adr|clinical|buglayer: product # platform | productstatus: draft # draft → ready → in-progress → doneowner: arunscope: [api-backend, react-frontend] # repos/services touchedconsumes: [specs/contract/forge-runner.md] # platform doors used (product layer)tracker: https://github.com/.../issues/123related: []
# Spec: <Feature name>
## Problemone paragraph; the single core thing this solves.
## Outcomewhat is observably true when done.
## Scope / Non-goalsin scope … · explicitly NOT in scope …
## Approachthe design, and why this over the alternatives.
### Data modelentities, fields, types, migrations.
### API surfaceper endpoint: method, path, request, response, codes.
### Behaviourlogic, edge cases, invariants. Mark deterministic-must-be-correct vs best-effort/stochastic.
### Frontendflows; every state (default/loading/empty/error/success); links to design exports.
## Clinical-accuracy gatePHI/clinical impact — or "N/A — <why>".
## Security gateauth/data/infra impact — or "N/A — <why>".
## Risks & failure modeswhat breaks; how it fails loud/secure.
## Verificationfailure/edge tests FIRST (named); repo gate (tests / build / alembic heads==1); evidence.
## Acceptance criteria[ ] reviewer-checkable lines.
## Open questionsempty before status: ready.You rarely type this from scratch — /spec scaffolds it and fills it with you. The point of seeing it here is to recognise it when you do.
08 Your workflow, step by step
Section titled “08 Your workflow, step by step”This is the day-to-day. Most people do all of this in Claude Desktop / web; a few who live in git do steps 1–4 in Claude Code instead. Both end in the same place.
Step-by-Step Workflow
Section titled “Step-by-Step Workflow”-
Start in your N1 Specs project — Open a chat and describe the work in plain language — a bug, a feature, an idea, a service, whatever it is. No need to know the spec type yet.
-
Run the spec skill — Type
/spec(in Claude Desktop / web) or/n1:spec(in Claude Code). It asks the litmus questions, picks the right type, and confirms it with you in one line. -
Fill it in, section by section — The skill walks the backbone with you and asks wherever a fact is missing. Don’t let it guess paths, schemas, or evidence — give it the real ones, or mark an open question. It forces both gates.
-
Reach the ready bar — Keep going until every section is filled, no
TBDis left in anything load-bearing, both gates are resolved, and there are no open questions. Now it’sready. -
Land it in
blueprints— Working in git: commit the spec underspecs/<area>/<name>.mdand open the PR yourself. Everyone else: open an issue inblueprintswith the finished spec pasted in, and a maintainer commits it. (An automated “New Spec” intake that validates the spec and opens the PR for you is planned, not yet built.) -
Build & review — Claude Code implements against the committed spec and opens a PR. A human reviews the spec before build and the PR after. Merge when it’s clean and green.
09 What’s required from you
Section titled “09 What’s required from you”The skill does the heavy lifting, but a few things are on you — they’re what make a spec trustworthy enough to build from without a back-and-forth.
- Produce a spec, not loose notes. Any real work becomes a spec in
blueprints. A chat decision that never lands doesn’t count. - Pick the honest type. Don’t force a Bug into a Feature to skip the regression test, or call a Feature a Refactor. The litmus is there to keep you honest.
- Give real facts, never invented ones. Paths, schemas, versions, API shapes, evidence — supply the true ones or mark an open question. A fabricated detail is worse than a blank.
- Pin the things that must match exactly. Write API shapes, data models, and acceptance criteria as precise, checkable lines —
POST /v1/sessions {email} → 201 {token}, not “add a login endpoint.” Prose carries intent; structure carries the facts that can’t be read two ways. - Resolve both gates. Clinical accuracy and security are never left blank. If they don’t apply, say
N/A — <why>and why. - Hit the ready bar before you submit. No open questions, no load-bearing
TBD, both gates done. If it’s not ready, it stays a draft. - Write plainly. Explain a thing before naming it. The reader might be a teammate with zero context — or a Claude six months from now.
10 One-time setup
Section titled “10 One-time setup”You only do this once. After that, /spec is just there.
For everyone (each person, once)
Section titled “For everyone (each person, once)”- In Claude (web / Desktop), create a Project called something like “N1 Specs”.
- Open its custom instructions and paste in the block from
blueprints/shared-project-instructions.md. That’s what makes/specactivate reliably and sets the spec-first workflow. - (Optional) connect the
blueprintsrepo as project knowledge — read-only — so Claude can read the live templates and examples.
Already done for you (by an admin, once for the org)
Section titled “Already done for you (by an admin, once for the org)”- The
/specskill is provisioned org-wide in Claude (Settings → Skills), so it’s available to every member automatically. - In Claude Code, the same skill ships in the
n1plugin as/n1:spec— it’s there once your plugin is up to date.
The names differ by surface — same skill: On Claude web / Desktop it’s /spec. In Claude Code it’s /n1:spec (Code namespaces plugin skills). Same behaviour either way. Full setup checklist: blueprints/SETUP-A-PROJECT.md.
11 Why specs don’t get interpreted differently
Section titled “11 Why specs don’t get interpreted differently”A fair worry: if two people (or two Claudes) read the same spec, do they build the same thing? The honest answer, because a comfortable lie here would poison everything downstream.
The honest truth
Section titled “The honest truth”You cannot make two Claudes emit identical code. Two models — or two versions of the same model — reading the same prose can produce different implementations. So the system does not depend on identical generation. It depends on pinning what must match and checking it. This is N1’s own deterministic/stochastic line, applied to specs.
Interpretation is driven to zero where it matters in three moves:
-
Pin the contract, not the prose — The must-match facts — API shapes, data models, file paths, contracts, acceptance criteria — are written as precise, checkable lines, not loose English.
POST /v1/sessions {email} → 201 {token}can’t be read three ways; “add a login endpoint” can. -
One source, checked at the end — The spec is the single canonical artifact. Every implementation is verified against its acceptance criteria + failure-first tests + the repo’s own gate. Different Claudes may take different paths; they must reach the same checkable outcome.
-
The check isn’t the model — Validation is the repo’s tests and a deterministic completeness check — it never asks a model to behave. A Sonnet, an Opus, a Claude Code from next year — all hit the same check. It survives model updates because it isn’t a model.
And one quiet lever: a detailed spec turns implementation into transcribing a contract, not inventing a design. Low-creativity tasks have low variance to begin with — the structure does most of the convergence before any check runs. That’s also why the discipline in section 09 (give real facts, pin what must match) is on you: it’s what makes this hold.
12 What we don’t promise
Section titled “12 What we don’t promise”The honesty that makes the rest credible.
- Not identical code. Sameness lives in the checked outcome, not the generated text. Two builds can differ in naming and layout and both be correct.
- Not “the chat is enough.” A decision that lives only in a chat doesn’t exist until it’s a committed spec. Chat and Design advise; the repo is truth.
- Not “no review.” A human reviews the spec before build and the PR after. The system makes review fast and uniform — it doesn’t replace it.
- Not “model updates are free.” A new model may implement differently; the checks are what keep that safe, which is why the checks, not the model, are load-bearing.
