Spec Studio

TypeScript and Markdown duplicates are both refused

spec:validation.duplicate-ids.dual-carrierExample / Scenario · storyready floor ready

Packs: pack:self-hosting-v1

Design: no design entries · no pinned declarations · no decisions

Findings: no errors, no warnings

specs/validation/duplicate-ids.dual-carrier.sdp.md

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

Intent
outcome
Execute the duplicate-ID rule across both carrier surfaces.
Behavior

Examples

Given a {firstCarrier: "TypeScript"} carrier declares {specId: "spec:fixture.duplicate"}
Given a {secondCarrier: "Markdown"} carrier declares {specId: "spec:fixture.duplicate"}
When the extraction root is read
Then both sites report {findingId: "extract/duplicate-id"}
Then no graph node is emitted for {specId: "spec:fixture.duplicate"}
Verification

Verifier bindings

  • test:protocol.duplicate-ids.dual-carrier · dual-carrier duplicate-ID contract verifies carrier exclusion · anchored · test anchor binding present · test/self-hosting-duplicate-ids.test.ts:316

    External run evidence from test/self-hosting-duplicate-ids.test.ts

    Test anchors: test:protocol.duplicate-ids.dual-carrier. Specs verified by those bindings: spec:validation.duplicate-ids, spec:validation.duplicate-ids.dual-carrier.

    Run 1: external run evidence from vitest 4.1.10

    Build: CI 391 · Branch: cursor/media-plan-and-articles-09b1 · Commit: 076cd4f1f85640d8236e5cca1bffffa68ab79a33 · Start: 2026-10-31T15:32:20.471Z · Stop: 2026-10-31T15:34:02.073Z

    NameSuiteResultDuration
    names self-hosting generation before collecting its filtered tracergenerated contract preflightpassed45.3 ms
    names checkout generation before collecting its filtered examplegenerated contract preflightpassed40.68 ms
    names both generations when an unfiltered suite lacks both contract treesgenerated contract preflightpassed41.68 ms
    matches a Vitest substring filter before collecting the self-hosting tracergenerated contract preflightpassed35.49 ms
    matches a ./-prefixed filter before collecting the self-hosting tracergenerated contract preflightpassed52.14 ms
    matches an absolute-path filter before collecting the self-hosting tracergenerated contract preflightpassed71.13 ms
    does not require contracts for an unrelated Vitest filtergenerated contract preflightpassed109.7 ms
    proceeds for the unfiltered invocation once both contract trees are generatedgenerated contract preflightpassed113.95 ms
    fails a pooled run that mutates repository-root generated statepooled root generated-state sentinelpassed88.95 ms
    passes a pooled run that leaves repository-root generated state untouchedpooled root generated-state sentinelpassed68.74 ms
    derives the duplicate-ID verifier facts from the bound executable examplenot recordedpassed4854.19 ms
    executes the bound example against a fresh worldTypeScript and Markdown duplicates are both refused (spec:validation.duplicate-ids.dual-carrier)passed11.49 ms
Design view

Requirement drawing

  • Satisfying or referencing units: no recorded binding.
Requirement drawing for spec:validation.duplicate-ids.dual-carrier
The diagram as text
  • spec:validation.duplicate-ids.dual-carrier: TypeScript and Markdown duplicates are both refused · declared Spec
  • spec:validation.duplicate-ids: Duplicate carrier IDs are excluded loudly · declared Spec
  • test:protocol.duplicate-ids.dual-carrier: dual-carrier duplicate-ID contract verifies carrier exclusion · anchored test binding · binding present · test/self-hosting-duplicate-ids.test.ts:316
  • spec:validation.duplicate-ids.dual-carrier refines spec:validation.duplicate-ids · declared
  • spec:validation.duplicate-ids.dual-carrier verifies spec:validation.duplicate-ids · declared
  • test:protocol.duplicate-ids.dual-carrier verifies spec:validation.duplicate-ids.dual-carrier · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

Preferred and chosen syntax: requirementDiagram; exact refines, satisfies and verifies, with claim words in nodes and per-edge comments.

Decisions

No decision record named.

Runtime

No implementation neighborhood recorded.

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:validation.duplicate-ids.dual-carrier
  • E2: verifies · declared
The diagram as text
  • spec:validation.duplicate-ids: Duplicate carrier IDs are excluded loudly
  • spec:validation.duplicate-ids.dual-carrier: TypeScript and Markdown duplicates are both refused
  • spec:validation.duplicate-ids.dual-carrier refines spec:validation.duplicate-ids · declared
  • spec:validation.duplicate-ids.dual-carrier verifies spec:validation.duplicate-ids · 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

No Spec rests on this Spec.

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingDuplicate carrier IDs are excluded loudly
spec:validation.duplicate-ids · resolves
declaredNoneNone
verifies · outgoingDuplicate carrier IDs are excluded loudly
spec:validation.duplicate-ids · resolves
declaredNoneNone

Bindings

Implementation binding: none

Design reference: none

Verifier binding: present

  • test:protocol.duplicate-ids.dual-carrier · dual-carrier duplicate-ID contract verifies carrier exclusion · anchored · test/self-hosting-duplicate-ids.test.ts:316 · test anchor

Expected-outcome oracle: none

Runtime observation: not tracked.

Run results: not recorded in the graph.

Findings

None.

Composing (0)

Composing needs the script.