Assurance vector
RS-Key is not formally verified. This page is generated from the registry and reports what evidence exists, not that a whole-system theorem does. The Definition of done keeps this sentence a requirement until one exists, and scripts/claims_gate.py holds every page naming three or more registered properties to it. What is out of scope and what is accepted: limitations and the threat model.
One word per property mixes questions that move independently. Roadmap §4.1 argues it; the first closed slice measured it. That slice took SEC-FIDO-001 from one Kani harness to four and landed the first mutant in this tree ever to redden a proof — and its status would have read BOUNDED either way, because the word is derived from a harness name.
So the axes are printed apart. Every one is derived from the tree on every gate run by scripts/evidence_gate.py, which also regenerates this page and refuses a stale copy of it.
The axes
| Axis | What it counts | Read out of |
|---|---|---|
model | asserted of naming: configurations naming the invariant, and the subset whose recorded verdict is GREEN | formal/*.cfg + formal/floors.txt |
co | model mutants whose code twin was patched into the tree and killed | formal/comutants.toml |
trace | accepted of replaying: configurations that replay a recorded session, and the subset that accepts it | the module’s generator handshake |
kani | harnesses carrying the invariant’s name — what BOUNDED keys on | crates/*/src/*kani*.rs |
hardware | board results: a bundle’s declaration, and a platform assumption discharged with the stepping it was taken on | assurance/bundle/*.toml + assurance/platform.toml |
scope | the built images the ledger disposes the property on | assurance/configurations.toml |
freshness | whether a bundle’s commit post-dates every input it is about | git log |
Three readings the axes are built to stop. A kani count does not fill in for hardware: a bounded proof is about execution paths and a board result is about a platform, and neither substitutes for the other. A trace count is DIRECT — a recorded session reaches a property only if a configuration checking that property replays it, so the refinement properties carry the session and the invariants they refine do not inherit it. And a configuration NAMING an invariant is not one ASSERTING it: most of them are mutants that exist for it to fall in, which is why model and trace are printed as two numbers each.
hardware reads two sources, and together they give 2 of 59. One is a bundle’s DECLARATION, and the gate’s job there is that a declaration cannot arrive without the board revision it was taken on. The other is docs/platform-assumptions.md’s registry, which is where a board result actually lands — an obligation moving to discharged with a real stepping recorded is what moves this column, whatever class it is filed under.
Neither direction of that number says more than it is. A 0 is “nothing here was measured on hardware” and never a measurement: the axis prints the same 0 over a question nobody asked and over one a board refused to answer. A non-zero is not the property holding on hardware either — it is THESE rows and no others, on the stepping and the boot configuration they name, and it lapses when either moves.
The freshness axis reads committed history only, so an uncommitted edit to an owner is invisible until it lands. That is deliberate: the answer must not change between writing this page and committing it.
What a release may say
- 56 of 59 security properties are ASSERTED by at least one finite TLA+ configuration whose recorded verdict is GREEN, and hold exhaustively over that configuration’s constants.
- 44 of 59 carry a model mutant whose code twin
formal/comutants.tomlrecords as patched into the real tree and killed. That verdict is re-driven by the weeklycomutate run, not by the gate that writes this page. - 33 of the 46 rows the v1 word calls
MODELLED-ONLYcarry such a twin: the word means no Kani harness, and never untested. - 10 of 59 are checked by a configuration that ACCEPTS a recorded session, and 10 by one that must REFUSE a negative one.
- 11 of 59 carry at least one Kani harness named after them. That is all
BOUNDEDkeys on — a harness NAME, not the#[kani::proof]attribute, not a bound, not acfg— so it points at the bundle’s method table and is never the proof itself. - Rows carrying a dated raw evidence bundle: 11 of 59; of those, still ahead of every input they are about: 0.
- No property is claimed on more than 10 built image(s) of the configuration ledger; every other column is a gap or out of scope.
- 2 of 59 carry a result measured on a board, each naming the revision it was taken on.
What a release may not say
- that any property is proven or verified without qualification — no row carries an unbounded deductive proof, and
PROVEN-SOURCEis refused by the registry until one exists. - that a
kanicount is a proof of anything in particular — the axis counts harnesses carrying the property’s name, and what each one bounds is the bundle’s method table. - that a
modelcount is the strength of the evidence — its denominator counts every configuration NAMING the invariant, and most of those are mutants that exist for it to fall in.assertedis the half a claim may rest on, and for aclause_ofrow it can be 0 while the parent invariant carrying that clause is asserted. - that the model-checked properties hold on the firmware — they hold on the images the scope axis names, and
docs/assurance-matrix.mdcarries the rest of that row. - that the reconstructed
v1column is an independent check on the registry’s word. It reads the two derivationsassurance_gate.pyalready forces that word from, so its disagreement set is empty on every input that gate accepts: it records that the scalar is a projection, and cannot discover that it is not. - that 48 of the rows are current — they carry no evidence date at all, so nothing here says when they were last true.
The vector
v1 is the one word assurance/properties.toml publishes, reconstructed here from model and kani rather than copied: no configuration names it and it is ACCEPTED-RISK, a harness names it and it is BOUNDED, anything else is MODELLED-ONLY. All 59 rebuild exactly, which is the migration being lossless — and the reason it is lossless is that the word holds nothing of its own.
| ID | Property | Model | Co | Trace | Kani | Hardware | Claimed on | Out of scope | Freshness | v1 |
|---|---|---|---|---|---|---|---|---|---|---|
SEC-REF-001 | R1sTokenStateRefinement | 1 of 2 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-REF-002 | R1oTokenOutcomes | 1 of 2 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-REF-003 | R1oOutcomeCoverage | 1 of 2 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-REF-004 | R4bEventConsensus | 2 of 9 | 0 | 2 of 9 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-REF-005 | NoAuthorizationBypassA | 1 of 2 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-REF-006 | RequiredGateAgreesWithRelation | 0 of 1 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-FIDO-001 | NoAuthorizationBypass | 5 of 50 | 12 | 0 of 0 | 4 | 0 | 3 | 4 | f52b720 stale (58 input(s) newer) | BOUNDED |
SEC-FIDO-002 | NoCrossTransportTouchConsumption | 5 of 42 | 5 | 0 of 0 | 2 | 0 | 3 | 4 | 31c21a7 stale (3 input(s) newer) | BOUNDED |
SEC-FIDO-003 | NoTokenAfterInvalidation | 5 of 45 | 6 | 0 of 0 | 2 | 0 | 4 | 0 | 31c21a7 stale (9 input(s) newer) | BOUNDED |
SEC-FIDO-004 | NoAccessibleSecretWithoutGate | 5 of 39 | 2 | 0 of 0 | 0 | 0 | 4 | 0 | 31c21a7 stale (5 input(s) newer) | MODELLED-ONLY |
SEC-FIDO-005 | NoUnmanageableCredential | 5 of 40 | 3 | 0 of 0 | 0 | 0 | 4 | 0 | 31c21a7 stale (6 input(s) newer) | MODELLED-ONLY |
SEC-FIDO-006 | ResetNeverWeakensSurvivingState | 5 of 40 | 3 | 0 of 0 | 1 | 0 | 4 | 0 | 31c21a7 stale (4 input(s) newer) | BOUNDED |
SEC-FIDO-006A | ResetKeepsThePinGate | 1 of 2 | 1 | 0 of 0 | 1 | 0 | 4 | 0 | b185fc3 stale (2 input(s) newer) | BOUNDED |
SEC-FIDO-006B | ResetKeepsTheAlwaysUvGate | 1 of 2 | 1 | 0 of 0 | 1 | 0 | 4 | 0 | b185fc3 stale (2 input(s) newer) | BOUNDED |
SEC-FIDO-006C | ResetKeepsTheBackupSeal | 1 of 2 | 1 | 0 of 0 | 1 | 0 | 4 | 0 | b185fc3 stale (2 input(s) newer) | BOUNDED |
SEC-FIDO-007 | RamNeverOutlivesFlashSeed | 4 of 5 | 1 | 0 of 0 | 0 | 1 | 4 | 0 | 3e08f75 stale (9 input(s) newer) | MODELLED-ONLY |
SEC-FIDO-008 | NoLiveTokenWithoutPinRecord | 4 of 5 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | 31c21a7 stale (4 input(s) newer) | MODELLED-ONLY |
SEC-FIDO-009 | OpAdvancesIsOneActivity | 1 of 2 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-FIDO-L01 | EveryOpQuiesces | 2 of 3 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-FIDO-L02 | EveryWaitReleases | 2 of 3 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-FIDO-L03 | EveryWalkCloses | 2 of 3 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-TRACE-001 | R4aRawRefinesB | 2 of 9 | 0 | 2 of 9 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-TRACE-002 | R4bAlphaMatchesGamma | 1 of 8 | 0 | 1 of 8 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-TRACE-004 | R4cGateAnswers | 2 of 9 | 0 | 2 of 9 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-SEAM-001 | NoStatusOutsideItsSelection | 2 of 29 | 5 | 1 of 2 | 0 | 0 | 10 | 0 | — | MODELLED-ONLY |
SEC-SEAM-002 | NoStatusAfterARefusedAuth | 2 of 24 | 2 | 1 of 2 | 0 | 0 | 10 | 0 | — | MODELLED-ONLY |
SEC-SEAM-003 | NoKeyOpOnTheAdminStatus | 2 of 28 | 5 | 1 of 2 | 0 | 0 | 10 | 0 | — | MODELLED-ONLY |
SEC-SEAM-004 | ReselectPreservesAccessStatus | 2 of 23 | 1 | 1 of 2 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-SEAM-005 | ExemptRefusalPreservesStatus | 2 of 24 | 2 | 1 of 2 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-SEAM-006 | AccessCodeRemovalNeedsTheCode | 2 of 23 | 1 | 1 of 2 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-STORE-001 | NoOrphanedMetadata | 2 of 13 | 2 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-STORE-002 | NoFalseAbsent | 2 of 13 | 2 | 0 of 0 | 3 | 0 | 4 | 0 | — | BOUNDED |
SEC-STORE-003 | NoRecordLostToMetaWrite | 2 of 15 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-STORE-004 | NoFalseMetaAbsent | 2 of 12 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-STORE-005 | CacheHonest | 2 of 4 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-STORE-006 | NoSilentOrphan | 2 of 12 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-LAT-001 | NoAuthWhenBlocked | 1 of 5 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-LAT-002 | WrongAttemptIsCharged | 1 of 5 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-LAT-003 | BudgetRisesOnlyWithItsSecret | 1 of 5 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-POL-001 | PivOperationNeedsSlotPolicy | 1 of 12 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-POL-002 | PivAlwaysSpendsFreshness | 1 of 12 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-POL-003 | AttributeChangeInvalidatesTheKey | 1 of 12 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-POL-004 | OathCredentialNeedsItsGates | 1 of 13 | 2 | 0 of 0 | 0 | 0 | 3 | 4 | — | MODELLED-ONLY |
SEC-POL-005 | OtpSlotMutationNeedsItsCode | 1 of 12 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-POL-006 | OtpCounterNeverRepeats | 1 of 15 | 4 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-ADM-001 | AdminSurfaceAlwaysReachable | 1 of 6 | 1 | 0 of 0 | 0 | 1 | 0 | 0 | — | MODELLED-ONLY |
SEC-ADM-002 | PrivilegedOpNeedsPresence | 1 of 6 | 1 | 0 of 0 | 0 | 0 | 3 | 4 | — | MODELLED-ONLY |
SEC-ADM-003 | DisableSetSurvivesLockWrite | 1 of 6 | 1 | 0 of 0 | 0 | 0 | 0 | 0 | — | MODELLED-ONLY |
SEC-ADM-004 | DisabledAppletNeverDispatches | 1 of 6 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-DISP-001 | ConfirmNamesTheOperation | 1 of 5 | 1 | 0 of 0 | 0 | 0 | 0 | 30 | — | MODELLED-ONLY |
SEC-DISP-002 | StaleTouchApprovesNothing | 1 of 5 | 1 | 0 of 0 | 0 | 0 | 0 | 30 | — | MODELLED-ONLY |
SEC-DISP-003 | OnlyAllowConfirms | 1 of 5 | 1 | 0 of 0 | 0 | 0 | 0 | 30 | — | MODELLED-ONLY |
SEC-BOOT-001 | MarkerNeverLies | 4 of 13 | 2 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-BOOT-002 | TheWholeLockRides | 3 of 8 | 1 | 0 of 0 | 0 | 0 | 4 | 0 | — | MODELLED-ONLY |
SEC-TRANS-001 | NoCrossChannelSplice | 1 of 5 | 1 | 0 of 0 | 2 | 0 | 10 | 0 | — | BOUNDED |
SEC-TRANS-002 | NoSequenceGap | 1 of 5 | 1 | 0 of 0 | 1 | 0 | 10 | 0 | — | BOUNDED |
SEC-TRANS-003 | NoBufferOverrun | 1 of 5 | 1 | 0 of 0 | 1 | 0 | 10 | 0 | — | BOUNDED |
SEC-RISK-001 | PerDeviceAttestationCertIsACorrelationHandle | 0 of 0 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | ACCEPTED-RISK |
SEC-RISK-002 | FlashSnapshotRollsBackPinRetries | 0 of 0 | 0 | 0 of 0 | 0 | 0 | 0 | 0 | — | ACCEPTED-RISK |
Model and Trace read asserted of naming and accepted of replaying. A 0 of 1 is a real state and not a defect: a clause row is asserted through the parent invariant its clause_of names, and RequiredGateAgreesWithRelation is registered precisely so that it is REFUTED.
Claimed on counts the columns disposed covered, equivalent or conditional; Out of scope counts the ones where the ledger says the claim is not made. Their sum is not the number of built images — everything else is a gap, and docs/assurance-matrix.md is the page that counts those.
Coverage by built image
The same 40 P0-family rows, counted the other way round: per column rather than per property. Placed is a disposition the ledger actually wrote, out-of-scope included, because a decision not to claim is a decision. Unplaced is the remainder, and it is what a per-property count cannot show — a property claimed on twenty images looks well covered while an image nobody disposed anything on stays invisible. The columns are matrix_gate.py’s, so this asks nothing about how many built images exist that another gate already answers.
| Column | Kind | Published | Placed | Unplaced |
|---|---|---|---|---|
firmware | package | yes | 40 | 0 |
firmware-no-touch | package | no | 7 | 33 |
firmware-fips | package | yes | 3 | 37 |
firmware-pqc | package | yes | 3 | 37 |
firmware-fips-pqc | package | yes | 3 | 37 |
firmware-no-touch-pqc | package | no | 7 | 33 |
firmware-no-touch-fips | package | no | 7 | 33 |
firmware-no-touch-fips-pqc | package | no | 7 | 33 |
firmware-strong-pin | package | yes | 3 | 37 |
firmware-strong-pin-pqc | package | yes | 3 | 37 |
firmware-always-uv | package | yes | 3 | 37 |
firmware-always-uv-pqc | package | yes | 3 | 37 |
firmware-strict-up | package | yes | 3 | 37 |
firmware-strict-up-pqc | package | yes | 3 | 37 |
firmware-pico | package | no | 40 | 0 |
firmware-display | package | yes | 0 | 40 |
firmware-2mb | package | yes | 9 | 31 |
firmware-16mb | package | yes | 9 | 31 |
firmware-strict-config | package | yes | 3 | 37 |
keygen-bench | feature | no | 3 | 37 |
core1-stats | feature | no | 3 | 37 |
bench | feature | no | 3 | 37 |
fido-conformance | feature | no | 3 | 37 |
ea-conformance-rpid | feature | no | 3 | 37 |
largeblob-ext | feature | no | 3 | 37 |
abrobot-16m | board | no | 9 | 31 |
abrobot-4m | board | no | 36 | 4 |
seeed-xiao | board | no | 9 | 31 |
tenstar-usb | board | no | 9 | 31 |
waveshare-one | board | no | 40 | 0 |
waveshare-touch-lcd | board | no | 9 | 31 |
Read the feature rows first: every one of them carries the same handful of placed cells and the rest unplaced, which is the shape roadmap §12 calls feature blindness. A default-build proof is not a proof about the image a feature builds, and the column is where that stops being invisible.
Stale and pending, in one place
Three spellings of “not current”, which used to sit on two different pages and in a registry: a bundle whose commit is behind an input it is about, a P0-family property with no raw bundle at all, and a platform obligation still waiting on a board. Reading any one of them alone reports a clean tree over an unclean one.
| Kind | Subject | What is outstanding |
|---|---|---|
| bundle | SEC-FIDO-001 | 58 input(s) newer than f52b720 |
| bundle | SEC-FIDO-002 | 3 input(s) newer than 31c21a7 |
| bundle | SEC-FIDO-003 | 9 input(s) newer than 31c21a7 |
| bundle | SEC-FIDO-004 | 5 input(s) newer than 31c21a7 |
| bundle | SEC-FIDO-005 | 6 input(s) newer than 31c21a7 |
| bundle | SEC-FIDO-006 | 4 input(s) newer than 31c21a7 |
| bundle | SEC-FIDO-006A | 2 input(s) newer than b185fc3 |
| bundle | SEC-FIDO-006B | 2 input(s) newer than b185fc3 |
| bundle | SEC-FIDO-006C | 2 input(s) newer than b185fc3 |
| bundle | SEC-FIDO-007 | 9 input(s) newer than 3e08f75 |
| bundle | SEC-FIDO-008 | 4 input(s) newer than 31c21a7 |
| bundle | SEC-ADM-002 | no raw evidence bundle |
| bundle | SEC-ADM-004 | no raw evidence bundle |
| bundle | SEC-BOOT-001 | no raw evidence bundle |
| bundle | SEC-BOOT-002 | no raw evidence bundle |
| bundle | SEC-DISP-001 | no raw evidence bundle |
| bundle | SEC-DISP-002 | no raw evidence bundle |
| bundle | SEC-DISP-003 | no raw evidence bundle |
| bundle | SEC-LAT-001 | no raw evidence bundle |
| bundle | SEC-LAT-002 | no raw evidence bundle |
| bundle | SEC-LAT-003 | no raw evidence bundle |
| bundle | SEC-POL-001 | no raw evidence bundle |
| bundle | SEC-POL-002 | no raw evidence bundle |
| bundle | SEC-POL-003 | no raw evidence bundle |
| bundle | SEC-POL-004 | no raw evidence bundle |
| bundle | SEC-POL-005 | no raw evidence bundle |
| bundle | SEC-POL-006 | no raw evidence bundle |
| bundle | SEC-SEAM-001 | no raw evidence bundle |
| bundle | SEC-SEAM-002 | no raw evidence bundle |
| bundle | SEC-SEAM-003 | no raw evidence bundle |
| bundle | SEC-SEAM-006 | no raw evidence bundle |
| bundle | SEC-STORE-001 | no raw evidence bundle |
| bundle | SEC-STORE-002 | no raw evidence bundle |
| bundle | SEC-STORE-003 | no raw evidence bundle |
| bundle | SEC-STORE-004 | no raw evidence bundle |
| bundle | SEC-STORE-005 | no raw evidence bundle |
| bundle | SEC-STORE-006 | no raw evidence bundle |
| bundle | SEC-TRANS-001 | no raw evidence bundle |
| bundle | SEC-TRANS-002 | no raw evidence bundle |
| bundle | SEC-TRANS-003 | no raw evidence bundle |
| platform | PLAT-RESET-001 | A real RP2350 power-on reset clears WATCHDOG.scratch2, so the PIN so |
| platform | PLAT-ROM-001 | M7-Q2: the boot ROM’s BOOTSEL return path leaves WATCHDOG.scratch2 a |
| platform | PLAT-FLASH-001 | The silicon’s program/erase tear behaviour under a real supply cut is |
| platform | PLAT-OTP-001 | OTP read permissions, lock state and the chaffing layout behave as the |
| platform | PLAT-INPUT-001 | A PC/SC reader’s FEATURE_VERIFY_PIN_DIRECT layer carries the PIN to |
| platform | PLAT-TOOL-001 | A green tools/emu run is a protocol result, not a device result: the |
| platform | PLAT-TOOL-002 | tools/emu implements the same authorization gates as the firmware, s |
| platform | PLAT-TOOL-003 | Kani/CBMC is sound for the arithmetic its harnesses bound, and the sol |
| platform | PLAT-TOOL-004 | TLC is sound for the finite configurations it checks, and the verdict |
| platform | PLAT-TOOL-005 | Kani proves the presence arbiter’s cross-executor flags under a SEQUEN |
| platform | PLAT-TOOL-006 | The fuzz axis counts a FILE that names the invariant, not a run of i |
| platform | PLAT-TOOLCHAIN-001 | The compiler on the path is the pinned rustc and its output is what th |
| platform | PLAT-TOOLCHAIN-002 | docs/unsafe.md is the enumeration of the first-party unsafe sites: e |
| platform | PLAT-UNSAFE-002 | SendUsb is sound: embassy_usb::UsbDevice is !Send only for the ` |
| platform | PLAT-UNSAFE-003 | HEAP.init runs exactly once, over a static buffer nothing else touch |
| platform | PLAT-UNSAFE-004 | Each of the eight build-selected GPIOs handed to AnyPin::steal has e |
| platform | PLAT-UNSAFE-005 | The two static mut prime sieves are single-core-exclusive: `CORE0_SI |
| platform | PLAT-UNSAFE-006 | Each core programs MSPLIM once, on the core that owns that stack, befo |
| platform | PLAT-UNSAFE-007 | The three FFI calls into the vendored ARM assembly pass fully owned, l |
| platform | PLAT-UNSAFE-008 | The wiper’s two ROM flash sequences run with interrupts off and XIP di |
| platform | PLAT-UNSAFE-010 | The two link_section image-definition statics are placed by the link |
| platform | PLAT-UNSAFE-011 | The small-prime table and the sieve step are placed in `.data.small_pr |
| platform | PLAT-UNSAFE-012 | The three unsafe extern blocks declare what they name: the RSA assem |
| platform | PLAT-CRYPTO-001 | The HMAC-SHA-256 under pinUvAuthProtocol is correct as a MAC; the ha |
| platform | PLAT-BUILD-002 | ea-conformance-rpid’s enterprise-attestation allowlist is a conforma |
| platform | PLAT-BUILD-003 | The display build implements the one-hold-one-ceremony latch SOMEWHE |
| platform | PLAT-BUILD-004 | On the four no-touch images no presence DECISION is produced at all |
| platform | PLAT-THREAT-001 | A CTAPHID channel id is a routing label the sender writes, so channel |
| platform | PLAT-THREAT-002 | A PIN-derived record stays rooted in the public chip serial until its |
| platform | PLAT-MODEL-001 | PermSets’s five subsets are a SCOPE and not a description: a host ca |
| platform | PLAT-MODEL-009 | EF_MINPINLEN’s FLOOR (byte 0) and its RP-id disclosure list (bytes 2 |
| platform | PLAT-MODEL-011 | EF_DEVICE_PIN is outside RSKeySecurityState because the SURFACE it |
| platform | PLAT-MODEL-003 | The model’s ram is FidoState::keydev_dec.is_some() and nothing els |
| platform | PLAT-MODEL-004 | One store.seed boolean stands for two flash records, so the soft-loc |
| platform | PLAT-MODEL-005 | DeviceUnlock’s store.seed conjunct is what makes `RamNeverOutlives |
| platform | PLAT-MODEL-006 | RamNeverOutlivesFlashSeed is INERT on the shipped configuration: it |
| platform | PLAT-MODEL-007 | The C-tier reset bridge cannot be reused as bounded evidence for the s |
| platform | PLAT-MODEL-002 | One credential per relying party is enough to carry the authorization |
| platform | PLAT-MODEL-012 | gate.ppuatStale has no counterpart in the firmware. The model carrie |
| platform | PLAT-MODEL-013 | The two Kani harnesses named for this property cover the SESSION token |
| platform | PLAT-MODEL-015 | RSKeyBootHardening treats the lazy re-key as ATOMIC in thirteen of i |
| platform | PLAT-TRNG-002 | The RAW ring-oscillator source clears the floor the shipped whitening |
| platform | PLAT-TIMER-002 | The 32-bit alarm comparator survives its own wrap. embassy-rp arms ` |
| platform | PLAT-TIMER-003 | The timebase ADVANCES: RP2350 TIMER0’s counter keeps counting for as |
| platform | PLAT-XIP-001 | Core 1 is paused for the whole of every flash erase or program, so no |
| platform | PLAT-DISPLAY-001 | A panel update completes before the firmware treats the card as shown, |
| platform | PLAT-TRACE-001 | A trace-linked claim rests on the fields the recorded session VARIES; |
| platform | PLAT-TRACE-002 | No recorded session reaches this property. `grep -lw NoTokenAfterInval |
| platform | PLAT-PRES-001 | Owners — the four SCOPE_* bytes plus Panel, the model-only split |
| platform | PLAT-PRES-002 | No API in the tree can originate a cancel from SCOPE_CCID or from an |
| platform | PLAT-PRES-003 | NoCrossTransportTouchConsumption’s structural conjunct — `(pres.gran |
| platform | PLAT-SOURCE-001 | The revoke-before-write ORDER that the first conjunct of `NoTokenAfter |
| platform | PLAT-SOURCE-002 | Three of the citations that carry this property’s model-to-code bridge |
| platform | PLAT-GRANT-001 | NoAccessibleSecretWithoutGate’s ghost clause is DEAD by construction |
| platform | PLAT-GRANT-002 | The C-tier reset bridge cannot express this property, and a field for |
| platform | PLAT-GRANT-003 | FixPpuatRequiresPin’s FALSE arm is unobserved: the one configuration |
| platform | PLAT-CRED-001 | r \in store.rpent is read as `the EF_RP record for r is reachable by |
| platform | PLAT-CRED-002 | No action of RSKeySecurityState can fail a flash write: the model’s |
| platform | PLAT-CRED-003 | KeepOpen equates the seed that opens it is gone with `the record i |
| platform | PLAT-TOKEN-001 | RSKeySecurityState’s tok.live is FidoState::paut.in_use and its |
| platform | PLAT-TOKEN-002 | One pin.set boolean stands for one record. EF_DEVICE_PIN, the trus |
| platform | PLAT-TOKEN-003 | clientpin::issue_token is the only production maker of a live pinUvA |
| platform | PLAT-TOKEN-004 | reset() is the only modelled deleter of EF_PIN and it is not the o |
| platform | PLAT-TOKEN-005 | No existing bounded proof can be reused as evidence for this invariant |
| platform | PLAT-PINGATE-001 | SEC-FIDO-006A’s only bounded evidence carries a non-vacuity guard th |
| platform | PLAT-PINGATE-002 | SEC-FIDO-006A’s isolated RED is a localisation and not a demonstrati |
| platform | PLAT-AUVGATE-001 | ResetKeepsTheAlwaysUvGate has no falsifying state wherever `AlwaysUv |
| platform | PLAT-AUVGATE-002 | The model’s consequent for this clause is the alwaysUv FLAG and the Ru |
| platform | PLAT-ORACLE-001 | Below the model tier nothing can report ResetKeepsThePinGate rather |
| platform | PLAT-SEAL-001 | EF_BACKUP_SEALED is one byte on flash and every tier models it as one |
| platform | PLAT-SEAL-002 | This clause’s model verdict and its co-refutation credit both come fro |
| platform | PLAT-SEAL-003 | The TLA+ clause and its Rust abstraction do not state the same sentenc |
| platform | PLAT-SEAL-004 | The shipped image is built without --features fips-profile. On that |
| platform | PLAT-SEAL-005 | The marker’s SECOND consumer — the on-device recovery-phrase reveal at |
| platform | PLAT-STORE-001 | The tear guarantee PLAT-FLASH-001 makes about the silicon holds one la |
| platform | PLAT-STORE-002 | The backend’s enumeration-completeness flag is honest: for_each_key |
| platform | PLAT-STORE-003 | GIVEN a medium that tears the way PLAT-FLASH-001 asserts, a reboot rec |
| platform | PLAT-STORE-004 | is_counter_fid is a correct routing table over every FID the firmwar |
Review packet
For the commit that carries this page — which is why no commit is named here: a generated page that embeds the tree’s head is stale the moment it lands, and this section learned that on its first gate run. Every line is derived; none of it claims to be sufficient, because a reviewer who runs all of it has reproduced the software evidence and nothing about a board. The assurance case itself is a later stage’s artifact.
Generated artifacts, and the command that reproduces each.
| Artifact | Regenerated by |
|---|---|
docs/assurance-vector.md | python scripts/evidence_gate.py |
docs/assurance-matrix.md | python scripts/matrix_gate.py |
docs/platform-assumptions.md | python scripts/platform_gate.py |
formal/README.md | python scripts/assurance_gate.py |
Model runs this tree publishes counts from.
| Tier | Command | Taken | Against | Host |
|---|---|---|---|---|
liveness | ./formal/run-tlc.sh liveness | 2026-09-19 | 9f0fccc | Apple M5 Pro (18 cores) |
safety | ./formal/run-tlc.sh safety | 2026-09-19 | 9f0fccc | Apple M5 Pro (18 cores) |
Raw evidence bundles: SEC-FIDO-001, SEC-FIDO-002, SEC-FIDO-003, SEC-FIDO-004, SEC-FIDO-005, SEC-FIDO-006, SEC-FIDO-006A, SEC-FIDO-006B, SEC-FIDO-006C, SEC-FIDO-007, SEC-FIDO-008 — of 59 registered properties. Stale against this commit: SEC-FIDO-001, SEC-FIDO-002, SEC-FIDO-003, SEC-FIDO-004, SEC-FIDO-005, SEC-FIDO-006, SEC-FIDO-006A, SEC-FIDO-006B, SEC-FIDO-006C, SEC-FIDO-007, SEC-FIDO-008.