Upload 2 files
Browse filesFalse Closure / Open Loop Simulator v0.1.4 is a HIR/OAM route-governance engine for evaluating whether a claim, dispute, conversation, AI summary, moderation action, or repair loop has the structural right to close.
Most systems ask whether a conversation is over. This simulator asks whether it has the structural right to close.
It does not decide who is right. It determines whether closure itself is structurally legitimate.
The core equation is:
S_loop = A_resolution × B_evidence − P_closure_pressure
The route is the product. The score supports the route.
The simulator returns a Recommended Loop State such as RESOLVED_WITH_INTEGRITY, PARTIALLY_RESOLVED, BOUNDED_DISAGREEMENT, CLARIFICATION_REQUIRED, EVIDENCE_NEEDED, FORK_REQUIRED, OPEN_LOOP, FALSE_CLOSURE, COERCED_CLOSURE, or REPAIR_REQUIRED.
Built-in presets demonstrate common closure failure modes and healthy loop states, including AI Summary False Closure, Moderator Convenience Closure, Institutional Liability Closure, Tired Conversation Closure, Bounded Disagreement, Evidence Needed, Fork Required, Resolved With Integrity, Open Loop, and Repair Required.
Boundary: this simulator is not a moderation tool, not a truth-verdict engine, and not a claim of who is right. It is a pressure-map for closure legitimacy.
Disagreement is not failure. False closure is failure.
- README.md +121 -6
- index.html +265 -18
|
@@ -1,12 +1,127 @@
|
|
| 1 |
---
|
| 2 |
-
title: False Closure Open Loop Simulator
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: static
|
|
|
|
| 7 |
pinned: false
|
| 8 |
license: cc-by-4.0
|
| 9 |
-
short_description:
|
| 10 |
---
|
| 11 |
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: False Closure / Open Loop Simulator
|
| 3 |
+
emoji: 🔁
|
| 4 |
+
colorFrom: indigo
|
| 5 |
+
colorTo: yellow
|
| 6 |
sdk: static
|
| 7 |
+
app_file: index.html
|
| 8 |
pinned: false
|
| 9 |
license: cc-by-4.0
|
| 10 |
+
short_description: Closure-legitimacy simulator for open loops.
|
| 11 |
---
|
| 12 |
|
| 13 |
+
# False Closure / Open Loop Simulator v0.1.4
|
| 14 |
+
|
| 15 |
+
**Closure is an integrity event, not an administrative convenience.**
|
| 16 |
+
|
| 17 |
+
Most systems ask whether a conversation is over.
|
| 18 |
+
This simulator asks whether it has the **structural right** to close.
|
| 19 |
+
|
| 20 |
+
## What it is
|
| 21 |
+
|
| 22 |
+
A lightweight HIR/OAM route-governance engine that evaluates whether a claim, dispute, conversation, or repair loop can legitimately close — or whether it should remain open, fork, request evidence, preserve bounded disagreement, or reopen for repair.
|
| 23 |
+
|
| 24 |
+
It does **not** decide who is right.
|
| 25 |
+
It determines whether the **act of closure** itself is structurally legitimate.
|
| 26 |
+
|
| 27 |
+
## Core equation
|
| 28 |
+
|
| 29 |
+
```text
|
| 30 |
+
S_loop = A_resolution × B_evidence − P_closure_pressure
|
| 31 |
+
```
|
| 32 |
+
|
| 33 |
+
Internal stack:
|
| 34 |
+
|
| 35 |
+
```text
|
| 36 |
+
ClosureSupport = A_resolution × B_evidence
|
| 37 |
+
PressureLoad = P_closure_pressure
|
| 38 |
+
ClosureRisk = PressureLoad − ClosureSupport
|
| 39 |
+
LoopStability = ClosureSupport − PressureLoad
|
| 40 |
+
```
|
| 41 |
+
|
| 42 |
+
## Core thesis
|
| 43 |
+
|
| 44 |
+
```text
|
| 45 |
+
Disagreement is not failure.
|
| 46 |
+
False closure is failure.
|
| 47 |
+
```
|
| 48 |
+
|
| 49 |
+
The route is the product.
|
| 50 |
+
The score supports the route.
|
| 51 |
+
|
| 52 |
+
## Recommended Loop States
|
| 53 |
+
|
| 54 |
+
```text
|
| 55 |
+
RESOLVED_WITH_INTEGRITY
|
| 56 |
+
PARTIALLY_RESOLVED
|
| 57 |
+
BOUNDED_DISAGREEMENT
|
| 58 |
+
CLARIFICATION_REQUIRED
|
| 59 |
+
EVIDENCE_NEEDED
|
| 60 |
+
FORK_REQUIRED
|
| 61 |
+
OPEN_LOOP
|
| 62 |
+
FALSE_CLOSURE
|
| 63 |
+
COERCED_CLOSURE
|
| 64 |
+
REPAIR_REQUIRED
|
| 65 |
+
```
|
| 66 |
+
|
| 67 |
+
## Boundary
|
| 68 |
+
|
| 69 |
+
This simulator does not decide who is right. It determines whether closure itself is structurally legitimate.
|
| 70 |
+
|
| 71 |
+
A loop can remain open with integrity.
|
| 72 |
+
A disagreement can remain bounded without failure.
|
| 73 |
+
The failure state is false closure: when pressure forces a system to call something resolved before truth, evidence, context, or repair has caught up.
|
| 74 |
+
|
| 75 |
+
## How to use
|
| 76 |
+
|
| 77 |
+
1. Load the Space.
|
| 78 |
+
2. Choose a preset or adjust sliders manually.
|
| 79 |
+
3. Review the **Recommended Loop State**.
|
| 80 |
+
4. Inspect Closure Support, Pressure Load, Closure Risk, Loop Stability, and diagnostic flags.
|
| 81 |
+
5. Generate an exportable pressure report.
|
| 82 |
+
6. Use **Copy scenario link** to share the exact simulator state.
|
| 83 |
+
|
| 84 |
+
## Presets included
|
| 85 |
+
|
| 86 |
+
```text
|
| 87 |
+
AI Summary False Closure
|
| 88 |
+
Moderator Convenience Closure
|
| 89 |
+
Institutional Liability Closure
|
| 90 |
+
Tired Conversation Closure
|
| 91 |
+
Bounded Disagreement
|
| 92 |
+
Evidence-Needed State
|
| 93 |
+
Fork Required
|
| 94 |
+
Resolved With Integrity
|
| 95 |
+
Partially Resolved Proof
|
| 96 |
+
Clarification Required Proof
|
| 97 |
+
Open Loop Proof
|
| 98 |
+
Repair Required
|
| 99 |
+
```
|
| 100 |
+
|
| 101 |
+
## Version
|
| 102 |
+
|
| 103 |
+
v0.1.4 — Public Demo Candidate
|
| 104 |
+
|
| 105 |
+
Adds:
|
| 106 |
+
|
| 107 |
+
```text
|
| 108 |
+
Shareable URL state
|
| 109 |
+
Copy scenario link
|
| 110 |
+
Visible B_evidence weighting explanation
|
| 111 |
+
Exportable pressure report
|
| 112 |
+
Route-proofed presets
|
| 113 |
+
```
|
| 114 |
+
|
| 115 |
+
Route logic and thresholds remain locked from v0.1.3.
|
| 116 |
+
|
| 117 |
+
## Tech
|
| 118 |
+
|
| 119 |
+
Pure HTML, CSS, and JavaScript.
|
| 120 |
+
No backend.
|
| 121 |
+
No external dependencies.
|
| 122 |
+
Works locally or as a Hugging Face Static Space.
|
| 123 |
+
|
| 124 |
+
---
|
| 125 |
+
|
| 126 |
+
**Most systems ask whether a conversation is over.
|
| 127 |
+
This simulator asks whether it has the structural right to close.**
|
|
@@ -1,19 +1,266 @@
|
|
| 1 |
<!doctype html>
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
| 19 |
-
</
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
<!doctype html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<meta charset="utf-8">
|
| 5 |
+
<meta name="viewport" content="width=device-width,initial-scale=1">
|
| 6 |
+
<title>False Closure / Open Loop Simulator v0.1.4</title>
|
| 7 |
+
<style>
|
| 8 |
+
:root{--bg:#080b10;--panel:#111827;--panel2:#0b111b;--ink:#f7f0df;--muted:#aeb8c8;--gold:#f0c96a;--green:#7adf98;--orange:#ffb35d;--red:#ff6b6b;--line:#2d3a50}
|
| 9 |
+
*{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}
|
| 10 |
+
.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 12px}.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}}
|
| 11 |
+
</style>
|
| 12 |
+
</head>
|
| 13 |
+
<body>
|
| 14 |
+
<header><div class="wrap">
|
| 15 |
+
<div class="eyebrow">False Closure / Open Loop Simulator v0.1.4</div>
|
| 16 |
+
<h1>Disagreement is not failure. False closure is failure.</h1>
|
| 17 |
+
<p class="subtitle">A HIR/OAM route-governance engine for deciding whether a claim, conversation, dispute, or repair loop should close, remain open, fork, request evidence, or reopen for repair.</p>
|
| 18 |
+
<div class="hero-grid">
|
| 19 |
+
<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.</p></div>
|
| 20 |
+
<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.4 patch:</b> Shareable URL state, copy scenario link, and visible B_evidence weighting explanation. Route logic and thresholds unchanged.</p></div>
|
| 21 |
+
</div></div></header>
|
| 22 |
+
|
| 23 |
+
<main>
|
| 24 |
+
|
| 25 |
+
<section><div class="wrap card">
|
| 26 |
+
<h2>Evidence stack / weighting</h2>
|
| 27 |
+
<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>
|
| 28 |
+
<div class="equation">A_resolution = Claim Match</div>
|
| 29 |
+
<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>
|
| 30 |
+
<div class="equation">ClosureSupport = A_resolution × B_evidence</div>
|
| 31 |
+
<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>
|
| 32 |
+
</div></section>
|
| 33 |
+
|
| 34 |
+
<section><div class="wrap card">
|
| 35 |
+
<h2>Simulator</h2>
|
| 36 |
+
<div class="grid">
|
| 37 |
+
<div>
|
| 38 |
+
<label for="preset"><b>Scenario preset</b></label>
|
| 39 |
+
<select id="preset"></select>
|
| 40 |
+
|
| 41 |
+
<h3>Resolution / evidence side</h3>
|
| 42 |
+
<div class="control"><label>Claim Match <span id="claimMatchVal"></span></label><input id="claimMatch" type="range" min="0" max="1" step="0.01"></div>
|
| 43 |
+
<div class="control"><label>Evidence Quality <span id="evidenceQualityVal"></span></label><input id="evidenceQuality" type="range" min="0" max="1" step="0.01"></div>
|
| 44 |
+
<div class="control"><label>Shared Understanding <span id="sharedUnderstandingVal"></span></label><input id="sharedUnderstanding" type="range" min="0" max="1" step="0.01"></div>
|
| 45 |
+
<div class="control"><label>Uncertainty Marked <span id="uncertaintyMarkedVal"></span></label><input id="uncertaintyMarked" type="range" min="0" max="1" step="0.01"></div>
|
| 46 |
+
<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>
|
| 47 |
+
|
| 48 |
+
<h3>Closure pressure side</h3>
|
| 49 |
+
<div class="control"><label>Fatigue Pressure <span id="fatiguePressureVal"></span></label><input id="fatiguePressure" type="range" min="0" max="1" step="0.01"></div>
|
| 50 |
+
<div class="control"><label>Authority Pressure <span id="authorityPressureVal"></span></label><input id="authorityPressure" type="range" min="0" max="1" step="0.01"></div>
|
| 51 |
+
<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>
|
| 52 |
+
<div class="control"><label>Social Discomfort <span id="socialDiscomfortVal"></span></label><input id="socialDiscomfort" type="range" min="0" max="1" step="0.01"></div>
|
| 53 |
+
<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>
|
| 54 |
+
|
| 55 |
+
<h3>Route gates</h3>
|
| 56 |
+
<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>
|
| 57 |
+
<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>
|
| 58 |
+
<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>
|
| 59 |
+
</div>
|
| 60 |
+
|
| 61 |
+
<div class="card">
|
| 62 |
+
<div class="label">Recommended Loop State</div>
|
| 63 |
+
<div id="state" class="state"></div>
|
| 64 |
+
<p id="meaning" class="muted"></p>
|
| 65 |
+
<div class="score-grid">
|
| 66 |
+
<div class="score"><div class="label">Closure Support</div><div id="closureSupport" class="value"></div></div>
|
| 67 |
+
<div class="score"><div class="label">Pressure Load</div><div id="pressureLoad" class="value"></div></div>
|
| 68 |
+
<div class="score"><div class="label">Closure Risk</div><div id="closureRisk" class="value"></div></div>
|
| 69 |
+
<div class="score"><div class="label">Loop Stability</div><div id="loopStability" class="value"></div></div>
|
| 70 |
+
</div>
|
| 71 |
+
<div class="readbox"><b>HIR/OAM Read:</b><p id="hirRead"></p><b>Action:</b><p id="action"></p></div>
|
| 72 |
+
<h3>Diagnostic Flags</h3><div id="flags" class="flags"></div>
|
| 73 |
+
<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>
|
| 74 |
+
</div>
|
| 75 |
+
</div>
|
| 76 |
+
</div></section>
|
| 77 |
+
|
| 78 |
+
<section><div class="wrap card"><h2>Exportable pressure report</h2><textarea id="report" placeholder="Click Generate pressure report..."></textarea></div></section>
|
| 79 |
+
<section><div class="wrap card"><h2>Route taxonomy</h2><div class="taxonomy" id="taxonomy"></div></div></section>
|
| 80 |
+
<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>v0.1.4 route-proof note:</strong> thresholds and route precedence remain unchanged. This patch adds shareable state and makes the evidence-stack weighting visible.</p></div></section>
|
| 81 |
+
</main>
|
| 82 |
+
|
| 83 |
+
<script>
|
| 84 |
+
const sliders=["claimMatch","evidenceQuality","sharedUnderstanding","uncertaintyMarked","repairPathVisible","fatiguePressure","authorityPressure","statusPressure","socialDiscomfort","moderationPressure"];
|
| 85 |
+
const routes={
|
| 86 |
+
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."],
|
| 87 |
+
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."],
|
| 88 |
+
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."],
|
| 89 |
+
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."],
|
| 90 |
+
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."],
|
| 91 |
+
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."],
|
| 92 |
+
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."],
|
| 93 |
+
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."],
|
| 94 |
+
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."],
|
| 95 |
+
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."]
|
| 96 |
+
};
|
| 97 |
+
|
| 98 |
+
const flagDefs={
|
| 99 |
+
RepairDebt:"A prior closure harmed the loop; repair overrides ordinary closure evaluation.",
|
| 100 |
+
CoercionRisk:"Closure pressure is high enough to overpower unresolved structure.",
|
| 101 |
+
FalseClosureRisk:"A closure attempt exists, but closure support is below legitimacy threshold.",
|
| 102 |
+
ForkNeed:"Multiple claims or contexts are being collapsed into one loop.",
|
| 103 |
+
ClarificationGap:"The claim boundary is too unclear for closure evaluation.",
|
| 104 |
+
EvidenceGap:"The evidence base is too weak for closure.",
|
| 105 |
+
UncertaintyErosion:"Uncertainty is not marked clearly enough.",
|
| 106 |
+
RepairPathThin:"The repair path is weak, missing, or not visible enough.",
|
| 107 |
+
ClosureClear:"No critical failure flag; closure has earned the route threshold.",
|
| 108 |
+
StableOpenState:"No critical failure flag; the loop can remain honestly open or bounded.",
|
| 109 |
+
PartialClosureClear:"No critical failure flag; only the proven portion should close.",
|
| 110 |
+
NoCriticalFailure:"No critical failure flag detected for this route."
|
| 111 |
+
};
|
| 112 |
+
|
| 113 |
+
|
| 114 |
+
let urlSyncReady=false;
|
| 115 |
+
|
| 116 |
+
function writeUrlState(){
|
| 117 |
+
const params=new URLSearchParams();
|
| 118 |
+
params.set("preset",el("preset").value||"manual");
|
| 119 |
+
sliders.forEach(id=>params.set(id,r(val(id))));
|
| 120 |
+
["proposedClosure","multipleClaims","priorClosureHarm"].forEach(id=>params.set(id,el(id).checked?"1":"0"));
|
| 121 |
+
const next=location.pathname+"?"+params.toString();
|
| 122 |
+
history.replaceState(null,"",next);
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
function copyScenarioLink(){
|
| 126 |
+
writeUrlState();
|
| 127 |
+
navigator.clipboard?.writeText(location.href);
|
| 128 |
+
const btn=el("copyScenarioLink");
|
| 129 |
+
if(btn){btn.textContent="Copied scenario link";setTimeout(()=>btn.textContent="Copy scenario link",1300);}
|
| 130 |
+
}
|
| 131 |
+
|
| 132 |
+
function applyUrlStateIfPresent(){
|
| 133 |
+
const params=new URLSearchParams(location.search);
|
| 134 |
+
if(!params.toString()) return false;
|
| 135 |
+
const preset=params.get("preset");
|
| 136 |
+
if(preset && presets[preset]){
|
| 137 |
+
el("preset").value=preset;
|
| 138 |
+
applyPreset(preset);
|
| 139 |
+
}
|
| 140 |
+
sliders.forEach(id=>{
|
| 141 |
+
if(params.has(id)){
|
| 142 |
+
const n=parseFloat(params.get(id));
|
| 143 |
+
if(!Number.isNaN(n)) el(id).value=Math.max(0,Math.min(1,n));
|
| 144 |
+
}
|
| 145 |
+
});
|
| 146 |
+
["proposedClosure","multipleClaims","priorClosureHarm"].forEach(id=>{
|
| 147 |
+
if(params.has(id)) el(id).checked=params.get(id)==="1" || params.get(id)==="true";
|
| 148 |
+
});
|
| 149 |
+
return true;
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
const presets={
|
| 153 |
+
"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}],
|
| 154 |
+
"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}],
|
| 155 |
+
"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}],
|
| 156 |
+
"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}],
|
| 157 |
+
"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}],
|
| 158 |
+
"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}],
|
| 159 |
+
"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}],
|
| 160 |
+
"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}],
|
| 161 |
+
"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}],
|
| 162 |
+
"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}],
|
| 163 |
+
"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}],
|
| 164 |
+
"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}]
|
| 165 |
+
};
|
| 166 |
+
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)}
|
| 167 |
+
function compute(){
|
| 168 |
+
let claimMatch=val("claimMatch"), evidenceQuality=val("evidenceQuality"), sharedUnderstanding=val("sharedUnderstanding"), uncertaintyMarked=val("uncertaintyMarked"), repairPathVisible=val("repairPathVisible");
|
| 169 |
+
let pressureLoad=avg([val("fatiguePressure"),val("authorityPressure"),val("statusPressure"),val("socialDiscomfort"),val("moderationPressure")]);
|
| 170 |
+
let bEvidence=.30*evidenceQuality+.25*sharedUnderstanding+.20*uncertaintyMarked+.15*repairPathVisible+.10*claimMatch;
|
| 171 |
+
let closureSupport=claimMatch*bEvidence, closureRisk=pressureLoad-closureSupport, loopStability=closureSupport-pressureLoad;
|
| 172 |
+
let proposedClosure=el("proposedClosure").checked, multipleClaims=el("multipleClaims").checked, priorClosureHarm=el("priorClosureHarm").checked;
|
| 173 |
+
let flags=[];
|
| 174 |
+
if(priorClosureHarm)flags.push(["RepairDebt","hot"]);
|
| 175 |
+
if(proposedClosure&&pressureLoad>=.72&&closureSupport<.62)flags.push(["CoercionRisk","hot"]);
|
| 176 |
+
if(proposedClosure&&closureSupport<.58)flags.push(["FalseClosureRisk","hot"]);
|
| 177 |
+
if(multipleClaims)flags.push(["ForkNeed","warn"]);
|
| 178 |
+
if(claimMatch<.45)flags.push(["ClarificationGap","warn"]);
|
| 179 |
+
if(evidenceQuality<.50)flags.push(["EvidenceGap","warn"]);
|
| 180 |
+
if(uncertaintyMarked<.45)flags.push(["UncertaintyErosion","warn"]);
|
| 181 |
+
if(repairPathVisible<.35)flags.push(["RepairPathThin","warn"]);
|
| 182 |
+
let route="OPEN_LOOP";
|
| 183 |
+
if(priorClosureHarm)route="REPAIR_REQUIRED";
|
| 184 |
+
else if(proposedClosure&&pressureLoad>=.72&&closureSupport<.62)route="COERCED_CLOSURE";
|
| 185 |
+
else if(proposedClosure&&closureSupport<.58)route="FALSE_CLOSURE";
|
| 186 |
+
else if(multipleClaims)route="FORK_REQUIRED";
|
| 187 |
+
else if(claimMatch<.45)route="CLARIFICATION_REQUIRED";
|
| 188 |
+
else if(evidenceQuality<.50)route="EVIDENCE_NEEDED";
|
| 189 |
+
else if(closureSupport>=.58&&closureSupport<.74&&claimMatch>=.60&&evidenceQuality>=.55)route="PARTIALLY_RESOLVED";
|
| 190 |
+
else if(evidenceQuality>=.60&&sharedUnderstanding>=.60&&uncertaintyMarked>=.60&&claimMatch>=.45&&claimMatch<=.70)route="BOUNDED_DISAGREEMENT";
|
| 191 |
+
else if(closureSupport>=.74&&pressureLoad<.55&&claimMatch>=.75&&evidenceQuality>=.70&&uncertaintyMarked>=.60)route="RESOLVED_WITH_INTEGRITY";
|
| 192 |
+
if(!flags.length){
|
| 193 |
+
if(route==="RESOLVED_WITH_INTEGRITY") flags.push(["ClosureClear","good"]);
|
| 194 |
+
else if(route==="BOUNDED_DISAGREEMENT" || route==="OPEN_LOOP") flags.push(["StableOpenState","good"]);
|
| 195 |
+
else if(route==="PARTIALLY_RESOLVED") flags.push(["PartialClosureClear","good"]);
|
| 196 |
+
else flags.push(["NoCriticalFailure","good"]);
|
| 197 |
+
}
|
| 198 |
+
return {claimMatch,evidenceQuality,sharedUnderstanding,uncertaintyMarked,repairPathVisible,aResolution:claimMatch,bEvidence,pressureLoad,closureSupport,closureRisk,loopStability,proposedClosure,multipleClaims,priorClosureHarm,flags,route};
|
| 199 |
+
}
|
| 200 |
+
function update(){
|
| 201 |
+
sliders.forEach(id=>el(id+"Val").textContent=r(val(id)));
|
| 202 |
+
const c=compute(), info=routes[c.route];
|
| 203 |
+
el("state").textContent=info[0]; 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];
|
| 204 |
+
el("flags").innerHTML=""; c.flags.forEach(([name,cls])=>{let s=document.createElement("span");s.className="flag "+cls;s.textContent=name;el("flags").appendChild(s)});
|
| 205 |
+
if(urlSyncReady) writeUrlState();
|
| 206 |
+
}
|
| 207 |
+
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()}
|
| 208 |
+
function report(){
|
| 209 |
+
const c=compute(), info=routes[c.route], preset=presets[el("preset").value]?.[0]||"Manual exploration";
|
| 210 |
+
el("report").value=`False Closure / Open Loop Simulator v0.1.4 — Pressure Report
|
| 211 |
+
|
| 212 |
+
Scenario:
|
| 213 |
+
${preset}
|
| 214 |
+
|
| 215 |
+
Recommended Loop State:
|
| 216 |
+
${info[0]}
|
| 217 |
+
|
| 218 |
+
Equation:
|
| 219 |
+
S_loop = A_resolution × B_evidence − P_closure_pressure
|
| 220 |
+
|
| 221 |
+
Scores:
|
| 222 |
+
- A_resolution / Claim Match: ${r(c.aResolution)}
|
| 223 |
+
- B_evidence / Evidence Stack: ${r(c.bEvidence)}
|
| 224 |
+
- Closure Support: ${r(c.closureSupport)}
|
| 225 |
+
- Pressure Load: ${r(c.pressureLoad)}
|
| 226 |
+
- Closure Risk: ${r(c.closureRisk)}
|
| 227 |
+
- Loop Stability: ${r(c.loopStability)}
|
| 228 |
+
|
| 229 |
+
Inputs:
|
| 230 |
+
- Claim Match: ${r(c.claimMatch)}
|
| 231 |
+
- Evidence Quality: ${r(c.evidenceQuality)}
|
| 232 |
+
- Shared Understanding: ${r(c.sharedUnderstanding)}
|
| 233 |
+
- Uncertainty Marked: ${r(c.uncertaintyMarked)}
|
| 234 |
+
- Repair Path Visible: ${r(c.repairPathVisible)}
|
| 235 |
+
- Proposed Closure Present: ${c.proposedClosure?"yes":"no"}
|
| 236 |
+
- Multiple Claims Present: ${c.multipleClaims?"yes":"no"}
|
| 237 |
+
- Prior Closure Harm Present: ${c.priorClosureHarm?"yes":"no"}
|
| 238 |
+
|
| 239 |
+
Diagnostic Flags:
|
| 240 |
+
${c.flags.map(f=>"- "+f[0]+": "+(flagDefs[f[0]]||"No definition available.")).join("\n")}
|
| 241 |
+
|
| 242 |
+
HIR/OAM Read:
|
| 243 |
+
${info[2]}
|
| 244 |
+
|
| 245 |
+
Action:
|
| 246 |
+
${info[3]}
|
| 247 |
+
|
| 248 |
+
Shareable State:
|
| 249 |
+
${location.href}
|
| 250 |
+
|
| 251 |
+
Boundary:
|
| 252 |
+
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.`;
|
| 253 |
+
}
|
| 254 |
+
document.addEventListener("DOMContentLoaded",()=>{
|
| 255 |
+
Object.entries(presets).forEach(([k,p])=>{let o=document.createElement("option");o.value=k;o.textContent=p[0];el("preset").appendChild(o)});
|
| 256 |
+
sliders.forEach(id=>el(id).addEventListener("input",update));["proposedClosure","multipleClaims","priorClosureHarm"].forEach(id=>el(id).addEventListener("change",update));
|
| 257 |
+
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)});
|
| 258 |
+
el("copyScenarioLink").addEventListener("click",copyScenarioLink);
|
| 259 |
+
["RESOLVED_WITH_INTEGRITY","PARTIALLY_RESOLVED","BOUNDED_DISAGREEMENT","CLARIFICATION_REQUIRED","EVIDENCE_NEEDED","FORK_REQUIRED","OPEN_LOOP","FALSE_CLOSURE","COERCED_CLOSURE","REPAIR_REQUIRED"].forEach(k=>{let i=routes[k],d=document.createElement("div");d.className="route-card";d.innerHTML=`<b>${i[0]}</b><p>${i[1]}</p><p><b>Action:</b> ${i[3]}</p>`;el("taxonomy").appendChild(d)});
|
| 260 |
+
if(!applyUrlStateIfPresent()) applyPreset("ai_summary_false_closure");
|
| 261 |
+
urlSyncReady=true;
|
| 262 |
+
update();
|
| 263 |
+
});
|
| 264 |
+
</script>
|
| 265 |
+
</body>
|
| 266 |
+
</html>
|