S5.01Lab · crystalline↑ Ascend to FIRS

Fault lines

The FIRS frontend decides what each role gets from three separate lists: navigation entries with the roles allowed to see them, a lookup from role to landing dashboard, and analysis coverage levels with their own role lists. The rules below are those lists, re-implemented from the source. Under the rules as shipped, every role is sound.

Each column is a core through one role. The surface on top is the interface that role would get, built live from the rules. Beneath it are the three lists as beds. State a requirement and, where the lists stop agreeing, the beds slip along a fault. Switch the architecture to recompile the same requirements with navigation as the only source of truth.

Architecture · A
View
Requirement
Try
Faults
0
Dead rules
0
Requirements in force
0
Compile, 4 roles
<0.01 ms
Cores re-rendered
—
Compiler
three lists

Rule section: one core per role

Role shown

Arrows move between rules and roles · Page Up / Down jump beds · Space toggles · A switches architecture · Ctrl or ⌘ Z undoes

N

National

sound

National interface. Navigation shows National Dashboard, Regional Dashboard, State Dashboard, Tax Office, Analysis, Settings. Signs in to National Dashboard. Analysis coverage: National, State, Coordination, Tax office. No faults.

FIRS · replicaNational

Signed in to

National Dashboard

Coverage
tab stops
—
current page
—
coverage options
—
commits
—
  • The three rules agree.
S

State

sound

State interface. Navigation shows State Dashboard, Tax Office, Analysis, Settings. Signs in to State Dashboard. Analysis coverage: State, Tax office. No faults.

FIRS · replicaState

Signed in to

State Dashboard

Coverage
tab stops
—
current page
—
coverage options
—
commits
—
  • The three rules agree.
C

Coordination office

sound

Coordination office interface. Navigation shows Regional Dashboard, State Dashboard, Analysis, Settings. Signs in to Regional Dashboard. Analysis coverage: State, Coordination, Tax office. No faults.

FIRS · replicaCoordination office

Signed in to

Regional Dashboard

Coverage
tab stops
—
current page
—
coverage options
—
commits
—
  • The three rules agree.
T

Tax office

sound

Tax office interface. Navigation shows Tax Office, Analysis, Settings. Signs in to Tax Office. Analysis coverage: Tax office. No faults.

FIRS · replicaTax office

Signed in to

Tax Office

Coverage
tab stops
—
current page
—
coverage options
—
commits
—
  • The three rules agree.

Consequences and history

Consequences · computed

State a requirement, toggle a rule, or switch the architecture. Every consequence is worked out from the rules and listed here.

Requirement log · select one to rewind

Reading it

How it is built

Requirements are an append-only log on top of the shipped rules. Undo, redo, rewinding and the link in the address bar are all just positions in that log. Switching the architecture never touches the log: the same requirements go through a different compiler, so whatever changes is the difference between the two designs.

Three lists is the shape the FIRS code has, verified in source. It is explicit: every rule is written down and can be read in one place. The cost is that nothing makes the lists agree. A requirement written against one list can leave another pointing at a page the role cannot open.

One source is my counterfactual, not what shipped. Landing becomes a preference resolved against navigation, and Analysis is offered exactly when a coverage level is, so faults cannot be expressed. The cost moves: a change to navigation can now move a role's landing page without anyone writing that down. The ledger marks those consequences as implicit, and an edit that would leave a role nowhere to land is refused rather than applied.

The compiler keeps the identity of every role it did not change (structural sharing), and each core subscribes to its own role only. The readings count which cores actually committed for each action, from a layout effect, as in the state propagation experiment.

The audit under each core is measured from the rendered surface after every commit: buttons and radio groups for tab stops, aria-current for the page a screen reader would announce, and the radios in the coverage group. A role that lands on a hidden page has no current page to announce. That is a real accessibility consequence of a rules fault, not a label.

The surfaces are inert: they show the result, and the rules are edited in the beds or the table. Each core carries a text summary of its surface for screen readers, and the table view is the same experiment in plain HTML controls.