# Execution parity follow-up — September 24, 2026

## Decision

Keep the frozen incumbent/hybrid/higher-low comparison unchanged and provisional.
The available files support an export/settings reconciliation before any simulator
change. The 1D aggregate-reporting bug is fixed. No additional model search or
promotion is justified by these findings.

## Known issues versus this investigation

The June [4H/6H investigation](mlp_parity_4h_6h_fix.md) already documented the
category of chart/report state mismatch and retracted an unsupported engine-bug
explanation. That resolved investigation used different models; it does not close
this September incident. The [legacy parity workflow](tv_parity_workflow.md)
also documents close-price versus next-open fills. Its activation-score tolerances
are not acceptance criteria for the current MLP.

New evidence from the September files:

| TF | Finding | Disposition |
|---|---|---|
| 6H | Chart and Python position histories agree on every compared bar; the TV trade list disagrees with the chart on 565 bars. | Inspect chart/report provenance; do not alter Python to fit this contradictory pair. |
| 8H | Exported trailing-stop/high ratios encode 20%; the saved winner uses 30%. A diagnostic with 20% reproduces chart position history exactly. | Confirm the intended settings in TradingView. Do not overwrite the saved winner. |
| 12H | Chart and Python position histories agree on every compared bar; the TV trade list disagrees with the chart on 164 bars. | Same provenance investigation as 6H. |
| 1D | The aggregate diagnostic included open trade 155 in TV equity while comparing 154 completed trades. | Fixed reporting and added regression coverage. Timing remains exact for all 154 completed trades. |

Position checks exclude the final chart row and start at `SCORE_START`. Chart
position is inferred from the exported non-null `trail_high_price_ratio`; Python
position is shifted one bar to align with fills. Trade-list position spans entry
through, but excluding, exit time, and includes the reported open position from
its entry onward. With open positions included, 4H and 1D also match the chart
on every compared bar.

## First divergent events

For 6H, TV reports an entry fill at May 3, 2019 06:00 UTC. At its expected
00:00 signal bar, score falls from 56.930623 to −639.865635. Both values are
already below the entry threshold of 90, so there is no threshold crossunder.
The chart has no entry marker and its exported position is flat. The October 1,
2021 00:00 TV entry likewise has no chart entry: the preceding signal score rises
from −71.566674 to −0.030878, both below 90.

The 6H chart marks an exit September 27, 2024 06:00 and becomes flat at 12:00,
matching Python. The trade list instead holds until October 31, 822 hours later.
These disagreements are not explained by Unix versus ISO timestamp formatting.

For 12H, the September 17, 2020 00:00 TV entry has no matching chart entry.
At the expected signal bar, score rises from −496.165241 to −288.477722, both
below the −190 entry threshold; the chart remains flat.

For 8H, changing only the diagnostic stop to 20% resolves chart/Python position
parity, but does not resolve trade-list parity: 74 Python versus 69 TV completed
trades, 57 exact matches, 11 same-entry/different-exit pairs, six Python-only and
one TV-only. The chart still disagrees with the list, including its open position, on 243 bars.
This is evidence of inconsistent supplied execution states, not evidence that
20% should replace the saved research configuration.

## Corrected 1D accounting

The old report showed Python 6160.28% versus TV 6472.03%; that TV number included
open trade 155. TV cumulative P&L through completed trade 154 is **6138.98%**.
The completed-trade difference is therefore **21.30 percentage points**, or
**0.347% relative**, rather than the previously reported 4.8%.

An independent read-only audit found all 154 TV entry fills at next-bar open plus
$0.03 and exits at next-bar open minus $0.03, consistent with three ticks of
slippage. Applying the same fee calculation to actual TV fills yields 6140.21%,
leaving about 1.23 percentage points versus the exported completed equity.
Exported quantity/notional rounding explains the remaining sizing difference;
per-trade commission and dollar P&L reconcile within $0.005 and $0.01 respectively.
The remaining difference is consistent with documented fill/sizing approximations.

`compare_tv_trades.py` now selects the last dated exit among parsed completed
trades, explicitly reports excluded open trades, and requires aligned trade paths
before displaying a relative cumulative comparison. Equal trade counts alone
are insufficient. These totals remain diagnostic, not canonical research metrics.

## Next action and evidence

1. Inspect the signed-in TradingView strategy report and chart together for the
   first 6H event above, recording script identity, selected weights, inputs,
   date range and strategy properties. Establish why the report contains a trade
   absent from the chart's own position trace. Then inspect the 2024 exit.
2. Check 8H's actual stop setting against its intended saved winner, then inspect
   12H's first divergent event. Request only the specific corrected pair after
   that context is established, rather than another undirected full re-export.
3. Continue the unchanged frozen observation when genuinely post-freeze bars
   arrive. Revisit experiment rankings only if a demonstrated simulator change
   requires a separately versioned evaluation.

TradingView's signed-in UI was unavailable through the connected browser tools,
so the underlying reason for chart/report disagreement remains unverified.
Local diagnostics cannot establish whether layout state, script selection, cache,
or another TradingView context caused it.

Evidence is in `results/mlp_observation/execution_parity_followup_20260924/`:
five corrected CLI logs, the separate 8H stop diagnostic, input hashes, position
comparisons, source/test snapshots and a reproduction script. The earlier
`execution_parity_20260924` evidence is preserved. Ten focused tests pass.
Both frozen bundle checks and all 941 protected-file hashes verify unchanged.
