Repository navigation
Expand file tree
/
Copy pathfixlayer-evidence.html
More file actions
391 lines (357 loc) · 22.8 KB
/
Copy pathfixlayer-evidence.html
File metadata and controls
391 lines (357 loc) · 22.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>FixLayer Evidence — same failure, two endings</title>
<meta name="description" content="Two real Terminal-Bench trajectories hit the identical git merge failure. One run carried a workaround derived mechanically from the CLI Agent Spec (§13) and fixed it inline. Trace-level evidence.">
<meta property="og:title" content="FixLayer Evidence — same failure, two endings">
<meta property="og:description" content="A merge conflict, unrecovered vs fixed inline by a spec-derived §13 workaround. Real trace evidence from Terminal-Bench.">
<meta property="og:type" content="website">
<meta name="twitter:card" content="summary_large_image">
<script>(function(){var t=localStorage.getItem('theme');if(t&&t!=='auto')document.documentElement.setAttribute('data-theme',t);}());</script>
<style>
:root{
--bg:#0d1117; --bg2:#161b22; --bg3:#21262d;
--border:#30363d; --text:#e6edf3; --muted:#8b949e;
--red:#f85149; --orange:#f0883e; --green:#3fb950; --accent:#58a6ff; --purple:#bc8cff;
--code-bg:#0d1117; --code-text:#a5d6ff;
--red-dim:rgba(248,81,73,0.12); --red-line:rgba(248,81,73,0.35);
--green-dim:rgba(63,185,80,0.10); --green-line:rgba(63,185,80,0.35);
--accent-dim:rgba(88,166,255,0.10); --accent-line:rgba(88,166,255,0.30);
}
@media (prefers-color-scheme: light){
:root{
--bg:#ffffff; --bg2:#f6f8fa; --bg3:#eaeef2;
--border:#d0d7de; --text:#1f2328; --muted:#57606a;
--red:#cf222e; --orange:#bc4c00; --green:#1a7f37; --accent:#0969da; --purple:#8250df;
--code-bg:#f6f8fa; --code-text:#24292f;
--red-dim:rgba(207,34,46,0.08); --red-line:rgba(207,34,46,0.30);
--green-dim:rgba(26,127,55,0.08); --green-line:rgba(26,127,55,0.30);
--accent-dim:rgba(9,105,218,0.08); --accent-line:rgba(9,105,218,0.28);
}
}
:root[data-theme="dark"]{
--bg:#0d1117; --bg2:#161b22; --bg3:#21262d;
--border:#30363d; --text:#e6edf3; --muted:#8b949e;
--red:#f85149; --orange:#f0883e; --green:#3fb950; --accent:#58a6ff; --purple:#bc8cff;
--code-bg:#0d1117; --code-text:#a5d6ff;
--red-dim:rgba(248,81,73,0.12); --red-line:rgba(248,81,73,0.35);
--green-dim:rgba(63,185,80,0.10); --green-line:rgba(63,185,80,0.35);
--accent-dim:rgba(88,166,255,0.10); --accent-line:rgba(88,166,255,0.30);
}
:root[data-theme="light"]{
--bg:#ffffff; --bg2:#f6f8fa; --bg3:#eaeef2;
--border:#d0d7de; --text:#1f2328; --muted:#57606a;
--red:#cf222e; --orange:#bc4c00; --green:#1a7f37; --accent:#0969da; --purple:#8250df;
--code-bg:#f6f8fa; --code-text:#24292f;
--red-dim:rgba(207,34,46,0.08); --red-line:rgba(207,34,46,0.30);
--green-dim:rgba(26,127,55,0.08); --green-line:rgba(26,127,55,0.30);
--accent-dim:rgba(9,105,218,0.08); --accent-line:rgba(9,105,218,0.28);
}
*{box-sizing:border-box}
body{
font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",Helvetica,Arial,sans-serif;
background:var(--bg); color:var(--text); line-height:1.6; font-size:16px;
margin:0; padding:0 1.25rem 4rem;
}
code, pre, .mono{font-family:"SFMono-Regular",Consolas,"Liberation Mono",Menlo,monospace}
.wrap{max-width:960px; margin:0 auto}
.prose{max-width:68ch}
/* ── Header ── */
header{padding:3rem 0 2rem}
.badge{
display:inline-block; background:var(--accent-dim); border:1px solid var(--accent-line);
color:var(--accent); font-size:0.72rem; font-weight:700; padding:0.22rem 0.7rem;
border-radius:20px; letter-spacing:0.06em; text-transform:uppercase; margin-bottom:1.1rem;
}
h1{font-size:2rem; font-weight:800; letter-spacing:-0.02em; margin:0 0 0.6rem; text-wrap:balance; line-height:1.2}
h1 em{color:var(--accent); font-style:normal}
.sub{color:var(--muted); margin:0 0 1.4rem; max-width:62ch}
.meta{font-size:0.8rem; color:var(--muted)}
.meta code{background:var(--bg3); padding:0.1rem 0.4rem; border-radius:4px; font-size:0.78rem}
/* ── Stat strip ── */
.stats{display:flex; gap:0.75rem; flex-wrap:wrap; margin:1.6rem 0 0}
.stat{
flex:1 1 150px; background:var(--bg2); border:1px solid var(--border);
border-radius:8px; padding:0.85rem 1rem;
}
.stat .k{font-size:0.7rem; font-weight:700; letter-spacing:0.07em; text-transform:uppercase; color:var(--muted)}
.stat .v{font-size:1.45rem; font-weight:800; letter-spacing:-0.01em; font-variant-numeric:tabular-nums; margin-top:0.15rem}
.stat .v.red{color:var(--red)} .stat .v.green{color:var(--green)} .stat .v.accent{color:var(--accent)}
.stat .n{font-size:0.74rem; color:var(--muted); margin-top:0.1rem}
/* ── Section headings ── */
h2{font-size:1.15rem; font-weight:800; letter-spacing:-0.01em; margin:3rem 0 0.4rem}
h2 .tick{color:var(--muted); font-weight:400}
.lede{color:var(--muted); font-size:0.92rem; margin:0 0 1.2rem; max-width:64ch}
/* ── Trace steps ── */
.trace{display:flex; flex-direction:column; gap:0.5rem}
.step{
background:var(--bg2); border:1px solid var(--border); border-radius:8px;
padding:0.7rem 0.9rem; overflow-x:auto;
}
.step .who{font-size:0.68rem; font-weight:700; letter-spacing:0.07em; text-transform:uppercase; color:var(--muted); margin-bottom:0.3rem}
.step .who .ok{color:var(--green)} .step .who .bad{color:var(--red)}
.step pre{margin:0; font-size:0.78rem; line-height:1.55; color:var(--code-text); white-space:pre}
.step pre b{color:var(--text); font-weight:600}
.step pre .c{color:var(--muted)}
.step pre .r{color:var(--red)} .step pre .g{color:var(--green)}
.step.fail{border-color:var(--red-line); background:var(--red-dim)}
/* ── Divergence fork ── */
.fork-label{
display:flex; align-items:center; gap:0.8rem; margin:1.8rem 0 1rem;
color:var(--muted); font-size:0.75rem; font-weight:700; letter-spacing:0.08em; text-transform:uppercase;
}
.fork-label::before, .fork-label::after{content:""; flex:1; border-top:1px dashed var(--border)}
.split{display:grid; grid-template-columns:1fr 1fr; gap:1rem; align-items:start}
@media (max-width:760px){ .split{grid-template-columns:1fr} }
.lane{border-radius:10px; border:1px solid var(--border); overflow:hidden}
.lane.baseline{border-color:var(--red-line)}
.lane.fixed{border-color:var(--green-line)}
.lane-head{padding:0.75rem 1rem; display:flex; justify-content:space-between; align-items:baseline; gap:0.5rem; flex-wrap:wrap}
.lane.baseline .lane-head{background:var(--red-dim)}
.lane.fixed .lane-head{background:var(--green-dim)}
.lane-head .t{font-weight:800; font-size:0.92rem}
.lane.baseline .lane-head .t{color:var(--red)}
.lane.fixed .lane-head .t{color:var(--green)}
.lane-head .d{font-size:0.72rem; color:var(--muted)}
.lane-body{padding:0.75rem; display:flex; flex-direction:column; gap:0.5rem}
.lane .step{border-radius:6px}
.verdict{
margin:0.25rem 0.75rem 0.85rem; padding:0.6rem 0.8rem; border-radius:6px;
font-size:0.82rem; font-weight:600;
}
.lane.baseline .verdict{background:var(--red-dim); border:1px solid var(--red-line); color:var(--red)}
.lane.fixed .verdict{background:var(--green-dim); border:1px solid var(--green-line); color:var(--green)}
/* ── Injection panel ── */
.inject{
border:1px solid var(--accent-line); border-radius:10px; overflow:hidden; margin-top:1.2rem;
}
.inject-head{background:var(--accent-dim); padding:0.75rem 1rem; font-weight:800; font-size:0.92rem; color:var(--accent)}
.inject-head span{font-weight:400; color:var(--muted); font-size:0.78rem; margin-left:0.5rem}
.inject pre{
margin:0; padding:0.9rem 1rem; font-size:0.78rem; line-height:1.6;
color:var(--code-text); background:var(--code-bg); overflow-x:auto; white-space:pre;
}
.inject pre b{color:var(--text)}
.pipeline{
display:flex; flex-wrap:wrap; gap:0.4rem; align-items:center;
font-size:0.78rem; color:var(--muted); padding:0.7rem 1rem; border-top:1px solid var(--border); background:var(--bg2);
}
.pipeline .chip{background:var(--bg3); border:1px solid var(--border); border-radius:5px; padding:0.12rem 0.5rem; font-size:0.74rem; color:var(--text); font-family:"SFMono-Regular",Consolas,Menlo,monospace}
.pipeline .arrow{color:var(--muted)}
/* ── Results table ── */
table{border-collapse:collapse; width:100%; font-size:0.88rem; margin-top:0.4rem}
th,td{text-align:left; padding:0.55rem 0.9rem; border-bottom:1px solid var(--border)}
th{font-size:0.7rem; text-transform:uppercase; letter-spacing:0.07em; color:var(--muted)}
td.num{font-variant-numeric:tabular-nums; font-family:"SFMono-Regular",Consolas,Menlo,monospace; font-size:0.82rem}
.pill{display:inline-block; font-size:0.72rem; font-weight:700; border-radius:12px; padding:0.08rem 0.55rem}
.pill.pass{background:var(--green-dim); border:1px solid var(--green-line); color:var(--green)}
.pill.fail{background:var(--red-dim); border:1px solid var(--red-line); color:var(--red)}
.tbl-wrap{overflow-x:auto; border:1px solid var(--border); border-radius:8px; background:var(--bg2)}
.tbl-wrap table{margin:0}
.tbl-wrap tr:last-child td{border-bottom:none}
/* ── Caveats ── */
.caveats{
margin-top:1.1rem; padding:0.85rem 1rem; border:1px solid var(--border);
border-radius:8px; background:var(--bg2); font-size:0.84rem; color:var(--muted); max-width:100%;
}
.caveats b{color:var(--text)}
footer{margin-top:3rem; font-size:0.76rem; color:var(--muted); border-top:1px solid var(--border); padding-top:1rem}
footer code{background:var(--bg3); padding:0.05rem 0.35rem; border-radius:4px}
@media (prefers-reduced-motion: no-preference){
.lane{transition:border-color 0.15s ease}
}
</style>
</head>
<body>
<div class="wrap">
<header>
<div class="badge">FixLayer · Trace Evidence</div>
<h1>Same failure, two endings: <em>a merge conflict, fixed inline</em></h1>
<p class="sub">Two real Terminal-Bench trajectories for the <b>fix-git</b> task. Both agents hit the identical tool failure. The only difference: the second run carried a workaround derived mechanically from the CLI Agent Spec — no human wrote a word of it for this task. Below it: a second case (a weak model trapped in <code>git</code>'s pager) and the measured answer to where instructions stop working and command rewriting must take over.</p>
<div class="meta">agent <code>claude-code / claude-haiku-4-5</code> · task <code>terminal-bench-2/fix-git</code> · baseline job <code>2026-05-29__12-40-19</code> · treated job <code>2026-07-06__20-29-45</code></div>
<div class="stats">
<div class="stat"><div class="k">Baseline</div><div class="v red">0 / 1</div><div class="n">merge left unresolved</div></div>
<div class="stat"><div class="k">With §13 injected</div><div class="v green">2 / 3</div><div class="n">residual failure: reasoning, not tools</div></div>
<div class="stat"><div class="k">Tool-layer failure</div><div class="v green">0 / 3</div><div class="n">recurrences after injection</div></div>
<div class="stat"><div class="k">Treated-run cost</div><div class="v accent">$0.084</div><div class="n">3 trials + diagnosis</div></div>
</div>
</header>
<h2>The shared path <span class="tick">— both runs, step for step</span></h2>
<p class="lede">Same task prompt, same repository state, same model. Both agents find the lost commit in the reflog and try to merge it back. Both hit the same wall.</p>
<div class="trace">
<div class="step">
<div class="who">user</div>
<pre>I just made some changes to my personal site and checked out master,
but now I can't find those changes. Please help me</pre>
</div>
<div class="step">
<div class="who">agent · bash <span class="ok">✓</span></div>
<pre><b>git reflog -20</b>
d7d3e4b HEAD@{0}: checkout: moving from 650dba42… to master
<span class="g">650dba4 HEAD@{1}: commit: Move to Stanford</span>
c4e38a1 HEAD@{2}: checkout: moving from master to HEAD~1</pre>
</div>
<div class="step fail">
<div class="who">agent · bash <span class="bad">✗ exit 1 — the divergence point</span></div>
<pre><b>git merge 650dba4</b>
Auto-merging _includes/about.md
<span class="r">CONFLICT (content): Merge conflict in _includes/about.md</span>
<span class="r">Automatic merge failed; fix conflicts and then commit the result.</span></pre>
</div>
</div>
<div class="fork-label">from here, the two runs diverge</div>
<div class="split">
<div class="lane baseline">
<div class="lane-head"><span class="t">Baseline — no injection</span><span class="d">May 29 · 14.2s · reward 0.0</span></div>
<div class="lane-body">
<div class="step">
<div class="who">agent · read <span class="ok">✓</span></div>
<pre>_includes/about.md
<<<<<<< HEAD
…I am a PhD student…
=======
I am a Postdoctoral Researcher
at Stanford CS.
>>>>>>> 650dba4</pre>
</div>
<div class="step">
<div class="who">agent · final message — no more tool calls</div>
<pre>"I see — your changes on 650dba4
updated your bio to 'Postdoctoral
Researcher at Stanford CS', but
master has…"</pre>
</div>
</div>
<div class="verdict">✗ Session ends explaining the conflict to the user. Working tree still has conflict markers. Verifier: 0.0</div>
</div>
<div class="lane fixed">
<div class="lane-head"><span class="t">With §13 injected</span><span class="d">Jul 6 · 12.1s · reward 1.0</span></div>
<div class="lane-body">
<div class="step">
<div class="who">agent · read <span class="ok">✓</span></div>
<pre>_includes/about.md
<<<<<<< HEAD … >>>>>>> 650dba4
<span class="c">(same conflict, same file)</span></pre>
</div>
<div class="step">
<div class="who">agent · edit <span class="ok">✓</span></div>
<pre><b>edit _includes/about.md</b>
<span class="c">conflict markers resolved, keeping
the "Move to Stanford" changes</span></pre>
</div>
<div class="step">
<div class="who">agent · bash <span class="ok">✓</span></div>
<pre><b>git add _includes/about.md &&
git commit -m "Merge changes
from Move to Stanford"</b>
[master 87cac91] Merge changes…</pre>
</div>
<div class="step">
<div class="who">agent · bash <span class="ok">✓ verification</span></div>
<pre><b>git log --oneline -3</b>
<span class="g">87cac91 Merge changes from Move…</span>
650dba4 Move to Stanford
d7d3e4b off the job market woo</pre>
</div>
</div>
<div class="verdict">✓ Conflict resolved, merge committed, history verified. Verifier: 1.0</div>
</div>
</div>
<h2>The only changed variable</h2>
<p class="lede">The instruction below was assembled by the pipeline, not a person: the failing <code>git merge</code> trace was routed against all 74 spec signatures (one Haiku call, ~$0.01), matched <b>§13 Partial Failure & Atomicity</b>, and that challenge file's workaround was injected verbatim into the rerun.</p>
<div class="inject">
<div class="inject-head">§13 — Partial Failure & Atomicity <span>injected text, excerpt</span></div>
<pre><b>Signature:</b> exit 1 from a multi-step command whose output shows some
steps succeeded before a failure line
<b>Tier:</b> C (stateful logic; weak models apply the fallback below)
Parse partial-failure output to determine safe retry scope: identify
what completed, <b>resume from the failed step rather than re-running
the whole operation</b>, and verify state before any retry.
<b>Limitation:</b> if the tool emits only a text error with no structured
step information, verify current state before retrying — re-running
completed steps may cause duplicate side effects</pre>
<div class="pipeline">
<span class="chip">exit 1 trace</span><span class="arrow">→</span>
<span class="chip">signature routing (haiku)</span><span class="arrow">→</span>
<span class="chip">§13 match</span><span class="arrow">→</span>
<span class="chip">workaround injected</span><span class="arrow">→</span>
<span class="chip">rerun</span>
</div>
</div>
<h2>All five trials</h2>
<div class="tbl-wrap">
<table>
<tr><th>Trial</th><th>Arm</th><th>Outcome</th><th>Failure class</th></tr>
<tr><td class="num">fix-git · May 29</td><td>baseline</td><td><span class="pill fail">0.0</span></td><td>merge conflict left unresolved — tool-execution failure</td></tr>
<tr><td class="num">fix-git__BYkELMK</td><td>§13 injected</td><td><span class="pill pass">1.0</span></td><td>—</td></tr>
<tr><td class="num">fix-git__tjbWRFd</td><td>§13 injected</td><td><span class="pill pass">1.0</span></td><td>—</td></tr>
<tr><td class="num">fix-git__RAnHowg</td><td>§13 injected</td><td><span class="pill fail">0.0</span></td><td>wrong_output — reasoning failure, outside tool-layer scope</td></tr>
<tr><td class="num">3 × merge conflict</td><td>§13 injected</td><td><span class="pill pass">recovered</span></td><td>tool-layer failure did not recur in any treated trial</td></tr>
</table>
</div>
<h2>Case two: the pager trap <span class="tick">— where instructions stop working</span></h2>
<p class="lede">Same task, much weaker agent: <b>terminus-2</b> driving a real tmux terminal with <b>nemotron-nano-9b</b> (free tier). In a real TTY, <code>git show</code> opens <code>less</code> — and a 9B model cannot climb out.</p>
<div class="meta">baseline job <code>2026-07-08__08-33-25</code> · 56 tool calls · zero failing exit codes · verifier 0.0</div>
<div class="trace" style="margin-top:1rem">
<div class="step fail">
<div class="who">agent · bash <span class="bad">✗ repeated 15× — every call reads as success</span></div>
<pre><b>git show 43117c7 --name-only</b>
<span class="c">(less opens; the pane shows:)</span>
SUMMARY OF LESS COMMANDS
q :q Q :Q ZZ <span class="r">Exit.</span></pre>
</div>
<div class="step fail">
<div class="who">agent · bash <span class="bad">✗ typed 19 times</span></div>
<pre><b>exit</b>
<span class="c">does nothing inside a pager — the screen above says to press q.
The agent never presses q. All 900 seconds of budget burn here.</span></pre>
</div>
</div>
<div class="inject" style="margin-top:1.2rem">
<div class="inject-head">Diagnosis <span>deterministic, zero LLM cost</span></div>
<div class="pipeline" style="border-top:none">
<span class="chip">56 exit-0 calls</span><span class="arrow">→</span>
<span class="chip">pager UI in output</span><span class="arrow">→</span>
<span class="chip">§10 match, confidence 0.92</span><span class="arrow">→</span>
<span class="chip">workaround injected</span>
</div>
</div>
<h2>Three arms, one lesson <span class="tick">— instruction injection has a capability floor</span></h2>
<div class="tbl-wrap">
<table>
<tr><th>Arm</th><th>Pass</th><th>Mechanism observed in the traces</th></tr>
<tr><td class="num">untreated</td><td><span class="pill fail">0/1</span></td><td>19× <code>exit</code> inside <code>less</code>; entire budget spent in the pager</td></tr>
<tr><td class="num">§10 injected, Python form</td><td><span class="pill fail">0/3</span></td><td>the <code>subprocess.run</code> snippet is unusable in a keystroke world; one trial re-ran <code>git diff 5ddf58a</code> 16×</td></tr>
<tr><td class="num">§10 injected, shell form + "press q"</td><td><span class="pill fail">0/3</span></td><td>one trial fully pager-free (14 clean <code>q</code> presses); two still trapped; the env bundle was never typed</td></tr>
</table>
</div>
<p class="lede" style="margin-top:0.8rem">The zero delta is the finding: below a capability floor, a model cannot apply even a one-line workaround it was handed. Round one also caught a spec bug — §10's workaround was written as Python, violating its own Tier B "one command" promise; it now leads with the one-line shell bundle.</p>
<h2>The intervention ladder, measured</h2>
<p class="lede">Three places to intervene, ordered by how much model cooperation they need. The demo runs the exact trapped commands from the traces two ways: in a raw pty (the agent's world), and through <code>runner.py</code> — which rewrites the command <em>before execution</em> and never allocates a TTY.</p>
<div class="pipeline" style="border:1px solid var(--border); border-radius:8px; background:var(--bg2); margin-bottom:1rem">
<span class="chip">before: rewrite the command</span><span class="arrow">works at any model size</span>
<span class="chip">during: suppress via environment</span><span class="arrow">needs a harness</span>
<span class="chip">after: advise the model</span><span class="arrow">needs a capable model</span>
</div>
<div class="tbl-wrap">
<table>
<tr><th>Command from the trace</th><th>Raw pty</th><th><code>runner.run()</code></th></tr>
<tr><td class="num">git show <sha></td><td><span class="pill fail">hung in pager</span></td><td class="num">exit 0 in 17ms — ran <code>git --no-pager show</code></td></tr>
<tr><td class="num">git diff <sha>^ <sha></td><td><span class="pill fail">hung in pager</span></td><td class="num">exit 0 in 30ms — <code>git --no-pager diff</code></td></tr>
<tr><td class="num">git show -p <sha></td><td><span class="pill fail">hung in pager</span></td><td class="num">exit 0 in 22ms — <code>git --no-pager show -p</code></td></tr>
<tr><td class="num">git log --stat</td><td><span class="pill fail">hung in pager</span></td><td class="num">exit 0 in 27ms — <code>--no-pager --format=%h %s -n 20</code></td></tr>
<tr><td class="num">git show <sha> --name-only</td><td><span class="pill pass">fit the screen</span></td><td class="num">exit 0 in 11ms — same rewrite applied</td></tr>
</table>
</div>
<p class="lede" style="margin-top:0.8rem">Every fix came from the existing <code>_PRE_FLIGHT</code> table (<code>§43 pre-flight: added --no-pager</code>), applied before the shell ever saw the command. And because <code>runner.run()</code> captures output instead of allocating a TTY, even commands the table does not know — the <code>git branch</code> that paged in one trial — physically cannot open a pager. The weaker the model, the earlier the intervention must happen.</p>
<div class="caveats prose">
<b>Honest caveats.</b> Case one is a pilot: one task, three treated trials against a single-trial baseline; the residual failure was reasoning-class. Case two's treated arms scored zero — reported as measured; the value there is the mechanism data and the spec fix, not a reward delta. Across 16 baselines on two agent stacks, exactly two tool-layer failures appeared (§13, §10); most Terminal-Bench failures are reasoning-class, which bounds where this spec applies. Scaling up means more tasks, a placebo-instruction arm, and mid-strength models between the 9B floor and hy3's ceiling.
</div>
<footer>
Generated from real ATIF trajectories via <code>traj.py</code> · diagnosis by <code>cli-agent-diagnose</code> (schema 1.1) · injection by <code>fix_loop.py --source spec</code> · preflight demo by <code>runner.py</code> (<code>tmp/pager_demo.py</code>) · CLI Agent Spec §13 · §10
</footer>
</div>
</body>
</html>