== thread t-approve ==
  [propose] runs
  [approval] node (re)starts
  paused, interrupt payload: {'question': 'Approve this action?', 'action': {'tool': 'delete_records', 'table': 'customers', 'rows': 1200}}
  checkpoint next node: ('approval',)
  -> human resumes with {'approved': True}
  [approval] node (re)starts
  final: {'decision': 'approved', 'result': 'executed delete_records on customers (1200 rows)'}
== thread t-reject ==
  [propose] runs
  [approval] node (re)starts
  paused, interrupt payload: {'question': 'Approve this action?', 'action': {'tool': 'delete_records', 'table': 'customers', 'rows': 1200}}
  checkpoint next node: ('approval',)
  -> human resumes with {'approved': False, 'reason': 'too many rows'}
  [approval] node (re)starts
  final: {'decision': 'rejected', 'result': 'rejected: too many rows'}
