[{"data":1,"prerenderedAt":985},["ShallowReactive",2],{"navigation_docs":3,"-docs-operations-billing-and-budgets":356,"-docs-operations-billing-and-budgets-surround":980},[4,8,34,64,90,139,157,171,193,227,241,266,312,334],{"title":5,"path":6,"stem":7},"Documentation","\u002Fdocs","docs\u002Findex",{"title":9,"path":10,"stem":11,"children":12},"Getting started","\u002Fdocs\u002Fgetting-started","docs\u002F01.getting-started\u002Findex",[13,14,18,22,26,30],{"title":9,"path":10,"stem":11},{"title":15,"path":16,"stem":17},"Introduction","\u002Fdocs\u002Fgetting-started\u002Fintroduction","docs\u002F01.getting-started\u002F01.introduction",{"title":19,"path":20,"stem":21},"Concepts","\u002Fdocs\u002Fgetting-started\u002Fconcepts","docs\u002F01.getting-started\u002F02.concepts",{"title":23,"path":24,"stem":25},"Quickstart (5 minutes)","\u002Fdocs\u002Fgetting-started\u002Fquickstart","docs\u002F01.getting-started\u002F03.quickstart",{"title":27,"path":28,"stem":29},"Local development","\u002Fdocs\u002Fgetting-started\u002Flocal-development","docs\u002F01.getting-started\u002F04.local-development",{"title":31,"path":32,"stem":33},"FAQ","\u002Fdocs\u002Fgetting-started\u002Ffaq","docs\u002F01.getting-started\u002F05.faq",{"title":35,"path":36,"stem":37,"children":38},"Architecture","\u002Fdocs\u002Farchitecture","docs\u002F02.architecture\u002Findex",[39,40,44,48,52,56,60],{"title":35,"path":36,"stem":37},{"title":41,"path":42,"stem":43},"Architecture overview","\u002Fdocs\u002Farchitecture\u002Foverview","docs\u002F02.architecture\u002F01.overview",{"title":45,"path":46,"stem":47},"Services","\u002Fdocs\u002Farchitecture\u002Fservices","docs\u002F02.architecture\u002F02.services",{"title":49,"path":50,"stem":51},"Request lifecycle","\u002Fdocs\u002Farchitecture\u002Frequest-lifecycle","docs\u002F02.architecture\u002F03.request-lifecycle",{"title":53,"path":54,"stem":55},"Data model","\u002Fdocs\u002Farchitecture\u002Fdata-model","docs\u002F02.architecture\u002F04.data-model",{"title":57,"path":58,"stem":59},"Status and evidence","\u002Fdocs\u002Farchitecture\u002Fstatus-and-evidence","docs\u002F02.architecture\u002F05.status-and-evidence",{"title":61,"path":62,"stem":63},"Target architecture and authority","\u002Fdocs\u002Farchitecture\u002Ftarget-architecture","docs\u002F02.architecture\u002F06.target-architecture",{"title":65,"path":66,"stem":67,"children":68},"Auth","\u002Fdocs\u002Fauth","docs\u002F03.auth\u002Findex",[69,70,74,78,82,86],{"title":65,"path":66,"stem":67},{"title":71,"path":72,"stem":73},"Overview","\u002Fdocs\u002Fauth\u002Foverview","docs\u002F03.auth\u002F01.overview",{"title":75,"path":76,"stem":77},"Organization and agent model","\u002Fdocs\u002Fauth\u002Forg-project-model","docs\u002F03.auth\u002F02.org-project-model",{"title":79,"path":80,"stem":81},"Issuing API keys","\u002Fdocs\u002Fauth\u002Fissuing-api-keys","docs\u002F03.auth\u002F03.issuing-api-keys",{"title":83,"path":84,"stem":85},"Multi-tenant RLS","\u002Fdocs\u002Fauth\u002Fmulti-tenant-rls","docs\u002F03.auth\u002F04.multi-tenant-rls",{"title":87,"path":88,"stem":89},"Operator sessions and step-up","\u002Fdocs\u002Fauth\u002Foperator-sessions","docs\u002F03.auth\u002F05.operator-sessions",{"title":91,"path":92,"stem":93,"children":94},"Proxy","\u002Fdocs\u002Fproxy","docs\u002F04.proxy\u002Findex",[95,96,99,103,107,111,115,119,123,127,131,135],{"title":91,"path":92,"stem":93},{"title":71,"path":97,"stem":98},"\u002Fdocs\u002Fproxy\u002Foverview","docs\u002F04.proxy\u002F01.overview",{"title":100,"path":101,"stem":102},"Authentication","\u002Fdocs\u002Fproxy\u002Fauthentication","docs\u002F04.proxy\u002F02.authentication",{"title":104,"path":105,"stem":106},"Request routing","\u002Fdocs\u002Fproxy\u002Frequest-routing","docs\u002F04.proxy\u002F03.request-routing",{"title":108,"path":109,"stem":110},"Sessions","\u002Fdocs\u002Fproxy\u002Fsessions","docs\u002F04.proxy\u002F04.sessions",{"title":112,"path":113,"stem":114},"Directives","\u002Fdocs\u002Fproxy\u002Fdirectives","docs\u002F04.proxy\u002F05.directives",{"title":116,"path":117,"stem":118},"Idempotency and budgets","\u002Fdocs\u002Fproxy\u002Fidempotency-and-budgets","docs\u002F04.proxy\u002F06.idempotency-and-budgets",{"title":120,"path":121,"stem":122},"Rate limiting","\u002Fdocs\u002Fproxy\u002Frate-limiting","docs\u002F04.proxy\u002F07.rate-limiting",{"title":124,"path":125,"stem":126},"Provider adapters","\u002Fdocs\u002Fproxy\u002Fprovider-adapters","docs\u002F04.proxy\u002F08.provider-adapters",{"title":128,"path":129,"stem":130},"Auth caching","\u002Fdocs\u002Fproxy\u002Fauth-caching","docs\u002F04.proxy\u002F09.auth-caching",{"title":132,"path":133,"stem":134},"Configuration","\u002Fdocs\u002Fproxy\u002Fconfiguration","docs\u002F04.proxy\u002F10.configuration",{"title":136,"path":137,"stem":138},"Provider routing and resilience","\u002Fdocs\u002Fproxy\u002Fprovider-routing-and-resilience","docs\u002F04.proxy\u002F11.provider-routing-and-resilience",{"title":140,"path":141,"stem":142,"children":143},"Memory","\u002Fdocs\u002Fmemory","docs\u002F05.memory\u002Findex",[144,145,149,153],{"title":140,"path":141,"stem":142},{"title":146,"path":147,"stem":148},"Memory overview","\u002Fdocs\u002Fmemory\u002Foverview","docs\u002F05.memory\u002F01.overview",{"title":150,"path":151,"stem":152},"Write path","\u002Fdocs\u002Fmemory\u002Fwrite-path","docs\u002F05.memory\u002F02.write-path",{"title":154,"path":155,"stem":156},"Search and lifecycle","\u002Fdocs\u002Fmemory\u002Fsearch-and-lifecycle","docs\u002F05.memory\u002F03.search-and-lifecycle",{"title":158,"path":159,"stem":160,"children":161},"Context","\u002Fdocs\u002Fcontext","docs\u002F06.context\u002Findex",[162,163,167],{"title":158,"path":159,"stem":160},{"title":164,"path":165,"stem":166},"Assembly pipeline","\u002Fdocs\u002Fcontext\u002Foverview","docs\u002F06.context\u002F01.overview",{"title":168,"path":169,"stem":170},"Ranking and packing","\u002Fdocs\u002Fcontext\u002Franking-and-packing","docs\u002F06.context\u002F02.ranking-and-packing",{"title":172,"path":173,"stem":174,"children":175},"Intelligence","\u002Fdocs\u002Fintelligence","docs\u002F07.intelligence\u002Findex",[176,177,181,185,189],{"title":172,"path":173,"stem":174},{"title":178,"path":179,"stem":180},"Workers","\u002Fdocs\u002Fintelligence\u002Fworkers","docs\u002F07.intelligence\u002F01.workers",{"title":182,"path":183,"stem":184},"Extraction","\u002Fdocs\u002Fintelligence\u002Fextraction","docs\u002F07.intelligence\u002F02.extraction",{"title":186,"path":187,"stem":188},"Embedder","\u002Fdocs\u002Fintelligence\u002Fembedder","docs\u002F07.intelligence\u002F03.embedder",{"title":190,"path":191,"stem":192},"Extraction evaluation","\u002Fdocs\u002Fintelligence\u002Fevaluation","docs\u002F07.intelligence\u002F04.evaluation",{"title":194,"path":195,"stem":196,"children":197},"API reference","\u002Fdocs\u002Fapi-reference","docs\u002F08.api-reference\u002Findex",[198,199,203,207,211,215,219,223],{"title":194,"path":195,"stem":196},{"title":200,"path":201,"stem":202},"Chat completions","\u002Fdocs\u002Fapi-reference\u002Fchat-completions","docs\u002F08.api-reference\u002F01.chat-completions",{"title":204,"path":205,"stem":206},"Responses","\u002Fdocs\u002Fapi-reference\u002Fresponses","docs\u002F08.api-reference\u002F02.responses",{"title":208,"path":209,"stem":210},"Errors","\u002Fdocs\u002Fapi-reference\u002Ferrors","docs\u002F08.api-reference\u002F03.errors",{"title":212,"path":213,"stem":214},"Health and metrics","\u002Fdocs\u002Fapi-reference\u002Fproxy-health","docs\u002F08.api-reference\u002F04.proxy-health",{"title":216,"path":217,"stem":218},"HTTP route inventory","\u002Fdocs\u002Fapi-reference\u002Fhttp-routes","docs\u002F08.api-reference\u002F05.http-routes",{"title":220,"path":221,"stem":222},"Management API","\u002Fdocs\u002Fapi-reference\u002Fmanagement-api","docs\u002F08.api-reference\u002F06.management-api",{"title":224,"path":225,"stem":226},"Auth gRPC (ValidateToken, ValidateAgent)","\u002Fdocs\u002Fapi-reference\u002Fauth-grpc","docs\u002F08.api-reference\u002F07.auth-grpc",{"title":228,"path":229,"stem":230,"children":231},"MCP","\u002Fdocs\u002Fmcp","docs\u002F09.mcp\u002Findex",[232,233,237],{"title":228,"path":229,"stem":230},{"title":234,"path":235,"stem":236},"Memory server","\u002Fdocs\u002Fmcp\u002Fmemory-server","docs\u002F09.mcp\u002F01.memory-server",{"title":238,"path":239,"stem":240},"Operator gateway","\u002Fdocs\u002Fmcp\u002Foperator-gateway","docs\u002F09.mcp\u002F02.operator-gateway",{"title":242,"path":243,"stem":244,"children":245},"Security","\u002Fdocs\u002Fsecurity","docs\u002F10.security\u002Findex",[246,247,251,254,258,262],{"title":242,"path":243,"stem":244},{"title":248,"path":249,"stem":250},"Security overview","\u002Fdocs\u002Fsecurity\u002Foverview","docs\u002F10.security\u002F01.overview",{"title":100,"path":252,"stem":253},"\u002Fdocs\u002Fsecurity\u002Fauthentication","docs\u002F10.security\u002F02.authentication",{"title":255,"path":256,"stem":257},"Tenant isolation","\u002Fdocs\u002Fsecurity\u002Ftenant-isolation","docs\u002F10.security\u002F03.tenant-isolation",{"title":259,"path":260,"stem":261},"Secrets and keys","\u002Fdocs\u002Fsecurity\u002Fsecrets-and-keys","docs\u002F10.security\u002F04.secrets-and-keys",{"title":263,"path":264,"stem":265},"Prompt injection","\u002Fdocs\u002Fsecurity\u002Fprompt-injection","docs\u002F10.security\u002F05.prompt-injection",{"title":267,"path":268,"stem":269,"children":270},"Operations","\u002Fdocs\u002Foperations","docs\u002F11.operations\u002Findex",[271,272,276,280,284,288,292,296,300,304,308],{"title":267,"path":268,"stem":269},{"title":273,"path":274,"stem":275},"Observability","\u002Fdocs\u002Foperations\u002Fobservability","docs\u002F11.operations\u002F01.observability",{"title":277,"path":278,"stem":279},"Traces and ClickHouse","\u002Fdocs\u002Foperations\u002Ftraces-and-clickhouse","docs\u002F11.operations\u002F02.traces-and-clickhouse",{"title":281,"path":282,"stem":283},"Health checks","\u002Fdocs\u002Foperations\u002Fhealth-checks","docs\u002F11.operations\u002F03.health-checks",{"title":285,"path":286,"stem":287},"Incident response","\u002Fdocs\u002Foperations\u002Fincident-response","docs\u002F11.operations\u002F04.incident-response",{"title":289,"path":290,"stem":291},"Troubleshooting","\u002Fdocs\u002Foperations\u002Ftroubleshooting","docs\u002F11.operations\u002F05.troubleshooting",{"title":293,"path":294,"stem":295},"Billing and budgets","\u002Fdocs\u002Foperations\u002Fbilling-and-budgets","docs\u002F11.operations\u002F06.billing-and-budgets",{"title":297,"path":298,"stem":299},"Evidence and relay","\u002Fdocs\u002Foperations\u002Fevidence-and-relay","docs\u002F11.operations\u002F07.evidence-and-relay",{"title":301,"path":302,"stem":303},"Console","\u002Fdocs\u002Foperations\u002Fconsole","docs\u002F11.operations\u002F08.console",{"title":305,"path":306,"stem":307},"Failure modes and recovery","\u002Fdocs\u002Foperations\u002Ffailure-and-recovery","docs\u002F11.operations\u002F09.failure-and-recovery",{"title":309,"path":310,"stem":311},"Data lifecycle and deletion","\u002Fdocs\u002Foperations\u002Fdata-lifecycle-and-deletion","docs\u002F11.operations\u002F10.data-lifecycle-and-deletion",{"title":313,"path":314,"stem":315,"children":316},"Deployment","\u002Fdocs\u002Fdeployment","docs\u002F12.deployment\u002Findex",[317,318,322,326,330],{"title":313,"path":314,"stem":315},{"title":319,"path":320,"stem":321},"Docker Compose (dev)","\u002Fdocs\u002Fdeployment\u002Fdocker-compose","docs\u002F12.deployment\u002F01.docker-compose",{"title":323,"path":324,"stem":325},"Environment variables","\u002Fdocs\u002Fdeployment\u002Fenvironment-variables","docs\u002F12.deployment\u002F02.environment-variables",{"title":327,"path":328,"stem":329},"Kubernetes","\u002Fdocs\u002Fdeployment\u002Fkubernetes","docs\u002F12.deployment\u002F03.kubernetes",{"title":331,"path":332,"stem":333},"Production readiness","\u002Fdocs\u002Fdeployment\u002Fproduction-readiness","docs\u002F12.deployment\u002F04.production-readiness",{"title":335,"path":336,"stem":337,"children":338},"Reference","\u002Fdocs\u002Freference","docs\u002F13.reference\u002Findex",[339,340,344,348,352],{"title":335,"path":336,"stem":337},{"title":341,"path":342,"stem":343},"Glossary","\u002Fdocs\u002Freference\u002Fglossary","docs\u002F13.reference\u002F01.glossary",{"title":345,"path":346,"stem":347},"Roadmap and gates","\u002Fdocs\u002Freference\u002Froadmap","docs\u002F13.reference\u002F02.roadmap",{"title":349,"path":350,"stem":351},"Architecture decisions","\u002Fdocs\u002Freference\u002Fadr","docs\u002F13.reference\u002F03.adr",{"title":353,"path":354,"stem":355},"Compatibility and versioning","\u002Fdocs\u002Freference\u002Fcompatibility","docs\u002F13.reference\u002F04.compatibility",{"id":357,"title":293,"audience":358,"author":359,"authorUrl":359,"body":360,"coverIndex":359,"coverLabel":359,"coverTone":359,"date":359,"decisionStatus":359,"description":971,"excerpt":359,"extension":972,"featured":973,"historical":973,"meta":974,"navigation":975,"path":294,"readingTime":359,"scope":976,"seo":977,"sourceOfTruth":978,"status":371,"stem":295,"tags":359,"verifiedDate":372,"__hash__":979},"docs\u002Fdocs\u002F11.operations\u002F06.billing-and-budgets.md","operator",null,{"type":361,"value":362,"toc":961},"minimark",[363,367,373,378,525,532,535,556,559,563,576,579,614,621,722,725,729,773,783,792,795,819,825,829,850,854,903,925,929,957],[364,365,366],"p",{},"Billing is split across configuration, admission, usage facts, and reconciliation. Each has a different authority; combining them into one “spend” number without naming the source is how billing bugs become incidents.",[368,369],"page-status",{"note":370,"status":371,"verified":372},"Local holds and rollups exist; reconciliation and hosted evidence remain open","PROVISIONAL","2026-10-21",[374,375,377],"h2",{"id":376},"components-and-authority","Components and authority",[379,380,381,400],"table",{},[382,383,384],"thead",{},[385,386,387,391,394,397],"tr",{},[388,389,390],"th",{},"Component",[388,392,393],{},"Store",[388,395,396],{},"Responsibility",[388,398,399],{},"Status",[401,402,403,425,448,463,478,494,511],"tbody",{},[385,404,405,409,419,422],{},[406,407,408],"td",{},"Rate cards",[406,410,411,415,416],{},[412,413,414],"code",{},"ibex_billing.rate_cards",", ",[412,417,418],{},"rate_card_versions",[406,420,421],{},"Org price catalog; published versions are immutable",[406,423,424],{},"Implemented locally",[385,426,427,430,435,446],{},[406,428,429],{},"Budget periods",[406,431,432],{},[412,433,434],{},"ibex_billing.budget_periods",[406,436,437,438,441,442,445],{},"Cap, cached spend, and ",[412,439,440],{},"alert_only"," or ",[412,443,444],{},"hard_cap"," mode",[406,447,424],{},[385,449,450,453,458,461],{},[406,451,452],{},"Enforcement decisions",[406,454,455],{},[412,456,457],{},"ibex_billing.enforcement_decisions",[406,459,460],{},"Allow\u002Fdeny\u002Funavailable audit trail",[406,462,424],{},[385,464,465,468,473,476],{},[406,466,467],{},"Admission holds",[406,469,470],{},[412,471,472],{},"ibex_core.budget_reservations",[406,474,475],{},"Durable hard-cap capacity while a request is live",[406,477,424],{},[385,479,480,483,489,492],{},[406,481,482],{},"Usage facts",[406,484,485,486],{},"ClickHouse ",[412,487,488],{},"ibex.usage_facts",[406,490,491],{},"Request\u002Ftoken\u002Fcost facts; no TTL",[406,493,424],{},[385,495,496,499,502,509],{},[406,497,498],{},"Reconciliation",[406,500,501],{},"Worker rollup + cache invalidation",[406,503,504,505,508],{},"Refresh ",[412,506,507],{},"spent_cents_cached"," from usage facts",[406,510,424],{},[385,512,513,516,519,522],{},[406,514,515],{},"Invoice actuals",[406,517,518],{},"—",[406,520,521],{},"Provider invoice reconciliation",[406,523,524],{},"Deferred, no invoice source (#859)",[364,526,527,528,531],{},"The billing tables are intentionally protected from organization-deletion cascade (the billing carve-out in migration ",[412,529,530],{},"000038","). Billing records can outlive the operational organization data; do not describe org deletion as erasing every billing row.",[374,533,408],{"id":534},"rate-cards",[364,536,537,538,415,541,544,545,548,549,551,552,555],{},"A rate card belongs to an organization and has ",[412,539,540],{},"draft",[412,542,543],{},"published",", or ",[412,546,547],{},"archived"," status. Publishing creates a new immutable ",[412,550,418],{}," row with ",[412,553,554],{},"prices"," as JSONB entries containing provider, model pattern, and input\u002Foutput cents per 1k tokens. The version number is the next maximum for that card.",[364,557,558],{},"A published version is not a guarantee that the proxy charged it. Verify which version and model pattern were used when reconciling a disputed amount.",[374,560,562],{"id":561},"hard-cap-admission","Hard-cap admission",[364,564,565,566,568,569,572,573,575],{},"The proxy consults the budget cache first. Organizations without an active ",[412,567,444],{}," period skip the ledger entirely (",[412,570,571],{},"no_cap","). ",[412,574,440],{}," periods do not reserve capacity.",[364,577,578],{},"For a hard-cap organization, a claim:",[580,581,582,586,589,600,607],"ol",{},[583,584,585],"li",{},"Opens a transaction and resolves the active period.",[583,587,588],{},"Takes a per-org advisory lock.",[583,590,591,592,595,596,599],{},"Resolves the row for ",[412,593,594],{},"(org_id, agent_id, reservation_key)"," under ",[412,597,598],{},"FOR UPDATE",".",[583,601,602,603,606],{},"Compares ",[412,604,605],{},"spent_cents_cached + SUM(live claimed holds)"," with the cap.",[583,608,609,610,613],{},"Persists or reclaims a ",[412,611,612],{},"claimed"," hold with a lease.",[364,615,616,617,620],{},"Reservation keys and request hashes must be non-empty; keys are capped at 256 characters, and negative estimates are rejected before querying. ",[412,618,619],{},"HashRequest"," is a SHA-256 hex fingerprint of a canonical request payload.",[379,622,623,636],{},[382,624,625],{},[385,626,627,630,633],{},[388,628,629],{},"Outcome",[388,631,632],{},"Meaning",[388,634,635],{},"Client behavior",[401,637,638,651,668,681,696,708],{},[385,639,640,645,648],{},[406,641,642],{},[412,643,644],{},"owned",[406,646,647],{},"Fresh hold owned by this request",[406,649,650],{},"Continue to provider",[385,652,653,658,661],{},[406,654,655],{},[412,656,657],{},"in_progress",[406,659,660],{},"Same key is held by another owner",[406,662,663,664,667],{},"Retry after ",[412,665,666],{},"RetryAfter","; do not admit twice",[385,669,670,675,678],{},[406,671,672],{},[412,673,674],{},"conflict",[406,676,677],{},"Same key, different request hash",[406,679,680],{},"Reject the request",[385,682,683,688,691],{},[406,684,685],{},[412,686,687],{},"exceeded",[406,689,690],{},"Hold would cross the active cap",[406,692,693],{},[412,694,695],{},"402 BUDGET_EXCEEDED",[385,697,698,702,705],{},[406,699,700],{},[412,701,571],{},[406,703,704],{},"No active hard-cap period",[406,706,707],{},"Continue without a hold",[385,709,710,713,716],{},[406,711,712],{},"Ledger\u002Fquery failure",[406,714,715],{},"Authority unavailable",[406,717,718,721],{},[412,719,720],{},"503 BUDGET_UNAVAILABLE","; fail closed",[364,723,724],{},"The default lease is 15 minutes, sized to cover long streaming calls. A worker reaper expires stale claims only after the lease plus a 1-hour grace, in batches of 500, so a slow but live owner can still settle.",[374,726,728],{"id":727},"finalize-release-and-overshoot","Finalize, release, and overshoot",[379,730,731,741],{},[382,732,733],{},[385,734,735,738],{},[388,736,737],{},"Settling action",[388,739,740],{},"Effect",[401,742,743,753,763],{},[385,744,745,750],{},[406,746,747],{},[412,748,749],{},"Finalize(complete)",[406,751,752],{},"Provider usage supplied the amount",[385,754,755,760],{},[406,756,757],{},[412,758,759],{},"Finalize(estimated)",[406,761,762],{},"Provider supplied no usage; admission estimate is the best available amount",[385,764,765,770],{},[406,766,767],{},[412,768,769],{},"Release",[406,771,772],{},"Failed\u002Fcanceled request; no settled amount",[364,774,775,776,779,780,599],{},"Finalize and release are idempotent for an identical repeat and return ",[412,777,778],{},"ErrClaimClosed"," otherwise. A reclaimed reservation cannot be settled by the old owner. Never record a provider response without usage as ",[412,781,782],{},"complete",[784,785,788,789,791],"callout",{"title":786,"type":787},"Bounded overshoot is real","warning","Finalized rows are excluded from the live cap sum, and ",[412,790,507],{}," updates only on the next rollup. Between settlement and rollup there is a bounded overshoot window. This is a documented limitation, not exact enforcement.",[374,793,498],{"id":794},"reconciliation",[364,796,797,800,801,804,805,807,808,811,812,814,815,818],{},[412,798,799],{},"budget_spent_rollup"," lists active periods and sums ",[412,802,803],{},"estimated_cost_cents"," from ",[412,806,488],{}," in ClickHouse for each org and period. The query must include ",[412,809,810],{},"org_id"," explicitly because ClickHouse has no RLS. The worker then updates ",[412,813,507],{}," and publishes ",[412,816,817],{},"budget_updates:{org_id}"," so the proxy refreshes its cache.",[364,820,821,824],{},[412,822,823],{},"reconcile_usage_actuals"," is currently deferred because there is no provider invoice source. A cached spend number is therefore a rollup of IBEX usage facts, not a provider invoice.",[374,826,828],{"id":827},"known-gaps","Known gaps",[830,831,832,838,841,844,847],"ul",{},[583,833,834,835,837],{},"Extraction usage is not exported to ",[412,836,488],{},", so completed extraction spend is missing from the rollup.",[583,839,840],{},"Chat and worker enqueue are admission-time dedupe, not exactly-once provider or Celery execution.",[583,842,843],{},"Crash\u002Freplay, cross-language canonicalization, broader operation rollout, and independent review remain open.",[583,845,846],{},"ClickHouse is a projection for usage facts but not a substitute for the reservation ledger.",[583,848,849],{},"GAP-006 remains open; billing is not invoice-grade or hosted-reconciled.",[374,851,853],{"id":852},"operator-checks","Operator checks",[855,856,861],"pre",{"className":857,"code":858,"language":859,"meta":860,"style":860},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","go test -race .\u002Fpackages\u002Fbudgetledger\u002F...\ngo test .\u002Fpackages\u002Fbilling\u002F...\ngo test .\u002Fpackages\u002Fusagequery\u002F...\n","bash","",[412,862,863,883,893],{"__ignoreMap":860},[864,865,868,872,876,880],"span",{"class":866,"line":867},"line",1,[864,869,871],{"class":870},"sYn-s","go",[864,873,875],{"class":874},"sTbE_"," test",[864,877,879],{"class":878},"sz9Cv"," -race",[864,881,882],{"class":874}," .\u002Fpackages\u002Fbudgetledger\u002F...\n",[864,884,886,888,890],{"class":866,"line":885},2,[864,887,871],{"class":870},[864,889,875],{"class":874},[864,891,892],{"class":874}," .\u002Fpackages\u002Fbilling\u002F...\n",[864,894,896,898,900],{"class":866,"line":895},3,[864,897,871],{"class":870},[864,899,875],{"class":874},[864,901,902],{"class":874}," .\u002Fpackages\u002Fusagequery\u002F...\n",[364,904,905,906,908,909,415,911,415,914,917,918,921,922,924],{},"Inspect ",[412,907,472],{}," for ",[412,910,612],{},[412,912,913],{},"finalized",[412,915,916],{},"released",", and ",[412,919,920],{},"expired"," rows. Check ",[412,923,457],{}," for deny\u002Funavailable reasons. A stale claim is not automatically safe to finalize; only the lease expiry plus grace makes it reclaimable, and a new owner's version fences the old one.",[374,926,928],{"id":927},"related","Related",[830,930,931,937,942,947,952],{},[583,932,933,936],{},[934,935,305],"a",{"href":306}," — ledger outage behavior",[583,938,939,941],{},[934,940,297],{"href":298}," — separate evidence authority",[583,943,944,946],{},[934,945,309],{"href":310}," — billing carve-out and legal holds",[583,948,949,951],{},[934,950,220],{"href":221}," — rate-card and budget routes",[583,953,954,956],{},[934,955,273],{"href":274}," — metrics for denials and rollups",[958,959,960],"style",{},"html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":860,"searchDepth":885,"depth":885,"links":962},[963,964,965,966,967,968,969,970],{"id":376,"depth":885,"text":377},{"id":534,"depth":885,"text":408},{"id":561,"depth":885,"text":562},{"id":727,"depth":885,"text":728},{"id":794,"depth":885,"text":498},{"id":827,"depth":885,"text":828},{"id":852,"depth":885,"text":853},{"id":927,"depth":885,"text":928},"Rate cards, usage facts, hard-cap admission holds, reconciliation, and the limits of each authority.","md",false,{},true,"provisional",{"title":293,"description":971},"packages\u002Fbudgetledger; packages\u002Fbilling; services\u002Fworker\u002Fapp\u002Ftasks\u002Fbilling_reconcile.py; infra\u002Fmigrations\u002Fpostgres\u002F000038_billing.up.sql","EFpCnMORn9McD7zXN1EuaHkdfIEtj7hYSPu_7IVujtQ",[981,983],{"title":289,"path":290,"stem":291,"description":982,"children":-1},"Common compose-dev, auth, proxy, and database failures for local development.",{"title":297,"path":298,"stem":299,"description":984,"children":-1},"The PostgreSQL outbox, claim and fence protocol, delivery classes, and the recovery limits of the relay daemon.",1792875078830]