trd.fun / lab
North star & decisions

First-hour series contract v3

Updated 2026-08-26
Current contract: Version three binds alpha tiers, evidence floors, sizing separation, and duplicate relation.
CURRENT
docs/research/series-contract-v3-amendment-2026-08-26.md

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

ContractSHA-256 series hashMeaning
v1fe939b6ba41f70ce2911b46e28723b49141a723e3eab012acb56f9889817084bOriginal preregistration; retained only as the historical replay/preregistration ancestor.
v2cf16f78f97d8683b3ec56c6ae437bcb85a6a900ad38948cb3452f7b159684f93Split-aware Sharadar ACTIONS identity that sealed wave 1.
v3888ae3aaeaa55a3afbc652f5f08df24ff4882f70b1493b7e8092f6409fe3feceCurrent 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 fieldv2v3
versionfirst-hour-continuation-wave-series-contract/v2first-hour-continuation-wave-series-contract/v3
seriesIdfirst-hour-continuation-wave-series/split-aware-sharadar-actions/v2first-hour-continuation-wave-series/split-aware-sharadar-actions/v3
baseFamilyIdfirst-hour-continuation/v1Unchanged
corporateActionSourceContractVersioncorporate-action-source/sharadar-actions/v1Unchanged
corporateActionTableACTIONSUnchanged
corporateActionSourcesharadarUnchanged
splitEligibilityRuleraw-volume-requires-20-strictly-post-split-prior-sessions/v1Unchanged
priorSessionRequirement20Unchanged
splitEffectiveSessionTreatmentsplit-session-is-not-post-split/v1Unchanged
rawVolumeAdjustmentnone-reset-eligibility-window-only/v1Unchanged
costModelVersionfirst-hour-continuation-v1-costs/v1Unchanged
executionHash1e6a6e877f61bc919113b03c4ae268145b8ae824cdc5b8cbb23bd23f6fce6484Unchanged
preregisteredSeriesIdfirst-hour-continuation-wave-series/v1Unchanged
preregisteredSeriesHashv1 hash fe939b6b…Unchanged
preregistrationDispositionretained-without-amendment/v1Unchanged
legacyReceiptPolicyv1-identity-reproduction-only/v1Unchanged
legacyReceiptVersionfirst-hour-continuation-panel-replay/v1Unchanged
alphaPolicyAbsent; 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' } }
tierByStageAbsent{ exploration: 'exploration', paper_promotion: 'paperPromotion', live_graduation: 'liveGraduation' }
floorsAbsent; 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 }
positionSizingAbsent{ 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:

TierFamily/wave alphaFirst-step raw-p requirementWith the exact 10,001 bootstrap denominator
Exploration0.10 per wavep <= 0.10 / 80 = 0.00125numerator 12 passes (12/10001); 13 fails
Paper promotion0.05 per familyp <= 0.05 / 80 = 0.000625numerator 6 passes (6/10001); 7 fails
Live graduation0.05 per familyp <= 0.05 / 80 = 0.000625numerator 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 stageContract-selected tierAlpha
explorationexploration0.10 per wave
paper_promotionpaperPromotion0.05 per family
live_graduationliveGraduation0.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.

On this page 8 sections
LAB documentation describes design intent and research safeguards. It does not provide trading instructions or operational access.