Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

AxisWhat it countsRead out of
modelasserted of naming: configurations naming the invariant, and the subset whose recorded verdict is GREENformal/*.cfg + formal/floors.txt
comodel mutants whose code twin was patched into the tree and killedformal/comutants.toml
traceaccepted of replaying: configurations that replay a recorded session, and the subset that accepts itthe module’s generator handshake
kaniharnesses carrying the invariant’s name — what BOUNDED keys oncrates/*/src/*kani*.rs
hardwareboard results: a bundle’s declaration, and a platform assumption discharged with the stepping it was taken onassurance/bundle/*.toml + assurance/platform.toml
scopethe built images the ledger disposes the property onassurance/configurations.toml
freshnesswhether a bundle’s commit post-dates every input it is aboutgit 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.toml records as patched into the real tree and killed. That verdict is re-driven by the weekly comutate run, not by the gate that writes this page.
  • 33 of the 46 rows the v1 word calls MODELLED-ONLY carry 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 BOUNDED keys on — a harness NAME, not the #[kani::proof] attribute, not a bound, not a cfg — 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-SOURCE is refused by the registry until one exists.
  • that a kani count 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 model count 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. asserted is the half a claim may rest on, and for a clause_of row 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.md carries the rest of that row.
  • that the reconstructed v1 column is an independent check on the registry’s word. It reads the two derivations assurance_gate.py already 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.

IDPropertyModelCoTraceKaniHardwareClaimed onOut of scopeFreshnessv1
SEC-REF-001R1sTokenStateRefinement1 of 200 of 00000MODELLED-ONLY
SEC-REF-002R1oTokenOutcomes1 of 200 of 00000MODELLED-ONLY
SEC-REF-003R1oOutcomeCoverage1 of 200 of 00000MODELLED-ONLY
SEC-REF-004R4bEventConsensus2 of 902 of 90000MODELLED-ONLY
SEC-REF-005NoAuthorizationBypassA1 of 200 of 00000MODELLED-ONLY
SEC-REF-006RequiredGateAgreesWithRelation0 of 100 of 00000MODELLED-ONLY
SEC-FIDO-001NoAuthorizationBypass5 of 50120 of 04034f52b720 stale (58 input(s) newer)BOUNDED
SEC-FIDO-002NoCrossTransportTouchConsumption5 of 4250 of 0203431c21a7 stale (3 input(s) newer)BOUNDED
SEC-FIDO-003NoTokenAfterInvalidation5 of 4560 of 0204031c21a7 stale (9 input(s) newer)BOUNDED
SEC-FIDO-004NoAccessibleSecretWithoutGate5 of 3920 of 0004031c21a7 stale (5 input(s) newer)MODELLED-ONLY
SEC-FIDO-005NoUnmanageableCredential5 of 4030 of 0004031c21a7 stale (6 input(s) newer)MODELLED-ONLY
SEC-FIDO-006ResetNeverWeakensSurvivingState5 of 4030 of 0104031c21a7 stale (4 input(s) newer)BOUNDED
SEC-FIDO-006AResetKeepsThePinGate1 of 210 of 01040b185fc3 stale (2 input(s) newer)BOUNDED
SEC-FIDO-006BResetKeepsTheAlwaysUvGate1 of 210 of 01040b185fc3 stale (2 input(s) newer)BOUNDED
SEC-FIDO-006CResetKeepsTheBackupSeal1 of 210 of 01040b185fc3 stale (2 input(s) newer)BOUNDED
SEC-FIDO-007RamNeverOutlivesFlashSeed4 of 510 of 001403e08f75 stale (9 input(s) newer)MODELLED-ONLY
SEC-FIDO-008NoLiveTokenWithoutPinRecord4 of 510 of 0004031c21a7 stale (4 input(s) newer)MODELLED-ONLY
SEC-FIDO-009OpAdvancesIsOneActivity1 of 200 of 00000MODELLED-ONLY
SEC-FIDO-L01EveryOpQuiesces2 of 300 of 00000MODELLED-ONLY
SEC-FIDO-L02EveryWaitReleases2 of 300 of 00000MODELLED-ONLY
SEC-FIDO-L03EveryWalkCloses2 of 300 of 00000MODELLED-ONLY
SEC-TRACE-001R4aRawRefinesB2 of 902 of 90000MODELLED-ONLY
SEC-TRACE-002R4bAlphaMatchesGamma1 of 801 of 80000MODELLED-ONLY
SEC-TRACE-004R4cGateAnswers2 of 902 of 90000MODELLED-ONLY
SEC-SEAM-001NoStatusOutsideItsSelection2 of 2951 of 200100MODELLED-ONLY
SEC-SEAM-002NoStatusAfterARefusedAuth2 of 2421 of 200100MODELLED-ONLY
SEC-SEAM-003NoKeyOpOnTheAdminStatus2 of 2851 of 200100MODELLED-ONLY
SEC-SEAM-004ReselectPreservesAccessStatus2 of 2311 of 20000MODELLED-ONLY
SEC-SEAM-005ExemptRefusalPreservesStatus2 of 2421 of 20000MODELLED-ONLY
SEC-SEAM-006AccessCodeRemovalNeedsTheCode2 of 2311 of 20040MODELLED-ONLY
SEC-STORE-001NoOrphanedMetadata2 of 1320 of 00040MODELLED-ONLY
SEC-STORE-002NoFalseAbsent2 of 1320 of 03040BOUNDED
SEC-STORE-003NoRecordLostToMetaWrite2 of 1510 of 00040MODELLED-ONLY
SEC-STORE-004NoFalseMetaAbsent2 of 1210 of 00040MODELLED-ONLY
SEC-STORE-005CacheHonest2 of 410 of 00040MODELLED-ONLY
SEC-STORE-006NoSilentOrphan2 of 1210 of 00040MODELLED-ONLY
SEC-LAT-001NoAuthWhenBlocked1 of 510 of 00040MODELLED-ONLY
SEC-LAT-002WrongAttemptIsCharged1 of 510 of 00040MODELLED-ONLY
SEC-LAT-003BudgetRisesOnlyWithItsSecret1 of 510 of 00040MODELLED-ONLY
SEC-POL-001PivOperationNeedsSlotPolicy1 of 1210 of 00040MODELLED-ONLY
SEC-POL-002PivAlwaysSpendsFreshness1 of 1210 of 00040MODELLED-ONLY
SEC-POL-003AttributeChangeInvalidatesTheKey1 of 1210 of 00040MODELLED-ONLY
SEC-POL-004OathCredentialNeedsItsGates1 of 1320 of 00034MODELLED-ONLY
SEC-POL-005OtpSlotMutationNeedsItsCode1 of 1210 of 00040MODELLED-ONLY
SEC-POL-006OtpCounterNeverRepeats1 of 1540 of 00040MODELLED-ONLY
SEC-ADM-001AdminSurfaceAlwaysReachable1 of 610 of 00100MODELLED-ONLY
SEC-ADM-002PrivilegedOpNeedsPresence1 of 610 of 00034MODELLED-ONLY
SEC-ADM-003DisableSetSurvivesLockWrite1 of 610 of 00000MODELLED-ONLY
SEC-ADM-004DisabledAppletNeverDispatches1 of 610 of 00040MODELLED-ONLY
SEC-DISP-001ConfirmNamesTheOperation1 of 510 of 000030MODELLED-ONLY
SEC-DISP-002StaleTouchApprovesNothing1 of 510 of 000030MODELLED-ONLY
SEC-DISP-003OnlyAllowConfirms1 of 510 of 000030MODELLED-ONLY
SEC-BOOT-001MarkerNeverLies4 of 1320 of 00040MODELLED-ONLY
SEC-BOOT-002TheWholeLockRides3 of 810 of 00040MODELLED-ONLY
SEC-TRANS-001NoCrossChannelSplice1 of 510 of 020100BOUNDED
SEC-TRANS-002NoSequenceGap1 of 510 of 010100BOUNDED
SEC-TRANS-003NoBufferOverrun1 of 510 of 010100BOUNDED
SEC-RISK-001PerDeviceAttestationCertIsACorrelationHandle0 of 000 of 00000ACCEPTED-RISK
SEC-RISK-002FlashSnapshotRollsBackPinRetries0 of 000 of 00000ACCEPTED-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.

ColumnKindPublishedPlacedUnplaced
firmwarepackageyes400
firmware-no-touchpackageno733
firmware-fipspackageyes337
firmware-pqcpackageyes337
firmware-fips-pqcpackageyes337
firmware-no-touch-pqcpackageno733
firmware-no-touch-fipspackageno733
firmware-no-touch-fips-pqcpackageno733
firmware-strong-pinpackageyes337
firmware-strong-pin-pqcpackageyes337
firmware-always-uvpackageyes337
firmware-always-uv-pqcpackageyes337
firmware-strict-uppackageyes337
firmware-strict-up-pqcpackageyes337
firmware-picopackageno400
firmware-displaypackageyes040
firmware-2mbpackageyes931
firmware-16mbpackageyes931
firmware-strict-configpackageyes337
keygen-benchfeatureno337
core1-statsfeatureno337
benchfeatureno337
fido-conformancefeatureno337
ea-conformance-rpidfeatureno337
largeblob-extfeatureno337
abrobot-16mboardno931
abrobot-4mboardno364
seeed-xiaoboardno931
tenstar-usbboardno931
waveshare-oneboardno400
waveshare-touch-lcdboardno931

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.

KindSubjectWhat is outstanding
bundleSEC-FIDO-00158 input(s) newer than f52b720
bundleSEC-FIDO-0023 input(s) newer than 31c21a7
bundleSEC-FIDO-0039 input(s) newer than 31c21a7
bundleSEC-FIDO-0045 input(s) newer than 31c21a7
bundleSEC-FIDO-0056 input(s) newer than 31c21a7
bundleSEC-FIDO-0064 input(s) newer than 31c21a7
bundleSEC-FIDO-006A2 input(s) newer than b185fc3
bundleSEC-FIDO-006B2 input(s) newer than b185fc3
bundleSEC-FIDO-006C2 input(s) newer than b185fc3
bundleSEC-FIDO-0079 input(s) newer than 3e08f75
bundleSEC-FIDO-0084 input(s) newer than 31c21a7
bundleSEC-ADM-002no raw evidence bundle
bundleSEC-ADM-004no raw evidence bundle
bundleSEC-BOOT-001no raw evidence bundle
bundleSEC-BOOT-002no raw evidence bundle
bundleSEC-DISP-001no raw evidence bundle
bundleSEC-DISP-002no raw evidence bundle
bundleSEC-DISP-003no raw evidence bundle
bundleSEC-LAT-001no raw evidence bundle
bundleSEC-LAT-002no raw evidence bundle
bundleSEC-LAT-003no raw evidence bundle
bundleSEC-POL-001no raw evidence bundle
bundleSEC-POL-002no raw evidence bundle
bundleSEC-POL-003no raw evidence bundle
bundleSEC-POL-004no raw evidence bundle
bundleSEC-POL-005no raw evidence bundle
bundleSEC-POL-006no raw evidence bundle
bundleSEC-SEAM-001no raw evidence bundle
bundleSEC-SEAM-002no raw evidence bundle
bundleSEC-SEAM-003no raw evidence bundle
bundleSEC-SEAM-006no raw evidence bundle
bundleSEC-STORE-001no raw evidence bundle
bundleSEC-STORE-002no raw evidence bundle
bundleSEC-STORE-003no raw evidence bundle
bundleSEC-STORE-004no raw evidence bundle
bundleSEC-STORE-005no raw evidence bundle
bundleSEC-STORE-006no raw evidence bundle
bundleSEC-TRANS-001no raw evidence bundle
bundleSEC-TRANS-002no raw evidence bundle
bundleSEC-TRANS-003no raw evidence bundle
platformPLAT-RESET-001A real RP2350 power-on reset clears WATCHDOG.scratch2, so the PIN so
platformPLAT-ROM-001M7-Q2: the boot ROM’s BOOTSEL return path leaves WATCHDOG.scratch2 a
platformPLAT-FLASH-001The silicon’s program/erase tear behaviour under a real supply cut is
platformPLAT-OTP-001OTP read permissions, lock state and the chaffing layout behave as the
platformPLAT-INPUT-001A PC/SC reader’s FEATURE_VERIFY_PIN_DIRECT layer carries the PIN to
platformPLAT-TOOL-001A green tools/emu run is a protocol result, not a device result: the
platformPLAT-TOOL-002tools/emu implements the same authorization gates as the firmware, s
platformPLAT-TOOL-003Kani/CBMC is sound for the arithmetic its harnesses bound, and the sol
platformPLAT-TOOL-004TLC is sound for the finite configurations it checks, and the verdict
platformPLAT-TOOL-005Kani proves the presence arbiter’s cross-executor flags under a SEQUEN
platformPLAT-TOOL-006The fuzz axis counts a FILE that names the invariant, not a run of i
platformPLAT-TOOLCHAIN-001The compiler on the path is the pinned rustc and its output is what th
platformPLAT-TOOLCHAIN-002docs/unsafe.md is the enumeration of the first-party unsafe sites: e
platformPLAT-UNSAFE-002SendUsb is sound: embassy_usb::UsbDevice is !Send only for the `
platformPLAT-UNSAFE-003HEAP.init runs exactly once, over a static buffer nothing else touch
platformPLAT-UNSAFE-004Each of the eight build-selected GPIOs handed to AnyPin::steal has e
platformPLAT-UNSAFE-005The two static mut prime sieves are single-core-exclusive: `CORE0_SI
platformPLAT-UNSAFE-006Each core programs MSPLIM once, on the core that owns that stack, befo
platformPLAT-UNSAFE-007The three FFI calls into the vendored ARM assembly pass fully owned, l
platformPLAT-UNSAFE-008The wiper’s two ROM flash sequences run with interrupts off and XIP di
platformPLAT-UNSAFE-010The two link_section image-definition statics are placed by the link
platformPLAT-UNSAFE-011The small-prime table and the sieve step are placed in `.data.small_pr
platformPLAT-UNSAFE-012The three unsafe extern blocks declare what they name: the RSA assem
platformPLAT-CRYPTO-001The HMAC-SHA-256 under pinUvAuthProtocol is correct as a MAC; the ha
platformPLAT-BUILD-002ea-conformance-rpid’s enterprise-attestation allowlist is a conforma
platformPLAT-BUILD-003The display build implements the one-hold-one-ceremony latch SOMEWHE
platformPLAT-BUILD-004On the four no-touch images no presence DECISION is produced at all
platformPLAT-THREAT-001A CTAPHID channel id is a routing label the sender writes, so channel
platformPLAT-THREAT-002A PIN-derived record stays rooted in the public chip serial until its
platformPLAT-MODEL-001PermSets’s five subsets are a SCOPE and not a description: a host ca
platformPLAT-MODEL-009EF_MINPINLEN’s FLOOR (byte 0) and its RP-id disclosure list (bytes 2
platformPLAT-MODEL-011EF_DEVICE_PIN is outside RSKeySecurityState because the SURFACE it
platformPLAT-MODEL-003The model’s ram is FidoState::keydev_dec.is_some() and nothing els
platformPLAT-MODEL-004One store.seed boolean stands for two flash records, so the soft-loc
platformPLAT-MODEL-005DeviceUnlock’s store.seed conjunct is what makes `RamNeverOutlives
platformPLAT-MODEL-006RamNeverOutlivesFlashSeed is INERT on the shipped configuration: it
platformPLAT-MODEL-007The C-tier reset bridge cannot be reused as bounded evidence for the s
platformPLAT-MODEL-002One credential per relying party is enough to carry the authorization
platformPLAT-MODEL-012gate.ppuatStale has no counterpart in the firmware. The model carrie
platformPLAT-MODEL-013The two Kani harnesses named for this property cover the SESSION token
platformPLAT-MODEL-015RSKeyBootHardening treats the lazy re-key as ATOMIC in thirteen of i
platformPLAT-TRNG-002The RAW ring-oscillator source clears the floor the shipped whitening
platformPLAT-TIMER-002The 32-bit alarm comparator survives its own wrap. embassy-rp arms `
platformPLAT-TIMER-003The timebase ADVANCES: RP2350 TIMER0’s counter keeps counting for as
platformPLAT-XIP-001Core 1 is paused for the whole of every flash erase or program, so no
platformPLAT-DISPLAY-001A panel update completes before the firmware treats the card as shown,
platformPLAT-TRACE-001A trace-linked claim rests on the fields the recorded session VARIES;
platformPLAT-TRACE-002No recorded session reaches this property. `grep -lw NoTokenAfterInval
platformPLAT-PRES-001Owners — the four SCOPE_* bytes plus Panel, the model-only split
platformPLAT-PRES-002No API in the tree can originate a cancel from SCOPE_CCID or from an
platformPLAT-PRES-003NoCrossTransportTouchConsumption’s structural conjunct — `(pres.gran
platformPLAT-SOURCE-001The revoke-before-write ORDER that the first conjunct of `NoTokenAfter
platformPLAT-SOURCE-002Three of the citations that carry this property’s model-to-code bridge
platformPLAT-GRANT-001NoAccessibleSecretWithoutGate’s ghost clause is DEAD by construction
platformPLAT-GRANT-002The C-tier reset bridge cannot express this property, and a field for
platformPLAT-GRANT-003FixPpuatRequiresPin’s FALSE arm is unobserved: the one configuration
platformPLAT-CRED-001r \in store.rpent is read as `the EF_RP record for r is reachable by
platformPLAT-CRED-002No action of RSKeySecurityState can fail a flash write: the model’s
platformPLAT-CRED-003KeepOpen equates the seed that opens it is gone with `the record i
platformPLAT-TOKEN-001RSKeySecurityState’s tok.live is FidoState::paut.in_use and its
platformPLAT-TOKEN-002One pin.set boolean stands for one record. EF_DEVICE_PIN, the trus
platformPLAT-TOKEN-003clientpin::issue_token is the only production maker of a live pinUvA
platformPLAT-TOKEN-004reset() is the only modelled deleter of EF_PIN and it is not the o
platformPLAT-TOKEN-005No existing bounded proof can be reused as evidence for this invariant
platformPLAT-PINGATE-001SEC-FIDO-006A’s only bounded evidence carries a non-vacuity guard th
platformPLAT-PINGATE-002SEC-FIDO-006A’s isolated RED is a localisation and not a demonstrati
platformPLAT-AUVGATE-001ResetKeepsTheAlwaysUvGate has no falsifying state wherever `AlwaysUv
platformPLAT-AUVGATE-002The model’s consequent for this clause is the alwaysUv FLAG and the Ru
platformPLAT-ORACLE-001Below the model tier nothing can report ResetKeepsThePinGate rather
platformPLAT-SEAL-001EF_BACKUP_SEALED is one byte on flash and every tier models it as one
platformPLAT-SEAL-002This clause’s model verdict and its co-refutation credit both come fro
platformPLAT-SEAL-003The TLA+ clause and its Rust abstraction do not state the same sentenc
platformPLAT-SEAL-004The shipped image is built without --features fips-profile. On that
platformPLAT-SEAL-005The marker’s SECOND consumer — the on-device recovery-phrase reveal at
platformPLAT-STORE-001The tear guarantee PLAT-FLASH-001 makes about the silicon holds one la
platformPLAT-STORE-002The backend’s enumeration-completeness flag is honest: for_each_key
platformPLAT-STORE-003GIVEN a medium that tears the way PLAT-FLASH-001 asserts, a reboot rec
platformPLAT-STORE-004is_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.

ArtifactRegenerated by
docs/assurance-vector.mdpython scripts/evidence_gate.py
docs/assurance-matrix.mdpython scripts/matrix_gate.py
docs/platform-assumptions.mdpython scripts/platform_gate.py
formal/README.mdpython scripts/assurance_gate.py

Model runs this tree publishes counts from.

TierCommandTakenAgainstHost
liveness./formal/run-tlc.sh liveness2026-09-199f0fcccApple M5 Pro (18 cores)
safety./formal/run-tlc.sh safety2026-09-199f0fcccApple 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.