-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathblog.html
More file actions
157 lines (151 loc) · 9.57 KB
/
Copy pathblog.html
File metadata and controls
157 lines (151 loc) · 9.57 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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CORETEXA — Writing · verifying AI-written pull requests</title>
<meta name="description" content="Field notes from Coretexa on verifying AI-done work — the gate, the catches it makes, and why a reviewer that disagrees is worth more than one that agrees.">
<link rel="canonical" href="https://coretexa.dev/blog.html">
<meta property="og:site_name" content="Coretexa">
<meta property="og:type" content="website">
<meta property="og:url" content="https://coretexa.dev/blog.html">
<meta property="og:title" content="Coretexa — field notes on verifying AI-done work">
<meta property="og:description" content="Field notes from Coretexa on verifying AI-done work — the gate, the catches it makes, and why a reviewer that disagrees is worth more than one that agrees.">
<meta property="og:image" content="https://coretexa.dev/og.png">
<meta property="og:image:width" content="1200">
<meta property="og:image:height" content="630">
<meta property="og:image:alt" content="Coretexa — the agent that does the work can’t close it.">
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:site" content="@fezystockmarke1">
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;500;600;700&family=IBM+Plex+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<style>
:root{--ground:#071a30;--paper:#0a2138;--line:#18456e;--line-2:#1f5688;--hair:rgba(120,180,230,.16);--cyan:#22d3ee;--cyan-dim:#0e7f96;--amber:#f5b642;--white:#eaf4fb;--ink:#a8c6de;--ink-dim:#6c93b4;--ok:#3ddc97;--mono:'IBM Plex Mono',ui-monospace,monospace;--sans:'Space Grotesk',system-ui,sans-serif;--maxw:1180px}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth}
body{font-family:var(--sans);background:var(--ground);color:var(--ink);line-height:1.6;-webkit-font-smoothing:antialiased;overflow-x:hidden;position:relative;min-height:100vh}
body::before{content:"";position:fixed;inset:0;z-index:-2;background:linear-gradient(var(--hair) 1px,transparent 1px) 0 0/26px 26px,linear-gradient(90deg,var(--hair) 1px,transparent 1px) 0 0/26px 26px,radial-gradient(ellipse at 50% -10%,#0d2c4d 0%,var(--ground) 60%);pointer-events:none}
a{color:inherit;text-decoration:none}
::selection{background:var(--cyan);color:var(--ground)}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 28px}
nav{position:sticky;top:0;z-index:50;backdrop-filter:blur(10px);background:rgba(7,26,48,.72);border-bottom:1px solid var(--hair)}
.nav-in{max-width:var(--maxw);margin:0 auto;padding:14px 28px;display:flex;align-items:center;gap:24px}
.brand{display:flex;align-items:center;gap:12px;font-weight:700;letter-spacing:.14em;color:var(--white);font-size:15px}
.brand .glyph{width:22px;height:22px;flex:none}
.tag-mit{font-family:var(--mono);font-size:11px;color:var(--ink-dim);border:1px solid var(--hair);padding:3px 8px;border-radius:3px;letter-spacing:.08em}
.nav-links{display:flex;gap:26px;margin-left:auto;font-family:var(--mono);font-size:13px}
.nav-links a{color:var(--ink);transition:color .18s}
.nav-links a:hover{color:var(--cyan)}
.nav-links a.cur{color:var(--cyan)}
header.bloghead{padding:72px 0 30px}
.sec-tag{display:inline-flex;align-items:center;gap:10px;font-family:var(--mono);font-size:11px;letter-spacing:.22em;text-transform:uppercase;color:var(--cyan);margin-bottom:20px}
.sec-tag::before{content:"";width:34px;height:1px;background:var(--cyan);opacity:.6}
.sec-tag .num{color:var(--amber)}
h1{font-weight:600;color:var(--white);line-height:1.1;letter-spacing:-.02em;font-size:clamp(32px,4.6vw,50px);margin-bottom:14px}
.lede{font-size:18px;color:var(--ink);max-width:660px}
.count{font-family:var(--mono);font-size:12px;color:var(--ink-dim);margin-top:26px;letter-spacing:.04em;border-top:1px solid var(--hair);padding-top:16px}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));gap:20px;padding:24px 0 90px}
.post{display:flex;flex-direction:column;background:rgba(10,33,56,.55);border:1px solid var(--hair);border-radius:14px;padding:24px 24px 22px;transition:border-color .18s,transform .18s,box-shadow .18s}
.post:hover{border-color:var(--line-2);transform:translateY(-2px);box-shadow:0 14px 34px -20px rgba(0,0,0,.7)}
.post .meta{display:flex;align-items:center;gap:10px;font-family:var(--mono);font-size:11px;color:var(--ink-dim);letter-spacing:.05em;margin-bottom:14px}
.post .meta .chip{color:var(--ok);border:1px solid rgba(61,220,151,.3);border-radius:20px;padding:2px 9px;text-transform:uppercase;letter-spacing:.1em;font-size:10px}
.post h2{font-size:21px;font-weight:600;color:var(--white);line-height:1.25;letter-spacing:-.01em;margin-bottom:10px}
.post:hover h2{color:var(--cyan)}
.post p{font-size:14.5px;color:var(--ink);margin-bottom:18px;flex:1}
.post .read{font-family:var(--mono);font-size:12.5px;color:var(--cyan-dim);align-self:flex-start}
.post:hover .read{color:var(--cyan)}
footer{border-top:1px solid var(--hair);padding:30px 0}
.foot-in{max-width:var(--maxw);margin:0 auto;padding:0 28px;display:flex;gap:18px;flex-wrap:wrap;justify-content:space-between;font-family:var(--mono);font-size:12px;color:var(--ink-dim)}
.foot-in .dot{opacity:.5}
@media(max-width:560px){.grid{grid-template-columns:1fr}}
.btn{display:inline-block;padding:8px 14px;border:1px solid var(--line);color:var(--white);font-family:var(--mono);font-size:12.5px;text-decoration:none;transition:.15s}
.btn:hover{border-color:var(--cyan)}
.btn-primary{background:var(--cyan);border-color:var(--cyan);color:var(--ground);font-weight:600}
.btn-primary:hover{filter:brightness(1.08)}
.nav-links a.btn{color:var(--white);text-decoration:none}
.nav-links a.btn-primary{color:var(--ground)}
/* ---- nav fits between phone and desktop (added 2026-07-27) ---- */
@media(max-width:900px){ .tag-mit{display:none} }
@media(max-width:830px){
.btn-primary.desk{display:none}
.nav-links{gap:16px;font-size:12px}
}
@media(max-width:620px){
.nav-in{flex-wrap:wrap;row-gap:10px}
.nav-links{margin-left:0;width:100%;gap:14px;flex-wrap:wrap}
}
</style>
</head>
<body>
<nav>
<div class="nav-in">
<a href="/" class="brand">
<svg class="glyph" viewBox="0 0 24 24" fill="none" stroke="var(--cyan)" stroke-width="1.6">
<rect x="3" y="3" width="18" height="18" rx="2"/><path d="M7 12.5l3 3 7-7" stroke="var(--amber)" stroke-width="1.8"/>
</svg>CORETEXA
</a>
<span class="tag-mit">MIT · open source</span>
<div class="nav-links">
<a href="/#how">How it works</a>
<a href="/#verdicts">Protocol</a>
<a href="/proof.html">Proof</a>
<a href="/blog.html" class="cur">Writing</a>
<a href="https://github.com/earfman/coretexa-verify" target="_blank" rel="noopener">GitHub</a>
<a href="https://github.com/earfman/coretexa-verify" target="_blank" rel="noopener" class="btn btn-primary desk">Add the check</a>
</div>
</div>
</nav>
<header class="bloghead">
<div class="wrap">
<div class="sec-tag"><span class="num">01</span> Writing</div>
<h1>Field notes</h1>
<p class="lede">Notes from verifying AI-written pull requests — the check, the catches it makes, and why a reviewer that disagrees with you is worth more than one that nods along.</p>
<div class="count" id="count"></div>
</div>
</header>
<main class="wrap">
<div class="grid" id="grid"></div>
</main>
<footer><div class="foot-in">
<span><b style="color:var(--white);letter-spacing:.12em">CORETEXA</b> <span class="dot">·</span> coretexa.dev</span>
<span>MIT <span class="dot">·</span> 2026 <span class="dot">·</span> the agent that does the work can't close it</span>
<a href="https://github.com/earfman/coretexa-verify" target="_blank" rel="noopener">GitHub →</a>
</div></footer>
<script>
// Newest first. Add new posts to the top of this array — index + count update automatically.
const POSTS = [
{
href: "/blog/we-refuted-an-ai-pull-request.html",
title: "We refuted an AI's pull request. It got merged anyway.",
date: "2026-07-25",
tag: "verification",
excerpt: "A bot wrote the fix, two more bots reviewed it, the tests were green — and the half that was still broken was the half its own test never built. We sent a reproduction. Two days later it merged unchanged."
},
{
href: "/blog/the-bug-my-ai-reviewer-missed.html",
title: "The bug my AI reviewer missed — and the second one that caught it",
date: "2026-07-22",
tag: "verification",
excerpt: "A single reviewer that agrees with you is theater. What's worth trusting is a second reviewer whose job is to prove you wrong — and one that just caught a real encoding crash a confirm-only pass had cleared."
},
{
href: "/blog/we-verify-our-own-bug-fixes.html",
title: "We verify our own bug fixes with a second agent — and drop the ones that don't survive",
date: "2026-07-20",
tag: "verification",
excerpt: "An AI can write a plausible bug fix in seconds — that's exactly the problem. Why the doer can't close its own ticket, and what a day of verified fixes (and honest rejections) actually looks like."
}
];
const grid = document.getElementById('grid');
grid.innerHTML = POSTS.map(p => `
<a class="post" href="${p.href}">
<div class="meta"><span>${p.date}</span><span class="chip">${p.tag}</span></div>
<h2>${p.title}</h2>
<p>${p.excerpt}</p>
<span class="read">Read →</span>
</a>`).join('');
document.getElementById('count').textContent = POSTS.length + (POSTS.length === 1 ? ' article' : ' articles');
</script>
</body>
</html>