| <!doctype html> |
| <html lang="en"> |
| <head> |
| <meta charset="utf-8"> |
| <meta name="viewport" content="width=device-width,initial-scale=1"> |
| <title>False Closure / Open Loop Simulator v0.1.5</title> |
| <style> |
| :root{--bg:#080b10;--panel:#111827;--panel2:#0b111b;--ink:#f7f0df;--muted:#aeb8c8;--gold:#f0c96a;--green:#7adf98;--orange:#ffb35d;--red:#ff6b6b;--line:#2d3a50} |
| *{box-sizing:border-box}body{margin:0;font-family:Inter,system-ui,Segoe UI,Arial,sans-serif;background:radial-gradient(circle at 15% 8%,rgba(240,201,106,.15),transparent 30%),radial-gradient(circle at 82% 4%,rgba(128,183,255,.10),transparent 35%),linear-gradient(180deg,#080b10,#0d121b 55%,#07090d);color:var(--ink);line-height:1.55} |
| .wrap{width:min(1180px,calc(100% - 32px));margin:auto}header{padding:54px 0 28px;border-bottom:1px solid var(--line)}section{padding:26px 0}.eyebrow{color:var(--gold);font-size:12px;text-transform:uppercase;letter-spacing:.16em;font-weight:900}h1{font-size:clamp(38px,7vw,78px);line-height:.94;letter-spacing:-.06em;margin:12px 0}h2{font-size:clamp(26px,4vw,42px);line-height:1;margin:0 0 12px;letter-spacing:-.04em}h3{margin:18px 0 8px}.subtitle{font-size:clamp(18px,2.6vw,29px);color:#dce6f4;max-width:980px}.card{background:linear-gradient(135deg,rgba(17,24,39,.96),rgba(14,21,34,.92));border:1px solid var(--line);border-radius:24px;padding:22px;box-shadow:0 18px 45px rgba(0,0,0,.35)}.grid{display:grid;grid-template-columns:.95fr 1.05fr;gap:18px;align-items:start}.hero-grid{display:grid;grid-template-columns:1.1fr .9fr;gap:18px;margin-top:24px}.muted{color:var(--muted)}.gold{color:var(--gold)}.equation,textarea{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;background:#070a0f;color:#f4d88e;border:1px solid #39475f;border-radius:16px;padding:14px;width:100%;overflow:auto}.control{margin:13px 0}.control label{display:flex;justify-content:space-between;font-weight:780;color:#e7edf7}input[type=range]{width:100%;accent-color:var(--gold)}select{width:100%;padding:12px;border-radius:14px;background:#080c13;color:var(--ink);border:1px solid #334057}.toggle{display:flex;align-items:center;justify-content:space-between;gap:14px;background:#0b111b;border:1px solid #31405a;border-radius:16px;padding:12px 14px;margin:10px 0}.toggle span{font-weight:820}.toggle small{display:block;color:var(--muted);font-weight:500}input[type=checkbox]{width:22px;height:22px;accent-color:var(--gold)}.state{font-size:clamp(34px,5.2vw,58px);line-height:.92;letter-spacing:-.05em;font-weight:950;color:var(--gold);margin:7px 0 8px}.route-detail{font-size:14px;font-weight:850;color:#dce6f4;margin-bottom:10px}.label{font-size:12px;text-transform:uppercase;letter-spacing:.14em;color:var(--muted);font-weight:900}.score-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;margin-top:14px}.score{background:rgba(255,255,255,.045);border:1px solid rgba(255,255,255,.09);border-radius:18px;padding:14px}.score .value{font-size:30px;font-weight:950}.readbox{border-left:4px solid var(--gold);padding-left:14px;margin-top:16px}.flags{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.flag{border:1px solid #44556f;background:#0c121c;border-radius:999px;padding:7px 10px;font-size:12px;font-weight:850}.hot{border-color:rgba(255,107,107,.45);color:#ffd0d0;background:rgba(255,107,107,.10)}.warn{border-color:rgba(255,179,93,.45);color:#ffe0bd;background:rgba(255,179,93,.10)}.good{border-color:rgba(122,223,152,.45);color:#c9ffd8;background:rgba(122,223,152,.10)}.pillrow{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}.pill,.btn{border:1px solid #3a4a63;background:#101722;color:#dce6f4;border-radius:999px;padding:8px 11px;font-size:12px;font-weight:850;cursor:pointer}.primary{border-color:rgba(240,201,106,.65);color:var(--gold)}textarea{min-height:300px;color:#dfe7f3;resize:vertical}.taxonomy{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}.route-card{background:#0b111b;border:1px solid var(--line);border-radius:18px;padding:16px}.route-card b{color:var(--gold)}.route-card p{color:var(--muted);font-size:13px}@media(max-width:900px){.grid,.hero-grid,.score-grid,.taxonomy{grid-template-columns:1fr}} |
| </style> |
| </head> |
| <body> |
| <header><div class="wrap"> |
| <div class="eyebrow">False Closure / Open Loop Simulator v0.1.5</div> |
| <h1>Disagreement is not failure. False closure is failure.</h1> |
| <p class="subtitle">A HIR/OAM closure-legitimacy instrument for deciding whether a claim, conversation, dispute, or repair loop should close, remain open, fork, request evidence, defer review, or reopen for repair.</p> |
| <div class="hero-grid"> |
| <div class="card"><h2>Closure is an integrity event.</h2><p>Most systems ask whether a conversation is over. This simulator asks whether it has the structural right to close.</p><p><b class="gold">This simulator does not decide who is right.</b> It determines whether the act of closure is structurally legitimate. Structural correspondence, not ontological equivalence.</p></div> |
| <div class="card"><h2>Core equation</h2><div class="equation">S_loop = A_resolution × B_evidence − P_closure_pressure</div><p class="muted">The route is the product. The score supports the route. Diagnostic flags now describe the route condition rather than using one generic no-failure label.</p><p class="muted"><b>v0.1.5 patch:</b> State taxonomy alignment: public Recommended Loop State labels are normalized while richer route details are preserved. Shareable URL state and visible B_evidence weighting remain intact.</p></div> |
| </div></div></header> |
|
|
| <main> |
|
|
| <section><div class="wrap card"> |
| <h2>Evidence stack / weighting</h2> |
| <p class="muted">The route is still the product. This section shows how the support score is built so users do not have to reverse-engineer the sliders.</p> |
| <div class="equation">A_resolution = Claim Match</div> |
| <div class="equation">B_evidence = 0.30×Evidence Quality + 0.25×Shared Understanding + 0.20×Uncertainty Marked + 0.15×Repair Path Visible + 0.10×Claim Match</div> |
| <div class="equation">ClosureSupport = A_resolution × B_evidence</div> |
| <p class="readbox">High evidence alone cannot launder a malformed claim. High claim match alone cannot launder weak evidence, unmarked uncertainty, or missing repair path. The multiplication is intentional.</p> |
| </div></section> |
|
|
| <section><div class="wrap card"> |
| <h2>Simulator</h2> |
| <div class="grid"> |
| <div> |
| <label for="preset"><b>Scenario preset</b></label> |
| <select id="preset"></select> |
|
|
| <h3>Resolution / evidence side</h3> |
| <div class="control"><label>Claim Match <span id="claimMatchVal"></span></label><input id="claimMatch" type="range" min="0" max="1" step="0.01"></div> |
| <div class="control"><label>Evidence Quality <span id="evidenceQualityVal"></span></label><input id="evidenceQuality" type="range" min="0" max="1" step="0.01"></div> |
| <div class="control"><label>Shared Understanding <span id="sharedUnderstandingVal"></span></label><input id="sharedUnderstanding" type="range" min="0" max="1" step="0.01"></div> |
| <div class="control"><label>Uncertainty Marked <span id="uncertaintyMarkedVal"></span></label><input id="uncertaintyMarked" type="range" min="0" max="1" step="0.01"></div> |
| <div class="control"><label>Repair Path Visible <span id="repairPathVisibleVal"></span></label><input id="repairPathVisible" type="range" min="0" max="1" step="0.01"></div> |
|
|
| <h3>Closure pressure side</h3> |
| <div class="control"><label>Fatigue Pressure <span id="fatiguePressureVal"></span></label><input id="fatiguePressure" type="range" min="0" max="1" step="0.01"></div> |
| <div class="control"><label>Authority Pressure <span id="authorityPressureVal"></span></label><input id="authorityPressure" type="range" min="0" max="1" step="0.01"></div> |
| <div class="control"><label>Status / Reputation Pressure <span id="statusPressureVal"></span></label><input id="statusPressure" type="range" min="0" max="1" step="0.01"></div> |
| <div class="control"><label>Social Discomfort <span id="socialDiscomfortVal"></span></label><input id="socialDiscomfort" type="range" min="0" max="1" step="0.01"></div> |
| <div class="control"><label>Moderation / Institutional Pressure <span id="moderationPressureVal"></span></label><input id="moderationPressure" type="range" min="0" max="1" step="0.01"></div> |
|
|
| <h3>Route gates</h3> |
| <label class="toggle"><span>Proposed Closure Present<small>A person/system is trying to call the loop resolved.</small></span><input id="proposedClosure" type="checkbox"></label> |
| <label class="toggle"><span>Multiple Claims Present<small>Multiple loops are being collapsed into one closure attempt.</small></span><input id="multipleClaims" type="checkbox"></label> |
| <label class="toggle"><span>Prior Closure Harm Present<small>A previous closure erased context, blocked accountability, or caused harm.</small></span><input id="priorClosureHarm" type="checkbox"></label> |
| </div> |
|
|
| <div class="card"> |
| <div class="label">Recommended Loop State</div> |
| <div id="state" class="state"></div> |
| <div id="routeDetail" class="route-detail"></div> |
| <p id="meaning" class="muted"></p> |
| <div class="score-grid"> |
| <div class="score"><div class="label">Closure Support</div><div id="closureSupport" class="value"></div></div> |
| <div class="score"><div class="label">Pressure Load</div><div id="pressureLoad" class="value"></div></div> |
| <div class="score"><div class="label">Closure Risk</div><div id="closureRisk" class="value"></div></div> |
| <div class="score"><div class="label">Loop Stability</div><div id="loopStability" class="value"></div></div> |
| </div> |
| <div class="readbox"><b>HIR/OAM Read:</b><p id="hirRead"></p><b>Action:</b><p id="action"></p></div> |
| <h3>Diagnostic Flags</h3><div id="flags" class="flags"></div> |
| <div class="pillrow"><button id="exportReport" class="btn primary">Generate pressure report</button><button id="copyReport" class="btn">Copy report</button><button id="copyScenarioLink" class="btn">Copy scenario link</button></div> |
| </div> |
| </div> |
| </div></section> |
|
|
| <section><div class="wrap card"><h2>Exportable pressure report</h2><textarea id="report" placeholder="Click Generate pressure report..."></textarea></div></section> |
| <section><div class="wrap card"><h2>Route taxonomy</h2><p class="muted">Public labels use the locked Recommended Loop State set. Route detail preserves the richer v0.1.4 interpretation layer.</p><div class="taxonomy" id="taxonomy"></div></div></section> |
| <section><div class="wrap card"><h2>Boundary</h2><p class="readbox">This simulator does not decide who is right. It determines whether closure itself is structurally legitimate. A loop can remain open with integrity. A disagreement can remain bounded without failure. The failure state is false closure: when pressure forces a system to call something resolved before truth, evidence, context, or repair has caught up.<br><br><strong>Structural correspondence, not ontological equivalence.</strong> The tool is not a moderation verdict, censorship engine, legal finding, peer-review substitute, consciousness claim, personhood claim, biological-life claim, production validation, or institutional endorsement. It is a closure-legitimacy instrument.<br><br><strong>v0.1.5 route-proof note:</strong> public state labels are normalized to the handoff set while internal route detail remains visible. This patch also adds DEFERRED_REVIEW and strengthens the boundary language.</p></div></section> |
| </main> |
|
|
| <script> |
| const sliders=["claimMatch","evidenceQuality","sharedUnderstanding","uncertaintyMarked","repairPathVisible","fatiguePressure","authorityPressure","statusPressure","socialDiscomfort","moderationPressure"]; |
| const routes={ |
| RESOLVED_WITH_INTEGRITY:["RESOLVED WITH INTEGRITY","Closure is legitimate. Claim, evidence, uncertainty, and repair path are aligned enough to close.","Honesty marks the claim. Integrity preserves the evidence spine. Respect does not erase remaining uncertainty.","Close the loop. Closure matches the actual state."], |
| PARTIALLY_RESOLVED:["PARTIALLY RESOLVED","Some parts can close, but not the whole loop.","Integrity prevents one resolved fragment from laundering the whole dispute.","Close only the proven portion. Keep unresolved subclaims open."], |
| BOUNDED_DISAGREEMENT:["BOUNDED DISAGREEMENT","The disagreement is stable, honest, and not ready for forced closure.","Disagreement is not degradation. False closure is degradation.","Do not force agreement. Preserve the disagreement as bounded."], |
| CLARIFICATION_REQUIRED:["CLARIFICATION REQUIRED","The system cannot evaluate closure because the claim is not clear enough.","Honesty first requires naming what is actually being claimed.","Clarify the claim before evidence or closure evaluation."], |
| EVIDENCE_NEEDED:["EVIDENCE NEEDED","The loop cannot close because the evidence base is insufficient.","Honesty blocks closure without proof.","Do not close. Request source-grounded evidence."], |
| FORK_REQUIRED:["FORK REQUIRED","Multiple loops are being collapsed into one.","Integrity preserves structure by preventing collapsed context.","Fork the loop. Separate claims before closure is attempted."], |
| OPEN_LOOP:["OPEN LOOP","The issue remains unresolved, and keeping it open is the honest state.","An open loop is not a failed loop when closure would be false.","Keep open. Continue inquiry."], |
| DEFERRED_REVIEW:["DEFERRED REVIEW","The loop is not ready to close or route cleanly; review should pause until source-return, uncertainty, pressure, or repair conditions improve.","Integrity prevents premature settlement when the structure is still under-specified or pressure-contaminated.","Defer closure. Preserve the loop, reduce pressure, name missing conditions, and re-evaluate after review evidence improves."], |
| FALSE_CLOSURE:["FALSE CLOSURE","A closure attempt exists, but the support structure is incomplete.","OAM detected: pressure is impersonating resolution. The closure attempt is premature because claim match, evidence quality, uncertainty marking, or repair-path visibility are below closure-support threshold.","Reject closure. Do not proceed as if the loop is resolved. Clarify the claim boundary, request source-grounded evidence, and preserve the loop as open until uncertainty and repair-path conditions improve."], |
| COERCED_CLOSURE:["COERCED CLOSURE","A closure attempt exists, but pressure is overpowering unresolved structure.","Respect blocks force from impersonating agreement. Closure pressure is high while closure support is weak, so the closure attempt cannot be trusted yet.","Reject or quarantine closure. Reduce authority, moderation, institutional, fatigue, or status pressure before evaluating resolution."], |
| REPAIR_REQUIRED:["REPAIR REQUIRED","A prior closure harmed the loop.","Integrity requires correction of corrupted closure. Repair debt overrides ordinary closure evaluation.","Reopen for repair. Do not proceed as if the prior closure was valid. Name the harm, restore context, define a repair path, and re-evaluate only after correction."] |
| }; |
| |
| const publicStateMap={ |
| RESOLVED_WITH_INTEGRITY:["RESOLVED","Route Detail: Resolved with integrity"], |
| PARTIALLY_RESOLVED:["RESOLVED","Route Detail: Partial / limited resolution"], |
| BOUNDED_DISAGREEMENT:["STILL_OPEN","Route Detail: Bounded disagreement"], |
| CLARIFICATION_REQUIRED:["CLARIFICATION_NEEDED","Route Detail: Clarification required"], |
| EVIDENCE_NEEDED:["EVIDENCE_NEEDED","Route Detail: Evidence needed"], |
| FORK_REQUIRED:["FORK_NEEDED","Route Detail: Fork required"], |
| OPEN_LOOP:["STILL_OPEN","Route Detail: Open loop"], |
| DEFERRED_REVIEW:["DEFERRED_REVIEW","Route Detail: Deferred review"], |
| FALSE_CLOSURE:["FALSE_CLOSURE_RISK","Route Detail: False closure"], |
| COERCED_CLOSURE:["COERCION_RISK","Route Detail: Coerced closure"], |
| REPAIR_REQUIRED:["REPAIR_NEEDED","Route Detail: Repair required"] |
| }; |
| |
| const flagDefs={ |
| RepairDebt:"A prior closure harmed the loop; repair overrides ordinary closure evaluation.", |
| CoercionRisk:"Closure pressure is high enough to overpower unresolved structure.", |
| FalseClosureRisk:"A closure attempt exists, but closure support is below legitimacy threshold.", |
| ForkNeed:"Multiple claims or contexts are being collapsed into one loop.", |
| ClarificationGap:"The claim boundary is too unclear for closure evaluation.", |
| EvidenceGap:"The evidence base is too weak for closure.", |
| UncertaintyErosion:"Uncertainty is not marked clearly enough.", |
| RepairPathThin:"The repair path is weak, missing, or not visible enough.", |
| ClosureClear:"No critical failure flag; closure has earned the route threshold.", |
| StableOpenState:"No critical failure flag; the loop can remain honestly open or bounded.", |
| PartialClosureClear:"No critical failure flag; only the proven portion should close.", |
| DeferredReview:"Review should pause until closure conditions are better specified or pressure is reduced.", |
| NoCriticalFailure:"No critical failure flag detected for this route." |
| }; |
| |
| |
| let urlSyncReady=false; |
| |
| function writeUrlState(){ |
| const params=new URLSearchParams(); |
| params.set("preset",el("preset").value||"manual"); |
| sliders.forEach(id=>params.set(id,r(val(id)))); |
| ["proposedClosure","multipleClaims","priorClosureHarm"].forEach(id=>params.set(id,el(id).checked?"1":"0")); |
| const next=location.pathname+"?"+params.toString(); |
| history.replaceState(null,"",next); |
| } |
| |
| function copyScenarioLink(){ |
| writeUrlState(); |
| navigator.clipboard?.writeText(location.href); |
| const btn=el("copyScenarioLink"); |
| if(btn){btn.textContent="Copied scenario link";setTimeout(()=>btn.textContent="Copy scenario link",1300);} |
| } |
| |
| function applyUrlStateIfPresent(){ |
| const params=new URLSearchParams(location.search); |
| if(!params.toString()) return false; |
| const preset=params.get("preset"); |
| if(preset && presets[preset]){ |
| el("preset").value=preset; |
| applyPreset(preset); |
| } |
| sliders.forEach(id=>{ |
| if(params.has(id)){ |
| const n=parseFloat(params.get(id)); |
| if(!Number.isNaN(n)) el(id).value=Math.max(0,Math.min(1,n)); |
| } |
| }); |
| ["proposedClosure","multipleClaims","priorClosureHarm"].forEach(id=>{ |
| if(params.has(id)) el(id).checked=params.get(id)==="1" || params.get(id)==="true"; |
| }); |
| return true; |
| } |
| |
| const presets={ |
| "ai_summary_false_closure":["AI Summary False Closure",{claimMatch:.44,evidenceQuality:.42,sharedUnderstanding:.46,uncertaintyMarked:.18,repairPathVisible:.24,fatiguePressure:.55,authorityPressure:.48,statusPressure:.42,socialDiscomfort:.58,moderationPressure:.52,proposedClosure:true,multipleClaims:true,priorClosureHarm:false}], |
| "moderator_convenience":["Moderator Convenience Closure",{claimMatch:.52,evidenceQuality:.48,sharedUnderstanding:.50,uncertaintyMarked:.40,repairPathVisible:.32,fatiguePressure:.70,authorityPressure:.76,statusPressure:.55,socialDiscomfort:.82,moderationPressure:.88,proposedClosure:true,multipleClaims:false,priorClosureHarm:false}], |
| "institutional_liability":["Institutional Liability Closure",{claimMatch:.50,evidenceQuality:.44,sharedUnderstanding:.36,uncertaintyMarked:.30,repairPathVisible:.18,fatiguePressure:.48,authorityPressure:.88,statusPressure:.84,socialDiscomfort:.62,moderationPressure:.78,proposedClosure:true,multipleClaims:true,priorClosureHarm:false}], |
| "tired_conversation":["Tired Conversation Closure",{claimMatch:.58,evidenceQuality:.54,sharedUnderstanding:.52,uncertaintyMarked:.48,repairPathVisible:.40,fatiguePressure:.88,authorityPressure:.25,statusPressure:.34,socialDiscomfort:.62,moderationPressure:.20,proposedClosure:true,multipleClaims:false,priorClosureHarm:false}], |
| "bounded_disagreement":["Bounded Disagreement",{claimMatch:.60,evidenceQuality:.72,sharedUnderstanding:.74,uncertaintyMarked:.82,repairPathVisible:.55,fatiguePressure:.25,authorityPressure:.20,statusPressure:.25,socialDiscomfort:.32,moderationPressure:.18,proposedClosure:false,multipleClaims:false,priorClosureHarm:false}], |
| "evidence_needed":["Evidence-Needed State",{claimMatch:.62,evidenceQuality:.28,sharedUnderstanding:.46,uncertaintyMarked:.52,repairPathVisible:.35,fatiguePressure:.25,authorityPressure:.22,statusPressure:.25,socialDiscomfort:.30,moderationPressure:.25,proposedClosure:false,multipleClaims:false,priorClosureHarm:false}], |
| "fork_required":["Fork Required",{claimMatch:.56,evidenceQuality:.62,sharedUnderstanding:.50,uncertaintyMarked:.64,repairPathVisible:.45,fatiguePressure:.30,authorityPressure:.25,statusPressure:.35,socialDiscomfort:.40,moderationPressure:.25,proposedClosure:false,multipleClaims:true,priorClosureHarm:false}], |
| "resolved_integrity":["Resolved With Integrity",{claimMatch:.93,evidenceQuality:.90,sharedUnderstanding:.88,uncertaintyMarked:.82,repairPathVisible:.84,fatiguePressure:.16,authorityPressure:.14,statusPressure:.16,socialDiscomfort:.18,moderationPressure:.14,proposedClosure:true,multipleClaims:false,priorClosureHarm:false}], |
| "partial_resolved":["Partially Resolved Proof",{claimMatch:.82,evidenceQuality:.80,sharedUnderstanding:.78,uncertaintyMarked:.62,repairPathVisible:.64,fatiguePressure:.24,authorityPressure:.22,statusPressure:.24,socialDiscomfort:.26,moderationPressure:.22,proposedClosure:false,multipleClaims:false,priorClosureHarm:false}], |
| "clarification_required":["Clarification Required Proof",{claimMatch:.32,evidenceQuality:.64,sharedUnderstanding:.46,uncertaintyMarked:.60,repairPathVisible:.42,fatiguePressure:.28,authorityPressure:.20,statusPressure:.22,socialDiscomfort:.30,moderationPressure:.25,proposedClosure:false,multipleClaims:false,priorClosureHarm:false}], |
| "open_loop":["Open Loop Proof",{claimMatch:.56,evidenceQuality:.56,sharedUnderstanding:.54,uncertaintyMarked:.54,repairPathVisible:.46,fatiguePressure:.24,authorityPressure:.22,statusPressure:.24,socialDiscomfort:.25,moderationPressure:.22,proposedClosure:false,multipleClaims:false,priorClosureHarm:false}], |
| "deferred_review":["Deferred Review",{claimMatch:.58,evidenceQuality:.58,sharedUnderstanding:.56,uncertaintyMarked:.38,repairPathVisible:.34,fatiguePressure:.60,authorityPressure:.48,statusPressure:.46,socialDiscomfort:.56,moderationPressure:.42,proposedClosure:false,multipleClaims:false,priorClosureHarm:false}], |
| "repair_required":["Repair Required",{claimMatch:.55,evidenceQuality:.50,sharedUnderstanding:.42,uncertaintyMarked:.28,repairPathVisible:.18,fatiguePressure:.58,authorityPressure:.66,statusPressure:.60,socialDiscomfort:.62,moderationPressure:.55,proposedClosure:true,multipleClaims:false,priorClosureHarm:true}] |
| }; |
| function el(id){return document.getElementById(id)} function val(id){return parseFloat(el(id).value)} function avg(a){return a.reduce((x,y)=>x+y,0)/a.length} function r(n){return Number(n).toFixed(2)} |
| function compute(){ |
| let claimMatch=val("claimMatch"), evidenceQuality=val("evidenceQuality"), sharedUnderstanding=val("sharedUnderstanding"), uncertaintyMarked=val("uncertaintyMarked"), repairPathVisible=val("repairPathVisible"); |
| let pressureLoad=avg([val("fatiguePressure"),val("authorityPressure"),val("statusPressure"),val("socialDiscomfort"),val("moderationPressure")]); |
| let bEvidence=.30*evidenceQuality+.25*sharedUnderstanding+.20*uncertaintyMarked+.15*repairPathVisible+.10*claimMatch; |
| let closureSupport=claimMatch*bEvidence, closureRisk=pressureLoad-closureSupport, loopStability=closureSupport-pressureLoad; |
| let proposedClosure=el("proposedClosure").checked, multipleClaims=el("multipleClaims").checked, priorClosureHarm=el("priorClosureHarm").checked; |
| let flags=[]; |
| if(priorClosureHarm)flags.push(["RepairDebt","hot"]); |
| if(proposedClosure&&pressureLoad>=.72&&closureSupport<.62)flags.push(["CoercionRisk","hot"]); |
| if(proposedClosure&&closureSupport<.58)flags.push(["FalseClosureRisk","hot"]); |
| if(multipleClaims)flags.push(["ForkNeed","warn"]); |
| if(claimMatch<.45)flags.push(["ClarificationGap","warn"]); |
| if(evidenceQuality<.50)flags.push(["EvidenceGap","warn"]); |
| if(uncertaintyMarked<.45)flags.push(["UncertaintyErosion","warn"]); |
| if(repairPathVisible<.35)flags.push(["RepairPathThin","warn"]); |
| let route="OPEN_LOOP"; |
| if(priorClosureHarm)route="REPAIR_REQUIRED"; |
| else if(proposedClosure&&pressureLoad>=.72&&closureSupport<.62)route="COERCED_CLOSURE"; |
| else if(proposedClosure&&closureSupport<.58)route="FALSE_CLOSURE"; |
| else if(multipleClaims)route="FORK_REQUIRED"; |
| else if(claimMatch<.45)route="CLARIFICATION_REQUIRED"; |
| else if(evidenceQuality<.50)route="EVIDENCE_NEEDED"; |
| else if(!proposedClosure&&pressureLoad>=.45&&closureSupport<.66&&(uncertaintyMarked<.55||repairPathVisible<.50))route="DEFERRED_REVIEW"; |
| else if(closureSupport>=.58&&closureSupport<.74&&claimMatch>=.60&&evidenceQuality>=.55)route="PARTIALLY_RESOLVED"; |
| else if(evidenceQuality>=.60&&sharedUnderstanding>=.60&&uncertaintyMarked>=.60&&claimMatch>=.45&&claimMatch<=.70)route="BOUNDED_DISAGREEMENT"; |
| else if(closureSupport>=.74&&pressureLoad<.55&&claimMatch>=.75&&evidenceQuality>=.70&&uncertaintyMarked>=.60)route="RESOLVED_WITH_INTEGRITY"; |
| if(route==="DEFERRED_REVIEW"&&!flags.some(f=>f[0]==="DeferredReview")) flags.push(["DeferredReview","warn"]); |
| if(!flags.length){ |
| if(route==="RESOLVED_WITH_INTEGRITY") flags.push(["ClosureClear","good"]); |
| else if(route==="BOUNDED_DISAGREEMENT" || route==="OPEN_LOOP") flags.push(["StableOpenState","good"]); |
| else if(route==="PARTIALLY_RESOLVED") flags.push(["PartialClosureClear","good"]); |
| else flags.push(["NoCriticalFailure","good"]); |
| } |
| return {claimMatch,evidenceQuality,sharedUnderstanding,uncertaintyMarked,repairPathVisible,aResolution:claimMatch,bEvidence,pressureLoad,closureSupport,closureRisk,loopStability,proposedClosure,multipleClaims,priorClosureHarm,flags,route}; |
| } |
| function update(){ |
| sliders.forEach(id=>el(id+"Val").textContent=r(val(id))); |
| const c=compute(), info=routes[c.route]; |
| const pub=publicStateMap[c.route]||[info[0],"Route Detail: "+info[0]]; el("state").textContent=pub[0]; el("routeDetail").textContent=pub[1]; el("meaning").textContent=info[1]; el("closureSupport").textContent=r(c.closureSupport); el("pressureLoad").textContent=r(c.pressureLoad); el("closureRisk").textContent=r(c.closureRisk); el("loopStability").textContent=r(c.loopStability); el("hirRead").textContent=info[2]+((c.multipleClaims&&(c.route==="FALSE_CLOSURE"||c.route==="COERCED_CLOSURE"))?" Multiple collapsed loops are contributing to the closure failure; fork before re-evaluation.":""); el("action").textContent=info[3]; |
| el("flags").innerHTML=""; c.flags.forEach(([name,cls])=>{let s=document.createElement("span");s.className="flag "+cls;s.textContent=name;el("flags").appendChild(s)}); |
| if(urlSyncReady) writeUrlState(); |
| } |
| function applyPreset(k){let p=presets[k][1];Object.entries(p).forEach(([key,v])=>{if(typeof v==="boolean")el(key).checked=v;else el(key).value=v});update()} |
| function report(){ |
| const c=compute(), info=routes[c.route], preset=presets[el("preset").value]?.[0]||"Manual exploration"; |
| el("report").value=`False Closure / Open Loop Simulator v0.1.5 — Pressure Report |
| |
| Scenario: |
| ${preset} |
| |
| Recommended Loop State: |
| ${(publicStateMap[c.route]||[info[0],"Route Detail: "+info[0]])[0]} |
| |
| Route Detail: |
| ${info[0]} |
| |
| Equation: |
| S_loop = A_resolution × B_evidence − P_closure_pressure |
| |
| Scores: |
| - A_resolution / Claim Match: ${r(c.aResolution)} |
| - B_evidence / Evidence Stack: ${r(c.bEvidence)} |
| - Closure Support: ${r(c.closureSupport)} |
| - Pressure Load: ${r(c.pressureLoad)} |
| - Closure Risk: ${r(c.closureRisk)} |
| - Loop Stability: ${r(c.loopStability)} |
| |
| Inputs: |
| - Claim Match: ${r(c.claimMatch)} |
| - Evidence Quality: ${r(c.evidenceQuality)} |
| - Shared Understanding: ${r(c.sharedUnderstanding)} |
| - Uncertainty Marked: ${r(c.uncertaintyMarked)} |
| - Repair Path Visible: ${r(c.repairPathVisible)} |
| - Proposed Closure Present: ${c.proposedClosure?"yes":"no"} |
| - Multiple Claims Present: ${c.multipleClaims?"yes":"no"} |
| - Prior Closure Harm Present: ${c.priorClosureHarm?"yes":"no"} |
| |
| Diagnostic Flags: |
| ${c.flags.map(f=>"- "+f[0]+": "+(flagDefs[f[0]]||"No definition available.")).join("\n")} |
| |
| HIR/OAM Read: |
| ${info[2]} |
| |
| Action: |
| ${info[3]} |
| |
| Shareable State: |
| ${location.href} |
| |
| Boundary: |
| This simulator does not decide who is right. It determines whether closure itself is structurally legitimate. Closure is an integrity event, not an administrative convenience. Structural correspondence, not ontological equivalence.`; |
| } |
| document.addEventListener("DOMContentLoaded",()=>{ |
| Object.entries(presets).forEach(([k,p])=>{let o=document.createElement("option");o.value=k;o.textContent=p[0];el("preset").appendChild(o)}); |
| sliders.forEach(id=>el(id).addEventListener("input",update));["proposedClosure","multipleClaims","priorClosureHarm"].forEach(id=>el(id).addEventListener("change",update)); |
| el("preset").addEventListener("change",e=>applyPreset(e.target.value)); el("exportReport").addEventListener("click",report); el("copyReport").addEventListener("click",()=>{if(!el("report").value)report();navigator.clipboard?.writeText(el("report").value)}); |
| el("copyScenarioLink").addEventListener("click",copyScenarioLink); |
| ["RESOLVED_WITH_INTEGRITY","PARTIALLY_RESOLVED","BOUNDED_DISAGREEMENT","CLARIFICATION_REQUIRED","EVIDENCE_NEEDED","FORK_REQUIRED","OPEN_LOOP","DEFERRED_REVIEW","FALSE_CLOSURE","COERCED_CLOSURE","REPAIR_REQUIRED"].forEach(k=>{let i=routes[k],pub=publicStateMap[k]||[i[0],"Route Detail: "+i[0]],d=document.createElement("div");d.className="route-card";d.innerHTML=`<b>${pub[0]}</b><p><b>${pub[1].replace("Route Detail: ","")}</b> — ${i[1]}</p><p><b>Action:</b> ${i[3]}</p>`;el("taxonomy").appendChild(d)}); |
| if(!applyUrlStateIfPresent()) applyPreset("ai_summary_false_closure"); |
| urlSyncReady=true; |
| update(); |
| }); |
| </script> |
| </body> |
| </html> |