............FF..F...............                                         [100%]
=================================== FAILURES ===================================
______________ test_missing_proposer_and_founder_offline_rotation ______________

net = <test_engine.Network object at 0x10cf0af80>

    def test_missing_proposer_and_founder_offline_rotation(net):
     # Founder ordinary instance 0 has no special requirement; use whichever leader is offline.
     leader=next(n for n in net.nodes if n.identity==n.leader());index=net.nodes.index(leader);leader.close()
     net.tick_round();net.propose([transfer()]);net.pump()
>    assert len(set(heads(net)))==1 and all(len(n.store.read()['chain'])==9 for n in net.nodes if not n.closed)
E    AssertionError: assert (1 == 1 and False)
E     +  where 1 = len({'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525'})
E     +    where {'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525'} = set(['ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525', 'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525', 'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525'])
E     +      where ['ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525', 'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525', 'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525'] = heads(<test_engine.Network object at 0x10cf0af80>)
E     +  and   False = all(<generator object test_missing_proposer_and_founder_offline_rotation.<locals>.<genexpr> at 0x10cede260>)

launch-programme/bft-tests/test_engine.py:106: AssertionError
____________________ test_locks_survive_timeout_and_restart ____________________

net = <test_engine.Network object at 0x10cf08ac0>

    def test_locks_survive_timeout_and_restart(net):
     net.propose([transfer()])
     # Deliver proposals/prevotes only, withhold precommits so everyone locks but cannot finalise.
     for _ in range(3):
      messages=[m for n in net.nodes for m in n.messages() if m['kind']!='precommit']
      for n in net.nodes:
       for m in messages:n.receive(m)
     assert all(n.s['locked'] for n in net.nodes)
     old=net.nodes[0];locked=old.s['locked'];old.close()
     net.nodes[0]=Engine(net.root/'0',net.boundary,net.keys[0],net.history,isolated=True)
     assert net.nodes[0].s['locked']==locked
>    net.tick_round();net.propose([transfer(amount=2)]);net.pump()

launch-programme/bft-tests/test_engine.py:122: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
launch-programme/bft-tests/test_engine.py:39: in propose
    if not n.closed:n.propose(txs)
launch-programme/bft/engine.py:143: in propose
    return self._guard(self._propose,transactions)
launch-programme/bft/engine.py:161: in _guard
    try:return fn(*args)
launch-programme/bft/engine.py:149: in _propose
    block=self.s['blocks'][self.s['valid']] if self.s['valid'] else make_block(self.boundary,self.store.read()['chain'],transactions)
launch-programme/bft/engine.py:39: in make_block
    boundary.validate_candidate(chain+[block])
launch-programme/proposal/certified_advancement.py:58: in validate_candidate
    return self._validate(chain,False)
launch-programme/proposal/certified_advancement.py:74: in _validate
    self.transaction(tx,balances,ids,nonces,height=height)
candidate/computenet_verification/settlement.py:101: in transaction
    return super().transaction(tx,balances,ids,nonces,height=height)
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

self = <engine.LedgerBoundary object at 0x10cf08280>
tx = {'from': 'cmp_0f4381ef5ac06357d5c69198427e97e8396760ca', 'to': 'cmp_896a138c306ed239a78edb85a0e73835afac468d', 'amount': 2, 'fee': 0, ...}
balances = {'genesis': Decimal('0'), 'cmp_0f4381ef5ac06357d5c69198427e97e8396760ca': Decimal('341.00'), 'cmp_896a138c306ed239a78edb85a0e73835afac468d': Decimal('9')}
ids = {'eb03b680382d33e2310d35500c5d1ed79e3715360732d27d810d44793213458a', 'historical-opaque-id-0', 'historical-opaque-id-1', 'historical-opaque-id-2'}
nonces = {'cmp_aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa': 1783361879972, 'cmp_0f4381ef5ac06357d5c69198427e97e8396760ca': 1}
height = 9

    def transaction(self, tx, balances, ids, nonces, *, height=None):
        if not isinstance(tx, dict) or set(tx) != self.allowed_transaction_fields(tx):
            raise Invalid('transaction schema')
        if tx['chain_id'] != CHAIN_ID or tx['coin'] != COIN or tx['signature_scheme'] != 'ed25519-v1':
            raise Invalid('transaction domain or version')
        if any(not isinstance(tx[k], str) or not ADDRESS.fullmatch(tx[k]) for k in ('from', 'to')):
            raise Invalid('invalid address')
        if tx['from'] == self.migration.get('legacy_address'):
            raise Invalid('legacy account is read only')
        if type(tx['nonce']) is not int or tx['nonce'] > 2**63 - 1 or tx['nonce'] != nonces.get(tx['from'], 0) + 1:
>           raise Invalid('replayed or nonsequential nonce')
E           candidate.computenet_hardening.core.Invalid: replayed or nonsequential nonce

candidate/computenet_hardening/core.py:118: Invalid
___________________________ test_commit_wal_recovery ___________________________

net = <test_engine.Network object at 0x10ae11960>
monkeypatch = <_pytest.monkeypatch.MonkeyPatch object at 0x10ce60f10>

    def test_commit_wal_recovery(net,monkeypatch):
     victim=net.nodes[0];original=victim.store.extend
     def fail(*a):raise OSError('crash after durable intent')
     monkeypatch.setattr(victim.store,'extend',fail)
     net.propose([transfer()])
     with pytest.raises(OSError):net.pump()
     assert victim.s['intent'] is not None
     victim.close();net.nodes[0]=Engine(net.root/'0',net.boundary,net.keys[0],net.history,isolated=True)
     assert len(net.nodes[0].store.read()['chain'])==9
>    net.pump();assert len(set(heads(net)))==1
E    AssertionError: assert 2 == 1
E     +  where 2 = len({'7958fa59102c111e0aeaedf0cb619682fe28b83e34048a133515ce5b2e1fa7c1', 'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525'})
E     +    where {'7958fa59102c111e0aeaedf0cb619682fe28b83e34048a133515ce5b2e1fa7c1', 'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15643c88ce019ea525'} = set(['7958fa59102c111e0aeaedf0cb619682fe28b83e34048a133515ce5b2e1fa7c1', 'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15...e0aeaedf0cb619682fe28b83e34048a133515ce5b2e1fa7c1', '7958fa59102c111e0aeaedf0cb619682fe28b83e34048a133515ce5b2e1fa7c1'])
E     +      where ['7958fa59102c111e0aeaedf0cb619682fe28b83e34048a133515ce5b2e1fa7c1', 'ff990fee6c2da296b54e44ff8ae3b7bdc9ce8109aea05d15...e0aeaedf0cb619682fe28b83e34048a133515ce5b2e1fa7c1', '7958fa59102c111e0aeaedf0cb619682fe28b83e34048a133515ce5b2e1fa7c1'] = heads(<test_engine.Network object at 0x10ae11960>)

launch-programme/bft-tests/test_engine.py:150: AssertionError
=============================== warnings summary ===============================
dependency-cache/rc3/qualification-venv/lib/python3.10/site-packages/fastapi/testclient.py:1
  /Users/alexhoman-russell/Dev/computenet-hardening-20261022-ILclIz4M/dependency-cache/rc3/qualification-venv/lib/python3.10/site-packages/fastapi/testclient.py:1: StarletteDeprecationWarning: Using `httpx` with `starlette.testclient` is deprecated; install `httpx2` instead.
    from starlette.testclient import TestClient as TestClient  # noqa

dependency-cache/rc3/qualification-venv/lib/python3.10/site-packages/starlette/testclient.py:53
  /Users/alexhoman-russell/Dev/computenet-hardening-20261022-ILclIz4M/dependency-cache/rc3/qualification-venv/lib/python3.10/site-packages/starlette/testclient.py:53: DeprecationWarning: The anyio.abc.BlockingPortal alias is deprecated, use anyio.from_thread.BlockingPortal instead.
    _PortalFactoryType = Callable[[], AbstractContextManager[anyio.abc.BlockingPortal]]

-- Docs: https://docs.pytest.org/en/stable/how-to/capture-warnings.html
=========================== short test summary info ============================
FAILED launch-programme/bft-tests/test_engine.py::test_missing_proposer_and_founder_offline_rotation
FAILED launch-programme/bft-tests/test_engine.py::test_locks_survive_timeout_and_restart
FAILED launch-programme/bft-tests/test_engine.py::test_commit_wal_recovery - ...
3 failed, 29 passed, 2 warnings in 1.27s
