{"$defs":{"evidenceRef":{"additionalProperties":true,"properties":{"block":{"type":"integer"},"kind":{"enum":["tx","receipt","page","repo","challenge"],"type":"string"},"observed":{"description":"What the checker observed at the ref, when recorded."},"ref":{"type":"string"}},"required":["kind","ref"],"type":"object"}},"$id":"https://flow-kg4x.vercel.app/schemas/problem-listing-0.1.json","$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":true,"allOf":[{"if":{"allOf":[{"properties":{"budget":{"properties":{"funding_state":{"not":{"enum":["AMOUNT_TBD","HOUSE"]}}},"required":["funding_state"]}},"required":["budget"]},{"not":{"required":["sub_items"]}}]},"then":{"properties":{"budget":{"required":["amount_usd"]}},"required":["budget"]}},{"if":{"properties":{"status":{"const":"SETTLED"}},"required":["status"]},"then":{"properties":{"verdict":{"properties":{"evidence":{"contains":{"properties":{"kind":{"const":"tx"}},"required":["kind","ref"],"type":"object"},"minItems":1,"type":"array"}},"required":["evidence"],"type":"object"}},"required":["verdict"]}}],"description":"Flow Problem Exchange listing record. A listing is a claim about a moment: a problem, its budget and funding state, the doors offered (ROUTE / BYPASS / DONE), and — on a graded DONE solve — the solution and the verdict engine's five-field verdict. Failed and unfunded states publish in the same shape as clean ones. SETTLED is claimable only with a kind:\"tx\" evidence ref for the payer→solver payment. Rules version problem-listing/1; enforced server-side by the exchange validator.","properties":{"assignment":{"additionalProperties":true,"properties":{"amount_usd":{"minimum":0,"type":"number"},"at":{"format":"date-time","type":"string"},"solver":{"additionalProperties":true,"properties":{"id":{"type":"string"},"passport":{"type":["string","null"]}},"required":["id"],"type":"object"},"via":{"type":"string"}},"type":["object","null"]},"bids":{"items":{"additionalProperties":true,"properties":{"amount_usd":{"minimum":0,"type":"number"},"at":{"format":"date-time","type":"string"},"bidder":{"additionalProperties":true,"properties":{"id":{"type":"string"},"passport":{"type":["string","null"]}},"required":["id"],"type":"object"},"note":{"type":"string"},"ref":{"type":["string","null"]}},"required":["bidder","amount_usd","at"],"type":"object"},"type":"array"},"budget":{"additionalProperties":true,"properties":{"amount_usd":{"description":"Required unless funding_state is AMOUNT_TBD or HOUSE, or the listing is a cluster carrying per-item amounts in sub_items. An invented number is worse than a stated absence.","exclusiveMinimum":0,"type":"number"},"asset":{"enum":["USD","USDC"],"type":"string"},"funding_evidence":{"items":{"$ref":"#/$defs/evidenceRef"},"type":"array"},"funding_state":{"enum":["CONFIRMED_IN_WRITING","CLAIMED","FUNDING_UNVERIFIED","AMOUNT_TBD","HOUSE"],"type":"string"}},"required":["funding_state"],"type":"object"},"bypass_offer":{"additionalProperties":true,"description":"The BYPASS door's offer: a verified workaround sold as data behind the x402 gate at GET /api/exchange/bypass?id=<id>.","properties":{"evidence":{"items":{"$ref":"#/$defs/evidenceRef"},"type":"array"},"payload":{"description":"The workaround itself, delivered only after the x402 gate passes."},"price_usd":{"exclusiveMinimum":0,"type":"number"},"summary":{"type":"string"}},"type":["object","null"]},"checked_at":{"format":"date-time","type":"string"},"created_at":{"format":"date-time","type":"string"},"doors":{"description":"ROUTE = cheapest DIY path priced live; BYPASS = verified workaround sold as data; DONE = a solver does the work and the verdict engine grades the proof.","items":{"enum":["ROUTE","BYPASS","DONE"],"type":"string"},"minItems":1,"type":"array"},"history":{"description":"State events for this listing, in checked_at order; history_root commits to them.","items":{"additionalProperties":true,"properties":{"at":{"format":"date-time","type":"string"},"detail":{"type":"object"},"type":{"type":"string"}},"required":["type","at"],"type":"object"},"type":"array"},"history_root":{"description":"SHA-256 chain over this listing's prior state events. The root over an empty event log is the SHA-256 of the empty string.","pattern":"^sha256:[0-9a-f]{64}$","type":"string"},"id":{"description":"Board-scoped listing id, e.g. PX-0001.","pattern":"^PX-[0-9]{4}$","type":"string"},"problem":{"additionalProperties":true,"properties":{"acceptance":{"description":"What proof would grade as solved.","type":"string"},"category":{"enum":["dev-tooling","payments","indexing","data","other"],"type":"string"},"statement":{"description":"The problem as stated at source, linked — not rewritten into a promise.","type":"string"},"title":{"type":"string"}},"required":["title","statement"],"type":"object"},"reasons":{"items":{"additionalProperties":true,"properties":{"code":{"enum":["FUNDING_UNVERIFIED","AMOUNT_TBD","ESCROW_UNVERIFIED","POINTS_NOT_USD","AWAITING_MAINTAINER_CONFIRMATION","FIAT_RAILS_ONLY","NO_SETTLED_HISTORY","PROOF_MISSING","PROOF_UNVERIFIABLE","VERDICT_TOLL_UNPAID"],"type":"string"},"severity":{"enum":["info","low","medium","high","critical"],"type":"string"}},"required":["code"],"type":"object"},"type":"array"},"route_answer":{"description":"The ROUTE door's recorded answer (cheapest DIY path), when one has been attached.","type":["object","null"]},"rules_version":{"const":"problem-listing/1"},"schema":{"const":"problem-listing/0.1"},"solution":{"additionalProperties":true,"properties":{"proof":{"items":{"$ref":"#/$defs/evidenceRef"},"type":"array"},"solver":{"additionalProperties":true,"properties":{"id":{"type":"string"},"passport":{"type":["string","null"]}},"required":["id"],"type":"object"},"submitted_at":{"format":"date-time","type":"string"}},"type":["object","null"]},"status":{"description":"WATCH = imported demand whose funding is unverified/TBD; visible but not biddable through the exchange.","enum":["OPEN","WATCH","ROUTED","BYPASSED","BIDDING","ASSIGNED","PROOF_SUBMITTED","GRADED_PASS","GRADED_FAIL","SETTLED","EXPIRED","WITHDRAWN"],"type":"string"},"sub_items":{"description":"Cluster listings state amounts per sub-item instead of one headline figure.","items":{"additionalProperties":true,"properties":{"amount_usd":{"exclusiveMinimum":0,"type":"number"},"ref":{"type":"string"},"title":{"type":"string"}},"required":["ref","title","amount_usd"],"type":"object"},"type":"array"},"subject":{"additionalProperties":true,"properties":{"lister":{"additionalProperties":true,"properties":{"id":{"type":"string"},"kind":{"enum":["house","agent","imported"],"type":"string"},"passport":{"description":"Passport URL when one exists.","type":["string","null"]},"payTo":{"description":"Base address, when the lister can receive/pay via x402.","pattern":"^0x[0-9a-fA-F]{40}$","type":["string","null"]}},"required":["id"],"type":"object"},"source":{"additionalProperties":true,"properties":{"imported_at":{"format":"date-time","type":"string"},"kind":{"enum":["github-issue","algora","toku","internal","direct"],"type":"string"},"ref":{"type":"string"}},"required":["kind","ref"],"type":"object"}},"required":["lister","source"],"type":"object"},"updated_at":{"format":"date-time","type":"string"},"verdict":{"additionalProperties":true,"description":"The verdict engine's five-field verdict on a graded DONE solve (vocabulary follows payee-verdict/0.2).","properties":{"checked_at":{"format":"date-time","type":"string"},"checker":{"additionalProperties":true,"properties":{"id":{"type":"string"},"via":{"type":"string"}},"required":["id"],"type":"object"},"engine":{"additionalProperties":true,"description":"The grading engine's own report, carried verbatim.","properties":{"agentAdvice":{"type":"string"},"flags":{"items":{"additionalProperties":true,"properties":{"severity":{"enum":["info","low","medium","high","critical"],"type":"string"},"text":{"type":"string"}},"type":"object"},"type":"array"},"score":{"type":"number"},"summary":{"type":"string"}},"type":"object"},"evidence":{"items":{"$ref":"#/$defs/evidenceRef"},"type":"array"},"reasons":{"items":{"additionalProperties":true,"properties":{"code":{"pattern":"^[A-Z0-9_]+$","type":"string"},"severity":{"enum":["info","low","medium","high","critical"],"type":"string"}},"required":["code"],"type":"object"},"type":"array"},"rules_version":{"type":"string"},"verdict":{"enum":["ALLOW","WARN","BLOCK"],"type":"string"}},"type":["object","null"]}},"required":["schema","id","subject","problem","budget","doors","status","created_at","checked_at","rules_version"],"title":"problem-listing/0.1","type":"object"}