{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://liberty-amber.vercel.app/api/schemas/simulate-walk.json","title":"Liberty Agent Settlement simulate dry-run walk export","description":"JSON Schema for a client-held simulate dry-run walk export (liberty-simulate-*.json). Same pack as Export last walk on /#simulate and /#activity after a successful POST /api/v0/simulate. Ordered transitions (create → fund → submit → release|dispute), per-step quotes, receipts, and timestamps. Local demo export only. Not an audit ledger. Not custody proof. Liberty does not receive the file or persist the walk. money is always false. callback_secret must not appear.","type":"object","$ref":"#/$defs/SimulateWalkExport","$defs":{"SecretName":{"description":"Secret and key field names the encoder strips. Must not appear on the pack or nested objects.","enum":["callback_secret","callbackSecret","secret","demo_key","demoKey","api_key","apiKey","authorization","Authorization"]},"NoSecrets":{"description":"callback_secret and other secret keys must not appear.","propertyNames":{"not":{"$ref":"#/$defs/SecretName"}}},"JobId":{"type":"string","pattern":"^as_[0-9a-f]{10}$","description":"Job id assigned at create. as_ plus 10 hex characters."},"Credits":{"type":"integer","minimum":0,"description":"Integer demo credits. Not real money. Not proof of payment. Not custody."},"Stamp":{"type":"string","minLength":1,"description":"ISO-8601 UTC timestamp from the walk. Not an audit ledger stamp."},"Terminal":{"type":"string","enum":["release","dispute"],"description":"Last step of the walk. released/disputed on the job or receipt normalize to these values."},"StepAction":{"type":"string","enum":["create","fund","submit","release","dispute"],"description":"One step of the ordered walk."},"Job":{"type":"object","description":"Final client-held job after the walk. Same shape as a transition release or dispute job. Secrets stripped. Not custody.","required":["id","status"],"properties":{"id":{"$ref":"#/$defs/JobId"},"status":{"type":"string","enum":["released","disputed"]}},"allOf":[{"$ref":"#/$defs/NoSecrets"}]},"Receipt":{"type":"object","description":"Terminal receipt from the walk. Same expanded object as GET /api/schemas/receipt.json. Secrets stripped. Not proof of payment. Not custody proof.","required":["job_id","title","status","amount"],"properties":{"job_id":{"$ref":"#/$defs/JobId"},"jobId":{"$ref":"#/$defs/JobId"},"title":{"type":"string","minLength":1},"status":{"type":"string","enum":["released","disputed"]},"amount":{"type":"integer","minimum":1,"description":"Job amount in integer demo credits. Not real money."}},"allOf":[{"$ref":"#/$defs/NoSecrets"}]},"TransitionStep":{"type":"object","description":"One POST /api/v0/simulate step after secrets are stripped. Same shape as a transition success for that action. money is always false.","required":["action"],"properties":{"action":{"$ref":"#/$defs/StepAction"},"money":{"const":false},"mode":{"const":"demo"},"ok":{"const":true},"job":{"type":"object"},"receipt":{"$ref":"#/$defs/Receipt"},"fee":{"$ref":"#/$defs/Credits"},"agent_payout":{"$ref":"#/$defs/Credits"},"agent_credits_delta":{"$ref":"#/$defs/Credits"},"returned_to_payer":{"$ref":"#/$defs/Credits"},"payer_credits":{"$ref":"#/$defs/Credits"}},"allOf":[{"$ref":"#/$defs/NoSecrets"}]},"CreateStep":{"allOf":[{"$ref":"#/$defs/TransitionStep"},{"properties":{"action":{"const":"create"}}}]},"FundStep":{"allOf":[{"$ref":"#/$defs/TransitionStep"},{"properties":{"action":{"const":"fund"}}}]},"SubmitStep":{"allOf":[{"$ref":"#/$defs/TransitionStep"},{"properties":{"action":{"const":"submit"}}}]},"TerminalStep":{"allOf":[{"$ref":"#/$defs/TransitionStep"},{"properties":{"action":{"$ref":"#/$defs/Terminal"}}}]},"Quote":{"type":"object","description":"Per-step fee/state numbers already shown in the UI. money is always false. Not an invoice. Not proof of payment.","required":["action","money"],"properties":{"action":{"$ref":"#/$defs/StepAction"},"money":{"const":false},"status":{"type":"string"},"fee":{"$ref":"#/$defs/Credits"},"agent_payout":{"$ref":"#/$defs/Credits"},"agent_credits_delta":{"$ref":"#/$defs/Credits"},"returned_to_payer":{"$ref":"#/$defs/Credits"},"payer_credits":{"$ref":"#/$defs/Credits"},"expires_at":{"$ref":"#/$defs/Stamp"}},"allOf":[{"$ref":"#/$defs/NoSecrets"}]},"Timestamps":{"type":"object","description":"Walk stamps from the job/receipt plus exportedAt. Local demo only. Not an audit ledger.","properties":{"created":{"$ref":"#/$defs/Stamp"},"funded":{"$ref":"#/$defs/Stamp"},"submitted":{"$ref":"#/$defs/Stamp"},"resolved":{"$ref":"#/$defs/Stamp"},"expires_at":{"$ref":"#/$defs/Stamp"},"exportedAt":{"$ref":"#/$defs/Stamp"}},"allOf":[{"$ref":"#/$defs/NoSecrets"}]},"SimulateWalkExport":{"type":"object","description":"Downloaded liberty-simulate-*.json pack. Local demo export only. Not an audit ledger. Not custody proof. money is always false. callback_secret must not appear.","required":["kind","version","money","mode","exportedAt","note","terminal","job","transitions","quotes","receipts","receipt","timestamps"],"additionalProperties":false,"not":{"anyOf":[{"required":["callback_secret"]},{"required":["callbackSecret"]},{"required":["secret"]},{"required":["demo_key"]},{"required":["demoKey"]},{"required":["api_key"]},{"required":["apiKey"]}]},"allOf":[{"$ref":"#/$defs/NoSecrets"}],"properties":{"kind":{"const":"liberty-agent-settlement-simulate-export","description":"Pack kind. Only this value is produced by the human UI encoder."},"version":{"const":1,"description":"Export version. Only v=1 is produced."},"money":{"const":false,"description":"Always false. Demo credits only. Not real money."},"mode":{"const":"demo"},"exportedAt":{"$ref":"#/$defs/Stamp","description":"When this browser built the file. Not a server ledger time."},"note":{"type":"string","description":"Honest copy: local demo export only; not an audit ledger; not custody proof; never includes callback_secret; money: false."},"terminal":{"$ref":"#/$defs/Terminal"},"job":{"$ref":"#/$defs/Job"},"transitions":{"type":"array","description":"Ordered create → fund → submit → release|dispute. Same objects as POST /api/v0/simulate steps after secrets are stripped.","minItems":4,"maxItems":4,"prefixItems":[{"$ref":"#/$defs/CreateStep"},{"$ref":"#/$defs/FundStep"},{"$ref":"#/$defs/SubmitStep"},{"$ref":"#/$defs/TerminalStep"}]},"quotes":{"type":"array","description":"Per-step fee/state numbers (create, fund, submit, release|dispute). money is always false on each row.","minItems":4,"maxItems":4,"items":{"$ref":"#/$defs/Quote"}},"receipts":{"type":"array","description":"Terminal receipts collected from the walk. Usually one. Not proof of payment.","minItems":1,"items":{"$ref":"#/$defs/Receipt"}},"receipt":{"$ref":"#/$defs/Receipt"},"timestamps":{"$ref":"#/$defs/Timestamps"},"payer_credits":{"$ref":"#/$defs/Credits"},"fee":{"$ref":"#/$defs/Credits"},"agent_payout":{"$ref":"#/$defs/Credits"},"agent_credits_delta":{"$ref":"#/$defs/Credits"},"returned_to_payer":{"$ref":"#/$defs/Credits"},"idempotency_key":{"type":"string","description":"Echoed when the walk used an Idempotency-Key. Not a secret. Liberty does not replay stored responses."},"idempotent":{"type":"boolean","description":"True when create assigned job.id from the Idempotency-Key."}}}}}