aiblueprint-cli 1.4.73 → 1.4.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,379 @@
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.0" />
6
+ <title>Real Analysis · Is the $200 comparison honest?</title>
7
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
8
+ <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
9
+ <link href="https://fonts.googleapis.com/css2?family=Geist:wght@400;500;600;700&family=Geist+Mono:wght@400;500&display=swap" rel="stylesheet" />
10
+ <script src="https://cdn.jsdelivr.net/npm/chart.js@4.4.1/dist/chart.umd.min.js"></script>
11
+ <style>
12
+ :root {
13
+ --bg:#fff; --fg:#000; --gray-1:#fafafa; --gray-2:#f2f2f2;
14
+ --border:#eaeaea; --border-2:#e0e0e0; --muted:#666; --faint:#999;
15
+ --s1:#000; --s2:#9a9a9a; --s3:#d4d4d4; --s4:#ececec;
16
+ }
17
+ * { box-sizing:border-box; margin:0; padding:0; }
18
+ html { scroll-behavior:smooth; -webkit-text-size-adjust:100%; }
19
+ body { font-family:'Geist',system-ui,sans-serif; background:var(--bg); color:var(--fg); line-height:1.5; -webkit-font-smoothing:antialiased; font-feature-settings:"cv01","cv02","ss01"; }
20
+ .wrap { max-width:1080px; margin:0 auto; padding:0 24px; }
21
+ .mono { font-family:'Geist Mono',monospace; } .num { font-variant-numeric:tabular-nums; }
22
+ .eyebrow { font-family:'Geist Mono',monospace; font-size:12px; letter-spacing:.06em; text-transform:uppercase; color:var(--faint); }
23
+
24
+ .topnav { display:flex; justify-content:space-between; align-items:center; padding:22px 0; border-bottom:1px solid var(--border); }
25
+ .topnav a { color:var(--muted); text-decoration:none; font-size:13px; display:inline-flex; align-items:center; gap:7px; }
26
+ .topnav a:hover { color:var(--fg); }
27
+ .topnav .right { display:flex; gap:20px; }
28
+ .topnav .active { color:var(--fg); font-weight:600; }
29
+
30
+ header { padding:72px 0 52px; border-bottom:1px solid var(--border); }
31
+ .tagline { display:flex; align-items:center; gap:10px; margin-bottom:26px; }
32
+ .tagline .dot { width:6px; height:6px; border-radius:50%; background:var(--fg); }
33
+ h1 { font-size:clamp(32px,5.5vw,54px); font-weight:600; letter-spacing:-0.035em; line-height:1.05; max-width:18ch; }
34
+ h1 .muted2 { color:var(--faint); }
35
+ .lede { color:var(--muted); font-size:clamp(15px,2vw,18px); margin-top:22px; max-width:60ch; }
36
+
37
+ .stats { display:grid; grid-template-columns:repeat(4,1fr); border-bottom:1px solid var(--border); }
38
+ .stat { padding:34px 26px; border-right:1px solid var(--border); }
39
+ .stat:last-child { border-right:none; }
40
+ .stat .k { font-family:'Geist Mono',monospace; font-size:11.5px; letter-spacing:.05em; text-transform:uppercase; color:var(--faint); }
41
+ .stat .v { font-size:38px; font-weight:600; letter-spacing:-0.03em; margin-top:14px; line-height:1; }
42
+ .stat .d { font-size:13px; color:var(--muted); margin-top:12px; }
43
+
44
+ section { padding:68px 0; border-bottom:1px solid var(--border); }
45
+ .sec-head { margin-bottom:38px; }
46
+ .sec-head h2 { font-size:clamp(22px,3vw,30px); font-weight:600; letter-spacing:-0.025em; margin-top:14px; }
47
+ .sec-head .step { font-family:'Geist Mono',monospace; font-size:12px; color:var(--faint); }
48
+ .sec-head p { color:var(--muted); margin-top:14px; max-width:68ch; font-size:15px; }
49
+
50
+ .grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:24px; align-items:start; }
51
+ .panel { border:1px solid var(--border); border-radius:12px; padding:24px; background:var(--bg); }
52
+ .panel .ptitle { font-size:14px; font-weight:600; }
53
+ .panel .psub { font-family:'Geist Mono',monospace; font-size:11.5px; color:var(--faint); text-transform:uppercase; letter-spacing:.05em; margin-top:4px; }
54
+ .chart-box { position:relative; height:300px; margin-top:16px; }
55
+ .chart-box.tall { height:230px; }
56
+ .chart-box.sm { height:190px; }
57
+
58
+ .legend { display:flex; gap:20px; flex-wrap:wrap; margin-top:18px; }
59
+ .legend span { display:inline-flex; align-items:center; gap:8px; font-size:13px; color:var(--muted); }
60
+ .legend i { width:11px; height:11px; border-radius:3px; display:inline-block; }
61
+
62
+ .note { margin-top:20px; padding-top:20px; border-top:1px solid var(--border); font-size:14px; color:var(--muted); }
63
+ .note b { color:var(--fg); font-weight:600; }
64
+
65
+ .big-callout { background:var(--fg); color:var(--bg); border-radius:16px; padding:34px 30px; margin-top:8px; }
66
+ .big-callout .lbl { font-family:'Geist Mono',monospace; font-size:12px; text-transform:uppercase; letter-spacing:.06em; color:rgba(255,255,255,.6); }
67
+ .big-callout .row { display:flex; flex-wrap:wrap; align-items:baseline; gap:14px 40px; margin-top:18px; }
68
+ .big-callout .row .v { font-size:46px; font-weight:600; letter-spacing:-0.03em; }
69
+ .big-callout .row .eq { font-size:30px; color:rgba(255,255,255,.5); }
70
+ .big-callout .cap { margin-top:18px; font-size:14.5px; color:rgba(255,255,255,.8); max-width:60ch; }
71
+
72
+ .three { display:grid; grid-template-columns:repeat(3,1fr); gap:20px; }
73
+ .mini { border:1px solid var(--border); border-radius:12px; padding:22px; }
74
+ .mini .mt { font-size:13.5px; font-weight:600; } .mini .ms { font-family:'Geist Mono',monospace; font-size:11px; color:var(--faint); text-transform:uppercase; letter-spacing:.04em; margin-top:3px; }
75
+ .mini .cwrap { position:relative; height:150px; margin-top:14px; }
76
+
77
+ .verdict-table { width:100%; border-collapse:collapse; border:1px solid var(--border); border-radius:14px; overflow:hidden; }
78
+ .verdict-table td { padding:18px 22px; font-size:15px; border-top:1px solid var(--border); vertical-align:top; }
79
+ .verdict-table tr:first-child td { border-top:none; }
80
+ .verdict-table td:first-child { color:var(--muted); width:42%; }
81
+ .verdict-table td:last-child { font-weight:500; }
82
+ .tag { font-family:'Geist Mono',monospace; font-size:10px; padding:2px 7px; border-radius:5px; vertical-align:middle; margin-right:8px; letter-spacing:.04em; }
83
+ .tag.no { background:var(--fg); color:var(--bg); } .tag.tie { background:var(--gray-2); color:var(--fg); border:1px solid var(--border-2); }
84
+
85
+ footer { padding:54px 0 90px; }
86
+ footer .eyebrow { margin-bottom:22px; display:block; }
87
+ footer ul { list-style:none; display:grid; gap:13px; max-width:82ch; }
88
+ footer li { font-size:14px; color:var(--muted); padding-left:22px; position:relative; }
89
+ footer li::before { content:""; position:absolute; left:0; top:9px; width:6px; height:6px; background:var(--border-2); border-radius:50%; }
90
+ footer li .mono { color:var(--fg); }
91
+ footer a { color:var(--muted); } footer a:hover { color:var(--fg); }
92
+ footer .sig { margin-top:30px; font-size:13px; color:var(--faint); }
93
+
94
+ @media (max-width:860px){
95
+ .stats{grid-template-columns:1fr 1fr;} .stat:nth-child(2){border-right:none;}
96
+ .stat:nth-child(1),.stat:nth-child(2){border-bottom:1px solid var(--border);}
97
+ .grid-2{grid-template-columns:1fr;} .three{grid-template-columns:1fr;}
98
+ }
99
+ @media (max-width:480px){ .stats{grid-template-columns:1fr;} .stat{border-right:none;border-bottom:1px solid var(--border);} }
100
+
101
+ /* === responsive hardening (auto) === */
102
+ html, body { max-width:100%; overflow-x:hidden; }
103
+ img, canvas, svg, table { max-width:100%; }
104
+ .note, .mono, .lede, .big-callout .cap, .sec-head p, .stat .d, footer li { overflow-wrap:anywhere; word-break:break-word; }
105
+ @media (max-width:760px){
106
+ .grid-2, .three { grid-template-columns:1fr !important; }
107
+ .stats { grid-template-columns:1fr 1fr; }
108
+ .topnav, .nav, .topband .inner, .navpills, .hero { flex-wrap:wrap; }
109
+ .chart-box { height:260px; }
110
+ .chart-box.tall { height:240px; }
111
+ section { padding-top:40px; padding-bottom:40px; }
112
+ }
113
+ @media (max-width:560px){
114
+ .wrap { padding-left:16px; padding-right:16px; }
115
+ .stats { grid-template-columns:1fr; }
116
+ .big-callout { padding:24px 20px; }
117
+ .big-callout .row { gap:10px 22px; }
118
+ .big-callout .row .v { font-size:40px; }
119
+ .big-callout .row .eq { font-size:24px; }
120
+ .verdict-table, .verdict-table tbody, .verdict-table tr, .verdict-table td { display:block; width:100% !important; }
121
+ .verdict-table td { padding:14px 18px !important; }
122
+ .verdict-table td:first-child { padding-bottom:4px; }
123
+ .verdict-table td:last-child { padding-top:0; border-top:none !important; }
124
+ .chart-box { height:230px; }
125
+ .stat .v { font-size:32px; }
126
+ h1 { max-width:100% !important; }
127
+ }
128
+
129
+
130
+ /* === chart responsive fix (auto) === */
131
+ .grid-2, .three { min-width:0; }
132
+ .grid-2 > *, .three > *, .panel, .mini, .stat { min-width:0; }
133
+ .chart-box, .cwrap { position:relative; width:100%; }
134
+ .chart-box canvas, .cwrap canvas { max-width:100% !important; }
135
+
136
+ </style>
137
+ </head>
138
+ <body>
139
+ <div class="wrap">
140
+
141
+ <nav class="topnav">
142
+ <a href="index.html">← All reports</a>
143
+ <div class="right">
144
+ <a href="codex-max20/Codex-Max20-report.html">Codex $200</a>
145
+ <a href="claude-max20/Claude-Max20-report.html">Claude Max 20x</a>
146
+ <a class="active" href="#">Real analysis</a>
147
+ </div>
148
+ </nav>
149
+
150
+ <header>
151
+ <div class="tagline"><span class="dot"></span><span class="eyebrow">Methodology audit · is the comparison honest?</span></div>
152
+ <h1>Most of the "value" is <span class="muted2">cache, not work.</span></h1>
153
+ <p class="lede">The reports say Codex $200 is worth ~$8,600/mo and Claude $200 ~$18,900/mo. Here is the proof that comparing those two numbers as "Claude is worth 2× more" is misleading - and what is actually true.</p>
154
+ </header>
155
+
156
+ <div class="stats num">
157
+ <div class="stat"><div class="k">Your tokens today</div><div class="v">92.7%</div><div class="d">are cache reads, not new work</div></div>
158
+ <div class="stat"><div class="k">That are output</div><div class="v">0.6%</div><div class="d">the only real "work" line</div></div>
159
+ <div class="stat"><div class="k">Real output value</div><div class="v">≈ tie</div><div class="d">$977 vs $911 / mo</div></div>
160
+ <div class="stat"><div class="k">The 2× gap</div><div class="v">artifact</div><div class="d">cache pricing + extrapolation</div></div>
161
+ </div>
162
+
163
+ <!-- 1. TODAY: count vs value -->
164
+ <section>
165
+ <div class="sec-head">
166
+ <div class="step">01 / the symptom</div>
167
+ <h2>Your tokens today: where they go vs where the dollars go</h2>
168
+ <p>Measured from your own logs (<span class="mono">~/.claude/projects</span>, deduped by request, 2026-05-30). Almost everything is cache. Output - the actual work - is a sliver of the count and a small share of the dollars.</p>
169
+ </div>
170
+ <div class="grid-2">
171
+ <div class="panel">
172
+ <div class="ptitle">Token count</div>
173
+ <div class="psub">89.8M tokens today</div>
174
+ <div class="chart-box"><canvas id="countD"></canvas></div>
175
+ </div>
176
+ <div class="panel">
177
+ <div class="ptitle">API-equivalent dollars</div>
178
+ <div class="psub">$113 today, at Opus list</div>
179
+ <div class="chart-box"><canvas id="dollarD"></canvas></div>
180
+ </div>
181
+ </div>
182
+ <div class="legend">
183
+ <span><i style="background:var(--s3)"></i> Cache read</span>
184
+ <span><i style="background:var(--s2)"></i> Cache write</span>
185
+ <span><i style="background:var(--s1)"></i> Output (real work)</span>
186
+ <span><i style="background:var(--s4)"></i> Fresh input</span>
187
+ </div>
188
+ <p class="note"><b>~87% of the dollars are caching overhead; ~12% is output.</b> Caching does not stop the model re-reading the whole context on every call - it just makes the re-read cheap. The token count stays huge because it equals context size × number of calls (~110K re-read × 758 calls today).</p>
189
+ </section>
190
+
191
+ <!-- 2. DECOMPOSITION -->
192
+ <section>
193
+ <div class="sec-head">
194
+ <div class="step">02 / the core proof</div>
195
+ <h2>Both $200 plans, decomposed to the same monthly basis</h2>
196
+ <p>Each plan's value split into output vs cache, priced at its own provider's API list, scaled to 100% of monthly quota. The output slivers (black) are nearly identical. The entire headline gap is the gray cache bars.</p>
197
+ </div>
198
+ <div class="panel">
199
+ <div class="chart-box tall"><canvas id="decomp"></canvas></div>
200
+ <div class="legend">
201
+ <span><i style="background:var(--s1)"></i> Output (real work)</span>
202
+ <span><i style="background:var(--s3)"></i> Cache re-read ($0.50/1M)</span>
203
+ <span><i style="background:var(--s2)"></i> First read (input / cache-write)</span>
204
+ </div>
205
+ <p class="note">Codex total <b>$8,589</b> · Claude total <b>$18,891</b>. Output: <b>$977 vs $911</b>. Input/cache side: <b>$7,612 vs $17,980 (2.4×)</b> - that is where 100% of the gap lives.</p>
206
+ </div>
207
+ </section>
208
+
209
+ <!-- 3. OUTPUT TIE -->
210
+ <section>
211
+ <div class="sec-head">
212
+ <div class="step">03 / the punchline</div>
213
+ <h2>Strip away cache: the real work is a tie</h2>
214
+ <p>Output is the least gameable metric - the tokens the model actually generated for you. On a monthly, full-quota basis the two $200 plans are within ~7% of each other.</p>
215
+ </div>
216
+ <div class="big-callout">
217
+ <div class="lbl">Output value per month (real work)</div>
218
+ <div class="row num">
219
+ <div><div class="v">$977</div><div class="lbl" style="margin-top:6px">Codex $200</div></div>
220
+ <div class="eq">≈</div>
221
+ <div><div class="v">$911</div><div class="lbl" style="margin-top:6px">Claude $200</div></div>
222
+ </div>
223
+ <p class="cap">In raw output tokens: ~32.6M/mo (Codex) vs ~36.4M/mo (Claude) - a 1.12× edge, nowhere near the 2× the headline implies.</p>
224
+ </div>
225
+ </section>
226
+
227
+ <!-- 4. THREE ASYMMETRIES -->
228
+ <section>
229
+ <div class="sec-head">
230
+ <div class="step">04 / why the headline looks 2×</div>
231
+ <h2>Three calculation asymmetries inflate Claude's number</h2>
232
+ <p>None of these reflect more work delivered. They reflect how the number was built.</p>
233
+ </div>
234
+ <div class="three">
235
+ <div class="mini">
236
+ <div class="mt">Extrapolation multiplier</div>
237
+ <div class="ms">lower = more reliable</div>
238
+ <div class="cwrap"><canvas id="aExtrap"></canvas></div>
239
+ <p class="note" style="margin-top:14px;padding-top:14px">Codex was measured at 99% quota. Claude was one day at 10%, multiplied ×10 - any error amplified 10×.</p>
240
+ </div>
241
+ <div class="mini">
242
+ <div class="mt">Price to cache context</div>
243
+ <div class="ms">first read, per 1M</div>
244
+ <div class="cwrap"><canvas id="aPrice"></canvas></div>
245
+ <p class="note" style="margin-top:14px;padding-top:14px">Anthropic charges 2× for a "cache write" vs OpenAI's normal input. Same behavior, pricier meter.</p>
246
+ </div>
247
+ <div class="mini">
248
+ <div class="mt">Context re-reads</div>
249
+ <div class="ms">per output token</div>
250
+ <div class="cwrap"><canvas id="aReread"></canvas></div>
251
+ <p class="note" style="margin-top:14px;padding-top:14px">Claude re-reads ~2× more context per unit of output, bloating the cache-read line.</p>
252
+ </div>
253
+ </div>
254
+ </section>
255
+
256
+ <!-- 5. BRIDGE -->
257
+ <section>
258
+ <div class="sec-head">
259
+ <div class="step">05 / watch the gap melt</div>
260
+ <h2>Remove the artifacts and $18.9k slides toward $8.6k</h2>
261
+ <p>Starting from Claude's headline, undo each calculation artifact in turn. The gap to Codex's measured number shrinks at every step.</p>
262
+ </div>
263
+ <div class="panel">
264
+ <div class="chart-box tall"><canvas id="bridge"></canvas></div>
265
+ <p class="note">Re-pricing cache writes at Codex's rate: $18,891 → <b>$15,562</b>. Adjusting the one-day ×10 extrapolation for a plausibly heavy sample day (÷1.5): → <b>~$12,600</b>. Codex, essentially measured: <b>$8,589</b>. The residual is genuine extra context churn, not extra work.</p>
266
+ </div>
267
+ </section>
268
+
269
+ <!-- 6. VERDICT -->
270
+ <section>
271
+ <div class="sec-head">
272
+ <div class="step">06 / the honest answer</div>
273
+ <h2>What is actually true</h2>
274
+ </div>
275
+ <table class="verdict-table">
276
+ <tr>
277
+ <td>Which $200 plan does more real work?</td>
278
+ <td><span class="tag tie">tie</span>Roughly equal - output ~$977 vs ~$911 / mo.</td>
279
+ </tr>
280
+ <tr>
281
+ <td>Which API would bill more for this usage at full quota?</td>
282
+ <td>Claude - but because it charges more for the same caching and the figure is a ×10 extrapolation, not because you get more done.</td>
283
+ </tr>
284
+ <tr>
285
+ <td>Is "$9k vs $20k = Claude worth 2×" a fair comparison?</td>
286
+ <td><span class="tag no">no</span>It compares a measurement to a one-day ×10 guess, across two pricing models that treat caching differently, on a metric dominated by context overhead.</td>
287
+ </tr>
288
+ </table>
289
+ <p class="note">The deeper trap is the word <b>"value."</b> API-equivalent value measures what the provider's meter would charge, so it rewards verbose context, heavy cache re-reads, and a pricier cache-write rate. A plan can score "2× more valuable" while delivering identical output. That is exactly what happened here.</p>
290
+ </section>
291
+
292
+ <footer>
293
+ <span class="eyebrow">Confidence &amp; sources</span>
294
+ <ul>
295
+ <li><b style="color:var(--fg)">Proven from data</b> (high): your usage is 92.7% cache / 0.6% output; output value is ~equal; 100% of the gap is cache; first-read price is $5 (Codex) vs $10 (Claude); scale factors ×4.38 vs ×43.33.</li>
296
+ <li><b style="color:var(--fg)">Inferred from the math</b> (high): normalizing cache-write price drops Claude to ~$15.6k; the ×10 extrapolation makes the headline unreliable.</li>
297
+ <li><b style="color:var(--fg)">External reporting</b> (medium): exact subscription-limit weighting, Opus-vs-Sonnet ratio, and the 2026 cache-TTL change are documented by press, not by this repo's data.</li>
298
+ <li>Data: <span class="mono">result/melvynx/codex/2026-05-30T09-13-16Z</span>, <span class="mono">result/taka-foo/claude</span>. Full write-up with reproduce script: <a href="real-analysis.md">real-analysis.md</a>.</li>
299
+ <li>Sources: <a href="https://support.claude.com/en/articles/14552983-models-usage-and-limits-in-claude-code">Anthropic limits</a> · <a href="https://www.theregister.com/2026/03/31/anthropic_claude_code_limits/">The Register</a> · <a href="https://www.xda-developers.com/anthropic-quietly-nerfed-claude-code-hour-cache-token-budget/">XDA cache nerf</a>.</li>
300
+ </ul>
301
+ <div class="sig">Real Analysis · generated from agents-analysis data · API-equivalent value is not the provider's real cost.</div>
302
+ </footer>
303
+
304
+ </div>
305
+
306
+ <script>
307
+ Chart.defaults.font.family = "Geist, system-ui, sans-serif";
308
+ Chart.defaults.color = "#999";
309
+ Chart.defaults.font.size = 12;
310
+ const FG="#000", S2="#9a9a9a", S3="#d4d4d4", S4="#ececec", GRID="#eaeaea";
311
+ const usd = (v) => "$" + v.toLocaleString("en-US",{maximumFractionDigits:0});
312
+ const tip = { backgroundColor:"#000", padding:10, cornerRadius:8 };
313
+
314
+ // doughnut helper
315
+ function dough(id, data, fmt){
316
+ new Chart(document.getElementById(id), {
317
+ type:"doughnut",
318
+ data:{ labels:["Cache read","Cache write","Output","Fresh input"],
319
+ datasets:[{ data, backgroundColor:[S3,S2,FG,S4], borderColor:"#fff", borderWidth:3, hoverOffset:6 }] },
320
+ options:{ responsive:true, maintainAspectRatio:false, cutout:"62%",
321
+ plugins:{ legend:{display:false}, tooltip:{...tip, callbacks:{ label:(c)=>c.label+": "+fmt(c.parsed) }} } }
322
+ });
323
+ }
324
+ dough("countD", [83.3,5.7,0.5,0.3], (v)=>v+"M tokens");
325
+ dough("dollarD", [41.64,56.93,13.23,1.48], (v)=>"$"+v.toFixed(2));
326
+
327
+ // decomposition stacked horizontal
328
+ new Chart(document.getElementById("decomp"), {
329
+ type:"bar",
330
+ data:{ labels:["Codex $200","Claude $200"],
331
+ datasets:[
332
+ { label:"Output (real work)", data:[977,911], backgroundColor:FG, borderRadius:{topLeft:4,bottomLeft:4} },
333
+ { label:"Cache re-read", data:[5303,11319], backgroundColor:S3 },
334
+ { label:"First read (input/cache-write)", data:[2309,6661], backgroundColor:S2, borderRadius:{topRight:4,bottomRight:4} }
335
+ ] },
336
+ options:{ indexAxis:"y", responsive:true, maintainAspectRatio:false,
337
+ plugins:{ legend:{display:false}, tooltip:{...tip, callbacks:{ label:(c)=>c.dataset.label+": "+usd(c.parsed.x) }} },
338
+ scales:{ x:{ stacked:true, grid:{color:GRID}, border:{display:false}, ticks:{ callback:(v)=>"$"+(v/1000)+"k" } },
339
+ y:{ stacked:true, grid:{display:false}, border:{color:GRID}, ticks:{ font:{family:"Geist Mono",size:13,weight:600} } } } }
340
+ });
341
+
342
+ // mini bar helper
343
+ function mini(id, vals, fmt, max){
344
+ new Chart(document.getElementById(id), {
345
+ type:"bar",
346
+ data:{ labels:["Codex","Claude"], datasets:[{ data:vals, backgroundColor:[S2,FG], borderRadius:6, barPercentage:0.6 }] },
347
+ options:{ responsive:true, maintainAspectRatio:false,
348
+ plugins:{ legend:{display:false}, tooltip:{...tip, callbacks:{ label:(c)=>fmt(c.parsed.y) }} },
349
+ scales:{ x:{ grid:{display:false}, border:{color:GRID}, ticks:{font:{family:"Geist Mono",size:12}} },
350
+ y:{ grid:{color:GRID}, border:{display:false}, max, ticks:{ callback:fmt } } } }
351
+ });
352
+ }
353
+ mini("aExtrap", [4.38,43.33], (v)=>"×"+(typeof v==="number"?v.toFixed(v<10?1:0):v), 48);
354
+ mini("aPrice", [5,10], (v)=>"$"+v, 12);
355
+ mini("aReread", [326,621], (v)=>v.toFixed(0), 700);
356
+
357
+ // bridge
358
+ new Chart(document.getElementById("bridge"), {
359
+ type:"bar",
360
+ data:{ labels:["Claude headline","− cache-write premium","− 1-day extrapolation","Codex (measured)"],
361
+ datasets:[{ data:[18891,15562,12600,8589], backgroundColor:[FG,"#555","#888",S2], borderRadius:6, barPercentage:0.62 }] },
362
+ options:{ responsive:true, maintainAspectRatio:false,
363
+ plugins:{ legend:{display:false}, tooltip:{...tip, callbacks:{ label:(c)=>usd(c.parsed.y)+" / mo" }} },
364
+ scales:{ x:{ grid:{display:false}, border:{color:GRID}, ticks:{font:{family:"Geist Mono",size:11}} },
365
+ y:{ grid:{color:GRID}, border:{display:false}, ticks:{ callback:(v)=>"$"+(v/1000)+"k" } } } }
366
+ });
367
+ </script>
368
+
369
+ <script>
370
+ // force Chart.js to reflow on viewport changes (belt-and-suspenders)
371
+ (function(){
372
+ function resizeAll(){ if(window.Chart && Chart.instances){ Object.values(Chart.instances).forEach(function(c){ try{c.resize();}catch(e){} }); } }
373
+ var t; window.addEventListener('resize', function(){ clearTimeout(t); t=setTimeout(resizeAll,120); });
374
+ window.addEventListener('orientationchange', function(){ setTimeout(resizeAll,200); });
375
+ })();
376
+ </script>
377
+
378
+ </body>
379
+ </html>
@@ -0,0 +1,266 @@
1
+ # Anthropic Style
2
+
3
+ Warm, literary AI-lab aesthetic. Cream paper, bold grotesque display mixed with a reading serif, clay-coral accent, big soft-rounded panels. Calm, human, considered.
4
+
5
+ **Reference vibe:** anthropic.com (marketing) and claude.ai (the app).
6
+
7
+ ---
8
+
9
+ ## Core vibe
10
+
11
+ - **Warm, not clinical.** Ivory/oatmeal paper, ink near-black, a single clay-coral accent. Never pure `#fff` / `#000`.
12
+ - **Two type voices.** Bold neo-grotesque sans for display/UI; a humanist serif for reading copy and product surfaces. The contrast is the signature.
13
+ - **Editorial hero.** Oversized lowercase sans words, some ghosted at low opacity and scattered, paired with a serif paragraph. Composed like a poster.
14
+ - **Big soft radius.** Large rounded rectangles (`16-28px`) on dark panels and media; pill buttons. Soft, never sharp blueprint corners.
15
+ - **Quiet structure.** Few rules, lots of air. Hierarchy comes from type scale and the cream/ink/dark-panel contrast, not from boxes everywhere.
16
+ - **One accent.** Clay coral `#CC785C` / `#D97757` (the Claude spark). Used sparingly: a mark, a link, an active dot.
17
+
18
+ ---
19
+
20
+ ## Color
21
+
22
+ Portable palette. Map to project tokens when available.
23
+
24
+ | Role | Hex | CSS var (suggested) | Usage |
25
+ |------|-----|---------------------|-------|
26
+ | Paper | `#F0EFE9` | `--an-bg` | Marketing background (warm oatmeal) |
27
+ | Paper light | `#FAF9F5` | `--an-bg-light` | Lighter cream sections, cards on cream |
28
+ | Ink | `#191919` | `--an-fg` | Headlines, body on cream |
29
+ | Ink soft | `#141413` | `--an-ink` | Dark panels / app canvas |
30
+ | Slate | `#3D3D3A` | `--an-slate` | Secondary text on cream |
31
+ | Muted | `#6B6B66` | `--an-muted` | Captions, metadata, ghost nav |
32
+ | Ghost | `#C9C7BD` | `--an-ghost` | Scattered ghosted hero words, faint type |
33
+ | Border | `#DAD9D2` | `--an-border` | Hairline dividers on cream |
34
+ | Coral | `#CC785C` | `--an-coral` | Primary accent: marks, links, active dot |
35
+ | Coral bright | `#D97757` | `--an-coral-bright` | Spark glyph, hover |
36
+
37
+ ### Dark / app surface (claude.ai)
38
+
39
+ | Role | Hex | Usage |
40
+ |------|-----|-------|
41
+ | App canvas | `#262624` | Main chat area |
42
+ | App rail | `#1F1E1D` | Sidebar |
43
+ | App raised | `#30302E` | Hover rows, input field |
44
+ | Ink on dark | `#F5F4EE` | Primary text (warm white) |
45
+ | Muted on dark | `#A8A79E` | Secondary nav, labels |
46
+ | Border on dark | `#3A3A37` | Dividers, input outline |
47
+ | Coral | `#D97757` | Spark, send accent |
48
+
49
+ ### Tailwind mapping (when no project tokens)
50
+
51
+ ```css
52
+ :root {
53
+ --an-bg: #f0efe9;
54
+ --an-bg-light: #faf9f5;
55
+ --an-fg: #191919;
56
+ --an-slate: #3d3d3a;
57
+ --an-muted: #6b6b66;
58
+ --an-ghost: #c9c7bd;
59
+ --an-coral: #cc785c;
60
+ --an-panel: #141413;
61
+ }
62
+ ```
63
+
64
+ **Rule:** Cream + ink is the whole page. Coral is a spice, not a fill. Dark panels (`#141413`) are objects placed on the cream, with large radius.
65
+
66
+ ---
67
+
68
+ ## Typography
69
+
70
+ Two faces, deliberate split.
71
+
72
+ ### Font stacks
73
+
74
+ | Role | Stack | Open substitute |
75
+ |------|-------|-----------------|
76
+ | Display / UI (sans) | `"Styrene A", "Styrene B", Inter, "Helvetica Neue", Arial, sans-serif` | `Inter` (tight tracking) |
77
+ | Reading / product (serif) | `"Copernicus", "Tiempos Text", Georgia, "Source Serif 4", serif` | `"Source Serif 4"` or Georgia |
78
+ | Logo wordmark | sans, bold, uppercase, with the `\` slash: `ANTHROP\C` | Inter / Styrene |
79
+
80
+ claude.ai sets long-form answers in the **serif**; the app chrome (sidebar, buttons) in the **sans**. Match that split.
81
+
82
+ ### Scale
83
+
84
+ | Level | Font | Pattern |
85
+ |-------|------|---------|
86
+ | Hero word | Sans | `text-6xl md:text-8xl font-bold lowercase tracking-[-0.02em] leading-[0.95]` |
87
+ | Ghost hero word | Sans | same size, `text-[#c9c7bd]` (faint), scattered |
88
+ | Section / H2 | Sans | `text-3xl md:text-4xl font-semibold tracking-tight` |
89
+ | Serif lede / body-feature | Serif | `text-xl md:text-2xl leading-[1.35]` |
90
+ | Body (product / reading) | Serif | `text-[17px] leading-[1.7] text-[#191919]` |
91
+ | Body (UI / marketing prose) | Sans | `text-base leading-relaxed text-[#3d3d3a]` |
92
+ | Nav / button / label | Sans | `text-sm font-medium` |
93
+ | Eyebrow / caption | Sans | `text-xs uppercase tracking-[0.08em] text-[#6b6b66]` |
94
+
95
+ ### Hero composition (the poster)
96
+
97
+ Big lowercase sans words laid across a wide band, a couple of them ghosted and offset, with a serif paragraph anchored right.
98
+
99
+ ```tsx
100
+ <section className="bg-[#f0efe9] px-8 py-24">
101
+ <div className="grid grid-cols-1 lg:grid-cols-[1.3fr_1fr] gap-12">
102
+ <div className="relative font-sans font-bold lowercase leading-[0.95] tracking-[-0.02em] text-[clamp(48px,9vw,128px)] text-[#191919]">
103
+ <span className="underline decoration-2 underline-offset-[6px]">research</span>
104
+ <span className="ml-4 text-[#c9c7bd]">and</span>
105
+ <div>safety <span className="text-[#c9c7bd]">the</span> <span className="text-[#c9c7bd]">put</span></div>
106
+ </div>
107
+ <p className="font-serif text-2xl leading-[1.35] text-[#191919] self-center">
108
+ AI will have a vast impact on the world. Anthropic is a public benefit corporation...
109
+ </p>
110
+ </div>
111
+ </section>
112
+ ```
113
+
114
+ ---
115
+
116
+ ## Layout tokens
117
+
118
+ | Token | Value |
119
+ |-------|-------|
120
+ | `AN_SHELL` | `mx-auto w-full max-w-[1200px] px-6 md:px-10` |
121
+ | `AN_SECTION` | `py-16 md:py-24` |
122
+ | `AN_PANEL_RADIUS` | `rounded-[28px]` (large dark media panels) |
123
+ | `AN_CARD_RADIUS` | `rounded-2xl` (cards) |
124
+ | `AN_GAP` | `gap-8 md:gap-12` |
125
+
126
+ ### Dark media panel (the big black rounded block)
127
+
128
+ A near-full-width dark rectangle with very large top radius, used for video/imagery/feature on the cream.
129
+
130
+ ```tsx
131
+ <div className="rounded-[28px] bg-[#141413] text-[#f5f4ee] p-8 md:p-12 min-h-[420px]">...</div>
132
+ ```
133
+
134
+ ### App shell (claude.ai)
135
+
136
+ ```tsx
137
+ <div className="flex min-h-screen bg-[#262624] text-[#f5f4ee]">
138
+ <aside className="w-64 bg-[#1f1e1d] border-r border-[#3a3a37] p-3">{nav}</aside>
139
+ <main className="flex-1">
140
+ <div className="mx-auto max-w-3xl px-6 py-10 font-serif text-[17px] leading-[1.7]">{answer}</div>
141
+ </main>
142
+ </div>
143
+ ```
144
+
145
+ ---
146
+
147
+ ## Component patterns
148
+
149
+ ### Logo wordmark
150
+
151
+ ```tsx
152
+ <span className="font-sans text-xl font-bold uppercase tracking-tight">ANTHROP\C</span>
153
+ ```
154
+
155
+ The backslash replaces the `I`. On the app it's the serif "Claude" wordmark instead.
156
+
157
+ ### Nav
158
+
159
+ Sans, medium, ink. Dropdowns with a small chevron. Generous spacing.
160
+
161
+ ```tsx
162
+ <nav className="flex items-center gap-8 font-sans text-sm font-medium text-[#191919]">
163
+ <a>Research</a><a>Economic Futures</a>
164
+ <a className="inline-flex items-center gap-1">Learn <span>▾</span></a>
165
+ </nav>
166
+ ```
167
+
168
+ ### Primary button (black pill)
169
+
170
+ ```tsx
171
+ <button className="rounded-full bg-[#191919] px-5 py-2.5 font-sans text-sm font-medium text-[#f5f4ee] hover:bg-black">
172
+ Try Claude
173
+ </button>
174
+ ```
175
+
176
+ A split button pairs it with a square dropdown chip at the same radius family.
177
+
178
+ ### Coral link / mark
179
+
180
+ ```tsx
181
+ <a className="text-[#cc785c] underline decoration-1 underline-offset-2 hover:text-[#d97757]">read more</a>
182
+ ```
183
+
184
+ ### The spark (Claude glyph)
185
+
186
+ The coral asterisk/burst is the brand mark. Use as a small accent, loading indicator, or section marker - never large flat fills.
187
+
188
+ ```tsx
189
+ <span className="text-[#d97757] text-lg">✳</span>
190
+ ```
191
+
192
+ ### Card on cream
193
+
194
+ ```tsx
195
+ <div className="rounded-2xl bg-[#faf9f5] border border-[#dad9d2] p-6">
196
+ <h3 className="font-sans text-lg font-semibold">Title</h3>
197
+ <p className="mt-2 font-serif text-[17px] leading-relaxed text-[#3d3d3a]">...</p>
198
+ </div>
199
+ ```
200
+
201
+ ### App message (serif answer)
202
+
203
+ ```tsx
204
+ <div className="font-serif text-[17px] leading-[1.7] text-[#f5f4ee] space-y-5">
205
+ <p><b className="font-semibold">1. Postictal vomiting.</b> After a seizure...</p>
206
+ </div>
207
+ ```
208
+
209
+ Bold lead-ins inside serif paragraphs are a Claude pattern.
210
+
211
+ ### App input
212
+
213
+ ```tsx
214
+ <div className="rounded-2xl bg-[#30302e] border border-[#3a3a37] px-4 py-3 font-sans text-sm text-[#a8a79e]">
215
+ Write a message...
216
+ </div>
217
+ ```
218
+
219
+ ---
220
+
221
+ ## Charts (warm data viz)
222
+
223
+ - Series: ink `#191919`, warm grays `#6b6b66` / `#c9c7bd` / `#dad9d2`, with **coral `#cc785c`** as the single highlight series.
224
+ - Background stays cream; gridlines `#dad9d2`; axis text sans, muted.
225
+ - Soft-rounded bars (`borderRadius` 6-8), flat fills, no glow.
226
+ - Tooltip: ink `#191919` background, warm-white text.
227
+ - On dark panels, flip to warm-white text + `#3a3a37` gridlines, same coral highlight.
228
+
229
+ ---
230
+
231
+ ## Motion & effects
232
+
233
+ - Calm and slow. Subtle fades, gentle hover (bg/opacity shift), the spark can rotate slowly.
234
+ - Large radius + flat fill is the look; avoid heavy drop shadows. A faint shadow under floating dark panels is OK.
235
+ - No neon, no glass blur, no aggressive transforms.
236
+
237
+ ---
238
+
239
+ ## Mode selection
240
+
241
+ | Surface | Background | Type lead | Notes |
242
+ |---------|------------|-----------|-------|
243
+ | Marketing / landing | Cream `#f0efe9` | bold sans display + serif body | dark rounded media panels, pill buttons, ghost words |
244
+ | Product / app (Claude) | Dark warm `#262624` | serif body, sans chrome | sidebar, coral spark, rounded input |
245
+ | Reading / docs | Cream light `#faf9f5` | serif body | wide air, hairline dividers |
246
+
247
+ ---
248
+
249
+ ## Anti-patterns
250
+
251
+ | Avoid | Why |
252
+ |-------|-----|
253
+ | Pure `#fff` background or `#000` ink | Anthropic is warm: cream + near-black only |
254
+ | Serif for the hero display | Display is bold grotesque sans; serif is for reading |
255
+ | All-sans product copy | Long-form/product reading is serif (the Claude tell) |
256
+ | Coral as a large fill or multiple accent colors | One coral spice, used sparingly |
257
+ | Sharp `rounded-none` panels | Big soft radius is core; dark panels especially |
258
+ | Cold blue/indigo tech accent | Stay in the warm clay family |
259
+ | Dense bordered cards everywhere | Prefer air + type scale; few rules |
260
+ | Heavy neon glow / glassmorphism | Out of register; keep it flat and calm |
261
+
262
+ ---
263
+
264
+ ## Project overrides
265
+
266
+ If the repo defines `.agents/styles/anthropic.md` or `.agents/styles/anthropic-theme.md`, prefer those tokens and components over this portable spec.