<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="theme-color" content="#0c0917">
<title>Discoverability Compiler · SUCCESSOR Ω</title>
<style>
:root{color-scheme:dark;--bg:#0c0917;--panel:#171222;--ink:#f5f0ff;--muted:#c0b4ce;--purple:#b99aff;--line:#40314f;--mint:#8ce4c1;--gold:#f1ca7a;--danger:#ffb4ad}
*{box-sizing:border-box}body{margin:0;background:radial-gradient(ellipse at 80% 0%,#35204e 0,transparent 48%),var(--bg);color:var(--ink);font:16px/1.65 ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif}a{color:var(--purple);text-underline-offset:4px}button,input,select{font:inherit}button,select,input{max-width:100%}button{cursor:pointer;border:1px solid #a78bd7;border-radius:9px;background:#bea0ed;color:#1e1230;padding:12px 19px;font-weight:650}button:hover{background:#d4baff}button.secondary{color:var(--ink);background:#241a34;border-color:#69547f}button:disabled{opacity:.5;cursor:default}button:focus-visible,a:focus-visible,select:focus-visible,input:focus-visible,summary:focus-visible{outline:3px solid var(--mint);outline-offset:5px}select{background:#21172d;color:var(--ink);border:1px solid #69547f;border-radius:7px;padding:9px;width:100%}main{max-width:1220px;margin:auto;padding:0 28px 72px}.top{border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between;padding:22px 0;gap:20px}.brand{font-weight:700;letter-spacing:.12em;font-size:12px}.top nav{display:flex;flex-wrap:wrap;gap:22px;font-size:13px}.top nav a{text-decoration:none;color:var(--muted)}.hero{padding:67px 0 45px;display:grid;grid-template-columns:1.5fr 1fr;gap:56px;align-items:center}.eyebrow{color:var(--purple);font-size:11px;letter-spacing:.19em;text-transform:uppercase;font-weight:750}.hero h1{font:400 clamp(35px,4.8vw,62px)/1.08 Georgia,"Times New Roman",serif;letter-spacing:-.035em;margin:19px 0 24px}.hero h1 em{font-style:normal;color:#caacff}.hero p{max-width:640px;color:var(--muted);font-size:18px;line-height:1.75}.stamp{display:inline-flex;gap:8px;align-items:center;color:var(--mint);font-size:12px;border:1px solid #47675d;border-radius:30px;padding:6px 12px;margin-top:12px}.stamp::before{content:"";width:6px;height:6px;background:var(--mint);border-radius:100%}.mechanism{background:linear-gradient(145deg,#221732,#120e1d);border:1px solid #58416d;padding:28px;border-radius:16px;box-shadow:0 20px 80px #0003}.mechanism h2{font-size:16px;margin:0 0 8px}.mechanism p{font-size:13px;line-height:1.6}.equation{font:27px/1.5 Georgia,serif;color:#e9d9ff;text-align:center;padding:22px 0}.stage-line{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;text-align:center}.stage-line div{padding:12px 4px;border-top:1px solid var(--line);color:var(--muted);font-size:11px}.stage-line strong{display:block;color:var(--ink);font-size:13px}.section-top{display:flex;justify-content:space-between;align-items:end;margin:29px 0 18px;gap:20px}.section-top h2{font:30px/1.2 Georgia,serif;margin:7px 0}.section-top p{color:var(--muted);font-size:13px;max-width:420px;margin:0}.workspace{display:grid;grid-template-columns:300px 1fr;gap:20px}.panel{background:linear-gradient(160deg,#191321,#14101d);border:1px solid var(--line);border-radius:12px;padding:25px;min-width:0}.controls label{display:block;font-size:12px;font-weight:650;color:var(--muted);margin:19px 0 7px}.controls label:first-of-type{margin-top:0}.note{font-size:12px;color:var(--muted);line-height:1.65}.controls .actions{display:grid;gap:9px;margin-top:23px}.controls .actions button{width:100%;font-size:13px}.status{font-size:13px;padding:13px 0;min-height:54px;color:var(--mint);overflow-wrap:anywhere}.status.error{color:var(--danger)}.state-tag{display:inline-block;color:var(--gold);font-size:10px;letter-spacing:.1em;text-transform:uppercase;border:1px solid #675333;padding:4px 8px;border-radius:5px}.metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;margin:24px 0}.metric{border-left:2px solid #8260ad;padding-left:13px}.metric b{display:block;font:34px/1.1 Georgia,serif}.metric span{font-size:11px;color:var(--muted)}.result h3{font:23px/1.2 Georgia,serif;margin:14px 0 8px}.empty{padding:25px 0 10px;color:var(--muted);font-size:14px;max-width:620px}.table-wrap{overflow:auto;max-width:100%}table{border-collapse:collapse;width:100%;font-size:12px}th{text-align:left;color:var(--muted);font-weight:500}td,th{padding:11px 10px 11px 0;border-bottom:1px solid var(--line);vertical-align:top}td{overflow-wrap:anywhere}code{font-size:12px;color:#dac5fa;overflow-wrap:anywhere}.weight-row{display:flex;gap:5px;flex-wrap:wrap}.weight{display:inline-flex;align-items:center;justify-content:center;width:29px;height:29px;border:1px solid #503963;border-radius:5px;font-size:11px;background:#38244d}.weight.zero{background:#15101e;color:#887597}.quality{background:#17281f;border:1px solid #325e48;border-radius:8px;padding:15px;margin-top:19px}.quality.warn{background:#2b2418;border-color:#6b5733}.quality h4{font-size:13px;margin:0 0 5px}.quality p{font-size:12px;margin:0;color:#d4dacc}.inline-actions{display:flex;flex-wrap:wrap;gap:10px;margin-top:20px}.inline-actions button{font-size:12px;padding:9px 13px}.details{margin-top:15px;border-top:1px solid var(--line);padding-top:14px}.details summary{font-size:13px;cursor:pointer}.details pre{white-space:pre-wrap;overflow-wrap:anywhere;font-size:11px;max-height:360px;overflow:auto;color:var(--muted)}.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:20px}.step-no{display:block;font:32px/1.1 Georgia,serif;color:#b69acb;margin-bottom:20px}.grid3 h3{font-size:16px;margin:0 0 8px}.grid3 p{font-size:13px;color:var(--muted);margin:0}.principle{margin:38px 0 28px;padding:26px 0;border-top:1px solid var(--line);border-bottom:1px solid var(--line);display:grid;grid-template-columns:1fr 1fr;gap:36px}.principle blockquote{font:27px/1.4 Georgia,serif;margin:0}.principle p{margin:0;font-size:13px;color:var(--muted)}footer{border-top:1px solid var(--line);margin-top:48px;padding-top:24px;display:flex;justify-content:space-between;gap:25px;color:var(--muted);font-size:11px}footer a{color:var(--muted)}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}.skip{position:absolute;top:-60px;left:20px;background:var(--ink);color:var(--bg);padding:10px;z-index:5}.skip:focus{top:10px}.loading{font-size:12px;color:var(--gold)}[hidden]{display:none!important}
@media(max-width:900px){.hero{grid-template-columns:1fr;gap:22px;padding:42px 0 25px}.mechanism{max-width:650px}.workspace{grid-template-columns:1fr}.controls{display:grid;grid-template-columns:1fr 1fr;gap:15px}.controls .fields{min-width:0}.controls .actions{margin-top:0}.controls .status{grid-column:1/-1;padding:0}.grid3{gap:12px}.panel{padding:21px}}
@media(max-width:600px){main{padding:0 18px 45px}.top{align-items:flex-start}.top nav{gap:12px;font-size:11px}.brand{font-size:10px}.hero h1{font-size:39px}.hero p{font-size:15px}.controls{display:block}.controls .actions{margin-top:18px}.grid3,.principle{grid-template-columns:1fr}.section-top{display:block}.section-top p{margin-top:12px}.metrics{gap:9px}.metric b{font-size:29px}.metric span{font-size:10px}footer{display:block}footer p{margin-bottom:14px}.mechanism{padding:23px}.result h3{font-size:22px}}
@media(prefers-reduced-motion:reduce){*{scroll-behavior:auto!important}}
</style></head>
<body><a class="skip" href="#operate">Skip to the instrument builder</a>
<main>
<header class="top"><div class="brand">MONTREAL.AI <span style="color:#8e73b4">/</span> SUCCESSOR Ω</div><nav aria-label="Page"><a href="#operate">Operate</a><a href="#evidence">Evidence</a><a href="#research">Research</a></nav></header>
<section class="hero">
<div><div class="eyebrow">Autonomous Enterprises · Activate. Evolve. Scale.</div><h1>Build the observation.<br><em>Unlock the next decision.</em></h1><p>The Discoverability Compiler constructs a measurement program that can answer a bounded question—and explains when the permitted observations cannot.</p><span class="stamp">Experimental · executes locally in your browser</span></div>
<aside class="mechanism" aria-label="How the capability works"><div class="eyebrow">A reusable means of discovery</div><h2 style="margin-top:16px">Make the missing distinction measurable.</h2><div class="equation">primitive readings → wᵀy → decision</div><div class="stage-line"><div><strong>Construct</strong>cancel declared nuisance</div><div><strong>Check</strong>separate required decisions</div><div><strong>Inherit</strong>recheck changed scope</div></div><p>Finite models. Real computation. Synthetic acquisitions. Every accepted distinction depends on the declared model and measurement protocol.</p></aside>
</section>
<section id="operate" aria-labelledby="operate-title">
<div class="section-top"><div><div class="eyebrow">01 / Construct and use</div><h2 id="operate-title">Your first instrument.</h2></div><p>Choose a mission, construct its experiment, then acquire new synthetic readings and inspect the decision.</p></div>
<div class="workspace">
<div class="panel controls">
<div class="fields"><label for="mission">Mission family</label><select id="mission"><option value="digital">Digital fault diagnosis</option><option value="mixture">Mixture assay</option><option value="successor">Held-out successor</option></select>
<label for="condition">Measurement conditions</label><select id="condition"><option value="normal">Declared noise bounds</option><option value="noisy">Larger measurement uncertainty</option><option value="budget">Insufficient acquisition budget</option></select>
<p class="note" id="mission-description">Construct a probe program that distinguishes six digital-module conditions despite shared offset and drift.</p></div>
<div class="actions"><button id="construct" disabled>Construct instrument</button><button id="acquire" class="secondary" disabled>Acquire readings + decide</button><button id="stop" class="secondary" disabled>Stop current work</button><p class="note">No wallet, credentials, model API or server execution. Cost units describe simulated acquisition work.</p></div>
<div id="status" class="status" role="status" aria-live="polite">Loading the source-bound workbench…</div>
</div>
<div class="panel result" aria-labelledby="result-title">
<span class="state-tag" id="mode">Ready for a new execution</span><h3 id="result-title">A capability you can inspect.</h3>
<div id="empty" class="empty">The compiler will synthesize legal contrasts, test every pair of incompatible decisions and select a minimum-cost program within the permitted grammar. Ambiguity and exhausted work stay visible.</div>
<div class="metrics"><div class="metric"><b id="metric-experiments">—</b><span>constructed experiments</span></div><div class="metric"><b id="metric-cost">—</b><span>acquisition units / decision</span></div><div class="metric"><b id="metric-quality">—</b><span>world decisions checked</span></div></div>
<div class="table-wrap"><table id="program-table" hidden><caption class="sr-only">Synthesized measurement program</caption><thead><tr><th>Experiment</th><th>Channel weights</th><th>Noise bound</th><th>Cost</th></tr></thead><tbody id="program-body"></tbody></table></div>
<div id="quality" class="quality warn"><h4>Review and settlement</h4><p>Constructed programs remain REVIEW_REQUIRED. Independent operator admission, Fleet execution and settlement are not connected to this browser experiment.</p></div>
<div class="inline-actions"><button id="invalidate" class="secondary" disabled>Test stale inheritance</button><button id="next" class="secondary" disabled>Construct the successor</button><button id="export" class="secondary" disabled>Export evidence pack</button><button id="restore" class="secondary">Restore an evidence pack</button><input id="restore-file" type="file" accept=".json,application/json" class="sr-only" tabindex="-1" aria-label="Choose a workbench evidence pack"></div>
<details class="details"><summary>Decisions, measurements and limits</summary><pre id="details">No execution yet.</pre></details>
</div></div></section>
<section id="evidence" aria-labelledby="evidence-title">
<div class="section-top"><div><div class="eyebrow">02 / Make the result falsifiable</div><h2 id="evidence-title">What changed—and what did not.</h2></div></div>
<div class="grid3"><article class="panel"><span class="step-no">01</span><h3>Construct the distinction</h3><p>The input provides primitive channel equations and an uncertainty class. The compiler builds weighted measurement programs; it receives no catalogue of finished instruments.</p></article><article class="panel"><span class="step-no">02</span><h3>Check the original question</h3><p>A fit is insufficient. Every admitted world consistent with the complete observation must require the same decision. Touching uncertainty intervals remain ambiguous.</p></article><article class="panel"><span class="step-no">03</span><h3>Earn inheritance again</h3><p>A changed decision or nuisance model invalidates the earlier certificate. Reusable construction code survives; scope-specific programs must be qualified again.</p></article></div>
<div class="principle"><blockquote>A productive asset earns its place<br><span style="color:#c7a8ed">in the next mission.</span></blockquote><p>The independent references retain conventional wins and ties. Development acquisition costs match optimal conventional designs. A separate adaptive control is cheaper than the static compiler. This is a bounded software result, with commercial realization and broader operational autonomy still unproved.</p></div>
</section>
<section id="growth" aria-labelledby="growth-title"><div class="section-top"><div><div class="eyebrow">03 / Earn the next capability</div><h2 id="growth-title">A larger possibility. A new burden of proof.</h2></div></div><div class="grid3"><article class="panel"><span class="step-no">Now</span><h3>Demonstrated software</h3><p>Three synthetic mission families. A frozen compiler. Independent decision checks. A successor that inherits valid structure and refuses changed scope. Conventional ties and losses remain visible.</p></article><article class="panel"><span class="step-no">Next</span><h3>A physical diagnostic fixture</h3><p>Construct a low-voltage switched network, reference loads and a calibrated acquisition interface. Blind the faults. Charge materials, bench time and labor. Test its decisions against an independent instrument.</p></article><article class="panel"><span class="step-no">Later</span><h3>Productive physical capacity</h3><p>Qualified instruments can support manufacturing, commissioned infrastructure and useful energy services. Each stage needs its own materials, power, engineering, validation, financing and independently accepted demand.</p></article></div><div class="quality warn" style="margin-top:20px"><h4>The economic challenge remains open</h4><p>At most US$100 total attributable cost → more than US$10,000 genuinely realizable incremental value. Status: <strong>UNPROVEN</strong>. There is no independent executable offer or cash receipt; full inference, compute, setup and labor costs remain unknown. Acquisition units are not dollars. <a href="commercial-preregistration.json">Inspect the commercial test protocol</a>.</p></div></section>
<section id="research" aria-labelledby="research-title"><div class="section-top"><div><div class="eyebrow">04 / Inspect and reproduce</div><h2 id="research-title">One experiment. A complete record.</h2></div></div><div class="panel"><p>Built additively on the existing SUCCESSOR Ω workbench. The experiment records its model, construction, source identity, typed work drafts and integrity commitments. Imported evidence remains inert.</p><div class="inline-actions"><a href="paper.pdf" id="paper-link">Read the research paper</a><a href="evidence/manifest.json" id="manifest-link">Inspect the evidence manifest</a><a href="https://github.com/MontrealAI/AGI-Alpha-Agent-v0/pull/4872">Review the source PR</a><a href="https://github.com/MontrealAI/AGI-Alpha-Agent-v0/issues/4850">Project coordination</a></div><p class="note" id="source-identity"></p></div></section>
<footer><p>Vincent Boucher · MONTREAL.AI · QUEBEC.AI<br>Montréal, Québec, Canada<br>Powered by TRANSFORMATIONAL INTELLIGENCE ∞</p><p>♾️ TRANSFORMATIONAL META-AGENTIC α-AGI 👁️✨<br>Experimental finite-domain software · Apache-2.0<br><a href="https://github.com/MontrealAI/AGI-Alpha-Agent-v0/blob/main/docs/DISCLAIMER_SNIPPET.md">Project scope and disclaimer</a></p></footer>
</main>
<script type="module">
const bundle={"entry":"examples/successor-discoverability/browser.mjs","files":{"examples/successor-discoverability/browser.mjs":"// SPDX-License-Identifier: Apache-2.0\n// Public local UI: actual workbench construction; synthetic observations; inert imports.\nimport { createCompiler, inspectProgram, executeProgram, canonical } from './compiler.mjs';\nimport { digitalFault, mixtureAssay, acquireSynthetic } from './domains.mjs';\nimport { networkProblem, acquireNetwork } from './heldout.mjs';\nimport { createDiscoverabilityWorkbench, discoverabilityMission } from './workbench-adapter.mjs';\nimport { executeObservations } from './execution.mjs';\nimport { digest } from '../../docs/assets/successor/engine.mjs';\n\nexport async function boot({sourceHash,sourceManifest}) {\n  const $ = id => document.getElementById(id);\n  const compiler = createCompiler({strategy:'cached'});\n  const runtime = createDiscoverabilityWorkbench({compiler});\n  let active = null, pack = null, report = null, problem = null, acquisition = null, receipt = null, successor = false;\n  let validation=null,totalAcquisitionUnits=0,totalCompilerWork=0,acquisitionCount=0;\n  const details = value => { $('details').textContent=JSON.stringify(value,null,2); };\n  const status = text => { $('status').textContent=text; };\n  const setBusy = busy => {\n    $('construct').disabled=busy; $('stop').disabled=!busy; $('restore').disabled=busy;\n    $('mission').disabled=busy; $('condition').disabled=busy;\n    $('acquire').disabled=busy || report?.status!=='COMPILED';\n    $('invalidate').disabled=busy || report?.status!=='COMPILED';\n    $('next').disabled=busy; $('export').disabled=busy || !pack;\n  };\n  const descriptions = {\n    digital:'Construct a probe program that distinguishes six digital-module conditions despite shared offset and drift.',\n    mixture:'Build a spectral contrast that separates nine mixture compositions or their release decisions despite offset and drift.',\n    successor:'Inspect the held-out network: infer which degraded edge needs repair from routed measurements with shared clock nuisance.'\n  };\n  const renderProblem = () => {\n    $('mission-description').textContent=descriptions[$('mission').value];\n    successor=false; report=null; pack=null; acquisition=null; receipt=null; validation=null;\n    $('program-table').hidden=true; $('empty').hidden=false;\n    $('empty').textContent='Ready to construct a new program from primitive channels.';\n    $('result-title').textContent='A capability you can inspect.';\n    $('mode').textContent='Ready for a new execution';\n    ['metric-experiments','metric-cost','metric-quality'].forEach(id=>$(id).textContent='—');\n    details({state:'READY',sourceHash});setBusy(false);\n  };\n  const selectedProblem = () => {\n    const family=$('mission').value,noise=$('condition').value==='noisy'?5:1;\n    let value = family==='digital'?digitalFault({noise,goal:successor?'health':'repair'}):\n      family==='mixture'?mixtureAssay({noise,goal:successor?'quantify':'disposition'}):\n      networkProblem({requirement:'repair',clockOrder:successor?2:1,extendedGrammar:successor});\n    value=JSON.parse(JSON.stringify(value));\n    if(family==='successor'&&noise>1)value.channels.forEach(c=>c.noise=noise);\n    if($('condition').value==='budget')value.missionBudget=1;\n    return value;\n  };\n  const showReport = () => {\n    $('empty').hidden=report?.status==='COMPILED';\n    $('mode').textContent='Newly executed · finite synthetic model';\n    $('result-title').textContent=report.status==='COMPILED'?'The missing distinction is measurable.':\n      report.status==='UNIDENTIFIABLE_WITHIN_GRAMMAR'?'The permitted observations cannot decide.':\n      report.status==='OVER_MISSION_BUDGET'?'A valid method exceeds the mission budget.':'Search stopped without a certificate.';\n    $('empty').textContent=report.status==='UNIDENTIFIABLE_WITHIN_GRAMMAR'?\n      'At least one pair of incompatible decisions has overlapping observations for every legal contrast. Expand the permitted construction or change the measurement conditions.':\n      report.status==='OVER_MISSION_BUDGET'?'The least-cost permitted program costs more than the declared acquisition allowance. No execution is admitted.':\n      'Incomplete search is inconclusive. Increase the declared work allowance to try again.';\n    const program=report.program;\n    $('metric-experiments').textContent=program?.experiments.length??'—';\n    $('metric-cost').textContent=program?.totalCost??'—';\n    $('metric-quality').textContent='—';\n    $('program-table').hidden=!program;\n    $('program-body').replaceChildren();\n    for(const [i,e] of (program?.experiments||[]).entries()) {\n      const row=document.createElement('tr');\n      const vals=[String(i+1),e.weights.map((w,j)=>w?String(w)+' × '+problem.channels[j].id:null).filter(Boolean).join(' + '),'±'+e.radius,String(e.cost)];\n      for(const val of vals){const cell=document.createElement('td');cell.textContent=val;row.append(cell);}\n      $('program-body').append(row);\n    }\n    details({construction:report,sourceHash,workbench:{integrityDigest:pack.integrityDigest,evaluation:pack.evaluation,\n      economics:pack.economics},limits:pack.result.limits});\n    status(report.status+' · '+report.work.used.toLocaleString()+' logical work units · '+(report.libraryHit?'structural cache reused':'constructed a structural library')+'. Independent admission remains HOLD.');\n    setBusy(false);\n  };\n  async function construct() {\n    if(active)return;\n    pack=null;report=null;acquisition=null;receipt=null;validation=null;\n    problem=selectedProblem();active=new AbortController();setBusy(true);\n    status('Constructing legal contrasts and checking decision separation…');\n    $('mode').textContent='Executing now · bounded local work';\n    try {\n      pack=await runtime.run(discoverabilityMission(problem,{budget:2000000,name:'Discoverability Ω',language:'en'}),\n        {sourceHash,signal:active.signal,onProgress:phase=>status('Running: '+phase+'…')});\n      report=pack.result.evidence.construction;\n      totalCompilerWork+=report.work.used;\n      showReport();\n    } catch(error) {\n      status(error.message==='CANCELLED'?'Stopped. No capability was admitted. You can start a fresh bounded run.':'Run failed: '+error.message);\n      $('mode').textContent=error.message==='CANCELLED'?'Stopped by operator':'Execution failed';\n      details({status:'FAILED',error:String(error.message),admission:'HOLD',sourceHash});\n    } finally {active=null;setBusy(false);}\n  }\n  async function acquire() {\n    if(report?.status!=='COMPILED'||active)return;\n    acquisition=null;receipt=null;validation=null;\n    $('metric-quality').textContent='—';$('mode').textContent='Executing now · synthetic acquisitions';\n    active=new AbortController();setBusy(true);\n    try {\n      const program=report.program;inspectProgram(problem,program);\n      let passed=0,checks=[],acquisitions=[];\n      if(acquisitionCount+problem.worlds.length>128)throw Error('SESSION_ACQUISITION_LIMIT: export this evidence, then reload for a new session');\n      for(const [i,world] of problem.worlds.entries()) {\n        if(active.signal.aborted)throw Error('CANCELLED');\n        const sample=$('mission').value==='successor'?acquireNetwork(problem,program,world.id):\n          acquireSynthetic(problem,program,world.id,{nuisanceScale:13+i,errorSign:i%3-1});\n        acquisitions.push(sample);totalAcquisitionUnits+=program.totalCost;acquisitionCount++;\n        const decision=executeProgram(problem,program,sample.observations);\n        const correct=decision.status==='DECIDED'&&decision.decision===world.goal;\n        checks.push({world:world.id,expected:world.goal,actual:decision.decision,status:decision.status,correct});\n        validation={acquisitions,checks,perDecisionAcquisitionUnits:program.totalCost,performedAcquisitionUnits:acquisitions.length*program.totalCost,state:'IN_PROGRESS'};\n        if(correct)passed++;if(i===problem.worlds.length-1)acquisition=sample;\n        await new Promise(resolve=>setTimeout(resolve,0));\n      }\n      if(active.signal.aborted)throw Error('CANCELLED');\n      const delivered=await executeObservations(pack,acquisition.observations);\n      if(active.signal.aborted)throw Error('CANCELLED');\n      receipt=delivered;\n      validation={acquisitions,checks,perDecisionAcquisitionUnits:program.totalCost,performedAcquisitionUnits:acquisitions.length*program.totalCost,state:'COMPLETE'};\n      $('metric-quality').textContent=passed+'/'+problem.worlds.length;\n      $('result-title').textContent=passed===problem.worlds.length?'The constructed program answers the mission.':'An execution failed its original acceptance test.';\n      $('mode').textContent='Newly executed · synthetic acquisitions';\n      status(passed+' of '+problem.worlds.length+' world decisions passed. This check performed '+validation.performedAcquisitionUnits+' acquisition units; the displayed '+program.totalCost+' is per decision. Session total: '+totalAcquisitionUnits+'. Synthetic checks do not validate a physical sensor.');\n      details({validation,latestAcquisition:acquisition,delivery:receipt,construction:report,usage:{compilerLogicalUnits:totalCompilerWork,performedAcquisitionUnits:totalAcquisitionUnits},\n        admission:'HOLD',settlement:'NOT_CONNECTED',sourceHash});\n    } catch(error){if(validation)validation.state='STOPPED';$('mode').textContent='Acquisition stopped';status('Acquisition stopped: '+error.message);details({error:error.message,validation,performedAcquisitionUnits:totalAcquisitionUnits,acquisitionCount,admission:'HOLD'});}\n    finally {active=null;setBusy(false);}\n  }\n  $('construct').addEventListener('click',construct);\n  $('acquire').addEventListener('click',acquire);\n  $('stop').addEventListener('click',()=>{active?.abort();status('Stop requested. The next bounded checkpoint will cancel work.');});\n  $('mission').addEventListener('change',renderProblem);\n  $('condition').addEventListener('change',renderProblem);\n  $('invalidate').addEventListener('click',()=>{\n    const changed=JSON.parse(JSON.stringify(problem));changed.nuisance=changed.nuisance.map((row,i)=>[...row,i*i]);\n    try{inspectProgram(changed,report.program);status('Unexpected stale-scope acceptance. This run must not be promoted.');}\n    catch(error){status('Stale inheritance rejected: the uncertainty model changed. Reuse the construction method; qualify a new program.');\n      details({test:'CHANGED_NUISANCE_SCOPE',expected:'REJECT',observed:error.message,inheritedCapability:'bounded contrast construction',admission:'HOLD'});}\n  });\n  $('next').addEventListener('click',()=>{successor=!successor;construct();});\n  $('export').addEventListener('click',async ()=>{\n    if(!pack)return;\n    const savedPack=pack;\n    const body={schema:'discoverability.browser-session.v1',mode:'RECORDED_EXPORT',pack,acquisition,execution:receipt,validation,usage:{compilerLogicalUnits:totalCompilerWork,performedAcquisitionUnits:totalAcquisitionUnits,acquisitionCount},sourceHash};\n    const envelope={...body,integrityDigest:await digest('discoverability-browser-session',body)};\n    const blob=new Blob([JSON.stringify(envelope,null,2)+'\\n'],{type:'application/json'});\n    const url=URL.createObjectURL(blob),a=document.createElement('a');a.href=url;a.download='discoverability-'+savedPack.frozen.missionDigest.slice(0,12)+'.json';a.click();setTimeout(()=>URL.revokeObjectURL(url),1000);\n    status('Exported an integrity-bound workbench pack. It carries no operator authority or settlement authorization.');\n  });\n  $('restore').addEventListener('click',()=>{if(!active)$('restore-file').click();});\n  $('restore-file').addEventListener('change',async event=>{\n    const file=event.target.files?.[0];if(!file)return;\n    if(active){status('Finish or stop current work before restoring evidence.');event.target.value='';return;}\n    active=new AbortController();setBusy(true);\n    try{\n      if(file.size>2000000)throw Error('PACK_SIZE_LIMIT');\n      const value=JSON.parse(await file.text());\n      let original=value,recordedExecution=null;\n      if(value.schema==='discoverability.browser-session.v1') {\n        const {integrityDigest,...body}=value;\n        if(integrityDigest!==await digest('discoverability-browser-session',body))throw Error('SESSION_INTEGRITY');\n        original=value.pack;recordedExecution=value.execution;\n        if(value.sourceHash!==original.frozen.sourceHash)throw Error('SESSION_SOURCE_BINDING');\n        if(recordedExecution) {\n          const {integrityDigest:executionHash,...executionBody}=recordedExecution;\n          if(executionHash!==await digest('discoverability-execution',executionBody))throw Error('EXECUTION_INTEGRITY');\n          if(recordedExecution.workbenchPackDigest!==original.integrityDigest||recordedExecution.sourceHash!==original.frozen.sourceHash)throw Error('EXECUTION_BINDING');\n          const program=original.result.evidence.construction.program;\n          if(recordedExecution.programDigest!==await digest('discoverability-program',program))throw Error('PROGRAM_BINDING');\n          const replay=executeProgram(original.spec.inputs.problem,program,recordedExecution.observations);\n          if(canonical(replay)!==canonical(recordedExecution.result))throw Error('RECORDED_DECISION');\n        }\n      }\n      const history=await runtime.inspectPack(original);\n      if(active.signal.aborted)throw Error('CANCELLED');\n      pack=null;report=null;acquisition=null;receipt=null;setBusy(false);\n      $('mode').textContent='Recorded import · inert historical evidence';\n      $('result-title').textContent='Integrity checked. Authority not inherited.';\n      $('program-table').hidden=true;$('empty').hidden=false;\n      $('empty').textContent='This imported record is available for inspection only. Construct a new instrument to execute current source.';\n      ['metric-experiments','metric-cost','metric-quality'].forEach(id=>$(id).textContent='—');\n      details({history,importedRecord:value,recordedExecution});status('Imported history is unauthenticated. Active proofs and authority are empty.');\n    }catch(error){status('Import rejected: '+error.message);}\n    finally{active=null;setBusy(false);event.target.value='';}\n  });\n  $('source-identity').textContent='Run discoverability-20261022-v1 · source closure SHA-256 '+sourceHash+' · frozen compiler ece8f2aa1480';\n  details({sourceHash,sourceManifest,admission:'HOLD',settlement:'NOT_CONNECTED'});\n  status('Ready. The next click runs the compiler on this device.');setBusy(false);\n}\n","examples/successor-discoverability/compiler.mjs":"// SPDX-License-Identifier: Apache-2.0\nexport const SCHEMA = 'discoverability.problem.v1';\nexport const COMPILER_VERSION = '1.0.0-experimental';\nconst fail = m => { throw new TypeError(m); };\nconst integer = (v, lo, hi, label) => { if (!Number.isSafeInteger(v) || v \u003c lo || v > hi) fail(label); return v; };\nconst exact = (o, keys, label) => { if (!o || typeof o !== 'object' || Array.isArray(o) || Object.keys(o).sort().join('|') !== [...keys].sort().join('|')) fail(label); };\nexport function snapshot(value, meter=null) {\n  let nodes = 0;\n  function copy(v, depth) {\n    if (++nodes > 30000 || depth > 16) fail('JSON framing limit');\n    if(meter) meter.step('jsonNodes');\n    if (v === null || typeof v === 'boolean') return v;\n    if (typeof v === 'number') { if (!Number.isSafeInteger(v) || Object.is(v,-0)) fail('integer JSON required'); return v; }\n    if (typeof v === 'string') {\n      if (v.length > 100000) fail('string limit');\n      if(meter) meter.step('stringUnits',Math.ceil(v.length/16));\n      for(let i=0;i\u003cv.length;i++){const c=v.charCodeAt(i);if(c>=0xd800&&c\u003c=0xdbff){const d=v.charCodeAt(++i);if(!(d>=0xdc00&&d\u003c=0xdfff))fail('unpaired surrogate');}else if(c>=0xdc00&&c\u003c=0xdfff)fail('unpaired surrogate');}\n      return v;\n    }\n    if (!v || typeof v !== 'object') fail('plain JSON required');\n    const proto = Object.getPrototypeOf(v);\n    if (!Array.isArray(v) && proto !== Object.prototype && proto !== null) fail('plain object required');\n    const own = Reflect.ownKeys(v);\n    if(own.some(k=>typeof k!=='string'||(!Array.isArray(v)||k!=='length')&&!Object.getOwnPropertyDescriptor(v,k).enumerable))fail('non-JSON property');\n    const names = Object.keys(v);\n    if (names.length > 30000) fail('object limit');\n    const out = Array.isArray(v) ? [] : {};\n    for (const k of names) {\n      if (k.length>100 || ['__proto__','constructor','prototype'].includes(k)) fail('forbidden key');\n      const d = Object.getOwnPropertyDescriptor(v, k);\n      if (!d || !Object.hasOwn(d, 'value')) fail('accessor prohibited');\n      out[k] = copy(d.value, depth + 1);\n    }\n    if (Array.isArray(v) && (names.length !== v.length || names.some((k,i) => k !== String(i)))) fail('dense arrays required');\n    return out;\n  }\n  return copy(value, 0);\n}\nexport function canonical(v) {\n  if (Array.isArray(v)) return '[' + v.map(canonical).join(',') + ']';\n  if (v && typeof v === 'object') return '{' + Object.keys(v).sort().map(k => JSON.stringify(k) + ':' + canonical(v[k])).join(',') + '}';\n  return JSON.stringify(v);\n}\nfunction frozen(v) { if(v && typeof v==='object'){ for(const x of Object.values(v)) frozen(x); Object.freeze(v); } return v; }\nconst dot = (a,b) => a.reduce((s,x,i) => s + x*b[i], 0);\nconst gcd = (a,b) => b ? gcd(b,a%b) : Math.abs(a);\nfunction validate(p) {\n  exact(p,['schema','id','channels','worlds','nuisance','grammar','missionBudget'],'problem fields');\n  if(p.schema !== SCHEMA || typeof p.id !== 'string' || !/^[a-z][a-z0-9-]{1,79}$/.test(p.id)) fail('problem identity');\n  if(!Array.isArray(p.channels) || p.channels.length\u003c1 || p.channels.length>10) fail('channel count');\n  const n=p.channels.length, ids=new Set();\n  for(const c of p.channels){\n    exact(c,['id','cost','noise'],'channel fields');\n    if(typeof c.id!=='string' || !/^[a-z][a-z0-9-]{0,47}$/.test(c.id) || ids.has(c.id)) fail('channel identity');\n    ids.add(c.id); integer(c.cost,1,1000000,'channel cost'); integer(c.noise,0,10000,'noise');\n  }\n  if(!Array.isArray(p.worlds) || p.worlds.length\u003c2 || p.worlds.length>64) fail('world count');\n  const worlds=new Set();\n  for(const w of p.worlds){\n    exact(w,['id','goal','signal'],'world fields');\n    if(typeof w.id!=='string'||!w.id||w.id.length>80||worlds.has(w.id)) fail('world identity');\n    worlds.add(w.id);\n    if(typeof w.goal!=='string'||!w.goal||w.goal.length>80) fail('goal');\n    if(!Array.isArray(w.signal)||w.signal.length!==n) fail('signal dimension');\n    for(const x of w.signal) integer(x,-1000000,1000000,'signal');\n  }\n  if(!Array.isArray(p.nuisance)||p.nuisance.length!==n) fail('nuisance rows');\n  const m=p.nuisance[0]?.length;\n  integer(m,0,4,'nuisance columns');\n  for(const row of p.nuisance){ if(!Array.isArray(row)||row.length!==m) fail('nuisance matrix'); for(const x of row) integer(x,-100,100,'nuisance'); }\n  exact(p.grammar,['maxSupport','weightLimit','maxL1'],'grammar');\n  integer(p.grammar.maxSupport,1,n,'support'); integer(p.grammar.weightLimit,1,3,'weight limit'); integer(p.grammar.maxL1,1,12,'L1');\n  integer(p.missionBudget,1,10000000,'mission budget');\n  return p;\n}\nexport const validateProblem = input => frozen(validate(snapshot(input)));\nclass Exhausted extends Error {}\nclass Meter {\n  constructor(limit,checkpoint){this.limit=integer(limit,1,20000000,'work budget');this.used=0;this.counts={};this.checkpoint=checkpoint;this.last=0;}\n  step(kind,n=1){ if(this.used+n>this.limit) throw new Exhausted('work budget exhausted'); this.used+=n; this.counts[kind]=(this.counts[kind]||0)+n; }\n  async cooperate(force=false){if(force||this.used-this.last>=128){this.last=this.used;await this.checkpoint();}}\n  report(){return {used:this.used,limit:this.limit,counters:{...this.counts}};}\n}\nconst structural = p => canonical({schema:SCHEMA,channels:p.channels,nuisance:p.nuisance,grammar:p.grammar});\nfunction legal(w,p){\n  const g=p.grammar;\n  if(w.length!==p.channels.length||w.some(x=>!Number.isSafeInteger(x)||Math.abs(x)>g.weightLimit)) return false;\n  if(w.filter(Boolean).length>g.maxSupport||w.reduce((s,x)=>s+Math.abs(x),0)>g.maxL1) return false;\n  const first=w.find(x=>x!==0);\n  if(!first||first\u003c0||w.reduce((a,b)=>gcd(a,b),0)!==1) return false;\n  return (p.nuisance[0]||[]).every((_,j)=>dot(w,p.nuisance.map(r=>r[j]))===0);\n}\nasync function construct(p,meter){\n  const n=p.channels.length,g=p.grammar,templates=[],w=Array(n).fill(0);\n  async function rec(i,s,l,first){\n    meter.step('grammarNodes'); await meter.cooperate();\n    if(i===n){\n      if(!s||w.reduce((a,b)=>gcd(a,b),0)!==1) return;\n      meter.step('nuisanceChecks',Math.max(1,p.nuisance[0].length));\n      if(legal(w,p)){ if(templates.length>=1024)throw new Exhausted('template retention limit');meter.step('retainedTemplateCells',n);templates.push(Object.freeze([...w])); }\n      return;\n    }\n    w[i]=0; await rec(i+1,s,l,first);\n    if(s>=g.maxSupport) return;\n    for(let x=-g.weightLimit;x\u003c=g.weightLimit;x++){\n      if(x===0||(!first&&x\u003c0)||l+Math.abs(x)>g.maxL1) continue;\n      w[i]=x; await rec(i+1,s+1,l+Math.abs(x),true);\n    }\n    w[i]=0;\n  }\n  await rec(0,0,0,false);\n  meter.step('templateSortBound',templates.length*Math.ceil(Math.log2(templates.length+1)));\n  await meter.cooperate();\n  templates.sort((a,b)=>canonical(a).localeCompare(canonical(b),'en'));\n  return Object.freeze(templates);\n}\nfunction observationsFor(p,weights){\n  return {weights:[...weights],cost:p.channels.reduce((s,c,i)=>s+(weights[i]?c.cost:0),0),radius:p.channels.reduce((s,c,i)=>s+Math.abs(weights[i])*c.noise,0),\n    responses:p.worlds.map(w=>({world:w.id,goal:w.goal,center:dot(weights,w.signal)}))};\n}\nfunction pairsFor(p){const pairs=[];for(let i=0;i\u003cp.worlds.length;i++)for(let j=i+1;j\u003cp.worlds.length;j++)if(p.worlds[i].goal!==p.worlds[j].goal)pairs.push([i,j]);return pairs;}\nfunction maskFor(e,pairs){let mask=0n;for(let i=0;i\u003cpairs.length;i++){const[a,b]=pairs[i];if(Math.abs(e.responses[a].center-e.responses[b].center)>2*e.radius)mask|=1n\u003c\u003cBigInt(i);}return mask;}\nfunction transcriptWitness(p,experiments,pair){\n  const [i,j]=pair;\n  return {left:p.worlds[i].id,right:p.worlds[j].id,leftGoal:p.worlds[i].goal,rightGoal:p.worlds[j].goal,\n    observationTwice:experiments.map(e=>Math.max(e.responses[i].center-e.radius,e.responses[j].center-e.radius)+Math.min(e.responses[i].center+e.radius,e.responses[j].center+e.radius)),\n    scope:'All qualified experiments in this finite grammar; fresh independent bounded errors for each acquisition. Not impossibility outside the grammar.'};\n}\nfunction finish(result,meter){\n  const chars=canonical(result).length;\n  if(chars>150000)throw new Exhausted('serialized result limit');\n  meter.step('serializedUnits',Math.ceil(chars/16));\n  return {...result,work:meter.report(),resourceLimits:{maxTemplates:1024,maxExperiments:128,maxSerializedCharacters:150000,maxCacheEntries:8},\n    workDefinition:'Metered logical operations, including framing and serialization estimates; not VM instruction count. Runtime deadline is separate.'};\n}\nexport function createCompiler({strategy='cached'}={}){\n  if(!['cached','fresh'].includes(strategy)) fail('compiler strategy');\n  const cache=new Map(); let hits=0,misses=0;\n  return {\n    stats:()=>({hits,misses,entries:cache.size}),\n    async compile(input,{budget=2000000,checkpoint=async()=>{}}={}){\n      const meter=new Meter(budget,checkpoint);let p=null,key=null,pairs=[];\n      let templates=[],libraryHit=false,all=[],best=null,bestCost=null,searchComplete=false;\n      try{\n        p=frozen(validate(snapshot(input,meter)));key=structural(p);pairs=pairsFor(p);\n        await meter.cooperate(true);\n        meter.step('frame',p.channels.length+p.worlds.length+pairs.length);\n        if(strategy==='cached'&&cache.has(key)){templates=cache.get(key);libraryHit=true;hits++;meter.step('libraryLookup');}\n        else{templates=await construct(p,meter);misses++;if(strategy==='cached'){if(cache.size>=8)cache.delete(cache.keys().next().value);cache.set(key,templates);}}\n        for(const weights of templates){\n          meter.step('responseEvaluation',p.worlds.length*p.channels.length);\n          const e=observationsFor(p,weights);\n          meter.step('decisionPairChecks',pairs.length); e.mask=maskFor(e,pairs); all.push(e);\n          await meter.cooperate();\n        }\n        const full=(1n\u003c\u003cBigInt(pairs.length))-1n,union=all.reduce((m,e)=>m|e.mask,0n);\n        const base={compilerVersion:COMPILER_VERSION,problemId:p.id,libraryHit,templateCount:templates.length,goalPairCount:pairs.length};\n        if(union!==full){\n          const k=pairs.findIndex((_,i)=>(union&(1n\u003c\u003cBigInt(i)))===0n);\n          return finish({...base,status:'UNIDENTIFIABLE_WITHIN_GRAMMAR',certificate:{decisionIdentifiable:false,optimalWithinGrammar:false,searchComplete:true},\n            witness:transcriptWitness(p,all,pairs[k]),experiments:all.map(({mask,...e})=>e)},meter);\n        }\n        if(!pairs.length){best=[];bestCost=0;searchComplete=true;}\n        else{\n          const byMask=new Map();\n          for(const e of all){meter.step('coverageCollapse');await meter.cooperate();if(!e.mask)continue;const k=e.mask.toString(),old=byMask.get(k);if(!old||e.cost\u003cold.cost)byMask.set(k,e);}\n          let candidates=[...byMask.values()];\n          const keep=[];\n          for(let i=0;i\u003ccandidates.length;i++){\n            let dominated=false;\n            for(let j=0;j\u003ccandidates.length;j++){\n              if(i===j)continue;\n              meter.step('dominanceChecks');\n              if(candidates[j].cost\u003c=candidates[i].cost&&(candidates[j].mask|candidates[i].mask)===candidates[j].mask){dominated=true;break;}\n              await meter.cooperate();\n            }\n            if(!dominated)keep.push(candidates[i]);\n          }\n          candidates=keep.sort((a,b)=>a.cost-b.cost||canonical(a.weights).localeCompare(canonical(b.weights),'en'));\n          const options=[];\n          meter.step('candidateSortBound',candidates.length*Math.ceil(Math.log2(candidates.length+1)));\n          for(let i=0;i\u003cpairs.length;i++){\n            meter.step('optionChecks',candidates.length);await meter.cooperate();\n            options.push(candidates.map((e,j)=>(e.mask&(1n\u003c\u003cBigInt(i)))?j:-1).filter(j=>j>=0));\n          }\n          let cover=0n,chosen=[];\n          while(cover!==full){\n            meter.step('greedySteps',candidates.length);\n            let pick=-1,ratio=-1;\n            for(let i=0;i\u003ccandidates.length;i++){\n              let v=candidates[i].mask&~cover,count=0;while(v){meter.step('greedyPairBits');v&=v-1n;count++;}\n              const r=count/candidates[i].cost;if(r>ratio){ratio=r;pick=i;}\n            }\n            chosen.push(pick);cover|=candidates[pick].mask;await meter.cooperate();\n          }\n          best=chosen.map(i=>candidates[i]);bestCost=best.reduce((s,e)=>s+e.cost,0);\n          const seen=new Map();\n          async function search(covered,cost,selected){\n            meter.step('searchNodes');await meter.cooperate();\n            if(covered===full){if(cost\u003cbestCost){bestCost=cost;best=selected.map(i=>candidates[i]);}return;}\n            if(cost>=bestCost)return;\n            const ck=covered.toString();if(seen.has(ck)&&seen.get(ck)\u003c=cost)return;seen.set(ck,cost);\n            let branch=null;\n            for(let k=0;k\u003cpairs.length;k++){\n              if(covered&(1n\u003c\u003cBigInt(k)))continue;\n              meter.step('branchChecks',1+options[k].length);\n              const o=options[k].filter(i=>cost+candidates[i].cost\u003cbestCost);\n              if(!o.length)return;\n              if(!branch||o.length\u003cbranch.length)branch=o;\n            }\n            for(const i of branch)await search(covered|candidates[i].mask,cost+candidates[i].cost,[...selected,i]);\n          }\n          await search(0n,0,[]);searchComplete=true;\n        }\n        if(best.length>128)throw new Exhausted('program experiment limit');\n        const experiments=best.map(({mask,...e})=>e);\n        const program={schema:'discoverability.program.v1',problemKey:canonical(p),experiments,totalCost:bestCost,\n          protocol:'fresh-independent-bounded-read-errors; shared additive nuisance cancelled within each experiment'};\n        return finish({...base,status:bestCost>p.missionBudget?'OVER_MISSION_BUDGET':'COMPILED',program,\n          certificate:{decisionIdentifiable:true,optimalWithinGrammar:true,searchComplete,acceptedForBudget:bestCost\u003c=p.missionBudget}},meter);\n      }catch(e){\n        if(!(e instanceof Exhausted))throw e;\n        return {compilerVersion:COMPILER_VERSION,problemId:p?.id??'unframed-input',status:'BUDGET_EXHAUSTED',exhaustionReason:e.message,libraryHit,templateCount:templates.length,\n          certificate:{decisionIdentifiable:false,optimalWithinGrammar:false,searchComplete:false},work:meter.report(),\n          limits:['Incomplete search is not a negative scientific result; no program is qualified.']};\n      }\n    }\n  };\n}\nexport function inspectProgram(input,raw){\n  const p=validateProblem(input),program=snapshot(raw);\n  exact(program,['schema','problemKey','experiments','totalCost','protocol'],'program fields');\n  if(program.schema!=='discoverability.program.v1'||program.problemKey!==canonical(p))fail('program scope changed');\n  if(program.protocol!=='fresh-independent-bounded-read-errors; shared additive nuisance cancelled within each experiment')fail('measurement protocol');\n  if(!Array.isArray(program.experiments)||program.experiments.length>2016)fail('experiment count');\n  integer(program.totalCost,0,1000000000,'total cost');\n  let cost=0;\n  for(const e of program.experiments){\n    exact(e,['weights','cost','radius','responses'],'experiment fields');\n    if(!Array.isArray(e.weights)||!legal(e.weights,p))fail('illegal experiment');\n    const expected=observationsFor(p,e.weights);\n    if(canonical(e)!==canonical(expected))fail('experiment certificate changed');\n    cost+=e.cost;\n  }\n  if(cost!==program.totalCost||cost>p.missionBudget)fail('program cost');\n  const pairs=pairsFor(p),full=(1n\u003c\u003cBigInt(pairs.length))-1n,union=program.experiments.reduce((m,e)=>m|maskFor(e,pairs),0n);\n  if(union!==full)fail('goal separation certificate failed');\n  return {problem:p,program};\n}\nexport function executeProgram(input,raw,observations){\n  const {problem:p,program}=inspectProgram(input,raw),ys=snapshot(observations);\n  if(!Array.isArray(ys)||ys.length!==program.experiments.length)fail('observation count');\n  const rational=ys.map(y=>{\n    if(Number.isSafeInteger(y)) return {n:BigInt(y),d:1n};\n    exact(y,['numerator','denominator'],'rational observation');\n    integer(y.numerator,-Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER,'observation numerator');\n    integer(y.denominator,1,1000000000,'observation denominator');\n    return {n:BigInt(y.numerator),d:BigInt(y.denominator)};\n  });\n  const compatible=p.worlds.filter((w,i)=>program.experiments.every((e,j)=>{\n    const {n,d}=rational[j],center=BigInt(e.responses[i].center)*d,delta=n-center;\n    return (delta\u003c0n?-delta:delta)\u003c=BigInt(e.radius)*d;\n  }));\n  const goals=[...new Set(compatible.map(w=>w.goal))];\n  return {status:goals.length===1?'DECIDED':goals.length===0?'OUT_OF_SCOPE':'AMBIGUOUS',decision:goals.length===1?goals[0]:null,compatibleWorlds:compatible.map(w=>w.id)};\n}\n","examples/successor-discoverability/domains.mjs":"// SPDX-License-Identifier: Apache-2.0\nimport {SCHEMA,validateProblem} from './compiler.mjs';\nexport function digitalFault({noise=1,goal='repair',drift=1,missionBudget=40}={}){\n  const stimuli=[[0,0],[0,1],[1,0],[1,1]];\n  const gates={xor:(a,b)=>a^b,and:(a,b)=>a&b,or:(a,b)=>a|b,nand:(a,b)=>1-(a&b),stucklow:()=>0,stuckhigh:()=>1};\n  const channels=['reference-before','input-00','input-01','input-10','input-11','reference-after'].map(id=>({id,cost:1,noise}));\n  return validateProblem({schema:SCHEMA,id:'digital-fault-'+goal,channels,\n    worlds:Object.entries(gates).map(([id,fn])=>({id,goal:goal==='health'?(id==='xor'?'retain':'replace'):id==='xor'?'retain':'replace-'+id,signal:[0,...stimuli.map(([a,b])=>24*fn(a,b)),0]})),\n    nuisance:channels.map((_,i)=>drift?[1,i]:[1]),grammar:{maxSupport:3,weightLimit:2,maxL1:4},missionBudget});\n}\nexport function mixtureAssay({noise=1,goal='disposition',drift=1,missionBudget=48}={}){\n  const a=[1,4,2,0],b=[3,0,1,4],worlds=[];\n  for(let ca=0;ca\u003c=2;ca++)for(let cb=0;cb\u003c=2;cb++)worlds.push({id:'a'+ca+'b'+cb,\n    goal:goal==='quantify'?'a'+ca+'b'+cb:ca>0?'quarantine-a':cb>0?'recover-b':'clear',\n    signal:[0,...a.map((x,i)=>20*(x*ca+b[i]*cb)),0]});\n  const channels=['blank-before','band-violet','band-blue','band-green','band-red','blank-after'].map((id,i)=>({id,cost:i===0||i===5?1:3,noise}));\n  return validateProblem({schema:SCHEMA,id:'mixture-assay-'+goal,channels,worlds,nuisance:channels.map((_,i)=>drift?[1,i]:[1]),\n    grammar:{maxSupport:3,weightLimit:2,maxL1:4},missionBudget});\n}\nexport function acquireSynthetic(problem,program,worldId,{nuisanceScale=13,errorSign=0}={}){\n  const world=problem.worlds.find(w=>w.id===worldId); if(!world)throw new Error('unknown evaluator world');\n  const raw=[],observations=[];\n  for(let j=0;j\u003cprogram.experiments.length;j++){\n    const e=program.experiments[j];\n    const active=e.weights.map((w,i)=>w?i:-1).filter(i=>i>=0);\n    const values=active.map(i=>{\n      const c=problem.channels[i];\n      const nuisance=problem.nuisance[i].reduce((s,x,k)=>s+x*(nuisanceScale+(j+1)*(k+1)),0);\n      const sign=errorSign===0?((i+j)%3)-1:errorSign;\n      return world.signal[i]+nuisance+sign*c.noise;\n    });\n    observations.push(active.reduce((s,i,k)=>s+e.weights[i]*values[k],0)); raw.push({activeChannels:active,values,chargedCost:active.reduce((s,i)=>s+problem.channels[i].cost,0)});\n  }\n  return {observations,raw,mode:'NEWLY_EXECUTED_SYNTHETIC',truthForEvaluatorOnly:{worldId,requiredDecision:world.goal},\n    limits:['Finite supplied world class; synthetic acquisition; no external instrument, real customer or settlement.']};\n}\nexport const DOMAIN_CATALOG=[\n {id:'digital-fault',title:'Diagnose a faulty digital module',output:'A decision and a reusable drift-rejecting probe program',builder:'digitalFault'},\n {id:'mixture-assay',title:'Choose a mixture disposition',output:'A decision and a reusable assay program',builder:'mixtureAssay'}\n];\n","examples/successor-discoverability/heldout.mjs":"// SPDX-License-Identifier: Apache-2.0\n// Authored after the ece8f2aa compiler/reference freeze; no producer imports.\n// Finite synthetic network tomography, not measurements of a deployed network.\nexport const HOLDOUT_ID='network-tomography-post-freeze-20261022';\nexport const FROZEN_COMPILER_COMMIT='ece8f2aa1480ec7b50f633b7893a11c3f22de894';\nexport const FROZEN_COMPILER_SHA256='746853fe817f7f98e4e41a6534c87f1949acc150e9742d935637d56b6e03f898';\nexport const FROZEN_REFERENCE_SHA256='ee44edad7224cdb58cc4aa0e132416efb2904d95eebd96af93fefcd0082a1812';\nexport const GRAPH=Object.freeze({\n nodes:Object.freeze(['source','north','south','target']),\n edges:Object.freeze([\n  Object.freeze({id:'source-north',ends:['source','north'],baseDelay:5}),\n  Object.freeze({id:'source-south',ends:['source','south'],baseDelay:5}),\n  Object.freeze({id:'north-target',ends:['north','target'],baseDelay:5}),\n  Object.freeze({id:'south-target',ends:['south','target'],baseDelay:5}),\n  Object.freeze({id:'north-south',ends:['north','south'],baseDelay:5})\n ]),\n routes:Object.freeze([\n  Object.freeze({id:'route-north',edges:[0,2]}),\n  Object.freeze({id:'route-south',edges:[1,3]}),\n  Object.freeze({id:'route-east-cross',edges:[0,4,3]}),\n  Object.freeze({id:'route-west-cross',edges:[1,4,2]})\n ])\n});\nconst states=()=>[{id:'healthy',edge:null,penalty:0},...GRAPH.edges.flatMap((e,i)=>[20,40].map(penalty=>({id:e.id+'-'+penalty,edge:i,penalty})))];\nconst latencies=state=>GRAPH.routes.map(route=>route.edges.reduce((sum,i)=>sum+GRAPH.edges[i].baseDelay+(state.edge===i?state.penalty:0),0));\nfunction intended(state,requirement) {\n if(requirement==='repair')return state.edge===null?'no-repair':GRAPH.edges[state.edge].id+':'+state.penalty;\n const r=latencies(state);return r[0]\u003c=r[1]?'retain-north':'divert-south';\n}\nexport function networkProblem({requirement='route',clockOrder=1,extendedGrammar=false}={}) {\n if(!['route','repair'].includes(requirement)||![1,2].includes(clockOrder)||typeof extendedGrammar!=='boolean')throw new TypeError('heldout options');\n const channels=[{id:'clock-before',cost:1,noise:1},...GRAPH.routes.map(r=>({id:r.id,cost:1,noise:1})),{id:'clock-after',cost:1,noise:1}];\n return {schema:'discoverability.problem.v1',id:'network-'+requirement+'-clock'+clockOrder+(extendedGrammar?'-extended':''),\n  channels,worlds:states().map(state=>({id:state.id,goal:intended(state,requirement),signal:[0,...latencies(state),0]})),\n  nuisance:channels.map((_,i)=>Array.from({length:clockOrder+1},(_,j)=>i**j)),\n  grammar:extendedGrammar?{maxSupport:4,weightLimit:3,maxL1:8}:{maxSupport:3,weightLimit:2,maxL1:4},\n  missionBudget:12};\n}\nexport function networkTruth(worldId,requirement='route') {\n const state=states().find(w=>w.id===worldId);if(!state)throw new TypeError('unknown heldout world');\n return {worldId,edge:state.edge===null?null:GRAPH.edges[state.edge].id,penalty:state.penalty,latencies:latencies(state),decision:intended(state,requirement)};\n}\nexport function acquireNetwork(problem,program,worldId,{actualClockOrder=problem.nuisance[0].length-1}={}) {\n const state=states().find(w=>w.id===worldId);if(!state||![1,2].includes(actualClockOrder))throw new TypeError('heldout acquisition');\n const intrinsic=[0,...latencies(state),0],observations=[],raw=[];\n for(let k=0;k\u003cprogram.experiments.length;k++) {\n  const coeff=[17+3*k,-4+k,2],weights=program.experiments[k].weights;\n  const readings=weights.map((w,i)=>{\n   if(!w)return null;\n   const drift=Array.from({length:actualClockOrder+1},(_,j)=>coeff[j]*i**j).reduce((a,b)=>a+b,0);\n   // Every experiment makes fresh reads. Half-unit errors are within the declared unit interval.\n   const numerator=2*(intrinsic[i]+drift)+((3*i+2*k)%5-2);\n   return {channel:problem.channels[i].id,numerator,denominator:2};\n  });\n  const numerator=readings.reduce((s,r,i)=>s+(r?weights[i]*r.numerator:0),0);\n  observations.push({numerator,denominator:2});raw.push({experiment:k,readings});\n }\n return {mode:'NEWLY_EXECUTED_SYNTHETIC',worldId,actualClockOrder,observations,raw,\n  disclosure:'Forward graph and rational sensor calculation execute now; no physical network, external worker or market execution.'};\n}\n\n","examples/successor-discoverability/workbench-adapter.mjs":"// SPDX-License-Identifier: Apache-2.0\nimport { createWorkbench } from '../successor-workbench/engine.mjs';\nimport { canonical, parseBounded } from '../../docs/assets/successor/engine.mjs';\nimport { createCompiler, validateProblem } from './compiler.mjs';\n\nconst ownFields = (value, expected, label) => {\n  if (!value || typeof value !== 'object' || Array.isArray(value) ||\n      ![Object.prototype, null].includes(Object.getPrototypeOf(value)) ||\n      Object.getOwnPropertySymbols(value).length) throw Error(label);\n  const keys = Object.getOwnPropertyNames(value).sort(), want = [...expected].sort();\n  if (keys.length !== want.length || keys.some((key, index) => key !== want[index])) throw Error(label);\n  for (const key of keys) {\n    const descriptor = Object.getOwnPropertyDescriptor(value, key);\n    if (!descriptor.enumerable || !Object.hasOwn(descriptor, 'value')) throw Error(label);\n  }\n};\nconst jsonFile = (name, value) => ({\n  name, type: 'application/json', content: JSON.stringify(value, null, 2) + '\\n',\n});\n\nexport function createDiscoverabilityAdapter({ compiler = createCompiler() } = {}) {\n  if (!compiler || typeof compiler.compile !== 'function' || typeof compiler.stats !== 'function') {\n    throw Error('INSTALLED_COMPILER_REQUIRED');\n  }\n  return {\n    manifest: {\n      id: 'discoverability', version: 1,\n      en: 'Construct a decision-making instrument',\n      fr: 'Construire un instrument de décision',\n      scope: 'Compile bounded integer contrasts that distinguish declared decisions despite explicitly modeled nuisance and bounded measurement error.',\n      artifact: 'experiment-plan.json',\n    },\n    validate(input) {\n      ownFields(input, ['problem', 'budget'], 'DISCOVERABILITY_INPUT_SCHEMA');\n      if (!Number.isSafeInteger(input.budget) || input.budget \u003c 1 || input.budget > 2000000) {\n        throw Error('DISCOVERABILITY_WORK_BUDGET');\n      }\n      validateProblem(input.problem);\n    },\n    async execute(input, checkpoint) {\n      const before = parseBounded(canonical(compiler.stats()));\n      await checkpoint('compiling an informative experiment');\n      const result = await compiler.compile(input.problem, {\n        budget: input.budget,\n        checkpoint: () => checkpoint('constructing bounded integer contrasts'),\n      });\n      await checkpoint('recording the construction and limits');\n      const after = parseBounded(canonical(compiler.stats()));\n      const statuses = {\n        COMPILED: 'REVIEW_REQUIRED',\n        UNIDENTIFIABLE_WITHIN_GRAMMAR: 'REJECTED_WITHIN_GRAMMAR',\n        OVER_MISSION_BUDGET: 'REJECTED_OVER_MISSION_BUDGET',\n        BUDGET_EXHAUSTED: 'INCONCLUSIVE',\n      };\n      if (!Object.hasOwn(statuses, result.status)) throw Error('COMPILER_STATUS');\n      const selected = result.program?.experiments || [];\n      const acquisitionCost = selected.reduce((sum, experiment) => sum + experiment.cost, 0);\n      if (!Number.isSafeInteger(acquisitionCost)) throw Error('ACQUISITION_COST');\n      const acceptance = {\n        schema: 'discoverability.acceptance.v1',\n        compilerStatus: result.status,\n        acceptedCapability: false,\n        criterion: 'Every pair of declared worlds with different required decisions has at least one selected contrast with strictly disjoint bounded observation intervals.',\n        uncertaintyModel: 'Nuisance belongs to the declared linear span; each experiment obtains fresh channel reads with independently bounded continuous errors.',\n        declaredModelOnly: true,\n        requiresIndependentReview: true,\n        authority: [],\n        settlement: 'NOT_CONNECTED',\n      };\n      return {\n        decision: statuses[result.status],\n        summary: {\n          compilerStatus: result.status,\n          experimentCount: selected.length,\n          acquisitionCost,\n          acquisitionCostUnit: 'declared per-channel acquisition units',\n          workUsed: result.work.used,\n          workLimit: result.work.limit,\n          acceptedCapability: false,\n        },\n        evidence: {\n          construction: result,\n          compilerStatsBefore: before,\n          compilerStatsAfter: after,\n          acceptance,\n          inheritedJobsDraft: 'The existing seven-package unfunded compiler retains aggregation-specific baseline and hard-gate wording. This draft is not a commissioned discoverability acceptance contract.',\n        },\n        artifacts: [\n          jsonFile('experiment-plan.json', result),\n          jsonFile('input-model.json', input.problem),\n          jsonFile('acceptance.json', acceptance),\n        ],\n        limits: [\n          'The returned instrument is executable software over a declared finite model, not a physical sensor or acquired measurement.',\n          'A finite-model certificate does not establish that the real world belongs to that model or calibration envelope.',\n          'Compilation, local execution, independent review, capability promotion and settlement are separate states.',\n          'Acquisition units and compiler work units are not dollars. Compute, human labor and commercial value require separate observations.',\n          'The inherited Jobs work packages are inert zero-funded drafts; no new receiver, executor, role eligibility or financial authority is created.',\n        ],\n      };\n    },\n  };\n}\n\nexport function createDiscoverabilityWorkbench(options = {}) {\n  return createWorkbench([createDiscoverabilityAdapter(options)]);\n}\n\nexport function discoverabilityMission(problem, { budget = 2000000, name = 'Discoverability Ω', language = 'en' } = {}) {\n  return {\n    schema: 'successor-workbench/v1', family: 'discoverability', name, language,\n    owner: 'local-owner',\n    rights: { dataClass: 'synthetic', source: 'Explicit finite candidate model supplied for this local experiment', license: 'Apache-2.0' },\n    reviewMinutes: 10, inputs: { problem, budget },\n  };\n}\n","examples/successor-workbench/engine.mjs":"// SPDX-License-Identifier: Apache-2.0\nimport { canonical, digest, parseBounded } from '../../docs/assets/successor/engine.mjs';\nimport { missionFor } from '../build-successor/model.mjs';\nimport { compileJobs } from '../build-successor/vendor/agijobs/compiler.mjs';\nimport { createPortfolioJobs } from '../build-successor/vendor/agijobs/templates.mjs';\n\nexport const VERSION = 'successor-workbench/v1';\nexport const REGISTRY = Object.freeze([\n  { id: 'reliability', en: 'Repair a range utility', fr: 'Réparer un utilitaire', artifact: 'repair.patch', scope: 'Closed interval utilities in the documented finite source grammar.' },\n  { id: 'performance', en: 'Compare real algorithms', fr: 'Comparer des algorithmes', artifact: 'benchmark.json', scope: 'Exact sorted unique integer values; sort/reduce versus Set/sort.' },\n  { id: 'documentation', en: 'Check executable examples', fr: 'Vérifier des exemples exécutables', artifact: 'checked-examples.md', scope: 'Named URI and UTF-8 SDK operations in bounded JSON examples.' },\n  { id: 'public-data', en: 'Turn data into a report', fr: 'Transformer des données en rapport', artifact: 'report.html', scope: 'Public or synthetic two-column CSV with exact integer amounts.' },\n  { id: 'numerical', en: 'Reproduce a calculation', fr: 'Reproduire un calcul', artifact: 'numerical.json', scope: 'Polynomial integration using exact rational arithmetic and two quadrature rules.' },\n]);\n\nconst clone = value => parseBounded(canonical(value));\nfunction fields(value, keys, label) {\n  if (!value || typeof value !== 'object' || Array.isArray(value) ||\n      Object.keys(value).sort().join('|') !== [...keys].sort().join('|')) throw Error(`SCHEMA: ${label}`);\n}\nfunction integer(value, low, high, label) {\n  if (!Number.isSafeInteger(value) || value \u003c low || value > high) throw Error(`BOUNDS: ${label}`);\n}\nfunction text(value, maximum, label) {\n  if (typeof value !== 'string' || !value.trim() || value.length > maximum) throw Error(`TEXT: ${label}`);\n}\nfunction html(value) { return String(value).replace(/[&\u003c>\"']/g, char => ({'&':'&amp;','\u003c':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[char])); }\nfunction file(name, type, content) { return { name, type, content }; }\nfunction jsonFile(name, object) { return file(name, 'application/json', JSON.stringify(object, null, 2) + '\\n'); }\n\nexport function example(family = 'reliability') {\n  const inputs = {\n    reliability: { source: 'export function contains(value, low, high) { return low \u003c value && value \u003c high; }', low: 0, high: 10, cases: [-1, 0, 1, 5, 9, 10, 11] },\n    performance: { values: [8, 3, 8, 1, 0, -3, 3, 12, 0, 7], repetitions: 7, repeats: 100 },\n    documentation: { markdown: '# URI helper examples\\n\\n```successor-example\\n{\"operation\":\"url-encode\",\"input\":\"hello world\",\"expected\":\"hello+world\"}\\n```\\n\\n```successor-example\\n{\"operation\":\"url-decode\",\"input\":\"hello%20world\",\"expected\":\"hello world\"}\\n```\\n' },\n    'public-data': { csv: 'group,amount\\nResearch,120\\nSoftware,85\\nResearch,35\\nDocumentation,60\\nSoftware,-5\\n', unit: 'synthetic units' },\n    numerical: { coefficients: [0, 0, 1], lower: 0, upper: 3, steps: 12, tolerancePpm: 1 },\n  };\n  if (!Object.hasOwn(inputs, family)) throw Error('UNSUPPORTED_FAMILY');\n  return { schema: VERSION, family, name: 'My SUCCESSOR Ω', language: 'en', owner: 'local-owner',\n    rights: { dataClass: 'synthetic', source: 'Included public example', license: 'Apache-2.0' },\n    reviewMinutes: 10, inputs: clone(inputs[family]) };\n}\n\nexport function validate(spec, adapter = null) {\n  fields(spec, ['schema','family','name','language','owner','rights','reviewMinutes','inputs'], 'mission');\n  if (spec.schema !== VERSION || !(REGISTRY.some(item => item.id === spec.family) || adapter?.manifest.id === spec.family)) throw Error('UNSUPPORTED_VERSION_OR_FAMILY');\n  text(spec.name, 64, 'name'); text(spec.owner, 128, 'owner');\n  if (!['en','fr'].includes(spec.language)) throw Error('LANGUAGE');\n  fields(spec.rights, ['dataClass','source','license'], 'rights');\n  if (!['public','licensed-nonpersonal','synthetic'].includes(spec.rights.dataClass)) throw Error('INPUT_RIGHTS');\n  text(spec.rights.source, 1000, 'source'); text(spec.rights.license, 1000, 'license');\n  integer(spec.reviewMinutes, 1, 120, 'review capacity');\n  const value = spec.inputs;\n  if (adapter) {\n    adapter.validate(clone(value));\n  } else if (spec.family === 'reliability') {\n    fields(value, ['source','low','high','cases'], 'reliability input');\n    text(value.source, 2000, 'source'); rangeProgram(value.source);\n    integer(value.low, -1000000, 1000000, 'low'); integer(value.high, value.low, 1000000, 'high');\n    if (!Array.isArray(value.cases) || value.cases.length \u003c 1 || value.cases.length > 2000) throw Error('CASES');\n    value.cases.forEach(n => integer(n, -1000001, 1000001, 'case'));\n  } else if (spec.family === 'performance') {\n    fields(value, ['values','repetitions','repeats'], 'performance input');\n    if (!Array.isArray(value.values) || value.values.length \u003c 1 || value.values.length > 2000) throw Error('VALUES');\n    value.values.forEach(n => integer(n, -1000000, 1000000, 'value'));\n    integer(value.repetitions, 3, 15, 'repetitions'); integer(value.repeats, 1, 500, 'repeats');\n  } else if (spec.family === 'documentation') {\n    fields(value, ['markdown'], 'documentation input'); text(value.markdown, 100000, 'markdown');\n    const matches = [...value.markdown.matchAll(/```successor-example\\s*\\n([\\s\\S]*?)\\n```/g)];\n    if (!matches.length || matches.length > 40) throw Error('EXAMPLES: use 1–40 successor-example JSON blocks');\n    for (const match of matches) validateDocExample(parseBounded(match[1]));\n  } else if (spec.family === 'public-data') {\n    fields(value, ['csv','unit'], 'data input'); text(value.csv, 100000, 'csv'); text(value.unit, 80, 'unit');\n    readRows(value.csv);\n  } else {\n    fields(value, ['coefficients','lower','upper','steps','tolerancePpm'], 'numerical input');\n    if (!Array.isArray(value.coefficients) || !value.coefficients.length || value.coefficients.length > 7) throw Error('COEFFICIENTS');\n    value.coefficients.forEach(n => integer(n, -1000, 1000, 'coefficient'));\n    integer(value.lower, -100, 99, 'lower'); integer(value.upper, value.lower + 1, 100, 'upper');\n    integer(value.steps, 2, 1000, 'steps'); if (value.steps % 2) throw Error('EVEN_STEPS_REQUIRED');\n    integer(value.tolerancePpm, 0, 1000000, 'absolute tolerance in millionths');\n  }\n  canonical(spec);\n  return clone(spec);\n}\n\nexport async function semanticIdentity(spec, adapter = null) {\n  const { name, language, ...semantic } = validate(spec, adapter);\n  return digest('workbench-mission', semantic);\n}\n\nfunction rangeProgram(source) {\n  const match = /^\\s*export\\s+function\\s+contains\\s*\\(\\s*value\\s*,\\s*low\\s*,\\s*high\\s*\\)\\s*\\{\\s*return\\s+low\\s*(\u003c=|\u003c)\\s*value\\s*&&\\s*value\\s*(\u003c=|\u003c)\\s*high\\s*;\\s*\\}\\s*$/.exec(source);\n  if (!match) throw Error('SOURCE_GRAMMAR: only the documented bounded contains function is supported');\n  return { lower: match[1], upper: match[2], execute: (value, low, high) =>\n    (match[1] === '\u003c=' ? low \u003c= value : low \u003c value) && (match[2] === '\u003c=' ? value \u003c= high : value \u003c high) };\n}\nasync function reliability(input, checkpoint) {\n  const incumbent = rangeProgram(input.source);\n  const cases = [...new Set([...input.cases, input.low - 1, input.low, input.high, input.high + 1])];\n  const tests = cases.map(value => ({value, expected: value >= input.low && value \u003c= input.high,\n    actual: incumbent.execute(value, input.low, input.high)}));\n  const attempts = [];\n  for (const lower of ['\u003c','\u003c=']) for (const upper of ['\u003c','\u003c=']) {\n    await checkpoint('testing');\n    const source = `export function contains(value, low, high) { return low ${lower} value && value ${upper} high; }`;\n    const method = rangeProgram(source);\n    const failed = cases.filter(value => method.execute(value, input.low, input.high) !== (value >= input.low && value \u003c= input.high));\n    attempts.push({source, failed});\n  }\n  const selected = attempts.find(item => item.failed.length === 0);\n  const defects = tests.filter(item => item.expected !== item.actual);\n  const candidate = selected.source;\n  const originalLines=input.source.trim().split(/\\r?\\n/);\n  const patch = `--- a/contains.mjs\\n+++ b/contains.mjs\\n@@ -1,${originalLines.length} +1 @@\\n${originalLines.map(line=>'-'+line).join('\\n')}\\n+${candidate}\\n`;\n  const checks = `// SPDX-License-Identifier: Apache-2.0\\nimport assert from 'node:assert/strict';\\nimport { contains } from './contains.mjs';\\nfor (const c of ${JSON.stringify(tests.map(({value,expected})=>({value,expected})))}) assert.equal(contains(c.value, ${input.low}, ${input.high}), c.expected);\\nconsole.log('All ${tests.length} fixed contract checks passed');\\n`;\n  return { decision: defects.length ? 'REPAIR_PROPOSED' : 'RETAIN_INCUMBENT', summary: {tests: tests.length, defects: defects.length, candidateFailures: 0},\n    evidence: {tests, attempts, protectedCases: false, execution: 'Finite source grammar interpreted without eval or arbitrary host execution'},\n    artifacts: [file('contains.mjs','text/javascript',candidate+'\\n'), file('original.mjs','text/javascript',input.source+'\\n'),\n      file('check.mjs','text/javascript',checks),file('repair.patch','text/plain',defects.length ? patch : '# No repair needed.\\n'),jsonFile('tests.json',tests)],\n    limits: ['This adapter supports the declared range utility grammar only; arbitrary repositories need a separately isolated executor.', 'Public contract tests are engineering evidence, not independently protected qualification.'] };\n}\n\nasync function performanceWork(input, checkpoint) {\n  const sortUnique = values => values.slice().sort((a,b)=>a-b).filter((n,i,a)=>i===0 || n!==a[i-1]);\n  const setUnique = values => [...new Set(values)].sort((a,b)=>a-b);\n  const expected = sortUnique(input.values);\n  const samples = { sort: [], set: [] };\n  for (let r=0;r\u003cinput.repetitions;r++) {\n    for (const name of (r%2 ? ['set','sort'] : ['sort','set'])) {\n      await checkpoint('benchmarking');\n      const fn = name==='sort' ? sortUnique : setUnique;\n      const start = globalThis.performance.now(); let actual;\n      for (let i=0;i\u003cinput.repeats;i++) actual=fn(input.values);\n      samples[name].push(Math.max(0,Math.round((globalThis.performance.now()-start)*1000)));\n      if (canonical(actual)!==canonical(expected)) throw Error('CRITICAL_CORRECTNESS_FAILURE');\n    }\n  }\n  const median = values => [...values].sort((a,b)=>a-b)[Math.floor(values.length/2)];\n  const selected = median(samples.set) \u003c median(samples.sort) ? 'set' : 'sort';\n  const report = { samplesMicrosecondsPerBatch: samples, batchRepeats: input.repeats,\n    medianMicroseconds: {sort: median(samples.sort),set: median(samples.set)}, selected, output: expected,\n    resourceTradeoff: 'Set retains a hash table and a unique-value array; sort copies and sorts all input values. Peak memory is not measured.' };\n  return {decision: selected==='sort'?'RETAIN_INCUMBENT':'CANDIDATE_FASTER_IN_THIS_RUN',summary:{inputCount:input.values.length,outputCount:expected.length,correct:true},\n    evidence:report,artifacts:[jsonFile('benchmark.json',report),jsonFile('values.json',input.values),\n      file('unique.mjs','text/javascript',`// SPDX-License-Identifier: Apache-2.0\\nexport const unique = ${selected==='set' ? \"values => [...new Set(values)].sort((a,b)=>a-b)\" : \"values => values.slice().sort((a,b)=>a-b).filter((n,i,a)=>i===0 || n!==a[i-1])\"};\\n`)],\n    limits:['Device/JIT/order effects can dominate small timings. This result does not establish general superiority.', 'Peak memory, monetary cost and human savings are unmeasured.']};\n}\n\nfunction validateDocExample(value) {\n  fields(value,['operation','input','expected'],'documentation example');\n  if (!['url-encode','url-decode','utf8-bytes'].includes(value.operation)) throw Error('UNSUPPORTED_SDK_OPERATION');\n  if (typeof value.input!=='string' || value.input.length>4000 || typeof value.expected!=='string') throw Error('SDK_INPUT');\n}\nfunction sdk(value) {\n  if(value.operation==='url-encode')return encodeURIComponent(value.input);\n  if(value.operation==='url-decode')return decodeURIComponent(value.input);\n  return String(new TextEncoder().encode(value.input).length);\n}\nasync function documentation(input, checkpoint) {\n  const checks=[]; let offset=0; let repaired='';\n  for (const match of input.markdown.matchAll(/```successor-example\\s*\\n([\\s\\S]*?)\\n```/g)) {\n    await checkpoint('checking-examples');\n    const value=parseBounded(match[1]); let actual=null,error=null;\n    try { actual=sdk(value); } catch { error='INVALID_URI_ENCODING'; }\n    checks.push({index:checks.length+1,...value,actual,error,passed:error===null&&actual===value.expected});\n    repaired+=input.markdown.slice(offset,match.index)+(error ? match[0] : '```successor-example\\n'+JSON.stringify({...value,expected:actual})+'\\n```');\n    offset=match.index+match[0].length;\n  }\n  repaired+=input.markdown.slice(offset);\n  const failures=checks.filter(c=>!c.passed), errors=checks.filter(c=>c.error);\n  return {decision:errors.length?'REPAIR_REQUIRED':failures.length?'DOCUMENTATION_CORRECTION_PROPOSED':'RETAIN_INCUMBENT',\n    summary:{examples:checks.length,incorrectExamples:failures.length,invalidInputs:errors.length},evidence:{checks,contract:'URI component encoding/decoding and UTF-8 byte count; actual standard-library execution'},\n    artifacts:[file('original-examples.md','text/markdown',input.markdown),file('checked-examples.md','text/markdown',repaired),jsonFile('example-checks.json',checks)],\n    limits:['Only the named SDK operations run. Markdown outside the example blocks remains inert.', 'Proposed expected-value corrections require review; original failures remain in the evidence.']};\n}\n\nfunction readRows(csv) {\n  const lines=[]; let row=[],cell='',quoted=false,closed=false;\n  for(let i=0;i\u003ccsv.length;i++) {\n    const ch=csv[i];\n    if(quoted){if(ch==='\"'){if(csv[i+1]==='\"'){cell+='\"';i++;}else{quoted=false;closed=true;}}else cell+=ch;}\n    else if(ch==='\"'&&!cell&&!closed)quoted=true;\n    else if(ch===','){row.push(cell);cell='';closed=false;}\n    else if(ch==='\\n'||ch==='\\r'){if(ch==='\\r'&&csv[i+1]==='\\n')i++;row.push(cell);lines.push(row);row=[];cell='';closed=false;}\n    else{if(closed||ch==='\"')throw Error('CSV_QUOTING');cell+=ch;}\n    if(lines.length>2001)throw Error('CSV_ROW_LIMIT');\n  }\n  if(quoted)throw Error('CSV_UNCLOSED_QUOTE');\n  if(row.length||cell||closed){row.push(cell);lines.push(row);}\n  if(canonical(lines.shift())!==canonical(['group','amount'])||!lines.length)throw Error('CSV_HEADER: group,amount');\n  return lines.map((item,index)=>{\n    if(item.length!==2||!item[0].trim()||item[0].length>100||!/^[-]?(0|[1-9][0-9]{0,8})$/.test(item[1]))throw Error(`CSV_ROW: ${index+2}`);\n    const amount=Number(item[1]); integer(amount,-1000000,1000000,'amount');\n    return {group:item[0],amount};\n  });\n}\nfunction csvCell(value) { const raw=String(value);return '\"'+(/^[=+\\-@\\t\\r]/.test(raw)?\"'\"+raw:raw).replaceAll('\"','\"\"')+'\"'; }\nasync function publicData(input, checkpoint) {\n  const rows=readRows(input.csv), groups=new Map();\n  for(const row of rows){await checkpoint('analysing');const old=groups.get(row.group)||{group:row.group,count:0,total:0,min:row.amount,max:row.amount};old.count++;old.total+=row.amount;old.min=Math.min(old.min,row.amount);old.max=Math.max(old.max,row.amount);groups.set(row.group,old);}\n  const summary=[...groups.values()].sort((a,b)=>a.group\u003cb.group?-1:a.group>b.group?1:0);\n  const total=rows.reduce((sum,row)=>sum+row.amount,0);\n  if(summary.reduce((sum,row)=>sum+row.total,0)!==total)throw Error('RECONCILIATION_FAILED');\n  const report='\u003c!doctype html>\u003chtml lang=\"en\">\u003cmeta charset=\"utf-8\">\u003cmeta name=\"viewport\" content=\"width=device-width\">\u003ctitle>SUCCESSOR data report\u003c/title>\u003cstyle>body{font:18px system-ui;max-width:60rem;margin:3rem auto;padding:1rem}td,th{padding:.6rem;text-align:left;border-bottom:1px solid #aaa}table{border-collapse:collapse}\u003c/style>\u003ch1>Public-data report\u003c/h1>\u003cp>'+html(rows.length)+' rows · '+html(input.unit)+' · exact total '+html(total)+'\u003c/p>\u003ctable>\u003cthead>\u003ctr>\u003cth>Group\u003c/th>\u003cth>Count\u003c/th>\u003cth>Total\u003c/th>\u003cth>Minimum\u003c/th>\u003cth>Maximum\u003c/th>\u003c/tr>\u003c/thead>\u003ctbody>'+summary.map(row=>'\u003ctr>'+[row.group,row.count,row.total,row.min,row.max].map(v=>'\u003ctd>'+html(v)+'\u003c/td>').join('')+'\u003c/tr>').join('')+'\u003c/tbody>\u003c/table>\u003cp>Descriptive results for the supplied data only. Coverage and causal interpretation require review.\u003c/p>\u003c/html>';\n  return {decision:'REPORT_READY_FOR_REVIEW',summary:{rows:rows.length,groups:summary.length,total,unit:input.unit},evidence:{groups:summary,reconciled:true},\n    artifacts:[file('report.html','text/html',report),file('summary.csv','text/csv','group,count,total,min,max\\n'+summary.map(row=>[csvCell(row.group),row.count,row.total,row.min,row.max].join(',')).join('\\n')+'\\n'),jsonFile('analysis.json',{total,groups:summary})],\n    limits:['Exact descriptive arithmetic does not establish population coverage or causality.', 'CSV labels are escaped against formula interpretation; the source remains in the mission specification.']};\n}\n\nfunction fraction(n,d=1n){if(d===0n)throw Error('ZERO_DENOMINATOR');if(d\u003c0n){n=-n;d=-d;}let a=n\u003c0n?-n:n,b=d;while(b){const c=a%b;a=b;b=c;}return [n/(a||1n),d/(a||1n)];}\nfunction add(a,b){return fraction(a[0]*b[1]+b[0]*a[1],a[1]*b[1]);}\nfunction mul(a,b){return fraction(a[0]*b[0],a[1]*b[1]);}\nfunction abs(a){return [a[0]\u003c0n?-a[0]:a[0],a[1]];}\nfunction rationalText(a){return `${a[0]}/${a[1]}`;}\nfunction polynomial(coefficients,x){let result=[0n,1n];for(const c of [...coefficients].reverse())result=add(mul(result,x),[BigInt(c),1n]);return result;}\nasync function numerical(input,checkpoint){\n  const h=fraction(BigInt(input.upper-input.lower),BigInt(input.steps));let trap=[0n,1n],simpson=[0n,1n];\n  for(let i=0;i\u003c=input.steps;i++){await checkpoint('integrating');const y=polynomial(input.coefficients,add([BigInt(input.lower),1n],mul(h,[BigInt(i),1n])));trap=add(trap,mul(y,[i===0||i===input.steps?1n:2n,1n]));simpson=add(simpson,mul(y,[i===0||i===input.steps?1n:i%2?4n:2n,1n]));}\n  trap=mul(trap,mul(h,[1n,2n]));simpson=mul(simpson,mul(h,[1n,3n]));\n  let exact=[0n,1n];input.coefficients.forEach((c,i)=>{const n=BigInt(i+1);exact=add(exact,fraction(BigInt(c)*(BigInt(input.upper)**n-BigInt(input.lower)**n),n));});\n  const error=value=>abs(add(value,[-exact[0],exact[1]]));const tolerance=fraction(BigInt(input.tolerancePpm),1000000n);\n  const passes=value=>{const e=error(value);return e[0]*tolerance[1]\u003c=tolerance[0]*e[1];};\n  const evidence={analytic:rationalText(exact),trapezoid:rationalText(trap),simpson:rationalText(simpson),\n    absoluteErrors:{trapezoid:rationalText(error(trap)),simpson:rationalText(error(simpson))},absoluteTolerance:rationalText(tolerance),\n    passes:{trapezoid:passes(trap),simpson:passes(simpson)},arithmetic:'Exact reduced BigInt rational numbers; coefficients in increasing powers'};\n  return {decision:passes(simpson)?'WITHIN_DECLARED_TOLERANCE':'REPAIR_REQUIRED',summary:{steps:input.steps,degree:input.coefficients.length-1,...evidence.passes},\n    evidence,artifacts:[jsonFile('numerical.json',evidence),jsonFile('calculation-input.json',input)],\n    limits:['This reconstructs polynomial quadrature under stated assumptions, not an arbitrary scientific paper.', 'Input uncertainty, physical-model validity and external replication are unmeasured.']};\n}\n\nconst HANDLERS = {reliability,performance:performanceWork,documentation,'public-data':publicData,numerical};\n\nexport async function plan(spec, now = new Date().toISOString(), adapter = null) {\n  const checked=validate(spec,adapter), identity=await semanticIdentity(checked,adapter);\n  const mission=missionFor({name:checked.name,budget:'1',now});\n  mission.missionId='work-'+identity.slice(0,24); mission.title=checked.name;\n  mission.objective=(adapter?.manifest || REGISTRY.find(item=>item.id===checked.family)).scope;\n  mission.budget.limitBaseUnits='0';mission.budget.maxJobs=7;\n  mission.proofProtocol.minimumMargin=0;\n  mission.allowedTools=['fixed-workbench-'+checked.family];\n  mission.rights[0].dataClass=checked.rights.dataClass==='synthetic'?'synthetic':'public-licensed-nonpersonal';\n  mission.rights[0].license=checked.rights.license;mission.rights[0].sourceId='mission-input';\n  const proposed=createPortfolioJobs(mission), grouped=new Map();\n  for(const job of proposed){if(!grouped.has(job.family))grouped.set(job.family,[]);grouped.get(job.family).push(job);}\n  const jobs=[...grouped.entries()].map(([family,items])=>({...items[0],jobId:mission.missionId+':'+family,\n    objective:items.map(item=>item.objective).join(' '),covers:items.flatMap(item=>item.covers),\n    acceptance:{...items[0].acceptance,predicate:'Review the exact input, delivered artifacts and retained failures for: '+items.map(item=>item.objective).join(' ')}}));\n  const order=['constitution','evidence','formation','challenge','verification','admission','renewal'];\n  jobs.sort((a,b)=>order.indexOf(a.family)-order.indexOf(b.family));\n  const edges=jobs.slice(1).map((job,i)=>({from:jobs[i].jobId,to:job.jobId,kind:'evidence'}));\n  for(const edge of edges)jobs.find(job=>job.jobId===edge.to).authorizedInputs.push(edge.from);\n  return compileJobs(mission,{jobs,edges,now});\n}\n\nexport async function run(spec, {sourceHash,signal,onProgress=()=>{},onCheckpoint=async()=>{},clock=()=>globalThis.performance.now(),adapter=null}={}) {\n  const input=validate(spec,adapter);\n  if(!/^[a-f0-9]{64}$/.test(sourceHash||''))throw Error('SOURCE_IDENTITY_REQUIRED');\n  const started=clock();let count=0;\n  const checkpoint=async phase=>{\n    await onCheckpoint();\n    if(signal?.aborted)throw Error('CANCELLED');\n    if(clock()-started>60000)throw Error('TIME_BUDGET_EXCEEDED');\n    if(count++%25===0){onProgress(phase);await new Promise(resolve=>setTimeout(resolve,0));}\n  };\n  await checkpoint('planning');\n  const missionDigest=await semanticIdentity(input,adapter), createdAt=new Date().toISOString();\n  const frozen={schema:VERSION,missionDigest,sourceHash,adapter:input.family,adapterVersion:adapter?.manifest.version || 1,\n    model:null,provider:null,authority:[],inputPolicy:input.rights,reviewMinutes:input.reviewMinutes};\n  const releaseDigest=await digest('workbench-release',frozen);\n  const compilation=await plan(input,createdAt,adapter);\n  const result=await (adapter?.execute || HANDLERS[input.family])(input.inputs,checkpoint);\n  fields(result,['decision','summary','evidence','artifacts','limits'],'adapter output');\n  text(result.decision,128,'decision');\n  if(!Array.isArray(result.artifacts)||result.artifacts.length\u003c1||result.artifacts.length>12)throw Error('ARTIFACT_COUNT');\n  await checkpoint('verifying');\n  const artifacts=await Promise.all(result.artifacts.map(async artifact=>({...artifact,digest:await digest('workbench-artifact',artifact)})));\n  const body={schema:VERSION,spec:input,createdAt,frozen,releaseDigest,compilation,result:{...result,artifacts},\n    economics:{elapsedMilliseconds:Math.max(0,Math.round(clock()-started)),providerSpendBaseUnits:'0',settlementSpendBaseUnits:'0',\n      computeCost:null,humanMinutes:null,reviewCapacityMinutes:input.reviewMinutes,allowanceIs:'UNFUNDED'},\n    evaluation:{scope:'PUBLIC_LOCAL_EXECUTION',independentProof:false,admission:'HOLD',authority:[],settlement:'NOT_CONNECTED'},\n    chronicle:[{kind:'local-result',decision:result.decision,missionDigest,releaseDigest,inheritedProof:false,inheritedAuthority:false}]};\n  const pack={...body,integrityDigest:await digest('workbench-pack',body)};\n  await inspectPack(pack,adapter);\n  return pack;\n}\n\nexport async function inspectPack(value, adapter = null) {\n  fields(value,['schema','spec','createdAt','frozen','releaseDigest','compilation','result','economics','evaluation','chronicle','integrityDigest'],'pack');\n  validate(value.spec,adapter);\n  const {integrityDigest,...body}=value;\n  if(integrityDigest!==await digest('workbench-pack',body))throw Error('PACK_INTEGRITY');\n  if(value.frozen.missionDigest!==await semanticIdentity(value.spec,adapter)||value.releaseDigest!==await digest('workbench-release',value.frozen))throw Error('PACK_BINDING');\n  if(!Array.isArray(value.result.artifacts)||value.result.artifacts.length>12)throw Error('PACK_ARTIFACTS');\n  for(const artifact of value.result.artifacts){fields(artifact,['name','type','content','digest'],'artifact');\n    if(['mission.json','evidence.json','READ_ME.txt','lifecycle.json','signed-receipt.json','source-key.txt'].includes(artifact.name)||\n       /^(con|prn|aux|nul|com[0-9]|lpt[0-9])(\\.|$)/i.test(artifact.name)||artifact.name.endsWith('.'))throw Error('RESERVED_ARTIFACT_NAME');\n    if(!/^[A-Za-z0-9][A-Za-z0-9_.-]{0,79}$/.test(artifact.name)||!['text/javascript','text/plain','text/csv','text/html','text/markdown','application/json'].includes(artifact.type)||typeof artifact.content!=='string'||artifact.content.length>200000)throw Error('ARTIFACT_POLICY');\n    const {digest:hash,...content}=artifact;if(hash!==await digest('workbench-artifact',content))throw Error('ARTIFACT_INTEGRITY');}\n  if(new Set(value.result.artifacts.map(item=>item.name)).size!==value.result.artifacts.length)throw Error('DUPLICATE_ARTIFACT');\n  if(canonical(value.compilation)!==canonical(await plan(value.spec,value.createdAt,adapter)))throw Error('JOB_BINDING');\n  return {spec:clone(value.spec),history:{missionDigest:value.frozen.missionDigest,releaseDigest:value.releaseDigest,decision:value.result.decision},\n    authentication:'UNAUTHENTICATED_HISTORICAL_IMPORT',activeProof:[],activeAuthority:[]};\n}\n\nexport function createWorkbench(adapters = []) {\n  const installed = new Map();\n  for(const adapter of adapters){\n    fields(adapter,['manifest','validate','execute'],'installed adapter');\n    const manifest=adapter.manifest;\n    fields(manifest,['id','version','en','fr','scope','artifact'],'adapter manifest');\n    if(!/^[a-z][a-z0-9-]{1,47}$/.test(manifest.id)||REGISTRY.some(item=>item.id===manifest.id)||installed.has(manifest.id))throw Error('ADAPTER_ID');\n    integer(manifest.version,1,1000000,'adapter version');\n    for(const key of ['en','fr','scope','artifact'])text(manifest[key],1000,key);\n    if(typeof adapter.validate!=='function'||typeof adapter.execute!=='function')throw Error('ADAPTER_INTERFACE');\n    installed.set(manifest.id,Object.freeze({...adapter,manifest:Object.freeze(clone(manifest))}));\n  }\n  const resolve=spec=>installed.get(spec.family)||null;\n  return Object.freeze({registry:Object.freeze([...REGISTRY,...[...installed.values()].map(item=>item.manifest)]),\n    validate:spec=>validate(spec,resolve(spec)),\n    run:(spec,options)=>run(spec,{...options,adapter:resolve(spec)}),\n    plan:(spec,now)=>plan(spec,now,resolve(spec)),\n    inspectPack:pack=>inspectPack(pack,resolve(pack.spec))});\n}\n","docs/assets/successor/engine.mjs":"// SPDX-License-Identifier: Apache-2.0\n/** Fixed, bounded aggregation engines. No generated JavaScript is executed. */\nexport const VERSION = 'successor-browser-v1';\nconst exact = (value, keys) => value && typeof value === 'object' && !Array.isArray(value) && Object.keys(value).sort().join('|') === [...keys].sort().join('|');\nconst integer = (value, low, high) => Number.isSafeInteger(value) && value >= low && value \u003c= high;\nfunction scalar(value) {\n    if (typeof value !== 'string') return false;\n    for (let i = 0; i \u003c value.length; i++) {\n        const c = value.charCodeAt(i);\n        if (c >= 0xd800 && c \u003c= 0xdbff) {\n            const next = value.charCodeAt(++i);\n            if (!(next >= 0xdc00 && next \u003c= 0xdfff)) return false;\n        } else if (c >= 0xdc00 && c \u003c= 0xdfff) return false;\n    }\n    return true;\n}\nexport function canonical(value) {\n    let nodes = 0;\n    function encode(item, depth = 0) {\n        if (++nodes > 100000 || depth > 32) throw Error('JSON complexity exceeds limit');\n        if (item === null || typeof item === 'boolean') return JSON.stringify(item);\n        if (typeof item === 'string' && scalar(item)) return JSON.stringify(item);\n        if (typeof item === 'number' && Number.isSafeInteger(item) && !Object.is(item, -0)) return String(item);\n        if (Array.isArray(item)) {\n            for (let i = 0; i \u003c item.length; i++) if (!Object.hasOwn(item, i)) throw Error('Sparse arrays are not JSON');\n            return '[' + item.map(v => encode(v, depth + 1)).join(',') + ']';\n        }\n        if (item && typeof item === 'object' && [Object.prototype, null].includes(Object.getPrototypeOf(item))) {\n            return '{' + Object.keys(item).sort().map(key => {\n                if (!/^[\\x20-\\x7e]+$/.test(key)) throw Error('Object keys must be printable ASCII');\n                return JSON.stringify(key) + ':' + encode(item[key], depth + 1);\n            }).join(',') + '}';\n        }\n        throw Error('Unsupported JSON value; integers and Unicode scalars required');\n    }\n    const result = encode(value);\n    if (new TextEncoder().encode(result).length > 2000000) throw Error('Canonical JSON exceeds 2 MB');\n    return result;\n}\nexport async function digest(domain, value) {\n    if (!/^[a-z][a-z0-9-]{0,63}$/.test(domain)) throw Error('Invalid digest domain');\n    const bytes = new TextEncoder().encode('successor-omega/v1:' + domain + '\\0' + canonical(value));\n    return Array.from(new Uint8Array(await crypto.subtle.digest('SHA-256', bytes)), n => n.toString(16).padStart(2, '0')).join('');\n}\n/** Parse untrusted imports before they can allocate large or deeply nested objects. */\nexport function parseBounded(text) {\n    if (typeof text !== 'string' || new TextEncoder().encode(text).length > 2_000_000) throw Error('Import exceeds 2 MB');\n    let pos = 0, nodes = 0;\n    const ws = () => { while (/[\\x20\\t\\n\\r]/.test(text[pos] || '\\u0000')) pos++; };\n    const string = () => {\n        const start = pos++;\n        while (pos \u003c text.length) {\n            if (text[pos] === '\\\\') { pos += 2; continue; }\n            if (text[pos++] === '\"') {\n                const value = JSON.parse(text.slice(start, pos));\n                if (!scalar(value)) throw Error('Malformed Unicode');\n                return value;\n            }\n        }\n        throw Error('Unterminated string');\n    };\n    function read(depth = 0) {\n        if (++nodes > 100000 || depth > 32) throw Error('Import complexity exceeds limit');\n        ws();\n        if (text[pos] === '\"') return string();\n        if (text[pos] === '[' || text[pos] === '{') {\n            const object = text[pos++] === '{', end = object ? '}' : ']';\n            const value = object ? Object.create(null) : [];\n            ws(); if (text[pos] === end) { pos++; return value; }\n            while (true) {\n                ws();\n                if (object) {\n                    if (text[pos] !== '\"') throw Error('Expected object key');\n                    const key = string(); ws();\n                    if (Object.hasOwn(value, key)) throw Error('Duplicate JSON key');\n                    if (text[pos++] !== ':') throw Error('Expected colon');\n                    value[key] = read(depth + 1);\n                } else value.push(read(depth + 1));\n                ws(); const next = text[pos++];\n                if (next === end) break;\n                if (next !== ',') throw Error('Expected comma');\n            }\n            return value;\n        }\n        for (const [token, value] of [['true', true], ['false', false], ['null', null]]) {\n            if (text.startsWith(token, pos)) { pos += token.length; return value; }\n        }\n        const match = /^-?(?:0|[1-9]\\d*)(?![\\d.eE+-])/.exec(text.slice(pos));\n        if (!match) throw Error('Expected integer JSON value');\n        pos += match[0].length; const value = Number(match[0]);\n        if (!Number.isSafeInteger(value) || Object.is(value, -0)) throw Error('Unsafe integer');\n        return value;\n    }\n    const value = read(); ws();\n    if (pos !== text.length) throw Error('Trailing JSON content');\n    canonical(value);\n    return value;\n}\nexport function validateRequest(request) {\n    const keys = ['schema_version', 'kind', 'request_id', 'mission', 'seed', 'max_candidates', 'formation_trials', 'max_events', 'language'];\n    if (!request || typeof request !== 'object' || Array.isArray(request) || !Object.hasOwn(request, 'request_id') || Object.keys(request).some(key => !keys.includes(key))) throw Error('Invalid versioned rehearsal request');\n    request = {schema_version: 1, kind: 'successor-rehearsal', mission: 'streaming-metrics-v1', seed: 42, max_candidates: 4, formation_trials: 2, max_events: 1000, language: 'en', ...request};\n    if (!exact(request, keys) || request.schema_version !== 1 || request.kind !== 'successor-rehearsal' || request.mission !== 'streaming-metrics-v1' || !/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/.test(request.request_id) || !integer(request.seed, 0, 4294967295) || !integer(request.max_candidates, 2, 12) || !integer(request.formation_trials, 1, 6) || !integer(request.max_events, 64, 20000) || !['en', 'fr'].includes(request.language)) throw Error('Invalid versioned rehearsal request');\n    return structuredClone(request);\n}\nexport function newRequest(options = {}) {\n    return validateRequest({schema_version: 1, kind: 'successor-rehearsal', request_id: crypto.randomUUID(), mission: 'streaming-metrics-v1', seed: 42, max_candidates: 4, formation_trials: 2, max_events: 1000, language: 'en', ...options});\n}\nfunction order(a, b) {\n    const aa = Array.from(a, c => c.codePointAt(0)), bb = Array.from(b, c => c.codePointAt(0));\n    for (let i = 0; i \u003c Math.min(aa.length, bb.length); i++) if (aa[i] !== bb[i]) return aa[i] - bb[i];\n    return aa.length - bb.length;\n}\nconst rowOrder = (a, b) => order(a.day, b.day) || order(a.service, b.service);\nexport function validateEvents(events) {\n    if (!Array.isArray(events) || events.length > 20000) throw Error('Event count exceeds mission bound');\n    for (const e of events) {\n        if (!exact(e, ['day', 'service', 'duration_us', 'ok']) || !scalar(e.day) || !scalar(e.service) || !integer(Array.from(e.day).length, 1, 64) || !integer(Array.from(e.service).length, 1, 64) || !integer(e.duration_us, 0, 1000000000) || typeof e.ok !== 'boolean') throw Error('Malformed aggregation event');\n    }\n}\nconst makeRow = e => ({day: e.day, service: e.service, count: 0, total_duration_us: 0, max_duration_us: 0, error_count: 0});\nfunction update(row, e, kind = 'builtin') {\n    row.count++; row.total_duration_us += e.duration_us; row.error_count += Number(!e.ok);\n    if (kind === 'builtin') row.max_duration_us = Math.max(row.max_duration_us, e.duration_us);\n    else if (e.duration_us > row.max_duration_us) row.max_duration_us = e.duration_us;\n}\nexport function current(events) {\n    validateEvents(events); const groups = new Map();\n    for (const e of events) {\n        const key = JSON.stringify([e.day, e.service]);\n        if (!groups.has(key)) groups.set(key, makeRow(e));\n        update(groups.get(key), e);\n    }\n    return [...groups.values()].sort(rowOrder);\n}\nexport function beta(events) {\n    validateEvents(events); const sorted = [...events].sort(rowOrder), rows = [];\n    for (const e of sorted) {\n        let row = rows[rows.length - 1];\n        if (!row || row.day !== e.day || row.service !== e.service) { row = makeRow(e); rows.push(row); }\n        row.count += 1; row.total_duration_us += e.duration_us;\n        row.error_count += e.ok ? 0 : 1;\n        row.max_duration_us = row.max_duration_us >= e.duration_us ? row.max_duration_us : e.duration_us;\n    }\n    return rows;\n}\nexport function validateCandidate(c) {\n    if (!exact(c, ['version', 'layout', 'cache_last', 'update']) || c.version !== 1 || !['nested', 'tuple'].includes(c.layout) || typeof c.cache_last !== 'boolean' || !['branch', 'builtin'].includes(c.update)) throw Error('Candidate is outside the fixed grammar');\n    return c;\n}\nexport function candidate(events, config) {\n    validateEvents(events); validateCandidate(config);\n    const groups = new Map(), rows = []; let last = null;\n    for (const e of events) {\n        let row;\n        if (config.cache_last && last && e.day === last.day && e.service === last.service) row = last;\n        else if (config.layout === 'nested') {\n            if (!groups.has(e.day)) groups.set(e.day, new Map());\n            const services = groups.get(e.day);\n            row = services.get(e.service);\n            if (!row) { row = makeRow(e); services.set(e.service, row); rows.push(row); }\n        } else {\n            const key = JSON.stringify([e.day, e.service]); row = groups.get(key);\n            if (!row) { row = makeRow(e); groups.set(key, row); rows.push(row); }\n        }\n        update(row, e, config.update); last = row;\n    }\n    return rows.sort(rowOrder);\n}\nexport function generateCandidates(seed, count) {\n    if (!integer(count, 2, 12)) throw Error('Candidate count outside bound');\n    const out = [];\n    // Eight complete compositions; repeated configuration is never represented as a new challenger.\n    for (let i = 0; i \u003c Math.min(count, 8); i++) {\n        const bits = (i + (seed % 8)) % 8;\n        out.push({version: 1, layout: bits & 1 ? 'nested' : 'tuple', cache_last: Boolean(bits & 2), update: bits & 4 ? 'branch' : 'builtin'});\n    }\n    return out;\n}\nexport function workload(seed, count, mode = 'mixed') {\n    let state = seed >>> 0;\n    const next = () => (state = (Math.imul(state, 1664525) + 1013904223) >>> 0);\n    const names = ['api', 'résumé', '東京', '🙂', '__proto__', '\\ue000', '𝄞'];\n    return Array.from({length: count}, (_, i) => ({day: 'day-' + (next() % (mode === 'high' ? 97 : 3)), service: mode === 'high' ? names[next() % names.length] + i : names[next() % names.length], duration_us: next() % 1000000001, ok: next() % 5 !== 0}));\n}\nconst pause = () => new Promise(resolve => setTimeout(resolve, 0));\nfunction measured(fn, events) {\n    const start = performance.now(); const result = fn(events);\n    return {elapsed_ns: Math.max(1, Math.round((performance.now() - start) * 1000000)), rows: result.length, result};\n}\nfunction correct(fn) {\n    const valid = [[], [{day: '🙂', service: '__proto__', duration_us: 1000000000, ok: false}], workload(12, 64, 'high'), workload(98, 120)];\n    if (!valid.every(events => canonical(fn(events)) === canonical(beta(events)))) return false;\n    const bad = [[{day: '', service: 'x', duration_us: 1, ok: true}], [{day: 'd', service: 'x', duration_us: true, ok: true}], [{day: 'd', service: 'x', duration_us: 1, ok: 'true'}], [{day: 'd', service: '\\ud800', duration_us: 1, ok: true}], [{day: 'd', service: 'x', duration_us: -1, ok: true}]];\n    return bad.every(events => { try { fn(events); return false; } catch { return true; } });\n}\nfunction abort(signal) { if (signal?.aborted) throw new DOMException('Cancelled', 'AbortError'); }\nexport async function discover(request, {signal, onProgress = () => {}, preferred = null} = {}) {\n    request = validateRequest(request); const configurations = generateCandidates(request.seed, request.max_candidates);\n    configurations.sort((a, b) => Number(b.layout === 'nested') - Number(a.layout === 'nested'));\n    if (preferred) { validateCandidate(preferred); configurations.sort((a, b) => Number(canonical(b) === canonical(preferred)) - Number(canonical(a) === canonical(preferred))); }\n    const events = workload(request.seed, request.max_events), attempts = [];\n    const world = {version: 1, prediction: 'nested map reduces tuple-key serialization', uncertainty: 'allocation and sorting may dominate', experiment: 'prioritize nested-map compositions, then test tuple-map alternatives within the same budget', selection_rule: 'minimum measured development elapsed_ns among correct candidates; not final proof'};\n    for (const config of configurations) {\n        abort(signal); await pause(); abort(signal);\n        const fn = values => candidate(values, config), pass = correct(fn), measurement = measured(fn, events);\n        const attempt = {config, construction: {operator: 'bounded-grammar-composition', seed: request.seed, parent: VERSION}, artifact_hash: await digest('candidate', config), correctness: pass, elapsed_ns: measurement.elapsed_ns, rows: measurement.rows};\n        attempts.push(attempt); onProgress(attempts.length, configurations.length);\n    }\n    const nested = attempts.filter(a => a.config.layout === 'nested'), tuples = attempts.filter(a => a.config.layout === 'tuple');\n    world.observation = {nested_mean_ns: Math.round(nested.reduce((sum, a) => sum + a.elapsed_ns, 0) / (nested.length || 1)), tuple_mean_ns: Math.round(tuples.reduce((sum, a) => sum + a.elapsed_ns, 0) / (tuples.length || 1)), interpretation: 'development observation only; confounded by composition and browser timing'};\n    world.falsified_in_this_run = world.observation.nested_mean_ns >= world.observation.tuple_mean_ns;\n    const feasible = attempts.filter(a => a.correctness).sort((a, b) => a.elapsed_ns - b.elapsed_ns);\n    if (!feasible.length) throw Error('No correct candidate; retain Current');\n    return {world, attempts, selected: feasible[0], generation_budget: request.max_candidates, actual_candidates: configurations.length, source: VERSION};\n}\nexport async function freeze(request, discovery, sourceHash) {\n    if (!/^[0-9a-f]{64}$/.test(sourceHash)) throw Error('Exact engine source digest required');\n    const manifest = {schema_version: 1, request_hash: await digest('request', validateRequest(request)), grammar: discovery.selected.config, candidate_hash: discovery.selected.artifact_hash, engine: VERSION, engine_source_hash: sourceHash, comparators: ['current-one-pass-map-v1', 'beta-sorted-reduction-v1'], protocol: 'browser-local-aggregation-v1', correctness_required: true, minimum_speedup_ppm: 50000, costs: {money: null, review: null, memory: null}, authority: []};\n    return {manifest, release_hash: await digest('release', manifest)};\n}\nexport async function evaluate(request, frozen, {signal} = {}) {\n    request = validateRequest(request);\n    if (frozen.manifest.request_hash !== await digest('request', request) || frozen.release_hash !== await digest('release', frozen.manifest)) throw Error('Frozen release or request changed');\n    if (frozen.manifest.candidate_hash !== await digest('candidate', frozen.manifest.grammar) || frozen.manifest.protocol !== 'browser-local-aggregation-v1' || frozen.manifest.minimum_speedup_ppm !== 50000 || frozen.manifest.correctness_required !== true || canonical(frozen.manifest.comparators) !== canonical(['current-one-pass-map-v1', 'beta-sorted-reduction-v1'])) throw Error('Candidate or protocol binding mismatch');\n    const config = validateCandidate(frozen.manifest.grammar), fn = e => candidate(e, config), cases = [];\n    const correctness = correct(fn);\n    for (let i = 0; i \u003c 6; i++) {\n        abort(signal); await pause(); abort(signal);\n        const events = workload((request.seed + 100003 + i * 907) >>> 0, i \u003c 2 ? 64 : request.max_events, i % 2 ? 'high' : 'mixed');\n        const samples = [measured(current, events), measured(beta, events), measured(fn, events)];\n        const exact_output = canonical(samples[0].result) === canonical(samples[1].result) && canonical(samples[1].result) === canonical(samples[2].result);\n        cases.push({case_index: i, events: events.length, current_ns: samples[0].elapsed_ns, beta_ns: samples[1].elapsed_ns, candidate_ns: samples[2].elapsed_ns, exact_output});\n    }\n    const totals = {current: 0, beta: 0, candidate: 0};\n    for (const c of cases) { totals.current += c.current_ns; totals.beta += c.beta_ns; totals.candidate += c.candidate_ns; }\n    const best_comparator = totals.current \u003c= totals.beta ? 'current' : 'beta';\n    const hard_gate = correctness && cases.every(c => c.exact_output);\n    return {schema_version: 1, scope: 'browser-rehearsal', release_hash: frozen.release_hash, cases, correctness: hard_gate, totals_ns: totals, best_comparator, local_verdict: !hard_gate ? 'FAIL' : totals.candidate >= totals[best_comparator] ? (best_comparator === 'beta' ? 'RETAIN_ALTERNATIVE' : 'RETAIN_INCUMBENT') : totals.candidate / totals[best_comparator] > 0.95 ? 'INSUFFICIENT_MARGIN' : 'LOCAL_SPEEDUP_OBSERVED', institutional_verdict: 'HOLD', missing: ['independent-verifier', 'frontier-comparator', 'measured-peak-memory', 'accepted-realized-economics', 'principal-issued-authority'], authority: [], timing_limitations: 'Single browser process; timer resolution, order, JIT and device load confound timings. Descriptive measurements only.'};\n}\nexport async function renew(request, discovery, {signal, onProgress = () => {}, engineSourceHash = null} = {}) {\n    request = validateRequest(request);\n    const trials = [];\n    for (let i = 0; i \u003c request.formation_trials; i++) {\n        abort(signal);\n        const next = {...request, seed: (request.seed + 200003 + i * 997) >>> 0};\n        const control = await discover(next, {signal}), treatment = await discover(next, {signal, preferred: discovery.selected.config});\n        const controlFreeze = await freeze(next, control, engineSourceHash), treatmentFreeze = await freeze(next, treatment, engineSourceHash);\n        const controlEvaluation = await evaluate(next, controlFreeze, {signal}), treatmentEvaluation = await evaluate(next, treatmentFreeze, {signal});\n        trials.push({trial: i, seed: next.seed, control_attempts: control.attempts.length, treatment_attempts: treatment.attempts.length, control, treatment, control_release: controlFreeze, treatment_release: treatmentFreeze, control_evaluation: controlEvaluation, treatment_evaluation: treatmentEvaluation});\n        onProgress(i + 1, request.formation_trials);\n    }\n    return {generation: 2, active_proof: [], authority: [], memory: {permitted: ['configuration-order-hint'], excluded: ['final-cases', 'proof', 'grants']}, primary_metric: 'construction_attempts', interpretation: 'Descriptive matched trials; equal construction counts do not establish compounding.', trials};\n}\n// Canonical encoding and low-order rejection supplement WebCrypto verification.\n// Mathematical torsion encodings: @noble/curves 1.2.0 src/ed25519.ts ED25519_TORSION_SUBGROUP.\nconst lowOrderY = new Set([\n    '0000000000000000000000000000000000000000000000000000000000000000',\n    '0100000000000000000000000000000000000000000000000000000000000000',\n    'ecffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f',\n    '26e8958fc2b227b045c3f489f2ef98f0d5dfac05d3c63339b13802886d53fc05',\n    'c7176a703d4dd84fba3c0b760d10670f2a2053fa2c39ccc64ec7fd7792ac037a',\n]);\nconst littleEndian = bytes => BigInt('0x' + [...bytes].reverse().map(v => v.toString(16).padStart(2, '0')).join(''));\nfunction validatePointEncoding(bytes) {\n    const y = bytes.slice(); y[31] &= 0x7f;\n    const hex = [...y].map(v => v.toString(16).padStart(2, '0')).join('');\n    if (littleEndian(y) >= (1n \u003c\u003c 255n) - 19n || lowOrderY.has(hex)) throw Error('Non-canonical or low-order Ed25519 point');\n}\nfunction validateSignatureEncoding(key, signature) {\n    validatePointEncoding(key); validatePointEncoding(signature.slice(0, 32));\n    if (littleEndian(signature.slice(32)) >= (1n \u003c\u003c 252n) + 27742317777372353535851937790883648493n) throw Error('Non-canonical Ed25519 scalar');\n}\nexport async function verifyNative(request, envelope) {\n    request = validateRequest(request);\n    if (!exact(envelope, ['schema_version', 'kind', 'request_hash', 'evidence', 'evidence_hash', 'scope', 'signature']) || envelope.schema_version !== 1 || envelope.kind !== 'successor-result' || envelope.scope !== 'local-native-rehearsal') throw Error('Unsupported native evidence envelope');\n    if (envelope.request_hash !== await digest('request', request)) throw Error('Native result belongs to a different request');\n    if (!envelope.evidence || envelope.evidence.scope !== envelope.scope || envelope.evidence.request_hash !== envelope.request_hash || !exact(envelope.evidence.request, Object.keys(request)) || canonical(envelope.evidence.request) !== canonical(request)) throw Error('Authenticated evidence request or scope mismatch');\n    if (envelope.evidence_hash !== await digest('evidence', envelope.evidence)) throw Error('Native evidence digest mismatch');\n    if (envelope.signature !== null) {\n        const signature = envelope.signature;\n        if (!exact(signature, ['public_key', 'signature']) || !/^[0-9a-f]{64}$/.test(signature.public_key) || !/^[A-Za-z0-9+/]{86}==$/.test(signature.signature)) throw Error('Malformed native signature');\n        const publicBytes = Uint8Array.from(signature.public_key.match(/../g), x => parseInt(x, 16));\n        const bytes = Uint8Array.from(atob(signature.signature), c => c.charCodeAt(0));\n        validateSignatureEncoding(publicBytes, bytes);\n        const key = await crypto.subtle.importKey('raw', publicBytes, {name: 'Ed25519'}, false, ['verify']);\n        const data = Uint8Array.from(envelope.evidence_hash.match(/../g), x => parseInt(x, 16));\n        if (!await crypto.subtle.verify('Ed25519', key, bytes, data)) throw Error('Invalid native signature');\n    }\n    return {scope: envelope.scope, integrity: 'request-and-evidence-digests-match', authenticity: 'unverified', authority: [], evidence: envelope.evidence};\n}\n","examples/build-successor/model.mjs":"// SPDX-License-Identifier: Apache-2.0\nimport * as alpha from '../../docs/assets/successor/engine.mjs';\nimport { compileJobs } from './vendor/agijobs/compiler.mjs';\nimport { JOB_TEMPLATES, createPortfolioJobs } from './vendor/agijobs/templates.mjs';\nimport { digestObject } from './vendor/agijobs/integrity.mjs';\n\nexport const TOKEN = '0xA61a3B3a130a9c20768EEBF97E21515A6046a1fA';\nexport const DELIVERABLES = [\n  'mission.json: count, sum, maximum duration and error count by day and service; zero incorrect totals.',\n  'incumbent.json: exact outputs and observed timings for the existing one-pass Map implementation.',\n  'alternatives.json: compare the deterministic sort-and-reduce baseline; record that a frontier comparison is missing.',\n  'rights.json: synthetic nonpersonal events only; list code licenses and permitted reuse.',\n  'gym.json: version the event generator, malformed-input cases, public partitions and zero-error gate.',\n  'teacher.json: disclose that this example uses fixed code and no external model or teaching calls.',\n  'failures.json: test empty data, invalid numbers, malformed Unicode and unusual service keys.',\n  'candidates.json: preserve all four bounded aggregation configurations and rejected attempts.',\n  'experience.json: record seeds, workload sizes and generator version; no protected claims.',\n  'candidate.json: freeze the selected grammar and engine SHA-256 before comparative evaluation.',\n  'tools.json: allow only the fixed aggregation engine; no arbitrary code, browsing or money movement.',\n  'verifier.json: reproduce exact outputs and reject invalid inputs; identify missing independent custody.',\n  'security.json: confirm no external requests, keys, personal data or wallet approvals are required.',\n  'economics.json: record all observed costs; mark compute price, human review and maintenance unmeasured.',\n  'roles.json: separate producer, verifier, acceptance owner and admitter; labels are unauthenticated.',\n  'rollback.json: retain the baseline and demonstrate clearing the active candidate without external effects.',\n  'evaluation.json: compare the frozen candidate with both baselines on six further public workloads.',\n  'review.json: obtain a separately attributable review; this browser leaves independent proof absent.',\n  'acceptance.json: require evidence against the frozen terms; all work orders remain DRAFT here.',\n  'authority.json: retain HOLD with zero grants until separate, scoped, expiring, revocable admission.',\n  'renewal.json: propose the next test and preserve lessons; a successor inherits no proof or authority.',\n];\nexport const FRENCH_TITLES = [\n  'Constitution de mission', 'Référence actuelle', 'Ensemble des alternatives', 'Droits et données',\n  'Environnement d’entraînement et protocole comparatif', 'Étude des oracles et des enseignants',\n  'Classification des échecs', 'Comparaison des architectures', 'Formation des données et de l’expérience',\n  'Formation du modèle spécialisé', 'Outils et recherche documentaire', 'Construction du vérificateur',\n  'Sécurité et confidentialité', 'Économie complète', 'Charge humaine et pouvoir de décision',\n  'Résilience et retour arrière', 'Évaluation protégée sur données nouvelles', 'Validation indépendante',\n  'Acceptation responsable', 'Chronique et admission de l’autorité', 'Capacité financée et requalification',\n];\nexport const FRENCH_DELIVERABLES = [\n  'mission.json : compter les événements, les erreurs, la durée totale et maximale par jour et service; aucun total incorrect.',\n  'incumbent.json : conserver les sorties exactes et les durées de la référence Map en un seul passage.',\n  'alternatives.json : comparer la référence déterministe par tri et réduction; signaler l’absence de comparaison avec les meilleures IA.',\n  'rights.json : utiliser uniquement des événements fictifs non personnels; préciser les licences et réutilisations permises.',\n  'gym.json : versionner le générateur, les entrées mal formées, les jeux publics et le seuil de zéro erreur.',\n  'teacher.json : déclarer le code fixe utilisé et l’absence de modèle externe ou d’appel d’enseignement.',\n  'failures.json : tester les données vides, nombres invalides, caractères Unicode mal formés et clés de service inhabituelles.',\n  'candidates.json : conserver les quatre configurations délimitées et les tentatives rejetées.',\n  'experience.json : noter les graines aléatoires, tailles de jeux et version du générateur; aucune preuve protégée.',\n  'candidate.json : figer la grammaire retenue et l’empreinte SHA-256 du moteur avant la comparaison.',\n  'tools.json : autoriser uniquement le moteur fixe; aucun code arbitraire, navigation ou mouvement de fonds.',\n  'verifier.json : reproduire les sorties exactes et rejeter les entrées invalides; signaler l’absence de garde indépendante.',\n  'security.json : vérifier l’absence de requêtes externes, clés, données personnelles et autorisations de portefeuille.',\n  'economics.json : noter les coûts observés; laisser le prix du calcul, la revue humaine et la maintenance non mesurés.',\n  'roles.json : distinguer producteur, vérificateur, responsable de l’acceptation et décideur d’admission; identités non authentifiées.',\n  'rollback.json : garder la référence et démontrer l’abandon du candidat actif sans effet externe.',\n  'evaluation.json : comparer le candidat figé aux deux références sur six nouveaux jeux publics.',\n  'review.json : obtenir une revue attribuable séparément; aucune preuve indépendante n’est créée dans le navigateur.',\n  'acceptance.json : exiger des preuves conformes aux termes figés; toutes les tâches restent des brouillons DRAFT.',\n  'authority.json : maintenir HOLD et zéro autorisation jusqu’à une admission distincte, limitée, temporaire et révocable.',\n  'renewal.json : proposer le prochain test et garder les enseignements; aucun héritage automatique de preuve ou d’autorité.',\n];\n\nexport function missionFor({ name = 'Atlas Ω', budget = '2100', now = new Date().toISOString() } = {}) {\n  if (typeof name !== 'string' || !name.trim() || name.length > 48) throw Error('Use a name of 1–48 characters.');\n  if (typeof budget !== 'string' || !/^[1-9][0-9]{0,6}$/.test(budget) || BigInt(budget) > 1000000n) {\n    throw Error('Use a whole planning allowance from 1 to 1,000,000 AGIALPHA.');\n  }\n  if (!Number.isFinite(Date.parse(now))) throw Error('A valid clock is required.');\n  const expiresAt = new Date(Date.parse(now) + 7 * 86400000).toISOString();\n  return {\n    schemaVersion: '1.0.0', kind: 'MissionConstitution', missionId: 'streaming-metrics-builder-v1',\n    institutionId: 'local-successor-workshop', version: '1', title: name.trim().normalize('NFC'),\n    principal: 'example-human-principal', beneficiary: 'Owner of this local synthetic mission',\n    objective: 'Produce exact daily service metrics, compare bounded implementations, and prepare reviewable work orders.',\n    incumbent: { id: 'alpha-current', version: alpha.VERSION, description: 'Measured one-pass Map baseline.' },\n    alternatives: [{ id: 'alpha-beta', version: alpha.VERSION, description: 'Measured deterministic sort-and-reduce baseline; not a frontier AI comparator.' }],\n    rights: [{ sourceId: 'synthetic-events', license: 'Apache-2.0 generator; synthetic nonpersonal outputs', dataClass: 'synthetic', permittedUses: ['mission-evaluation', 'fixture-export'], expiresAt }],\n    hardGates: [\n      { id: 'exact-output', description: 'All grouped counts and durations agree exactly.', maxViolations: 0 },\n      { id: 'invalid-input', description: 'Malformed and unsupported records are rejected.', maxViolations: 0 },\n      { id: 'no-external-effect', description: 'No network request, live job, payment or authority grant.', maxViolations: 0 },\n    ],\n    criticalFunctions: JOB_TEMPLATES.map(t => t.coverageKey),\n    roles: { producer: 'example-producer', verifier: 'example-verifier', acceptor: 'example-acceptor', admitter: 'example-admitter' },\n    budget: { unit: 'AGIALPHA', limitBaseUnits: (BigInt(budget) * 10n ** 18n).toString(), maxDurationMs: 60000, maxRetries: 0, maxJobs: 21 },\n    expiresAt,\n    authorityCeiling: { level: 'A0', permittedActions: ['inspect-local'], prohibitedActions: ['send-payment', 'post-live-job', 'access-private-data', 'self-admit'], externalEffects: false },\n    allowedTools: ['fixed-aggregation-engine'], allowedActions: ['inspect-local'],\n    rollback: { target: 'alpha-current', available: true, reason: 'Discard the local candidate and return to the retained fixed baseline.' },\n    proofProtocol: { id: 'public-local-rehearsal', version: '1', mode: 'SYNTHETIC_REHEARSAL', formationOwner: 'example-producer', custodian: 'example-verifier', requiredIndependence: 'I0', minimumMargin: 0.05, criticalErrorCeiling: 0, scope: 'Public synthetic cases in one process; no independent proof, mission alpha or operational admission.' },\n  };\n}\n\nexport async function compilePlan(options = {}) {\n  const mission = missionFor(options);\n  const jobs = createPortfolioJobs(mission).map((job, i) => ({\n    ...job,\n    objective: `${job.objective} Streaming-metrics deliverable: ${DELIVERABLES[i]}`,\n    acceptance: { ...job.acceptance, predicate: `${DELIVERABLES[i]} Preserve failures and missing evidence. Separate review is required.` },\n  }));\n  const dependencies = [[], [0], [0], [0], [1, 2, 3], [4], [4], [1, 2, 5, 6], [3, 4], [7, 8], [9], [4, 6, 10], [10, 11], [1, 2, 9], [0, 13], [10, 12], [9, 11, 12, 13, 14, 15], [16], [17], [18], [19]];\n  const edges = dependencies.flatMap((parents, i) => parents.map(j => ({ from: jobs[j].jobId, to: jobs[i].jobId, kind: 'evidence' })));\n  for (const edge of edges) jobs.find(job => job.jobId === edge.to).authorizedInputs.push(edge.from);\n  return compileJobs(mission, { jobs, edges, now: options.now });\n}\n\nexport async function buildPack(options = {}, { signal, onProgress = () => {} } = {}) {\n  const now = options.now || new Date().toISOString();\n  const request = alpha.newRequest({ max_events: options.events ?? 1000, seed: options.seed ?? 42, max_candidates: 4, language: options.language ?? 'en' });\n  if (!/^[0-9a-f]{64}$/.test(options.engineSourceHash || '')) throw Error('Engine source identity is required.');\n  onProgress('compile');\n  const compilation = await compilePlan({ ...options, now });\n  if (signal?.aborted) throw new DOMException('Cancelled', 'AbortError');\n  onProgress('discover');\n  const discovery = await alpha.discover(request, { signal });\n  const frozen = await alpha.freeze(request, discovery, options.engineSourceHash);\n  onProgress('evaluate');\n  const evaluation = await alpha.evaluate(request, frozen, { signal });\n  const record = {\n    schema: 'successor-build-example/v1', createdAt: now, title: compilation.constitution.title,\n    scope: 'LOCAL_REHEARSAL', request, compilation, discovery, frozen, evaluation,\n    token: { symbol: 'AGIALPHA', chainId: 1, address: TOKEN, decimals: 18 },\n    settlement: { status: 'NOT_CONNECTED', transactions: [], spentBaseUnits: '0', allowanceIs: 'ILLUSTRATIVE_NOT_FUNDED' },\n    admission: { decision: 'HOLD', independentProof: false, authority: [], specialistASI: false },\n    chronicle: [{ kind: 'local-observation', candidateRelease: frozen.release_hash, reusable: 'Configuration hypothesis only; rerun tests.', inheritedProof: false, inheritedAuthority: false }],\n  };\n  return { ...record, integrityDigest: await digestObject('successor-build-example.v1', record) };\n}\n\nexport function jobBriefs(pack) {\n  if(pack.request.language==='fr')return `# ${pack.title} — Fiches de construction SUCCESSOR Ω\\n\\nRÉPÉTITION LOCALE. Brouillons DRAFT, empreintes non signées, zéro dépense.\\nPreuve indépendante absente. Admission HOLD. Aucune autorité accordée.\\n\\nJeton commun sur Ethereum mainnet : ${TOKEN} (AGIALPHA, 18 décimales).\\nBudget de planification seulement; frais, mises et gaz à estimer séparément.\\n\\n` +\n    pack.compilation.graph.nodes.map((job,i)=>`## ${i+1}. ${FRENCH_TITLES[i]}\\n\\n${FRENCH_DELIVERABLES[i]}\\n\\nTermes canoniques du compilateur (anglais) : ${job.objective}\\n\\nCritère d’acceptation canonique (anglais) : ${job.acceptance.predicate}\\n\\nLimite de planification (unités de base AGIALPHA) : ${job.budget.limitBaseUnits}\\nExpiration : ${job.expiresAt}\\nProducteur : ${job.actor}\\nVérificateur : ${job.verifier.identity}\\nResponsable de l’acceptation : ${job.acceptance.owner}\\nRetour arrière : ${job.rollback.target}\\nEmpreinte non signée : ${job.digest}\\n`).join('\\n') +\n    '\\nSuite : organiser une évaluation protégée indépendante, mesurer tous les coûts, mettre en service l’intégration puis demander une décision humaine d’admission distincte. Le jeton commun ne relie pas automatiquement les marchés.\\n';\n  return `# ${pack.title} — SUCCESSOR Ω build briefs\\n\\nLOCAL REHEARSAL. DRAFT work, unsigned commitments, zero funds spent.\\nIndependent proof absent. Admission HOLD. No authority is granted.\\n\\nShared Ethereum mainnet token: ${TOKEN} (AGIALPHA, 18 decimals).\\nPlanning allowance only; fees, stakes and gas require separate estimates before commissioning.\\n\\n` +\n    pack.compilation.graph.nodes.map((job, i) => `## ${i + 1}. ${JOB_TEMPLATES[i].title}\\n\\n${job.objective}\\n\\nAcceptance: ${job.acceptance.predicate}\\n\\nPlanning limit (AGIALPHA base units): ${job.budget.limitBaseUnits}\\nExpiry: ${job.expiresAt}\\nProducer: ${job.actor}\\nVerifier: ${job.verifier.identity}\\nAcceptance owner: ${job.acceptance.owner}\\nRollback: ${job.rollback.target}\\nUnsigned commitment: ${job.digest}\\n`).join('\\n') +\n    '\\nNext: arrange independent protected evaluation, measure full costs, resolve commissioning, then request a separate human admission decision. Sharing the token does not bridge the two markets.\\n';\n}\n","examples/build-successor/vendor/agijobs/compiler.mjs":"import {\n  SCHEMA_VERSION,\n  SuccessorError,\n  requireCondition,\n  validateMission,\n  validateWorkOrder,\n  validateGraph,\n  transitionJob,\n} from './domain.mjs';\nimport { cloneJson, digestObject } from './integrity.mjs';\nimport { createPortfolioJobs } from './templates.mjs';\n\nconst EXECUTION_EDGES = new Set(['evidence', 'control', 'challenge']);\nexport function workOrderPayload(input) {\n  const job = validateWorkOrder(input);\n  const { digest, sealed, signatureStatus, state, ...immutable } = job;\n  return immutable;\n}\nexport async function sealWorkOrder(input) {\n  const job = validateWorkOrder(input);\n  requireCondition(\n    job.state === 'DRAFT',\n    'SEAL_STATE_FORBIDDEN',\n    'Only a draft may be sealed; material changes require a new draft version'\n  );\n  return {\n    ...job,\n    sealed: true,\n    signatureStatus: 'UNSIGNED_COMMITMENT',\n    digest: await digestObject(\n      'successor.work-order.v1',\n      workOrderPayload(job)\n    ),\n  };\n}\nexport async function verifyWorkOrderSeal(input) {\n  const job = validateWorkOrder(input);\n  return (\n    job.sealed === true &&\n    job.digest ===\n      (await digestObject('successor.work-order.v1', workOrderPayload(job)))\n  );\n}\nexport async function transitionSealedJob(current, event, trustedContext = {}) {\n  requireCondition(\n    await verifyWorkOrderSeal(current),\n    'JOB_SEAL_INVALID',\n    'The immutable work-order seal is invalid'\n  );\n  return transitionJob(current, event, { ...trustedContext, sealValid: true });\n}\nfunction topologicalOrder(nodes, edges) {\n  const indegree = new Map(nodes.map((node) => [node.jobId, 0]));\n  const outgoing = new Map(nodes.map((node) => [node.jobId, []]));\n  for (const edge of edges.filter((edge) => EXECUTION_EDGES.has(edge.kind))) {\n    outgoing.get(edge.from).push(edge.to);\n    indegree.set(edge.to, indegree.get(edge.to) + 1);\n  }\n  const queue = [...indegree]\n    .filter(([, count]) => count === 0)\n    .map(([key]) => key)\n    .sort();\n  const order = [];\n  const depth = new Map(nodes.map((node) => [node.jobId, 1]));\n  while (queue.length) {\n    const key = queue.shift();\n    order.push(key);\n    for (const target of outgoing.get(key)) {\n      depth.set(target, Math.max(depth.get(target), depth.get(key) + 1));\n      indegree.set(target, indegree.get(target) - 1);\n      if (!indegree.get(target)) {\n        queue.push(target);\n        queue.sort();\n      }\n    }\n  }\n  requireCondition(\n    order.length === nodes.length,\n    'GRAPH_CYCLE',\n    'Execution, acceptance and challenge dependencies must be acyclic; use bounded version-producing discovery loops'\n  );\n  requireCondition(\n    Math.max(...depth.values()) \u003c= 64,\n    'GRAPH_DEPTH_EXCEEDED',\n    'Graph exceeds the supported execution depth'\n  );\n  return order;\n}\n\nexport async function compileJobs(\n  input,\n  { jobs: proposedJobs, edges = [], now = new Date().toISOString() } = {}\n) {\n  const mission = validateMission(input);\n  const instant = Date.parse(now);\n  requireCondition(\n    Number.isFinite(instant),\n    'CLOCK_INVALID',\n    'A valid compiler clock is required'\n  );\n  requireCondition(\n    instant \u003c Date.parse(mission.expiresAt),\n    'MISSION_EXPIRED',\n    'The mission constitution has expired'\n  );\n  requireCondition(\n    new Set([\n      mission.roles.producer,\n      mission.roles.verifier,\n      mission.roles.admitter,\n    ]).size === 3,\n    'ROLE_CONFLICT',\n    'Producer, verifier and admitter must have distinct identities'\n  );\n  requireCondition(\n    mission.roles.producer !== mission.roles.acceptor,\n    'ROLE_CONFLICT',\n    'A producer cannot accept its own delivered work'\n  );\n  requireCondition(\n    mission.proofProtocol.formationOwner !== mission.proofProtocol.custodian,\n    'PROOF_CUSTODY_CONFLICT',\n    'Formation and protected proof custody must be separately attributed'\n  );\n  requireCondition(\n    mission.rollback.available,\n    'ROLLBACK_UNAVAILABLE',\n    'An available rollback or containment route is required'\n  );\n  if (mission.proofProtocol.mode === 'INDEPENDENT_REQUEST')\n    requireCondition(\n      ['I3', 'I4'].includes(mission.proofProtocol.requiredIndependence),\n      'INDEPENDENCE_INSUFFICIENT',\n      'An independently proven request requires I3 or I4 custody; internal rehearsal remains available'\n    );\n  for (const action of mission.allowedActions)\n    requireCondition(\n      !mission.authorityCeiling.prohibitedActions.includes(action),\n      'ACTION_PROHIBITED',\n      'A permitted formation action conflicts with a prohibition',\n      { action }\n    );\n  requireCondition(\n    proposedJobs === undefined || Array.isArray(proposedJobs),\n    'SCHEMA_INVALID',\n    'Jobs must be a bounded array'\n  );\n  const jobs = (proposedJobs ?? createPortfolioJobs(mission)).map(\n    validateWorkOrder\n  );\n  requireCondition(\n    jobs.length \u003c= mission.budget.maxJobs,\n    'JOB_LIMIT_EXCEEDED',\n    'The graph exceeds its authorized work count'\n  );\n  const graph = validateGraph({\n    schemaVersion: SCHEMA_VERSION,\n    kind: 'JobGraph',\n    graphId: `${mission.missionId}:graph`,\n    missionId: mission.missionId,\n    version: mission.version,\n    nodes: jobs,\n    edges,\n    authorityCreated: 'NONE',\n  });\n  const ids = new Set(jobs.map((job) => job.jobId));\n  const rights = new Map(\n    mission.rights.map((right) => [right.sourceId, right])\n  );\n  const edgeKeys = new Set();\n  for (const edge of graph.edges) {\n    requireCondition(\n      ids.has(edge.from) && ids.has(edge.to),\n      'REFERENCE_UNRESOLVED',\n      'A graph edge references an unknown job',\n      edge\n    );\n    requireCondition(\n      edge.from !== edge.to,\n      'GRAPH_CYCLE',\n      'Self-dependent jobs are not admissible',\n      edge\n    );\n    const key = `${edge.from}|${edge.to}|${edge.kind}`;\n    requireCondition(\n      !edgeKeys.has(key),\n      'EDGE_DUPLICATE',\n      'Duplicate graph edge',\n      edge\n    );\n    edgeKeys.add(key);\n  }\n  const executionOrder = topologicalOrder(jobs, graph.edges);\n  let reservation = 0n;\n  for (const job of jobs) {\n    requireCondition(\n      job.missionId === mission.missionId &&\n        job.principal === mission.principal,\n      'MISSION_BINDING_MISMATCH',\n      'Job mission and accountable principal must match the constitution',\n      { jobId: job.jobId }\n    );\n    requireCondition(\n      job.state === 'DRAFT',\n      'COMPILER_REQUIRES_DRAFT',\n      'Compilation cannot grant or replay an existing job lifecycle state'\n    );\n    requireCondition(\n      job.actor !== job.verifier.identity &&\n        job.actor !== mission.roles.admitter,\n      'ROLE_CONFLICT',\n      'A producer cannot verify its own work or hold admission identity',\n      { jobId: job.jobId }\n    );\n    requireCondition(\n      job.actor !== job.acceptance.owner,\n      'ROLE_CONFLICT',\n      'A producing actor cannot accept its own delivered work',\n      { jobId: job.jobId }\n    );\n    requireCondition(\n      job.verifier.identity === mission.roles.verifier,\n      'VERIFIER_UNAUTHORIZED',\n      'Job verifier must be the constituted verifier identity',\n      { jobId: job.jobId }\n    );\n    requireCondition(\n      job.acceptance.owner === mission.roles.acceptor,\n      'ACCEPTANCE_OWNER_MISMATCH',\n      'Acceptance must belong to the constituted owner',\n      { jobId: job.jobId }\n    );\n    requireCondition(\n      job.rollback.available,\n      'ROLLBACK_UNAVAILABLE',\n      'Job has no available rollback or containment route',\n      { jobId: job.jobId }\n    );\n    requireCondition(\n      Date.parse(job.expiresAt) > instant &&\n        Date.parse(job.expiresAt) \u003c= Date.parse(mission.expiresAt),\n      'JOB_EXPIRED',\n      'Job expiry must be current and within the mission expiry',\n      { jobId: job.jobId }\n    );\n    requireCondition(\n      job.budget.unit === mission.budget.unit,\n      'BUDGET_UNIT_MISMATCH',\n      'Job and mission budget units differ',\n      { jobId: job.jobId }\n    );\n    requireCondition(\n      job.budget.maxRetries \u003c= mission.budget.maxRetries &&\n        job.budget.maxDurationMs \u003c= mission.budget.maxDurationMs,\n      'BUDGET_LIMIT_EXCEEDED',\n      'Job resource limits exceed the mission ceiling',\n      { jobId: job.jobId }\n    );\n    reservation += BigInt(job.budget.limitBaseUnits);\n    for (const tool of job.permittedTools)\n      requireCondition(\n        mission.allowedTools.includes(tool),\n        'TOOL_UNSUPPORTED',\n        'The mission has not admitted this tool',\n        { jobId: job.jobId, tool }\n      );\n    for (const action of job.permittedActions)\n      requireCondition(\n        mission.allowedActions.includes(action) &&\n          !job.prohibitedActions.includes(action) &&\n          !mission.authorityCeiling.prohibitedActions.includes(action),\n        'ACTION_PROHIBITED',\n        'Action is not within the mission capability mask',\n        { jobId: job.jobId, action }\n      );\n    for (const prohibited of mission.authorityCeiling.prohibitedActions)\n      requireCondition(\n        job.prohibitedActions.includes(prohibited),\n        'PROHIBITION_WEAKENED',\n        'Job removes a constitutional prohibition',\n        { jobId: job.jobId, prohibited }\n      );\n    for (const source of job.authorizedInputs) {\n      if (rights.has(source)) {\n        const right = rights.get(source);\n        requireCondition(\n          Date.parse(right.expiresAt) > instant &&\n            Date.parse(right.expiresAt) >= Date.parse(job.expiresAt),\n          'RIGHTS_EXPIRED',\n          'Source rights do not cover the job duration',\n          { jobId: job.jobId, source }\n        );\n        requireCondition(\n          right.permittedUses.includes('mission-evaluation'),\n          'RIGHTS_SCOPE_MISMATCH',\n          'Source does not permit mission evaluation',\n          { jobId: job.jobId, source }\n        );\n      } else {\n        requireCondition(\n          ids.has(source) &&\n            graph.edges.some(\n              (edge) =>\n                edge.from === source &&\n                edge.to === job.jobId &&\n                edge.kind === 'evidence'\n            ),\n          'EVIDENCE_PATH_MISSING',\n          'Every derived input requires an upstream evidence edge',\n          { jobId: job.jobId, source }\n        );\n      }\n    }\n    for (const source of job.acceptance.evidenceSources)\n      requireCondition(\n        job.authorizedInputs.includes(source),\n        'ACCEPTANCE_EVIDENCE_UNAVAILABLE',\n        'Acceptance cannot depend on an unauthorized or producer-only source',\n        { jobId: job.jobId, source }\n      );\n  }\n  requireCondition(\n    reservation \u003c= BigInt(mission.budget.limitBaseUnits),\n    'BUDGET_EXCEEDED',\n    'Aggregate cumulative job budgets exceed the mission budget',\n    {\n      reservedBaseUnits: reservation.toString(),\n      limitBaseUnits: mission.budget.limitBaseUnits,\n    }\n  );\n  const coverage = mission.criticalFunctions.map((functionId) => ({\n    functionId,\n    jobIds: jobs\n      .filter((job) => job.covers.includes(functionId))\n      .map((job) => job.jobId),\n    status: 'PLANNED_NOT_ACCEPTED',\n  }));\n  for (const obligation of coverage)\n    requireCondition(\n      obligation.jobIds.length > 0,\n      'CRITICAL_COVERAGE_MISSING',\n      'A non-negotiable mission function has no job path',\n      { functionId: obligation.functionId }\n    );\n  const sealedJobs = await Promise.all(jobs.map(sealWorkOrder));\n  const sealedGraph = { ...graph, nodes: sealedJobs };\n  sealedGraph.digest = await digestObject(\n    'successor.job-graph.v1',\n    sealedGraph\n  );\n  const dependencyMap = Object.fromEntries(\n    jobs.map((job) => [\n      job.jobId,\n      graph.edges\n        .filter(\n          (edge) => edge.to === job.jobId && EXECUTION_EDGES.has(edge.kind)\n        )\n        .map((edge) => ({ jobId: edge.from, kind: edge.kind })),\n    ])\n  );\n  const invalidationMap = Object.fromEntries(\n    [...rights.keys(), ...ids].map((key) => [\n      key,\n      jobs\n        .filter((job) => job.authorizedInputs.includes(key))\n        .map((job) => job.jobId),\n    ])\n  );\n  for (const edge of graph.edges.filter((edge) =>\n    ['evidence', 'invalidation', 'challenge', 'control'].includes(edge.kind)\n  ))\n    if (!invalidationMap[edge.from].includes(edge.to))\n      invalidationMap[edge.from].push(edge.to);\n  return {\n    schemaVersion: SCHEMA_VERSION,\n    status: 'SEALED',\n    mode: mission.proofProtocol.mode,\n    constitution: mission,\n    graph: sealedGraph,\n    executionOrder,\n    coverage,\n    criticalEvidenceCuts: coverage.map(({ functionId, jobIds }) => ({\n      functionId,\n      removeJobIds: jobIds,\n      exhaustive: false,\n    })),\n    budgetReservations: {\n      unit: mission.budget.unit,\n      reservedBaseUnits: reservation.toString(),\n      limitBaseUnits: mission.budget.limitBaseUnits,\n      includesRetries: true,\n    },\n    dependencyMap,\n    invalidationMap,\n    capabilityRequests: jobs.map((job) => ({\n      jobId: job.jobId,\n      actor: job.actor,\n      tools: job.permittedTools,\n      actions: job.permittedActions,\n      status: 'REQUESTED_NOT_GRANTED',\n    })),\n    evaluationPlan: cloneJson(mission.proofProtocol),\n    authorityCreated: 'NONE',\n    signatureStatus: 'UNSIGNED_COMMITMENT',\n    digest: await digestObject('successor.constitution.v1', mission),\n  };\n}\n\nexport function invalidationClosure(compilation, sourceIds) {\n  const pending = [...sourceIds];\n  const seen = new Set();\n  while (pending.length) {\n    const source = pending.shift();\n    if (seen.has(source)) continue;\n    seen.add(source);\n    pending.push(...(compilation.invalidationMap[source] ?? []));\n  }\n  return [...seen].sort();\n}\n\nexport async function diagnoseMission(mission, options) {\n  try {\n    return await compileJobs(mission, options);\n  } catch (error) {\n    if (!(error instanceof SuccessorError)) throw error;\n    return {\n      status: 'REJECTED',\n      diagnostics: [error.toJSON()],\n      authorityCreated: 'NONE',\n    };\n  }\n}\n","examples/build-successor/vendor/agijobs/domain.mjs":"import { canonicalize, cloneJson } from './integrity.mjs';\n\nexport const SCHEMA_VERSION = '1.0.0';\nexport const JOB_FAMILIES = Object.freeze([\n  'constitution',\n  'evidence',\n  'formation',\n  'challenge',\n  'verification',\n  'admission',\n  'renewal',\n]);\nexport const EDGE_KINDS = Object.freeze([\n  'evidence',\n  'control',\n  'challenge',\n  'rollback',\n  'invalidation',\n]);\nexport const JOB_STATES = Object.freeze([\n  'DRAFT',\n  'UNDERWRITTEN',\n  'AUTHORIZED',\n  'EXECUTING',\n  'VERIFIED',\n  'ACCEPTED',\n  'CHRONICLE_ELIGIBLE',\n  'REFUSED',\n  'FAILED',\n  'TIMED_OUT',\n  'REPAIR_REQUIRED',\n  'ROLLED_BACK',\n]);\nexport class SuccessorError extends Error {\n  constructor(code, message, { details = {}, retryable = false } = {}) {\n    super(message);\n    this.name = 'SuccessorError';\n    this.code = code;\n    this.details = details;\n    this.retryable = retryable;\n  }\n  toJSON() {\n    return {\n      code: this.code,\n      message: this.message,\n      details: this.details,\n      retryable: this.retryable,\n    };\n  }\n}\nexport function requireCondition(condition, code, message, details = {}) {\n  if (!condition) throw new SuccessorError(code, message, { details });\n}\nconst fail = (path, message) => {\n  throw new SuccessorError('SCHEMA_INVALID', `${path}: ${message}`, {\n    details: { path },\n  });\n};\nfunction object(value, keys, required, path) {\n  if (!value || typeof value !== 'object' || Array.isArray(value))\n    fail(path, 'expected object');\n  for (const key of Object.keys(value))\n    if (!keys.includes(key)) fail(`${path}.${key}`, 'unknown field');\n  for (const key of required)\n    if (!Object.hasOwn(value, key)) fail(`${path}.${key}`, 'required field');\n}\nconst text = (value, path) => {\n  if (typeof value !== 'string' || !value.trim() || value.length > 16000)\n    fail(path, 'expected nonempty bounded string');\n};\nconst id = (value, path) => {\n  text(value, path);\n  if (!/^[A-Za-z0-9][A-Za-z0-9._:/-]{0,159}$/.test(value))\n    fail(path, 'invalid identifier');\n};\nconst list = (value, path, check = text, minimum = 0, maximum = 256) => {\n  if (!Array.isArray(value) || value.length \u003c minimum || value.length > maximum)\n    fail(path, 'invalid list size');\n  value.forEach((entry, i) => check(entry, `${path}[${i}]`));\n};\nconst integer = (value, path, min = 0, max = 1000000000) => {\n  if (!Number.isSafeInteger(value) || value \u003c min || value > max)\n    fail(path, 'expected bounded integer');\n};\nconst date = (value, path) => {\n  if (\n    typeof value !== 'string' ||\n    !/^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(\\.\\d{3})?Z$/.test(value) ||\n    !Number.isFinite(Date.parse(value))\n  )\n    fail(path, 'expected UTC ISO timestamp');\n  const normalized = new Date(value).toISOString();\n  if (value !== normalized && value !== normalized.replace('.000Z', 'Z'))\n    fail(path, 'invalid calendar timestamp');\n};\nconst choice = (value, values, path) => {\n  if (!values.includes(value))\n    fail(path, `expected one of ${values.join(', ')}`);\n};\nconst unique = (values, path) => {\n  if (new Set(values).size !== values.length) fail(path, 'duplicate values');\n};\nconst bool = (value, path) => {\n  if (typeof value !== 'boolean') fail(path, 'expected boolean');\n};\nfunction json(value) {\n  try {\n    canonicalize(value);\n  } catch (error) {\n    throw new SuccessorError('SCHEMA_INVALID', error.message);\n  }\n}\nexport function validateBudget(value, path = 'budget', mission = false) {\n  const fields = [\n    'unit',\n    'limitBaseUnits',\n    'maxDurationMs',\n    'maxRetries',\n    ...(mission ? ['maxJobs'] : []),\n  ];\n  object(value, fields, fields, path);\n  id(value.unit, `${path}.unit`);\n  if (\n    typeof value.limitBaseUnits !== 'string' ||\n    !/^(0|[1-9][0-9]{0,29})$/.test(value.limitBaseUnits)\n  )\n    fail(\n      `${path}.limitBaseUnits`,\n      'expected canonical unsigned integer string'\n    );\n  integer(value.maxDurationMs, `${path}.maxDurationMs`, 1, 86400000);\n  integer(value.maxRetries, `${path}.maxRetries`, 0, 100);\n  if (mission) integer(value.maxJobs, `${path}.maxJobs`, 1, 256);\n}\nfunction rollback(value, path) {\n  object(\n    value,\n    ['target', 'available', 'reason'],\n    ['target', 'available', 'reason'],\n    path\n  );\n  id(value.target, `${path}.target`);\n  bool(value.available, `${path}.available`);\n  text(value.reason, `${path}.reason`);\n}\nfunction reference(value, path) {\n  object(\n    value,\n    ['id', 'version', 'description'],\n    ['id', 'version', 'description'],\n    path\n  );\n  id(value.id, `${path}.id`);\n  id(value.version, `${path}.version`);\n  text(value.description, `${path}.description`);\n}\nexport function validateMission(input) {\n  json(input);\n  const fields = [\n    'schemaVersion',\n    'kind',\n    'missionId',\n    'institutionId',\n    'version',\n    'title',\n    'principal',\n    'beneficiary',\n    'objective',\n    'incumbent',\n    'alternatives',\n    'rights',\n    'hardGates',\n    'criticalFunctions',\n    'roles',\n    'budget',\n    'expiresAt',\n    'authorityCeiling',\n    'allowedTools',\n    'allowedActions',\n    'rollback',\n    'proofProtocol',\n  ];\n  object(input, fields, fields, 'mission');\n  requireCondition(\n    input.schemaVersion === SCHEMA_VERSION,\n    'SCHEMA_VERSION_UNSUPPORTED',\n    'Unsupported mission schema version'\n  );\n  choice(input.kind, ['MissionConstitution'], 'mission.kind');\n  for (const key of ['missionId', 'institutionId', 'version', 'principal'])\n    id(input[key], `mission.${key}`);\n  for (const key of ['title', 'beneficiary', 'objective'])\n    text(input[key], `mission.${key}`);\n  reference(input.incumbent, 'mission.incumbent');\n  list(input.alternatives, 'mission.alternatives', reference, 1, 32);\n  unique(\n    input.alternatives.map((alternative) => alternative.id),\n    'mission.alternatives'\n  );\n  list(\n    input.rights,\n    'mission.rights',\n    (right, path) => {\n      object(\n        right,\n        ['sourceId', 'license', 'dataClass', 'permittedUses', 'expiresAt'],\n        ['sourceId', 'license', 'dataClass', 'permittedUses', 'expiresAt'],\n        path\n      );\n      id(right.sourceId, `${path}.sourceId`);\n      text(right.license, `${path}.license`);\n      choice(\n        right.dataClass,\n        ['synthetic', 'public-licensed-nonpersonal'],\n        `${path}.dataClass`\n      );\n      list(right.permittedUses, `${path}.permittedUses`, id, 1, 20);\n      date(right.expiresAt, `${path}.expiresAt`);\n    },\n    1,\n    256\n  );\n  unique(\n    input.rights.map((right) => right.sourceId),\n    'mission.rights'\n  );\n  list(\n    input.hardGates,\n    'mission.hardGates',\n    (gate, path) => {\n      object(\n        gate,\n        ['id', 'description', 'maxViolations'],\n        ['id', 'description', 'maxViolations'],\n        path\n      );\n      id(gate.id, `${path}.id`);\n      text(gate.description, `${path}.description`);\n      integer(gate.maxViolations, `${path}.maxViolations`, 0, 100);\n    },\n    1,\n    64\n  );\n  unique(\n    input.hardGates.map((gate) => gate.id),\n    'mission.hardGates'\n  );\n  list(input.criticalFunctions, 'mission.criticalFunctions', id, 1, 64);\n  unique(input.criticalFunctions, 'mission.criticalFunctions');\n  object(\n    input.roles,\n    ['producer', 'verifier', 'acceptor', 'admitter'],\n    ['producer', 'verifier', 'acceptor', 'admitter'],\n    'mission.roles'\n  );\n  for (const [key, value] of Object.entries(input.roles))\n    id(value, `mission.roles.${key}`);\n  validateBudget(input.budget, 'mission.budget', true);\n  date(input.expiresAt, 'mission.expiresAt');\n  object(\n    input.authorityCeiling,\n    ['level', 'permittedActions', 'prohibitedActions', 'externalEffects'],\n    ['level', 'permittedActions', 'prohibitedActions', 'externalEffects'],\n    'mission.authorityCeiling'\n  );\n  choice(\n    input.authorityCeiling.level,\n    ['A0', 'A1', 'A2', 'A3', 'A4'],\n    'mission.authorityCeiling.level'\n  );\n  list(\n    input.authorityCeiling.permittedActions,\n    'mission.authorityCeiling.permittedActions',\n    id,\n    1\n  );\n  list(\n    input.authorityCeiling.prohibitedActions,\n    'mission.authorityCeiling.prohibitedActions',\n    id,\n    1\n  );\n  bool(\n    input.authorityCeiling.externalEffects,\n    'mission.authorityCeiling.externalEffects'\n  );\n  list(input.allowedTools, 'mission.allowedTools', id, 1);\n  list(input.allowedActions, 'mission.allowedActions', id, 1);\n  rollback(input.rollback, 'mission.rollback');\n  object(\n    input.proofProtocol,\n    [\n      'id',\n      'version',\n      'mode',\n      'formationOwner',\n      'custodian',\n      'requiredIndependence',\n      'minimumMargin',\n      'criticalErrorCeiling',\n      'scope',\n    ],\n    [\n      'id',\n      'version',\n      'mode',\n      'formationOwner',\n      'custodian',\n      'requiredIndependence',\n      'minimumMargin',\n      'criticalErrorCeiling',\n      'scope',\n    ],\n    'mission.proofProtocol'\n  );\n  for (const key of ['id', 'version', 'formationOwner', 'custodian'])\n    id(input.proofProtocol[key], `mission.proofProtocol.${key}`);\n  choice(\n    input.proofProtocol.mode,\n    ['SYNTHETIC_REHEARSAL', 'INDEPENDENT_REQUEST'],\n    'mission.proofProtocol.mode'\n  );\n  choice(\n    input.proofProtocol.requiredIndependence,\n    ['I0', 'I1', 'I2', 'I3', 'I4'],\n    'mission.proofProtocol.requiredIndependence'\n  );\n  if (\n    !Number.isFinite(input.proofProtocol.minimumMargin) ||\n    input.proofProtocol.minimumMargin \u003c 0\n  )\n    fail('mission.proofProtocol.minimumMargin', 'expected nonnegative number');\n  integer(\n    input.proofProtocol.criticalErrorCeiling,\n    'mission.proofProtocol.criticalErrorCeiling',\n    0,\n    100\n  );\n  text(input.proofProtocol.scope, 'mission.proofProtocol.scope');\n  return cloneJson(input);\n}\n\nexport function validateWorkOrder(input) {\n  json(input);\n  const required = [\n    'schemaVersion',\n    'kind',\n    'jobId',\n    'missionId',\n    'version',\n    'family',\n    'objective',\n    'principal',\n    'actor',\n    'authorizedInputs',\n    'evidenceObligation',\n    'permittedTools',\n    'permittedActions',\n    'prohibitedActions',\n    'budget',\n    'expiresAt',\n    'outputSchema',\n    'verifier',\n    'acceptance',\n    'rollback',\n    'chronicle',\n    'covers',\n    'state',\n  ];\n  object(\n    input,\n    [...required, 'digest', 'sealed', 'signatureStatus'],\n    required,\n    'job'\n  );\n  requireCondition(\n    input.schemaVersion === SCHEMA_VERSION,\n    'SCHEMA_VERSION_UNSUPPORTED',\n    'Unsupported work-order schema version'\n  );\n  choice(input.kind, ['SealedWorkOrder'], 'job.kind');\n  for (const key of ['jobId', 'missionId', 'version', 'principal', 'actor'])\n    id(input[key], `job.${key}`);\n  choice(input.family, JOB_FAMILIES, 'job.family');\n  choice(input.state, JOB_STATES, 'job.state');\n  text(input.objective, 'job.objective');\n  for (const key of [\n    'authorizedInputs',\n    'evidenceObligation',\n    'permittedTools',\n    'permittedActions',\n    'prohibitedActions',\n    'covers',\n  ]) {\n    list(input[key], `job.${key}`, id, key === 'covers' ? 0 : 1);\n    unique(input[key], `job.${key}`);\n  }\n  validateBudget(input.budget, 'job.budget');\n  date(input.expiresAt, 'job.expiresAt');\n  object(\n    input.outputSchema,\n    ['type', 'required'],\n    ['type', 'required'],\n    'job.outputSchema'\n  );\n  choice(input.outputSchema.type, ['object'], 'job.outputSchema.type');\n  list(input.outputSchema.required, 'job.outputSchema.required', id, 1);\n  object(\n    input.verifier,\n    ['identity', 'method', 'independence'],\n    ['identity', 'method', 'independence'],\n    'job.verifier'\n  );\n  id(input.verifier.identity, 'job.verifier.identity');\n  text(input.verifier.method, 'job.verifier.method');\n  choice(\n    input.verifier.independence,\n    ['I0', 'I1', 'I2', 'I3', 'I4'],\n    'job.verifier.independence'\n  );\n  object(\n    input.acceptance,\n    ['owner', 'predicate', 'evidenceSources'],\n    ['owner', 'predicate', 'evidenceSources'],\n    'job.acceptance'\n  );\n  id(input.acceptance.owner, 'job.acceptance.owner');\n  text(input.acceptance.predicate, 'job.acceptance.predicate');\n  list(\n    input.acceptance.evidenceSources,\n    'job.acceptance.evidenceSources',\n    id,\n    1\n  );\n  rollback(input.rollback, 'job.rollback');\n  object(\n    input.chronicle,\n    ['eligible', 'rights', 'scope', 'expiresAt'],\n    ['eligible', 'rights', 'scope', 'expiresAt'],\n    'job.chronicle'\n  );\n  bool(input.chronicle.eligible, 'job.chronicle.eligible');\n  text(input.chronicle.rights, 'job.chronicle.rights');\n  text(input.chronicle.scope, 'job.chronicle.scope');\n  date(input.chronicle.expiresAt, 'job.chronicle.expiresAt');\n  if ('sealed' in input) bool(input.sealed, 'job.sealed');\n  if ('digest' in input && !/^sha256:[a-f0-9]{64}$/.test(input.digest))\n    fail('job.digest', 'expected SHA-256 digest');\n  if ('signatureStatus' in input)\n    choice(\n      input.signatureStatus,\n      ['UNSIGNED_COMMITMENT', 'FIXTURE_SIGNED', 'AUTHORIZED_SIGNATURE'],\n      'job.signatureStatus'\n    );\n  return cloneJson(input);\n}\n\nexport function validateGraph(input) {\n  json(input);\n  object(\n    input,\n    [\n      'schemaVersion',\n      'kind',\n      'graphId',\n      'missionId',\n      'version',\n      'nodes',\n      'edges',\n      'authorityCreated',\n      'digest',\n    ],\n    [\n      'schemaVersion',\n      'kind',\n      'graphId',\n      'missionId',\n      'version',\n      'nodes',\n      'edges',\n      'authorityCreated',\n    ],\n    'graph'\n  );\n  requireCondition(\n    input.schemaVersion === SCHEMA_VERSION,\n    'SCHEMA_VERSION_UNSUPPORTED',\n    'Unsupported graph schema version'\n  );\n  choice(input.kind, ['JobGraph'], 'graph.kind');\n  for (const key of ['graphId', 'missionId', 'version'])\n    id(input[key], `graph.${key}`);\n  list(input.nodes, 'graph.nodes', validateWorkOrder, 1, 256);\n  unique(\n    input.nodes.map((node) => node.jobId),\n    'graph.nodes'\n  );\n  list(\n    input.edges,\n    'graph.edges',\n    (edge, path) => {\n      object(edge, ['from', 'to', 'kind'], ['from', 'to', 'kind'], path);\n      id(edge.from, `${path}.from`);\n      id(edge.to, `${path}.to`);\n      choice(edge.kind, EDGE_KINDS, `${path}.kind`);\n    },\n    0,\n    2048\n  );\n  choice(input.authorityCreated, ['NONE'], 'graph.authorityCreated');\n  return cloneJson(input);\n}\n\nconst FORWARD = {\n  DRAFT: 'UNDERWRITTEN',\n  UNDERWRITTEN: 'AUTHORIZED',\n  AUTHORIZED: 'EXECUTING',\n  EXECUTING: 'VERIFIED',\n  VERIFIED: 'ACCEPTED',\n  ACCEPTED: 'CHRONICLE_ELIGIBLE',\n};\n// Pure reducer: context must originate in a trusted runtime, never request JSON.\nexport function transitionJob(current, event, context = {}) {\n  const job = validateWorkOrder(current);\n  json(event);\n  object(\n    event,\n    [\n      'eventId',\n      'expectedState',\n      'to',\n      'actor',\n      'timestamp',\n      'evidence',\n      'reason',\n    ],\n    [\n      'eventId',\n      'expectedState',\n      'to',\n      'actor',\n      'timestamp',\n      'evidence',\n      'reason',\n    ],\n    'event'\n  );\n  id(event.eventId, 'event.eventId');\n  id(event.actor, 'event.actor');\n  date(event.timestamp, 'event.timestamp');\n  text(event.reason, 'event.reason');\n  list(event.evidence, 'event.evidence', id, 1);\n  requireCondition(\n    event.expectedState === job.state,\n    'STATE_CONFLICT',\n    'The job changed; reload before retrying'\n  );\n  const exceptional = [\n    'REFUSED',\n    'FAILED',\n    'TIMED_OUT',\n    'REPAIR_REQUIRED',\n    'ROLLED_BACK',\n  ];\n  requireCondition(\n    FORWARD[job.state] === event.to ||\n      (exceptional.includes(event.to) &&\n        !['CHRONICLE_ELIGIBLE', ...exceptional].includes(job.state)),\n    'TRANSITION_FORBIDDEN',\n    'This job transition is not permitted'\n  );\n  const owner =\n    event.to === 'VERIFIED'\n      ? job.verifier.identity\n      : ['ACCEPTED', 'CHRONICLE_ELIGIBLE'].includes(event.to)\n      ? job.acceptance.owner\n      : event.to === 'EXECUTING'\n      ? job.actor\n      : job.principal;\n  requireCondition(\n    event.actor === owner,\n    'ROLE_CONFLICT',\n    'The actor cannot authorize this transition'\n  );\n  if (['AUTHORIZED', 'EXECUTING'].includes(event.to)) {\n    requireCondition(\n      job.sealed === true && !!job.digest,\n      'JOB_UNSEALED',\n      'Seal the exact work order before authorization'\n    );\n    requireCondition(\n      context.sealValid === true,\n      'JOB_SEAL_UNVERIFIED',\n      'The runtime must cryptographically verify the immutable work-order seal'\n    );\n    requireCondition(\n      Date.parse(event.timestamp) \u003c Date.parse(job.expiresAt),\n      'JOB_EXPIRED',\n      'The work order has expired'\n    );\n    requireCondition(\n      context.preconditionsValid === true,\n      'PRECONDITION_UNAVAILABLE',\n      'Rights, dependencies and budget must be validated by the runtime'\n    );\n  }\n  if (event.to === 'VERIFIED')\n    requireCondition(\n      context.verifierVerdict === 'PASS' && context.receiptValid === true,\n      'VERIFICATION_REQUIRED',\n      'A valid receipt and passing independent verdict are required'\n    );\n  if (event.to === 'ACCEPTED')\n    requireCondition(\n      context.acceptanceSatisfied === true,\n      'ACCEPTANCE_CRITERIA_UNMET',\n      'The runtime must verify the frozen deliverable acceptance predicate'\n    );\n  if (event.to === 'CHRONICLE_ELIGIBLE')\n    requireCondition(\n      job.chronicle.eligible && context.rightsCurrent === true,\n      'CHRONICLE_INELIGIBLE',\n      'Current reuse rights are required'\n    );\n  return { ...job, state: event.to };\n}\n","examples/build-successor/vendor/agijobs/integrity.mjs":"const FORBIDDEN_KEYS = new Set(['__proto__', 'prototype', 'constructor']);\n\n/** Deterministic JSON encoding. Ambiguous or non-JSON values are refused. */\nexport function canonicalize(value) {\n  const active = new Set();\n  let count = 0;\n  const encode = (item, depth) => {\n    if (++count > 100000 || depth > 64)\n      throw new TypeError('JSON_LIMIT_EXCEEDED');\n    if (item === null) return 'null';\n    if (typeof item === 'string') {\n      if (\n        item !== item.normalize('NFC') ||\n        /[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?\u003c![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/u.test(\n          item\n        )\n      )\n        throw new TypeError('NON_CANONICAL_UNICODE');\n      return JSON.stringify(item);\n    }\n    if (typeof item === 'boolean') return item ? 'true' : 'false';\n    if (typeof item === 'number') {\n      if (\n        !Number.isFinite(item) ||\n        Object.is(item, -0) ||\n        (Number.isInteger(item) && !Number.isSafeInteger(item))\n      )\n        throw new TypeError('UNSAFE_NUMBER');\n      return JSON.stringify(item);\n    }\n    if (typeof item !== 'object' || active.has(item))\n      throw new TypeError('NON_JSON_VALUE');\n    const proto = Object.getPrototypeOf(item);\n    if (\n      (Array.isArray(item) && proto !== Array.prototype) ||\n      (!Array.isArray(item) && proto !== Object.prototype && proto !== null)\n    )\n      throw new TypeError('NON_JSON_OBJECT');\n    active.add(item);\n    let encoded;\n    if (Object.getOwnPropertySymbols(item).length)\n      throw new TypeError('NON_JSON_SYMBOL');\n    if (Array.isArray(item)) {\n      const names = Object.getOwnPropertyNames(item);\n      if (\n        names.length !== item.length + 1 ||\n        Object.keys(item).length !== item.length\n      )\n        throw new TypeError('SPARSE_OR_EXTENDED_ARRAY');\n      for (let index = 0; index \u003c item.length; index += 1) {\n        const descriptor = Object.getOwnPropertyDescriptor(item, String(index));\n        if (\n          !descriptor ||\n          descriptor.get ||\n          descriptor.set ||\n          !descriptor.enumerable\n        )\n          throw new TypeError('ACCESSOR_OR_SPARSE_ARRAY');\n      }\n      encoded = `[${Array.prototype.map\n        .call(item, (part) => encode(part, depth + 1))\n        .join(',')}]`;\n    } else {\n      const keys = Object.keys(item).sort();\n      for (const key of keys) {\n        if (FORBIDDEN_KEYS.has(key) || key !== key.normalize('NFC'))\n          throw new TypeError('UNSAFE_OBJECT_KEY');\n        if (\n          Object.getOwnPropertyDescriptor(item, key)?.get ||\n          Object.getOwnPropertyDescriptor(item, key)?.set\n        )\n          throw new TypeError('ACCESSOR_NOT_ALLOWED');\n      }\n      encoded = `{${keys\n        .map(\n          (key) => `${encode(key, depth + 1)}:${encode(item[key], depth + 1)}`\n        )\n        .join(',')}}`;\n    }\n    active.delete(item);\n    return encoded;\n  };\n  return encode(value, 0);\n}\n\nexport async function digestBytes(value) {\n  const bytes =\n    typeof value === 'string' ? new TextEncoder().encode(value) : value;\n  if (!(bytes instanceof Uint8Array)) throw new TypeError('BYTES_REQUIRED');\n  if (!globalThis.crypto?.subtle) throw new Error('WEBCRYPTO_UNAVAILABLE');\n  const digest = new Uint8Array(\n    await globalThis.crypto.subtle.digest('SHA-256', bytes)\n  );\n  return `sha256:${Array.from(digest, (byte) =>\n    byte.toString(16).padStart(2, '0')\n  ).join('')}`;\n}\n\nexport async function digestObject(domain, object) {\n  if (\n    typeof domain !== 'string' ||\n    !/^[a-zA-Z0-9][a-zA-Z0-9._:/-]{0,127}$/.test(domain)\n  )\n    throw new TypeError('INVALID_HASH_DOMAIN');\n  return digestBytes(\n    canonicalize({ hashFormat: 'successor-canonical-json-v1', domain, object })\n  );\n}\n\nexport function cloneJson(value) {\n  return JSON.parse(canonicalize(value));\n}\n","examples/build-successor/vendor/agijobs/templates.mjs":"import { SCHEMA_VERSION, validateMission } from './domain.mjs';\n\nexport const JOB_TEMPLATES = Object.freeze(\n  [\n    [\n      'mission-constitution',\n      'constitution',\n      'Mission Constitution',\n      'Freeze objective, beneficiary, accountable principal, hard constraints and prohibitions.',\n    ],\n    [\n      'incumbent-baseline',\n      'evidence',\n      'Incumbent Baseline',\n      'Measure accepted quality, complete cost, risk, time, human burden and authority.',\n    ],\n    [\n      'alternative-set',\n      'constitution',\n      'Alternative Set',\n      'Document the strongest credible frontier, specialist, human, hybrid, software and no-action alternatives.',\n    ],\n    [\n      'rights-data',\n      'constitution',\n      'Rights and Data Constitution',\n      'Establish source provenance, licenses, retention, exclusions and permitted reuse.',\n    ],\n    [\n      'mission-gym',\n      'formation',\n      'Mission Gym and Benchmark Constitution',\n      'Specify states, observations, actions, transitions, rewards, constraints, partitions, verifier and basis risk; freeze representative distribution, protected custody, critical failures and thresholds.',\n    ],\n    [\n      'oracle-teacher',\n      'evidence',\n      'Oracle and Teacher Study',\n      'Declare external teaching signals, hidden-call prohibition and transfer hypothesis.',\n    ],\n    [\n      'failure-taxonomy',\n      'challenge',\n      'Failure Taxonomy',\n      'Classify errors, severity, causes, abstention, adversarial cases and stop conditions.',\n    ],\n    [\n      'architecture-frontier',\n      'formation',\n      'Architecture Frontier',\n      'Form diverse complete candidates and retain non-dominated reserve options.',\n    ],\n    [\n      'experience-formation',\n      'formation',\n      'Data and Experience Formation',\n      'Build rights-cleared examples and simulation experience with explicit quality controls.',\n    ],\n    [\n      'specialist-formation',\n      'formation',\n      'Specialist Model Formation',\n      'Construct or adapt candidate components with exact immutable release identities.',\n    ],\n    [\n      'tools-retrieval',\n      'formation',\n      'Tool and Retrieval Formation',\n      'Build bounded deterministic checks, retrieval, planners, sandboxes and interfaces.',\n    ],\n    [\n      'verifier-formation',\n      'verification',\n      'Verifier Formation',\n      'Calibrate independent evaluation, replay, attacks, hidden ground truth and scoring.',\n    ],\n    [\n      'security-privacy',\n      'verification',\n      'Security and Privacy Proof',\n      'Test credential controls, isolation, threat model, incidents and provider risks.',\n    ],\n    [\n      'complete-economics',\n      'evidence',\n      'Complete Economics',\n      'Count construction, operation, human rescue, maintenance, requalification and unwind.',\n    ],\n    [\n      'human-agency',\n      'constitution',\n      'Human Burden and Agency',\n      'Define reviewer capacity, escalation, contestability and accountable decision rights.',\n    ],\n    [\n      'resilience-rollback',\n      'verification',\n      'Resilience and Rollback',\n      'Prove graceful degradation, kill switch, portability and known-good restoration.',\n    ],\n    [\n      'fresh-evaluation',\n      'verification',\n      'Protected Fresh Evaluation',\n      'Evaluate one frozen challenger on unseen representative work with full intervention costs.',\n    ],\n    [\n      'independent-validation',\n      'verification',\n      'Independent Validation',\n      'Independently examine evidence, limitations, critical errors, basis risk and fit for stated purpose.',\n    ],\n    [\n      'accountable-acceptance',\n      'admission',\n      'Accountable Acceptance',\n      'Record the attributable purpose-specific acceptance decision separately from independent validation and authority admission.',\n    ],\n    [\n      'chronicle-authority',\n      'admission',\n      'Chronicle and Authority Admission',\n      'Record separate knowledge and authority decisions, scope, expiry, monitoring and revocation.',\n    ],\n    [\n      'capital-requalification',\n      'renewal',\n      'Capital-to-Capacity and Requalification',\n      'Allocate verified available value and define next-successor and fresh-transfer triggers.',\n    ],\n  ].map(([id, family, title, objective]) =>\n    Object.freeze({ id, family, title, objective, coverageKey: id })\n  )\n);\n\nexport function createPortfolioJobs(input) {\n  const mission = validateMission(input);\n  return JOB_TEMPLATES.map((template) => ({\n    schemaVersion: SCHEMA_VERSION,\n    kind: 'SealedWorkOrder',\n    jobId: `${mission.missionId}:${template.id}`,\n    missionId: mission.missionId,\n    version: '1',\n    family: template.family,\n    objective: template.objective,\n    principal: mission.principal,\n    actor: mission.roles.producer,\n    authorizedInputs: mission.rights.map((right) => right.sourceId),\n    evidenceObligation: ['source-lineage', 'complete-cost', 'failure-record'],\n    permittedTools: [...mission.allowedTools],\n    permittedActions: [...mission.allowedActions],\n    prohibitedActions: [...mission.authorityCeiling.prohibitedActions],\n    budget: {\n      unit: mission.budget.unit,\n      limitBaseUnits: (BigInt(mission.budget.limitBaseUnits) / 21n).toString(),\n      maxDurationMs: mission.budget.maxDurationMs,\n      maxRetries: mission.budget.maxRetries,\n    },\n    expiresAt: mission.expiresAt,\n    outputSchema: {\n      type: 'object',\n      required: ['evidence', 'findings', 'cost'],\n    },\n    verifier: {\n      identity: mission.roles.verifier,\n      method:\n        'Independent examination against frozen purpose-specific criteria; template is not executed proof.',\n      independence: 'I0',\n    },\n    acceptance: {\n      owner: mission.roles.acceptor,\n      predicate: `All ${template.title} obligations have valid traceable evidence and no failed hard gate.`,\n      evidenceSources: mission.rights.map((right) => right.sourceId),\n    },\n    rollback: { ...mission.rollback },\n    chronicle: {\n      eligible: false,\n      rights: 'Requires a separate rights and admission review.',\n      scope: mission.objective,\n      expiresAt: mission.expiresAt,\n    },\n    covers: mission.criticalFunctions.includes(template.coverageKey)\n      ? [template.coverageKey]\n      : [],\n    state: 'DRAFT',\n  }));\n}\n","examples/successor-discoverability/execution.mjs":"// SPDX-License-Identifier: Apache-2.0\nimport { executeProgram, validateProblem, snapshot } from './compiler.mjs';\nimport { acquireSynthetic } from './domains.mjs';\nimport { createDiscoverabilityWorkbench, discoverabilityMission } from './workbench-adapter.mjs';\nimport { canonical, parseBounded, digest } from '../../docs/assets/successor/engine.mjs';\n\nconst capture = value => parseBounded(canonical(value));\nconst checkSource = sourceHash => {\n  if (!/^[a-f0-9]{64}$/.test(sourceHash || '')) throw Error('SOURCE_IDENTITY_REQUIRED');\n};\nconst asMicros = (start, end) => {\n  const value = Math.max(0, Math.round((end - start) * 1000));\n  if (!Number.isSafeInteger(value)) throw Error('TIMING_RANGE');\n  return value;\n};\n\nexport async function executeObservations(workbenchPack, observations, {\n  clock = () => globalThis.performance.now(),\n} = {}) {\n  const started = clock(), pack = capture(snapshot(workbenchPack)), retained = capture(snapshot(observations));\n  await createDiscoverabilityWorkbench().inspectPack(pack);\n  const sourceHash = pack.frozen.sourceHash, workbenchPackDigest = pack.integrityDigest;\n  checkSource(sourceHash);\n  const construction = pack.result.evidence.construction;\n  if (construction.status !== 'COMPILED') throw Error('COMPILED_PROGRAM_REQUIRED');\n  const problem = pack.spec.inputs.problem, program = construction.program;\n  const result = executeProgram(problem, program, retained);\n  const body = {\n    schema: 'discoverability.execution.v1', sourceHash, workbenchPackDigest,\n    programDigest: await digest('discoverability-program', program),\n    observations: retained, result,\n    decodingElapsedMicroseconds: asMicros(started, clock()),\n    acceptedCapability: false, independentlyAuthenticated: false,\n    authority: [], settlement: 'NOT_CONNECTED',\n  };\n  return { ...body, integrityDigest: await digest('discoverability-execution', body) };\n}\n\nexport async function runSyntheticJourney(problem, evaluator, {\n  sourceHash, compiler, budget = 2000000, signal,\n  onCheckpoint = async () => {}, clock = () => globalThis.performance.now(),\n} = {}) {\n  checkSource(sourceHash);\n  problem = validateProblem(problem);\n  evaluator = snapshot(evaluator);\n  const evaluatorKeys = Object.keys(evaluator).sort();\n  if (evaluatorKeys.some(key => !['worldId', 'nuisanceScale', 'errorSign'].includes(key)) ||\n      typeof evaluator.worldId !== 'string') throw Error('EVALUATOR_INPUT');\n  if (evaluator.nuisanceScale !== undefined && (!Number.isSafeInteger(evaluator.nuisanceScale) || Math.abs(evaluator.nuisanceScale) > 10000)) throw Error('EVALUATOR_NUISANCE');\n  if (evaluator.errorSign !== undefined && ![-1, 0, 1].includes(evaluator.errorSign)) throw Error('EVALUATOR_ERROR');\n  const checkpoint = async phase => {\n    await onCheckpoint(phase);\n    if (signal?.aborted) throw Error('CANCELLED');\n  };\n  await checkpoint('compile');\n  const runtime = createDiscoverabilityWorkbench(compiler ? { compiler } : {});\n  const start = clock();\n  const pack = await runtime.run(discoverabilityMission(problem, { budget }), {\n    sourceHash, signal, onCheckpoint, clock,\n  });\n  const compilationElapsedMicroseconds = asMicros(start, clock());\n  const construction = pack.result.evidence.construction;\n  if (construction.status !== 'COMPILED') {\n    return {\n      schema: 'discoverability.synthetic-journey.v1',\n      mode: 'NEWLY_EXECUTED_SYNTHETIC', pack, execution: null, evaluator: null,\n      operationalState: 'CONSTRUCTION_REFUSED',\n      costs: { compilerWorkUnits: construction.work.used, compilationElapsedMicroseconds,\n        acquisitionDeclaredUnits: 0, physicalAcquisitionCost: null, computeCost: null, humanMinutes: null },\n      acceptedCapability: false, authority: [], settlement: 'NOT_CONNECTED',\n    };\n  }\n  await checkpoint('acquire new synthetic readings');\n  const started = clock();\n  const acquisition = acquireSynthetic(problem, construction.program, evaluator.worldId, {\n    nuisanceScale: evaluator.nuisanceScale ?? 13, errorSign: evaluator.errorSign ?? 0,\n  });\n  const acquisitionElapsedMicroseconds = asMicros(started, clock());\n  await checkpoint('decode observations');\n  const execution = await executeObservations(pack, acquisition.observations, { clock });\n  const matched = execution.result.status === 'DECIDED' &&\n    execution.result.decision === acquisition.truthForEvaluatorOnly.requiredDecision;\n  const body = {\n    schema: 'discoverability.synthetic-journey.v1',\n    mode: 'NEWLY_EXECUTED_SYNTHETIC', pack, execution,\n    evaluator: {\n      disclosure: 'The actual world and expected decision are visible only to this synthetic acquisition/evaluation stage, not passed to the compiler or decoder.',\n      acquisition: capture(acquisition), matched,\n      independence: 'ALGORITHMIC_ROLE_SEPARATION_WITHIN_ONE_PROCESS',\n    },\n    operationalState: matched ? 'SYNTHETIC_DELIVERY_MATCHED' : 'SYNTHETIC_DELIVERY_FAILED',\n    costs: {\n      compilerWorkUnits: construction.work.used, compilationElapsedMicroseconds,\n      acquisitionDeclaredUnits: construction.program.totalCost, acquisitionElapsedMicroseconds,\n      physicalAcquisitionCost: null, computeCost: null, humanMinutes: null,\n    },\n    acceptedCapability: false, authority: [], settlement: 'NOT_CONNECTED',\n  };\n  await checkpoint('retain delivery evidence');\n  return { ...body, integrityDigest: await digest('discoverability-journey', body) };\n}\n"},"sourceHash":"5a75a494ecd7e4ad94dc97776ef887c55e0aacf76df9dff3a6bd3327a0e3c42a","sourceManifest":{"docs/assets/successor/engine.mjs":"38c4f38978bf9fc29f207bae3adee0755bc6530d04502a36c491cc430787e488","examples/build-successor/model.mjs":"8ea94108ef2ed27bce0fcff0b5d312f2e8f6db6584246cc66ab8c1c8d9281175","examples/build-successor/vendor/agijobs/compiler.mjs":"5e4fc86d78af7a22e915d8b19803fc219cb68b9b73201f47cf1f643f19380762","examples/build-successor/vendor/agijobs/domain.mjs":"2869bb750a408e12ada19f6d0b216d47c3b9f67fc66039db4372dae8430e47a3","examples/build-successor/vendor/agijobs/integrity.mjs":"164000134cc9c8b54209c420a348e3e5c324ebf7ff8f71fc84dc44812345c428","examples/build-successor/vendor/agijobs/templates.mjs":"bc035b1c38b36d2db24031ac92fb193946df9cf4f180120394506a8802be2b31","examples/successor-discoverability/browser.mjs":"5c4ce5d489e2804e417ed48a9e3fedd86080ed4ece747babaa5b99b25a9bf7ac","examples/successor-discoverability/compiler.mjs":"746853fe817f7f98e4e41a6534c87f1949acc150e9742d935637d56b6e03f898","examples/successor-discoverability/domains.mjs":"bbd9fb114fca1c8023ca866c661bf6109361d5e9a1b19905b8271f147af9afbe","examples/successor-discoverability/execution.mjs":"4af28776da52a7ecb291bba63a087ad22fae4caeab623a805485bb9a8233892c","examples/successor-discoverability/heldout.mjs":"815f9db960f0e634d371c8aa0ddae5576ee45e73f0ad2ea7cc9cb85970801022","examples/successor-discoverability/workbench-adapter.mjs":"17c2810d8959759e94845c261c881cc71e4d2bde22e6868a58aff22d9a32c092","examples/successor-workbench/engine.mjs":"f36f4c3fa45124901755bbb530a8161e98c164f5a66e9b8f932548f5286c93d7"}};
const urls=new Map();
function normalize(path){const a=[];for(const p of path.split('/')){if(p==='..')a.pop();else if(p!=='.'&&p)a.push(p);}return a.join('/');}
function url(path){
  if(urls.has(path))return urls.get(path);
  if(!Object.hasOwn(bundle.files,path))throw Error('Unbundled dependency: '+path);
  const parent=path.slice(0,path.lastIndexOf('/')+1);
  const source=bundle.files[path].replace(new RegExp("^(import\\s+(?:(?:\\{[^}]*\\}|\\*\\s+as\\s+\\w+|[A-Za-z_$][\\w$]*)\\s+from\\s+)?['\"])([^'\"]+)(['\"]\\s*;)","gm"),
    (all,before,spec,after)=>before+url(normalize(parent+spec))+after);
  const value=URL.createObjectURL(new Blob([source],{type:'text/javascript'}));urls.set(path,value);return value;
}
try{const app=await import(url(bundle.entry));await app.boot({sourceHash:bundle.sourceHash,sourceManifest:bundle.sourceManifest});}
catch(error){document.getElementById('status').textContent='Unable to initialize: '+error.message;console.error(error);}
</script>
</body></html>
