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.
- 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
Arrows move between rules and roles · Page Up / Down jump beds · Space toggles · A switches architecture · Ctrl or ⌘ Z undoes
National
soundNational 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.
Signed in to
National Dashboard
- tab stops
- —
- current page
- —
- coverage options
- —
- commits
- —
- The three rules agree.
State
soundState interface. Navigation shows State Dashboard, Tax Office, Analysis, Settings. Signs in to State Dashboard. Analysis coverage: State, Tax office. No faults.
Signed in to
State Dashboard
- tab stops
- —
- current page
- —
- coverage options
- —
- commits
- —
- The three rules agree.
Coordination office
soundCoordination office interface. Navigation shows Regional Dashboard, State Dashboard, Analysis, Settings. Signs in to Regional Dashboard. Analysis coverage: State, Coordination, Tax office. No faults.
Signed in to
Regional Dashboard
- tab stops
- —
- current page
- —
- coverage options
- —
- commits
- —
- The three rules agree.
Tax office
soundTax office interface. Navigation shows Tax Office, Analysis, Settings. Signs in to Tax Office. Analysis coverage: Tax office. No faults.
Signed in to
Tax Office
- 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
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.