Current contract: Version three binds alpha tiers, evidence floors, sizing separation, and duplicate relation.
Date: 2026-08-26 Status: deliberate amendment; applies to newly sealed waves only
Owner decisions
Recorded verbatim (Sam, 2026-08-26):
"as lenient as possible"; alpha = lenient everywhere; floors = lower fill floor + hash all floors; partition = executable binds selection.
These decisions replace the implicit lifetime alpha budget for current statistical selection, lower the declared fill floor, make every selection floor part of the series identity, and make the executable behavioural partition authoritative for duplicate exclusion. Position sizing remains outside the statistical gate.
Identity history and compatibility boundary
| Contract | SHA-256 series hash | Meaning |
|---|---|---|
| v1 | fe939b6ba41f70ce2911b46e28723b49141a723e3eab012acb56f9889817084b | Original preregistration; retained only as the historical replay/preregistration ancestor. |
| v2 | cf16f78f97d8683b3ec56c6ae437bcb85a6a900ad38948cb3452f7b159684f93 | Split-aware Sharadar ACTIONS identity that sealed wave 1. |
| v3 | 888ae3aaeaa55a3afbc652f5f08df24ff4882f70b1493b7e8092f6409fe3fece | Current amended identity for new waves. |
The sealed wave-1 manifest fbae64392108ca7d9a5728b55a2df24f3759630c670235dcc73e9beb2bab8178 and selection-data artifact 151cec8bc5be0d6ab7be9af2709d7556271bb54a7ab783a58edd304045b23454 are not rewritten. The loader now enforces their raw-byte and canonical identity: raw SHA-256 is checked before either JSON parse or streamed canonical verification (41fa31a500b022c5d5f2c20e6067ddfbcc698375788273ecc2894662d8b7097e for the manifest; 01a18080faefd64c9ca1bfcda35111fb3b0c78ba05f306da4dfa5fb45eb9a854 for selection data), then the existing canonical content-address checks still run. Their exact historical manifest shape, raw behavioural selection relation, 126/60/30 floors, 80 bp gate, receipt domain, and v2 series hash remain executable verification inputs. New manifests and selections use v3.
Complete v2-to-v3 hashed-field table
Every top-level field below is in the canonical contract preimage. “Unchanged” still means the field is hashed in v3.
| Hashed field | v2 | v3 |
|---|---|---|
version | first-hour-continuation-wave-series-contract/v2 | first-hour-continuation-wave-series-contract/v3 |
seriesId | first-hour-continuation-wave-series/split-aware-sharadar-actions/v2 | first-hour-continuation-wave-series/split-aware-sharadar-actions/v3 |
baseFamilyId | first-hour-continuation/v1 | Unchanged |
corporateActionSourceContractVersion | corporate-action-source/sharadar-actions/v1 | Unchanged |
corporateActionTable | ACTIONS | Unchanged |
corporateActionSource | sharadar | Unchanged |
splitEligibilityRule | raw-volume-requires-20-strictly-post-split-prior-sessions/v1 | Unchanged |
priorSessionRequirement | 20 | Unchanged |
splitEffectiveSessionTreatment | split-session-is-not-post-split/v1 | Unchanged |
rawVolumeAdjustment | none-reset-eligibility-window-only/v1 | Unchanged |
costModelVersion | first-hour-continuation-v1-costs/v1 | Unchanged |
executionHash | 1e6a6e877f61bc919113b03c4ae268145b8ae824cdc5b8cbb23bd23f6fce6484 | Unchanged |
preregisteredSeriesId | first-hour-continuation-wave-series/v1 | Unchanged |
preregisteredSeriesHash | v1 hash fe939b6b… | Unchanged |
preregistrationDisposition | retained-without-amendment/v1 | Unchanged |
legacyReceiptPolicy | v1-identity-reproduction-only/v1 | Unchanged |
legacyReceiptVersion | first-hour-continuation-panel-replay/v1 | Unchanged |
alphaPolicy | Absent; selection inherited the historical 80 bp discovery / 100 bp lifetime ledger | { exploration: { alpha: 0.10, scope: 'per_wave', correction: 'holm' }, paperPromotion: { alpha: 0.05, scope: 'per_family', correction: 'holm' }, liveGraduation: { alpha: 0.05, scope: 'per_family', correction: 'holm' } } |
tierByStage | Absent | { exploration: 'exploration', paper_promotion: 'paperPromotion', live_graduation: 'liveGraduation' } |
floors | Absent; 126/60/30 and the 20/4/2 selection constants lived in code | { sessionFloor: 126, fillFloor: 40, roundTripFloor: 30, validationPanelSessionFloor: 20, scorableSymbolFloor: 4, correctedSurvivorSymbolFloor: 2 } |
positionSizing | Absent | { liveGraduation: { sizingLever: 'separate' } } |
The canonical series domain also advances from first-hour-continuation/split-aware-series/v2 to /v3; the domain is the hash envelope rather than a contract field. The public contract retains numeric alpha values exactly as approved. Because the shared intraday hasher deliberately rejects non-integer numbers, the v3 series hasher converts only those approved alpha scalars to canonical decimal text (0.10 and 0.05) in the hash preimage. No global hashing rule was weakened.
Alpha arithmetic for 80 cells
All 80 nominal cells remain in Holm correction; behavioural duplicates do not shrink the multiplicity denominator or free attempts. “As lenient as possible” is implemented with an inclusive comparison at the chosen tier boundary.
For the first and most stringent Holm step over 80 cells:
| Tier | Family/wave alpha | First-step raw-p requirement | With the exact 10,001 bootstrap denominator |
|---|---|---|---|
| Exploration | 0.10 per wave | p <= 0.10 / 80 = 0.00125 | numerator 12 passes (12/10001); 13 fails |
| Paper promotion | 0.05 per family | p <= 0.05 / 80 = 0.000625 | numerator 6 passes (6/10001); 7 fails |
| Live graduation | 0.05 per family | p <= 0.05 / 80 = 0.000625 | numerator 6 passes (6/10001); 7 fails |
At later Holm ranks the raw threshold is alpha / (80 - rank + 1), subject to the step-down rule. The selection receipt stores the exact Holm-adjusted rational, claimStage, and appliedTier. Selection and verification derive the tier through the contract's TIER_BY_STAGE mapping; no caller-supplied tier or alpha exists, and there is no current-series fallback to the old lifetime constant.
Trusted workflow-stage binding
| Claim stage | Contract-selected tier | Alpha |
|---|---|---|
exploration | exploration | 0.10 per wave |
paper_promotion | paperPromotion | 0.05 per family |
live_graduation | liveGraduation | 0.05 per family |
V3 receipt consumption has exactly three fixed-stage, artifact-bound entry points in first-hour-continuation-split-aware-selection-artifact.ts: verifyForWave2Planning hardcodes exploration, verifyForPaperPromotion hardcodes paper_promotion, and verifyForLiveGraduation hardcodes live_graduation. Each derives its tier from TIER_BY_STAGE[its fixed stage], refuses a receipt whose recorded stage or tier differs, and reconstructs the selection gate at that fixed stage. The generic expected-stage verifier is internal and is not importable by a production consumer. Thus a wave-2 exploration receipt cannot be consumed by the live-graduation boundary even if all receipt hashes are recomputed.
The operator writer uses --stage <exploration|paper_promotion|live_graduation> and dispatches to the corresponding fixed-stage artifact writer, which invokes the matching verifier above; it exposes no --alpha or --tier override. --stage live_graduation additionally requires the explicit --operator-live-claim acknowledgement. That acknowledgement grants no ability to alter which alpha the stage receives. There is not yet a separate wave-2 planner, paper-promotion reader, or first-hour G3/live-graduation reader in this repository. When one is added, its required receipt entry point is respectively verifyForWave2Planning, verifyForPaperPromotion, or verifyForLiveGraduation; it must not recreate stage selection at its call site.
Floor arithmetic and the deliberate tension
For the owner-specified 296-session evidence-window rationale, under the usual two-fill completed trade:
- 40 fills imply 20 completed trades.
20 / 296 = 6.76%session participation: about one trade per 14.8 sessions, or roughly 17 trades per 252-session year.- The old 60-fill floor implied 30 trades,
30 / 296 = 10.14%, or one trade per 9.87 sessions.
The lower fill floor is therefore recorded exactly as directed. There is also an important honesty caveat: retaining roundTripFloor: 30 means a qualifying cell with conventional two-fill round trips already needs at least 60 fills. On current evidence shapes, lowering only the fill floor from 60 to 40 does not by itself admit another cell. Hashing both floors makes that tension visible and ensures a future change cannot happen silently.
Executable duplicate binding
The raw decision partition remains in the manifest as audit evidence. V3 adds executablePartitionHash to the hashed manifest core, loads that exact partition from the selection-data artifact, and requires its executable_signal_sequence relation at selection. The executable representative is the only member of a duplicate class eligible to qualify. Raw differences that compile to identical executable signals can no longer evade the duplicate gate.
Wave 1 remains on its sealed v2 rule and raw partition. This compatibility exception is version-dispatched, not inferred from content.
Current v3 waves remain restricted to the canonical Discovery-D preregistration and work domain. “New wave” here means a newly sealed v3 wave/action-source/artifact identity over that fixed domain; the loader deliberately refuses a different panel or work-domain hash.
Sizing and the live-graduation honesty caveat
The operational shorthand is that approximately 5% of live-graduated strategies will be noise at alpha = 0.05. More precisely, the per-family Holm policy controls the probability of one or more false positives for a fully null family at no more than 5%; it does not promise that exactly 5% of individual graduates are false. Either way, a statistical gate cannot make false positives impossible.
Sizing is the mitigation: liveGraduation.sizingLever = 'separate' documents that exposure is decided outside the statistical test. The alpha result does not authorize size, and no sizing behaviour is added by this amendment.