2026-11-03 upgrade
- derive_outcome reads a closed vocabulary: verdicts are lower-cased and trimmed, and any other word, None, a missing verdict, a boolean, or 'allow' on a stage that reports ran=false is read as 'unavailable' (an enforcing unavailable stage blocks)
- A stage entry that is not an object is an enforcing unavailable stage (it used to raise AttributeError)
- An empty stage list with enforcement on is BLOCKED (it used to be ALLOWED)
- The reported verdict is kept as verdict_as_reported on the copy, so the evidence shows what the stage actually said
- /fabric/try returns 400 for a JSON body that is not an object
- Blind set 1 now skips /fabric/sso/scim-token
tests/test_fail_closed_vocabulary.py 18 new tests; 86 stage tests and 352 gateway fabric/proof/simulator tests pass unchanged.
FIRME AI CORPORATION · CAIN-42 is a Byzantine trust fabric. Numbers marked "our own check" were run by us, not by an independent party. Nothing on these pages is a certification.