{"id":"controlled-allocation-v3","runPrefix":"v3-","inputSchema":"point-in-time-relative-features-v3","objective":"Evaluate a constrained Jev allocation choice against equal weights on the identical shortlist, with SPY as a market reference.","horizon":"From the next eligible fill to the close of the first regular US trading session whose New York date is later than the fill date.","model":"jev-latest","modelBatchSize":100,"maxModelRequestBytes":60000,"maxSelectionCalls":6,"batching":"Eligible symbols sorted alphabetically, consecutive groups of at most 100. Shared SPY reference, portfolio context and rubric; repeated provenance uses indexed records without dropping fields. Each serialized request is limited to 60,000 UTF-8 bytes (a safety bound, not an exact token count). Global allocation only after all groups validate.","positions":10,"targetWeight":0.1,"maxNamesPerSector":3,"selectionContext":"Equal-weight control portfolio only; allocation choices do not feed back into stock selection.","minStockWeight":0.05,"maxStockWeight":0.2,"maxSectorWeight":0.3,"weightStep":0.005,"riskLookback":60,"minimumRiskReturns":40,"allocationPolicy":"One Choice over deterministic feasible whole-portfolio candidates, including equal weights. No independent per-stock weight decisions.","exposurePolicy":"Both experimental portfolios target 100% equity in the same ten names; no model-selected cash timing.","costBps":5,"driftThreshold":0.05,"explicitExitsBypassDriftThreshold":true,"decisionCadence":"At most one Jev invocation per NY trading session. Full-universe collection runs at :35 until that invocation happens, then later hours skip the scrape. Positions are held until a later aligned quote can fill a new target; a 5% turnover threshold skips drift-only rebalances.","primaryComparator":"Same Jev shortlist at equal weights, net of each portfolio's own costs.","controls":["equalWeight","inverseVolatility","momentum","SPY"],"momentumRule":"Descending 20-session completed total-return proxy relative to SPY; same issuer/sector caps; equal weights. No parameter search.","forecastBinsPp":[-1,-0.25,0.25,1],"quoteSkewSeconds":60,"valuationDelayMinutes":20,"maxLiveQuoteAgeMinutes":35,"covarianceShrinkage":0.25,"costSensitivityBps":[5,10,25],"evaluationSessions":126,"dividendPolicy":"Cash credited consistently on ex-date to all sleeves, including SPY; no automatic reinvestment. Late events reconcile against historical holdings.","evaluation":"126-session descriptive window from first fill. Primary endpoint is cumulative net return difference versus equal weights. Daily active returns, risk and dependence-aware uncertainty are secondary; no automatic winner declaration.","buildHash":"8ef3e61be3e79392df875b05e1bc2ecb8985ea70ea478171d8813a47f0ffa1d8","execution":{"id":"independent-execution-2026-09-17","amendment":"Execution and valuation run before full-universe research collection. Selection, allocation, quote delay/alignment, expiry, fees and sizing functions are unchanged. Execution eligibility uses fresh prices for retained targets, not a new indicator screening. Missing batch-feed minutes are checked in Yahoo's detailed minute chart using the same cutoff and tolerance. Authenticated recovery observations may occur between hourly checks and retain their actual timestamps.","valuationCadence":"Fifteen-minute held-position valuations on weekday sessions; no target execution or Jev calls. Research collection remains at :35 and is skipped after Jev is invoked. The 20-minute price buffer is unchanged. Quote failures back off for 5, 10, 20, then at most 30 minutes; missing points are not fabricated.","buildHash":"9a1dcd7dc1d0af8a2d1ce03cc0097521a3e6ac572efde26323dcc6bd1b1d4642","fingerprintScope":"lib/execution-runtime.ts, lib/engine-dispatch.ts, worker.ts, scheduler/five-minute.ts and scheduler/wrangler.jsonc"},"documentation":"https://pnlbench.com/how-it-works","fingerprintScope":"All lib/research/*.ts, lib/market.ts, scheduler/worker.ts and package-lock.json","note":"Configuration/source fingerprint, not external attestation. Model identifier is locked after the first accepted decision; a changed alias response pauses new decisions."}