///|
fn main {
  let source =
    #|{"traceSchema":3,"dataModel":"relation-set-v1","clockDomain":"predicate-example","scope":{"exclusiveWriters":true,"completeSnapshotTables":["items"]},"relationSchema":{"items":{"primaryKey":"id","columns":{"id":"int64","value":"text"}}},"gaps":[],"events":[
    #|{"seq":1,"time":0,"kind":"snapshot","consistent":true,"initial":{"items":[]}},
    #|{"seq":2,"time":1,"kind":"begin","tx":"A","connection":"A"},{"seq":3,"time":2,"kind":"begin","tx":"B","connection":"B"},
    #|{"seq":4,"time":3,"kind":"row_read","tx":"A","relation":"items","predicate":[{"column":"value","op":"eq","value":"yes"}],"rows":[],"complete":true},
    #|{"seq":5,"time":4,"kind":"row_read","tx":"B","relation":"items","predicate":[{"column":"value","op":"eq","value":"yes"}],"rows":[],"complete":true},
    #|{"seq":6,"time":5,"kind":"row_write","tx":"A","relation":"items","key":"1","action":"insert","version":"a1","predecessor":null,"values":{"value":"yes"}},
    #|{"seq":7,"time":6,"kind":"row_write","tx":"B","relation":"items","key":"2","action":"insert","version":"b1","predecessor":null,"values":{"value":"yes"}},
    #|{"seq":8,"time":7,"kind":"commit_request","tx":"A"},{"seq":9,"time":8,"kind":"commit_ok","tx":"A"},{"seq":10,"time":9,"kind":"commit_request","tx":"B"},{"seq":11,"time":10,"kind":"commit_ok","tx":"B"}]}
  let history = @txn.parse_history_v4(source).unwrap()
  let predicate = @txn.classify_relation_predicate_v4(
    history,
    @txn.ScopedG2,
    rule_set=@txn.Adya2000Mixed,
  ).unwrap()
  let item = @txn.classify_relation_predicate_v4(
    history,
    @txn.ScopedG2Item,
    rule_set=@txn.Adya2000Mixed,
  ).unwrap()
  let report = @txn.relation_predicate_classification_v4_json(predicate)
  if predicate.status() != "refuted" || item.status() != "checked-compatible" {
    abort("Expected a predicate-only anti-dependency cycle")
  }
  if !@txn.verify_relation_predicate_classification_v4(
      history,
      report,
      @txn.ScopedG2,
      rule_set=@txn.Adya2000Mixed,
    ) {
    abort("Predicate category evidence did not verify")
  }
  println(report.stringify())
}