@@ -397,16 +397,11 @@ impl Kernel {
397397
398398 // Audit trail — atomic with event (whitepaper §3 invariant 5).
399399 let log_index = hold_event. log_index as u64 ;
400- let tree_size = log_index + 1 ;
401400 self . audit_log
402401 . append_leaf_in_tx ( & mut tx, log_index, & hold_event. event_hash )
403402 . await
404403 . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
405- self . audit_log
406- . make_checkpoint_in_tx ( & mut tx, tree_size)
407- . await
408- . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
409-
404+ // Checkpoint generated lazily on read, not here.
410405 tx. commit ( ) . await ?;
411406
412407 return Err ( KernelError :: HoldTriggered {
@@ -710,16 +705,15 @@ impl Kernel {
710705
711706 // Audit trail update — atomic with event (whitepaper §3 invariant 5).
712707 let log_index = event. log_index as u64 ;
713- let tree_size = log_index + 1 ;
714708 self . audit_log
715709 . append_leaf_in_tx ( & mut tx, log_index, & event. event_hash )
716710 . await
717711 . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
718- self . audit_log
719- . make_checkpoint_in_tx ( & mut tx, tree_size)
720- . await
721- . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
722712
713+ // Checkpoint is NOT generated on every event. It is a derived artifact
714+ // (tree root computed from leaf hashes) and can be generated on-demand
715+ // when queried (receipt, show, verify) or via explicit checkpoint command.
716+ // This keeps the write path fast and lock-free for concurrent access.
723717 tx. commit ( ) . await ?;
724718 info ! ( event_id = %event. id, log_index = event. log_index, "event committed" ) ;
725719 Ok ( ( ) )
@@ -816,6 +810,8 @@ impl Kernel {
816810 // Legacy: snapshot is superseded by audit checkpoint.
817811 // Return audit checkpoint data for backward compatibility.
818812 let event_count = self . event_log . count ( ) . await ?;
813+ self . audit_log . ensure_checkpoint ( event_count as u64 ) . await
814+ . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
819815 let cp = self
820816 . audit_log
821817 . latest_checkpoint ( )
@@ -837,6 +833,9 @@ impl Kernel {
837833 } ) )
838834 }
839835 "audit_checkpoint" => {
836+ let event_count = self . event_log . count ( ) . await ?;
837+ self . audit_log . ensure_checkpoint ( event_count as u64 ) . await
838+ . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
840839 let cp = self
841840 . audit_log
842841 . latest_checkpoint ( )
@@ -852,11 +851,16 @@ impl Kernel {
852851 } ) ? as u64 ;
853852 let tree_size = match query. tree_size {
854853 Some ( s) => s as u64 ,
855- None => self
856- . audit_log
857- . tree_size ( )
858- . await
859- . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?,
854+ None => {
855+ // Ensure checkpoint is current before deriving tree_size.
856+ let event_count = self . event_log . count ( ) . await ? as u64 ;
857+ self . audit_log . ensure_checkpoint ( event_count) . await
858+ . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
859+ self . audit_log
860+ . tree_size ( )
861+ . await
862+ . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?
863+ }
860864 } ;
861865 let proof = self
862866 . audit_log
@@ -1402,16 +1406,11 @@ impl Kernel {
14021406
14031407 // Audit trail — atomic with event (whitepaper §3 invariant 5).
14041408 let log_index = response_event. log_index as u64 ;
1405- let tree_size = log_index + 1 ;
14061409 self . audit_log
14071410 . append_leaf_in_tx ( & mut tx, log_index, & response_event. event_hash )
14081411 . await
14091412 . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
1410- self . audit_log
1411- . make_checkpoint_in_tx ( & mut tx, tree_size)
1412- . await
1413- . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
1414-
1413+ // Checkpoint generated lazily on read, not here.
14151414 tx. commit ( ) . await ?;
14161415
14171416 info ! (
@@ -1604,16 +1603,11 @@ impl Kernel {
16041603
16051604 // Audit trail — atomic with event (whitepaper §3 invariant 5).
16061605 let t_log_index = timeout_event. log_index as u64 ;
1607- let t_tree_size = t_log_index + 1 ;
16081606 self . audit_log
16091607 . append_leaf_in_tx ( & mut tx, t_log_index, & timeout_event. event_hash )
16101608 . await
16111609 . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
1612- self . audit_log
1613- . make_checkpoint_in_tx ( & mut tx, t_tree_size)
1614- . await
1615- . map_err ( |e| KernelError :: Audit ( e. to_string ( ) ) ) ?;
1616-
1610+ // Checkpoint generated lazily on read, not here.
16171611 tx. commit ( ) . await ?;
16181612
16191613 info ! (
0 commit comments