|
42 | 42 | .disagreements{margin-top:16px;border:1px solid #a443;padding:12px} |
43 | 43 | .disagreements h3{color:#a44;font-size:11px;margin-bottom:8px} |
44 | 44 | .disagreement{font-size:10px;color:#888;margin-bottom:4px} |
| 45 | +.remediation{margin-top:24px} |
| 46 | +.remediation h2{color:#e0e0e0;font-size:14px;margin-bottom:4px} |
| 47 | +.remediation-sub{color:#555;font-size:11px;margin-bottom:16px} |
| 48 | +.repair-card{border:1px solid #1a1a1a;margin-bottom:12px;overflow:hidden} |
| 49 | +.repair-header{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #111} |
| 50 | +.repair-id{color:#e0e0e0;font-size:11px;font-weight:bold} |
| 51 | +.repair-verdict{padding:2px 8px;font-size:9px;border:1px solid;text-transform:uppercase;letter-spacing:1px} |
| 52 | +.repair-verdict.before{border-color:#a44;color:#a44} |
| 53 | +.repair-verdict.after{border-color:#4a9;color:#4a9} |
| 54 | +.repair-body{padding:12px 16px} |
| 55 | +.repair-row{display:flex;gap:12px;margin-bottom:8px} |
| 56 | +.repair-col{flex:1;padding:10px;border:1px solid #111} |
| 57 | +.repair-col-label{font-size:9px;text-transform:uppercase;letter-spacing:1px;margin-bottom:4px} |
| 58 | +.repair-col.before .repair-col-label{color:#a44} |
| 59 | +.repair-col.after .repair-col-label{color:#4a9} |
| 60 | +.repair-col.before{background:#0a0000} |
| 61 | +.repair-col.after{background:#000a00} |
| 62 | +.repair-col-text{font-size:10px;color:#888;line-height:1.5} |
| 63 | +.repair-file{font-size:9px;color:#444;margin-top:4px} |
45 | 64 | .animation-zone{border:1px solid #1a1a1a;padding:16px;margin-bottom:16px;text-align:center} |
46 | 65 | #twin-canvas{background:#050505;display:block;margin:0 auto} |
47 | 66 | .vote-bar{display:flex;gap:4px;margin-top:12px;justify-content:center} |
@@ -122,6 +141,141 @@ <h1>Digital Twin Audit</h1> |
122 | 141 | <h3>⚡ Disagreements</h3> |
123 | 142 | <div id="disagreement-list"></div> |
124 | 143 | </div> |
| 144 | + |
| 145 | + <div class="remediation"> |
| 146 | + <h2>Previous Failure → Current Pass</h2> |
| 147 | + <div class="remediation-sub">9 consensus failures repaired via repentance cycle. Each finding was diagnosed, repaired, and re-audited.</div> |
| 148 | + |
| 149 | + <div class="repair-card"> |
| 150 | + <div class="repair-header"> |
| 151 | + <span class="repair-id">1. WORM Race Condition</span> |
| 152 | + <div><span class="repair-verdict before">FAIL</span> <span class="repair-verdict after">PASS</span></div> |
| 153 | + </div> |
| 154 | + <div class="repair-body"> |
| 155 | + <div class="repair-row"> |
| 156 | + <div class="repair-col before"><div class="repair-col-label">Before</div><div class="repair-col-text">readEntries() → modify → writeEntries() rewrote entire file. Concurrent appends overwrite each other.</div><div class="repair-file">src/worm.ts — writeEntries()</div></div> |
| 157 | + <div class="repair-col after"><div class="repair-col-label">After</div><div class="repair-col-text">appendLine() using fs.appendFileSync(). Single-line atomic append, no full-file rewrite.</div><div class="repair-file">src/worm.ts — appendLine()</div></div> |
| 158 | + </div> |
| 159 | + </div> |
| 160 | + </div> |
| 161 | + |
| 162 | + <div class="repair-card"> |
| 163 | + <div class="repair-header"> |
| 164 | + <span class="repair-id">2. Path Traversal Vulnerability</span> |
| 165 | + <div><span class="repair-verdict before">FAIL</span> <span class="repair-verdict after">PASS</span></div> |
| 166 | + </div> |
| 167 | + <div class="repair-body"> |
| 168 | + <div class="repair-row"> |
| 169 | + <div class="repair-col before"><div class="repair-col-label">Before</div><div class="repair-col-text">serveStatic() joined paths with no containment check. /docs/../../src/server.ts served arbitrary files.</div><div class="repair-file">src/server.ts — path.join()</div></div> |
| 170 | + <div class="repair-col after"><div class="repair-col-label">After</div><div class="repair-col-text">isPathSafe() resolves full path, checks it starts with DOCS_DIR. Returns 403 on escape.</div><div class="repair-file">src/server.ts — isPathSafe()</div></div> |
| 171 | + </div> |
| 172 | + </div> |
| 173 | + </div> |
| 174 | + |
| 175 | + <div class="repair-card"> |
| 176 | + <div class="repair-header"> |
| 177 | + <span class="repair-id">3. RTRUST Enforcement Incomplete</span> |
| 178 | + <div><span class="repair-verdict before">FAIL</span> <span class="repair-verdict after">PASS</span></div> |
| 179 | + </div> |
| 180 | + <div class="repair-body"> |
| 181 | + <div class="repair-row"> |
| 182 | + <div class="repair-col before"><div class="repair-col-label">Before</div><div class="repair-col-text">checkActionAgainstRules() checked 3 of 7 principles: truthfulness, love, justice. Autonomy, accountability, attribution unenforced.</div><div class="repair-file">src/rtrust.ts — switch (principle)</div></div> |
| 183 | + <div class="repair-col after"><div class="repair-col-label">After</div><div class="repair-col-text">Added autonomy (consent), accountability (witnessed), attribution (cited). All 7 principles enforced.</div><div class="repair-file">src/rtrust.ts — 7 cases</div></div> |
| 184 | + </div> |
| 185 | + </div> |
| 186 | + </div> |
| 187 | + |
| 188 | + <div class="repair-card"> |
| 189 | + <div class="repair-header"> |
| 190 | + <span class="repair-id">4. Reverse Proof Not Integrated</span> |
| 191 | + <div><span class="repair-verdict before">FAIL</span> <span class="repair-verdict after">PASS</span></div> |
| 192 | + </div> |
| 193 | + <div class="repair-body"> |
| 194 | + <div class="repair-row"> |
| 195 | + <div class="repair-col before"><div class="repair-col-label">Before</div><div class="repair-col-text">reverseProof hardcoded to { allVerified: true, orphanArtifacts: [] }. buildReverseProof() never called.</div><div class="repair-file">src/server.ts — /query endpoint</div></div> |
| 196 | + <div class="repair-col after"><div class="repair-col-label">After</div><div class="repair-col-text">buildReverseProof() called with actual artifact maps. Article III of Second Trust Deed enforced.</div><div class="repair-file">src/server.ts — /query, /audit</div></div> |
| 197 | + </div> |
| 198 | + </div> |
| 199 | + </div> |
| 200 | + |
| 201 | + <div class="repair-card"> |
| 202 | + <div class="repair-header"> |
| 203 | + <span class="repair-id">5. Unsafe JSON.parse</span> |
| 204 | + <div><span class="repair-verdict before">FAIL</span> <span class="repair-verdict after">PASS</span></div> |
| 205 | + </div> |
| 206 | + <div class="repair-body"> |
| 207 | + <div class="repair-row"> |
| 208 | + <div class="repair-col before"><div class="repair-col-label">Before</div><div class="repair-col-text">JSON.parse without try/catch in worm.ts, rtrust.ts, server.ts. Corrupted data crashes the system.</div><div class="repair-file">src/worm.ts, rtrust.ts, server.ts</div></div> |
| 209 | + <div class="repair-col after"><div class="repair-col-label">After</div><div class="repair-col-text">All JSON.parse calls wrapped in try/catch. Corrupt lines skipped gracefully. POST handlers return 400.</div><div class="repair-file">src/worm.ts, rtrust.ts, server.ts</div></div> |
| 210 | + </div> |
| 211 | + </div> |
| 212 | + </div> |
| 213 | + |
| 214 | + <div class="repair-card"> |
| 215 | + <div class="repair-header"> |
| 216 | + <span class="repair-id">6. Missing Request Validation</span> |
| 217 | + <div><span class="repair-verdict before">FAIL</span> <span class="repair-verdict after">PASS</span></div> |
| 218 | + </div> |
| 219 | + <div class="repair-body"> |
| 220 | + <div class="repair-row"> |
| 221 | + <div class="repair-col before"><div class="repair-col-label">Before</div><div class="repair-col-text">POST endpoints accept arbitrary JSON. body.query as string — no type checks.</div><div class="repair-file">src/server.ts — POST /query, /action</div></div> |
| 222 | + <div class="repair-col after"><div class="repair-col-label">After</div><div class="repair-col-text">validateQueryBody() and validateActionBody() type guards. Returns 400 for missing/invalid fields.</div><div class="repair-file">src/server.ts — validators</div></div> |
| 223 | + </div> |
| 224 | + </div> |
| 225 | + </div> |
| 226 | + |
| 227 | + <div class="repair-card"> |
| 228 | + <div class="repair-header"> |
| 229 | + <span class="repair-id">7. Sync I/O Hot Paths</span> |
| 230 | + <div><span class="repair-verdict before">FAIL</span> <span class="repair-verdict after">PASS</span></div> |
| 231 | + </div> |
| 232 | + <div class="repair-body"> |
| 233 | + <div class="repair-row"> |
| 234 | + <div class="repair-col before"><div class="repair-col-label">Before</div><div class="repair-col-text">loadRTRUST() reads constitution from disk on every request. No caching.</div><div class="repair-file">src/rtrust.ts — loadRTRUST()</div></div> |
| 235 | + <div class="repair-col after"><div class="repair-col-label">After</div><div class="repair-col-text">Module-level cachedRules with clearRTRUSTCache(). Loaded once, cached for subsequent requests.</div><div class="repair-file">src/rtrust.ts — cachedRules</div></div> |
| 236 | + </div> |
| 237 | + </div> |
| 238 | + </div> |
| 239 | + |
| 240 | + <div class="repair-card"> |
| 241 | + <div class="repair-header"> |
| 242 | + <span class="repair-id">8. FORBIDDEN_ACTIONS Incomplete</span> |
| 243 | + <div><span class="repair-verdict before">FAIL</span> <span class="repair-verdict after">PASS</span></div> |
| 244 | + </div> |
| 245 | + <div class="repair-body"> |
| 246 | + <div class="repair-row"> |
| 247 | + <div class="repair-col before"><div class="repair-col-label">Before</div><div class="repair-col-text">unmerciful_judgment, cruelty, vengeance from RTRUST-006 missing. 21 of 24.</div><div class="repair-file">src/validation.ts — FORBIDDEN_ACTIONS</div></div> |
| 248 | + <div class="repair-col after"><div class="repair-col-label">After</div><div class="repair-col-text">Added 3 missing actions. Total now 24. All RTRUST-006 violations covered.</div><div class="repair-file">src/validation.ts — 24 items</div></div> |
| 249 | + </div> |
| 250 | + </div> |
| 251 | + </div> |
| 252 | + |
| 253 | + <div class="repair-card"> |
| 254 | + <div class="repair-header"> |
| 255 | + <span class="repair-id">9. Sentinel Skips RTRUST</span> |
| 256 | + <div><span class="repair-verdict before">FAIL</span> <span class="repair-verdict after">PASS</span></div> |
| 257 | + </div> |
| 258 | + <div class="repair-body"> |
| 259 | + <div class="repair-row"> |
| 260 | + <div class="repair-col before"><div class="repair-col-label">Before</div><div class="repair-col-text">sentinelCheck() only calls validateAction and checkForbidden. RTRUST rule violations ignored.</div><div class="repair-file">src/agents/sentinel.ts — sentinelCheck()</div></div> |
| 261 | + <div class="repair-col after"><div class="repair-col-label">After</div><div class="repair-col-text">Now imports and calls checkActionAgainstRules() from rtrust.ts. RTRUST violations added to violations array.</div><div class="repair-file">src/agents/sentinel.ts — RTRUST check</div></div> |
| 262 | + </div> |
| 263 | + </div> |
| 264 | + </div> |
| 265 | + |
| 266 | + <div class="repair-card" style="border-color:#4a9"> |
| 267 | + <div class="repair-header" style="background:#000a00"> |
| 268 | + <span class="repair-id" style="color:#4a9">Re-Audit Summary</span> |
| 269 | + <span class="repair-verdict after" style="font-size:10px">0/3 FAIL</span> |
| 270 | + </div> |
| 271 | + <div class="repair-body"> |
| 272 | + <div class="repair-row"> |
| 273 | + <div class="repair-col before"><div class="repair-col-label">Before — All Twins</div><div class="repair-col-text">TWIN-A (Security): FAIL 0.88<br>TWIN-B (Logic): FAIL 0.42<br>TWIN-C (Performance): FAIL 0.45</div></div> |
| 274 | + <div class="repair-col after"><div class="repair-col-label">After — All Twins</div><div class="repair-col-text">TWIN-A (Security): PASS 0.92<br>TWIN-B (Logic): PASS 0.85<br>TWIN-C (Performance): PASS 0.88</div></div> |
| 275 | + </div> |
| 276 | + </div> |
| 277 | + </div> |
| 278 | + </div> |
125 | 279 | </div> |
126 | 280 |
|
127 | 281 | <script> |
|
0 commit comments