spec¶
From intent to scenarios the reviewer can verify. The phase where you decide what gets built.
| Role | The analyst. Cares about the observable result, not the solution. Asks at most three questions per round, proposes defaults, never accepts "works well" as an outcome. |
| Who decides | You approve the proposal in the conversation: these scenarios together with the approach and the tests of the plan; the assistant records it with atipspec accept <slug> proposal --code <code>. Stop point 1. |
| Produces | requirements and scenarios in .atipspec/specs/<capability>.md; the delivery's spec.md with the intent, what is out of scope, the quality limits and the IDs it lists |
How to run it¶
If the delivery does not exist yet, the model creates it with atipspec new.
Then the skill runs atipspec spec password-reset, which prints the
workflow, the rules and the context. A guided delivery needs nothing else to
start; check warns while the contract is not accepted. A fix delivery uses
fix instead, and a legacy delivery
needs the contract's acceptance first.
What the model does¶
- Reads the context the command printed: the contract, overview, glossary, the living specs in the impact list and the decisions that affect them. It uses the glossary's words and asks before accepting a synonym.
- Asks only what the project does not already answer, in rounds of at most three questions, highest impact first, each tied to the decision it changes and with a proposed default; it asks another round while a consequential decision is open. It settles, in this order: actor and trigger; happy path; failure paths (invalid input, missing data, permissions, timeouts); data created, changed or deleted; out of scope; quality attributes as a number with how it is measured, or none; conflicts with existing behavior or the contract.
-
Takes an ID prefix once for the delivery with
atipspec ids authand writes the requirements and their scenarios in the capability's living spec,.atipspec/specs/auth.md:### REQ-AUTH-7KQ2M-001: The user can request a reset link From the sign-in screen the user enters an email and receives a link. Why: support tickets for forgotten passwords are 40% of the queue. #### AC-AUTH-7KQ2M-001: Registered email - **GIVEN** a registered user with the email "ana@example.com" - **WHEN** the user requests a reset for "ana@example.com" - **THEN** the system sends a reset link to "ana@example.com" within 60 seconds #### AC-AUTH-7KQ2M-002: Unknown email - **WHEN** a reset is requested for "nobody@example.com", which no user has - **THEN** the system shows "Check your email" and sends nothing ### REQ-AUTH-7KQ2M-002: The link expires #### AC-AUTH-7KQ2M-003: Link older than 30 minutes - **WHEN** a link issued 31 minutes ago is opened - **THEN** the page shows "link expired" and sends nothing ### REQ-AUTH-7KQ2M-003: Reset requests under load #### AC-AUTH-7KQ2M-004: One hundred requests a minute - **WHEN** 100 users request a reset within one minute - **THEN** the p95 response time measured at the API gateway is below 300 ms -
Fills the delivery's
spec.md:requirementslists the IDs this change writes,## Intentstates the actor, the trigger, the observable result and how you will know it worked,## Out of scopeand## Quality attributes(one- REQ-...: limitline per requirement that states a limit) are decided,- Noneincluded:--- title: "Password reset" status: draft capability: auth owner: ana requirements: [REQ-AUTH-7KQ2M-001, REQ-AUTH-7KQ2M-002, REQ-AUTH-7KQ2M-003] risk: normal --- # Password reset ## Intent A user who forgot the password requests a reset link by email and sets a new password with it, without contacting support. ## Out of scope - Password policy changes. ## Quality attributes - REQ-AUTH-7KQ2M-003: p95 below 300 ms with 100 requests per minute ## Assumptions - The link is single-use. ## Open questions - NoneWhen you bring a document or a list of acceptance criteria, the model runs
atipspec spec-bind password-reset --file <path>, which writes the living spec and the IDs; for a list, it keeps the original and lists under## Import review noteswhat to check. -
Runs
atipspec check password-resetand rewrites what it flags until the only remaining todo is your approval. It quotes only text the interface shows word for word, and names each warning it keeps when presenting. - Proposes the delivery's risk, prepares the plan and
presents
atipspec proposal password-reset, which shows the approval code, the kind and risk, how strictly the criteria are checked, the specification warnings and the diff of the living spec, and asks for your approval in the conversation.
Rules of the interview¶
- At most three questions per round, each tied to the decision it changes; more rounds while a consequential decision is open.
- A default the model proposes becomes a requirement and an assumption you confirm at acceptance, never a silent choice.
- Every scenario with WHEN and THEN and a concrete value in each THEN, no
vague terms, and marked
[manual]when a person observes it;checkreports it otherwise. See writing criteria. - One requirement per behavior a user values, independent of other open changes, small enough for the delivery and testable.
- Quality attributes are numbers with a way to measure them, or nothing.
- An empty
## Intentblocks the proposal, and so does an empty## Out of scopeor## Quality attributes: write- Nonewhen nothing applies. - A delivery fits in a working day. Above
max_requirementsthe model proposes splitting it into deliveries under an initiative before asking for the acceptance;checkwarns either way. - Behavior, never implementation.
- A spec with open questions cannot be approved: the proposal shows no code.
capabilityis the living spec that holds the requirements.impactlists every other living spec or contract section the delivery touches:contextloads them andstatuswarns about overlaps with other open deliveries.### REQ-AUTH-7KQ2M-003 [remove]: Exact titlein the living spec, listed underrequirements, deletes that requirement on deliver. This is how behavior is retired: explicitly.- Requirements another open delivery or the living spec already holds keep their IDs; the delivery lists only what it writes.
- A requirement the delivery adds, changes or removes in
specs/without listing it, in its capability's living spec or in another one, is an error at every risk level: the approval hashes only the listed ones, andmerge-checkblocks the rest.
Risk¶
A guided delivery's spec.md states risk: low, normal (what new
writes) or high. The model proposes the level; you approve it with the
proposal, which shows Kind: ... · Risk: ... and what the level asks of the
gate. risk is part of what the proposal's approval hashes, so changing it
afterwards voids that approval. The level adds or removes no approval.
| Level | What the gate asks |
|---|---|
low |
a criterion under Tests: whose test named in Proof: passed in the current evidence needs no reviewer verdict (check says so with an info, and the dossier shows NOT NEEDED with the reason); review.md is still required, every other criterion, manual ones included, needs its verdict and a FAIL still blocks. Removing a requirement (marked [remove] or deleted from specs/), even a listed one, or changing contract.md is an error: check compares specs/ with the requirements committed at the delivery's base and what the integration branch and the deliveries archived in the branch since brought |
normal |
a reviewer verdict for every criterion |
high |
plan.md declares a scope, and a file outside it is an error, even with strict_scope: false; every criterion under Tests: names its test in Proof:, with a Report: (an error that blocks the proposal); the review comes from an isolated session (session: isolated) |
A delivery without risk, legacy ones included, is normal; a legacy
delivery that sets it by hand gets its effects, and check notes the level.
Another value is an error. The review packet states the level, and the
dossier shows it.
Your part¶
Read the proposal as the agreement it is. Change wording, add scenarios, cut scope. When it says what you want, approve in the conversation; the assistant then runs, with the code it presented:
It refuses while a question is open, a scenario is incomplete or the plan has
an error, and when the code does not match the current content; otherwise it
sets status: ready and records a hash of the scenarios, the delivery's
spec.md, the plan's commitments, the contract and the configuration, the
code and the channel. From then on, any edit to them turns the delivery back
into a draft until you approve again, and check names what changed. Claude
Code asks you before the command runs.
Changing the spec later
If the build reveals that a criterion cannot be met, the model must stop and tell you. The spec changes with your agreement, and the delivery goes through the gate again. Criteria are never weakened silently and never deferred.