OpenXR Policy Recompute Uses Latest Registry While Adjudication Rows Stay Versioned - Quest Fix
Your adjudication close captured reason_code_version = 12 and passed preview checks. After the team publishes registry v13, nightly policy recompute recomputes eligibility and waiver posture using the latest effect tables. Suddenly rows look non-compliant even though operators never reopened them; dashboards spike policy drift without any new closes.
In 2026, Quest-heavy adjudication lanes hit this more often because taxonomy cadence accelerated while batch jobs still defaulted to always-latest interpretability.
That mismatch is not reviewer noise; it is a version join bug between immutable adjudication snapshots and mutable registry readers.
Problem
Typical symptoms:
- historical disputes flip promotion labels after a registry publish even though close payloads never changed
- recompute logs show
registry_version_readnewer thanreason_code_versionstored on the row - signer packets disagree with automated exception summaries generated post-recompute
- migration stabilization phases report rising drift counts despite flat reopen volume
- QA notices identical evidence packets yielding different policy classes between preview UI and batch exports
If any batch path resolves codes through “whatever registry is live today,” audit replay breaks whenever taxonomy evolves.
Direct answer
Bind policy recompute to each adjudication row’s frozen semantic tuple: read registry artifacts versioned to reason_code_version (plus remap lineage when applicable), or explicitly migrate rows forward with logged remap steps—never silently reinterpret legacy closes against the newest registry.
Root cause summary
- Latest-registry reader — batch SQL or worker loads current taxonomy tables without joining stored version IDs.
- Partial migrations — registry bumped while adjudication rows remain on older versions during phased rollout.
- Dual-effect definitions — preview UI reads snapshotted policies; batch jobs read live tables.
- Missing lineage on recompute — jobs ignore
migration_window_id,mapping_rule_id, andpolicy_hashcaptured at close. - Cache keyed wrong — memoization caches policy outcomes by dispute ID only, not registry tuple.
Fastest safe fix path
- Identify one disputed production row and compare
reason_code_versionon the adjudication record againstregistry_version_usedin recompute logs. - Freeze risky batch lanes until reads use version-targeted registry snapshots or explicit remap joins.
- Patch recompute query paths to join
registry_release_idcompatible with each row’s version tuple. - Replay a sample set before next registry publication.
- Add a CI assertion that batch preview matches preview UI for frozen fixtures.
Step-by-step fix
Step 1: Instrument recompute inputs
Emit structured fields on every policy recompute execution:
adjudication_reason_code_versionregistry_schema_hash_readremap_chain_idif reopen migrated codespolicy_effect_engine_build
If registry_schema_hash_read cannot be tied to the adjudication version, stop and fix reads before arguing about reviewer quality.
Verification checkpoint: sampled logs show matching version tuples between adjudication export and batch worker.
Step 2: Replace latest-table joins with versioned reads
Patterns that usually fail:
SELECT * FROM reason_code_effects WHERE code = ?without version predicate- denormalized JSON blobs rebuilt from current CMS draft instead of published artifact at close time
Preferred patterns:
- materialized registry bundles tagged
release_idaligned with semver bump - loader reads
effects@v12when row declares version 12
Verification checkpoint: forcing registry v13 publish does not alter outputs for rows pinned at v12 unless migration rules explicitly remap them.
Step 3: Align preview UI and batch semantics
Ensure preview surfaces use the same resolver module as batch jobs. If preview snapshots policy from adjudication payload while batch recomputes from tables, split stacks guarantee drift.
Verification checkpoint: frozen dispute fixtures produce identical policy classes across preview modal and nightly export.
Step 4: Handle stabilization-phase mixed inventories
During migration you may legally hold:
- rows closed under v12
- newly closed rows under v13
Recompute must branch:
- pinned path for untouched legacy inventory
- forward-migrate path only when compatibility rules and approvals exist
Never collapse both into one latest-registry sweep.
Verification checkpoint: migration dashboards segment counts by version cohort without unexplained cross-cohort flips.
Step 5: Fix caches and idempotency keys
If caches exist:
- key by
(dispute_id, reason_code_version, registry_bundle_hash) - invalidate when intentional migration advances a row’s version after logged remap
Verification checkpoint: rerunning identical recompute twice yields bitwise-stable summaries.
Step 6: Governance gate before registry releases
Block registry publishes unless:
- regression harness proves historical cohort outputs unchanged or
- companion migration patch explicitly targets affected IDs with lineage
Verification checkpoint: release checklist references artifact hashes consumed by batch workers.
Verification checklist
- [ ] Batch logs prove registry reads tied to adjudication version or authorized remap chain.
- [ ] Preview UI and batch exports match on frozen regression disputes spanning at least two registry versions.
- [ ] No unexplained policy-class motion when publishing registry docs-only releases without schema migration.
- [ ] Idempotent recompute reruns produce identical outputs for stable inputs.
- [ ] Signer-ready packets reconcile with automated summaries after recompute fixes ship.
Alternative fixes and prevention
- Shadow recompute mode — compute both pinned and latest interpretations during migration; surface deltas instead of silently overwriting labels until governance accepts migration scope.
- Read-through overlay — temporary overlay tables mapping legacy codes for dual-window teams; retire after stabilization with expiry dates.
- Append-only adjudication amendments — when policy must change retroactively, issue explicit amendment rows rather than reinterpretation through newest registry alone.
- Quarterly registry readiness drill — rehearse publish plus batch replay with synthetic fixtures before peak release weeks.
Related problems and links
- OpenXR adjudication preview uses stale validation bundle cache but submit rejects close on Quest - fix
- OpenXR context validation blocks closes after doc-only registry publish on Quest - fix
- OpenXR reason-code compatibility map missing during migration on Quest - how to fix
- OpenXR reason-code version migration mixed adjudication and policy drift on Quest - fix
- OpenXR route closure reviewers disagree on confidence band - calibration dispute adjudication Quest fix
- OpenXR option scorer model version binding mismatch on Quest build - release lane and tuple lock fix
- Resource: 15 Free Quest OpenXR reason-code compatibility map and remap lineage audit resources (2026 Q3)
- Guide: Unity 6.6 LTS OpenXR Reason-Code Drift Detection and Adjudication Quality Calibration Loops Preflight
- Course: Lesson 146 - Reason-Code Drift Detection and Adjudication Quality Calibration Loops (2026)
- Blog: Quest OpenXR reason-code version rollout governance and safe migration windows 2026 small teams
Official references: Unity OpenXR documentation and Khronos OpenXR specification.
FAQ
Should recompute ever reinterpret legacy closes with the newest registry
Only through an explicit migration program that writes new lineage and approvals. Silent reinterpretation breaks audit defensibility.
Do doc-only registry edits require code changes
If documentation changes alter operator-facing semantics tied to automation, treat them as schema-touching until replay proves otherwise.
What if we cannot store full registry snapshots per version
Store effect_bundle_hash per release plus retrieval URL or artifact pointer; hashes must resolve reproducibly for compliance reviews.
Escalation criteria
Escalate to platform governance when:
- batch outputs diverge from signer-facing summaries after routine registry publishes
- multiple cohorts show unexplained label churn within one release train
- migration stabilization criteria cannot be met because recompute drift masks real quality signals
Bookmark this fix beside your registry publish checklist and batch worker deployment notes so version skew regressions are caught before promotion gates widen.