(module examples.claim_review
  (capsule "0")
  (profile agentic persistence.surrealdb external.a2a ui.a2ui)

  (store operational
    (backend surrealdb)
    (authority runtime-state))

  (store knowledge
    (backend typedb)
    (authority semantic-facts))

  (agent security_reviewer
    (protocol a2a)
    (skill review_claim))

  (surface claim_review_status
    (title "Claim review status")
    (route "/claims/status")
    (bind ClaimReview)
    (event SubmitClaim))

  (surface claim_review_decision
    (title "Claim review decision")
    (route "/claims/decision")
    (bind ClaimReview)
    (event ReviewCompleted))

  (surface claim_review_summary
    (title "Claim review summary")
    (route "/claims/summary")
    (bind ClaimReview)
    (event Approve Reject))

  (machine ClaimReview
    (version "0.3.0")
    (context
      (claim_id U64)
      (review_score U32)
      (approved Bool))
    (event SubmitClaim
      (claim_id U64))
    (event ReviewCompleted
      (review_score U32))
    (event Approve)
    (event Reject)
    (initial idle)
    (persistence
      (store operational)
      (event-log authoritative)
      (snapshot every-transition)
      (replay true))

    (state idle
      (on SubmitClaim
        (target awaiting_review)
        (assign
          (claim_id event.claim_id)
          (approved false))
        (effects
          (db.write operational.claims)
          (a2a.task security_reviewer.review_claim)
          (a2ui.emit claim_review_status))))

    (state awaiting_review
      (on ReviewCompleted
        (target awaiting_human_decision)
        (assign
          (review_score event.review_score))
        (effects
          (db.write operational.agent_tasks)
          (a2ui.emit claim_review_decision))))

    (state awaiting_human_decision
      (on Approve
        (guard (<= review_score 30))
        (target accepted)
        (assign
          (approved true))
        (effects
          (db.write operational.claims)
          (db.project operational.claims knowledge.typedb)
          (a2ui.emit claim_review_summary)))
      (on Reject
        (target rejected)
        (effects
          (db.write operational.claims)
          (a2ui.emit claim_review_summary))))

    (state accepted (type final))
    (state rejected (type final))))
