MethodRequirements engineeringMCPClaude CodeFigmaSafety-critical systems

From the requirements tool to Figma without the copy-paste.

Requirements live in one system. Design lives in another. The trip between them was four to six weeks of reading, re-reading, and pasting. This is the pipeline that made it two days, and the four things it had to get right to be allowed near a production requirements database.

54
requirements extracted, machine-readable, with provenance back to the source
21
wireframe screens across 3 flows, every one carrying its requirement IDs
6
specification defects found against approved requirements, before implementation
19×
smaller artifact than the raw API payload; read many, pay once

Thesis

00

Extract once, into a stable schema, in the repo.

One read-only extraction lands a content-hashed artifact in the repo, and every later task reads that instead of re-querying the source. The agent never writes to the system of record. Not by convention. By construction.

Before and afterboth durations are a practitioner estimate
Before: every task reads, re-reads, and pastes from the requirements tool into its own brief, four to six weeks per brief. After: one read-only extraction into a hashed artifact in the repo, and every task reads the artifact; two days.BEFORE · 4–6 WEEKS PER BRIEFRequirements toolsystem of recordread · re-read · paste → a brief for task Aread · re-read · paste → a brief for task Bread · re-read · paste → a brief for task C …every task pays the reading cost again, and the reasoning leaves with the sessionAFTER · 2 DAYSRequirements toolsystem of recordREAD-ONLYoncemachine_readable/committed · content-hashedtask A reads the artifacttask B reads the artifacttask C … drift check is one hash comparisonread many, pay once · the agent never writes to the source, by construction

Five moves

01
The pipeline in one picturethe fifth move was not planned
Five moves: requirements database, read-only, extracted by script into a hashed repo artifact; the repo feeds downstream requirements tasks and, through MCP with a read-only design system, twenty-one traced wireframes in Figma; twenty-one PNGs alone become an operable demo, which sits outside the read-only and hashed guarantees.SOURCE OF RECORDTHE REPO IS THE PROMPTDESIGNDEMO01SCRIPTRequirements DBSRS + SSRS sections170+ docs, ~5,500 reqsREAD-ONLYextract · GET02SCRIPT · HASHEDmachine_readable/full_text.md · sections.jsonworkitems.json · manifest.jsonMCP · reqs in03AGENT + MEFigma wireframes21 screens, 3 flowsevery screen carries its IDs21 PNGs only04AGENT · 13 TURNSOperable demoreal state, real typingIDs do not surviveread many, pay onceSCRIPT + AGENTDownstream RE taskscross-reference · auditdecompose · traceabilitydrift check by content hashNEVER A WRITE TARGETDesign system librarycomponents + tokensmatches by constructionREAD-ONLYNot in the repo. Not read-only.Not hashed. Most persuasive.accent border = source of truth, read-only by constructiondashed = outside the guarantees
The moves, one at a time
Requirements DB

SRS and SSRS sections in the requirements tool: 170+ documents, around 5,500 requirements. The script reads them through a single GET-only helper; no code path can write back.

machine_readable/

full_text.md, sections.json, workitems.json, and manifest.json, committed with a content hash on canonicalised text. Downstream tasks (cross-reference, audit, decomposition, traceability) read this instead of the source; "did the spec move?" is one comparison.

Figma wireframes

21 screens across 3 flows, generated through MCP against a design-system library the agent can read but never write, so the output matches the system by construction. Every screen carries its requirement IDs; 27 of 38 requirements got status-coded cards.

Operable demo

Built in 13 agent turns from the 21 PNGs alone. Real state, real typing. The requirement IDs, the deviation labels, and the read-only guarantees do not cross that last arrow. It is the least auditable and the most persuasive thing in the chain.

The demo exists because the fourth move produced screens good enough to be the only input to the next stage. Note what does not cross that last arrow: the requirement IDs.

Four guardrails

02

We didn't ask an agent to be careful. We made carelessness impossible to express.

A naive pull returns most of a section, and nobody notices what is missing until review. The failure is silent, so the extraction is a script with tripwires, not a prompt.

Where each guardrail livesfrom the extraction skill's own SKILL.md
Read-only is structuralthe HTTP method is hardcoded once

The HTTP method is hardcoded in a single helper, never passed by callers. No code path can mutate the source. That is why this was allowed to run against a production instance.

Capture / transform splitpure function over captured bytes

Transform is a pure function over captured bytes: re-runnable offline, reproducible, no re-hitting the API while iterating on format. A content hash on canonicalised text makes "did the spec move?" one comparison.

Boundary tripwirestop instead of guess

If a section runs to the end of the document, or its items aren't contiguous, the script stops instead of guessing. This caught a numbering convention that would have produced a tidy export containing only headings.

Direct-child requirementsthe ones subtree matching drops

Requirements hanging directly off a root heading are dropped silently by naive subtree matching. The skill checks for them explicitly. Our own section had two.

Artifact, verbatim

03
The whole extraction prompt · verbatim, IDs and paths generalisedthree sentences; the complexity lives in the skill
Leverage the requirements MCP to extract requirement <ROOT-ID> and its children
into the repository directory requirements/machine_readable/<SECTION_NAME>.
Store it as markdown and json where applicable. Ensure read-only operations.
Before you begin, please let me know if you have any clarifying questions.
Mid-build design corrections · verbatim, typos intact, [subsystem] generalisedthe honest picture of how the work goes: the opening brief is boring, the corrections are the method
directive 1  "Here are the rewuirments for the [subsystem] user interface. Please go
              ahead and analyze these requirements from a UX perspective."
              -> a UX critique before any Figma work. It caught the read/unread
                 defect. Had the build started first, it would have been drawn
                 faithfully into every screen.

directive 9  "Make sure [flow B] has all of the requiremnents in the [flow B] section"
              -> flow B went from 4 screens to 10. Set a completeness bar that
                 flow C then met without being asked.

directive 11 the rule that came out of four floating boxes nobody could classify:
              "If a user sees it, it goes in the window. If it's something the
               specification fails to say, it goes in the requirement card below
               or the Gaps section. Nothing floats over the modal."
Why it's here

The corrections are kept because the screens only show the outcome. Capturing direction as it is given is what stops the reasoning evaporating with the session. Same argument as extracting requirements to the repo, applied to design intent.

What it found

04

Drawing every state proved the requirements incomplete.

Six defect classes, each anchored to an ID in the source system and documented on the canvas as a deviation, never silently absorbed. IDs and content stripped; the taxonomy is the insight.

Six classes, plus one the demo found
Two approved reqs contradict

Two approved requirements that contradict each other when combined.

A state nobody specified

A state no requirement describes, so no screen can be drawn for it.

Happy path only

No failure, retry, or disconnect behaviour specified, on a system where "did my message get through" is safety-adjacent.

Satisfiable, useless

A requirement that can be met to the letter and still leaves the operator with nothing to act on.

Actor unspecified

Unspecified actor and unspecified interaction.

Two reqs, one display

Two requirements that collapse to the same display, losing provenance.

Everything the demo had to invent is an unwritten requirement

A static screen can omit what the specification never says. A working application cannot. Delivery states, notification timing, error handling: the invented parts were also the most convincing parts, and nothing in the demo marked them as invented.

Honest scorecard

05

Say it before the room does.

Which guarantee survives to which stagethe demo column is the argument
01 Requirements DB02 Repo artifact03 Figma wireframes04 Demo
Read-only against the sourceholdsholdsholdslost
Content-hashed not applicableholds not applicablelost
Requirement IDs carriedholdsholdsholds27 of 38 status-coded in Figmalost
Deviations labelled not applicable not applicableholdslost
holds holdslost lost at this stage not applicable not applicable
Two things to say before the room does
"4–6 weeks to 2 days" is an estimate, not a measurement

The requirements-to-wireframes duration is a practitioner estimate from a working session, not a measured baseline. Every other number on this page traces to a file. The defect list and the per-section coverage stand without it.

Does discovery compress on someone else's spec?

Untested here. The wireframes arguably are the user flows, at higher fidelity and traced, but nobody has proven that when the designer did not write the requirements.

Replicate

06

For another team, starting Monday.

Six steps
Clone the reposkills and MCP config included

Config is versioned with the work, so onboarding is a clone and one environment variable.

Set one tokenthe only secret

Nothing else is secret; the repo says so in its own .gitignore.

Capture your sectionnetwork, read-only GET

Read the printed resolution line. Item count and stop item deserve two seconds of human attention.

Transform offlinepure function

Pure function over the captured bytes; re-run it as often as the output format needs.

Verifyfive checks

Count reconciliation, boundary, direct-child requirements, images, description fidelity.

Design, export, demoagent + you

Design the screens against the artifact and the design system, export them as PNGs, hand them to the demo tool. The screens are the specification for the demo, which is the strongest argument for making them complete and self-describing.

Same shape for Jira, Confluence, SharePoint, or any other system of record. What changes is the role: the pipeline does most of the work, and the remaining share is judgment, verification, and presentation. That share has to be staffed deliberately.