Harden Build 124 release and report secured profit

This commit is contained in:
Theodore Song
2026-08-22 20:13:06 -04:00
parent 008801f179
commit dd7b376b44
5 changed files with 74 additions and 4 deletions
+4 -1
View File
@@ -2,7 +2,10 @@ name: Release Build 124 after Vercel quota reset
on: on:
schedule: schedule:
- cron: "15 13 23 8 *" # Vercel's Hobby deployment quota is rolling. Retry across the reset
# window, then remove this workflow as soon as Build 124 is live.
- cron: "15 13-23/2 23 8 *"
- cron: "15 1-13/2 24 8 *"
workflow_dispatch: workflow_dispatch:
permissions: permissions:
+8
View File
@@ -142,6 +142,14 @@ Every probation position exits at the matching six-hour executable bid and keeps
the 18% stop policy active. Normal directional sizing remains locked until the the 18% stop policy active. Normal directional sizing remains locked until the
same cohort independently passes both the 24-hour and 72-hour promotion gates. same cohort independently passes both the 24-hour and 72-hour promotion gates.
An August 23 exact-fee settlement calibration independently checked 5,000
resolved markets, 4,807 usable histories, and 7,854 observations across 1,400
fixed side, category, price-band, and 1/3/7/14/30-day rules. Zero rules cleared
even the event-clustered 95% training lower-bound gate. The three-day Sports NO
target fell to -44.14% in validation and remained negative in holdout, so it
cannot authorize capital. The reproducible result is stored in
`research/settlement-calibration-exact-fee-5000-audit.json`.
Build 124 retains Build 100's retirement of the old 3-6 day resolution-window Build 124 retains Build 100's retirement of the old 3-6 day resolution-window
capital permission. That audit clustered confidence by event but still averaged capital permission. That audit clustered confidence by event but still averaged
several correlated contracts inside each event, while production could choose several correlated contracts inside each event, while production could choose
+15 -3
View File
@@ -2799,6 +2799,15 @@ function completeBundleAccountingFloor(group){
const settlementFloor=units*payoutPerUnit; const settlementFloor=units*payoutPerUnit;
return settlementFloor+0.005>=cost?cost:0; return settlementFloor+0.005>=cost?cost:0;
} }
function completeBundleSecuredProfit(p){
return completeBundleGroups(p).reduce((total,group)=>{
const cost=group.reduce((sum,pos)=>sum+Number(pos.cost||0),0);
const payoutPerUnit=Math.min(...group.map(pos=>Number(pos.bundle_payout_per_unit||0)));
const units=Math.min(...group.map(pos=>Number(pos.shares||0)));
const profit=units*payoutPerUnit-cost;
return total+(Number.isFinite(profit)&&profit>0?profit:0);
},0);
}
function portfolioPositionValue(p){ function portfolioPositionValue(p){
const positions=p&&Array.isArray(p.positions)?p.positions:[]; const positions=p&&Array.isArray(p.positions)?p.positions:[];
let total=positions.reduce((sum,pos)=>sum+Number(pos.shares||0)*Number(pos.current_price||0),0); let total=positions.reduce((sum,pos)=>sum+Number(pos.shares||0)*Number(pos.current_price||0),0);
@@ -5086,7 +5095,8 @@ function board(){
const st=loadState(); const st=loadState();
return rankBoardRows(AGENTS.map(c=>{const p=st.agents[c.id]||defaultPortfolio();const eq=equity(p); return rankBoardRows(AGENTS.map(c=>{const p=st.agents[c.id]||defaultPortfolio();const eq=equity(p);
const baseline=Number(p.engine_baseline&&normalizedStrategyVersion(p.engine_baseline.version)===SUGGESTION_ENGINE_VERSION?p.engine_baseline.equity:eq); const baseline=Number(p.engine_baseline&&normalizedStrategyVersion(p.engine_baseline.version)===SUGGESTION_ENGINE_VERSION?p.engine_baseline.equity:eq);
return {c,p,eq,pnl:eq-STARTING_BALANCE,ret:(eq/STARTING_BALANCE-1)*100,enginePnl:eq-baseline,engineRet:baseline>0?(eq/baseline-1)*100:0,change24h:portfolioChange24h(p,eq)};}) return {c,p,eq,pnl:eq-STARTING_BALANCE,ret:(eq/STARTING_BALANCE-1)*100,enginePnl:eq-baseline,engineRet:baseline>0?(eq/baseline-1)*100:0,
securedProfit:completeBundleSecuredProfit(p),change24h:portfolioChange24h(p,eq)};})
); );
} }
const MEDALS=["🥇","🥈","🥉"]; const MEDALS=["🥇","🥈","🥉"];
@@ -5100,6 +5110,7 @@ function renderOverview(){
const engineAvg=b.reduce((s,r)=>s+r.engineRet,0)/b.length; const engineAvg=b.reduce((s,r)=>s+r.engineRet,0)/b.length;
const core=b.filter(r=>!r.c.aggressive),coreAvg=core.reduce((s,r)=>s+r.engineRet,0)/Math.max(1,core.length); const core=b.filter(r=>!r.c.aggressive),coreAvg=core.reduce((s,r)=>s+r.engineRet,0)/Math.max(1,core.length);
const aggressive=b.filter(r=>r.c.aggressive),aggressiveAvg=aggressive.reduce((s,r)=>s+r.engineRet,0)/Math.max(1,aggressive.length); const aggressive=b.filter(r=>r.c.aggressive),aggressiveAvg=aggressive.reduce((s,r)=>s+r.engineRet,0)/Math.max(1,aggressive.length);
const securedProfit=b.reduce((sum,row)=>sum+row.securedProfit,0);
const sugCount=(loadSuggestions().suggestions||[]).length; const sugCount=(loadSuggestions().suggestions||[]).length;
const stats=[ const stats=[
{ic:lead.c.emoji,label:"Leader",value:lead.c.name.split(" ")[0]}, {ic:lead.c.emoji,label:"Leader",value:lead.c.name.split(" ")[0]},
@@ -5108,6 +5119,7 @@ function renderOverview(){
{ic:"🧪",label:"Adaptive avg",value:fmtPct(engineAvg),cls:signClass(engineAvg)}, {ic:"🧪",label:"Adaptive avg",value:fmtPct(engineAvg),cls:signClass(engineAvg)},
{ic:"🧠",label:"Core adaptive avg",value:fmtPct(coreAvg),cls:signClass(coreAvg)}, {ic:"🧠",label:"Core adaptive avg",value:fmtPct(coreAvg),cls:signClass(coreAvg)},
{ic:"⚡",label:"Aggressive adaptive",value:fmtPct(aggressiveAvg),cls:signClass(aggressiveAvg)}, {ic:"⚡",label:"Aggressive adaptive",value:fmtPct(aggressiveAvg),cls:signClass(aggressiveAvg)},
{ic:"🔒",label:"Secured bundle profit",value:fmtUSD(securedProfit),cls:securedProfit>0?"pos-val":""},
{ic:"💡",label:"Scored ideas",value:sugCount}, {ic:"💡",label:"Scored ideas",value:sugCount},
{ic:"🏆",label:"Agents",value:AGENTS.length}, {ic:"🏆",label:"Agents",value:AGENTS.length},
]; ];
@@ -5273,7 +5285,7 @@ function renderLeaderboard(){
<div class="lb-top"><span class="medal">${MEDALS[i]||""}</span><span class="lb-emoji">${r.c.emoji}</span> <div class="lb-top"><span class="medal">${MEDALS[i]||""}</span><span class="lb-emoji">${r.c.emoji}</span>
<div><div class="lb-name">${r.c.name}</div><div class="lb-blurb">${agentBlurb(r.c,st)}</div></div></div> <div><div class="lb-name">${r.c.name}</div><div class="lb-blurb">${agentBlurb(r.c,st)}</div></div></div>
<div class="lb-mid"><div class="lb-eq">${fmtUSD(r.eq)}</div><div><div class="lb-ret ${signClass(r.enginePnl)}">${fmtPct(r.engineRet)}</div><div class="small ${signClass(r.pnl)}">legacy/replay ${fmtPct(r.ret)}</div><div class="small ${signClass(r.change24h.pct)}">24h ${format24h(r.change24h)}</div></div></div> <div class="lb-mid"><div class="lb-eq">${fmtUSD(r.eq)}</div><div><div class="lb-ret ${signClass(r.enginePnl)}">${fmtPct(r.engineRet)}</div><div class="small ${signClass(r.pnl)}">legacy/replay ${fmtPct(r.ret)}</div><div class="small ${signClass(r.change24h.pct)}">24h ${format24h(r.change24h)}</div></div></div>
<div class="lb-foot"><span class="muted small">${r.p.positions.length} open · ${r.p.closed.length} closed</span>${miniSpark(r.p.snapshots,r.c.color)}</div> <div class="lb-foot"><span class="muted small">${r.p.positions.length} open · ${r.p.closed.length} closed${r.securedProfit>0?` · <span class="pos-val">${fmtUSD(r.securedProfit)} secured</span>`:""}</span>${miniSpark(r.p.snapshots,r.c.color)}</div>
</div>`).join(""); </div>`).join("");
document.querySelectorAll("#leaderboard .lb-card").forEach(el=>{ document.querySelectorAll("#leaderboard .lb-card").forEach(el=>{
el.addEventListener("click",()=>{localStorage.setItem(VIEW_KEY,el.dataset.agent);renderPortfolioTab();showTab("portfolio");}); el.addEventListener("click",()=>{localStorage.setItem(VIEW_KEY,el.dataset.agent);renderPortfolioTab();showTab("portfolio");});
@@ -5689,7 +5701,7 @@ function renderAgentReports(){
<p><b>Adaptation:</b> ${esc(decisionSummary(row.p))}</p> <p><b>Adaptation:</b> ${esc(decisionSummary(row.p))}</p>
<p><b>Performance:</b> ${esc(dailyPerformanceExplanation(row))}</p> <p><b>Performance:</b> ${esc(dailyPerformanceExplanation(row))}</p>
${crash} ${crash}
<p><b>Status:</b> ${open} open position${open===1?"":"s"} with ${fmtUSD(row.eq)} equity. ${esc(line)}</p> <p><b>Status:</b> ${open} open position${open===1?"":"s"} with ${fmtUSD(row.eq)} marked equity.${row.securedProfit>0?` ${fmtUSD(row.securedProfit)} of additional settlement profit is secured by intact verified bundles and remains excluded from marked return until an exit, conversion, or settlement.`:""} ${esc(line)}</p>
<p><b>${esc(plan)}</b></p> <p><b>${esc(plan)}</b></p>
</article>`; </article>`;
}).join(""); }).join("");
@@ -0,0 +1,37 @@
{
"generated_at": "2026-08-23T00:10:38.029Z",
"strategy": "exact-fee settlement calibration",
"requested_markets": 5000,
"resolved_markets": 5000,
"histories_with_data": 4807,
"failures": 0,
"observations": 7854,
"tested_rules": 1400,
"train_passed": 0,
"validation_selected": 0,
"holdout_passed": 0,
"methodology": {
"selection": "most recently closed eligible Yes/No markets",
"horizons_days": [1, 3, 7, 14, 30],
"history_fidelity_minutes": 1440,
"maximum_price_staleness_hours": 36,
"modeled_entry_slippage_cents": 1,
"exact_gamma_entry_fee_schedules": true,
"split": "60% train / 20% validation / 20% untouched holdout",
"confidence": "event-clustered 95% lower bound",
"stability": "positive event mean in each of four chronological windows; at most one highest-entry market per underlying event or sports contest"
},
"partition_observations": {
"train": 4987,
"validation": 1419,
"holdout": 1448
},
"sports_no_3d_target": {
"train": {"events": 79, "event_mean": -0.00873, "lower_95": -0.11764},
"validation": {"events": 53, "event_mean": -0.44135, "lower_95": -0.62545},
"holdout": {"events": 34, "event_mean": -0.05382, "lower_95": -0.28345},
"stability_means": [0.00226, 0.01151, -0.36967, -0.18035],
"passes_holdout": false
},
"production_decision": "No static settlement-horizon, side, category, or price-band rule receives capital. Continue event-deduplicated zero-capital forward learning and require the existing promotion gates."
}
+10
View File
@@ -11,10 +11,15 @@ const resolutionAudit = JSON.parse(fs.readFileSync(new URL("../research/resoluti
const sportsContestAudit = JSON.parse(fs.readFileSync(new URL("../research/sports-contest-no-exploration-audit.json", import.meta.url), "utf8")); const sportsContestAudit = JSON.parse(fs.readFileSync(new URL("../research/sports-contest-no-exploration-audit.json", import.meta.url), "utf8"));
const sportsDisjointAudit = JSON.parse(fs.readFileSync(new URL("../research/sports-contest-no-disjoint-10000-audit.json", import.meta.url), "utf8")); const sportsDisjointAudit = JSON.parse(fs.readFileSync(new URL("../research/sports-contest-no-disjoint-10000-audit.json", import.meta.url), "utf8"));
const adaptiveAudit = JSON.parse(fs.readFileSync(new URL("../research/adaptive-strategy-64-audit.json", import.meta.url), "utf8")); const adaptiveAudit = JSON.parse(fs.readFileSync(new URL("../research/adaptive-strategy-64-audit.json", import.meta.url), "utf8"));
const settlementCalibrationAudit = JSON.parse(fs.readFileSync(new URL("../research/settlement-calibration-exact-fee-5000-audit.json", import.meta.url), "utf8"));
const sportsEvaluator = fs.readFileSync(new URL("./evaluate-sports-favorites.mjs", import.meta.url), "utf8"); const sportsEvaluator = fs.readFileSync(new URL("./evaluate-sports-favorites.mjs", import.meta.url), "utf8");
const build = Number(index.match(/const BUILD_VERSION = (\d+);/)?.[1]); const build = Number(index.match(/const BUILD_VERSION = (\d+);/)?.[1]);
assert.equal(build, 124); assert.equal(build, 124);
assert.equal(settlementCalibrationAudit.requested_markets, 5000);
assert.equal(settlementCalibrationAudit.train_passed, 0);
assert.equal(settlementCalibrationAudit.validation_selected, 0);
assert.equal(settlementCalibrationAudit.holdout_passed, 0);
assert.match(index, /Adaptive strategy 65 · exact bundle conversion · build 124/); assert.match(index, /Adaptive strategy 65 · exact bundle conversion · build 124/);
assert.deepEqual([...ALLOWED_RUNTIME_KEYS].sort(), ["pma_agents_v2", "pma_suggestions_v5"]); assert.deepEqual([...ALLOWED_RUNTIME_KEYS].sort(), ["pma_agents_v2", "pma_suggestions_v5"]);
assert.match(index, /function collectPublicRuntimeItems\(\)/); assert.match(index, /function collectPublicRuntimeItems\(\)/);
@@ -72,6 +77,8 @@ assert.match(workflow, /next=\$\(\( \(now \/ 300 \+ 1\) \* 300 \+ 15 \)\)/);
assert.match(workflow, /actions\/workflows\/autonomous-cycle\.yml\/dispatches/); assert.match(workflow, /actions\/workflows\/autonomous-cycle\.yml\/dispatches/);
assert.match(workflow, /--data '\{"ref":"main"\}'/); assert.match(workflow, /--data '\{"ref":"main"\}'/);
assert.match(releaseWorkflow, /name: Release Build 124 after Vercel quota reset/); assert.match(releaseWorkflow, /name: Release Build 124 after Vercel quota reset/);
assert.match(releaseWorkflow, /cron: "15 13-23\/2 23 8 \*"/);
assert.match(releaseWorkflow, /cron: "15 1-13\/2 24 8 \*"/);
assert.match(releaseWorkflow, /grep -q 'const BUILD_VERSION = 124;'/); assert.match(releaseWorkflow, /grep -q 'const BUILD_VERSION = 124;'/);
assert.match(releaseWorkflow, /EXPECTED_BUILD: "124"/); assert.match(releaseWorkflow, /EXPECTED_BUILD: "124"/);
assert.doesNotMatch(releaseWorkflow, /Build 123|build_123|build-123/); assert.doesNotMatch(releaseWorkflow, /Build 123|build_123|build-123/);
@@ -79,6 +86,9 @@ assert.match(index, /cloudRestartReconstructsOfflineCache:true/);
assert.match(index, /saveSuggestions\(sugs,markets\.length,analysisMarkets\.length,bundleAudit\)/); assert.match(index, /saveSuggestions\(sugs,markets\.length,analysisMarkets\.length,bundleAudit\)/);
assert.match(index, /const NEG_RISK_EVENT_SCAN_LIMIT=1000;/); assert.match(index, /const NEG_RISK_EVENT_SCAN_LIMIT=1000;/);
assert.match(index, /bundleOpportunityTelemetry:true/); assert.match(index, /bundleOpportunityTelemetry:true/);
assert.match(index, /function completeBundleSecuredProfit\(p\)/);
assert.match(index, /label:"Secured bundle profit"/);
assert.match(index, /additional settlement profit is secured by intact verified bundles/);
assert.match(index, /const BUNDLE_DEPTH_CANDIDATE_LIMIT=80;/); assert.match(index, /const BUNDLE_DEPTH_CANDIDATE_LIMIT=80;/);
assert.match(index, /const BINARY_COMPLEMENT_DEPTH_RESERVE=20;/); assert.match(index, /const BINARY_COMPLEMENT_DEPTH_RESERVE=20;/);
assert.match(index, /const NEG_RISK_CONVERSION_DEPTH_RESERVE=20;/); assert.match(index, /const NEG_RISK_CONVERSION_DEPTH_RESERVE=20;/);