Spec Studio

Design diff

Compared with the base graph base da4b141, schema 0.11.0, 405 Specs; the built graph has schema 0.12.0, 456 Specs.

The comparison reads the two graphs only. Recipe 35 with detail enabled.

  • 51 Specs added.
  • 0 Specs removed.
  • 52 Specs changed.
  • 4 Packs with membership, member order or order meaning changes.
  • 88 Specs with binding changes.

Specs added

Specs removed

None.

Specs changed

Markdown authoring enters the one graph

spec:carrier.markdown-authoring

altitude · changed

Base
feature
Now
epic

A Pack has a Markdown manifest carrier

spec:carrier.markdown-pack-authoring

behavior.rules[1] · changed

Base

The pack envelope is closed to exactly `id` (required, `pack:` namespace), `specs` (required YAML list of `spec:` ids, manifest order; may be empty), and `modelRefs` (optional YAML list of `spec:` ids). A derived-name key is refused as `extract/reserved-property`. Any other key — including the Spec envelope keys `kind`, `altitude`, `readiness` and `relations`, and `title` — refuses with `extract/unrecognized-property`. Symmetrically, `specs` or `modelRefs` on a `spec:` carrier refuse the same way.

Rule

Now

The pack envelope is closed to exactly `id` (required, `pack:` namespace), `specs` (required YAML list of `spec:` ids, manifest order; may be empty), `modelRefs` (optional YAML list of `spec:` ids), and `order` (optional; its one lawful value is `priority`, and any other value refuses with `extract/invalid-frontmatter`). A derived-name key is refused as `extract/reserved-property`. Any other key — including the Spec envelope keys `kind`, `altitude`, `readiness` and `relations`, and `title` — refuses with `extract/unrecognized-property`. Symmetrically, `specs` or `modelRefs` on a `spec:` carrier refuse the same way.

Rule

relation.decidedBy:spec:decisions.roadmap-priority · added

Now
from
spec:carrier.markdown-pack-authoring
type
decidedBy
to
spec:decisions.roadmap-priority
claim
declared

Agents script a visible typed graph

spec:consumers.agent-surface

altitude · changed

Base
feature
Now
epic

Recipe answers fit an agent's context and explain their misses

spec:consumers.agent-surface.answer-shapes

behavior.rules[0] · changed

Base

Changed-file impact, Pack design and design diff, recipes 4, 29 and 35, accept `detail: true` and default to summaries preserving every total and explicitly naming omitted detail.

Rule

Now

Changed-file impact, Pack design, design diff and the design slice, recipes 4, 29, 35 and 54, accept `detail: true` and default to summaries preserving every total and explicitly naming omitted detail.

Rule

design.detailParameter · changed

Base
recipes 4, 29 and 35 read `params.detail`, absent or `false` for the summary and `true` for every row in full; recipe 29's `detail` may also be a list of member ids, which returns full rows for those members and summary rows for the rest of the Pack, and an id that is not a member is a diagnostic in the result. A summary keeps `totals` as the full answer counts them and adds `leftOut`, one line for each kind of detail it omits.
Now
recipes 4, 29, 35 and 54 read `params.detail`, absent or `false` for the summary and `true` for every row in full; recipe 29's and recipe 54's `detail` may also be a list of member ids, which returns full rows for those members and summary rows for the rest of the Pack, and an id that is not a member is a diagnostic in the result. A summary keeps `totals` as the full answer counts them and adds `leftOut`, one line for each kind of detail it omits.

Authors move one Spec from intent to reviewed evidence

spec:consumers.authoring-on-ramp

altitude · changed

Base
feature
Now
epic

rule.designRounds · added

Now

The skill teaches design in rounds over a design slice: what each rung's design typically settles, that a detail only the builder reads and a question only the builder answers belong to the build, and how a reviewer reads the design columns beside each rung; no check reads this guidance.

Rule

Delivery sessions route work from current graph state

spec:consumers.delivery-session-on-ramp

behavior.rules[4] · changed

Base

The skill teaches a review report as a numbered list ordered by severity, with each item naming one entry address or Spec section, stating the gap in one sentence, and proposing exact text with the address it replaces or follows.

Rule

Now

The skill teaches a Spec proposal report as a numbered list ordered by severity, with each item naming one entry address or Spec section, stating the gap in one sentence, and proposing exact text with the address it replaces or follows. Findings against code or other files stay review comments on their lines; a review proposing no Spec edit has no proposal.

Rule

Designs are compared between a base commit and the working tree at entry grain

spec:consumers.design-diff

behavior.rules[9] · changed

Base

It reports changes to Pack membership and order, and to the code units, verifiers and delivery facts bound to each Spec, kept apart from the authored changes because they derive from anchors.

Rule

Now

It reports changes to Pack membership, member order and what a Pack's order means, and to the code units, verifiers and delivery facts bound to each Spec, kept apart from the authored changes because they derive from anchors.

Rule

design.packRows · changed

Base
`packs` rows are `{ id, change, membersAdded, membersRemoved, reordered }` for each Pack added, removed or changed in membership or order.
Now
`packs` rows are `{ id, change, membersAdded, membersRemoved, reordered, orderChanged, orderBefore, orderAfter }` for each Pack added, removed or changed in membership, member order or order meaning; `orderBefore` and `orderAfter` are `"reading"` or `"priority"`, null on a side where the Pack is absent, and `orderChanged` is true when both sides hold the Pack and the two differ. An absent `order` reads as `"reading"` in every schema version; a value the head's engine does not know is outside the common schema, listed in `diagnostics` and not compared; that Pack's membership and member order still compare, its `orderChanged` is false, and the side holding the unknown value reads null. `membersAdded` and `membersRemoved` keep their respective manifest order.

relation.decidedBy:spec:decisions.roadmap-priority · added

Now
from
spec:consumers.design-diff
type
decidedBy
to
spec:decisions.roadmap-priority
claim
declared

The CLI names the engine that produced a result

spec:consumers.engine-provenance

relation.refines:spec:consumers.command-line · added

Now
from
spec:consumers.engine-provenance
type
refines
to
spec:consumers.command-line
claim
declared
reason
the version flag is one more answer the command line gives an adopter

The next body of work is planned from the graph, not from a prose index

spec:consumers.graph-first-planning

behavior.rules[6] · changed

Base

A plan file points to the Pack and carrying Specs for intended truth and derived state; it may keep an advisory execution and recovery record, while plan numbering, recorded work order and staleness never become graph structure or workflow authority.

Rule

Now

A corpus that keeps plan documents lets each point to its Packs and carrying Specs for intended truth and derived state; a plan document confers nothing, and plan numbering, recorded work order and staleness never become graph structure or workflow authority. Advisory priority over the next work lives in a roadmap Pack.

Rule

Every Spec, Pack, code unit and keyed term is a note, and every relation is a link

spec:consumers.obsidian-vault.notes

design.packNoteBody · changed

Base
the banner, `# <title>`, the framing, `## Members, filterable` with the Pack's Base embedded, `## Members, in reading order` as a numbered list in manifest order, each a link with its stated rung, floor and stated next rung or `nothing blocks`, then `## Boundary` with the reader's four boundary lists and `## Findings`.
Now
the banner, `# <title>`, the framing, `## Members, filterable` with the Pack's Base embedded, `## Members, in advisory priority order` when `order` is `"priority"`, otherwise `## Members, in reading order`, as a numbered list in manifest order, each a link with its stated rung, floor and stated next rung or `nothing blocks`, then `## Boundary` with the reader's four boundary lists and `## Findings`. A roadmap states `Priority confers no permission or sequencing requirement.` before its ordered list heading.

design.packProperties · changed

Base
`aliases` (the id, then the title), `title`, `manifest` (the root-relative manifest path).
Now
`aliases` (the id, then the title), `title`, `manifest` (the root-relative manifest path), and optional `order`, present as `"priority"` only when the Pack states it.

Projections fan out from one graph without becoming truth stores

spec:consumers.projections-model

altitude · changed

Base
feature
Now
epic

relation.refines:spec:protocol.self-hosting · removed

Base
from
spec:consumers.projections-model
type
refines
to
spec:protocol.self-hosting
claim
declared

Roadmap views read releases, baselines and phases from git and the graph

spec:consumers.projections-model.roadmap-views

narrative · changed

Base
Release, baseline and roadmap vocabulary belongs to optional projections that wait until a reader needs them.
Now
Release, baseline and roadmap vocabulary belongs to optional projections that wait until a reader needs them. The owner, choosing what the next pull requests take up, is the reader the roadmap view waited for, and the roadmap reading answers it: a Pack whose manifest states a priority order, read with what each entry still needs, shown on the Studio's roadmap page and rendered as a pull request's forward section. Release and baseline views still wait for a reader of their own.

question.namedRoadmapReader · removed

Base
question
Does a reader need release, baseline or roadmap views that the shipped projections, the recipes and git do not serve?
blocking
true
key
namedRoadmapReader
decider
owner
trigger
a named reader with that need, and a way to measure it inside the arc that builds the views

question.releaseReader · added

Now
question
Does a reader need release or baseline views that the roadmap, the recipes and git tags do not serve?
blocking
true
key
releaseReader
decider
owner
provisional
Keep release and baseline views deferred; the trigger opens this question and does not authorize either view's build.
trigger
the first published release

relation.dependsOn:spec:consumers.roadmap · added

Now
from
spec:consumers.projections-model.roadmap-views
type
dependsOn
to
spec:consumers.roadmap
claim
declared
reason
the roadmap view the owner asked for is the roadmap reading, its page and its memo

statedReadiness · changed

Base
idea
Now
scoped

term.phase / iteration / milestone · changed

Base
Descriptive vocabulary for optional roadmap projections, never gates or enforced sequences.
Now
Descriptive words a roadmap's framing may use, never an entry field, a date, a gate or an enforced sequence.

term.roadmap · added

Now
A Pack whose manifest states a priority order, read with what each entry still needs next; its order is an advisory preference, never a schedule or a gate.

A Pack is read from a named perspective

spec:consumers.review-perspectives

narrative · changed

Base
The original design gave every reader one reading surface, each reading from their own concern: the analyst, the domain engineer, the architect, the tester, the designer and the agent (`docs/lineage/v0-design/04-authoring-surfaces.md` §6). The first adopter iterates each capability's design through advisor lenses, its runtime platform, the domain, operations and the product, each a written list of the questions its field asks, run over the same Pack by the same pass brief (`libar-platform/design/advisors/lenses/`, `libar-platform/design/advisors/task-pass.md`). It asks for a lens to be a filter over the same capability that reorders and emphasizes questions, entries, examples and constraints and opens the same Specs, with no new Spec kind and no compulsory sequence of stages (`libar-platform/docs/feedback/sdp-feedback-02.md`, item 28). The Protocol takes the member filter and the order and leaves each member's content whole; emphasis inside a member stays the reader's.

The owner ruled the word: perspective. The Spec Studio keeps lens for its graph views, its Packs, architecture, tests and evidence views, and discipline stays the filter by kind or section. The adopter's advisor lens is a reader's concern, not a view of the graph, so in the Protocol's terms it is a perspective.
Now
The original design gave every reader one reading surface, each reading from their own concern: the analyst, the domain engineer, the architect, the tester, the designer and the agent (`docs/lineage/v0-design/04-authoring-surfaces.md` §6). The first adopter iterates each capability's design through advisor lenses, its runtime platform, the domain, operations and the product, each a written list of the questions its field asks, run over the same Pack by the same pass brief (`libar-platform/design/advisors/lenses/`, `libar-platform/design/advisors/task-pass.md`). It asks for a lens to be a filter over the same capability that reorders and emphasizes questions, entries, examples and constraints and opens the same Specs, with no new Spec kind and no compulsory sequence of stages (`libar-platform/docs/feedback/sdp-feedback-02.md`, item 28). The Protocol takes the member filter and the order and leaves each member's content whole; emphasis inside a member stays the reader's.

The owner ruled the word: perspective. The Spec Studio keeps lens for its graph views, its Packs, capabilities, architecture, tests and evidence views, and discipline stays the filter by kind or section. The adopter's advisor lens is a reader's concern, not a view of the graph, so in the Protocol's terms it is a perspective.

The Spec Studio is a static HTML workbench over the one graph

spec:consumers.spec-studio

rule.staticPageSet · changed

Base

The Studio is a static page set: the index page, which is the Packs lens; a search page; a page for each other lens, each register, the owner queue and the glossary; one page per Pack and per Spec; one export file per Pack; and, when the build is given their inputs, a diff page and a runs page; with their local assets. Its build renders each page whole, so a page needs no server, and every page but the search page reads without its script, which adds filtering, search, copying, pan and zoom, and the composing panel.

Rule

Now

The Studio is a static page set: the index page, which is the Packs lens; a search page; a page for each other lens, each register, the owner queue, the roadmap and the glossary; one page and one slice page per Pack, one page per Spec; one export file per Pack; and, when the build is given their inputs, a diff page and a runs page; with their local assets. Its build renders each page whole, so a page needs no server, and every page but the search page reads without its script, which adds filtering, search, copying, pan and zoom, and the composing panel.

Rule

The Studio's custom elements each hold one view the build renders

spec:consumers.spec-studio.components

design.maturityMap · changed

Base
`sdp-maturity-map` with `pack-id`: the Pack's members placed by stated rung and floor reached, as a table of short cards with its axis explanation in the caption; an empty cell shows `—` alone and a filled cell names its count and Specs; no behavior.
Now
`sdp-maturity-map` with `pack-id`: the Pack's members placed by stated rung and floor reached, drawn as a static SVG grid of counts, then its count table and each populated cell's member list; no behavior.

The Studio renders from the reader's values and embeds only what its script reads

spec:consumers.spec-studio.data

rule.noSlices · changed

Base

The Studio's data holds no context bundle or other AI slice: the context bundle is composed on each invocation and never saved, and a design pass composes one with its recipe when it needs it.

Rule

Now

The Studio's data holds no context bundle or other AI slice: the context bundle is composed on each invocation and never saved, and a design pass composes one with its recipe when it needs it. A slice page renders the design slice's answer into its markup, as every page renders its values, and embeds no slice data.

Rule

rule.readerValues · changed

Base

The build renders the index from `specs()`, `packs()`, `findings()` and each Spec's design columns, a Pack page from `packContext` and the Pack totals, a Spec page from `specContext`, and the search page from the search index; every page's rail renders the rail values. A page states no value the reader did not return or a named recipe did not answer, apart from counts the build takes of those values.

Rule

Now

The build renders the index from `specs()`, `packs()`, `findings()`, each Spec's design columns and the epic memberships recipe 52 answers, a Pack page from `packContext` and the Pack totals, a Spec page from `specContext`, and the search page from the search index; every page's rail renders the rail values. A page states no value the reader did not return or a named recipe did not answer, apart from counts the build takes of those values.

Rule

A page takes each recipe answer from the recipe's shipped body

spec:consumers.spec-studio.data.recipe-answers

design.pageRecipes · changed

Base
the index and the glossary render reader values only; the architecture lens renders recipes 17 and 43; the tests lens renders every recipe 34 answer, recipe 44, and recipe 45 given run records; a Spec page renders its recipe 21, 30 and 34 answers, its own space from recipe 44, the recipe 51 rows that cite its entries, the recipe 45 files whose `specs` hold its id, and its own row of recipe 35's whole-corpus answer; a Pack page renders the totals of its recipe 29 answer and, given a base graph, its own recipe 35 answer; the registers render recipes 20, 31, 24 beside recipe 51's rows, and 33; the owner queue renders recipe 46; the diff page renders recipe 35's whole-corpus answer; the runs page renders recipe 45; an export renders the values of the pages it holds.
Now
the index renders reader values and each Spec's `epicIds` from recipe 52; the glossary renders reader values only; the capabilities lens renders recipe 52; the architecture lens renders recipes 17 and 43; the tests lens renders every recipe 34 answer, recipe 44, and recipe 45 given run records; a Spec page renders its recipe 21, 30 and 34 answers, its own space from recipe 44, the recipe 51 rows that cite its entries, the recipe 45 files whose `specs` hold its id, and its own row of recipe 35's whole-corpus answer; a Pack page renders the totals of its recipe 29 answer and, given a base graph, its own recipe 35 answer; a slice page renders its Pack's recipe 54 answer; the roadmap page renders recipe 53 and each roadmap's recipe 55 memo; the registers render recipes 20, 31, 24 beside recipe 51's rows, and 33; the owner queue renders recipe 46; the diff page renders recipe 35's whole-corpus answer; the runs page renders recipe 45; an export renders the values of the pages it holds.

design.recipeEvaluations · changed

Base
a build evaluates each of these once, with no parameter unless one is named: recipes 17, 20, 24, 31, 33, 43, 44, 46 and 51; recipe 29 with `{ pack: id }` for every Pack; recipe 21 with `{ spec: id }` and recipe 30 with `{ specs: [id] }` for every Spec; recipe 34 with `{ spec: id }` for every Spec that is not an example, Specs in no Pack included; given a base graph, recipe 35 with `{ base, detail: true }`, and with `{ base, pack: id, detail: true }` for every Pack; given run records, recipe 45 with `{ runs }`.
Now
a build evaluates each of these once, with no parameter unless one is named: recipes 17, 20, 24, 31, 33, 43, 44, 46, 51 and 53; recipe 52 with `{ detail: true }`; recipe 29 with `{ pack: id }` and recipe 54 with `{ pack: id, detail: true }` for every Pack; recipe 55 with `{ pack: id }` for every Pack whose manifest states `order: priority`; recipe 21 with `{ spec: id }` and recipe 30 with `{ specs: [id] }` for every Spec; recipe 34 with `{ spec: id }` for every Spec that is not an example, Specs in no Pack included; given a base graph, recipe 35 with `{ base, detail: true }`, and with `{ base, pack: id, detail: true }` for every Pack; given run records, recipe 45 with `{ runs }`.

narrative · changed

Base
The lenses, the registers, the owner queue, the diff and runs pages and the panels of a Spec page show recipe answers. Each takes its answer from the recipe's shipped body, evaluated over the graph the build derived, so a page and `sdp q` give one answer. The two Design entries name every evaluation a build runs and which page reads each answer, so a builder and a test author read one list.
Now
The lenses, the registers, the owner queue, the slice and roadmap pages, the diff and runs pages and the panels of a Spec page show recipe answers. Each takes its answer from the recipe's shipped body, evaluated over the graph the build derived, so a page and `sdp q` give one answer. The two Design entries name every evaluation a build runs and which page reads each answer, so a builder and a test author read one list.

A diagram is laid out from graph values into SVG with a text equivalent

spec:consumers.spec-studio.diagrams

design.boxTargets · moved

Now
a component's box links to its detail on the architecture lens, a planned component's to its component design's Spec page, a context's or layer's folded box to its section on the same page, a Spec's to its page, and a folded relation group's to the Spec page's relations.

design.cellWrap · changed

Base
a grid cell or a band places at most `6` boxes on one line and wraps onto the next.
Now
Wrap a cell's boxes within the fixed logical width budget instead of a fixed box count; retain context columns with local scrolling when they exceed it. Layout reads no browser or font measurement.

design.density · added

Now
For requirement, trace, capability and dependency drawings, trigger the existing folds before the hard bound when deterministic layout height exceeds `2000` logical pixels. Measure height from the box and lane layout before routing, using the same label metrics and width budget as the drawing. A fold triggered by these limits must strictly lower that height and hold at least two boxes, keeping the same scope, claims and complete text equivalent. If no lawful fold fits the height budget, omit the SVG and open the text equivalent.

design.diagramElement · changed

Base
`sdp-diagram` with `subject`, the Spec, Pack, component or context id the diagram is rooted at, or `architecture`, wrapping one `figure` that holds the caption, a legend `Arrows: <relation>.` when all edges share one relation, followed by `Dashed arrows: plans to use.` when that use relation includes planned uses, the SVG and its text equivalent; on upgrade it adds `Zoom in`, `Zoom out` and `Reset` buttons and handles drag, a wheel turned with Control or Command held, and a two-finger pinch.
Now
`sdp-diagram` with `subject`, the rooted Spec, Pack, component or context id, or `architecture`, wraps one figure containing its caption and legend, any build-written scroll instruction, a keyboard-focusable named `.diagram-scroll` region containing the SVG, its text equivalent and, when offered, its closed Mermaid-source disclosure with labelled read-only textarea and `sdp-copy`. Caption, legend and source stay outside the scroll region. On upgrade it adds Zoom in, Zoom out and Reset buttons and handles drag, a wheel with Control or Command held, and pinch; it adds no layout or copy behavior.

design.edgeKinds · moved

Now
`uses` for a realized use, drawn solid; `plans to use` for a use a component design states, drawn dashed; on a trace graph the relation's type; an arrow points from the unit or Spec that uses or declares to the one it names.

design.edgeRouting · added

Now
Reserve boxes and labels as obstacles, route orthogonally with distinct ports and lanes eight pixels apart, and never share a collinear segment or overlap labels. Crossings are permitted only at free points. Keep exact relations and claims through the words-beside-style rule. A deterministic finite routing failure omits the SVG, opens its text equivalent and explains the failure; the build owns search mechanics.

design.elementIds · moved

Now
a diagram's text equivalent has the id `diagram.<subject>.text` and its arrow has the id `diagram.<subject>.arrow`. A page that draws a second view of one subject inserts that view's name before `text` or `arrow`, so the Spec page's realization drawing uses `diagram.<subject>.realization.text` and `diagram.<subject>.realization.arrow`; its trace graph keeps the unqualified ids. Every id is unique on its page.

design.labelMetrics · changed

Base
a label line holds at most `30` characters, an id longer than that wraps after a dot or a colon and then after a hyphen, a character advances `7.5` pixels at the 12 pixel monospace label size, and a box is as wide as its longest line plus padding.
Now
A title or recorded label leads at fourteen pixels, followed by the displayed id at twelve pixels and remaining words such as a component's member count. Title lines hold at most `28` characters and id lines `30`, with an eight-pixel character advance. Wrap at spaces or id punctuation, then by code point, and calculate box height from every line.

design.omittedDrawing · changed

Base
a drawing over the bound keeps its `figure` and caption, holds the sentence `Shown as text: this drawing exceeds the bound of <b> boxes and <e> edges.`, with the bound's two numbers, where the SVG would be, and writes its text equivalent open.
Now
A drawing over the bound keeps its figure and caption, writes `Shown as text: this drawing exceeds the bound of <b> boxes and <e> edges.`, and opens its text equivalent. A routing failure instead writes `Shown as text: a distinct route or label could not be placed within the routing budget.` and opens the same complete box-and-edge reading. A drawing still above the height budget after lawful folds instead writes `Shown as text: this drawing exceeds the height budget of <h> pixels after folding.` and opens its text equivalent. No omission offers partial Mermaid source.

design.shortId · added

Now
Drop the namespace and leading dotted segments every id in the figure shares, marking elision with `…`; keep more segments on collisions. A displayed id carries a namespace only when shown in full. Full ids remain in link titles, the text equivalent and source.

design.svgMarkup · changed

Base
the `svg` carries `role="img"`, a `title`, `aria-describedby` naming its text equivalent and a `viewBox` of its own size; a box is a `g` with class `node` and `data-id`, plus `data-planned="true"` or `data-folded="true"` when it is planned or folded, holding a link to the box's target; an edge is a `g` with class `edge`, `data-from`, `data-to` and `data-kind`; a band is a `g` with class `band` and `data-label`, a column a `g` with class `lane` and `data-label`, each also drawing its label as text.
Now
the `svg` carries `role="img"`, a `title`, `aria-describedby` naming its text equivalent and a `viewBox` of its own size; a box is a `g` with class `node` and `data-id`, plus `data-planned="true"` or `data-folded="true"` when it is planned or folded, holding a link to the box's target; an edge is a `g` with class `edge`, `data-from`, `data-to` and `data-kind`; a band is a `g` with class `band` and `data-label`, a column a `g` with class `lane` and `data-label`, each also drawing its label as text. An edge also carries `data-claim` and a stable `data-edge-key` when its label uses a legend key; route and label coordinates are presentation values and mint no graph edge.

design.textEquivalent · changed

Base
a `details` element closed by default, summary `The diagram as text`, holding one `li` per box, `<id>: <words>`, and then one `li` per edge, `<from> <kind> <to>`, followed by `(<n> unit edges)` when the edge aggregates more than one.
Now
a `details` element closed by default, summary `The diagram as text`, holding one `li` per box, `<id>: <words>`, followed by `· folded members: <ids>` when folded identities are present, and then one `li` per edge, `<from> <kind> <to>`, followed by `· <claim>` when present, `(<n> unit edges)` when the edge aggregates more than one, and `— <reason>` when present.

design.widthBudget · added

Now
`880` logical pixels for a band or grid, band labels included above their band; `264` per context cell when several contexts share a grid, the full band budget when only one context is shown, and `24` between boxes. Routing gutters may widen the SVG to preserve distinct lanes. A drawing wider than `880` scrolls inside its figure and receives the build-written instruction `Scroll horizontally to read the whole drawing.`

narrative · changed

Base
The Studio draws four diagrams: the architecture lens's components by context and layer, one component's members and what they use, one Spec's relations, and on a Spec page the code that realizes it. Each is laid out in the engine when the page set is built, so a page draws it with no script and the same graph draws the same bytes. Words carry every reading the drawing shows: bands and columns are labelled, a planned or folded box says so, and a text equivalent after the drawing states every box and edge.
Now
Every Studio diagram is laid out in the engine when the page set is built, so a page draws it with no script and the same inputs draw the same bytes. The architecture grid, component members and one-hop trace retain their readings; the Spec page's requirement drawing replaces realization, and other pages name their supplied drawing answers. Words carry every reading the picture shows, and its text equivalent states every box and edge.

rule.layoutInputs · changed

Base

A layout reads only the diagram's boxes, each with its id and its words, and its edges, each with its two ends and its kind, taken from the reader values and recipe answers its page names; it reads no font, file, clock or random value, measures text by character count, and writes whole-pixel coordinates.

Rule

Now

A layout reads only the boxes, each with its id, words and supplied grouping, and edges, each with its two ends, exact kind and claim, optional reason and aggregation count, taken from the reader values and recipe answers its page names; it reads no font, file, clock or random value, measures text by character count and writes whole-pixel coordinates. Depth, reach and component resolution belong to those answers, never layout.

Rule

rule.noFoldBelowComponent · changed

Base

A member or realization diagram over the bound writes no SVG; its text equivalent lists every member or unit and every use or realization edge, and then says the drawing was omitted because it exceeds the bound.

Rule

Now

A member diagram over the bound writes no SVG; its text equivalent lists every member and every use edge, and then says the drawing was omitted because it exceeds the bound.

Rule

rule.panZoomOnly · changed

Base

The diagram element adds only pan, zoom and pinch, by rewriting the SVG's view box; it never moves a box or an edge. With or without script the SVG is never wider than its container or larger than its own size on first view at every viewport width; pan and zoom enlarge it for reading.

Rule

Now

The diagram element adds only pan, zoom and pinch by changing the SVG's view box; it never moves a box or edge. At viewport widths of at least 720 CSS pixels the SVG starts at natural size inside a keyboard-accessible scroll region, with overflow inside the figure. Below that width the responsive contract fits the same drawing to the screen. Reset restores the initial view and scroll position. Without script the drawing, scrolling, links and text equivalent remain usable. Print fits the drawing to paper and exposes its text equivalent.

Rule

rule.realizationBands · removed

Base

A realization diagram draws the units that satisfy the Spec, then their components, then what those units use, in three bands.

Rule

The diff page shows what changed in the design since a base graph

spec:consumers.spec-studio.diff-page

rule.diffSections · changed

Base

The page renders recipe 35's answer with `detail: true` over the whole corpus, in sections in this order: the totals as sentences; the Specs added, linked; the Specs removed, as their ids in text, since no page holds them; the Specs changed, each linked, with each changed part, its change in words, and for a changed value the base value and the built value as readable text blocks or lists, one above the other, never a raw JSON array; keyed changes list in the head's rule and flow order, each as one line with the entry's text rendered as on its Spec page beside its old and new address or `none`; the Packs whose membership or order changed; the bindings changed, kept apart and headed as derived from anchors; and the diagnostics.

Rule

Now

The page renders recipe 35's answer with `detail: true` over the whole corpus, in sections in this order: the totals as sentences; the Specs added, linked; the Specs removed, as their ids in text, since no page holds them; the Specs changed, each linked, with each changed part, its change in words, and for a changed value the base value and the built value as readable text blocks or lists, one above the other, never a raw JSON array; keyed changes list in the head's rule and flow order, each as one line with the entry's text rendered as on its Spec page beside its old and new address or `none`; the Packs whose membership, order or order meaning changed, an added Pack whose order is priority read as `added as a roadmap`, its added members in manifest order, a removed Pack whose order was priority read as `removed as a roadmap`, and a known change to priority read as `now a roadmap` or from priority as `no longer a roadmap`, stating the before and after order values for other changes of meaning; the bindings changed, kept apart and headed as derived from anchors; and the diagnostics.

Rule

rule.packChangeNotes · changed

Base

Given a base graph, each Pack page adds a `Changed since the base` section after its maturity map, from recipe 35's answer for that Pack, listing its changed and added members, linked, and its own membership change; a member whose only changes are keying is marked `keyed only`.

Rule

Now

Given a base graph, each Pack page adds a `Changed since the base` section after its maturity map, from recipe 35's answer for that Pack, listing its changed and added members, linked, and its own membership change, with the same roadmap and order-meaning wording as the diff page; a member whose only changes are keying is marked `keyed only`.

Rule

A Pack exports as one file, and every page prints as a document

spec:consumers.spec-studio.export

design.expanderPrint · changed

Base
`sdp-expander`, before the page prints, opens every `details` inside it, and after printing restores each one's state.
Now
`sdp-expander`, before the page prints, opens every `details` inside it except a drawing's or the maturity map's Mermaid source, which keeps the state the reader left, and after printing restores each one's state.

rule.printAsDocument · changed

Base

Every page prints as a document: the print style hides the navigation, the rail, the search field, the composing panel and every control, gives the canvas the page's width, prints a diagram whole at that width, and prints every disclosure open, the expander opening each before printing and restoring it after.

Rule

Now

Every page prints as a document: the print style hides the navigation, the rail, the search field, the composing panel and every control, gives the canvas the page's width, prints a diagram whole at that width, and prints every disclosure open except Mermaid source, which prints only when the reader opened it, the expander opening each before printing and restoring it after.

Rule

The index says where the corpus stands and narrows every Spec

spec:consumers.spec-studio.index-page

rule.filters · changed

Base

Filters narrow the Specs section by kind, altitude, stated rung, floor reached, implementation binding, verifier binding and Pack; each filter takes one value or any, the filters combine, and the section says how many of its rows it shows. Without script every row shows.

Rule

Now

Filters narrow the Specs section by kind, altitude, stated rung, floor reached, implementation binding, verifier binding, Pack and epic; each filter takes one value or any, the epic filter also takes no epic, the filters combine, and the section says how many of its rows it shows. Without script every row shows.

Rule

Five lenses read the graph as Packs, capabilities, architecture, tests and evidence

spec:consumers.spec-studio.lenses

intent · changed

Base
outcome
Let a person see the graph four ways, by Pack, by architecture, by verification and by evidence, from one top navigation.
Now
outcome
Let a person see the graph five ways, by Pack, by capability, by architecture, by verification and by evidence, from one top navigation.

narrative · changed

Base
Each lens is a page with a Spec of its own, so each builds on the graph it reads today: the Packs, architecture and tests lenses read what the graph records, and the evidence lens reads not tracked until the graph records an observation. This Spec keeps what the four share.
Now
Each lens is a page with a Spec of its own, so each builds on the graph it reads today: the Packs, capabilities, architecture and tests lenses read what the graph records, and the evidence lens reads not tracked until the graph records an observation. This Spec keeps what the five share.

rule.order · changed

Base

The lenses are pages of the page set, reached from the top navigation in the order Packs, architecture, tests, evidence; the index page is the Packs lens and the default landing page.

Rule

Now

The lenses are pages of the page set, reached from the top navigation in the order Packs, capabilities, architecture, tests, evidence; the index page is the Packs lens and the default landing page.

Rule

title · changed

Base
Four lenses read the graph as Packs, architecture, tests and evidence
Now
Five lenses read the graph as Packs, capabilities, architecture, tests and evidence

ui.lensPages · changed

Base
`index.html` for the Packs lens, `architecture.html`, `tests.html` and `evidence.html`, each opening with its name and one sentence saying what it reads.
Now
`index.html` for the Packs lens, `capabilities.html` for the capabilities lens, `architecture.html`, `tests.html` and `evidence.html`, each opening with its name and one sentence saying what it reads.

The architecture lens draws components by context and layer, the planned beside the built

spec:consumers.spec-studio.lenses.architecture

rule.usesTable · added

Now

Beside the architecture drawing comes the component uses table, read from recipe 17's component rows and their counts of unit `uses` edges: one row per realized component as the user and one column per realized component as the used. A nonzero cell holds the count of anchored unit `uses` edges behind the pair and links to that use in the row component's detail; a zero cell between two components shows `·`, with `no anchored use recorded` as hidden text and the legend `· means no anchored use recorded`, and the cell where a component meets itself stays empty. Planned uses, unresolved endpoints and uses within one component stay in their own readings and never enter the table. The table is not a drawing, and it reads in full without script and in print.

Rule

ui.architecturePage · changed

Base
in order, the page title `Architecture`, the summary sentences, the architecture diagram or its fold with one section per context, the `Designed, not built` section, the component details in id order, and the `Unresolved structure` section when it has rows.
Now
in order, the page title `Architecture`, the summary sentences, the architecture diagram or its fold with one section per context, the component uses table, the `Designed, not built` section, the component details in id order, and the `Unresolved structure` section when it has rows.

ui.componentDetail · changed

Base
a heading with the component's id as code and its label, a line with its layer, context and role in words, its file and line with a copy action, then lists headed Members, Uses, Used by, Satisfies and References, an empty list reading None, then the member diagram.
Now
a heading with the component's id as code and its label, a line with its layer, context and role in words, its source binding apart from its members, then Members grouped by recorded role, Uses with supporting unit edges at the table's fragment targets, Used by, any design differences, Satisfies and References, an empty list reading None, then the member diagram.

ui.designedNotBuilt · moved

Now
a table with one row per unrealized design in Spec id order: the component design's Spec, linked; the planned component's id as code; its planned context, layer and role, or `not stated`; the components it plans to use; and whether its component anchor exists without satisfying it; a design whose value recipe 43 cannot read adds a row naming the design, the key and the unreadable value.

ui.usesTable · added

Now
a table captioned `Which components use which` in a named, keyboard-focusable scroll region, one row header and one column header per realized component, both in one order: by layer from `edge` to `infrastructure`, unlayered components last, then by id; each header names the component's label with its id as code.

The Packs lens groups every Spec by the Packs that hold it

spec:consumers.spec-studio.lenses.packs

narrative · changed

Base
A capability is read as a Pack, or as a projection over high-altitude behavior Specs that no view draws yet, so the lens groups by Pack and draws no capability tree. The index page holds it, because the Packs are where a reader of a design starts.
Now
Packs collect Specs for review, while the separate Capabilities page reads authored refinement. The index remains the landing page and keeps each Pack's members in authored order.

rule.packGrouping · changed

Base

The Packs lens groups Specs by Pack, each Pack's members in authored order, and draws no capability tree.

Rule

Now

The Packs lens groups Specs by Pack, each Pack's members in authored order. The separate Capabilities page reads refinement; selecting an epic narrows the index's Specs section without changing any Pack.

Rule

Every page of the page set is reached from the top navigation and the index

spec:consumers.spec-studio.navigation

rule.indexRoutes · changed

Base

After its four routes, the index's `Start here` list adds See what the owner can state first, linking the owner queue; See the components by context and layer, linking the architecture lens; and, given a base graph, See what changed since the base, linking the diff page.

Rule

Now

After its four routes, the index's `Start here` list adds See what comes next, linking the roadmap page; See what the owner can state first, linking the owner queue; See the components by context and layer, linking the architecture lens; and, given a base graph, See what changed since the base, linking the diff page.

Rule

rule.topEntries · changed

Base

After the lens entries, the top navigation lists Queue, Questions, Decisions, Declarations, Backlog and Glossary, then Diff when the build was given a base graph and Runs when it was given run records, each linking its page; the search field follows them.

Rule

Now

After the lens entries, the top navigation lists Roadmap, Queue, Questions, Decisions, Declarations, Backlog and Glossary, then Diff when the build was given a base graph and Runs when it was given run records, each linking its page; the search field follows them.

Rule

A Pack page shows the Pack's design as one card per member

spec:consumers.spec-studio.pack-page

rule.header · changed

Base

The page opens with the Pack's title, its id and its carrier file as text with a copy action, then the summary; the framing follows as prose under the heading Framing, with the vocabulary references, linked.

Rule

Now

The page opens with the Pack's title, its id and its carrier file as text with a copy action, and a link to the Pack's slice page, then the summary; the framing follows as prose under the heading Framing, with the vocabulary references, linked.

Rule

rule.summary · changed

Base

The summary states each Pack total in one sentence that opens with its count, never as a table: the members and the unresolved ones, the members held below their stated next rung and those waiting only for their author, the design entries and pinned declarations, the open and blocking questions, the members with an implementation binding and with a design reference, and the boundary in each direction.

Rule

Now

The summary states each Pack total in one sentence that opens with its count, never as a table: the members and the unresolved ones, the members held below their stated next rung and those waiting only for their author, the design entries and pinned declarations, the open and blocking questions, the members with an implementation binding and with a design reference, and the boundary in each direction. The member sentence says `in priority order` when the Pack states `order: priority`, otherwise `in authored reading order`.

Rule

ui.headerBlock · changed

Base
the title as the page heading; below it the id and the carrier file, each with a copy action; then the summary; then the framing under a `Framing` heading, and the vocabulary references.
Now
the title as the page heading; below it the id and the carrier file, each with a copy action, and the link `Read this Pack as one design` to its slice page; then the summary; then the framing under a `Framing` heading, and the vocabulary references.

A Pack page's maturity map places every member by its stated rung and its floor

spec:consumers.spec-studio.pack-page.maturity-map

narrative · changed

Base
A Pack of many members takes a reviewer a long scroll through its cards before they know where the design stands. The maturity map answers that first: one table, a row per stated rung and a column per floor reached, each member a short card in its cell. A member right of its row's own rung waits only for a statement the floor already allows; a member left of it states more than its floor holds.
Now
A Pack's maturity map shows its distribution before its member lists. Equal-sized cells place each resolved member by stated readiness and floor reached. Populated cells show exact counts and member marks; faint empty cells show no number. The count table and ordered lists retain the reading in text.

relation.dependsOn:spec:consumers.spec-studio.diagram-kinds.maturity-picture · added

Now
from
spec:consumers.spec-studio.pack-page.maturity-map
type
dependsOn
to
spec:consumers.spec-studio.diagram-kinds.maturity-picture
claim
declared
reason
the map is drawn as the picture defines

rule.maturityMap · changed

Base

After the summary, the maturity map places each resolved member by its stated rung and the floor it reaches: one row per stated rung, idea to ready, and one column per floor, none to ready, each filled cell listing its members in authored order as short cards linked to their member cards, with its count, and an empty cell showing `—` alone; the table caption explains in words where the floor sits above the statement and where the statement sits above the floor.

Rule

Now

After the summary, show the categorical grid and full member lists defined by spec:consumers.spec-studio.diagram-kinds.maturity-picture. Every resolved member belongs to one stated-rung and floor cell; unresolved members are named apart. Populated cells link to their built lists, whose members stay in authored order.

Rule

ui.maturityMap · changed

Base
an `sdp-maturity-map` holding a table under a `Maturity map` heading, rows headed `stated idea` to `stated ready`, columns headed `floor none` to `floor ready`, each filled cell its count and its members as short cards, an empty cell reading `—` alone, and the axis explanation in the table's caption, never inside a header cell: right of the matching rung the floor is above the statement and already allows it; left of it the statement is above the floor.
Now
An `sdp-maturity-map` holds the static SVG grid, caption and accessible count table, followed by populated cells' full member lists in disclosures that print open. Equal-sized cells have explicit axes; the legend names matches, floor above statement and statement above floor once. The diagonal has an outline, empty cells are faint, and populated cells carry exact counts and member marks, up to `100` marks and solid fill above that. Every member links to its card.

A few custom elements filter, search, open and copy on a rendered page

spec:consumers.spec-studio.page-elements

design.copy · changed

Base
`sdp-copy` with `text`: a `Copy` button whose accessible name includes the text; it copies the text to the clipboard and says `Copied`, and where the clipboard is unavailable it selects the text so the person can copy it.
Now
`sdp-copy` with `text`, or with `for` naming a text area on its page: a `Copy` button whose accessible name includes the text or the text area's label; it copies that text and says `Copied`, and where the clipboard is unavailable it selects the text so the person can copy it.

design.filter · changed

Base
`sdp-filter`: wraps a hidden form of labelled `select` elements, each with `data-filter="<name>"` and an `any` option, and the rows marked `data-row`. On upgrade it shows the form, hides each row whose `data-<name>` differs from a chosen value, and writes `<shown> of <total> shown` in its `output` element; a row whose attribute holds several space-separated values, such as its Packs, matches when one of them equals the choice.
Now
`sdp-filter`: wraps a hidden form of labelled `select` elements, each with `data-filter="<name>"` and an `any` option, and the rows marked `data-row`. On upgrade it shows the form, hides each row whose `data-<name>` differs from a chosen value, and writes `<shown> of <total> shown` in its `output` element; a row whose attribute holds several space-separated values, such as its Packs, matches when one of them equals the choice. When a followed link or a fragment change targets an element inside a row it hides, it returns every control to `any`, adds to its output that the filter was cleared to show that target, and scrolls the target into view.

sdp studio publishes the Studio as one page set

spec:consumers.spec-studio.publisher

rule.pageSet · changed

Base

The page set holds `index.html`, `search.html`, one `packs/<name>.html` per Pack, one `specs/<name>.html` per Spec, and `assets/studio.css` and `assets/studio.js`. `<name>` is the id after its namespace, with each uppercase ASCII letter written as `_` and its lowercase, so no two pages collide on a file system that ignores case.

Rule

Now

The page set holds `index.html`, `search.html`, one `packs/<name>.html` and one `slices/<name>.html` per Pack, one `specs/<name>.html` per Spec, and `assets/studio.css` and `assets/studio.js`. `<name>` is the id after its namespace, with each uppercase ASCII letter written as `_` and its lowercase, so no two pages collide on a file system that ignores case.

Rule

A Spec page shows one Spec in collapsible panels, in a fixed order

spec:consumers.spec-studio.spec-page

relation.dependsOn:spec:consumers.spec-studio.diagram-kinds.requirement-trace · added

Now
from
spec:consumers.spec-studio.spec-page
type
dependsOn
to
spec:consumers.spec-studio.diagram-kinds.requirement-trace
claim
declared
reason
the Design view reads the selected set and claims the requirement drawing defines

relation.dependsOn:spec:consumers.spec-studio.diagrams · changed

Base
from
spec:consumers.spec-studio.spec-page
type
dependsOn
to
spec:consumers.spec-studio.diagrams
claim
declared
reason
the design view and the impact panel draw the realization diagram and the trace graph
Now
from
spec:consumers.spec-studio.spec-page
type
dependsOn
to
spec:consumers.spec-studio.diagrams
claim
declared
reason
the design view and impact panel draw requirement traceability and the one-hop trace graph

rule.designView · changed

Base

The Design view panel draws the realization diagram of the units that satisfy the Spec, their components and what they use, and then lists the decision records the Spec names through `decidedBy`, each with its title linked and its decision text inline.

Rule

Now

The Design view panel draws the requirement drawing defined by spec:consumers.spec-studio.diagram-kinds.requirement-trace in place of realization, then lists the decision records the Spec names through decidedBy with linked titles and decision text inline. The Runtime panel retains the implementation anchors' components and uses.

Rule

ui.designViewPanel · changed

Base
the realization diagram, drawn as SVG whose nodes show their id, source file and line as the source-text rule states, then the decision records with their decision text; the panel's element id is `panel.design-view`.
Now
The requirement drawing, with the text equivalent naming each binding's id, source file and line under the source-text rule, then the decision records and their decision text; its element id remains `panel.design-view`.

The upgrade kit shows a corpus what it could adopt

spec:consumers.upgrade-kit

design.guideSections · changed

Base
in this order: re-pin the package and check `sdp --version`; measure the corpus with capability adoption (recipe 47); key the rules with the rule-key proposal (recipe 48), check the proposal with the proposal check (recipe 38) and apply it through an agent's edit; for every capability in recipe 47's answer, one subsection citing its `carriedBy` Spec and recipe 47 as the measurement, naming a further recipe only when the subsection teaches a distinct next action with it and otherwise sending the reader to the carrying Spec; move rules files onto shipped recipes, recipes 25, 26, 42, 50 and 51 and the `recipes` binding; read large Packs in parts and order the waiting statements, recipes 36 and 46; publish every root with `sdp generate`; and pass a recipe's subject as `--params` data, the recipe-caller guidance the README carries.
Now
in this order: re-pin the package and check `sdp --version`; measure the corpus with capability adoption (recipe 47); organize features in epics, reading the capability map (recipe 52) and citing `spec:consumers.capability-map`; `Model upcoming work in the graph; keep review history in git and pull requests`, a roadmap Pack read with recipes 53 and 55 and intended design proposed as a change proposal checked by recipe 38, citing `spec:consumers.roadmap`, with the guidance `Unresolved intended design lives in open questions. Review disposition and acceptance remain in git and the pull request; neither becomes a graph field.`; key the rules with the rule-key proposal (recipe 48), check the proposal with the proposal check (recipe 38) and apply it through an agent's edit; for every capability in recipe 47's answer, one subsection citing its `carriedBy` Spec and recipe 47 as the measurement, naming a further recipe only when the subsection teaches a distinct next action with it and otherwise sending the reader to the carrying Spec; move rules files onto shipped recipes, recipes 25, 26, 42, 50 and 51 and the `recipes` binding; read large Packs in parts and order the waiting statements, recipes 36 and 46; publish every root with `sdp generate`; and pass a recipe's subject as `--params` data, the recipe-caller guidance the README carries.

relation.dependsOn:spec:consumers.capability-map · added

Now
from
spec:consumers.upgrade-kit
type
dependsOn
to
spec:consumers.capability-map
claim
declared
reason
the guide teaches epic organization through the capability map

relation.dependsOn:spec:consumers.roadmap · added

Now
from
spec:consumers.upgrade-kit
type
dependsOn
to
spec:consumers.roadmap
claim
declared
reason
the guide teaches advisory priority and the roadmap memo as planning records

Architectural significance is annotated where it is realized

spec:decisions.architectural-annotation

decision · changed

Base
context
Two rulings carried the structural half of the anchor: structural anchors confer nothing (MD-30) admitted `component` and `uses` as the only structural fields, and architectural significance rides existing primitives (MD-34) refused a vocabulary beyond them and gave up CodeNode-grain roles. Both cited gen 1's shrinking tag vocabulary as the failure of an open structural vocabulary. The annotation scout under `docs/lineage/` corrects that account: the reduction was a cleanup of gen 1's formal vocabulary that never shipped as a runtime registry, and what drifted there was duplicate identities, scan scope, and syntax handling. The original design declared a Component with `layer` and `bounded_context` (`docs/lineage/v0-design/03-graph-metamodel.md` §2.5), and gen 1 carried a role on each annotated unit. The owner's direction was to bring back the value of annotating architecturally significant units and their relationships in code.
decision
Architectural significance is annotated on the anchor of the unit that realizes it. A code anchor may carry `role`, the architectural pattern the unit plays; a `component:` anchor may additionally carry `layer`, one of `edge`, `application`, `domain`, `adapter`, or `infrastructure`, and `context`, its bounded context. The `component:` anchor is anchored architecture: it is the declared component, and there is no separate architecture file, because the anchor sits where the component is realized. It is not the original design's declared Component that could exist before code; an unrealized component lives in Specs and never as an invented CodeNode. A role is a free, corpus-owned vocabulary whose taxonomy the census renders with counts from the graph; `service`, `decider`, `projection`, `read-model`, `codec`, `contract`, `barrel`, and `utility` are the lineage set, not a closed list. `layer` is a closed set, and a value outside it is an envelope error; `layer` or `context` on a non-component anchor is an envelope error. All three attributes are optional, and omission is lawful.
rationale
  • Hard to reverse: the anchor envelope and the CodeNode fields are contracts for the extractor, the census, the Design Review, and every adopter's anchors. Surprising without context: the replaced rulings refused exactly these attributes on the strength of a drift account the scout found inaccurate, so the reversal reads as a repeat of gen 1 until the correction is on the table. Real trade-off: a free role vocabulary can drift across a corpus and no validator will say so; in exchange, the role, layer, and context live on the one anchor at the one site, and the census taxonomy makes drift visible without a registry.
  • This record replaced both rulings, and both records were deleted because nothing in them still needed its own text; they read in git at `90c75dd`. What survives from them is restated here as consequences: the `component` and `uses` semantics and their validation rules, structural non-conferral, no inference from imports, no status or readiness on code, significance never selects a Spec kind, no `pattern:` namespace, and the engine significance criterion.
alternatives
  • A separate architecture file declaring components, layers, and contexts was refused: it is a second place for the component to drift from the code that realizes it.
  • A closed role enum was refused: the corpus owns its architecture vocabulary, and a closed set would be the Protocol's architecture, not the adopter's.
  • A corpus-declared role vocabulary checked by a validator was refused: it is an authored registry, and the check is a content-quality check. The token grammar and the census taxonomy with its units are the whole check; a corpus that wants a list lints recipe 28 in its own gate.
  • Deriving role, layer, or context from file paths or imports was refused: it turns incidental layout into authoritative architecture and misclassifies an inferred observation as an anchored claim.
  • Adding `implements` was refused again: it would duplicate `satisfies` for contract-kind targets and make code-to-Spec realization ambiguous.
consequences
  • `component?: ComponentAnchorId` and `uses?: readonly CodeAnchorId[]` stay closed graph-ID references deriving only anchored `memberOf` and `uses` edges; neither accepts a free string or an enum detached from graph identity, and there are no per-namespace sibling builders.
  • Every `component` and `uses` target exists as a CodeNode, and a dangling graph id is an error.
  • Membership is one level: a `memberOf` edge runs only from an `impl:` or `api:` CodeNode to a `component:` CodeNode, each source has at most one component, and a `component:` node is never itself a member.
  • A `uses` edge runs between CodeNode endpoints in the `impl:`, `api:`, or `component:` namespace; a present `uses` is non-empty and unique, structural edges are unique, and structural self-reference is an error.
  • Multi-node `uses` cycles remain authored data for the census, never findings; validators infer no transitive edge and reject no cycle.
  • A malformed or non-static structural field, an unknown `layer`, or `layer` or `context` on a non-component anchor refuses the whole anchor at reification rather than yielding a partial declaration; the envelope stays closed.
  • Structural edges and the three attributes confer no intent, delivery fact, or readiness effect; `satisfies` stays the only code-to-Spec realization slot and no `implements` field is admitted.
  • Architecture is never inferred from imports as anchored or declared structure; an inferred structural layer, if one arrives, stays advisory under its own claim, and derivation adds no fourth claim.
  • No status, readiness, intent, behavior, or verification is carried on code; role, layer, and context describe what the unit is, never where it stands.
  • The Protocol ships no anchor-required lint; an optional corpus lint for unanchored code stays warn-level, and the absence of an anchor is evidence, never a workflow gate.
  • Architectural significance never selects a Spec kind; the Spec states the kind of truth it carries, and relationships among such Specs are the existing relations, with `dependsOn` reserved for genuine semantic need, `supersedes` for actual replacement, and scheduling-flavored edges refused (planning truths live in ruled graph homes, MD-33).
  • Negative architecture constraints, a layer that must not use another, stay declared intent in a Spec, never a finding of the Protocol's validators; a corpus that wants one enforced checks its declared `uses`, `layer`, and `context` in its own gate.
  • No `pattern` term, kind, or `pattern:` namespace is admitted; a role is an attribute of a CodeNode, not a node; grouping is derived from id families and the component graph, not new Packs.
  • The engine significance criterion stays exported public surface or cross-component reach; code never satisfies a decision Spec directly (the binding-grain ruling, MD-37), and an anchor is never pointed at an unfinished Spec to manufacture coverage.
  • `role` and `context` values are one lowercase kebab token matching `^[a-z][a-z0-9-]*$`, with no normalization, so `read-model`, `readModel`, and `Read Model` cannot coexist as three categories; a value outside the token grammar is an envelope error.
  • The census derives its structural rows and taxonomy from graph edges and runtime constants on every run; it re-derives no validation finding, owns no hand-kept taxonomy, and may group `uses` cycles as data.
  • Code reaches a decision that shapes it through the `satisfies` to `decidedBy` join, and a unit may name a decision it follows directly through `references`.
  • The census links each role, layer, and context value to the units that carry it, so an owner can reconcile two spellings of one category by editing the anchors; nothing forces a label, and an unlabelled unit does not populate the taxonomy.
  • The five layers, one line each: `edge` is the transport and presentation boundary; `application` is use cases and orchestration; `domain` is the model and its rules; `adapter` is the implementations of ports toward external systems; `infrastructure` is runtime, persistence, and platform plumbing.
  • A package may hold several layers or several contexts; the package-to-component mapping is reviewed, and one component per package is a choice, never a rule.
  • Retained limitation: there is no independently declared Component; a component that no code realizes yet is a Spec, and the graph holds no CodeNode for it until an anchor exists.
  • The census renders role, layer, context, and `references` beside its structural edges, with explicit empty states, and the Design Review's binding rows show role, layer and context; these renderings narrow the shipped projections freeze, while its remaining scope stays in force.
  • Anchors are curated, never a coverage quota; an identity has one owner; a realizing unit documents its local how, never a paraphrase of the Spec's what or why.
Now
context
Two rulings carried the structural half of the anchor: structural anchors confer nothing (MD-30) admitted `component` and `uses` as the only structural fields, and architectural significance rides existing primitives (MD-34) refused a vocabulary beyond them and gave up CodeNode-grain roles. Both cited gen 1's shrinking tag vocabulary as the failure of an open structural vocabulary. The annotation scout under `docs/lineage/` corrects that account: the reduction was a cleanup of gen 1's formal vocabulary that never shipped as a runtime registry, and what drifted there was duplicate identities, scan scope, and syntax handling. The original design declared a Component with `layer` and `bounded_context` (`docs/lineage/v0-design/03-graph-metamodel.md` §2.5), and gen 1 carried a role on each annotated unit. The owner's direction was to bring back the value of annotating architecturally significant units and their relationships in code.
decision
Architectural significance is annotated on the anchor of the unit that realizes it. A code anchor may carry `role`, the architectural pattern the unit plays; a `component:` anchor may additionally carry `layer`, one of `edge`, `application`, `domain`, `adapter`, or `infrastructure`, and `context`, its bounded context. The `component:` anchor is anchored architecture: it is the declared component, and there is no separate architecture file, because the anchor sits where the component is realized. It is not the original design's declared Component that could exist before code; an unrealized component lives in Specs and never as an invented CodeNode. A role is a free, corpus-owned vocabulary whose taxonomy the census renders with counts from the graph; `service`, `decider`, `projection`, `read-model`, `codec`, `contract`, `barrel`, and `utility` are the lineage set, not a closed list. `layer` is a closed set, and a value outside it is an envelope error; `layer` or `context` on a non-component anchor is an envelope error. All three attributes are optional, and omission is lawful.
rationale
  • Hard to reverse: the anchor envelope and the CodeNode fields are contracts for the extractor, the census, the Design Review, and every adopter's anchors. Surprising without context: the replaced rulings refused exactly these attributes on the strength of a drift account the scout found inaccurate, so the reversal reads as a repeat of gen 1 until the correction is on the table. Real trade-off: a free role vocabulary can drift across a corpus and no validator will say so; in exchange, the role, layer, and context live on the one anchor at the one site, and the census taxonomy makes drift visible without a registry.
  • This record replaced both rulings, and both records were deleted because nothing in them still needed its own text; they read in git at `90c75dd`. What survives from them is restated here as consequences: the `component` and `uses` semantics and their validation rules, structural non-conferral, no inference from imports, no status or readiness on code, significance never selects a Spec kind, no `pattern:` namespace, and the engine significance criterion.
consequences
  • `component?: ComponentAnchorId` and `uses?: readonly CodeAnchorId[]` stay closed graph-ID references deriving only anchored `memberOf` and `uses` edges; neither accepts a free string or an enum detached from graph identity, and there are no per-namespace sibling builders.
  • Every `component` and `uses` target exists as a CodeNode, and a dangling graph id is an error.
  • Membership is one level: a `memberOf` edge runs only from an `impl:` or `api:` CodeNode to a `component:` CodeNode, each source has at most one component, and a `component:` node is never itself a member.
  • A `uses` edge runs between CodeNode endpoints in the `impl:`, `api:`, or `component:` namespace; a present `uses` is non-empty and unique, structural edges are unique, and structural self-reference is an error.
  • Multi-node `uses` cycles remain authored data for the census, never findings; validators infer no transitive edge and reject no cycle.
  • A malformed or non-static structural field, an unknown `layer`, or `layer` or `context` on a non-component anchor refuses the whole anchor at reification rather than yielding a partial declaration; the envelope stays closed.
  • Structural edges and the three attributes confer no intent, delivery fact, or readiness effect; `satisfies` stays the only code-to-Spec realization slot and no `implements` field is admitted.
  • Architecture is never inferred from imports as anchored or declared structure; an inferred structural layer, if one arrives, stays advisory under its own claim, and derivation adds no fourth claim.
  • No status, readiness, intent, behavior, or verification is carried on code; role, layer, and context describe what the unit is, never where it stands.
  • The Protocol ships no anchor-required lint; an optional corpus lint for unanchored code stays warn-level, and the absence of an anchor is evidence, never a workflow gate.
  • Architectural significance never selects a Spec kind; the Spec states the kind of truth it carries, and relationships among such Specs are the existing relations, with `dependsOn` reserved for genuine semantic need, `supersedes` for actual replacement, and scheduling-flavored edges refused (planning truths live in ruled graph homes, MD-33).
  • Negative architecture constraints, a layer that must not use another, stay declared intent in a Spec, never a finding of the Protocol's validators; a corpus that wants one enforced checks its declared `uses`, `layer`, and `context` in its own gate.
  • No `pattern` term, kind, or `pattern:` namespace is admitted; a role is an attribute of a CodeNode, not a node; grouping is derived from id families and the component graph, not new Packs.
  • The engine significance criterion requires exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand, as `spec:model.structural-patterns` defines it; export status or import rank alone is insufficient, so the criterion asks for no anchor on every export and changes no validator. Code never satisfies a decision Spec directly (the binding-grain ruling, MD-37), and an anchor is never pointed at an unfinished Spec to manufacture coverage.
  • `role` and `context` values are one lowercase kebab token matching `^[a-z][a-z0-9-]*$`, with no normalization, so `read-model`, `readModel`, and `Read Model` cannot coexist as three categories; a value outside the token grammar is an envelope error.
  • The census derives its structural rows and taxonomy from graph edges and runtime constants on every run; it re-derives no validation finding, owns no hand-kept taxonomy, and may group `uses` cycles as data.
  • Code reaches a decision that shapes it through the `satisfies` to `decidedBy` join, and a unit may name a decision it follows directly through `references`.
  • The census links each role, layer, and context value to the units that carry it, so an owner can reconcile two spellings of one category by editing the anchors; nothing forces a label, and an unlabelled unit does not populate the taxonomy.
  • The five layers, one line each: `edge` is the transport and presentation boundary; `application` is use cases and orchestration; `domain` is the model and its rules; `adapter` is the implementations of ports toward external systems; `infrastructure` is runtime, persistence, and platform plumbing.
  • A package may hold several layers or several contexts; the package-to-component mapping is reviewed, and one component per package is a choice, never a rule.
  • Retained limitation: there is no independently declared Component; a component that no code realizes yet is a Spec, and the graph holds no CodeNode for it until an anchor exists.
  • The census renders role, layer, context, and `references` beside its structural edges, with explicit empty states, and the Design Review's binding rows show role, layer and context; these renderings narrow the shipped projections freeze, while its remaining scope stays in force.
  • Anchors are curated, never a coverage quota; an identity has one owner; a realizing unit documents its local how, never a paraphrase of the Spec's what or why.
alternatives
  • A separate architecture file declaring components, layers, and contexts was refused: it is a second place for the component to drift from the code that realizes it.
  • A closed role enum was refused: the corpus owns its architecture vocabulary, and a closed set would be the Protocol's architecture, not the adopter's.
  • A corpus-declared role vocabulary checked by a validator was refused: it is an authored registry, and the check is a content-quality check. The token grammar and the census taxonomy with its units are the whole check; a corpus that wants a list lints recipe 28 in its own gate.
  • Deriving role, layer, or context from file paths or imports was refused: it turns incidental layout into authoritative architecture and misclassifies an inferred observation as an anchored claim.
  • Adding `implements` was refused again: it would duplicate `satisfies` for contract-kind targets and make code-to-Spec realization ambiguous.

The build pipeline has one ordered flow

spec:extraction.build-pipeline

relation.refines:spec:extraction.derive-graph · added

Now
from
spec:extraction.build-pipeline
type
refines
to
spec:extraction.derive-graph
claim
declared
reason
the build orchestrates derivation and publication of the one graph

relation.refines:spec:protocol.self-hosting · removed

Base
from
spec:extraction.build-pipeline
type
refines
to
spec:protocol.self-hosting
claim
declared

Carrier reification derives the one graph

spec:extraction.derive-graph

altitude · changed

Base
feature
Now
epic

relation.refines:spec:protocol.self-hosting · removed

Base
from
spec:extraction.derive-graph
type
refines
to
spec:protocol.self-hosting
claim
declared

Committed source derives byte-identical output

spec:extraction.determinism

relation.refines:spec:extraction.derive-graph · added

Now
from
spec:extraction.determinism
type
refines
to
spec:extraction.derive-graph
claim
declared
reason
deterministic output constrains the derivation capability

relation.refines:spec:protocol.self-hosting · removed

Base
from
spec:extraction.determinism
type
refines
to
spec:protocol.self-hosting
claim
declared

A bound example runs its contract steps against a fresh world

spec:extraction.example-runner

relation.refines:spec:extraction.executable-examples · added

Now
from
spec:extraction.example-runner
type
refines
to
spec:extraction.executable-examples
claim
declared
reason
step dispatch and failure rendering execute a bound example

The build derives step and space contracts from graph examples

spec:extraction.executable-contracts

relation.refines:spec:extraction.executable-examples · added

Now
from
spec:extraction.executable-contracts
type
refines
to
spec:extraction.executable-examples
claim
declared
reason
typed contracts carry the authored steps and example space into execution

A Pack node keeps its members in authored order

spec:extraction.pack-member-order

behavior.rules[1] · changed

Base

`members` is always present on a Pack node, and an empty manifest list derives `members: []`. The serialized Pack node writes its fields in the order `id`, `nodeType`, `claim`, `title`, `framing`, `file`, `members`, `modelRefs`, omitting an absent optional field.

Rule

Now

`members` is always present on a Pack node, and an empty manifest list derives `members: []`. The serialized Pack node writes its fields in the order `id`, `nodeType`, `claim`, `title`, `framing`, `file`, `members`, `modelRefs`, `order`, omitting an absent optional field.

Rule

relation.decidedBy:spec:decisions.roadmap-priority · added

Now
from
spec:extraction.pack-member-order
type
decidedBy
to
spec:decisions.roadmap-priority
claim
declared

A derived payload carries a schema version its consumer can read

spec:extraction.schema-versioning.declared-version

behavior · changed

Base
examples
  • given
    • a graph derived from the authored spec {specId: "spec:probe.schema-versioning"}
    when
    • the graph payload is serialized
    then
    • the payload declares the schema version {schemaVersion: "0.11.0"}
Now
examples
  • given
    • a graph derived from the authored spec {specId: "spec:probe.schema-versioning"}
    when
    • the graph payload is serialized
    then
    • the payload declares the schema version {schemaVersion: "0.12.0"}

The Protocol models delivery with one enrichable Spec

spec:model.core-model

altitude · changed

Base
feature
Now
epic

relation.refines:spec:protocol.self-hosting · removed

Base
from
spec:model.core-model
type
refines
to
spec:protocol.self-hosting
claim
declared
reason
the self-hosted corpus models itself with this primitive

A Pack is a truth-free review aggregate

spec:model.pack-aggregate

relation.decidedBy:spec:decisions.roadmap-priority · added

Now
from
spec:model.pack-aggregate
type
decidedBy
to
spec:decisions.roadmap-priority
claim
declared

term.priority order · added

Now
The authored member order of a Pack whose manifest states `order: priority`, read as its owner's advisory preference among its members; it confers nothing and sequences nothing.

term.refinement · moved

Now
A truth-bearing parent-child relation, distinct from the cross-cutting Pack aggregate.

Components are designed ahead of their code

spec:model.planned-architecture

relation.refines:spec:model.core-model · added

Now
from
spec:model.planned-architecture
type
refines
to
spec:model.core-model
claim
declared
reason
planned components enrich Specs before code binds them

Architecturally significant units are annotated where they are realized

spec:model.structural-patterns

term.architecturally significant unit · changed

Base
A code unit with exported public surface or cross-component reach that warrants graph-visible structural binding: component membership, a role, and `references` to the designs it answers to. An architectural dependency is declared as `uses`, normally between components; a unit's own `uses` is optional.
Now
A code unit with exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand; export status or import rank alone is insufficient. Ports, shared data shapes, pipeline stages, decision tables, catalogs, layout policies and adapters may qualify. Its anchor records component membership, a role and `references` to the designs it answers to. An architectural dependency is declared as `uses`, normally between components; a unit's own `uses` is optional.

CI run records are joined to verifiers in a view

spec:observation.run-evidence

relation.refines:spec:consumers.projections-model · added

Now
from
spec:observation.run-evidence
type
refines
to
spec:consumers.projections-model
claim
declared
reason
run records inform a view without becoming graph facts

Runtime observations can close the liveness loop

spec:observation.runtime-overlay

relation.refines:spec:extraction.derive-graph · added

Now
from
spec:observation.runtime-overlay
type
refines
to
spec:extraction.derive-graph
claim
declared
reason
an observed fact would be derived beside implemented and has-verifier

relation.refines:spec:protocol.self-hosting · removed

Base
from
spec:observation.runtime-overlay
type
refines
to
spec:protocol.self-hosting
claim
declared

The engine's structural self-binding covers its architecturally significant units

spec:protocol.structural-self-binding

rule.criterion · changed

Base

The engine applies the structural-patterns model's significance criterion: exported public surface or cross-component reach.

Rule

Now

The engine applies the structural-patterns model's significance criterion: exported public surface or cross-component reach whose contract or responsibility a designer or builder must understand; export status or import rank alone is insufficient.

Rule

Declared architecture rules are checked against anchored structure

spec:validation.architecture-constraints

relation.refines:spec:validation.corpus-rules · added

Now
from
spec:validation.architecture-constraints
type
refines
to
spec:validation.corpus-rules
claim
declared
reason
the architecture walk is a corpus-selected rule over anchored structure

Corpus-authored rules run on the one validation path

spec:validation.corpus-rules

relation.refines:spec:consumers.agent-surface · added

Now
from
spec:validation.corpus-rules
type
refines
to
spec:consumers.agent-surface
claim
declared
reason
a corpus scripts the graph through the evaluation sink to report its own findings

Duplicate carrier IDs are excluded loudly

spec:validation.duplicate-ids

relation.refines:spec:protocol.self-hosting · removed

Base
from
spec:validation.duplicate-ids
type
refines
to
spec:protocol.self-hosting
claim
declared

relation.refines:spec:validation.two-check-families · added

Now
from
spec:validation.duplicate-ids
type
refines
to
spec:validation.two-check-families
claim
declared
reason
duplicate identity is a conformance refusal

A corpus checks the register tokens its prose cites

spec:validation.external-registers

relation.refines:spec:validation.corpus-rules · added

Now
from
spec:validation.external-registers
type
refines
to
spec:validation.corpus-rules
claim
declared
reason
external-register checks run as corpus-selected rules

Stated readiness must clear its floor

spec:validation.readiness-floor

relation.refines:spec:protocol.self-hosting · removed

Base
from
spec:validation.readiness-floor
type
refines
to
spec:protocol.self-hosting
claim
declared

relation.refines:spec:validation.two-check-families · added

Now
from
spec:validation.readiness-floor
type
refines
to
spec:validation.two-check-families
claim
declared
reason
the readiness floor checks honesty of the stated rung

Validation separates well-formedness from non-pretending

spec:validation.two-check-families

altitude · changed

Base
feature
Now
epic

relation.refines:spec:protocol.self-hosting · removed

Base
from
spec:validation.two-check-families
type
refines
to
spec:protocol.self-hosting
claim
declared

Packs with membership, member order or order meaning changes

added · pack:roadmap

Members added: spec:protocol.delivery-record-cleanup, spec:consumers.spec-studio.cited-line-text, spec:consumers.spec-studio.register-input, spec:consumers.edit-model

Members removed: None

Member order unchanged.

added as a roadmap

added · pack:roadmaps-and-slices-v1

Members added: spec:protocol.significant-units-review, spec:protocol.role-vocabulary, spec:consumers.spec-studio.lenses.architecture.unit-register, spec:consumers.capability-map, spec:decisions.epics-of-any-kind, spec:protocol.capability-epics, spec:extraction.executable-examples, spec:consumers.spec-studio.capability-map-page, spec:consumers.spec-studio.diagram-kinds, spec:consumers.spec-studio.diagram-kinds.legibility, spec:consumers.spec-studio.diagram-kinds.edge-routing, spec:consumers.spec-studio.diagram-kinds.mermaid-source, spec:consumers.spec-studio.diagram-kinds.dependency, spec:consumers.spec-studio.diagram-kinds.capability-tree, spec:consumers.spec-studio.diagram-kinds.scoped-architecture, spec:consumers.spec-studio.diagram-kinds.maturity-picture, spec:consumers.spec-studio.diagram-kinds.requirement-trace, spec:consumers.design-slice, spec:consumers.design-slice.outside-components, spec:consumers.design-slice.chain, spec:consumers.design-slice.decision-backlink, spec:consumers.design-slice.dependency-cycle, spec:consumers.design-slice.folded-example, spec:consumers.design-slice.independent-example, spec:consumers.design-slice.component-absent, spec:consumers.design-slice.component-unrelated, spec:consumers.design-slice.component-matching, spec:consumers.design-slice.component-differing, spec:consumers.design-slice.component-unreadable, spec:consumers.design-slice.outside-satisfied, spec:consumers.design-slice.outside-unbound, spec:consumers.design-slice.outside-holding, spec:consumers.spec-studio.slice-page, spec:decisions.roadmap-priority, spec:consumers.roadmap, spec:consumers.roadmap.built-work, spec:consumers.roadmap.buildable-part, spec:consumers.roadmap.statement-part, spec:consumers.roadmap.design-part, spec:consumers.roadmap.drifting-part, spec:consumers.roadmap.missing-evidence, spec:consumers.roadmap.blocking-part, spec:consumers.roadmap.outside-parent, spec:consumers.roadmap.statement-order, spec:consumers.spec-studio.roadmap-page, spec:consumers.roadmap.memo, spec:decisions.roadmap-over-plans, spec:protocol.roadmap-replaces-plans, spec:consumers.projections-model.roadmap-views

Members removed: None

Member order unchanged.

changed · pack:self-hosting-v1

Members added: spec:extraction.executable-examples, spec:consumers.spec-studio.lenses.architecture.unit-register, spec:consumers.capability-map, spec:consumers.spec-studio.capability-map-page, spec:consumers.spec-studio.diagram-kinds, spec:consumers.spec-studio.diagram-kinds.legibility, spec:consumers.spec-studio.diagram-kinds.edge-routing, spec:consumers.spec-studio.diagram-kinds.mermaid-source, spec:consumers.spec-studio.diagram-kinds.dependency, spec:consumers.spec-studio.diagram-kinds.capability-tree, spec:consumers.spec-studio.diagram-kinds.scoped-architecture, spec:consumers.spec-studio.diagram-kinds.maturity-picture, spec:consumers.spec-studio.diagram-kinds.requirement-trace, spec:consumers.design-slice, spec:consumers.design-slice.outside-components, spec:consumers.design-slice.chain, spec:consumers.design-slice.decision-backlink, spec:consumers.design-slice.dependency-cycle, spec:consumers.design-slice.folded-example, spec:consumers.design-slice.independent-example, spec:consumers.design-slice.component-absent, spec:consumers.design-slice.component-unrelated, spec:consumers.design-slice.component-matching, spec:consumers.design-slice.component-differing, spec:consumers.design-slice.component-unreadable, spec:consumers.design-slice.outside-satisfied, spec:consumers.design-slice.outside-unbound, spec:consumers.design-slice.outside-holding, spec:consumers.spec-studio.slice-page, spec:consumers.roadmap, spec:consumers.roadmap.built-work, spec:consumers.roadmap.buildable-part, spec:consumers.roadmap.statement-part, spec:consumers.roadmap.design-part, spec:consumers.roadmap.drifting-part, spec:consumers.roadmap.missing-evidence, spec:consumers.roadmap.blocking-part, spec:consumers.roadmap.outside-parent, spec:consumers.roadmap.statement-order, spec:consumers.spec-studio.roadmap-page, spec:consumers.roadmap.memo, spec:consumers.spec-studio.cited-line-text, spec:consumers.spec-studio.register-input, spec:protocol.significant-units-review, spec:protocol.role-vocabulary, spec:protocol.capability-epics, spec:protocol.roadmap-replaces-plans, spec:protocol.delivery-record-cleanup, spec:decisions.roadmap-priority, spec:decisions.roadmap-over-plans, spec:decisions.epics-of-any-kind

Members removed: None

Member order unchanged.

changed · pack:spec-studio-v1

Members added: spec:consumers.spec-studio.lenses.architecture.unit-register

Members removed: None

Member order unchanged.

Bindings, derived from anchors

The Markdown envelope is explicit and bounded

Implementing units

Added: impl:protocol.markdown-yaml-policy

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Gherkin authoring enters the one graph

Implementing units

Added: impl:protocol.gherkin-kind-policy

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Markdown authoring enters the one graph

Implementing units

Added: impl:protocol.markdown-parser

Removed: impl:protocol.markdown-authoring

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

The Markdown body accepts one closed form per section

Implementing units

Added: impl:protocol.markdown-content

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

A Pack has a Markdown manifest carrier

Implementing units

Added: impl:protocol.markdown-yaml-policy, impl:protocol.static-reification

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap-priority

Removed: None

Delivery facts

Added: None

Removed: None

Every prose value has one typed owner

Implementing units

Added: impl:protocol.markdown-body-grammar

Removed: impl:protocol.prose-ownership

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

A TypeScript-carried Spec can be converted to Markdown

Implementing units

Added: impl:protocol.import-fidelity, impl:protocol.sdp-import-publish, impl:protocol.sdp-import-scan

Removed: None

Referencing units

Added: None

Removed: impl:protocol.sdp-import-publish, impl:protocol.sdp-import-scan

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Agents script a visible typed graph

Implementing units

Added: impl:protocol.reader

Removed: impl:protocol.agent-surface

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

The evaluation sink runs one body and prints its return

Implementing units

Added: None

Removed: impl:protocol.query-answer-shapes

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Recipes take parameters as data and ship as runnable files

Implementing units

Added: impl:protocol.parameter-codec

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Views speak binding language, never the internal fact name

Implementing units

Added: None

Removed: impl:protocol.binding-language-pack-table

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

The capability map reads every epic and its refinement descendants

Implementing units

Added: impl:protocol.capability-map-recipe

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.capability-map

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

Every verb answers --help, and one verb writes every projection root

Implementing units

Added: impl:protocol.build-args

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Designs are compared between a base commit and the working tree at entry grain

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap-priority

Removed: None

Delivery facts

Added: None

Removed: None

Design Review renders graph context without becoming a gate

Implementing units

Added: impl:protocol.design-review-codec

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

A slice reads a Pack as one design, with the architecture it touches and what each member needs next

Implementing units

Added: impl:protocol.design-slice-recipe

Removed: None

Referencing units

Added: impl:protocol.studio-slice-answer

Removed: None

Enabled verifiers

Added: spec:consumers.design-slice.chain, spec:consumers.design-slice.component-absent, spec:consumers.design-slice.component-differing, spec:consumers.design-slice.component-matching, spec:consumers.design-slice.component-unreadable, spec:consumers.design-slice.component-unrelated, spec:consumers.design-slice.decision-backlink, spec:consumers.design-slice.dependency-cycle, spec:consumers.design-slice.folded-example, spec:consumers.design-slice.independent-example, spec:consumers.design-slice.outside-components, spec:consumers.design-slice.outside-holding, spec:consumers.design-slice.outside-satisfied, spec:consumers.design-slice.outside-unbound, test:protocol.design-slice

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

Members rest on a chain

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.chain

Removed: None

Delivery facts

Added: has-verifier

Removed: None

An unanchored component design stays visible

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.component-absent

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A realized component keeps its differing layer and uses apart

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.component-differing

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A realized component matches its declared values

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.component-matching

Removed: None

Delivery facts

Added: has-verifier

Removed: None

An unreadable declared layer stays visible

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.component-unreadable

Removed: None

Delivery facts

Added: has-verifier

Removed: None

An anchor alone does not realize a component design

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.component-unrelated

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A shaping decision comes before its member

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.decision-backlink

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A cycle shares a depth

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.dependency-cycle

Removed: None

Delivery facts

Added: has-verifier

Removed: None

An example folds without lending its readiness

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.folded-example

Removed: None

Delivery facts

Added: has-verifier

Removed: None

An example with its own dependency stays unfolded

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.independent-example

Removed: None

Delivery facts

Added: has-verifier

Removed: None

Outside components stop at the touched components' neighbors

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.outside-components

Removed: None

Delivery facts

Added: has-verifier

Removed: None

An outside prerequisite names the member it holds

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.outside-holding

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A prerequisite reaches its satisfying component

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.outside-satisfied

Removed: None

Delivery facts

Added: has-verifier

Removed: None

An unbound prerequisite invents no component

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.design-slice.outside-unbound

Removed: None

Delivery facts

Added: has-verifier

Removed: None

Gherkin view renders any Spec as a disposable read shape

Implementing units

Added: impl:protocol.gherkin-kind-policy

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

A change proposal is addressed, based and checked before it lands

Implementing units

Added: impl:protocol.studio-proposal-contract

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Every Spec, Pack, code unit and keyed term is a note, and every relation is a link

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.vault-priority

Removed: None

Delivery facts

Added: None

Removed: None

A roadmap orders the next bodies of work, and the graph says what each still needs

Implementing units

Added: impl:protocol.roadmap-recipe

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: spec:consumers.roadmap.blocking-part, spec:consumers.roadmap.buildable-part, spec:consumers.roadmap.built-work, spec:consumers.roadmap.design-part, spec:consumers.roadmap.drifting-part, spec:consumers.roadmap.missing-evidence, spec:consumers.roadmap.outside-parent, spec:consumers.roadmap.statement-order, spec:consumers.roadmap.statement-part, test:protocol.roadmap-recipe

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A descendant question holds the entry for design

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap.blocking-part

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A ready unbound part needs building

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap.buildable-part

Removed: None

Delivery facts

Added: has-verifier

Removed: None

Built work stays on the roadmap

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap.built-work

Removed: None

Delivery facts

Added: has-verifier

Removed: None

An unfinished part needs design

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap.design-part

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A binding below ready remains drift

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap.drifting-part

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A roadmap renders as the forward section of a pull request description

Implementing units

Added: impl:protocol.roadmap-memo-recipe, impl:protocol.studio-roadmap-page

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap-memo-recipe, test:protocol.studio-roadmap-page

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A descendant without evidence names its holding clause

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap.missing-evidence

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A descendant names its outside parent

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap.outside-parent

Removed: None

Delivery facts

Added: has-verifier

Removed: None

Waiting statements keep dependency order against roadmap places

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap.statement-order

Removed: None

Delivery facts

Added: has-verifier

Removed: None

A complete part waits for a statement

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap.statement-part

Removed: None

Delivery facts

Added: has-verifier

Removed: None

The capability map page makes refinement readable by epic

Implementing units

Added: impl:protocol.studio-capabilities-page, impl:protocol.studio-filter, impl:protocol.studio-frame, impl:protocol.studio-index-page

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-capabilities

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

The Studio's custom elements each hold one view the build renders

Implementing units

Added: None

Removed: impl:protocol.studio-view-elements

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

The Studio reads two named inputs beside the graph, a base graph and run records

Implementing units

Added: impl:protocol.studio-inputs

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

A page takes each recipe answer from the recipe's shipped body

Implementing units

Added: None

Removed: None

Referencing units

Added: impl:protocol.studio-register-contracts

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

The Studio chooses diagram kinds from graph values

Implementing units

Added: impl:protocol.studio-architecture-lens, impl:protocol.studio-capability-diagrams, impl:protocol.studio-diagram-layout, impl:protocol.studio-diagram-source, impl:protocol.studio-diagrams, impl:protocol.studio-maturity-map, impl:protocol.studio-requirement-diagram, impl:protocol.studio-slice-architecture, impl:protocol.studio-slice-dependencies

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-diagram-catalog

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A refinement drawing follows the capability map

Implementing units

Added: impl:protocol.studio-capability-diagrams, impl:protocol.studio-diagram-source

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-capabilities

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A dependency drawing shows the declared footing of a Spec set

Implementing units

Added: impl:protocol.studio-slice-dependencies

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-slice-dependency

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

Edges route around boxes with deterministic orthogonal paths

Implementing units

Added: impl:protocol.studio-diagram-routing, impl:protocol.studio-diagrams

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-diagram-core

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A diagram preserves readable labels before zoom

Implementing units

Added: impl:protocol.studio-diagram-element, impl:protocol.studio-diagram-layout, impl:protocol.studio-diagrams

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-diagram-core

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

The maturity map is drawn as a grid of counts

Implementing units

Added: impl:protocol.studio-maturity-map

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-architecture-maturity-requirement

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A diagram offers Mermaid source as copyable text

Implementing units

Added: impl:protocol.studio-diagram-source, impl:protocol.studio-diagrams

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-diagram-core

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A requirement drawing separates intent from realization and verification

Implementing units

Added: impl:protocol.studio-requirement-diagram, impl:protocol.studio-requirement-view

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-architecture-maturity-requirement, test:protocol.studio-diagram-core

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A Spec set draws the architecture it touches

Implementing units

Added: impl:protocol.studio-slice-architecture

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-slice-architecture

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A diagram is laid out from graph values into SVG with a text equivalent

Implementing units

Added: impl:protocol.studio-diagram-model

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-diagram-core

Removed: None

Delivery facts

Added: None

Removed: None

The diff page shows what changed in the design since a base graph

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap-priority

Removed: None

Delivery facts

Added: None

Removed: None

The architecture lens draws components by context and layer, the planned beside the built

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-architecture-maturity-requirement

Removed: None

Delivery facts

Added: None

Removed: None

The architecture page lists each component's significant units by role

Implementing units

Added: impl:protocol.studio-unit-register

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-architecture-maturity-requirement

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

Every page of the page set is reached from the top navigation and the index

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-roadmap-page

Removed: None

Delivery facts

Added: None

Removed: None

A Pack page shows the Pack's design as one card per member

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap-priority

Removed: None

Delivery facts

Added: None

Removed: None

A Pack page's maturity map places every member by its stated rung and its floor

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-architecture-maturity-requirement

Removed: None

Delivery facts

Added: None

Removed: None

A few custom elements filter, search, open and copy on a rendered page

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-copy-source

Removed: None

Delivery facts

Added: None

Removed: None

sdp studio publishes the Studio as one page set

Implementing units

Added: impl:protocol.build-pipeline-emit, impl:protocol.studio-page-catalog

Removed: impl:protocol.studio-build-invalidation

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

The roadmap page shows the upcoming work in priority order, split by what it needs

Implementing units

Added: impl:protocol.studio-roadmap-page

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-roadmap-page

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

The Studio's shell frames every page with navigation, a rail and a canvas

Implementing units

Added: impl:protocol.studio-html

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

A slice page shows a Pack's design as one whole

Implementing units

Added: impl:protocol.studio-slice-page

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-slice-page

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

A Spec page shows one Spec in collapsible panels, in a fixed order

Implementing units

Added: impl:protocol.studio-requirement-view

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.studio-architecture-maturity-requirement

Removed: None

Delivery facts

Added: None

Removed: None

Every view run rewrites the view wholesale

Implementing units

Added: impl:protocol.build-pipeline-emit

Removed: impl:protocol.wholesale-view-build-invalidation

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Bindings are optional, plural, and may reference a design

Implementing units

Added: None

Removed: None

Referencing units

Added: impl:protocol.schema-version

Removed: impl:protocol.graph-edge-types

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Carrier universality is bounded by honest kind structure

Implementing units

Added: None

Removed: None

Referencing units

Added: impl:protocol.gherkin-kind-policy

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Capability epics keep kind independent of altitude

Implementing units

Added: None

Removed: None

Referencing units

Added: impl:protocol.capability-map-recipe

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

A roadmap states advisory priority in the graph

Implementing units

Added: None

Removed: None

Referencing units

Added: impl:protocol.pack-aggregate, impl:protocol.pack-member-order

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

The build renders every Studio view, and an element only enhances it

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: impl:protocol.studio-view-elements

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Graph claims retain their epistemic source

Implementing units

Added: impl:protocol.schema-version

Removed: impl:protocol.graph-claims

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Carrier reification derives the one graph

Implementing units

Added: impl:protocol.schema-version

Removed: impl:protocol.graph-edge-types

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Committed source derives byte-identical output

Implementing units

Added: impl:protocol.build-pipeline-emit

Removed: impl:protocol.extraction-determinism

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Bound examples execute their authored steps

Implementing units

Added: impl:protocol.delivery-facts, impl:protocol.example-runner, impl:protocol.example-runner-adapter, impl:protocol.example-testing-helpers, impl:protocol.executable-contracts, impl:protocol.runnable-modules

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: implemented

Removed: None

A Pack node keeps its members in authored order

Implementing units

Added: impl:protocol.markdown-yaml-policy, impl:protocol.open-section-order, impl:protocol.pack-coherence, impl:protocol.pack-design-page, impl:protocol.reader

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap-priority

Removed: None

Delivery facts

Added: None

Removed: None

Generated artifacts are disposable projections

Implementing units

Added: impl:protocol.build-pipeline-emit

Removed: impl:protocol.regenerability

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

A Pack is a truth-free review aggregate

Implementing units

Added: None

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap-priority

Removed: None

Delivery facts

Added: None

Removed: None

The Protocol organizes its own features in capability epics

Implementing units

Added: impl:protocol.capability-epics

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.capability-epics

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

The Protocol reads its next work from its roadmap and keeps its delivery record in git and its pull requests

Implementing units

Added: impl:protocol.roadmap-practice

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.roadmap-practice

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

The engine's architectural roles each name one pattern

Implementing units

Added: impl:protocol.role-vocabulary

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: implemented

Removed: None

The engine's accepted set covers its significant abstractions and only those

Implementing units

Added: impl:protocol.structural-self-binding

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: test:protocol.structural-self-binding

Removed: None

Delivery facts

Added: has-verifier, implemented

Removed: None

Corpus-authored rules run on the one validation path

Implementing units

Added: impl:protocol.corpus-rule-runner

Removed: None

Referencing units

Added: None

Removed: None

Enabled verifiers

Added: None

Removed: None

Delivery facts

Added: None

Removed: None

Diagnostics

Composing (0)

Composing needs the script.