Spec Studio

Search finds a Spec, a Pack, an entry or a bound file by a word

spec:consumers.spec-studio.searchUse Case / Behavior · storyready floor ready

Packs: pack:self-hosting-v1, pack:spec-studio-v1

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

Findings: no errors, no warnings

specs/consumers/spec-studio.search.sdp.md

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

The first adopter asked to search entry keys, pinned declarations and file paths. A Spec's envelope holds no tags, so search reads what the graph holds: the fields concept search reads, which already include every pinned declaration, plus the keys authors coin and the files the graph records. The page matches with the reader's own code, so a term finds on the page what findByConcept finds through sdp q.

Intent
outcome
Let a person find a Spec, a Pack, a keyed entry or the code bound at a file by a word they remember of it, from any page and with no request.
Behavior
rule.oneMatcher line 21 · specs/consumers/spec-studio.search.sdp.md:21
Search matches with the reader's concept matching, one implementation the package exports without Node dependencies and the page script bundles, so over the fields findByConcept reads, the page returns the nodes it returns, in its order.

no example exercises it

rule.addedFields line 22 · specs/consumers/spec-studio.search.sdp.md:22
Search also matches the keys authors coin, Design and UI keys, open question keys and rule keys, and a node's recorded file path; a node matched only through these follows every node findByConcept matches, in id order. It indexes nothing else.

no example exercises it

rule line 23 · specs/consumers/spec-studio.search.sdp.md:23
A term matches where it appears in a field, without regard to case, as findByConcept matches; an empty term matches nothing.
rule.searchPage line 24 · specs/consumers/spec-studio.search.sdp.md:24
The search field on any page opens the search page with the term in its fragment, search.html#q=<term>; the search page matches as the person types and keeps the term in its fragment, so a search is a link.

no example exercises it

rule.resultShape line 25 · specs/consumers/spec-studio.search.sdp.md:25
Each result names its node type in words. A Spec result shows its title, id, kind, and stated rung beside the floor reached, and opens its page; a Pack result shows its title and id and opens its page, with no readiness; an Anchor or CodeNode result shows its id, label, and recorded file and line as text with a copy action, and links each Spec its edges reach, with the edge type.

no example exercises it

rule.entryHits line 26 · specs/consumers/spec-studio.search.sdp.md:26
A Spec with a matching entry is a result. Under a Spec result, the page lists the Spec's entries the term matches, as spec:consumers.spec-studio.data#design.searchEntry states, in the index's order, each with its section, key and recorded line, linked to the entry's element id on the Spec page when it has an entry address, and otherwise to its section's element id, or to the narrative's.

no example exercises it

rule line 27 · specs/consumers/spec-studio.search.sdp.md:27
The page shows fifty results at a time, with a control that shows the next fifty.
rule line 28 · specs/consumers/spec-studio.search.sdp.md:28
The search page reads only the index it embeds; it fetches nothing and joins nothing.

3 unkeyed rules.

UI
searchField line 31 · specs/consumers/spec-studio.search.sdp.md:31
a labelled text field and a Search button in the top navigation of every page.
resultsHeader line 32 · specs/consumers/spec-studio.search.sdp.md:32
the term, how many nodes and entries match, and the fields searched.
resultCard line 33 · specs/consumers/spec-studio.search.sdp.md:33
one card per node, in result order: its node type in words, title and id, the fields that matched, and the Spec's rungs or the unit's location as the result rule states; then its entry hits.
entryHit line 34 · specs/consumers/spec-studio.search.sdp.md:34
one line per entry: its section, its key as code, its recorded line, and the text around the term, shortened.
noMatch line 35 · specs/consumers/spec-studio.search.sdp.md:35
No node matches and the term, then the fields searched.
needsScript line 36 · specs/consumers/spec-studio.search.sdp.md:36
without script, the search page says that search needs it and links to the index.
Verification

Verifier bindings

  • test:protocol.studio-concept-match · anchored · test anchor binding present · test/concept-match.test.ts:9

    External run evidence from test/concept-match.test.ts

    Test anchors: test:protocol.studio-concept-match. Specs verified by those bindings: spec:consumers.spec-studio.search.

    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
    ships a standalone matcher module with no Node dependencythe concept matcher shared by the reader and Studiopassed1.71 ms
    keeps reader results and their order for "order" on both corporathe concept matcher shared by the reader and Studiopassed160.75 ms
    keeps reader results and their order for "ready" on both corporathe concept matcher shared by the reader and Studiopassed128.9 ms
    keeps reader results and their order for "sentinel" on both corporathe concept matcher shared by the reader and Studiopassed81.92 ms
    keeps reader results and their order for "POST /ORDERS" on both corporathe concept matcher shared by the reader and Studiopassed98.71 ms
    keeps reader results and their order for "inventorySnapshot" on both corporathe concept matcher shared by the reader and Studiopassed68.28 ms
    keeps reader results and their order for "given" on both corporathe concept matcher shared by the reader and Studiopassed61.51 ms
    keeps reader results and their order for "" on both corporathe concept matcher shared by the reader and Studiopassed33.99 ms
    keeps reader results and their order for " " on both corporathe concept matcher shared by the reader and Studiopassed36.06 ms
    pins ranking and the fields the reader scans independently of its callerthe concept matcher shared by the reader and Studiopassed0.38 ms
    appends only coined-key and file matches, after concept matchesthe concept matcher shared by the reader and Studiopassed0.39 ms
  • test:protocol.studio-page-elements · anchored · test anchor binding present · test/studio-elements.test.ts:26

    External run evidence from test/studio-elements.test.ts

    Test anchors: test:protocol.studio-page-elements. Specs verified by those bindings: spec:consumers.spec-studio.page-elements, spec:consumers.spec-studio.search.

    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
    offers a prompt before searching and puts a real miss before the field listStudio page interactionspassed2.5 ms
    writes singular counts, readable fields, code-span titles and linked entry keysStudio page interactionspassed4.55 ms
    cuts long excerpts at word boundaries around the termStudio page interactionspassed0.45 ms
    copies the requested text and reports successful clipboard writesStudio page interactionspassed1.17 ms
    selects copy text when the clipboard is missing or rejects accessStudio page interactionspassed0.47 ms
    decodes entry fragments literally and refuses malformed fragment escapesStudio page interactionspassed0.29 ms
    filters all filters together and accepts space-separated row valuesStudio page interactionspassed1.76 ms
    clears the filter when a link or fragment targets a row it hidesStudio page interactionspassed4.64 ms
    round-trips term fragments including punctuation, spaces and UnicodeStudio page interactionspassed0.49 ms
    matches entry tokens, and non-string values only by their coined keyStudio page interactionspassed0.56 ms
    keeps a node whose only match is a tokenized coined entry keyStudio page interactionspassed0.36 ms
    reads authored values at most twice per search, regardless of the entry countStudio page interactionspassed2.89 ms
    links addressed hits to the entry and other hits to their section or narrativeStudio page interactionspassed0.2 ms
    groups entries beneath each node and pages fifty nodes at a timeStudio page interactionspassed3.35 ms
    renders node words, independent rungs, bindings, locations and escaped textStudio page interactionspassed2.03 ms
    requests a stamp only over HTTP and HTTPS and shows only its text fieldsStudio page interactionspassed0.51 ms
    loads the built classic bundle without imports and defines the page and view elementsStudio page interactionspassed1.94 ms
    names a question copy control with the full entry address and updates itStudio page interactionspassed1.01 ms
    uses the navigation search input, announces the empty prompt and reveals paging progressStudio page interactionspassed9.42 ms
    enhances a diagram through its view box, preserves links on click and removes handlersnot recordedpassed3.07 ms
  • test:protocol.studio-pages · anchored · test anchor binding present · test/studio-pages.test.ts:18

    External run evidence from test/studio-pages.test.ts

    Test anchors: test:protocol.studio-pages. Specs verified by those bindings: spec:consumers.spec-studio.index-page, spec:consumers.spec-studio.pack-page, spec:consumers.spec-studio.search, spec:consumers.spec-studio.shell, spec:consumers.spec-studio.spec-page.core.

    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
    rejects malformed page links: <div id="same"></div><div id="same"></div>not recordedpassed3.03 ms
    rejects malformed page links: <a href="missing.html">Missing</a>not recordedpassed0.61 ms
    rejects malformed page links: <a href="#missing">Missing</a>not recordedpassed0.42 ms
    rejects malformed page links: <a href="https://example.com">Outside</a>not recordedpassed0.3 ms
    renders Model definitions without exposing the derived term key mapStudio static pagespassed9.63 ms
    frames every browsing page with a skip link, labelled search, rail, canvas, classic script and stampStudio static pagespassed2.2 ms
    lists example-space owners only in Pack and Spec railsStudio static pagespassed0.36 ms
    shows a keyed question once with a copy action naming its full addressStudio static pagespassed0.35 ms
    opens the index with counts, four task routes, every filter and stable section idsStudio static pagespassed0.84 ms
    gives each Spec row one rung badge and binding wordsStudio static pagespassed1.06 ms
    puts Pack totals before framing and folds holds into that summaryStudio static pagespassed0.53 ms
    leaves member names out when every member waits only for its authorStudio static pagespassed15.8 ms
    agrees each boundary verb with its countStudio static pagespassed13.16 ms
    shows only the Spec's own Packs in its rail and every Pack on the indexStudio static pagespassed21.3 ms
    asserts every index summary sentence including fact-based verifier countsStudio static pagespassed10.79 ms
    renders code spans in titles on every page and strips them in document titlesStudio static pagespassed13.22 ms
    orders rung filters by the ladder and uses none everywhere for an unmet idea floorStudio static pagespassed12.07 ms
    keeps navigation links outside Pack disclosure controlsStudio static pagespassed0.23 ms
    labels next rungs, UI and finding links and avoids repeating absent bindingsStudio static pagespassed0.49 ms
    renders Pack members in authored order, closed and with one colored badge per summaryStudio static pagespassed0.7 ms
    renders the four Pack boundary sections and the verifier gap sentence onceStudio static pagespassed0.29 ms
    shows the stated rung beside its floor and warns only in the dishonest directionStudio static pagespassed0.24 ms
    renders every section in order and every addressable entry with its key and recorded lineStudio static pagespassed0.49 ms
    names the first unmet clause and renders a missing idea floor as noneStudio static pagespassed5.38 ms
    shows question fields, code location, component, bindings and relations both waysStudio static pagespassed0.93 ms
    escapes authored text, reads only code spans and links resolving mentionsStudio static pagespassed0.42 ms
    links validator-readable escaped mentions and preserves unequal code delimitersStudio static pagespassed0.36 ms
    shows findings on the index and only links page-bearing subjectsStudio static pagespassed10.06 ms
    embeds the index only on search and supplies its element and no-script explanationStudio static pagespassed0.78 ms
    resolves all probe links including fragments in dynamic search resultsStudio static pagespassed9.25 ms
    keeps unresolved component bindings as text and resolves every remaining linkStudio static pagespassed22.76 ms
    renders deterministically with no time or commit metadataStudio static pagespassed11.35 ms
    ships the native layout and focus stylesheet in the browser assetsStudio static pagespassed0.4 ms
    resolves every page link and element fragmentProtocol Studio page setpassed1364.19 ms
    contains the complete Spec prose without executing scriptProtocol Studio page setpassed103.58 ms
Design view

Requirement drawing

  • Declared verifying examples: no declared verifying example.
Requirement drawing for spec:consumers.spec-studio.search
The diagram as text
  • spec:consumers.spec-studio.search: Search finds a Spec, a Pack, an entry or a bound file by a word · declared Spec
  • spec:consumers.spec-studio.shell: The Studio's shell frames every page with navigation, a rail and a canvas · declared Spec
  • impl:protocol.studio-concept-match: matches concepts deterministically across graph and browser queries · anchored code · src/reader/concept-match.ts:43
  • impl:protocol.studio-search-page: publishes search records beside the browser results view · anchored code · src/projections/studio/pages/search-page.ts:5
  • impl:protocol.studio-search-results: ranks and renders concept, entry and file search hits · anchored code · src/studio-elements/search-results.ts:95
  • test:protocol.studio-concept-match: test:protocol.studio-concept-match · anchored test binding · binding present · test/concept-match.test.ts:9
  • test:protocol.studio-page-elements: test:protocol.studio-page-elements · anchored test binding · binding present · test/studio-elements.test.ts:26
  • test:protocol.studio-pages: test:protocol.studio-pages · anchored test binding · binding present · test/studio-pages.test.ts:18
  • spec:consumers.spec-studio.search refines spec:consumers.spec-studio.shell · declared
  • impl:protocol.studio-concept-match satisfies spec:consumers.spec-studio.search · anchored
  • impl:protocol.studio-search-page satisfies spec:consumers.spec-studio.search · anchored
  • impl:protocol.studio-search-results satisfies spec:consumers.spec-studio.search · anchored
  • test:protocol.studio-concept-match verifies spec:consumers.spec-studio.search · anchored
  • test:protocol.studio-page-elements verifies spec:consumers.spec-studio.search · anchored
  • test:protocol.studio-pages verifies spec:consumers.spec-studio.search · 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
  • component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    • component:protocol.extract · the carrier and source pipeline · src/extract/index.ts:192 · layer application · context protocol
    • 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.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.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.studio-elements · optional browser behavior and proposal handoff · src/studio-elements/index.ts:13 · layer edge · context protocol

    Uses

    • component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol
    • component:protocol.reader · the typed graph contract and body evaluator · src/reader/reader.ts:671 · layer application · context protocol
  • impl:protocol.studio-concept-match · matches concepts deterministically across graph and browser queries · src/reader/concept-match.ts:43

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

    Uses

    None.

  • impl:protocol.studio-search-page · publishes search records beside the browser results view · src/projections/studio/pages/search-page.ts:5

    Component: component:protocol.projections · read-only output, layout and owned publication · src/projections/design-review.ts:29 · layer edge · context protocol

    Uses

    None.

  • impl:protocol.studio-search-results · ranks and renders concept, entry and file search hits · src/studio-elements/search-results.ts:95

    Component: component:protocol.studio-elements · optional browser behavior and proposal handoff · src/studio-elements/index.ts:13 · layer edge · 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:consumers.spec-studio.search
The diagram as text
  • spec:consumers.reader: The reader bridges agent entry points to composable graph context
  • spec:consumers.spec-studio.data: The Studio renders from the reader's values and embeds only what its script reads
  • spec:consumers.spec-studio.page-elements: A few custom elements filter, search, open and copy on a rendered page
  • spec:consumers.spec-studio.search: Search finds a Spec, a Pack, an entry or a bound file by a word
  • spec:consumers.spec-studio.shell: The Studio's shell frames every page with navigation, a rail and a canvas
  • spec:consumers.spec-studio.search dependsOn spec:consumers.reader · declared — the page matches with the reader's concept matching
  • spec:consumers.spec-studio.search dependsOn spec:consumers.spec-studio.data · declared
  • spec:consumers.spec-studio.search refines spec:consumers.spec-studio.shell · declared
  • spec:consumers.spec-studio.page-elements dependsOn spec:consumers.spec-studio.search · 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

  • spec:consumers.spec-studio.page-elements

    Implementing units

    • component:protocol.studio-elements · src/studio-elements/index.ts:13
    • impl:protocol.studio-copy · src/studio-elements/copy.ts:22
    • impl:protocol.studio-expander · src/studio-elements/expander.ts:16
    • impl:protocol.studio-filter · src/studio-elements/filter.ts:25
    • impl:protocol.studio-search-form · src/studio-elements/search.ts:18
    • impl:protocol.studio-search-results · src/studio-elements/search-results.ts:95
    • impl:protocol.studio-stamp · src/studio-elements/stamp.ts:30

    Referencing units

    None.

    Enabled verifiers: test:protocol.studio-copy-source, test:protocol.studio-page-elements

    Packs: pack:self-hosting-v1, pack:spec-studio-v1

Distance 2

Relations

Relation and directionOther endClaimReasonExercised keys
dependsOn · outgoingThe reader bridges agent entry points to composable graph context
spec:consumers.reader · resolves
declaredthe page matches with the reader's concept matchingNone
dependsOn · outgoingThe Studio renders from the reader's values and embeds only what its script reads
spec:consumers.spec-studio.data · resolves
declaredNoneNone
refines · outgoingThe Studio's shell frames every page with navigation, a rail and a canvas
spec:consumers.spec-studio.shell · resolves
declaredNoneNone
dependsOn · incomingA few custom elements filter, search, open and copy on a rendered page
spec:consumers.spec-studio.page-elements · resolves
declaredNoneNone

Bindings

Implementation binding: present

  • impl:protocol.studio-concept-match · matches concepts deterministically across graph and browser queries · src/reader/concept-match.ts:43 · role reader · component component:protocol.reader · layer application · context protocol
  • impl:protocol.studio-search-page · publishes search records beside the browser results view · src/projections/studio/pages/search-page.ts:5 · role projection · component component:protocol.projections · layer edge · context protocol
  • impl:protocol.studio-search-results · ranks and renders concept, entry and file search hits · src/studio-elements/search-results.ts:95 · role projection · component component:protocol.studio-elements · layer edge · context protocol

Design reference: none

Verifier binding: present

  • test:protocol.studio-concept-match · anchored · test/concept-match.test.ts:9 · test anchor
  • test:protocol.studio-page-elements · anchored · test/studio-elements.test.ts:26 · test anchor
  • test:protocol.studio-pages · anchored · test/studio-pages.test.ts:18 · 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.