@@ -710,6 +710,7 @@ fn writer_play_advances_and_records_outputs() {
710710 // Simulate writer advancing 10 ticks
711711 let mut current_store = initial_store. clone ( ) ;
712712 let output_channel = make_channel_id ( "writer:output" ) ;
713+ let mut parents: Vec < warp_core:: Hash > = Vec :: new ( ) ;
713714
714715 for tick in 0 ..10u64 {
715716 // Create a patch for this tick
@@ -723,10 +724,18 @@ fn writer_play_advances_and_records_outputs() {
723724 // Compute state_root from the store
724725 let state_root = compute_state_root_for_warp_store ( & current_store, warp_id) ;
725726
727+ // Compute real commit_hash for Merkle chain validity
728+ let commit_hash = compute_commit_hash_v2 (
729+ & state_root,
730+ & parents,
731+ & patch. patch_digest ,
732+ patch. header . policy_id ,
733+ ) ;
734+
726735 let triplet = HashTriplet {
727736 state_root,
728737 patch_digest : patch. patch_digest ,
729- commit_hash : [ ( tick + 200 ) as u8 ; 32 ] , // Deterministic commit hash
738+ commit_hash,
730739 } ;
731740
732741 // Create outputs with deterministic values: (channel, vec![tick as u8])
@@ -736,6 +745,9 @@ fn writer_play_advances_and_records_outputs() {
736745 provenance
737746 . append ( worldline_id, patch, triplet, outputs)
738747 . expect ( "append should succeed" ) ;
748+
749+ // Advance parent chain for next iteration's Merkle computation
750+ parents = vec ! [ commit_hash] ;
739751 }
740752
741753 // Assert: provenance.len(worldline) == 10
@@ -746,18 +758,35 @@ fn writer_play_advances_and_records_outputs() {
746758 ) ;
747759
748760 // Assert: provenance.expected(worldline, t) exists for t in 0..10
761+ // Recompute the Merkle chain to verify stored commit_hashes match
762+ let mut verify_store = initial_store. clone ( ) ;
763+ let mut verify_parents: Vec < warp_core:: Hash > = Vec :: new ( ) ;
749764 for tick in 0 ..10u64 {
750765 let triplet = provenance
751766 . expected ( worldline_id, tick)
752767 . expect ( "expected should exist for tick" ) ;
753768
754- // Verify commit_hash matches what we recorded
769+ // Recompute commit_hash from scratch to verify Merkle chain integrity
770+ let patch = provenance
771+ . patch ( worldline_id, tick)
772+ . expect ( "patch should exist" ) ;
773+ patch
774+ . apply_to_store ( & mut verify_store)
775+ . expect ( "apply should succeed" ) ;
776+ let state_root = compute_state_root_for_warp_store ( & verify_store, warp_id) ;
777+ let expected_commit = compute_commit_hash_v2 (
778+ & state_root,
779+ & verify_parents,
780+ & patch. patch_digest ,
781+ patch. header . policy_id ,
782+ ) ;
783+
755784 assert_eq ! (
756- triplet. commit_hash,
757- [ ( tick + 200 ) as u8 ; 32 ] ,
758- "commit_hash should match for tick {}" ,
785+ triplet. commit_hash, expected_commit,
786+ "commit_hash should match recomputed value for tick {}" ,
759787 tick
760788 ) ;
789+ verify_parents = vec ! [ expected_commit] ;
761790 }
762791
763792 // Assert: provenance.outputs(worldline, t) contains expected values
0 commit comments