Spec Studio

Views compose scoped intent instead of patching canonical source

spec:consumers.edit-modelUse Case / Behavior · featureready floor ready

Packs: pack:roadmap, pack:self-hosting-v1

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

Findings: no errors, no warnings

specs/consumers/edit-model.sdp.md

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

Intent
outcome
Let a view frame a requested change without giving derived surfaces a direct write path to canonical source.
Behavior
rule line 15 · specs/consumers/edit-model.sdp.md:15
A view composes scoped intent, bounded by a Spec, its neighbors, a Pack, or open questions, and hands that intent to an agent.
rule.agentEdits line 16 · specs/consumers/edit-model.sdp.md:16
The agent edits source as a human would, git records the ordinary edit, and the same conformance and honesty checks evaluate it.

no example exercises it

rule.lifecycleEdits line 17 · specs/consumers/edit-model.sdp.md:17
Lifecycle changes such as splitting, combining, refining, or deleting are ordinary source and git edits rather than structured patches from a derived view.

no example exercises it

1 unkeyed rule.

Verification

Verifier bindings

  • test:protocol.studio-intent-handoff · anchored · test anchor binding present · test/studio-s5.test.ts:407

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

    Test anchors: test:protocol.studio-export-contained, test:protocol.studio-intent-handoff, test:protocol.studio-intents-refresh, test:protocol.studio-memo-shared, test:protocol.studio-watch-plain. Specs verified by those bindings: spec:consumers.edit-model, spec:consumers.intent-composition, spec:consumers.intent-composition.proposal.memo, spec:consumers.intent-composition.proposal.memo.shared, spec:consumers.spec-studio.components, spec:consumers.spec-studio.export, spec:consumers.spec-studio.export.self-contained, spec:consumers.spec-studio.intent-panel, spec:consumers.spec-studio.intent-panel.refresh-keeps-intents, spec:consumers.spec-studio.publisher.watch, spec:consumers.spec-studio.publisher.watch.matches-plain-run, spec:consumers.spec-studio.responsive.

    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
    executes the bound example against a fresh worldRefreshing a tab keeps every gathered intent (spec:consumers.spec-studio.intent-panel.refresh-keeps-intents)passed9.92 ms
    executes the bound example against a fresh worldRecipe 49 and the composing panel write one memo for one proposal (spec:consumers.intent-composition.proposal.memo.shared)passed4.43 ms
    executes the bound example against a fresh worldA Pack's export opens alone and keeps its links inside it (spec:consumers.spec-studio.export.self-contained)passed63.32 ms
    executes the bound example against a fresh worldEach watch cycle writes the page set a plain run writes (spec:consumers.spec-studio.publisher.watch.matches-plain-run)passed124.81 ms
    keeps unsupported intents apart and expands Pack members only against the stamped basenot recordedpassed2.27 ms
    returns the same schema problems as recipe 38 and renders in any corpusnot recordedpassed10.03 ms
    composes locally without changing source or requesting a network servicenot recordedpassed1.54 ms
    keeps the last local intents when storage refuses writesnot recordedpassed0.29 ms
    keeps unsaved local intents when storage remains readable but its quota refuses writesnot recordedpassed0.27 ms
    rewrites SVG and accessibility references without changing subject attributes or authored textnot recordedpassed6.38 ms
    opens disclosures for print and restores exactly their prior statenot recordedpassed1.43 ms
    leaves Mermaid source closed for print unless the reader opened itnot recordedpassed1.06 ms
    stops the actual Studio watch process with exit zero on SIGINTnot recordedpassed491.48 ms
    removes a failed watch publication, keeps watching and recovers on the next carrier editnot recordedpassed33.93 ms
    ships a phone layout and a print stylesheet for the whole canvasnot recordedpassed10.85 ms
    keeps exports graph-only when the browsing pages receive a base and run recordsnot recordedpassed27 ms
    starts no cycle for source or input-file eventsnot recordedpassed30.93 ms
    merges concurrent panels before gathering or discarding and flags rejected storage recordsnot recordedpassed0.6 ms
    refreshes the browser panel on storage and pageshow and removes those listeners on disconnectnot recordedpassed1.47 ms
    prefills compose with the authored entry text including code spans and no rendered annotationsnot recordedpassed15.53 ms
    omits blank exact text and reports whitespace requests in the compose dialognot recordedpassed2.42 ms
    uses the stamp base, labels fields, orders actions and copies and saves the named documentsnot recordedpassed5.09 ms
    copies distinct actions and recorded scopes for both Pack choices without a stampnot recordedpassed2.97 ms
    keeps Pack framing changes apart and gathers scenario editor steps verbatimnot recordedpassed2.66 ms
    matches the literal memo for the shared proposal, including the full relation and documentnot recordedpassed0.93 ms
    keeps the last watch pages when an optional base becomes unreadable, just like a plain runnot recordedpassed986.18 ms
    inlines the selected stylesheet asset in exports and publishes those same style bytesnot recordedpassed25.93 ms
    introduces studio before its watch option and gives recipe 49 a use casenot recordedpassed4.36 ms
    renders edit scenario steps outside inert templates without scriptnot recordedpassed1.08 ms
    renders propose scenario steps outside inert templates without scriptnot recordedpassed0.72 ms
    writes both memo reasons as code spans: "<details>Review the design.</details>", "`Keep` the ``literal`` reason`"not recordedpassed0.7 ms
    writes both memo reasons as code spans: "`Review` the ``design`` reason`", "<details>Keep the change.</details>"not recordedpassed0.43 ms
    fences requests so their Markdown cannot alter the memo: "Fix a typo.\n<!--"not recordedpassed0.89 ms
    fences requests so their Markdown cannot alter the memo: "Use this text.\n```\n## Forged heading\n``````\n<!--hidden-->"not recordedpassed0.7 ms
    contains phone navigation, stamp and wide tables within the viewportnot recordedpassed15.39 ms
    keeps the maturity caption readable and empty cells compact on a phonenot recordedpassed7.6 ms
    aligns maturity cell counts with the empty cell dashesnot recordedpassed4.92 ms
    keeps table headers and one-word cells intact while allowing word-boundary wrappingnot recordedpassed7.32 ms
    keeps natural desktop diagram size and fits only on phonesnot recordedpassed7.69 ms
    hides phone scroll advice and closed source in print while keeping opened source printablenot recordedpassed18.32 ms
Design view

Requirement drawing

  • Declared verifying examples: no declared verifying example.
Requirement drawing for spec:consumers.edit-model
Requirement drawing for spec:consumers.edit-modelreferences · anchoredreferences · anchoredreferences · anchoredreferences · anchoredrefines · declaredrefines · declaredrefines · declaredrefines · declaredverifies · anchoredverifies · anchoredIntended Specsspec:consumers.edit-modelViews compose scoped intentinstead of patchingcanonical source…consumers.edit-modeldeclared Spec · no satisfyingbindingspec:consumers.intent-compositionComposed intent hands offon one proposal shape…consumers.intent-compositiondeclared Spec · no satisfyingbindingSatisfying or referencingunitsimpl:protocol.studio-intent-panelgathers ordered intentsunder the page-root storagekey and partitions theirhand-off…protocol.studio-intent-panelanchored codeimpl:protocol.studio-intent-panel-elementdisplays gathered requestsand writes copy selectionsor local download links…protocol.studio-intent-panel-elementanchored codeTest or oracle bindingstest:protocol.studio-intent-handofftest:protocol.studio-intent-handoff…protocol.studio-intent-handoffanchored test binding ·binding presentOutside the selected setspec:consumers.intent-composition.proposalA change proposal isaddressed, based andchecked before it lands…consumers.intent-composition.proposaldeclared Specspec:consumers.projections-modelProjections fan out fromone graph without becomingtruth stores…consumers.projections-modeldeclared Specspec:consumers.spec-studio.intent-panelA composing panel on everypage gathers scoped intentfor an agent…consumers.spec-studio.intent-paneldeclared Spec
The diagram as text
  • spec:consumers.edit-model: Views compose scoped intent instead of patching canonical source · declared Spec · no satisfying binding
  • spec:consumers.intent-composition: Composed intent hands off on one proposal shape · declared Spec · no satisfying binding
  • spec:consumers.projections-model: Projections fan out from one graph without becoming truth stores · declared Spec
  • spec:consumers.intent-composition.proposal: A change proposal is addressed, based and checked before it lands · declared Spec
  • spec:consumers.spec-studio.intent-panel: A composing panel on every page gathers scoped intent for an agent · declared Spec
  • impl:protocol.studio-intent-panel: gathers ordered intents under the page-root storage key and partitions their hand-off · anchored code · src/studio-elements/intent-panel.ts:51
  • impl:protocol.studio-intent-panel-element: displays gathered requests and writes copy selections or local download links · anchored code · src/studio-elements/intent-panel-element.ts:14
  • test:protocol.studio-intent-handoff: test:protocol.studio-intent-handoff · anchored test binding · binding present · test/studio-s5.test.ts:407
  • spec:consumers.edit-model refines spec:consumers.projections-model · declared
  • spec:consumers.intent-composition refines spec:consumers.edit-model · declared
  • spec:consumers.intent-composition.proposal refines spec:consumers.intent-composition · declared
  • spec:consumers.spec-studio.intent-panel refines spec:consumers.intent-composition · declared
  • impl:protocol.studio-intent-panel references spec:consumers.edit-model · anchored
  • impl:protocol.studio-intent-panel references spec:consumers.intent-composition · anchored
  • impl:protocol.studio-intent-panel-element references spec:consumers.edit-model · anchored
  • impl:protocol.studio-intent-panel-element references spec:consumers.intent-composition · anchored
  • test:protocol.studio-intent-handoff verifies spec:consumers.edit-model · anchored
  • test:protocol.studio-intent-handoff verifies spec:consumers.intent-composition · anchored
Mermaid source

Copyable source; the Studio draws static SVG.

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

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:consumers.edit-model
The diagram as text
  • spec:consumers.authoring-on-ramp: Authors move one Spec from intent to reviewed evidence
  • spec:consumers.edit-model: Views compose scoped intent instead of patching canonical source
  • spec:consumers.intent-composition: Composed intent hands off on one proposal shape
  • spec:consumers.intent-composition.proposal: A change proposal is addressed, based and checked before it lands
  • spec:consumers.obsidian-vault.iteration: A design pass is followed and answered from the vault
  • spec:consumers.projections-model: Projections fan out from one graph without becoming truth stores
  • spec:consumers.spec-studio: The Spec Studio is a static HTML workbench over the one graph
  • spec:consumers.spec-studio.intent-panel: A composing panel on every page gathers scoped intent for an agent
  • spec:consumers.upgrade-kit: The upgrade kit shows a corpus what it could adopt
  • spec:consumers.edit-model refines spec:consumers.projections-model · declared
  • spec:consumers.authoring-on-ramp dependsOn spec:consumers.edit-model · declared — an author edits the canonical carrier as the edit model states, never through a derived view
  • spec:consumers.intent-composition.proposal dependsOn spec:consumers.edit-model · declared
  • spec:consumers.obsidian-vault.iteration dependsOn spec:consumers.edit-model · declared — the vault composes intent and never patches a carrier
  • spec:consumers.spec-studio dependsOn spec:consumers.edit-model · declared — wanted changes leave the view as intent for an ordinary source edit
  • spec:consumers.spec-studio.intent-panel dependsOn spec:consumers.edit-model · declared
  • spec:consumers.upgrade-kit dependsOn spec:consumers.edit-model · declared — a carrier changes only through an agent's or a person's edit, recorded by git
  • spec:consumers.intent-composition refines spec:consumers.edit-model · 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

Relations

Relation and directionOther endClaimReasonExercised keys
refines · outgoingProjections fan out from one graph without becoming truth stores
spec:consumers.projections-model · resolves
declaredNoneNone
dependsOn · incomingAuthors move one Spec from intent to reviewed evidence
spec:consumers.authoring-on-ramp · resolves
declaredan author edits the canonical carrier as the edit model states, never through a derived viewNone
dependsOn · incomingA change proposal is addressed, based and checked before it lands
spec:consumers.intent-composition.proposal · resolves
declaredNoneNone
dependsOn · incomingA design pass is followed and answered from the vault
spec:consumers.obsidian-vault.iteration · resolves
declaredthe vault composes intent and never patches a carrierNone
dependsOn · incomingThe Spec Studio is a static HTML workbench over the one graph
spec:consumers.spec-studio · resolves
declaredwanted changes leave the view as intent for an ordinary source editNone
dependsOn · incomingA composing panel on every page gathers scoped intent for an agent
spec:consumers.spec-studio.intent-panel · resolves
declaredNoneNone
dependsOn · incomingThe upgrade kit shows a corpus what it could adopt
spec:consumers.upgrade-kit · resolves
declareda carrier changes only through an agent's or a person's edit, recorded by gitNone
refines · incomingComposed intent hands off on one proposal shape
spec:consumers.intent-composition · resolves
declaredNoneNone

Bindings

Implementation binding: none

Design reference: present

  • impl:protocol.studio-intent-panel · gathers ordered intents under the page-root storage key and partitions their hand-off · src/studio-elements/intent-panel.ts:51 · role service · component component:protocol.studio-elements · layer edge · context protocol
  • impl:protocol.studio-intent-panel-element · displays gathered requests and writes copy selections or local download links · src/studio-elements/intent-panel-element.ts:14 · role interaction · component component:protocol.studio-elements · layer edge · context protocol

Verifier binding: present

  • test:protocol.studio-intent-handoff · anchored · test/studio-s5.test.ts:407 · 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.