Spec Studio

An example step may carry a key that survives rewording

spec:carrier.step-keysBusiness Rule · storyready floor ready

Packs: pack:adopter-speed-v1, pack:self-hosting-v1

Design: 9 design entries · 7 pinned declarations · 1 decision

Findings: no errors, no warnings

specs/carrier/step-keys.sdp.md

No open questions and no blocking questions; implementation binding present, verifier binding present, and expected-outcome oracle none.

A test that binds an example through bindExample names each step it handles, and an oracle names each Then step of its example space as an outcome kind. Both names are the step's skeleton, the step text with each slot reduced to its name, so rewording a step renames it and the typecheck fails at every handler and oracle that names it; a generated registrar holds its own handlers and changes with the contract when it is regenerated, so behind a registrar only the oracle's kinds hold a step's name. That break is the right default for a step whose words are its meaning, and the wrong one when an author improves the wording of a step that many examples and tests share. A step key separates the two. An author keys a step once, in the vocabulary its sibling examples share, and the key, not the wording, names the step in the contract and in the test. The key serves the build and the test, not prose: nothing outside an example and its test cites a single step, so the address grammar gains no step segment.

Intent
problem
A test that binds an example's steps directly names each by its text, and an oracle names each Then step the same way, so improving a step's wording breaks every test and oracle that names it, though nothing the step means has changed.
outcome
Let an example step carry a key in a marker, so its contract key and the binding a test holds survive a change of wording, in the Markdown, Gherkin and TypeScript carriers alike.
Rule

The world writes one extraction root holding a parent probe Spec and one child example in the carrier the slot names. The parent is a story-altitude behavior Spec stating scoped, with an Intent outcome, one rule and an example space whose Given steps are the steps the vocabulary slot joins with a semicolon and a space, followed by When the probe runs and Then the probe ends with {result:string}. The child is an example stating scoped that refines and verifies the parent, whose Given steps are the steps the example slot joins the same way, followed by When the probe runs and Then the probe ends with {result: "done"}. In Markdown the two are separate carriers; in Gherkin they are the Feature and one Scenario of one .sdp.gherkin file, with the vocabulary in its @example-space pseudo-scenario; in TypeScript they are two .sdp.ts carriers whose step strings are the same steps. The world extracts the root and generates the contracts, replaces every occurrence of the before text with the after text in every step as written, markers included, and extracts and generates again. A finding read is the first extraction finding of the first run, or the first contract-generation finding of the first run that names the child, and an empty slot value means the run reports none. A binding key is the key the child's step contract gives its first Given step, in the first run and then in the second, and an empty string when no step contract is emitted for the child. The world writes one bindExample handler map against the first contract, one handler per contract key, each declaring its parameters with the names and types that contract gives them and recording which handler each step reaches; it typechecks that unchanged map against the second contract and, when the typecheck passes, runs it with the second contract through planExample and runExamplePlan. stillBound is true only when the unchanged map typechecks and the reworded step reaches the handler it reached in the first run; a changed contract key, slot name or declared slot type makes it false. The import reads the carriers as reworded: the world imports each TypeScript carrier to Markdown, reads the emitted fence line of the parent's first Given step, extracts the imported carriers in a fresh root, and compares each Spec's step keys and step text with the TypeScript graph's.

rule.stepMarker line 23 · specs/carrier/step-keys.sdp.md:23
A step may open its text with a step key marker, [#key] and one space, after its keyword: in a line of a gwt or gwt-vocabulary fence, in a step of a .sdp.gherkin Scenario or @example-space pseudo-scenario, and at the start of a step string in the TypeScript carrier. The key is lower-camel ASCII, the grammar every marker key follows, and an unkeyed step stays lawful. Importing a TypeScript carrier to Markdown writes the marker on every step that carries the key.

spec:carrier.step-keys.gherkin-keyed-step-stays-bound · enabled, spec:carrier.step-keys.reworded-keyed-step-stays-bound · enabled, spec:carrier.step-keys.typescript-keyed-step-imports-keyed · enabled

rule line 24 · specs/carrier/step-keys.sdp.md:24
The marker is carrier syntax: the graph holds the step text without it and records the key apart, so the slot notation, the skeleton, the vocabulary match, the bound point, the readiness floor and the frozen projections read the step text unchanged.
rule.markerRefusals line 25 · specs/carrier/step-keys.sdp.md:25
Step text that opens with [# and does not continue as a marker is refused at its step; a marker later in the text is plain text.

spec:carrier.step-keys.malformed-marker-refused · enabled

rule.oneKeyOneStep line 26 · specs/carrier/step-keys.sdp.md:26
Within one Spec a key names one step and a step carries one key, a step being one skeleton: a key on two skeletons, or two keys on one skeleton, is refused at each step that carries one. A step written more than once needs its marker once and may repeat it. An example space belongs to one Spec, so its keys are unique across the space and the sibling set that binds it. A refused Markdown or Gherkin carrier is refused whole, as for every structure refusal; in the TypeScript carrier the key drops at each site and the Spec stays.

spec:carrier.step-keys.repeated-key-refused · enabled, spec:carrier.step-keys.two-keys-on-one-step-refused · enabled

rule.vocabularyHome line 27 · specs/carrier/step-keys.sdp.md:27
A sibling set shares its parent's vocabulary, and so its keys: an example step that resolves to a step of its parent's example space takes that step's key. A marker on such a step must repeat that key; any other marker, or a marker where the vocabulary step has none, withholds the example's step contract. An example step that no parent's example space declares takes its key from its own marker.

spec:carrier.step-keys.conflicting-example-key-withheld · enabled, spec:carrier.step-keys.gherkin-keyed-step-stays-bound · enabled, spec:carrier.step-keys.reworded-keyed-step-stays-bound · enabled

rule.contractKey line 28 · specs/carrier/step-keys.sdp.md:28
A step's contract key is its key when it has one and its skeleton otherwise, as spec:extraction.executable-contracts derives it. The contract key names the step in the generated contract, the handler a test binds to it, and, for a Then step of an example space, the kind of its outcome.

spec:carrier.step-keys.key-equal-to-a-skeleton-withheld · enabled, spec:carrier.step-keys.reworded-keyed-step-stays-bound · enabled, spec:carrier.step-keys.reworded-unkeyed-step-breaks · enabled, spec:carrier.step-keys.typescript-keyed-step-imports-keyed · enabled

rule line 29 · specs/carrier/step-keys.sdp.md:29
A key names the step and its slots name the step's parameters: the handler bound under a key receives the step's bound values, typed by the vocabulary as an unkeyed handler's are, and a key never names a slot.
rule.rewordedStaysBound line 30 · specs/carrier/step-keys.sdp.md:30
Rewording a keyed step, in the vocabulary and in every example that uses it, leaves its contract key unchanged, so a directly authored handler bound under the key, and an oracle that names it as an outcome kind, compile and run unchanged; an adopted registrar is regenerated, as after every carrier edit, and its authored adapters compile unchanged. Renaming or retyping one of its slots changes its parameters and breaks the binding, as it always has.

spec:carrier.step-keys.gherkin-keyed-step-stays-bound · enabled, spec:carrier.step-keys.reworded-keyed-step-stays-bound · enabled

rule.unkeyedBreaks line 31 · specs/carrier/step-keys.sdp.md:31
An unkeyed step is keyed by its skeleton, as it always was: rewording it changes its contract key. A directly authored handler under the old skeleton fails the typecheck as a missing and an excess property and fails the run at that step; a committed adopted registrar fails the regeneration preflight until it is regenerated; and an oracle that names a reworded Then step by its old kind fails the typecheck.

spec:carrier.step-keys.reworded-unkeyed-step-breaks · enabled

rule.renamedKey line 32 · specs/carrier/step-keys.sdp.md:32
Renaming or removing a key changes the step's contract key: a directly authored handler under the old key fails the typecheck, and when the key names a Then step of the example space, an oracle that names its old outcome kind fails the typecheck too. A key changes only when an author changes it.

spec:carrier.step-keys.renamed-key-breaks · enabled

rule line 33 · specs/carrier/step-keys.sdp.md:33
A step key is not an entry address: the address grammar gains no step segment, prose cites no step, and the location table records none. The generated contract and the code bound to it are a key's only readers, and the typechecker holds them to it; a review that cites one step cites its example Spec and the rules that example exercises.
rule line 34 · specs/carrier/step-keys.sdp.md:34
A step key mints no edge, confers no delivery fact and moves no readiness floor.

4 unkeyed rules.

Verifying examples

An example marker that disagrees with its vocabulary withholds the contract · spec:carrier.step-keys.conflicting-example-key-withheld · ready floor ready

Executable Spec

Given the {carrier: "Markdown"} carriers of a parent whose example space declares the Given steps {vocabulary: "[#cartSize] a customer has a cart with {items:number} line items"}
Given a child example of that parent whose Given steps read {example: "[#basketSize] a customer has a cart with {items: 2} line items"}
When the contracts are generated, the step lines are reworded by replacing {before: "a customer has a cart with"} with {after: "the cart holds"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: ""}
Then the first contract finding about the child is {contractFinding: "contracts/conflicting-step-key"}
Then the child contract binds its first Given step as {bindingKey: ""} and then as {rewordedBindingKey: ""}

Open example

A keyed Gherkin step keeps its binding across a rewording · spec:carrier.step-keys.gherkin-keyed-step-stays-bound · ready floor ready

Executable Spec

Given the {carrier: "Gherkin"} carriers of a parent whose example space declares the Given steps {vocabulary: "[#cartSize] a customer has a cart with {items:number} line items"}
Given a child example of that parent whose Given steps read {example: "a customer has a cart with {items: 2} line items"}
When the contracts are generated, the step lines are reworded by replacing {before: "a customer has a cart with"} with {after: "the cart holds"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: ""}
Then the child contract binds its first Given step as {bindingKey: "cartSize"} and then as {rewordedBindingKey: "cartSize"}
Then the handlers bound to the first contract cover the second: {stillBound: true}

Open example

A step key equal to another step's skeleton withholds the contract · spec:carrier.step-keys.key-equal-to-a-skeleton-withheld · ready floor ready

Executable Spec

Given the {carrier: "Markdown"} carriers of a parent whose example space declares the Given steps {vocabulary: "[#cartSize] the cart has {items:number} items; cartSize"}
Given a child example of that parent whose Given steps read {example: "the cart has {items: 2} items; cartSize"}
When the contracts are generated, the step lines are reworded by replacing {before: "the cart has"} with {after: "the cart holds"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: ""}
Then the first contract finding about the child is {contractFinding: "contracts/duplicate-step-key"}
Then the child contract binds its first Given step as {bindingKey: ""} and then as {rewordedBindingKey: ""}

Open example

A step marker whose key is off the grammar refuses the carrier · spec:carrier.step-keys.malformed-marker-refused · ready floor ready

Executable Spec

Given the {carrier: "Markdown"} carriers of a parent whose example space declares the Given steps {vocabulary: "[#cart-size] a customer has a cart with {items:number} line items"}
Given a child example of that parent whose Given steps read {example: "a customer has a cart with {items: 2} line items"}
When the contracts are generated, the step lines are reworded by replacing {before: "a customer has a cart with"} with {after: "the cart holds"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: "step key markers must be [#<lower-camel ASCII key>] followed by one space and text"}

Open example

Renaming a step key breaks the binding · spec:carrier.step-keys.renamed-key-breaks · ready floor ready

Executable Spec

Given the {carrier: "Markdown"} carriers of a parent whose example space declares the Given steps {vocabulary: "[#cartSize] a customer has a cart with {items:number} line items"}
Given a child example of that parent whose Given steps read {example: "a customer has a cart with {items: 2} line items"}
When the contracts are generated, the step lines are reworded by replacing {before: "cartSize"} with {after: "cartLines"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: ""}
Then the child contract binds its first Given step as {bindingKey: "cartSize"} and then as {rewordedBindingKey: "cartLines"}
Then the handlers bound to the first contract cover the second: {stillBound: false}

Open example

One key on two vocabulary steps refuses the carrier · spec:carrier.step-keys.repeated-key-refused · ready floor ready

Executable Spec

Given the {carrier: "Markdown"} carriers of a parent whose example space declares the Given steps {vocabulary: "[#cartSize] a customer has a cart with {items:number} line items; [#cartSize] the cart is open"}
Given a child example of that parent whose Given steps read {example: "a customer has a cart with {items: 2} line items; the cart is open"}
When the contracts are generated, the step lines are reworded by replacing {before: "a customer has a cart with"} with {after: "the cart holds"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: "names two steps; a step key names one step within a Spec"}

Open example

A keyed step reworded in its vocabulary and its example keeps its binding · spec:carrier.step-keys.reworded-keyed-step-stays-bound · ready floor ready

Executable Spec

Given the {carrier: "Markdown"} carriers of a parent whose example space declares the Given steps {vocabulary: "[#cartSize] a customer has a cart with {items:number} line items"}
Given a child example of that parent whose Given steps read {example: "a customer has a cart with {items: 2} line items"}
When the contracts are generated, the step lines are reworded by replacing {before: "a customer has a cart with"} with {after: "the cart holds"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: ""}
Then the child contract binds its first Given step as {bindingKey: "cartSize"} and then as {rewordedBindingKey: "cartSize"}
Then the handlers bound to the first contract cover the second: {stillBound: true}

Open example

The same rewording without a key breaks the binding · spec:carrier.step-keys.reworded-unkeyed-step-breaks · ready floor ready

Executable Spec

Given the {carrier: "Markdown"} carriers of a parent whose example space declares the Given steps {vocabulary: "a customer has a cart with {items:number} line items"}
Given a child example of that parent whose Given steps read {example: "a customer has a cart with {items: 2} line items"}
When the contracts are generated, the step lines are reworded by replacing {before: "a customer has a cart with"} with {after: "the cart holds"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: ""}
Then the child contract binds its first Given step as {bindingKey: "a customer has a cart with {items} line items"} and then as {rewordedBindingKey: "the cart holds {items} line items"}
Then the handlers bound to the first contract cover the second: {stillBound: false}

Open example

Two keys on one step refuse the carrier · spec:carrier.step-keys.two-keys-on-one-step-refused · ready floor ready

Executable Spec

Given the {carrier: "Markdown"} carriers of a parent whose example space declares the Given steps {vocabulary: "[#cartSize] a customer has a cart with {items:number} line items; [#cartLines] a customer has a cart with {items:number} line items"}
Given a child example of that parent whose Given steps read {example: "a customer has a cart with {items: 2} line items"}
When the contracts are generated, the step lines are reworded by replacing {before: "a customer has a cart with"} with {after: "the cart holds"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: "carries two step keys; a step carries one key within a Spec"}

Open example

A keyed TypeScript step keeps its key through import to Markdown · spec:carrier.step-keys.typescript-keyed-step-imports-keyed · ready floor ready

Executable Spec

Given the {carrier: "TypeScript"} carriers of a parent whose example space declares the Given steps {vocabulary: "[#cartSize] a customer has a cart with {items:number} line items"}
Given a child example of that parent whose Given steps read {example: "a customer has a cart with {items: 2} line items"}
When the contracts are generated, the step lines are reworded by replacing {before: "a customer has a cart with"} with {after: "the cart holds"}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage: ""}
Then the child contract binds its first Given step as {bindingKey: "cartSize"} and then as {rewordedBindingKey: "cartSize"}
Then the carriers imported to Markdown write the parent's first Given step as {importedStep: "Given [#cartSize] the cart holds {items:number} line items"} and keep every step key and step text: {keptOnImport: true}

Open example

Example space

Given the {carrier:"Markdown"|"Gherkin"|"TypeScript"} carriers of a parent whose example space declares the Given steps {vocabulary:string}
Given a child example of that parent whose Given steps read {example:string}
When the contracts are generated, the step lines are reworded by replacing {before:string} with {after:string}, and the contracts are generated again
Then the first extraction finding's message contains {extractMessage:string}
Then the first contract finding about the child is {contractFinding:string}
Then the child contract binds its first Given step as {bindingKey:string} and then as {rewordedBindingKey:string}
Then the handlers bound to the first contract cover the second: {stillBound:boolean}
Then the carriers imported to Markdown write the parent's first Given step as {importedStep:string} and keep every step key and step text: {keptOnImport:boolean}
Design
stepMarker line 51 · specs/carrier/step-keys.sdp.md:51
<keyword> [#<key>] <text> is a keyed step in a gwt or gwt-vocabulary fence line and in a .sdp.gherkin step, with <keyword> one of Given, When, Then and And, and "[#<key>] <text>" is a keyed TypeScript step string; <key> matches ^[a-z][A-Za-z0-9]*$.

no citation recorded

stepKeysField line 52 · specs/carrier/step-keys.sdp.md:52
behavior.stepKeys maps each key to the skeleton of the step it names, in authored order, the example space's steps before the examples' steps; the step strings hold the text with the marker removed; a Spec with no keyed step carries no stepKeys, and the serialized graph writes it after exampleSpace.

no citation recorded

markerRefusal line 53 · specs/carrier/step-keys.sdp.md:53
step key markers must be [#<lower-camel ASCII key>] followed by one space and text is the message, as the finding extract/unrecognized-property at severity error.

no citation recorded

keyOnTwoSteps line 54 · specs/carrier/step-keys.sdp.md:54
step key "<key>" names two steps; a step key names one step within a Spec is the message, as the same finding, at each step that carries the key.

no citation recorded

twoKeysOnStep line 55 · specs/carrier/step-keys.sdp.md:55
step "<skeleton>" carries two step keys; a step carries one key within a Spec is the message, as the same finding, at each step of that skeleton that carries a key.

no citation recorded

stepPath line 56 · specs/carrier/step-keys.sdp.md:56
a step refusal's path is behavior.exampleSpace.<phase>[<i>] or behavior.examples[<n>].<phase>[<i>], with <phase> one of given, when and then and each index counting from 0; the finding carries the step's source line where its carrier reports one and the Spec's line otherwise.
conflictingKey line 57 · specs/carrier/step-keys.sdp.md:57
contracts/conflicting-step-key is the contract-generation warning for an example marker that disagrees with its vocabulary step; it names the example, the step's skeleton, the marker's key and the vocabulary step's key or none, and the example's step contract and registrar are withheld.

no citation recorded

importEmitter line 58 · specs/carrier/step-keys.sdp.md:58
the TypeScript-to-Markdown import writes [#<key>] at the start of every step of the Spec whose skeleton stepKeys maps the key to, so a keyed TypeScript Spec imports keyed.
keyedBinding line 59 · specs/carrier/step-keys.sdp.md:59
bindExample(contract, () => world, { cartSize: (world, { items }) => { … }, "the probe runs": (world) => { … } }) binds a keyed step by its key beside an unkeyed step bound by its skeleton.

no citation recorded

Verification

Verifier bindings

  • spec:carrier.step-keys.conflicting-example-key-withheld · An example marker that disagrees with its vocabulary withholds the contract · declared · example enabled · specs/carrier/step-keys.conflicting-example-key-withheld.sdp.md

    External run evidence from test/self-hosting-step-keys.test.ts

    Test anchors: test:protocol.step-keys.conflicting-example-key-withheld, test:protocol.step-keys.gherkin-keyed-step-stays-bound, test:protocol.step-keys.key-equal-to-a-skeleton-withheld, test:protocol.step-keys.malformed-marker-refused, test:protocol.step-keys.renamed-key-breaks, test:protocol.step-keys.repeated-key-refused, test:protocol.step-keys.reworded-keyed-step-stays-bound, test:protocol.step-keys.reworded-unkeyed-step-breaks, test:protocol.step-keys.two-keys-on-one-step-refused, test:protocol.step-keys.typescript-keyed-step-imports-keyed. Specs verified by those bindings: spec:carrier.step-keys, spec:carrier.step-keys.conflicting-example-key-withheld, spec:carrier.step-keys.gherkin-keyed-step-stays-bound, spec:carrier.step-keys.key-equal-to-a-skeleton-withheld, spec:carrier.step-keys.malformed-marker-refused, spec:carrier.step-keys.renamed-key-breaks, spec:carrier.step-keys.repeated-key-refused, spec:carrier.step-keys.reworded-keyed-step-stays-bound, spec:carrier.step-keys.reworded-unkeyed-step-breaks, spec:carrier.step-keys.two-keys-on-one-step-refused, spec:carrier.step-keys.typescript-keyed-step-imports-keyed, spec:extraction.executable-contracts.

    Run 1: external run evidence from vitest 4.1.10

    Build: CI 380 · Branch: feature/roadmap-and-slices-v0 · Commit: 34909918bf0be0e849959644401797191cae379f · Start: 2026-10-22T17:40:31.456Z · Stop: 2026-10-22T17:42:16.171Z

    NameSuiteResultDuration
    executes the bound example against a fresh worldAn example marker that disagrees with its vocabulary withholds the contract (spec:carrier.step-keys.conflicting-example-key-withheld)passed19.75 ms
    executes the bound example against a fresh worldA keyed Gherkin step keeps its binding across a rewording (spec:carrier.step-keys.gherkin-keyed-step-stays-bound)passed1271.8 ms
    executes the bound example against a fresh worldA step key equal to another step's skeleton withholds the contract (spec:carrier.step-keys.key-equal-to-a-skeleton-withheld)passed7.82 ms
    executes the bound example against a fresh worldA step marker whose key is off the grammar refuses the carrier (spec:carrier.step-keys.malformed-marker-refused)passed825.08 ms
    executes the bound example against a fresh worldRenaming a step key breaks the binding (spec:carrier.step-keys.renamed-key-breaks)passed728.09 ms
    executes the bound example against a fresh worldOne key on two vocabulary steps refuses the carrier (spec:carrier.step-keys.repeated-key-refused)passed668.87 ms
    executes the bound example against a fresh worldA keyed step reworded in its vocabulary and its example keeps its binding (spec:carrier.step-keys.reworded-keyed-step-stays-bound)passed717.55 ms
    executes the bound example against a fresh worldThe same rewording without a key breaks the binding (spec:carrier.step-keys.reworded-unkeyed-step-breaks)passed719.37 ms
    executes the bound example against a fresh worldTwo keys on one step refuse the carrier (spec:carrier.step-keys.two-keys-on-one-step-refused)passed862.64 ms
    executes the bound example against a fresh worldA keyed TypeScript step keeps its key through import to Markdown (spec:carrier.step-keys.typescript-keyed-step-imports-keyed)passed701.64 ms
  • spec:carrier.step-keys.gherkin-keyed-step-stays-bound · A keyed Gherkin step keeps its binding across a rewording · declared · example enabled · specs/carrier/step-keys.gherkin-keyed-step-stays-bound.sdp.md
  • spec:carrier.step-keys.key-equal-to-a-skeleton-withheld · A step key equal to another step's skeleton withholds the contract · declared · example enabled · specs/carrier/step-keys.key-equal-to-a-skeleton-withheld.sdp.md
  • spec:carrier.step-keys.malformed-marker-refused · A step marker whose key is off the grammar refuses the carrier · declared · example enabled · specs/carrier/step-keys.malformed-marker-refused.sdp.md
  • spec:carrier.step-keys.renamed-key-breaks · Renaming a step key breaks the binding · declared · example enabled · specs/carrier/step-keys.renamed-key-breaks.sdp.md
  • spec:carrier.step-keys.repeated-key-refused · One key on two vocabulary steps refuses the carrier · declared · example enabled · specs/carrier/step-keys.repeated-key-refused.sdp.md
  • spec:carrier.step-keys.reworded-keyed-step-stays-bound · A keyed step reworded in its vocabulary and its example keeps its binding · declared · example enabled · specs/carrier/step-keys.reworded-keyed-step-stays-bound.sdp.md
  • spec:carrier.step-keys.reworded-unkeyed-step-breaks · The same rewording without a key breaks the binding · declared · example enabled · specs/carrier/step-keys.reworded-unkeyed-step-breaks.sdp.md
  • spec:carrier.step-keys.two-keys-on-one-step-refused · Two keys on one step refuse the carrier · declared · example enabled · specs/carrier/step-keys.two-keys-on-one-step-refused.sdp.md
  • spec:carrier.step-keys.typescript-keyed-step-imports-keyed · A keyed TypeScript step keeps its key through import to Markdown · declared · example enabled · specs/carrier/step-keys.typescript-keyed-step-imports-keyed.sdp.md
  • test:protocol.keyed-content · anchored · test anchor binding present · test/keyed-content.test.ts:28

    External run evidence from test/keyed-content.test.ts

    Test anchors: test:protocol.keyed-content. Specs verified by those bindings: spec:carrier.step-keys, spec:model.term-addresses.

    Run 1: external run evidence from vitest 4.1.10

    Build: CI 380 · Branch: feature/roadmap-and-slices-v0 · Commit: 34909918bf0be0e849959644401797191cae379f · Start: 2026-10-22T17:40:31.456Z · Stop: 2026-10-22T17:42:16.171Z

    NameSuiteResultDuration
    records each TypeScript term's own physical line and authored keykeyed carrier contentpassed23.21 ms
    locates a refused TypeScript exampleSpace step below its Spec declarationkeyed carrier contentpassed3.75 ms
    locates a refused TypeScript examples step below its Spec declarationkeyed carrier contentpassed2.24 ms
    rejects unexpected step extraction findings when the example's message slot is emptykeyed carrier contentpassed1109.23 ms
    rejects unexpected term extraction findings when the example's message slot is emptykeyed carrier contentpassed27.81 ms
    reports false when unchanged handlers typecheck but the step reach changeskeyed carrier contentpassed844.39 ms
    preserves authored key order, strips markers, records terms and never records stepskeyed carrier contentpassed2.48 ms
    refuses malformed markers at their physical step and term: [#bad-key] textkeyed carrier contentpassed1.11 ms
    refuses malformed markers at their physical step and term: [#good] textkeyed carrier contentpassed1.05 ms
    refuses malformed markers at their physical step and term: [#good] textkeyed carrier contentpassed0.79 ms
    refuses malformed markers at their physical step and term: [#good] keyed carrier contentpassed0.74 ms
    keeps later markers as ordinary text and permits a repeated keyed skeletonkeyed carrier contentpassed4.4 ms
    drops each conflicting TypeScript key while preserving its Spec and marker-free textkeyed carrier contentpassed5.87 ms
    refuses a Gherkin carrier whole at every conflicting stepkeyed carrier contentpassed2.83 ms
    keeps keyed fence text and derived key maps out of the prose mention scankeyed carrier contentpassed1.02 ms
    checks term addresses and refuses them in Spec id slotskeyed carrier contentpassed0.37 ms
    locates mentions inside keyed and unkeyed definitions, even when a term contains dotskeyed carrier contentpassed1.06 ms
    breaks a keyed binding when its parameter or key changes: items -> countkeyed carrier contentpassed625.31 ms
    breaks a keyed binding when its parameter or key changes: [#cartSize] -> keyed carrier contentpassed635.71 ms
    breaks an unchanged typed handler when a still-compatible bound point changes slot typecontract keys and Then outcomespassed690.02 ms
    withholds a child marker where the vocabulary step carries no markercontract keys and Then outcomespassed4.51 ms
    keys a standalone example and a generated Then registrar by the authored keyscontract keys and Then outcomespassed5.02 ms
    uses a keyed Then for the Outcome union and the registrar bindingcontract keys and Then outcomespassed2.69 ms
    withholds a colliding space and its registrars, while naming the space collisioncontract keys and Then outcomespassed17.45 ms
    dispatches keyed steps and renders a failure from their current wordingcontract keys and Then outcomespassed1.71 ms
    compares an oracle by contract key and lists keys when no Then matchescontract keys and Then outcomespassed1.04 ms

Example space

  • carrier · "Markdown" | "Gherkin" | "TypeScript" · declared by the {carrier} carriers of a parent whose example space declares the Given steps {vocabulary}
  • vocabulary · string · declared by the {carrier} carriers of a parent whose example space declares the Given steps {vocabulary}
  • example · string · declared by a child example of that parent whose Given steps read {example}
  • before · string · declared by the contracts are generated, the step lines are reworded by replacing {before} with {after}, and the contracts are generated again
  • after · string · declared by the contracts are generated, the step lines are reworded by replacing {before} with {after}, and the contracts are generated again

Bound points

Examplecarriervocabularyexamplebeforeafter
spec:carrier.step-keys.conflicting-example-key-withheld"Markdown""[#cartSize] a customer has a cart with {items:number} line items""[#basketSize] a customer has a cart with {items: 2} line items""a customer has a cart with""the cart holds"
spec:carrier.step-keys.gherkin-keyed-step-stays-bound"Gherkin""[#cartSize] a customer has a cart with {items:number} line items""a customer has a cart with {items: 2} line items""a customer has a cart with""the cart holds"
spec:carrier.step-keys.key-equal-to-a-skeleton-withheld"Markdown""[#cartSize] the cart has {items:number} items; cartSize""the cart has {items: 2} items; cartSize""the cart has""the cart holds"
spec:carrier.step-keys.malformed-marker-refused"Markdown""[#cart-size] a customer has a cart with {items:number} line items""a customer has a cart with {items: 2} line items""a customer has a cart with""the cart holds"
spec:carrier.step-keys.renamed-key-breaks"Markdown""[#cartSize] a customer has a cart with {items:number} line items""a customer has a cart with {items: 2} line items""cartSize""cartLines"
spec:carrier.step-keys.repeated-key-refused"Markdown""[#cartSize] a customer has a cart with {items:number} line items; [#cartSize] the cart is open""a customer has a cart with {items: 2} line items; the cart is open""a customer has a cart with""the cart holds"
spec:carrier.step-keys.reworded-keyed-step-stays-bound"Markdown""[#cartSize] a customer has a cart with {items:number} line items""a customer has a cart with {items: 2} line items""a customer has a cart with""the cart holds"
spec:carrier.step-keys.reworded-unkeyed-step-breaks"Markdown""a customer has a cart with {items:number} line items""a customer has a cart with {items: 2} line items""a customer has a cart with""the cart holds"
spec:carrier.step-keys.two-keys-on-one-step-refused"Markdown""[#cartSize] a customer has a cart with {items:number} line items; [#cartLines] a customer has a cart with {items:number} line items""a customer has a cart with {items: 2} line items""a customer has a cart with""the cart holds"
spec:carrier.step-keys.typescript-keyed-step-imports-keyed"TypeScript""[#cartSize] a customer has a cart with {items:number} line items""a customer has a cart with {items: 2} line items""a customer has a cart with""the cart holds"

Oracle binding: none

Coverage

vocabulary: "[#cartSize] a customer has a cart with {items:number} line items" · spec:carrier.step-keys.conflicting-example-key-withheld, spec:carrier.step-keys.gherkin-keyed-step-stays-bound, spec:carrier.step-keys.renamed-key-breaks, spec:carrier.step-keys.reworded-keyed-step-stays-bound, spec:carrier.step-keys.typescript-keyed-step-imports-keyed; "[#cartSize] the cart has {items:number} items; cartSize" · spec:carrier.step-keys.key-equal-to-a-skeleton-withheld; "[#cart-size] a customer has a cart with {items:number} line items" · spec:carrier.step-keys.malformed-marker-refused; "[#cartSize] a customer has a cart with {items:number} line items; [#cartSize] the cart is open" · spec:carrier.step-keys.repeated-key-refused; "a customer has a cart with {items:number} line items" · spec:carrier.step-keys.reworded-unkeyed-step-breaks; "[#cartSize] a customer has a cart with {items:number} line items; [#cartLines] a customer has a cart with {items:number} line items" · spec:carrier.step-keys.two-keys-on-one-step-refused · not enumerable

example: "[#basketSize] a customer has a cart with {items: 2} line items" · spec:carrier.step-keys.conflicting-example-key-withheld; "a customer has a cart with {items: 2} line items" · spec:carrier.step-keys.gherkin-keyed-step-stays-bound, spec:carrier.step-keys.malformed-marker-refused, spec:carrier.step-keys.renamed-key-breaks, spec:carrier.step-keys.reworded-keyed-step-stays-bound, spec:carrier.step-keys.reworded-unkeyed-step-breaks, spec:carrier.step-keys.two-keys-on-one-step-refused, spec:carrier.step-keys.typescript-keyed-step-imports-keyed; "the cart has {items: 2} items; cartSize" · spec:carrier.step-keys.key-equal-to-a-skeleton-withheld; "a customer has a cart with {items: 2} line items; the cart is open" · spec:carrier.step-keys.repeated-key-refused · not enumerable

before: "a customer has a cart with" · spec:carrier.step-keys.conflicting-example-key-withheld, spec:carrier.step-keys.gherkin-keyed-step-stays-bound, spec:carrier.step-keys.malformed-marker-refused, spec:carrier.step-keys.repeated-key-refused, spec:carrier.step-keys.reworded-keyed-step-stays-bound, spec:carrier.step-keys.reworded-unkeyed-step-breaks, spec:carrier.step-keys.two-keys-on-one-step-refused, spec:carrier.step-keys.typescript-keyed-step-imports-keyed; "the cart has" · spec:carrier.step-keys.key-equal-to-a-skeleton-withheld; "cartSize" · spec:carrier.step-keys.renamed-key-breaks · not enumerable

after: "the cart holds" · spec:carrier.step-keys.conflicting-example-key-withheld, spec:carrier.step-keys.gherkin-keyed-step-stays-bound, spec:carrier.step-keys.key-equal-to-a-skeleton-withheld, spec:carrier.step-keys.malformed-marker-refused, spec:carrier.step-keys.repeated-key-refused, spec:carrier.step-keys.reworded-keyed-step-stays-bound, spec:carrier.step-keys.reworded-unkeyed-step-breaks, spec:carrier.step-keys.two-keys-on-one-step-refused, spec:carrier.step-keys.typescript-keyed-step-imports-keyed; "cartLines" · spec:carrier.step-keys.renamed-key-breaks · not enumerable

Unbound

  • carrier: None
  • vocabulary: None
  • example: None
  • before: None
  • after: None
Design view

Requirement drawing

Requirement drawing for spec:carrier.step-keys
The diagram as text
  • spec:carrier.step-keys: An example step may carry a key that survives rewording · declared Spec
  • spec:carrier.step-keys.conflicting-example-key-withheld: An example marker that disagrees with its vocabulary withholds the contract · declared Spec
  • spec:carrier.step-keys.gherkin-keyed-step-stays-bound: A keyed Gherkin step keeps its binding across a rewording · declared Spec
  • spec:carrier.step-keys.key-equal-to-a-skeleton-withheld: A step key equal to another step's skeleton withholds the contract · declared Spec
  • spec:carrier.step-keys.malformed-marker-refused: A step marker whose key is off the grammar refuses the carrier · declared Spec
  • spec:carrier.step-keys.renamed-key-breaks: Renaming a step key breaks the binding · declared Spec
  • spec:carrier.step-keys.repeated-key-refused: One key on two vocabulary steps refuses the carrier · declared Spec
  • spec:carrier.step-keys.reworded-keyed-step-stays-bound: A keyed step reworded in its vocabulary and its example keeps its binding · declared Spec
  • spec:carrier.step-keys.reworded-unkeyed-step-breaks: The same rewording without a key breaks the binding · declared Spec
  • spec:carrier.step-keys.two-keys-on-one-step-refused: Two keys on one step refuse the carrier · declared Spec
  • spec:carrier.step-keys.typescript-keyed-step-imports-keyed: A keyed TypeScript step keeps its key through import to Markdown · declared Spec
  • spec:carrier.slot-notation: Slot notation declares, binds, and refuses to guess · declared Spec
  • spec:extraction.executable-contracts: The build derives step and space contracts from graph examples · declared Spec
  • impl:protocol.example-runner: plans and executes a bound example against the caller's world · anchored code · src/runner/index.ts:108
  • impl:protocol.example-space-decoding: shared example-space interpretation for contracts and reader contexts · anchored code · src/notation/example-space.ts:473
  • impl:protocol.executable-contracts: derives step and example-space contracts from the graph · anchored code · src/codegen/contracts.ts:647
  • impl:protocol.key-markers: normalizes step and term markers across the three carriers · anchored code · src/extract/key-markers.ts:136
  • impl:protocol.open-section-order: preserves authored open-section and model-term order and Pack field order · anchored code · src/extract/serialize.ts:105
  • impl:protocol.sdp-import-markdown-emit: emits the Markdown document twin for an imported Spec · anchored code · src/import/emit-markdown.ts:253
  • impl:protocol.spec-sections: typed Spec section shapes · anchored code · src/model/sections.ts:138
  • test:protocol.keyed-content: test:protocol.keyed-content · anchored test binding · binding present · test/keyed-content.test.ts:28
  • test:protocol.step-keys.conflicting-example-key-withheld: test:protocol.step-keys.conflicting-example-key-withheld · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:26
  • test:protocol.step-keys.gherkin-keyed-step-stays-bound: test:protocol.step-keys.gherkin-keyed-step-stays-bound · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:73
  • test:protocol.step-keys.key-equal-to-a-skeleton-withheld: test:protocol.step-keys.key-equal-to-a-skeleton-withheld · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:120
  • test:protocol.step-keys.malformed-marker-refused: test:protocol.step-keys.malformed-marker-refused · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:167
  • test:protocol.step-keys.renamed-key-breaks: test:protocol.step-keys.renamed-key-breaks · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:214
  • test:protocol.step-keys.repeated-key-refused: test:protocol.step-keys.repeated-key-refused · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:261
  • test:protocol.step-keys.reworded-keyed-step-stays-bound: test:protocol.step-keys.reworded-keyed-step-stays-bound · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:308
  • test:protocol.step-keys.reworded-unkeyed-step-breaks: test:protocol.step-keys.reworded-unkeyed-step-breaks · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:355
  • test:protocol.step-keys.two-keys-on-one-step-refused: test:protocol.step-keys.two-keys-on-one-step-refused · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:402
  • test:protocol.step-keys.typescript-keyed-step-imports-keyed: test:protocol.step-keys.typescript-keyed-step-imports-keyed · anchored test binding · binding present · test/self-hosting-step-keys.test.ts:449
  • spec:carrier.step-keys refines spec:carrier.slot-notation · declared — a key joins the step text the notation reads, ahead of its slots
  • spec:carrier.step-keys.conflicting-example-key-withheld refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.conflicting-example-key-withheld verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.conflicting-example-key-withheld verifies spec:extraction.executable-contracts · declared
  • spec:carrier.step-keys.gherkin-keyed-step-stays-bound refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.gherkin-keyed-step-stays-bound verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.key-equal-to-a-skeleton-withheld refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.key-equal-to-a-skeleton-withheld verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.key-equal-to-a-skeleton-withheld verifies spec:extraction.executable-contracts · declared
  • spec:carrier.step-keys.malformed-marker-refused refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.malformed-marker-refused verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.renamed-key-breaks refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.renamed-key-breaks verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.repeated-key-refused refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.repeated-key-refused verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.reworded-keyed-step-stays-bound refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.reworded-keyed-step-stays-bound verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.reworded-keyed-step-stays-bound verifies spec:extraction.executable-contracts · declared
  • spec:carrier.step-keys.reworded-unkeyed-step-breaks refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.reworded-unkeyed-step-breaks verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.reworded-unkeyed-step-breaks verifies spec:extraction.executable-contracts · declared
  • spec:carrier.step-keys.two-keys-on-one-step-refused refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.two-keys-on-one-step-refused verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.typescript-keyed-step-imports-keyed refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.typescript-keyed-step-imports-keyed verifies spec:carrier.step-keys · declared
  • impl:protocol.example-runner satisfies spec:carrier.step-keys · anchored
  • impl:protocol.example-space-decoding satisfies spec:carrier.step-keys · anchored
  • impl:protocol.executable-contracts satisfies spec:carrier.step-keys · anchored
  • impl:protocol.key-markers satisfies spec:carrier.step-keys · anchored
  • impl:protocol.open-section-order satisfies spec:carrier.step-keys · anchored
  • impl:protocol.sdp-import-markdown-emit satisfies spec:carrier.step-keys · anchored
  • impl:protocol.spec-sections satisfies spec:carrier.step-keys · anchored
  • test:protocol.keyed-content verifies spec:carrier.step-keys · anchored
  • test:protocol.step-keys.conflicting-example-key-withheld verifies spec:carrier.step-keys.conflicting-example-key-withheld · anchored
  • test:protocol.step-keys.gherkin-keyed-step-stays-bound verifies spec:carrier.step-keys.gherkin-keyed-step-stays-bound · anchored
  • test:protocol.step-keys.key-equal-to-a-skeleton-withheld verifies spec:carrier.step-keys.key-equal-to-a-skeleton-withheld · anchored
  • test:protocol.step-keys.malformed-marker-refused verifies spec:carrier.step-keys.malformed-marker-refused · anchored
  • test:protocol.step-keys.renamed-key-breaks verifies spec:carrier.step-keys.renamed-key-breaks · anchored
  • test:protocol.step-keys.repeated-key-refused verifies spec:carrier.step-keys.repeated-key-refused · anchored
  • test:protocol.step-keys.reworded-keyed-step-stays-bound verifies spec:carrier.step-keys.reworded-keyed-step-stays-bound · anchored
  • test:protocol.step-keys.reworded-unkeyed-step-breaks verifies spec:carrier.step-keys.reworded-unkeyed-step-breaks · anchored
  • test:protocol.step-keys.two-keys-on-one-step-refused verifies spec:carrier.step-keys.two-keys-on-one-step-refused · anchored
  • test:protocol.step-keys.typescript-keyed-step-imports-keyed verifies spec:carrier.step-keys.typescript-keyed-step-imports-keyed · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: requirementDiagram. Chosen syntax: flowchart TB because folds require exact labels unavailable in requirement syntax.

Decisions

  • The shipped projections stay frozen

    Re-specifying the shipped Design Review, census, Mermaid, or Gherkin projection is refused. These four projections are the ruled read surfaces over the one graph. A later decision Spec that supersedes this one replaces the ruling whole; a decision Spec that refines this one narrows it for one projection or one rendering and leaves the rest frozen. Either passes the ADR three-part test.

Runtime
  • component:protocol.codegen · contracts and registrar output · src/codegen/contracts.ts:633 · layer application · context protocol

    Uses

    • component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34 · layer domain · context protocol
    • component:protocol.notation · the leaf step codec · src/notation/slots.ts:261 · layer domain · context protocol
    • component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol
    • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol

    Uses

    • component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34 · layer domain · context protocol
    • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol
    • component:protocol.notation · the leaf step codec · src/notation/slots.ts:261 · layer domain · context protocol
    • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • component:protocol.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol

    Uses

  • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol

    Uses

    None.

  • component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol

    Uses

    • component:protocol.graph · the one graph and its semantic decisions · src/graph/schema.ts:34 · layer domain · context protocol
    • component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol
    • component:protocol.notation · the leaf step codec · src/notation/slots.ts:261 · layer domain · context protocol
    • component:protocol.validate · one finding currency and ordered checks · src/validate/validators.ts:72 · layer domain · context protocol
  • component:protocol.runner · provider-neutral example execution · src/runner/index.ts:99 · layer application · context protocol

    Uses

  • impl:protocol.example-runner · plans and executes a bound example against the caller's world · src/runner/index.ts:108

    Component: component:protocol.runner · provider-neutral example execution · src/runner/index.ts:99 · layer application · context protocol

    Uses

    None.

  • impl:protocol.example-space-decoding · shared example-space interpretation for contracts and reader contexts · src/notation/example-space.ts:473

    Component: component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol

    Uses

    None.

  • impl:protocol.executable-contracts · derives step and example-space contracts from the graph · src/codegen/contracts.ts:647

    Component: component:protocol.codegen · contracts and registrar output · src/codegen/contracts.ts:633 · layer application · context protocol

    Uses

    None.

  • impl:protocol.key-markers · normalizes step and term markers across the three carriers · src/extract/key-markers.ts:136

    Component: component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol

    Uses

    None.

  • impl:protocol.open-section-order · preserves authored open-section and model-term order and Pack field order · src/extract/serialize.ts:105

    Component: component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol

    Uses

    None.

  • impl:protocol.sdp-import-markdown-emit · emits the Markdown document twin for an imported Spec · src/import/emit-markdown.ts:253

    Component: component:protocol.import · canonical conversion with a fidelity boundary · src/import/import.ts:45 · layer application · context protocol

    Uses

    None.

  • impl:protocol.spec-sections · typed Spec section shapes · src/model/sections.ts:138

    Component: component:protocol.model · the authored contracts and stable ids · src/model/anchors.ts:100 · layer domain · context protocol

    Uses

    None.

Runtime observation: not tracked.

Evidence

Runtime observation: not tracked.

Build attestations: not tracked.

Deployments: not tracked.

Bills of materials: not tracked.

Impact
Relations of spec:carrier.step-keys
The diagram as text
  • spec:carrier.gherkin-authoring: Gherkin authoring enters the one graph
  • spec:carrier.markdown-body-grammar: The Markdown body accepts one closed form per section
  • spec:carrier.slot-notation: Slot notation declares, binds, and refuses to guess
  • spec:carrier.step-keys: An example step may carry a key that survives rewording
  • spec:carrier.step-keys.conflicting-example-key-withheld: An example marker that disagrees with its vocabulary withholds the contract
  • spec:carrier.step-keys.gherkin-keyed-step-stays-bound: A keyed Gherkin step keeps its binding across a rewording
  • spec:carrier.step-keys.key-equal-to-a-skeleton-withheld: A step key equal to another step's skeleton withholds the contract
  • spec:carrier.step-keys.malformed-marker-refused: A step marker whose key is off the grammar refuses the carrier
  • spec:carrier.step-keys.renamed-key-breaks: Renaming a step key breaks the binding
  • spec:carrier.step-keys.repeated-key-refused: One key on two vocabulary steps refuses the carrier
  • spec:carrier.step-keys.reworded-keyed-step-stays-bound: A keyed step reworded in its vocabulary and its example keeps its binding
  • spec:carrier.step-keys.reworded-unkeyed-step-breaks: The same rewording without a key breaks the binding
  • spec:carrier.step-keys.two-keys-on-one-step-refused: Two keys on one step refuse the carrier
  • spec:carrier.step-keys.typescript-keyed-step-imports-keyed: A keyed TypeScript step keeps its key through import to Markdown
  • spec:consumers.upgrade-kit.capability-adoption: Capability adoption counts where each capability is used and where it could apply
  • spec:decisions.shipped-projections-frozen: The shipped projections stay frozen
  • spec:extraction.executable-contracts: The build derives step and space contracts from graph examples
  • spec:extraction.runnable-modules: Derived runnable modules freeze the registrar interface
  • spec:carrier.step-keys decidedBy spec:decisions.shipped-projections-frozen · declared — keys stay off the frozen projections, which read the step text unchanged
  • spec:carrier.step-keys refines spec:carrier.slot-notation · declared — a key joins the step text the notation reads, ahead of its slots
  • spec:carrier.gherkin-authoring dependsOn spec:carrier.step-keys · declared — a step may open with a step key marker
  • spec:carrier.markdown-body-grammar dependsOn spec:carrier.step-keys · declared — a fence step may open with a step key marker
  • spec:consumers.upgrade-kit.capability-adoption dependsOn spec:carrier.step-keys · declared — step keys are counted where example steps are
  • spec:extraction.executable-contracts dependsOn spec:carrier.step-keys · declared — a keyed step's contract key is its step key
  • spec:extraction.runnable-modules dependsOn spec:carrier.step-keys · declared — the registrar binds each step under its contract key
  • spec:carrier.step-keys.conflicting-example-key-withheld refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.gherkin-keyed-step-stays-bound refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.key-equal-to-a-skeleton-withheld refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.malformed-marker-refused refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.renamed-key-breaks refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.repeated-key-refused refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.reworded-keyed-step-stays-bound refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.reworded-unkeyed-step-breaks refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.two-keys-on-one-step-refused refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.typescript-keyed-step-imports-keyed refines spec:carrier.step-keys · declared
  • spec:carrier.step-keys.conflicting-example-key-withheld verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.gherkin-keyed-step-stays-bound verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.key-equal-to-a-skeleton-withheld verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.malformed-marker-refused verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.renamed-key-breaks verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.repeated-key-refused verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.reworded-keyed-step-stays-bound verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.reworded-unkeyed-step-breaks verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.two-keys-on-one-step-refused verifies spec:carrier.step-keys · declared
  • spec:carrier.step-keys.typescript-keyed-step-imports-keyed verifies spec:carrier.step-keys · declared
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred syntax: flowchart. Chosen syntax: labelled flowchart, preserving exact relations, claims and folds.

Rests on

Rested on by

Distance 1

Distance 2

Distance 3

Distance 4

Distance 5

Distance 6

Distance 7

Distance 8

Distance 9

Relations

Relation and directionOther endClaimReasonExercised keys
decidedBy · outgoingThe shipped projections stay frozen
spec:decisions.shipped-projections-frozen · resolves
declaredkeys stay off the frozen projections, which read the step text unchangedNone
refines · outgoingSlot notation declares, binds, and refuses to guess
spec:carrier.slot-notation · resolves
declareda key joins the step text the notation reads, ahead of its slotsNone
dependsOn · incomingGherkin authoring enters the one graph
spec:carrier.gherkin-authoring · resolves
declareda step may open with a step key markerNone
dependsOn · incomingThe Markdown body accepts one closed form per section
spec:carrier.markdown-body-grammar · resolves
declareda fence step may open with a step key markerNone
dependsOn · incomingCapability adoption counts where each capability is used and where it could apply
spec:consumers.upgrade-kit.capability-adoption · resolves
declaredstep keys are counted where example steps areNone
dependsOn · incomingThe build derives step and space contracts from graph examples
spec:extraction.executable-contracts · resolves
declareda keyed step's contract key is its step keyNone
dependsOn · incomingDerived runnable modules freeze the registrar interface
spec:extraction.runnable-modules · resolves
declaredthe registrar binds each step under its contract keyNone
refines · incomingAn example marker that disagrees with its vocabulary withholds the contract
spec:carrier.step-keys.conflicting-example-key-withheld · resolves
declaredNoneNone
refines · incomingA keyed Gherkin step keeps its binding across a rewording
spec:carrier.step-keys.gherkin-keyed-step-stays-bound · resolves
declaredNoneNone
refines · incomingA step key equal to another step's skeleton withholds the contract
spec:carrier.step-keys.key-equal-to-a-skeleton-withheld · resolves
declaredNoneNone
refines · incomingA step marker whose key is off the grammar refuses the carrier
spec:carrier.step-keys.malformed-marker-refused · resolves
declaredNoneNone
refines · incomingRenaming a step key breaks the binding
spec:carrier.step-keys.renamed-key-breaks · resolves
declaredNoneNone
refines · incomingOne key on two vocabulary steps refuses the carrier
spec:carrier.step-keys.repeated-key-refused · resolves
declaredNoneNone
refines · incomingA keyed step reworded in its vocabulary and its example keeps its binding
spec:carrier.step-keys.reworded-keyed-step-stays-bound · resolves
declaredNoneNone
refines · incomingThe same rewording without a key breaks the binding
spec:carrier.step-keys.reworded-unkeyed-step-breaks · resolves
declaredNoneNone
refines · incomingTwo keys on one step refuse the carrier
spec:carrier.step-keys.two-keys-on-one-step-refused · resolves
declaredNoneNone
refines · incomingA keyed TypeScript step keeps its key through import to Markdown
spec:carrier.step-keys.typescript-keyed-step-imports-keyed · resolves
declaredNoneNone
verifies · incomingAn example marker that disagrees with its vocabulary withholds the contract
spec:carrier.step-keys.conflicting-example-key-withheld · resolves
declaredNonevocabularyHome
verifies · incomingA keyed Gherkin step keeps its binding across a rewording
spec:carrier.step-keys.gherkin-keyed-step-stays-bound · resolves
declaredNonestepMarker, vocabularyHome, rewordedStaysBound
verifies · incomingA step key equal to another step's skeleton withholds the contract
spec:carrier.step-keys.key-equal-to-a-skeleton-withheld · resolves
declaredNonecontractKey
verifies · incomingA step marker whose key is off the grammar refuses the carrier
spec:carrier.step-keys.malformed-marker-refused · resolves
declaredNonemarkerRefusals
verifies · incomingRenaming a step key breaks the binding
spec:carrier.step-keys.renamed-key-breaks · resolves
declaredNonerenamedKey
verifies · incomingOne key on two vocabulary steps refuses the carrier
spec:carrier.step-keys.repeated-key-refused · resolves
declaredNoneoneKeyOneStep
verifies · incomingA keyed step reworded in its vocabulary and its example keeps its binding
spec:carrier.step-keys.reworded-keyed-step-stays-bound · resolves
declaredNonestepMarker, vocabularyHome, contractKey, rewordedStaysBound
verifies · incomingThe same rewording without a key breaks the binding
spec:carrier.step-keys.reworded-unkeyed-step-breaks · resolves
declaredNonecontractKey, unkeyedBreaks
verifies · incomingTwo keys on one step refuse the carrier
spec:carrier.step-keys.two-keys-on-one-step-refused · resolves
declaredNoneoneKeyOneStep
verifies · incomingA keyed TypeScript step keeps its key through import to Markdown
spec:carrier.step-keys.typescript-keyed-step-imports-keyed · resolves
declaredNonestepMarker, contractKey

Bindings

Implementation binding: present

  • impl:protocol.example-runner · plans and executes a bound example against the caller's world · src/runner/index.ts:108 · role service · component component:protocol.runner · layer application · context protocol
  • impl:protocol.example-space-decoding · shared example-space interpretation for contracts and reader contexts · src/notation/example-space.ts:473 · role codec · component component:protocol.reader · layer application · context protocol
  • impl:protocol.executable-contracts · derives step and example-space contracts from the graph · src/codegen/contracts.ts:647 · role projection · component component:protocol.codegen · layer application · context protocol
  • impl:protocol.key-markers · normalizes step and term markers across the three carriers · src/extract/key-markers.ts:136 · role codec · component component:protocol.extract · layer application · context protocol
  • impl:protocol.open-section-order · preserves authored open-section and model-term order and Pack field order · src/extract/serialize.ts:105 · role codec · component component:protocol.extract · layer application · context protocol
  • impl:protocol.sdp-import-markdown-emit · emits the Markdown document twin for an imported Spec · src/import/emit-markdown.ts:253 · role codec · component component:protocol.import · layer application · context protocol
  • impl:protocol.spec-sections · typed Spec section shapes · src/model/sections.ts:138 · role contract · component component:protocol.model · layer domain · context protocol

Design reference: none

Verifier binding: present

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

Composing (0)

Composing needs the script.