Skip to contentWolf-Rayet

Decision records

ADR-0073 A Scope is a place, timeline is not one, and the test has a layer it was never run against

Accepted2026-09-06Phase 4, reopened

#Context

live-feed and timeline are section F's last two rows, and section F argues them as a pair: *"They differ from each other in direction and not in authority — which is the same shape of difference shell-right-panel had from shell-left-panel."*

They were audited together, before either was built, in ADR-0061's manner. The audit's first finding is about the instrument rather than the pair: the identity test has never been run against a Scope, and the pair section F cites as its precedent is the one pair in the system the test cannot separate.

#The test has only ever been an Emitter's and an Arbiter's test

Every collapse it has made is an Emitter or an Arbiter. acknowledge into Button (ADR-0050); structured-list, contained-list and list into data-table and Substrate (ADR-0057); content-switcher into tabs (ADR-0060); breadcrumb into navigation-item (ADR-0061). Every row it has *kept* is one too, presence included (ADR-0071).

Read on the tier alone, seven built Scopes have two signatures. modal is one; data-table, shell-header, shell-left-panel, shell-right-panel, page-header and region are the other — identical in layer, legal levels, interactivity, vouching, acknowledgement, disclosure and variant count. Six components, one signature.

Read with D4 as ADR-0071 sharpened it, five of those six separate, and they separate on exactly the thing that record said to read: what the governed parts are *obliged to say*.

ScopeGoverned parts, and what they must say
data-tablecaption — what this table is about
shell-headername, context — what this system is, where in it the reader stands
page-headertitle, context — what this route is about, what it is part of
regionname, count — what this set is, how many are in it
shell-left-panelname — what this panel holds
shell-right-panelname — what this panel holds

The last two rows are the same row. shell-left-panel and shell-right-panel are identical on all seven dimensions, and they are two components. That is not an oversight either: they are two edges of a screen, and an operator who has learned that alarms live on the right has learned a fact about a place.

#So a Scope has a ground of identity the test does not carry, and should not

region's own contract says it, and said it before this audit existed:

every Scope built before it is a *particular* place — the three shell surfaces are at the edges, the page header is at the top, the modal occludes, the data table is a grid. Each is identifiable by where it is. This one is identifiable by nothing but its extent.

A Scope is a place. Two fixed places are two Scopes, and region is the Scope for a place the composer defines rather than the component. That is the rule the shell panels are built on and the rule this record now states rather than leaving in one contract's prose.

And it must not become a tier axis. Position is layout, and this system has kept layout out of components on purpose — every scene stylesheet in the repository says some version of *"a width is where a component sits rather than how it looks"*, and every one of them puts the width in the scene rather than in the component. An axis for position would be the first component-level layout declaration in the system, and it would be one so that an audit could read it, which is the worst reason to add anything.

One half of it is machine-checkable, is stated as a rule, and is enforced by nothing. ADR-0046:

A component that remains rendered across a change of route declares level 1 and no other, and may not hold a demand.

Nothing reads that. It is applied by hand in three contracts and appears in discipline.test.js only as a comment on a row. region, page-header and data-table declare the same [1] for a *different* reason — §3's, that a Scope distributes an allocation and does not hold one — so the tier cannot tell a shell from a region, and a fourth persistent Scope declaring two rungs would pass every check in the battery. That is owed and is named in Consequences.

#timeline is removed

It fails the test, and then it fails the Scope rule too.

On the seven, it is region. Its governed parts are a name and a count — what this record is, how many entries are in it — which is region's pair with region's roles, including the cardinality ADR-0058 made required for the reason that applies here unchanged: *"a set whose size is not stated makes two different screens identical."* Scope, one rung, non-interactive, no disclosure, no acknowledgement.

It does not vouch. A record of what happened is a result the product owns, not a condition an external source keeps confirming — pagination's sentence, arriving at a list instead of a total. Nothing in a closed timeline expires.

It is not a place. A timeline is *of* something — an incident, an asset, a shift — and it renders wherever that thing renders. It has no fixed location, which is region's description word for word.

Its order is markup. ADR-0061 decided this shape for breadcrumb — a trail is NavigationItems in the plain markup that component's contract already names — and ADR-0057 sent list to Substrate on the same reading: *"a marker, an indent and prose — a rule, a divider and content."* Entries in time order inside a bounded named set is a Region whose children are in order.

Section F's own defence is a claim about direction, which is subject matter, which is the axis ADR-0060 rejected when it collapsed content-switcher. And ADR-0052's defence is persistence — *"this system's is a persistent Scope that may not demand"* — which is the half of that sentence this audit finds false. A timeline does not outlive its route; it is the route's subject.

timeline is <Region name="Incident 4412" count="9 entries"> with its entries in order.

#live-feed stands, on vouches

It is a place: the rail an operator keeps events in, rendered across a change of route, governed by ADR-0046 by citation. But a place alone is what shell-right-panel already is, so the place is not what makes it a component here.

What makes it one is that its own claim is that it is live. If the source stops, a feed shows the same last events it showed a second ago, and a quiet period and a dead connection render identically. That is ADR-0048's thesis and ADR-0055's, said about a container instead of a mark: two causes, one rendering. region declares vouches: false and is right to; a feed that could not withdraw would be a component whose name is a claim it has no way to support.

It would be the first vouching Scope, and that was checked rather than assumed: a Scope declaring vouches: true gets --wr-<name>-unvouched-mark emitted and priced by the generator exactly as an Emitter does, at the Ambient floor, against every ground it can sit on.

#Two things the build has to answer, named and not answered here

A Scope's retraction has one half, not two. For an Emitter, a withdrawn claim re-points its mark *and* descends to the component's floor, and ADR-0048's load-bearing half is the descent — an unsupported claim may not spend the View's ration. A Scope at level 1 is already at its floor, so the descent is a no-op. By construction rather than by accident: the rule is "withdraw to your own floor" and this component has one rung. Whether the mark half alone is a sufficient retraction is a question a scene answers, not this record.

And nothing in ADR-0048 addresses a container. A withdrawn feed means what is *inside* it may no longer be current, and every entry inside it is a fact that was true when it arrived. Whether a Scope's withdrawal says anything about its subtree — and whether it may, given that the entries are not the ones that stopped being confirmed — is the harder half. Named here in ADR-0061's manner and left for the build.

#Rejected options

Keep timeline on section F's own sentence, that it differs from live-feed in direction the way the shell panels differ in edge. The strongest option, because the precedent is real: those two panels *are* identical on all seven and *are* two components. Rejected because the precedent is about places and this pair is not two places. A left edge and a right edge are two locations an operator learns. Open-at-the-recent-end and closed-at-both-ends is one location with two contents, and content is what a Scope holds rather than what it is.

Remove both, since region is a named set and both are named sets. Consistent, and it is the reading that would have followed from momentum. Rejected because live-feed's vouching is not something region can be given: a Region that vouched would be claiming its whole extent is a live report, which is false of the alarms region in every scene in this repository. The axis is per-component for the reason ADR-0048 makes it a declaration.

Add position as an eighth tier axis so the shell panels separate. It would make the test total. Rejected in the section above: it would be the first component-level layout declaration in a system that has kept layout in scene stylesheets deliberately, added so that an audit could read it.

Give live-feed a staleness child instead of letting it vouch. staleness already reports a source that stopped, up to Demanded, and ADR-0055 refuses two components saying one thing with two allocations. Rejected because they are not one thing: staleness reports a condition and may demand; a withdrawal is a container declining to assert and is pinned to its floor. ADR-0048's own design has both happening at once — twelve readings withdraw *and* one staleness report demands — and a feed is the container of the withdrawing things.

#Consequences

Roster 50 → 49; section F 5 → 4; built 35 unchanged. Fourteen rows remain, of which live-feed is one. The Carbon identity is untouched — timeline is an r136-native row with no Carbon slug, so 9 dropped + 34 carried = 43 stands and the exclusion table gains nothing.

ADR-0052's reconciliation row for activity-timeline moves from timeline to region, and that record's sentence about a persistent Scope is corrected where it stands rather than left to be read.

§12 records that the test is an Emitter's and an Arbiter's, with the Scope rule beside it. Six of the seven built Scopes separate under it; the seventh pair separates on a place, and a place is not a dimension.

A persists axis is owed, and it is the third owed check. ADR-0046 states a rule nothing enforces, and the tier cannot distinguish a shell from a region. The three, together: tools/battery.js's own lists (ADR-0056); the identityAxes list (ADR-0071); and this. They are one unit's worth of work and should be taken as one, because all three are the same defect — a rule or a list the repository states in prose and reads nowhere.

Nothing built, no token, scene or baseline moved. A record, a table row, and a corrected sentence in another record.

#Measured

  • component.config.json, this pass: 7 Scopes, 2 distinct signatures across layer, levels, interactivity, vouching, acknowledgement and variant count — modal alone, and the other six together.
  • The six read on D4: five separate, and shell-left-panel / shell-right-panel are identical — both ['name'], both *"what this panel holds"* *(disk, this pass)*.
  • A Scope can vouch: region flipped to vouches: true emitted --wr-region-unvouched-mark and priced it, worst region-set-1-mark on surface-raised in field-night at |Lc| 20 against a floor of 15. Reverted *(darwin-arm64, this pass)*.
  • ADR-0046's rule in the repository: one comment in discipline.test.js and no check *(disk, this pass)*.
  • Roster 50 → 49; section F 5 → 4; the identity 9 + 34 = 43, unchanged.
  • pnpm battery — the verdict this pass is measured by.