Symptom
fvv and fccv-handoff produced no case-log artifact at all:
##[warning] No files were found with the provided path: devlogs/. No artifacts will be uploaded.
##[error] Unable to download artifact(s): Artifact not found for name: fvv-case-logs
So fvv Invariant Harness and fccv-handoff Invariant Harness fail on
artifact download, not on any invariant — 2 of the 3 harness failures in the
run are this defect, telling us nothing about the protocol.
Root cause
_phase_dump_case_ledgers sits inside run_*_demo() after the last phase,
not in a finally. Any assertion that escapes a demo_check block skips the
dump. main's finally: assert_demo_success() still runs and still raises, so
the loss is specifically the forensic artifacts.
There are roughly twenty unguarded wait_for_case_participants call sites
across the suite (e.g. fvv_demo.py:335/:340, :193, :248,
fcv_demo.py:381-386, :213, :308, fccv_extension_demo.py:476-481,
fvcv_extension_demo.py:476-481, fvcv_handoff_demo.py:594-599, :569,
fcvcv_demo.py:553-560, fv_demo.py:489), so this is suite-wide, not specific
to fvv.
Note fccv-handoff lost its case logs to this defect, not to the job
cancellation tracked separately in this epic — fixing the hang alone would not have produced them.
Correct fix
A shared harness shape: run phases, always dump ledgers, then assert. The
dump belongs in the finally.
Done when
A scenario that dies mid-phase still uploads every ledger it had, and the
invariant harness reports a real invariant result rather than a download error.
Found during the CI review of run 31619546349 @ 0624e12e
(6 demo jobs failed, 1 cancelled, 3 invariant-harness jobs failed).
Investigation: 6 parallel deep dives, each re-checked by an independent
adversarial verifier.
Symptom
fvvandfccv-handoffproduced no case-log artifact at all:So
fvv Invariant Harnessandfccv-handoff Invariant Harnessfail onartifact download, not on any invariant — 2 of the 3 harness failures in the
run are this defect, telling us nothing about the protocol.
Root cause
_phase_dump_case_ledgerssits insiderun_*_demo()after the last phase,not in a
finally. Any assertion that escapes ademo_checkblock skips thedump.
main'sfinally: assert_demo_success()still runs and still raises, sothe loss is specifically the forensic artifacts.
There are roughly twenty unguarded
wait_for_case_participantscall sitesacross the suite (e.g.
fvv_demo.py:335/:340,:193,:248,fcv_demo.py:381-386,:213,:308,fccv_extension_demo.py:476-481,fvcv_extension_demo.py:476-481,fvcv_handoff_demo.py:594-599,:569,fcvcv_demo.py:553-560,fv_demo.py:489), so this is suite-wide, not specificto
fvv.Note
fccv-handofflost its case logs to this defect, not to the jobcancellation tracked separately in this epic — fixing the hang alone would not have produced them.
Correct fix
A shared harness shape: run phases, always dump ledgers, then assert. The
dump belongs in the
finally.Done when
A scenario that dies mid-phase still uploads every ledger it had, and the
invariant harness reports a real invariant result rather than a download error.
Found during the CI review of run 31619546349 @
0624e12e(6 demo jobs failed, 1 cancelled, 3 invariant-harness jobs failed).
Investigation: 6 parallel deep dives, each re-checked by an independent
adversarial verifier.