Prediction Oracle Reconciliation
Prediction Oracle Reconciliation exercises synthetic forecast reconciliation gates without forecasting, trading, provider, or live-market authority.
The write-up
prediction_oracle_reconciliation audits one synthetic forecast packet on invented fixture data, with no live feed, external model access, trading, or performance claim. prediction_oracle_reconciliation takes one synthetic forecast packet and checks whether its reasoning would survive an honest audit. It runs entirely on invented fixture data. There is no live market feed, no external model access, no trading, and no performance claim.
It answers one narrow question about whether the packet keeps its evidence honest and grading recomputable, emitting metadata-only result records of counts, verdicts, and rejected cases. The component answers one narrow question: does this prediction packet keep its evidence honest and its grading recomputable, or does it cut a corner? It emits a set of result records that name the counts, verdicts, and rejected cases. The packet body, the claimed numbers, and any copied source bodies stay out of those records.
The component distrusts the packet's own numbers, recomputing error and direction from raw prices and rejecting any claimed value that disagrees. The unusual choice is that the component does not trust the numbers the packet reports. For every graded row it recomputes the error and the direction from the raw prices, then rejects any claimed value that disagrees with the recompute.
Purpose
Two quiet ways a forecast is wrong
A forecast can hide a large numeric miss behind a correct direction or lean on evidence that arrived after the outcome, and this component surfaces both on a synthetic packet. A forecast can be wrong in two quiet ways. It can call the direction right and still be far off on the number, so a correct arrow hides a large miss. And it can look accurate only because it used evidence that arrived after the outcome it was meant to predict. A loose checker that reads the packet's own scores back to it catches neither. This component exists to make both failures visible on a synthetic packet before any reasoning is dressed up as a track record.
Every value is a fixture
Prices, targets, branches, and realized values are all fixtures, so any direction hit or numeric miss speaks only about the fixture and the grading mechanics. The prices, targets, branches, and realized values are all fixtures. A direction hit or a numeric miss inside a result record is a statement about the fixture and the grading mechanics, nothing more.
How it works
Entry points and _build_result
run and run_prediction_bundle both call _build_result, which loads the packet, secret-scans the inputs, validates the main packet and each negative case, and folds the parts into one status. The entry points are run for the first-wave fixture and run_prediction_bundle for the exported bundle. Both call _build_result, which loads the packet, runs a secret scan over the inputs through scan_paths, validates the main packet, validates each negative-case input, and folds the parts into one status.
Density and authority checks in validate_reconciliation_packet
validate_reconciliation_packet checks packet density, rejects any forbidden authority flag through _authority_overclaim, then runs and folds five gates. validate_reconciliation_packet is the core. It first checks packet density: at least five pattern ids, four source refs, one projection result record, and three public runtime refs. It calls _authority_overclaim, which raises PREDICTION_TRADING_OR_ADVICE_OVERCLAIM if any flag in FORBIDDEN_AUTHORITY_FLAGS (trading, financial or investment-related actions, live market data, external model access, public sharing, launch, non-public data equivalence) is set true. Then it runs five gates and folds their findings.
CP1 branches must retain the losing side
_validate_cp1 requires every branch to name its chosen side, carry rationale, and keep the record of why the opposite side lost, with equity-lane branches also needing a confirmation bit. _validate_cp1 reads cp1_branches. Every branch must name the side it chose, carry rationale refs, and keep an opposite_side_invalidation_ref, the record of why the losing side lost. A branch that asserts a winner without retaining the discarded alternative raises PREDICTION_CP1_BIFURCATION_UNRESOLVED. An equity, market, or finance lane branch also needs an explicit confirmation bit, or it raises PREDICTION_EQUITY_CONFIRMATION_REQUIRED.
CP2 fixes the universe and forbids post-target evidence
_validate_cp2 requires each prediction's target inside the declared universe and every evidence ref to be pre-target, the gate that stops a packet from grading itself with hindsight. _validate_cp2 reads cp2_predictions. Each prediction's target_id must sit inside the declared target universe, so the set of things being predicted is fixed before the outcome; a target outside it raises PREDICTION_CP2_TARGET_OUT_OF_UNIVERSE. Every evidence ref must be pre-target: _evidence_is_pre_t accepts a ref only if it carries a T- time prefix, and a ref that points past the target window raises PREDICTION_ORACLE_POST_T_EVIDENCE_FORBIDDEN. This is the gate that stops a packet from grading itself with hindsight.
Recomputing every graded row from raw prices
The numeric functions recompute error and direction from raw prices, contradict any mismatched claim, surface large misses, refuse to grade missing or degraded rows, and preserve the STOCK/ETF split. _numeric_grading_inputs and _numeric_reconciliation_rows do the arithmetic. For each graded oracle-diff row the component recomputes the absolute delta as the distance between predicted and realized price, the percent delta against the snapshot price, and the direction hit as predicted direction against realized direction. If the row also reports its own abs_error, pred_error_pct, or direction_hit, the claimed value must match the recompute, or the row raises a contradiction finding. A row with a correct direction whose error clears a floor (ten in absolute terms or five percent) is surfaced as PREDICTION_ORACLE_NUMERIC_LARGE_MISS_SURFACED. A row with no realized price is not fabricated into a graded row; it raises PREDICTION_ORACLE_MISSING_REALIZED_TRUTH_NOT_GRADED. A row marked degraded is gated out of grading rather than scored. STOCK and ETF rows are counted separately, and a run that collapses the split raises PREDICTION_ORACLE_ASSET_CLASS_SPLIT_PRESERVED.
Dossier edits held to bounded deltas
_validate_mutations allows an edit only to add a contradiction, revise confidence, or retire a claim against a known prediction, with high-severity mutations needing two refs and an allowlist. _validate_mutations reads dossier_mutations. An edit to the running record may only add a contradiction, revise a confidence band, or retire a claim, and it must target a known prediction. A high-severity mutation needs two evidence refs and an explicit public-delta allowlist, or it raises PREDICTION_DOSSIER_MUTATION_UNSAFE.
The count floor for a pass
A pass requires no positive finding and a minimum census of CP1 branches, CP2 predictions, graded rows, STOCK and ETF numeric rows, and one bounded mutation. The packet passes only when no positive finding fires and the counts hold: at least two CP1 branches, two CP2 predictions, two graded oracle-diff rows, two numeric rows spanning both STOCK and ETF, and one bounded mutation.
The bundle path verifies copied source bodies
The bundle path adds validate_source_module_imports to confirm each copied source body is metadata-only and digest-matched, then writes the result record files and summary card. The bundle path adds validate_source_module_imports, which reads source_module_manifest.json, confirms each copied source body declares copied_non_secret_macro_body, keeps its body text out of result records, states an exact-copy or source-faithful relation, and matches the recorded sha256 through _sha256. _source_open_body_import_summary reduces that to a metadata-only summary of digests and ids. write_receipts then writes the result record, board, validation, and sign-off files, and result_card builds the command-line summary card.
The two constant tables that fix the boundary
EXPECTED_NEGATIVE_CASES maps each negative input to its error code so a silenced gate is caught, and AUTHORITY_CEILING holds every authority flag false in every record. The two constant tables fix the boundary. EXPECTED_NEGATIVE_CASES maps each named negative input to the error code it must produce, so a gate that stops firing is caught as a missing case. AUTHORITY_CEILING holds every authority flag at false and is copied into every result record.
Diagram source & refs
flowchart TD Packet["Synthetic prediction packet targets, CP1 branches, CP2 predictions, oracle diff, numeric rows, mutations"] CP1["validate_cp1 chosen side + why the opposite side lost; equity lane needs confirmation"] CP2["validate_cp2 target inside universe; evidence must be pre-target (T-)"] Numeric["numeric grading recompute abs error, percent error, direction; claimed values must match"] Mutation["validate_mutations bounded dossier deltas only"] Result["build_result counts, verdicts, authority booleans; packet body stays out"] Packet --> CP1 Packet --> CP2 Packet --> Numeric Packet --> Mutation CP1 --> Result CP2 --> Result Numeric --> Result Mutation --> ResultNegative cases
Ten inputs the component must catch
EXPECTED_NEGATIVE_CASES names ten inputs to reject or surface, each mapped to an error code, and _build_result fails if any expected case does not appear. EXPECTED_NEGATIVE_CASES names ten inputs the component must reject or surface: a CP2 target outside the universe, an unresolved CP1 bifurcation, post-target evidence, an unconfirmed equity-lane claim, an unsafe high-severity dossier mutation, a trading or advice overclaim, a direction hit that is still a large numeric miss, a row missing realized truth, a degraded feed row, and a run that drops the STOCK and ETF split. Each input maps to a specific error code, and _build_result fails if any expected case does not appear.
Prior Art Grounding
Forecast scoring and market-scoring lineage
The component draws on probabilistic forecast evaluation and prediction-market scoring, borrowing the reconciliation pattern of declaring the universe up front, separating pre- and post-target evidence, and bounding dossier edits. This component draws on probabilistic forecast evaluation and prediction-market infrastructure. The Brier score is an early probability-forecast verification anchor, proper-scoring-rule work such as Gneiting and Raftery motivates incentive-compatible scoring, and Hanson's logarithmic market scoring rule grounds the idea that forecasts are updated and evaluated through explicit scoring. Forecasting-tournament work on calibration also motivates keeping prediction evidence separate from post-outcome explanation. What this component borrows is the reconciliation pattern: declare the target universe before the outcome, keep pre-target evidence apart from post-target evidence, grade against a synthetic oracle, and hold dossier edits to declared deltas.
Validation Result record Path
Run from microcosm-substrate:
PYTHONPATH=src ../repo-python -m microcosm_core.organs.prediction_oracle_reconciliation run \
--input fixtures/first_wave/prediction_oracle_reconciliation/input \
--out /tmp/microcosm-prediction-oracle-reconciliation/fixture \
--card
PYTHONPATH=src ../repo-python -m microcosm_core.organs.prediction_oracle_reconciliation run-prediction-bundle \
--input examples/prediction_oracle_reconciliation/exported_prediction_oracle_bundle \
--out /tmp/microcosm-prediction-oracle-reconciliation/bundle \
--card
PYTHONPATH=src ../repo-python -m pytest -p no:cacheprovider tests/test_prediction_oracle_reconciliation.py -q
PYTHONPATH=src ../repo-python scripts/build_doctrine_projection.py --check-paper-module-corpus
What a passing run means
A passing run means the synthetic packet cleared every gate, all ten negative cases fired, the scan was clean, and the digests matched, proving nothing about a real forecast. A passing run means the synthetic packet cleared every gate, all ten negative cases fired, the secret scan was clean, and the bundle digests matched. It proves nothing about a real forecast.
Scope boundary
Scope limit
The strongest claim the evidence supports
On a synthetic fixture, the component recomputes grading, refuses post-target evidence, requires resolved CP1 branches inside the universe, bounds dossier edits, and rejects every forbidden authority flag. The strongest claim the evidence supports is narrow. On a synthetic fixture, the component recomputes numeric grading rather than trusting the packet, refuses post-target evidence, requires resolved CP1 branches inside a declared target universe, holds dossier edits to bounded deltas, and rejects any attempt to raise a trading, advice, provider, live-market, public sharing, or launch flag. That is the proof boundary: the fixture, its gates, and its result records.
What a green result is not
A green result makes no forecast, gives no advice, calls no provider, imports no non-public data, and claims no track record, with AUTHORITY_CEILING holding every flag false. It refuses everything past that. It makes no forecast, gives no financial or investment-related actions, calls no live provider, imports no non-public data, and claims no track record. A green result is not launch-scope decision and not whole-system correctness. The scope limit in AUTHORITY_CEILING keeps every such flag false, and the validation result records under Validation Result record Path are the only evidence this module offers.
Context & evidence
In short Prediction Oracle Reconciliation validates synthetic prediction packets through CP1 fork preservation, CP2 target-universe checks, pre-target evidence limits, oracle-diff grading, bounded dossier edits, numeric reconciliation rows, source-module imports, negative cases, and scope limits. It is a projection-mechanics replay, not a forecasting correctness claim, investment or trading decisions, live market data call, external model access, non-public data equivalence, public sharing, launch, or whole-system correctness.
Scope limit Synthetic invented prediction packet and source-module import evidence only; no forecasting correctness or accuracy, no trading, financial, or investment-related actions, no live market data, no external model access, no prediction public sharing, no performance track record, no non-public data import, no launch-scope decision, no publishing-scope decision, and no whole-system correctness.
Covers Prediction Oracle Reconciliation
Source
Source Source module: src/microcosm_core/organs/prediction_oracle_reconciliation.py · Design note · Source registry