schema engine: jsonschema 4.26.0 (Draft202012Validator)
fixtures: spring, agrippa, mossy, now, board; vectors: 71 (42 projection, 35 negative: 5 v3.1, 17 v3.2, 7 v3.3, 6 v3.4)
PASS schema-descriptions
PASS schema:spring
PASS schema:spring:situation.schema.json
PASS schema:spring:state.schema.json
PASS schema:spring:diff.schema.json
PASS schema:spring:diff.schema.json
PASS schema:spring:relationship.schema.json
PASS schema:agrippa
PASS schema:agrippa:situation.schema.json
PASS schema:agrippa:state.schema.json
PASS schema:agrippa:diff.schema.json
PASS schema:agrippa:relationship.schema.json
PASS schema:mossy
PASS schema:mossy:situation.schema.json
PASS schema:mossy:state.schema.json
PASS schema:mossy:diff.schema.json
PASS schema:now
PASS schema:now:now.schema.json
PASS schema:now:MarketStrip
PASS schema:board
PASS schema:board:Board
PASS semantics:spring
PASS reproject:spring
PASS words:spring
PASS member-only:spring
PASS no-score:spring
PASS semantics:agrippa
PASS reproject:agrippa
PASS words:agrippa
PASS member-only:agrippa
PASS no-score:agrippa
PASS semantics:mossy
PASS reproject:mossy
PASS words:mossy
PASS member-only:mossy
PASS no-score:mossy
PASS words:now
PASS member-only:now
PASS no-score:now
PASS words:board
PASS member-only:board
PASS no-score:board
PASS null-reason-catalogue (61 reasons)
PASS em-dash:contract
PASS vector:V01
PASS vector:V02
PASS vector:V03
PASS vector:V04
PASS vector:V05
PASS vector:V06
PASS vector:V07
PASS vector:V08
PASS vector:V09
PASS vector:V10
PASS vector:V11
PASS vector:V12
PASS vector:V13
PASS vector:V14
PASS vector:V15
PASS vector:V16
PASS vector:V17
PASS vector:V18
PASS vector:V19
PASS vector:V20
PASS vector:V21
PASS vector:V22
PASS vector:V23
PASS vector:V24
PASS vector:V25
PASS vector:V26
PASS vector:V27
PASS vector:V28
PASS vector:V29
PASS vector:V30
PASS vector:V31
PASS vector:V32
PASS vector:V33
PASS vector:V34
PASS vector:V35
PASS vector:V36
PASS vector:V37
PASS vector:V39
PASS vector:V42
PASS vector:V55
PASS vector:V56
PASS vector:V57
PASS vector-coverage (71 vectors, 42 projection)
PASS v31-vectors-unchanged (V37 to V41 byte-equal to v3.1)
PASS v32-vectors-migrated (V01 to V58 equal legacy-v32/state-vectors-v32-migrated.json apart from descriptions; no run-time map)
PASS v33-vectors-unchanged (V01 to V65 byte-equal to v3.3)
PASS no-v32-names (0 in 5 fixtures and the 65 earlier vectors)
PASS negative:V37=V21 (v3.4 pass; v3 fails: state safety_changed != developing; rule R1b != R5a; sentence 'Safety event: synthetic future event, -38006640 min ago.' !~ ^No light is on now\.$; se)
PASS negative:V38=V22 (v3.4 pass; v3 fails: v3 schema accepts {"realSolReserve": {"value": {"nonsense": true}, "reason": null, "unit": "usd"}, "virtualS...)
PASS negative:V39=V23 (v3.4 pass; v3 fails: state early_money_leaving != developing; rule R2 != R5b; sentence 'An attention light is on while early-cohort retention fell 70 points in the last 6 )
PASS negative:V40=V24 (v3.4 pass; v3 fails: case quiet-pool: lagSec 3629 != 4; case seek-after-archive-refusal: lagSec 119 (None) != null with 'no covered cursor: reading resumed at a seek curso)
PASS negative:V41=V25 (v3.4 pass; v3 fails: row 0 phantom False != None; row 1 phantom False != 'unverified'; row 2 phantom True != 'unverified'; row 2 unchanged 'absent' != True; row 2 provider)
PASS negative:V42=V26 (v3.4 pass; v3.1 fails: state early_money_leaving != unknown; rule R2 != R2u; reason None != 'retention_unavailable'; sentence 'An attention light is on while early-cohort re)
PASS negative:V43=V27 (v3.4 pass; v3.1 fails: row 1 phantom True != 'unverified'; row 1 removed True != False; counts.removed 1 != 0; counts.unverified 0 != 1; counts.phantom 1 != 0; denominators.)
PASS negative:V44=V28 (v3.4 pass; v3.1 fails: row 1 phantom False != 'unverified'; counts.unverified 0 != 1; denominators.phantom 1 != 0)
PASS negative:V45=V29 (v3.4 pass; v3.1 fails: case measuredAt-null: lagSec 4 (None) != null with 'head_unmeasured'; case bolo-pass12-probe: lagSec 4 (None) != null with 'head_unmeasured')
PASS negative:V46=V30 (v3.4 pass; v3.1 fails: case covered-101-head-100: lagSec 4 (None) != null with 'head_inconsistent')
PASS negative:V47=V31 (v3.4 pass; v3.1 fails: case 0 (2026-09-27T10:59:59Z): refused False != True; case 0 (2026-09-27T10:59:59Z): reason None != 'history not kept before 2026-09-27T11:00:00Z'; ca)
PASS negative:V48=V32 (v3.4 pass; v3.1 fails: case 0 (2026-09-14T12:00:00Z): basis 'rpc_supply' != 'assumed_supply'; case 2 (2026-09-17T12:00:00Z): basis 'rpc_supply' != 'assumed_supply')
PASS negative:V49=V33 (v3.4 pass; v3.1 fails: case 0 (2026-09-27T11:50:00Z): value 33 != 100)
PASS negative:V50=V34 (v3.4 pass; v3.1 fails: case 0 (): cumulativeDistinctEntrants 5 != 3; case 0 (): bars [3, 2] != [2, 1])
PASS negative:V51=V35 (v3.4 pass; v3.1 fails: case 0 (2026-09-27T11:30:00Z): symbols ['ASTER', 'BRAVO'] != ['ASTER'])
PASS negative:V52=V36 (v3.4 pass; v3.1 fails: case 0 (2026-09-27T11:10:03Z): count 2 != 1; case 0 (2026-09-27T11:10:03Z): lastPrice '2' != '1')
PASS negative:V53=V37 (v3.4 pass; v3.1 fails: case 0 (): reason None != 'provider tick is not a tape read; not admitted')
PASS negative:V54=V38 (v3.4 pass; v3.1 fails: case 0 (): reason None != 'material event names no anchor; not admitted')
PASS negative:V55=H1 (v3.4 pass; v3.1 fails: raised TypeError: can't compare offset-naive and offset-aware datetimes)
PASS negative:V56=H2 (v3.4 pass; v3.1 fails: state safety_changed != developing; rule R1b != R5a; sentence 'Safety event: synthetic clock probe, 10 min ago.' !~ ^No light is on now\.$; sentence ')
PASS negative:V57=H3 (v3.4 pass; v3.1 fails: state safety_changed != developing; rule R1b != R5a; sentence 'Safety event: synthetic clock probe, 10 min ago.' !~ ^No light is on now\.$; sentence ')
PASS negative:V58=H4 (v3.4 pass; v3.1 fails: case sol-999-for-1e9-lamports: admitted True != False)
PASS negative:V59=B6-1 (v3.4 pass; v3.2 fails: case 2 (2026-09-27T12:10:00Z): bars [0, 0] != [0, 1]; case 2 (2026-09-27T12:10:00Z): lateEvidence 'absent' != True; case 2 (2026-09-27T12:10:00Z): ear)
PASS negative:V60=B6-2 (v3.4 pass; v3.2 fails: case bolo-2099-event (): reason None != 'evidence clock after its availability; not admitted'; case bolo-2099-not-latest (2026-09-14T17:27:30Z): lates)
PASS negative:V61=B6-3 (v3.4 pass; v3.2 fails: case price-NaN (): reason None != 'price is not a finite positive decimal; not admitted'; case price-Infinity (): reason None != 'price is not a finit)
PASS negative:V62=P2-anchor (v3.4 pass; v3.2 fails: case 0 (): moveAts ['2026-09-27T10:10:00Z', '2026-09-27T10:30:00Z'] != ['2026-09-27T10:10:00Z']; case 0 (): anchors [{'kind': 'first_seen', 'at': '202)
PASS negative:V63=P3-seam (v3.4 pass; v3.2 fails: case relabel-as-tape-usd (): reason None != 'usd basis misdeclared; not admitted'; case product-mismatch (): reason None != 'conversion_mismatch'; cas)
PASS negative:V64=P3-consequences (v3.4 pass; v3.2 fails: case 0 (2026-09-27T10:00:10Z): mcValue 4500000.0 != None; case 0 (2026-09-27T10:00:10Z): mcReason None != 'no USD price at this moment'; case 0 (2026-)
PASS negative:V65=P3-absence (v3.4 pass; v3.2 fails: case 0: ValueError noclock: None; case 1: ValueError noclock: None; case 2: ValueError noclock: None; case 3: ValueError noclock: None)
PASS negative:V66=I2-historyFrom (v3.4 pass; v3.3 fails: case historyFrom-only: KeyError 'history'; case history-and-historyFrom (2026-09-27T11:30:00Z): refused False != True; case history-and-historyFrom (2)
PASS negative:V67=I2-estimate (v3.4 pass; v3.3 fails: case 0 (2026-09-27T11:30:00Z): symbols ['DEAD'] != []; case 0 (2026-09-27T11:30:00Z): refusals [] != [['DEAD', 'market.marketCap.basis', 'value assume)
PASS negative:V68=I2-anchor (v3.4 pass; v3.3 fails: case v32-event (): reason 'material event names no anchor; not admitted' != 'value previous_same_kind is a v3.2 name, not in the contract (previous_ma)
PASS negative:V69=I2-price (v3.4 pass; v3.3 fails: case v33-read-plus-price (): reason 'price read has fields outside the contract; not admitted' != 'key price is a v3.2 name, not in the contract (nati)
PASS negative:V70=I4-page-minute (v3.4 pass; v3.3 fails: case minute-30 (): moment '2026-09-14T16:57:00Z' != '2026-09-14T16:57:30Z'; case minute-0 (): moment '2026-09-14T16:27:00Z' != '2026-09-14T16:27:30Z';)
PASS negative:V71=I5-entry-cap (v3.4 pass; v3.3 fails: case present: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case absent-no-read: LookupError v3.3 defines no entry)
PASS v33-record (every item 2 case's recorded v3.3 callable and schema answer re-run against legacy-v33/)
PASS board-entry-cap (staging/board.json schema-valid; SPRING entry 17:11Z on the 16:57Z read: ~$1.68M, estimate; fixtures/board.json has no entryCap and equals v3.3's)
PASS page-minute (pass 7 clocks 16:32:30, 16:42:30, 16:57:30Z are rail minutes 5, 15, 30 of asOf 17:27:30Z)
PASS gate:future-light
PASS gate:retention-noclock
PASS gate:retention-admitted
PASS curve:mossy-shape
PASS print:covered-phantom-removed
PASS print:interval-union
PASS print:covered-noncandidate
PASS lag:head-after-asOf
PASS clocks:parse (11 forms)
PASS now-v33 (Now at t recomputes every row; SPRING strings equal pass 7 NOTES (c) at 17:27, 16:57, 16:42, 16:32; no leak; SPRING derivation byte-equal to v3.2 under the 23:35 anchor pin)
PASS any-word (49 ordered pairs, 7 outcomes: six words and unknown)

negative vectors, before and after (V37 to V41: before = v3, legacy-v3/; V42 to V58: before = v3.1, legacy-v31/; V59 to V65: before = v3.2, legacy-v32/; V66 to V71: before = v3.3, legacy-v33/):
  V37 = brief V21 (Bolo 1: future or unavailable evidence)
    v3:   FAIL: state safety_changed != developing; rule R1b != R5a; sentence 'Safety event: synthetic future event, -38006640 min ago.' !~ ^No light is on now\.$; sentence 'Safety event: synthetic future event, -38006640 min ago.' matches forbidden -\d|safety; inadmissible [] != [{'input': 'safetyEvent', 'reason': 'evidence available after asOf; not admitted'}]
    v3.4: pass
  V38 = brief V22 (Bolo 2: BondingCurve schema)
    v3:   FAIL: v3 schema accepts {"realSolReserve": {"value": {"nonsense": true}, "reason": null, "unit": "usd"}, "virtualS...
    v3.4: pass
  V39 = brief V23 (Bolo 3: missing capability is not true)
    v3:   FAIL: state early_money_leaving != developing; rule R2 != R5b; sentence 'An attention light is on while early-cohort retention fell 70 points in the last 6 h, by RPC read.' !~ ^One light on: a caller call, 10 min ago\. Holders: source support not reported; not computed\. Tape: source support not reported; not computed\.$; refused [] != ['early_money_leaving', 'crowd_arriving']; refusal basis [] != ['support_unreported', 'support_unreported']
    v3.4: pass
  V40 = brief V24 (Bolo 4: PoolRow lag)
    v3:   FAIL: case quiet-pool: lagSec 3629 != 4; case seek-after-archive-refusal: lagSec 119 (None) != null with 'no covered cursor: reading resumed at a seek cursor after an archive refusal'
    v3.4: pass
  V41 = brief V25 (Bolo 5: print flags)
    v3:   FAIL: row 0 phantom False != None; row 1 phantom False != 'unverified'; row 2 phantom True != 'unverified'; row 2 unchanged 'absent' != True; row 2 providerStale 'absent' != True; row 2 removed True != False; row 3 phantom False != None; counts.removed 'absent' != 0; counts.unverified 'absent' != 1; counts.phantom 'absent' != 0; counts.unchanged 'absent' != 1; counts.providerStale 'absent' != 1; denominators.phantom 'absent' != 0; denominators.unchanged 'absent' != 3; denominators.providerStale 'absent' != 3; denominators.misquote 'absent' != 1
    v3.4: pass
  V42 = brief V26 (Bolo pass12 1: retention availability gate)
    v3.1: FAIL: state early_money_leaving != unknown; rule R2 != R2u; reason None != 'retention_unavailable'; sentence 'An attention light is on while early-cohort retention fell 70 points in the last 6 h, by RPC read.' !~ ^State not computed: the early-cohort retention read is not available at this moment\.$; sentence 'An attention light is on while early-cohort retention fell 70 points in the last 6 h, by RPC read.' matches forbidden early money|fell; inadmissible [] != [{'input': 'retention', 'reason': 'evidence available after asOf; not admitted'}]
    v3.4: pass
  V43 = brief V27 (Bolo pass12 2: phantom absence needs interval coverage)
    v3.1: FAIL: row 1 phantom True != 'unverified'; row 1 removed True != False; counts.removed 1 != 0; counts.unverified 0 != 1; counts.phantom 1 != 0; denominators.phantom 1 != 0
    v3.4: pass
  V44 = brief V28 (Bolo pass12 3: phantom denominator counts only covered candidates)
    v3.1: FAIL: row 1 phantom False != 'unverified'; counts.unverified 0 != 1; denominators.phantom 1 != 0
    v3.4: pass
  V45 = brief V29 (Bolo pass12 4a: lag needs a measured head)
    v3.1: FAIL: case measuredAt-null: lagSec 4 (None) != null with 'head_unmeasured'; case bolo-pass12-probe: lagSec 4 (None) != null with 'head_unmeasured'
    v3.4: pass
  V46 = brief V30 (Bolo pass12 4b: lag needs a consistent head)
    v3.1: FAIL: case covered-101-head-100: lagSec 4 (None) != null with 'head_inconsistent'
    v3.4: pass
  V47 = brief V31 (Now: history boundary)
    v3.1: FAIL: case 0 (2026-09-27T10:59:59Z): refused False != True; case 0 (2026-09-27T10:59:59Z): reason None != 'history not kept before 2026-09-27T11:00:00Z'; case 1 (2026-09-27T11:00:00Z): symbols ['ASTER', 'BRAVO'] != []
    v3.4: pass
  V48 = brief V32 (Now: supply validity is not back-projected)
    v3.1: FAIL: case 0 (2026-09-14T12:00:00Z): basis 'rpc_supply' != 'assumed_supply'; case 2 (2026-09-17T12:00:00Z): basis 'rpc_supply' != 'assumed_supply'
    v3.4: pass
  V49 = brief V33 (Now: stable first-seen baseline)
    v3.1: FAIL: case 0 (2026-09-27T11:50:00Z): value 33 != 100
    v3.4: pass
  V50 = brief V34 (Now: a repeat buy counts once)
    v3.1: FAIL: case 0 (): cumulativeDistinctEntrants 5 != 3; case 0 (): bars [3, 2] != [2, 1]
    v3.4: pass
  V51 = brief V35 (Now: a row surfaced after t is absent at t)
    v3.1: FAIL: case 0 (2026-09-27T11:30:00Z): symbols ['ASTER', 'BRAVO'] != ['ASTER']
    v3.4: pass
  V52 = brief V36 (Now: a read available after t is absent at t)
    v3.1: FAIL: case 0 (2026-09-27T11:10:03Z): count 2 != 1; case 0 (2026-09-27T11:10:03Z): lastPrice '2' != '1'
    v3.4: pass
  V53 = brief V37 (Now: a provider tick is never basis tape)
    v3.1: FAIL: case 0 (): reason None != 'provider tick is not a tape read; not admitted'
    v3.4: pass
  V54 = brief V38 (Now: a material event without an anchor is refused)
    v3.1: FAIL: case 0 (): reason None != 'material event names no anchor; not admitted'
    v3.4: pass
  V55 = brief H1 (Bolo pass12 hardening: malformed clocks)
    v3.1: FAIL: raised TypeError: can't compare offset-naive and offset-aware datetimes
    v3.4: pass
  V56 = brief H2 (Bolo pass12 hardening: malformed clocks)
    v3.1: FAIL: state safety_changed != developing; rule R1b != R5a; sentence 'Safety event: synthetic clock probe, 10 min ago.' !~ ^No light is on now\.$; sentence 'Safety event: synthetic clock probe, 10 min ago.' matches forbidden safety; inadmissible [] != [{'input': 'safetyEvent', 'reason': 'evidence clock offset is not a valid UTC offset; not admitted'}]
    v3.4: pass
  V57 = brief H3 (Bolo pass12 hardening: malformed clocks)
    v3.1: FAIL: state safety_changed != developing; rule R1b != R5a; sentence 'Safety event: synthetic clock probe, 10 min ago.' !~ ^No light is on now\.$; sentence 'Safety event: synthetic clock probe, 10 min ago.' matches forbidden safety; inadmissible [] != [{'input': 'safetyEvent', 'reason': 'evidence clock offset is not a valid UTC offset; not admitted'}]
    v3.4: pass
  V58 = brief H4 (Bolo pass12 hardening: native-quote conversion)
    v3.1: FAIL: case sol-999-for-1e9-lamports: admitted True != False
    v3.4: pass
  V59 = brief B6-1 (Bolo B6 1: entrants are observed-first and immutable per interval)
    v3.2: FAIL: case 2 (2026-09-27T12:10:00Z): bars [0, 0] != [0, 1]; case 2 (2026-09-27T12:10:00Z): lateEvidence 'absent' != True; case 2 (2026-09-27T12:10:00Z): earliestChainBuyAt 'absent' != '2026-09-27T11:00:00Z'; case 3 (2026-09-27T13:00:00Z): bars [0, 0] != [0, 1]; case bolo-exact-call (): bars [0] != [1]
    v3.4: pass
  V60 = brief B6-2 (Bolo B6 2: source clock never after availability; anchor never after the event)
    v3.2: FAIL: case bolo-2099-event (): reason None != 'evidence clock after its availability; not admitted'; case bolo-2099-not-latest (2026-09-14T17:27:30Z): latestAt '2099-01-01T00:00:00Z' != None; case anchor-after-event (): reason None != 'anchor after the event; not admitted'; case price-read-at-after-availableAt (): reason 'evidence carries no availableAt; not admitted' != 'evidence clock after its availability; not admitted'
    v3.4: pass
  V61 = brief B6-3 (Bolo B6 hardening: price admission binds the schema boundary at runtime)
    v3.2: FAIL: case price-NaN (): reason None != 'price is not a finite positive decimal; not admitted'; case price-Infinity (): reason None != 'price is not a finite positive decimal; not admitted'; case price--1 (): reason None != 'price is not a finite positive decimal; not admitted'; case price-0 (): reason None != 'price is not a finite positive decimal; not admitted'
    v3.4: pass
  V62 = brief P2-anchor (23:35 pin: price-move anchor is the previous material event of any kind)
    v3.2: FAIL: case 0 (): moveAts ['2026-09-27T10:10:00Z', '2026-09-27T10:30:00Z'] != ['2026-09-27T10:10:00Z']; case 0 (): anchors [{'kind': 'first_seen', 'at': '2026-09-27T10:00:00Z'}, {'kind': 'previous_same_kind', 'at': '2026-09-27T10:10:00Z'}] != [{'kind': 'previous_same_kind', 'at': '2026-09-27T10:00:00Z'}]
    v3.4: pass
  V63 = brief P3-seam (B2 seam: typed native quote, USD basis supported by the read)
    v3.2: FAIL: case relabel-as-tape-usd (): reason None != 'usd basis misdeclared; not admitted'; case product-mismatch (): reason None != 'conversion_mismatch'; case conversion-clock-order (): reason None != 'evidence clock after its availability; not admitted'; case usd-unavailable (): reason 'provider tick is not a tape read; not admitted' != None; case provider-basis-without-conversion (): reason None != 'usd basis misdeclared; not admitted'
    v3.4: pass
  V64 = brief P3-consequences (B2 seam: USD-derived fields use only reads with USD at t)
    v3.2: FAIL: case 0 (2026-09-27T10:00:10Z): mcValue 4500000.0 != None; case 0 (2026-09-27T10:00:10Z): mcReason None != 'no USD price at this moment'; case 0 (2026-09-27T10:00:10Z): changeReason 'one read on our tape; no change yet' != 'no USD price at this moment'; case 0 (2026-09-27T10:00:10Z): gapReasons 'absent' != ['usd conversion unavailable']; case 1 (2026-09-27T10:05:00Z): gapReasons 'absent' != []; case 2: TypeError conversion from NoneType to Decimal is not supported
    v3.4: pass
  V65 = brief P3-absence (B2 seam: explicit absence of surface and state evidence)
    v3.2: FAIL: case 0: ValueError noclock: None; case 1: ValueError noclock: None; case 2: ValueError noclock: None; case 3: ValueError noclock: None
    v3.4: pass
  V66 = brief I2-historyFrom (v3.4 item 2: a Now document carrying historyFrom is refused, naming the key)
    v3.3: FAIL: case historyFrom-only: KeyError 'history'; case history-and-historyFrom (2026-09-27T11:30:00Z): refused False != True; case history-and-historyFrom (2026-09-27T11:30:00Z): reason None != 'key historyFrom is a v3.2 name, not in the contract (history.since); not admitted'
    v3.4: pass
  V67 = brief I2-estimate (v3.4 item 2: a market cap carrying basis assumed_supply is refused, naming the value)
    v3.3: FAIL: case 0 (2026-09-27T11:30:00Z): symbols ['DEAD'] != []; case 0 (2026-09-27T11:30:00Z): refusals [] != [['DEAD', 'market.marketCap.basis', 'value assumed_supply is a v3.2 name, not in the contract (estimate); not admitted']]
    v3.4: pass
  V68 = brief I2-anchor (v3.4 item 2: the v3.2 anchor kind and threshold sentence are refused, naming them)
    v3.3: FAIL: case v32-event (): reason 'material event names no anchor; not admitted' != 'value previous_same_kind is a v3.2 name, not in the contract (previous_material); not admitted'; case v32-threshold-v33-anchor (): reason None != "threshold '>= 25% against the previous price move' is v3.2 wording, not in the contract ('>= 25% against the price at the previous material event'); not admitted"
    v3.4: pass
  V69 = brief I2-price (v3.4 item 2: a price read carrying a bare price is refused, naming the key)
    v3.3: FAIL: case v33-read-plus-price (): reason 'price read has fields outside the contract; not admitted' != 'key price is a v3.2 name, not in the contract (native.amount, usd.value); not admitted'; case pure-v32-read (): reason 'price is not a finite positive decimal; not admitted' != 'key price is a v3.2 name, not in the contract (native.amount, usd.value); not admitted'
    v3.4: pass
  V70 = brief I4-page-minute (v3.4 item 4: minute m of the rail is asOf - (60 - m) min, seconds from asOf)
    v3.3: FAIL: case minute-30 (): moment '2026-09-14T16:57:00Z' != '2026-09-14T16:57:30Z'; case minute-0 (): moment '2026-09-14T16:27:00Z' != '2026-09-14T16:27:30Z'; case minute-60 (): moment '2026-09-14T17:27:00Z' != '2026-09-14T17:27:30Z'; case price-at-minute-30 (): price '$0.00106' != '$0.00168'; case price-at-minute-15 (): price '$0.00142' != '$0.00106'; case staged-fraction (): moment '2026-09-27T20:49:00Z' != '2026-09-27T20:49:02.572628Z'; case exact-t-label (2026-09-14T16:57:05Z): label '16:57Z' != '16:57:05Z'
    v3.4: pass
  V71 = brief I5-entry-cap (v3.4 item 5: Board's entry cap at t, from the entry read's USD)
    v3.3: FAIL: case present: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case absent-no-read: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case absent-usd-unavailable: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case conversion-after-entry: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case future-availability-before: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case future-availability-after: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case read-available-after-t: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only)
    v3.4: pass

140 passed, 0 failed

=== python3 contract/validate.py --v33-compat (exit 1 expected: every v3.4 vector fails on v3.3) ===
v3.3-compat: negative vectors run against legacy-v33/ (v3.3 code and schema, frozen before the first v3.4 edit)
FAILS-ON-V3.3 V66 (I2-historyFrom, v3.4 item 2: a Now document carrying historyFrom is refused, naming the key): case historyFrom-only: KeyError 'history'; case history-and-historyFrom (2026-09-27T11:30:00Z): refused False != True; case history-and-historyFrom (2026-09-27T11:30:00Z): reason None != 'key historyFrom is a v3.2 name, not in the contract (history.since); not admitted'
FAILS-ON-V3.3 V67 (I2-estimate, v3.4 item 2: a market cap carrying basis assumed_supply is refused, naming the value): case 0 (2026-09-27T11:30:00Z): symbols ['DEAD'] != []; case 0 (2026-09-27T11:30:00Z): refusals [] != [['DEAD', 'market.marketCap.basis', 'value assumed_supply is a v3.2 name, not in the contract (estimate); not admitted']]
FAILS-ON-V3.3 V68 (I2-anchor, v3.4 item 2: the v3.2 anchor kind and threshold sentence are refused, naming them): case v32-event (): reason 'material event names no anchor; not admitted' != 'value previous_same_kind is a v3.2 name, not in the contract (previous_material); not admitted'; case v32-threshold-v33-anchor (): reason None != "threshold '>= 25% against the previous price move' is v3.2 wording, not in the contract ('>= 25% against the price at the previous material event'); not admitted"
FAILS-ON-V3.3 V69 (I2-price, v3.4 item 2: a price read carrying a bare price is refused, naming the key): case v33-read-plus-price (): reason 'price read has fields outside the contract; not admitted' != 'key price is a v3.2 name, not in the contract (native.amount, usd.value); not admitted'; case pure-v32-read (): reason 'price is not a finite positive decimal; not admitted' != 'key price is a v3.2 name, not in the contract (native.amount, usd.value); not admitted'
FAILS-ON-V3.3 V70 (I4-page-minute, v3.4 item 4: minute m of the rail is asOf - (60 - m) min, seconds from asOf): case minute-30 (): moment '2026-09-14T16:57:00Z' != '2026-09-14T16:57:30Z'; case minute-0 (): moment '2026-09-14T16:27:00Z' != '2026-09-14T16:27:30Z'; case minute-60 (): moment '2026-09-14T17:27:00Z' != '2026-09-14T17:27:30Z'; case price-at-minute-30 (): price '$0.00106' != '$0.00168'; case price-at-minute-15 (): price '$0.00142' != '$0.00106'; case staged-fraction (): moment '2026-09-27T20:49:00Z' != '2026-09-27T20:49:02.572628Z'; case exact-t-label (2026-09-14T16:57:05Z): label '16:57Z' != '16:57:05Z'
FAILS-ON-V3.3 V71 (I5-entry-cap, v3.4 item 5: Board's entry cap at t, from the entry read's USD): case present: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case absent-no-read: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case absent-usd-unavailable: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case conversion-after-entry: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case future-availability-before: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case future-availability-after: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only); case read-available-after-t: LookupError v3.3 defines no entry cap callable (section 7.2 named the rule only)

6 of 6 negative vectors fail on v3.3
exit 1

=== python3 contract/validate.py --v32-compat (exit 1 expected: every v3.3 negative vector fails on v3.2) ===
v3.2-compat: negative vectors run against legacy-v32/ (v3.2 code and schema, Bolo B6 sourceHashes)
FAILS-ON-V3.2 V59 (B6-1, Bolo B6 1: entrants are observed-first and immutable per interval): case 2 (2026-09-27T12:10:00Z): bars [0, 0] != [0, 1]; case 2 (2026-09-27T12:10:00Z): lateEvidence 'absent' != True; case 2 (2026-09-27T12:10:00Z): earliestChainBuyAt 'absent' != '2026-09-27T11:00:00Z'; case 3 (2026-09-27T13:00:00Z): bars [0, 0] != [0, 1]; case bolo-exact-call (): bars [0] != [1]
FAILS-ON-V3.2 V60 (B6-2, Bolo B6 2: source clock never after availability; anchor never after the event): case bolo-2099-event (): reason None != 'evidence clock after its availability; not admitted'; case bolo-2099-not-latest (2026-09-14T17:27:30Z): latestAt '2099-01-01T00:00:00Z' != None; case anchor-after-event (): reason None != 'anchor after the event; not admitted'; case price-read-at-after-availableAt (): reason 'evidence carries no availableAt; not admitted' != 'evidence clock after its availability; not admitted'
FAILS-ON-V3.2 V61 (B6-3, Bolo B6 hardening: price admission binds the schema boundary at runtime): case price-NaN (): reason None != 'price is not a finite positive decimal; not admitted'; case price-Infinity (): reason None != 'price is not a finite positive decimal; not admitted'; case price--1 (): reason None != 'price is not a finite positive decimal; not admitted'; case price-0 (): reason None != 'price is not a finite positive decimal; not admitted'
FAILS-ON-V3.2 V62 (P2-anchor, 23:35 pin: price-move anchor is the previous material event of any kind): case 0 (): moveAts ['2026-09-27T10:10:00Z', '2026-09-27T10:30:00Z'] != ['2026-09-27T10:10:00Z']; case 0 (): anchors [{'kind': 'first_seen', 'at': '2026-09-27T10:00:00Z'}, {'kind': 'previous_same_kind', 'at': '2026-09-27T10:10:00Z'}] != [{'kind': 'previous_same_kind', 'at': '2026-09-27T10:00:00Z'}]
FAILS-ON-V3.2 V63 (P3-seam, B2 seam: typed native quote, USD basis supported by the read): case relabel-as-tape-usd (): reason None != 'usd basis misdeclared; not admitted'; case product-mismatch (): reason None != 'conversion_mismatch'; case conversion-clock-order (): reason None != 'evidence clock after its availability; not admitted'; case usd-unavailable (): reason 'provider tick is not a tape read; not admitted' != None; case provider-basis-without-conversion (): reason None != 'usd basis misdeclared; not admitted'
FAILS-ON-V3.2 V64 (P3-consequences, B2 seam: USD-derived fields use only reads with USD at t): case 0 (2026-09-27T10:00:10Z): mcValue 4500000.0 != None; case 0 (2026-09-27T10:00:10Z): mcReason None != 'no USD price at this moment'; case 0 (2026-09-27T10:00:10Z): changeReason 'one read on our tape; no change yet' != 'no USD price at this moment'; case 0 (2026-09-27T10:00:10Z): gapReasons 'absent' != ['usd conversion unavailable']; case 1 (2026-09-27T10:05:00Z): gapReasons 'absent' != []; case 2: TypeError conversion from NoneType to Decimal is not supported
FAILS-ON-V3.2 V65 (P3-absence, B2 seam: explicit absence of surface and state evidence): case 0: ValueError noclock: None; case 1: ValueError noclock: None; case 2: ValueError noclock: None; case 3: ValueError noclock: None

7 of 7 negative vectors fail on v3.2
exit 1

=== python3 contract/validate.py --v31-compat (exit 1 expected: every v3.2 negative vector fails on v3.1) ===
v3.1-compat: negative vectors run against legacy-v31/ (v3.1 code and schema, Bolo pass13 hashes)
FAILS-ON-V3.1 V42 (V26, Bolo pass12 1: retention availability gate): state early_money_leaving != unknown; rule R2 != R2u; reason None != 'retention_unavailable'; sentence 'An attention light is on while early-cohort retention fell 70 points in the last 6 h, by RPC read.' !~ ^State not computed: the early-cohort retention read is not available at this moment\.$; sentence 'An attention light is on while early-cohort retention fell 70 points in the last 6 h, by RPC read.' matches forbidden early money|fell; inadmissible [] != [{'input': 'retention', 'reason': 'evidence available after asOf; not admitted'}]
FAILS-ON-V3.1 V43 (V27, Bolo pass12 2: phantom absence needs interval coverage): row 1 phantom True != 'unverified'; row 1 removed True != False; counts.removed 1 != 0; counts.unverified 0 != 1; counts.phantom 1 != 0; denominators.phantom 1 != 0
FAILS-ON-V3.1 V44 (V28, Bolo pass12 3: phantom denominator counts only covered candidates): row 1 phantom False != 'unverified'; counts.unverified 0 != 1; denominators.phantom 1 != 0
FAILS-ON-V3.1 V45 (V29, Bolo pass12 4a: lag needs a measured head): case measuredAt-null: lagSec 4 (None) != null with 'head_unmeasured'; case bolo-pass12-probe: lagSec 4 (None) != null with 'head_unmeasured'
FAILS-ON-V3.1 V46 (V30, Bolo pass12 4b: lag needs a consistent head): case covered-101-head-100: lagSec 4 (None) != null with 'head_inconsistent'
FAILS-ON-V3.1 V47 (V31, Now: history boundary): case 0 (2026-09-27T10:59:59Z): refused False != True; case 0 (2026-09-27T10:59:59Z): reason None != 'history not kept before 2026-09-27T11:00:00Z'; case 1 (2026-09-27T11:00:00Z): symbols ['ASTER', 'BRAVO'] != []
FAILS-ON-V3.1 V48 (V32, Now: supply validity is not back-projected): case 0 (2026-09-14T12:00:00Z): basis 'rpc_supply' != 'assumed_supply'; case 2 (2026-09-17T12:00:00Z): basis 'rpc_supply' != 'assumed_supply'
FAILS-ON-V3.1 V49 (V33, Now: stable first-seen baseline): case 0 (2026-09-27T11:50:00Z): value 33 != 100
FAILS-ON-V3.1 V50 (V34, Now: a repeat buy counts once): case 0 (): cumulativeDistinctEntrants 5 != 3; case 0 (): bars [3, 2] != [2, 1]
FAILS-ON-V3.1 V51 (V35, Now: a row surfaced after t is absent at t): case 0 (2026-09-27T11:30:00Z): symbols ['ASTER', 'BRAVO'] != ['ASTER']
FAILS-ON-V3.1 V52 (V36, Now: a read available after t is absent at t): case 0 (2026-09-27T11:10:03Z): count 2 != 1; case 0 (2026-09-27T11:10:03Z): lastPrice '2' != '1'
FAILS-ON-V3.1 V53 (V37, Now: a provider tick is never basis tape): case 0 (): reason None != 'provider tick is not a tape read; not admitted'
FAILS-ON-V3.1 V54 (V38, Now: a material event without an anchor is refused): case 0 (): reason None != 'material event names no anchor; not admitted'
FAILS-ON-V3.1 V55 (H1, Bolo pass12 hardening: malformed clocks): raised TypeError: can't compare offset-naive and offset-aware datetimes
FAILS-ON-V3.1 V56 (H2, Bolo pass12 hardening: malformed clocks): state safety_changed != developing; rule R1b != R5a; sentence 'Safety event: synthetic clock probe, 10 min ago.' !~ ^No light is on now\.$; sentence 'Safety event: synthetic clock probe, 10 min ago.' matches forbidden safety; inadmissible [] != [{'input': 'safetyEvent', 'reason': 'evidence clock offset is not a valid UTC offset; not admitted'}]
FAILS-ON-V3.1 V57 (H3, Bolo pass12 hardening: malformed clocks): state safety_changed != developing; rule R1b != R5a; sentence 'Safety event: synthetic clock probe, 10 min ago.' !~ ^No light is on now\.$; sentence 'Safety event: synthetic clock probe, 10 min ago.' matches forbidden safety; inadmissible [] != [{'input': 'safetyEvent', 'reason': 'evidence clock offset is not a valid UTC offset; not admitted'}]
FAILS-ON-V3.1 V58 (H4, Bolo pass12 hardening: native-quote conversion): case sol-999-for-1e9-lamports: admitted True != False

17 of 17 negative vectors fail on v3.1
exit 1

=== python3 contract/validate.py --v3-compat (exit 1 expected: every v3.1 negative vector fails on v3) ===
v3-compat: negative vectors run against legacy-v3/ (v3 code and schema)
FAILS-ON-V3 V37 (V21, Bolo 1: future or unavailable evidence): state safety_changed != developing; rule R1b != R5a; sentence 'Safety event: synthetic future event, -38006640 min ago.' !~ ^No light is on now\.$; sentence 'Safety event: synthetic future event, -38006640 min ago.' matches forbidden -\d|safety; inadmissible [] != [{'input': 'safetyEvent', 'reason': 'evidence available after asOf; not admitted'}]
FAILS-ON-V3 V38 (V22, Bolo 2: BondingCurve schema): v3 schema accepts {"realSolReserve": {"value": {"nonsense": true}, "reason": null, "unit": "usd"}, "virtualS...
FAILS-ON-V3 V39 (V23, Bolo 3: missing capability is not true): state early_money_leaving != developing; rule R2 != R5b; sentence 'An attention light is on while early-cohort retention fell 70 points in the last 6 h, by RPC read.' !~ ^One light on: a caller call, 10 min ago\. Holders: source support not reported; not computed\. Tape: source support not reported; not computed\.$; refused [] != ['early_money_leaving', 'crowd_arriving']; refusal basis [] != ['support_unreported', 'support_unreported']
FAILS-ON-V3 V40 (V24, Bolo 4: PoolRow lag): case quiet-pool: lagSec 3629 != 4; case seek-after-archive-refusal: lagSec 119 (None) != null with 'no covered cursor: reading resumed at a seek cursor after an archive refusal'
FAILS-ON-V3 V41 (V25, Bolo 5: print flags): row 0 phantom False != None; row 1 phantom False != 'unverified'; row 2 phantom True != 'unverified'; row 2 unchanged 'absent' != True; row 2 providerStale 'absent' != True; row 2 removed True != False; row 3 phantom False != None; counts.removed 'absent' != 0; counts.unverified 'absent' != 1; counts.phantom 'absent' != 0; counts.unchanged 'absent' != 1; counts.providerStale 'absent' != 1; denominators.phantom 'absent' != 0; denominators.unchanged 'absent' != 3; denominators.providerStale 'absent' != 3; denominators.misquote 'absent' != 1

5 of 5 negative vectors fail on v3
exit 1

=== python3 contract/migrate_v32_to_v33.py --check (exit 0 expected) ===
vectors: 33 renames, 2 schema-valid reads and events checked against v3.3 PriceRead / MaterialEvent
  legacy-v32/state-vectors-v32-migrated.json sha256 ca73b290ae406764b5e5f2b0a9ac8c5c6968428b39dd09d1df5d6bd48e47431f
now-v32: 131 renames; Companion schema errors 0, Now schema errors 0; now_at at asOf: ['MARLIN', 'AGRIPPA', 'SPRING', 'LUMEN', 'OBOL', 'KESTREL'], refusals []
  /tmp/now-v32-migrated.json sha256 168b3f868e7f75f6c002affcf685946e0675aa4c5a72fc843f023e8888e34acc (not committed: it is v3.2's derivation under v3.3 names)
migrate check: OK
exit 0

=== grep -n downshift contract/*.py (nothing expected) ===
grep exit 1 (1 = no match)

=== Bolo's B6 probes, copied unmodified to /tmp/v34probe/ (OUT = the copy's own folder), pointed at the working tree contract/; his evidence root was not written (directory listing and timestamps compared before and after) ===
commands: cp <b6>/reprobe.py <b6>/strengthen.py /tmp/v34probe/ && cd /tmp/v34probe && python3 -B reprobe.py && python3 -B strengthen.py   (both exit 0)
run: /tmp/v34probe/20260928T065949Z
validatorExit 0 | priorProbeExit (contract-review-pass12.py copy) 0 | sourceStableAfter True
historicalBeforeStart: {"refused": true, "reason": "history not kept before 2026-09-14T16:27:00Z"}
futureAfterDocument: {"refused": true, "reason": "moment after asOf; not known yet"}
providerNotTape: "provider tick is not a tape read; not admitted"
missingAvailability: "evidence carries no availableAt; not admitted"
offsetOverflow: "evidence clock offset is not a valid UTC offset; not admitted"
naiveAvailability: "evidence clock has no UTC offset; not admitted"
nanPrice: "price is not a finite positive decimal; not admitted"
negativePrice: "price is not a finite positive decimal; not admitted"
infinitePrice: "price is not a finite positive decimal; not admitted"
futurePriceExcluded: {"inputAvailability": "2099-01-01T00:00:00Z", "equal": true}
futureSupplyExcluded: null
baselineSeparateFromWindow: {"firstSeenAt": {"value": "2026-09-14T16:39:00Z", "reason": null, "unit": "iso", "basis": "tape", "illustrative": true}, "window": {"start": "2026-09-14T16:27:30Z", "end": "2026-09-14T17:27:30Z", "bounds": "[start,end)"}}
rowKeys: ["checkpoints", "clock", "forYou", "grade", "identity", "illustrative", "latest", "market", "materialEvents", "order", "situationId", "state", "stateHistory", "surfacedAt", "wallets"]
futureBuyMustNotRewritePastEntry: {"inputPrefix": [{"wallet": "software-only-wallet", "at": "2026-09-27T11:50:00Z", "availableAt": "2026-09-27T12:00:00Z"}], "laterAppend": {"wallet": "software-only-wallet", "at": "2026-09-27T11:00:00Z", "availableAt": "2026-09-27T12:10:00Z"}, "bounds": [["2026-09-27T12:00:00Z", "2026-09-27T12:05:00Z
historyPresent: {"history": null, "historyFrom": null}
futureEventEarlierAvailability: "evidence clock after its availability; not admitted"
baselineRowSchemaErrors: []
missingField:surfacedAt: {"wasPresent": true, "schemaErrors": ["'surfacedAt' is a required property"]}
missingField:history: {"wasPresent": false, "schemaErrors": []}
missingField:identity: {"wasPresent": true, "schemaErrors": ["'identity' is a required property"]}
missingField:market: {"wasPresent": true, "schemaErrors": ["'market' is a required property"]}
missingField:clock: {"wasPresent": true, "schemaErrors": ["'clock' is a required property"]}
missingField:forYou: {"wasPresent": true, "schemaErrors": ["'forYou' is a required property"]}
missingField:wallets: {"wasPresent": true, "schemaErrors": ["'wallets' is a required property"]}
missingField:latest: {"wasPresent": true, "schemaErrors": ["'latest' is a required property"]}
missingField:order: {"wasPresent": true, "schemaErrors": ["'order' is a required property"]}
strengthen.py: futureMaterialSourceClock callableRefusal 'evidence clock after its availability; not admitted' renderedLatest None
strengthen.py: priceBoundaries [('NaN', 'price is not a finite positive decimal; not admitted'), ('Infinity', 'price is not a finite positive decimal; not admitted'), ('-1', 'price is not a finite positive decimal; not admitted'), ('0', 'price is not a finite positive decimal; not admitted')]
strengthen.py: baseline before/after window slide 87 87 | legacy [('--v31-compat', 1), ('--v3-compat', 1)]
