Spaces:
Running
Running
init: keelwright static Space with architecture diagram
Browse files- README.md +16 -10
- index.html +292 -18
README.md
CHANGED
|
@@ -1,10 +1,16 @@
|
|
| 1 |
-
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
-
sdk: static
|
| 7 |
-
pinned: false
|
| 8 |
-
---
|
| 9 |
-
|
| 10 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
---
|
| 2 |
+
title: keelwright
|
| 3 |
+
emoji: 🛡️
|
| 4 |
+
colorFrom: green
|
| 5 |
+
colorTo: blue
|
| 6 |
+
sdk: static
|
| 7 |
+
pinned: false
|
| 8 |
+
---
|
| 9 |
+
|
| 10 |
+
# 🛡️ keelwright
|
| 11 |
+
|
| 12 |
+
**Engine for vibe-coders and loop-coders who ship AI-generated code they can't read line by line.**
|
| 13 |
+
|
| 14 |
+
28 machine-enforced safety checks. Catches SQL injection, hardcoded secrets, slopsquatting, reward hacking, doom loops, and more.
|
| 15 |
+
|
| 16 |
+
**GitHub:** [ratingtesting/keelwright](https://github.com/ratingtesting/keelwright) · **License:** CC BY 4.0
|
index.html
CHANGED
|
@@ -1,19 +1,293 @@
|
|
| 1 |
-
<!
|
| 2 |
-
<html>
|
| 3 |
-
|
| 4 |
-
|
| 5 |
-
|
| 6 |
-
|
| 7 |
-
|
| 8 |
-
|
| 9 |
-
|
| 10 |
-
|
| 11 |
-
|
| 12 |
-
|
| 13 |
-
|
| 14 |
-
|
| 15 |
-
|
| 16 |
-
|
| 17 |
-
|
| 18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 19 |
</html>
|
|
|
|
| 1 |
+
<!DOCTYPE html>
|
| 2 |
+
<html lang="en">
|
| 3 |
+
<head>
|
| 4 |
+
<script type="application/ld+json">
|
| 5 |
+
{
|
| 6 |
+
"@context": "https://schema.org",
|
| 7 |
+
"@type": "SoftwareSourceCode",
|
| 8 |
+
"name": "keelwright",
|
| 9 |
+
"description": "Engine for vibe-coders and loop-coders who ship AI-generated code they cannot read. 28 machine-enforced safety checks: SQL injection, hardcoded secrets, slopsquatting, reward hacking, doom loops, false reports, missing auth, business logic bypasses.",
|
| 10 |
+
"url": "https://github.com/ratingtesting/keelwright",
|
| 11 |
+
"license": "https://creativecommons.org/licenses/by/4.0/",
|
| 12 |
+
"author": {
|
| 13 |
+
"@type": "Organization",
|
| 14 |
+
"name": "ratingtesting",
|
| 15 |
+
"url": "https://github.com/ratingtesting"
|
| 16 |
+
},
|
| 17 |
+
"keywords": "vibe coding, loop coding, AI code security, guardrails, OWASP, SQL injection, secrets, slopsquatting, reward hacking, doom loop, circuit breaker, token burn, context rot, over-engineering, tech debt, code quality, non-programmer, autonomous coding",
|
| 18 |
+
"applicationCategory": "DeveloperApplication",
|
| 19 |
+
"operatingSystem": "cross-platform",
|
| 20 |
+
"softwareHelp": {
|
| 21 |
+
"@type": "CreativeWork",
|
| 22 |
+
"url": "https://github.com/ratingtesting/keelwright/blob/main/README.md"
|
| 23 |
+
}
|
| 24 |
+
}
|
| 25 |
+
</script>
|
| 26 |
+
<meta charset="UTF-8">
|
| 27 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
| 28 |
+
<title>Keelwright — Architecture</title>
|
| 29 |
+
<link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&display=swap" rel="stylesheet">
|
| 30 |
+
<style>
|
| 31 |
+
* { margin:0; padding:0; box-sizing:border-box; }
|
| 32 |
+
body {
|
| 33 |
+
background:#020617; color:#e2e8f0; font-family:'JetBrains Mono',monospace;
|
| 34 |
+
padding:40px 36px; width:1200px; font-size:22px; line-height:1.55;
|
| 35 |
+
background-image:
|
| 36 |
+
linear-gradient(#0b1220 1px,transparent 1px),
|
| 37 |
+
linear-gradient(90deg,#0b1220 1px,transparent 1px);
|
| 38 |
+
background-size:48px 48px;
|
| 39 |
+
}
|
| 40 |
+
.head { display:flex; align-items:center; gap:14px; margin-bottom:8px; }
|
| 41 |
+
.dot { width:16px; height:16px; border-radius:50%; background:#34d399; box-shadow:0 0 16px #34d399; animation:p 2s infinite; }
|
| 42 |
+
@keyframes p { 0%,100%{opacity:1} 50%{opacity:.35} }
|
| 43 |
+
h1 { font-size:40px; font-weight:700; letter-spacing:.5px; }
|
| 44 |
+
h1 .kw { color:#34d399; }
|
| 45 |
+
.sub { color:#64748b; font-size:18px; margin:2px 0 32px 30px; }
|
| 46 |
+
|
| 47 |
+
.layer { border-radius:14px; padding:24px 26px; margin-bottom:22px; position:relative; }
|
| 48 |
+
.ltag { position:absolute; top:-11px; left:20px; font-size:14px; letter-spacing:1.5px;
|
| 49 |
+
background:#020617; padding:0 10px; color:#64748b; text-transform:uppercase; }
|
| 50 |
+
.l-human { background:rgba(8,51,68,.35); border:2px solid #22d3ee; }
|
| 51 |
+
.l-ctrl { background:rgba(30,41,59,.5); border:2px solid #94a3b8; }
|
| 52 |
+
.l-build { background:rgba(6,78,59,.28); border:2px solid #34d399; }
|
| 53 |
+
.l-sup { background:transparent; border:none; padding:0; margin-bottom:18px; }
|
| 54 |
+
.l-ops { background:rgba(120,53,15,.22); border:2px dashed #fbbf24; }
|
| 55 |
+
|
| 56 |
+
.title { font-size:26px; font-weight:700; margin-bottom:12px; display:flex; align-items:center; gap:12px; }
|
| 57 |
+
.c-cyan{color:#22d3ee}.c-em{color:#34d399}.c-vi{color:#a78bfa}.c-am{color:#fbbf24}
|
| 58 |
+
.c-rose{color:#fb7185}.c-or{color:#fb923c}.c-sl{color:#94a3b8}
|
| 59 |
+
.star { color:#fbbf24; font-weight:700; }
|
| 60 |
+
.starstar { color:#fb923c; font-weight:700; }
|
| 61 |
+
|
| 62 |
+
/* 2-column grid for boxes */
|
| 63 |
+
.row2 { display:grid; grid-template-columns:1fr 1fr; gap:18px; }
|
| 64 |
+
.box { background:#0f172a; border-radius:10px; padding:16px 18px; font-size:22px; line-height:1.55; }
|
| 65 |
+
.muted { color:#94a3b8; }
|
| 66 |
+
.tiny { font-size:17px; color:#64748b; }
|
| 67 |
+
.catch { color:#fb7185; font-size:17px; }
|
| 68 |
+
.arrowdown { text-align:center; color:#34d399; font-size:30px; line-height:1; margin:6px 0; }
|
| 69 |
+
|
| 70 |
+
/* build loop steps */
|
| 71 |
+
.steps { display:flex; flex-direction:column; gap:12px; }
|
| 72 |
+
.step { display:flex; align-items:flex-start; gap:14px; background:#0f172a; border-left:4px solid #34d399;
|
| 73 |
+
border-radius:8px; padding:14px 18px; }
|
| 74 |
+
.step .n { color:#34d399; font-weight:700; min-width:32px; font-size:24px; }
|
| 75 |
+
.step .body { flex:1; font-size:20px; line-height:1.55; }
|
| 76 |
+
.step.sec { border-left-color:#fb7185; }
|
| 77 |
+
.step.verify { border-left-color:#22d3ee; }
|
| 78 |
+
.step.match { border-left-color:#a78bfa; background:rgba(76,29,149,.18); }
|
| 79 |
+
.loopback { display:flex; align-items:center; gap:10px; color:#34d399; font-size:14px;
|
| 80 |
+
justify-content:flex-end; margin-top:6px; }
|
| 81 |
+
|
| 82 |
+
/* Layer 3: 2-column + 1 */
|
| 83 |
+
.sup2 { display:grid; grid-template-columns:1fr 1fr; gap:18px; }
|
| 84 |
+
.supbox { background:#0f172a; border-radius:10px; padding:20px 22px; }
|
| 85 |
+
.supbox.cb { border-top:4px solid #fb923c; }
|
| 86 |
+
.supbox.st { border-top:4px solid #a78bfa; }
|
| 87 |
+
.supbox.sl { border-top:4px solid #22d3ee; }
|
| 88 |
+
.supbox h4 { font-size:24px; margin-bottom:10px; }
|
| 89 |
+
.supbox ul { list-style:none; font-size:19px; line-height:1.7; color:#cbd5e1; }
|
| 90 |
+
.crosscut { background:rgba(136,19,55,.25); border:2px solid #fb7185; border-radius:10px;
|
| 91 |
+
padding:16px 20px; margin-top:16px; font-size:18px; line-height:1.7; }
|
| 92 |
+
|
| 93 |
+
/* Layer 4: 3 nodes per row */
|
| 94 |
+
.ops-grid { display:grid; grid-template-columns:1fr 1fr 1fr; gap:12px; }
|
| 95 |
+
.ops-row2 { display:grid; grid-template-columns:1fr 1fr; gap:12px; margin-top:12px; }
|
| 96 |
+
.ops-node { background:#0f172a; border:2px solid #fbbf24; border-radius:10px; padding:16px 18px;
|
| 97 |
+
text-align:center; font-size:22px; }
|
| 98 |
+
.ops-node .em { display:block; font-size:28px; margin-bottom:4px; }
|
| 99 |
+
.ops-node .sub2 { font-size:16px; color:#94a3b8; margin-top:4px; }
|
| 100 |
+
.ops-arrow { color:#fbbf24; font-size:20px; text-align:center; }
|
| 101 |
+
.rollback { text-align:center; color:#fb7185; font-size:13px; margin-top:12px;
|
| 102 |
+
border-top:2px dashed #fb7185; padding-top:12px; }
|
| 103 |
+
|
| 104 |
+
/* Banner: 2 columns */
|
| 105 |
+
.banner2 { display:grid; grid-template-columns:1fr 1fr; gap:14px; margin-top:20px; }
|
| 106 |
+
.banner2 .bcard3 { grid-column:1 / -1; }
|
| 107 |
+
.bcard { background:#0f172a; border-radius:10px; padding:16px 18px; }
|
| 108 |
+
.bcard .h { font-size:24px; font-weight:700; margin-bottom:6px; }
|
| 109 |
+
.bcard .t { font-size:17px; color:#94a3b8; line-height:1.5; }
|
| 110 |
+
.b1{border-left:4px solid #fbbf24}.b2{border-left:4px solid #34d399}.b3{border-left:4px solid #22d3ee}
|
| 111 |
+
|
| 112 |
+
.foot { color:#475569; font-size:16px; margin-top:24px; text-align:center; letter-spacing:.5px; }
|
| 113 |
+
|
| 114 |
+
/* risk map: 2 columns */
|
| 115 |
+
.riskmap { background:rgba(136,19,55,.16); border:2px solid #fb7185; border-radius:14px;
|
| 116 |
+
padding:22px 22px 18px; margin-top:20px; position:relative; }
|
| 117 |
+
.riskmap .rtag { position:absolute; top:-11px; left:22px; font-size:12px; letter-spacing:1.2px;
|
| 118 |
+
background:#020617; padding:0 10px; color:#fb7185; text-transform:uppercase; }
|
| 119 |
+
.riskmap h3 { font-size:26px; font-weight:700; color:#fb7185; margin-bottom:4px; }
|
| 120 |
+
.riskmap .rsub { font-size:17px; color:#94a3b8; margin-bottom:18px; }
|
| 121 |
+
.rgrid { display:grid; grid-template-columns:1fr 1fr; gap:12px 18px; }
|
| 122 |
+
.ritem { background:#0f172a; border-radius:8px; padding:12px 16px; font-size:18px; line-height:1.5;
|
| 123 |
+
border-left:3px solid #34d399; }
|
| 124 |
+
.ritem.warn { border-left-color:#fbbf24; }
|
| 125 |
+
.ritem .rn { font-weight:700; color:#e2e8f0; }
|
| 126 |
+
.ritem .rm { color:#94a3b8; }
|
| 127 |
+
.ritem .rb { float:right; font-size:18px; }
|
| 128 |
+
.rlegend { font-size:16px; color:#64748b; margin-top:16px; line-height:1.7; }
|
| 129 |
+
.rlegend b { color:#94a3b8; }
|
| 130 |
+
</style>
|
| 131 |
+
</head>
|
| 132 |
+
<body>
|
| 133 |
+
<div class="head"><div class="dot"></div><h1><span class="kw">keelwright</span> — engine for vibe / loop coding</h1></div>
|
| 134 |
+
<div class="sub">a loop with nested loops · safety cannot be switched off · a human who does not read code stays in control</div>
|
| 135 |
+
|
| 136 |
+
<!-- LAYER 0 -->
|
| 137 |
+
<div class="layer l-human">
|
| 138 |
+
<span class="ltag">Layer 0 · the human</span>
|
| 139 |
+
<div class="title"><span class="c-cyan">▣ YOU</span> <span class="muted">(need not read code)</span> → GOAL + ACCEPTANCE CRITERIA ◄── PLAIN-LANGUAGE REPORT / BUILD</div>
|
| 140 |
+
<div class="tiny"><span class="star">★ DNA:</span> understands LOGIC, not syntax. Every gate below is translated to plain words — <span class="muted">"this checks the password is right"</span>, never "string arg to fn()".</div>
|
| 141 |
+
</div>
|
| 142 |
+
<div class="arrowdown">▼</div>
|
| 143 |
+
|
| 144 |
+
<!-- LAYER 1: 2×2 grid -->
|
| 145 |
+
<div class="layer l-ctrl">
|
| 146 |
+
<span class="ltag">Layer 1 · control</span>
|
| 147 |
+
<div class="row2">
|
| 148 |
+
<div class="box">
|
| 149 |
+
<div class="title"><span class="c-sl">🎛 AUTONOMY DIAL</span></div>
|
| 150 |
+
<div>Autopilot → Checkpoint → Copilot</div>
|
| 151 |
+
<div class="tiny"><span class="star">★</span> freedom = blast radius (auth / money / prod → Copilot: approve each)</div>
|
| 152 |
+
</div>
|
| 153 |
+
<div class="box">
|
| 154 |
+
<div class="title"><span class="c-sl">🗂 TRIAGE</span></div>
|
| 155 |
+
<div>Trivial · Low · Standard · High · Critical</div>
|
| 156 |
+
<div class="tiny"><span class="star">★</span> machinery = risk. Trivial → Express, no per-iter scans</div>
|
| 157 |
+
</div>
|
| 158 |
+
<div class="box">
|
| 159 |
+
<div class="title"><span class="c-sl">▸ PHASE 1–2</span></div>
|
| 160 |
+
<div>Requirements → Planning</div>
|
| 161 |
+
<div class="tiny"><span class="star">★</span> no acceptance criteria? ⛔ STOP, ask. Never invents scope</div>
|
| 162 |
+
</div>
|
| 163 |
+
<div class="box">
|
| 164 |
+
<div class="title"><span class="c-sl">⬚ LOOP DESIGN</span></div>
|
| 165 |
+
<div>5 whiteboard questions before any code</div>
|
| 166 |
+
<div class="tiny"><span class="star">★</span> trigger · check · action · stop · escalate — skip = demo</div>
|
| 167 |
+
</div>
|
| 168 |
+
</div>
|
| 169 |
+
</div>
|
| 170 |
+
<div class="arrowdown">▼</div>
|
| 171 |
+
|
| 172 |
+
<!-- LAYER 2 -->
|
| 173 |
+
<div class="layer l-build">
|
| 174 |
+
<span class="ltag">Layer 2 · the build loop (Phase 3 — one task = one turn, repeats)</span>
|
| 175 |
+
<div class="title"><span class="c-em">⟳ PHASE 3 · BUILDING</span> <span class="tiny">— discipline INSIDE writing, not cleanup afterward</span></div>
|
| 176 |
+
<div class="steps">
|
| 177 |
+
<div class="step"><span class="n">①</span><div class="body">@implementer writes (1 file/fn) ◄ <b>REUSE LADDER</b> — reuse before adding a lib/abstraction <span class="catch">· catches: over-engineering</span></div></div>
|
| 178 |
+
<div class="step"><span class="n">②</span><div class="body"><b>BACKPRESSURE GATES:</b> tests │ typecheck │ lint │ build</div></div>
|
| 179 |
+
<div class="step"><span class="n">③</span><div class="body"><b>STRUCTURAL-INTEGRITY GATE</b> <span class="star">★</span> jscpd·lizard·madge/import-linter·eslint-boundaries·knip/vulture <span class="catch">· catches: spaghetti, lava flow, tangled deps</span></div></div>
|
| 180 |
+
<div class="step sec"><span class="n">④</span><div class="body"><span class="c-rose">🛡 SECURITY GATES R1–R12</span> <span class="starstar">★★</span> machine-enforced, cannot disable even on Autopilot <span class="catch">· catches: OWASP·secrets·slopsquat·IDOR</span></div></div>
|
| 181 |
+
<div class="step sec"><span class="n">⑤</span><div class="body"><span class="c-rose">🔍 R3 BUSINESS-LOGIC REVIEW</span> ► spawn @reviewer (fresh context) <span class="star">★</span> NOT self-review <span class="catch">· catches: happy-path bias, auth holes</span></div></div>
|
| 182 |
+
<div class="step verify"><span class="n">⑦</span><div class="body"><span class="c-cyan">✅ VERIFICATION GATE</span> <span class="starstar">★★</span> read+compile+diff · test red→green · not tautological · ad-hoc <span class="catch">· catches: "works on my machine", "I fixed it" with no diff</span></div></div>
|
| 183 |
+
<div class="step match"><span class="n">⑧</span><div class="body"><span class="c-vi">⟲ MATCH LOOP (nested sub-loop)</span> <span class="star">★</span> Generator ⇄ Analyst: render → browser → numeric a11y (contrast≥4.5:1 · no overflow · sizes) — repeat until convergence</div></div>
|
| 184 |
+
<div class="step"><span class="n">⑨</span><div class="body">git commit (atomic) ► ⑩ PROGRESS.md + STATUS + tool-budget count</div></div>
|
| 185 |
+
<div class="step"><span class="n">⑪</span><div class="body">cadence: /3 → STABILITY scan · /10 → AUTORESEARCH · /N → refactor checkpoint</div></div>
|
| 186 |
+
</div>
|
| 187 |
+
<div class="loopback">↩ LOOP BACK — next task, while tasks remain</div>
|
| 188 |
+
</div>
|
| 189 |
+
<div class="arrowdown">▼ perimeter supervision ▼</div>
|
| 190 |
+
|
| 191 |
+
<!-- LAYER 3: 2-column -->
|
| 192 |
+
<div class="l-sup">
|
| 193 |
+
<div class="sup2">
|
| 194 |
+
<div class="supbox cb">
|
| 195 |
+
<h4><span class="c-or">🚦 CIRCUIT-BREAKER</span></h4>
|
| 196 |
+
<ul>
|
| 197 |
+
<li class="catch">catches: doom loop + token/$ burn</li>
|
| 198 |
+
<li>4 caps: 50 iters / 5 no-progress / 2h / 3× repeat</li>
|
| 199 |
+
<li>+ RATE LIMITING (event-driven loops)</li>
|
| 200 |
+
<li>+ PER-ITER BUDGETS ≤10 shell / 5 file / 3 external</li>
|
| 201 |
+
<li>→ graceful STOP with report</li>
|
| 202 |
+
</ul>
|
| 203 |
+
</div>
|
| 204 |
+
<div class="supbox st">
|
| 205 |
+
<h4><span class="c-vi">📉 STABILITY (5 modes)</span></h4>
|
| 206 |
+
<ul>
|
| 207 |
+
<li class="catch">catches: goal drift, oscillation, thrash</li>
|
| 208 |
+
<li>dead-retry · oscillation · drift · amplification · feedback-starvation</li>
|
| 209 |
+
<li>ESCALATION: 3→REFINE 5→PIVOT 2→ask 3→blocker</li>
|
| 210 |
+
<li>+ CONTEXT COMPACTION (iter > 20)</li>
|
| 211 |
+
<li>a "keep" resets the counters</li>
|
| 212 |
+
</ul>
|
| 213 |
+
</div>
|
| 214 |
+
</div>
|
| 215 |
+
<!-- Self-learning: full width -->
|
| 216 |
+
<div class="supbox sl" style="margin-top:14px;">
|
| 217 |
+
<h4><span class="c-cyan">🔄 SELF-LEARNING</span> <span class="star">★</span></h4>
|
| 218 |
+
<ul>
|
| 219 |
+
<li>Phoenix: root-cause of repeats ACROSS sessions</li>
|
| 220 |
+
<li>Autoresearch: lessons → memory (promote on repeat)</li>
|
| 221 |
+
<li class="catch">learns, doesn't repeat the same mistake</li>
|
| 222 |
+
</ul>
|
| 223 |
+
</div>
|
| 224 |
+
<div class="crosscut">
|
| 225 |
+
<span class="starstar">★★ REWARD-HACKING GUARD</span> — never weaken/delete a test to go green; fix the code, not the metric. ·
|
| 226 |
+
<b>PERSONAS</b> (delegate_task): @architect @implementer @tester @reviewer @architecture-critic @visual-qa ·
|
| 227 |
+
<b>STRUCTURED FEEDBACK</b> into each iteration: relevant code + intent + "repeat vs new" flag — not a raw stack-trace dump.
|
| 228 |
+
</div>
|
| 229 |
+
</div>
|
| 230 |
+
|
| 231 |
+
<!-- LAYER 4: 3 per row + 2 -->
|
| 232 |
+
<div class="layer l-ops">
|
| 233 |
+
<span class="ltag">Layer 4 · outer operational cycle (production lifecycle)</span>
|
| 234 |
+
<div class="ops-grid">
|
| 235 |
+
<div class="ops-node"><span class="em">🔭</span>OBSERVE<span class="sub2">read prod logs/reports</span></div>
|
| 236 |
+
<div class="ops-node"><span class="em">🩺</span>ANALYZE<span class="sub2">root-cause + plan</span></div>
|
| 237 |
+
<div class="ops-node"><span class="em">🔧</span>FIX<span class="sub2">run the build loop</span></div>
|
| 238 |
+
</div>
|
| 239 |
+
<div class="ops-row2">
|
| 240 |
+
<div class="ops-node"><span class="em">✅</span>VALIDATE<span class="sub2">post-deploy metric compare</span></div>
|
| 241 |
+
<div class="ops-node"><span class="em">🎓</span>LEARN<span class="sub2">update lessons</span></div>
|
| 242 |
+
</div>
|
| 243 |
+
<div class="rollback">⭐ verify-in-production + AUTO-ROLLBACK (git revert, not force-push) — a bad deploy that passes tests is caught by the metric, not by a human · ⚡ PARALLEL: independent subtasks fan out as separate empty-context loops</div>
|
| 244 |
+
</div>
|
| 245 |
+
|
| 246 |
+
<!-- BANNER: 2-column + 1 full -->
|
| 247 |
+
<div class="banner2">
|
| 248 |
+
<div class="bcard b1"><div class="h"><span class="c-am">🔒 BATTLE-TESTED QA ★★★</span></div><div class="t">A/B (control vs skill), fact-checked on disk, not self-report — published WITH an honest adversarial report.</div></div>
|
| 249 |
+
<div class="bcard b2"><div class="h"><span class="c-em">💸 ZERO INSTALL · ZERO COST</span></div><div class="t">Plain markdown that orchestrates free, permissively-licensed tools. Full transparency, nothing to buy.</div></div>
|
| 250 |
+
<div class="bcard b3"><div class="h"><span class="c-cyan">🗣 PLAIN-LANGUAGE THROUGHOUT</span></div><div class="t">Built for people who read product logic, not code syntax. Every gate speaks human.</div></div>
|
| 251 |
+
</div>
|
| 252 |
+
|
| 253 |
+
<!-- RISK MAP: 2 columns -->
|
| 254 |
+
<div class="riskmap">
|
| 255 |
+
<span class="rtag">documented 2026</span>
|
| 256 |
+
<h3>🗺 VIBE/LOOP-CODING RISK MAP → WHAT KEELWRIGHT COVERS</h3>
|
| 257 |
+
<div class="rsub">Every known vibe/loop-coding pain → the mechanism that closes it. <span class="c-em">✅</span> = machine-enforced / on-disk · <span class="c-am">⚠</span> = partial (honest: no cheap machine detector)</div>
|
| 258 |
+
<div class="rgrid">
|
| 259 |
+
<div class="ritem"><span class="rn">Context rot / decay</span><span class="rb">✅</span><br><span class="rm">fresh-context + PROGRESS.md</span></div>
|
| 260 |
+
<div class="ritem"><span class="rn">Ralph (Wiggum) loop</span><span class="rb">✅</span><br><span class="rm">state in files, not chat</span></div>
|
| 261 |
+
<div class="ritem"><span class="rn">Spaghetti / big ball of mud</span><span class="rb">✅</span><br><span class="rm">structural-integrity gate ③</span></div>
|
| 262 |
+
<div class="ritem"><span class="rn">Lava flow (dead code)</span><span class="rb">✅</span><br><span class="rm">knip / vulture</span></div>
|
| 263 |
+
<div class="ritem"><span class="rn">Dependency hell</span><span class="rb">✅</span><br><span class="rm">reuse ladder + dep vetting</span></div>
|
| 264 |
+
<div class="ritem"><span class="rn">Slopsquatting</span><span class="rb">✅</span><br><span class="rm">R8 verify + GuardDog</span></div>
|
| 265 |
+
<div class="ritem"><span class="rn">"Works on my machine"</span><span class="rb">✅</span><br><span class="rm">verification gate ⑦</span></div>
|
| 266 |
+
<div class="ritem"><span class="rn">Reward hacking / spec gaming</span><span class="rb">✅</span><br><span class="rm">reward-hacking guard</span></div>
|
| 267 |
+
<div class="ritem"><span class="rn">Doom loop / death loop</span><span class="rb">✅</span><br><span class="rm">circuit-breaker + budgets</span></div>
|
| 268 |
+
<div class="ritem"><span class="rn">Goal drift</span><span class="rb">✅</span><br><span class="rm">Stability L3 + goal re-read</span></div>
|
| 269 |
+
<div class="ritem"><span class="rn">Happy-path bias</span><span class="rb">✅</span><br><span class="rm">R3 business-logic review</span></div>
|
| 270 |
+
<div class="ritem"><span class="rn">Tech debt (80% problem)</span><span class="rb">✅</span><br><span class="rm">R4 prod checklist</span></div>
|
| 271 |
+
<div class="ritem"><span class="rn">Secret leakage</span><span class="rb">✅</span><br><span class="rm">R2 Gitleaks</span></div>
|
| 272 |
+
<div class="ritem"><span class="rn">SQL injection / OWASP</span><span class="rb">✅</span><br><span class="rm">R1 Semgrep + review</span></div>
|
| 273 |
+
<div class="ritem"><span class="rn">Reasoning-action (said≠did)</span><span class="rb">✅</span><br><span class="rm">R7 + verification</span></div>
|
| 274 |
+
<div class="ritem"><span class="rn">Malicious 3rd-party skill</span><span class="rb">✅</span><br><span class="rm">R11 SkillSpector audit</span></div>
|
| 275 |
+
<div class="ritem"><span class="rn">Token / budget burn</span><span class="rb">✅</span><br><span class="rm">per-iteration budgets</span></div>
|
| 276 |
+
<div class="ritem"><span class="rn">Regression passes tests</span><span class="rb">✅</span><br><span class="rm">post-deploy + rollback</span></div>
|
| 277 |
+
<div class="ritem"><span class="rn">Human as bottleneck</span><span class="rb">✅</span><br><span class="rm">autonomy dial + parallel</span></div>
|
| 278 |
+
<div class="ritem warn"><span class="rn">Design-for-failure</span><span class="rb">⚠</span><br><span class="rm">R5 fault checklist (warn)</span></div>
|
| 279 |
+
<div class="ritem warn"><span class="rn">Sycophancy</span><span class="rb">⚠</span><br><span class="rm">R7 catches false claims, not trait</span></div>
|
| 280 |
+
<div class="ritem warn"><span class="rn">Multi-agent cascade / mem-poison</span><span class="rb">⚠</span><br><span class="rm">R10 verify-before-memory (warn)</span></div>
|
| 281 |
+
<div class="ritem warn"><span class="rn">Model version drift</span><span class="rb">⚠</span><br><span class="rm">R9 pin (warn)</span></div>
|
| 282 |
+
<div class="ritem warn"><span class="rn">Style / consistency drift</span><span class="rb">⚠</span><br><span class="rm">critic + Pink Flag (no machine detector)</span></div>
|
| 283 |
+
<div class="ritem warn"><span class="rn">Confabulation / fabricated facts</span><span class="rb">⚠</span><br><span class="rm">factual-grounding: verify-before-assert</span></div>
|
| 284 |
+
<div class="ritem"><span class="rn">Loop design absence</span><span class="rb">✅</span><br><span class="rm">5 whiteboard questions</span></div>
|
| 285 |
+
<div class="ritem"><span class="rn">Context rot in long loops</span><span class="rb">✅</span><br><span class="rm">compaction (trim/summarize/delegate)</span></div>
|
| 286 |
+
<div class="ritem"><span class="rn">Event storm / rate limiting</span><span class="rb">✅</span><br><span class="rm">rate limit + debounce + backpressure</span></div>
|
| 287 |
+
</div>
|
| 288 |
+
<div class="rlegend"><b>Honesty as a feature:</b> three ⚠ (style consistency, sycophancy-as-trait, confabulation) cannot be closed by a cheap machine detector — keelwright catches their measurable consequences and enforces verification discipline, not the disposition itself. Everything marked ✅ is machine-enforced or verified on disk, not "eyeball it."</div>
|
| 289 |
+
</div>
|
| 290 |
+
|
| 291 |
+
<div class="foot">keelwright by ratingtesting · CC BY 4.0 · source of truth: assets/architecture.md</div>
|
| 292 |
+
</body>
|
| 293 |
</html>
|