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.
package/README.md CHANGED
@@ -77,9 +77,15 @@ npx aiblueprint-cli@latest agents symlink
77
77
  # Centralize global skills and agents in ~/.agents
78
78
  npx aiblueprint-cli@latest agents unify
79
79
 
80
+ # Choose what to centralize interactively
81
+ npx aiblueprint-cli@latest agents unify -i
82
+
80
83
  # Unify project-local .claude/.cursor config into .agents
81
84
  npx aiblueprint-cli@latest agents unify projects
82
85
 
86
+ # Unify only selected project categories
87
+ npx aiblueprint-cli@latest agents unify projects --agents-md --skills --rules
88
+
83
89
  # Recover sessions from saved configs and backups
84
90
  npx aiblueprint-cli@latest agents config unify sessions
85
91
  ```
@@ -150,6 +156,7 @@ npx skills add Melvynx/aiblueprint --skill skill-manager
150
156
  | `merge` | Context-aware branch merging |
151
157
  | `prompt-creator` | Expert prompt engineering |
152
158
  | `skill-manager` | Manage skills and rules across Claude Code, Codex, and Cursor |
159
+ | `use-style` | Apply named UI style guides before implementation |
153
160
  | `rules-manager` | Create and maintain AGENTS.md and agent rule files |
154
161
  | `agents-managers` | Manage Claude Code agents and Task-tool orchestration |
155
162
  | `environments-manager` | Set up per-worktree agent environments |
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: use-style
3
+ description: Apply named visual style guides to landing pages and UI. Use for $use-style, /useskill, list styles, or styles like grid, vercel-simple, stripe, linear, raycast, gumroad, dusk, or split-auth.
4
+ ---
5
+
6
+ Load and apply a named style before designing or implementing any UI.
7
+
8
+ ## Invocation
9
+
10
+ - Explicit: `$use-style grid`, `/useskill split-auth`, `/useskill list`, or "use the grid style"
11
+ - Implicit: user references `/aiblueprint`, `/agents`, `/aibuilder`, "grid theme", Vercel, Geist, a minimalist dark tool UI, Stripe / fintech / checkout / dashboard UI, Linear / issue tracker / app-shell sidebar UI, NYT / newspaper / editorial / broadsheet / magazine layouts, Anthropic / Claude / warm cream AI-lab pages, Gumroad / neo-brutalist / loud commerce / bold yellow-pink pages, Raycast / glossy dark / glow gradients / floating glass nav / premium product marketing, or Dusk / Attio / dark CRM dashboard floating on a twilight backdrop / blue data viz / colorful category pills
12
+
13
+ Parse the style name from `$ARGUMENTS` or the message. Treat `split-auth`, `signin 2pages`, `signin-2pages`, `sign-in 2 pages`, `auth split`, and `two-column auth` as `split-auth`. Treat `list`, `styles`, `available styles`, and missing style names with no implicit match as a request to list available styles and ask the user to choose before designing. Default to `grid` for Codelynx product landings. Default to `vercel-simple` when the user references Vercel, Geist, or minimalist dark developer tools. Default to `linear` when the user references Linear, an issue tracker, or a dense sidebar + list + detail app shell. Default to `new-york-times` when the user references a newspaper, broadsheet, magazine, or serif editorial layout. Default to `anthropic` when the user references Anthropic, Claude, or a warm cream + serif AI-lab aesthetic. Default to `gumroad` when the user references Gumroad, neo-brutalism, hard offset shadows, or a loud yellow/pink bordered look. Default to `raycast` when the user references Raycast, a glossy dark page with glow gradients, a floating glass nav, or premium dark product marketing. Default to `dusk` when the user references Attio, a dark CRM/data dashboard floating on a twilight/aurora backdrop, vivid-blue charts, or colorful category pills. Default to `split-auth` when the user asks for a polished login, sign-in, signup, OAuth, magic-code, or password-reset page with a two-panel visual layout.
14
+
15
+ If the parsed style is `list`, or if no style can be inferred, do not load a style file. Reply with the available styles table below, add one short line asking which style to use, and stop until the user chooses.
16
+
17
+ ## Workflow
18
+
19
+ 1. Read `styles/<name>.md` from this skill directory.
20
+ 2. Check for project overrides and prefer them over the portable spec:
21
+ - `.agents/styles/<name>.md`
22
+ - `.agents/styles/<name>-theme.md`
23
+ - `.agents/styles/<name>-theme-migration.md` (migration playbooks only)
24
+ 3. Treat the loaded style as hard constraints for layout, typography, color, borders, motion, and component choice.
25
+ 4. Reuse existing primitives. In Codelynx repos, import `GridTheme*` components from `grid-theme-primitives.tsx` instead of reinventing patterns.
26
+
27
+ ## Available styles
28
+
29
+ | Style | File | Vibe |
30
+ |-------|------|------|
31
+ | `grid` | `styles/grid.md` | Blueprint landing. Square geometry, 1px borders, mono data, condensed display type. |
32
+ | `vercel-simple` | `styles/vercel-simple.md` | Vercel dark mode. Black canvas, Geist + mono, 1px `#333` borders, minimal accent. |
33
+ | `stripe` | `styles/stripe.md` | Stripe fintech UI. Pale `#f6f9fc` canvas, white cards on soft shadows, blurple `#635BFF` accent, green CTA, rounded geometry. |
34
+ | `linear` | `styles/linear.md` | Linear app shell. Near-black `#08090a` canvas, dense aligned sidebar + list + detail panes, indigo `#5e6ad2` accent, Inter Display headings, quiet line-defined chrome. |
35
+ | `new-york-times` | `styles/new-york-times.md` | Print-newspaper editorial. Paper-white, serif headlines (Cheltenham/Georgia), Franklin sans kickers, blackletter masthead, hairline rules, multi-column grid, red/blue accents only. |
36
+ | `anthropic` | `styles/anthropic.md` | Warm AI-lab. Cream `#f0efe9` paper, bold grotesque sans display + reading serif, clay-coral `#cc785c` accent, big soft-rounded dark panels, pill buttons. Light marketing + dark Claude app surfaces. |
37
+ | `gumroad` | `styles/gumroad.md` | Loud neo-brutalist commerce. Yellow `#ffc900` + pink `#ff90e8`, thick black borders, hard offset shadows `4px 4px 0 #000`, flat fills, bold geometric sans, pill buttons. Light marketplace + dark dashboard surfaces. |
38
+ | `raycast` | `styles/raycast.md` | Glossy dark product marketing. Near-black `#0a0a0a` + red `#ff6363` glow, floating glass nav (`backdrop-blur`), oversized bold pricing, large-radius `rounded-3xl` cards, soft glow over hard shadows. |
39
+ | `dusk` | `styles/dusk.md` | Refined dark data app (Attio-style). Rounded near-black window floating on a twilight gradient backdrop, vivid sky-blue `#38bdf8` charts, `#3b6eff` primary, colorful category pills, Inter + mono numbers. |
40
+ | `split-auth` | `styles/split-auth.md` | Two-column auth and OAuth pages. Left visual brand panel with optimized bitmap background, right clean form panel, monochrome social buttons, compact code inputs. |
41
+
42
+ Add new styles as `styles/<name>.md` and register them here.
43
+
44
+ ## Output rules
45
+
46
+ - Match the style vibe precisely. Do not blend with generic SaaS aesthetics.
47
+ - Honor the anti-patterns section in the style file.
48
+ - When a project spec lists concrete tokens or components, use those over prose approximations.
49
+ - For landing pages, scaffold the page shell from the style first, then fill sections.
50
+
51
+ ## Related skills
52
+
53
+ - `frontend-design` / `frontend-skill`: general UI craft. Defer to `use-style` when a named style is requested.
54
+ - `impeccable`: polish pass after the style is applied.
@@ -0,0 +1,400 @@
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=Inter:wght@400;500;600;700;800&family=Source+Serif+4:opsz,wght@8..60,400;8..60,500;8..60,600;8..60,700&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:#f0efe9; --bg-light:#faf9f5; --fg:#191919; --panel:#141413; --slate:#3d3d3a;
14
+ --muted:#6b6b66; --ghost:#c9c7bd; --border:#dad9d2;
15
+ --coral:#cc785c; --coral-bright:#d97757;
16
+ --on-dark:#f5f4ee;
17
+ --sans:'Inter', 'Helvetica Neue', Arial, sans-serif;
18
+ --serif:'Source Serif 4', Georgia, serif;
19
+ }
20
+ * { box-sizing:border-box; margin:0; padding:0; }
21
+ html { scroll-behavior:smooth; -webkit-text-size-adjust:100%; }
22
+ body { font-family:var(--serif); background:var(--bg); color:var(--fg); line-height:1.5; -webkit-font-smoothing:antialiased; }
23
+ .wrap { max-width:1080px; margin:0 auto; padding:0 28px; }
24
+ .sans { font-family:var(--sans); } .num { font-variant-numeric:tabular-nums; }
25
+ .eyebrow { font-family:var(--sans); font-size:12px; font-weight:600; letter-spacing:.08em; text-transform:uppercase; color:var(--muted); }
26
+
27
+ /* Top nav */
28
+ .topnav { display:flex; justify-content:space-between; align-items:center; padding:22px 0; }
29
+ .logo { font-family:var(--sans); font-size:20px; font-weight:700; letter-spacing:-0.01em; text-transform:uppercase; }
30
+ .navlinks { display:flex; gap:30px; align-items:center; font-family:var(--sans); font-size:14px; font-weight:500; }
31
+ .navlinks a { color:var(--fg); text-decoration:none; } .navlinks a:hover { color:var(--coral); }
32
+ .navlinks a.active { color:var(--coral); }
33
+ .btn-pill { font-family:var(--sans); font-size:14px; font-weight:500; background:var(--panel); color:var(--on-dark); border:none; border-radius:9999px; padding:10px 20px; cursor:pointer; }
34
+ .btn-pill:hover { background:#000; }
35
+
36
+ /* Hero - poster composition */
37
+ header { padding:54px 0 56px; }
38
+ .hero { display:grid; grid-template-columns:1.25fr 1fr; gap:40px; align-items:center; }
39
+ .hero-words { font-family:var(--sans); font-weight:800; text-transform:lowercase; letter-spacing:-0.03em; line-height:.92; font-size:clamp(42px,8vw,104px); color:var(--fg); position:relative; }
40
+ .hero-words .u { text-decoration:underline; text-decoration-thickness:3px; text-underline-offset:8px; }
41
+ .hero-words .ghost { color:var(--ghost); }
42
+ .hero-words .r2 { margin-top:.05em; }
43
+ .hero-lede { font-family:var(--serif); font-size:clamp(20px,2.4vw,28px); line-height:1.35; color:var(--fg); }
44
+ .hero-lede .spark { color:var(--coral-bright); }
45
+
46
+ /* Stats */
47
+ .stats { display:grid; grid-template-columns:repeat(4,1fr); gap:16px; padding-bottom:8px; }
48
+ .stat { background:var(--bg-light); border:1px solid var(--border); border-radius:18px; padding:24px 22px; }
49
+ .stat .k { font-family:var(--sans); font-size:11px; font-weight:600; letter-spacing:.05em; text-transform:uppercase; color:var(--muted); }
50
+ .stat .v { font-family:var(--sans); font-size:38px; font-weight:700; letter-spacing:-0.03em; margin-top:12px; line-height:1; color:var(--fg); }
51
+ .stat .d { font-family:var(--serif); font-size:14px; color:var(--slate); margin-top:11px; }
52
+
53
+ /* Sections */
54
+ section { padding:56px 0; }
55
+ section + section { border-top:1px solid var(--border); }
56
+ .sec-head { margin-bottom:34px; max-width:74ch; }
57
+ .sec-head .step { font-family:var(--sans); font-size:12px; font-weight:600; letter-spacing:.06em; text-transform:uppercase; color:var(--coral); }
58
+ .sec-head h2 { font-family:var(--sans); font-size:clamp(26px,3.4vw,40px); font-weight:700; letter-spacing:-0.025em; margin-top:12px; line-height:1.05; color:var(--fg); }
59
+ .sec-head p { font-family:var(--serif); font-size:18px; line-height:1.6; color:var(--slate); margin-top:16px; }
60
+
61
+ .grid-2 { display:grid; grid-template-columns:1fr 1fr; gap:20px; align-items:start; }
62
+ .panel { background:var(--bg-light); border:1px solid var(--border); border-radius:22px; padding:26px; }
63
+ .panel.dark { background:var(--panel); border:none; color:var(--on-dark); }
64
+ .panel .ptitle { font-family:var(--sans); font-size:15px; font-weight:600; }
65
+ .panel .psub { font-family:var(--sans); font-size:11.5px; color:var(--muted); text-transform:uppercase; letter-spacing:.04em; margin-top:4px; }
66
+ .chart-box { position:relative; height:300px; margin-top:18px; }
67
+ .chart-box.tall { height:240px; }
68
+
69
+ .legend { display:flex; gap:22px; flex-wrap:wrap; margin-top:18px; }
70
+ .legend span { font-family:var(--sans); display:inline-flex; align-items:center; gap:8px; font-size:13px; color:var(--slate); }
71
+ .legend i { width:11px; height:11px; border-radius:3px; display:inline-block; }
72
+
73
+ .note { font-family:var(--serif); margin-top:20px; padding-top:18px; border-top:1px solid var(--border); font-size:16px; line-height:1.6; color:var(--slate); max-width:82ch; }
74
+ .note b { color:var(--fg); font-weight:600; }
75
+
76
+ /* Big dark callout */
77
+ .big-callout { background:var(--panel); color:var(--on-dark); border-radius:28px; padding:40px 36px; margin-top:8px; }
78
+ .big-callout .lbl { font-family:var(--sans); font-size:12px; font-weight:600; text-transform:uppercase; letter-spacing:.05em; color:rgba(245,244,238,.55); }
79
+ .big-callout .row { display:flex; flex-wrap:wrap; align-items:baseline; gap:14px 48px; margin-top:20px; }
80
+ .big-callout .row .v { font-family:var(--sans); font-size:56px; font-weight:700; letter-spacing:-0.03em; }
81
+ .big-callout .row .eq { font-family:var(--serif); font-size:36px; color:var(--coral-bright); }
82
+ .big-callout .cap { font-family:var(--serif); font-size:16.5px; line-height:1.5; margin-top:20px; color:rgba(245,244,238,.82); max-width:62ch; }
83
+
84
+ .three { display:grid; grid-template-columns:repeat(3,1fr); gap:18px; }
85
+ .mini { background:var(--bg-light); border:1px solid var(--border); border-radius:18px; padding:22px; }
86
+ .mini .mt { font-family:var(--sans); font-size:14px; font-weight:600; } .mini .ms { font-family:var(--sans); font-size:11px; color:var(--muted); text-transform:uppercase; letter-spacing:.04em; margin-top:3px; }
87
+ .mini .cwrap { position:relative; height:150px; margin-top:14px; }
88
+
89
+ .verdict-table { width:100%; border-collapse:separate; border-spacing:0; background:var(--bg-light); border:1px solid var(--border); border-radius:22px; overflow:hidden; }
90
+ .verdict-table td { padding:20px 24px; font-family:var(--serif); font-size:16.5px; line-height:1.5; border-top:1px solid var(--border); vertical-align:top; }
91
+ .verdict-table tr:first-child td { border-top:none; }
92
+ .verdict-table td:first-child { font-weight:600; color:var(--fg); width:42%; }
93
+ .verdict-table td:last-child { color:var(--slate); }
94
+ .tag { font-family:var(--sans); font-size:10px; font-weight:600; padding:3px 9px; border-radius:9999px; vertical-align:middle; margin-right:8px; letter-spacing:.03em; text-transform:uppercase; }
95
+ .tag.no { background:var(--coral); color:#fff; } .tag.tie { background:var(--panel); color:var(--on-dark); }
96
+
97
+ footer { padding:48px 0 90px; }
98
+ footer .eyebrow { margin-bottom:20px; display:block; }
99
+ footer ul { list-style:none; display:grid; gap:14px; max-width:84ch; }
100
+ footer li { font-family:var(--serif); font-size:15.5px; line-height:1.55; color:var(--slate); padding-left:22px; position:relative; }
101
+ footer li::before { content:"✳"; position:absolute; left:0; top:2px; color:var(--coral); font-size:12px; }
102
+ footer li b { color:var(--fg); }
103
+ footer a { color:var(--coral); text-decoration:none; } footer a:hover { text-decoration:underline; }
104
+ footer .sig { font-family:var(--sans); margin-top:28px; font-size:12px; color:var(--muted); }
105
+
106
+ @media (max-width:860px){
107
+ .hero{grid-template-columns:1fr;} .navlinks{display:none;}
108
+ .stats{grid-template-columns:1fr 1fr;}
109
+ .grid-2{grid-template-columns:1fr;} .three{grid-template-columns:1fr;}
110
+ }
111
+ @media (max-width:480px){ .stats{grid-template-columns:1fr;} }
112
+
113
+ /* === responsive hardening (auto) === */
114
+ html, body { max-width:100%; overflow-x:hidden; }
115
+ img, canvas, svg, table { max-width:100%; }
116
+ .note, .mono, .lede, .big-callout .cap, .sec-head p, .stat .d, footer li { overflow-wrap:anywhere; word-break:break-word; }
117
+ @media (max-width:760px){
118
+ .grid-2, .three { grid-template-columns:1fr !important; }
119
+ .stats { grid-template-columns:1fr 1fr; }
120
+ .topnav, .nav, .topband .inner, .navpills, .hero { flex-wrap:wrap; }
121
+ .chart-box { height:260px; }
122
+ .chart-box.tall { height:240px; }
123
+ section { padding-top:40px; padding-bottom:40px; }
124
+ }
125
+ @media (max-width:560px){
126
+ .wrap { padding-left:16px; padding-right:16px; }
127
+ .stats { grid-template-columns:1fr; }
128
+ .big-callout { padding:24px 20px; }
129
+ .big-callout .row { gap:10px 22px; }
130
+ .big-callout .row .v { font-size:40px; }
131
+ .big-callout .row .eq { font-size:24px; }
132
+ .verdict-table, .verdict-table tbody, .verdict-table tr, .verdict-table td { display:block; width:100% !important; }
133
+ .verdict-table td { padding:14px 18px !important; }
134
+ .verdict-table td:first-child { padding-bottom:4px; }
135
+ .verdict-table td:last-child { padding-top:0; border-top:none !important; }
136
+ .chart-box { height:230px; }
137
+ .stat .v { font-size:32px; }
138
+ h1 { max-width:100% !important; }
139
+ }
140
+
141
+
142
+ /* === chart responsive fix (auto) === */
143
+ .grid-2, .three { min-width:0; }
144
+ .grid-2 > *, .three > *, .panel, .mini, .stat { min-width:0; }
145
+ .chart-box, .cwrap { position:relative; width:100%; }
146
+ .chart-box canvas, .cwrap canvas { max-width:100% !important; }
147
+
148
+ </style>
149
+ </head>
150
+ <body>
151
+ <div class="wrap">
152
+
153
+ <nav class="topnav">
154
+ <div class="logo">AGENT\S</div>
155
+ <div class="navlinks">
156
+ <a href="index.html">All reports</a>
157
+ <a href="#">Codex $200</a>
158
+ <a href="#">Claude Max 20x</a>
159
+ <a class="active" href="#">Real analysis</a>
160
+ </div>
161
+ <button class="btn-pill">Read methodology</button>
162
+ </nav>
163
+
164
+ <header>
165
+ <div class="hero">
166
+ <div class="hero-words">
167
+ <span class="u">cache</span> <span class="ghost">is</span><br>
168
+ <span class="r2">not <span class="ghost">the</span> work</span>
169
+ </div>
170
+ <p class="hero-lede">The reports say Codex $200 is worth ~$8,600/mo and Claude $200 ~$18,900/mo. <span class="spark">✳</span> Here is the proof that "Claude is worth 2× more" is misleading - and what is actually true.</p>
171
+ </div>
172
+ </header>
173
+
174
+ <div class="stats num">
175
+ <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>
176
+ <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>
177
+ <div class="stat"><div class="k">Real output value</div><div class="v">≈ tie</div><div class="d">$977 vs $911 / mo</div></div>
178
+ <div class="stat"><div class="k">The 2× gap</div><div class="v">artifact</div><div class="d">cache pricing + extrapolation</div></div>
179
+ </div>
180
+
181
+ <!-- 1 -->
182
+ <section>
183
+ <div class="sec-head">
184
+ <div class="step">01 / the symptom</div>
185
+ <h2>Where your tokens go vs where the dollars go</h2>
186
+ <p>Measured from your own logs (<span class="sans" style="font-size:15px">~/.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>
187
+ </div>
188
+ <div class="grid-2">
189
+ <div class="panel">
190
+ <div class="ptitle">Token count</div>
191
+ <div class="psub">89.8M tokens today</div>
192
+ <div class="chart-box"><canvas id="countD"></canvas></div>
193
+ </div>
194
+ <div class="panel">
195
+ <div class="ptitle">API-equivalent dollars</div>
196
+ <div class="psub">$113 today, at Opus list</div>
197
+ <div class="chart-box"><canvas id="dollarD"></canvas></div>
198
+ </div>
199
+ </div>
200
+ <div class="legend">
201
+ <span><i style="background:var(--s3)"></i> Cache read</span>
202
+ <span><i style="background:var(--s2)"></i> Cache write</span>
203
+ <span><i style="background:var(--s1)"></i> Output (real work)</span>
204
+ <span><i style="background:var(--s4)"></i> Fresh input</span>
205
+ </div>
206
+ <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>
207
+ </section>
208
+
209
+ <!-- 2 -->
210
+ <section>
211
+ <div class="sec-head">
212
+ <div class="step">02 / the core proof</div>
213
+ <h2>Both $200 plans, decomposed to the same monthly basis</h2>
214
+ <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 (coral) are nearly identical. The entire headline gap is the warm-gray cache bars.</p>
215
+ </div>
216
+ <div class="panel dark">
217
+ <div class="chart-box tall"><canvas id="decomp"></canvas></div>
218
+ <div class="legend">
219
+ <span><i style="background:var(--coral)"></i> Output (real work)</span>
220
+ <span><i style="background:#8a8983"></i> Cache re-read ($0.50/1M)</span>
221
+ <span><i style="background:#56554f"></i> First read (input / cache-write)</span>
222
+ </div>
223
+ <p class="note" style="color:rgba(245,244,238,.78);border-color:#3a3a37">Codex total <b style="color:#fff">$8,589</b> · Claude total <b style="color:#fff">$18,891</b>. Output: <b style="color:#fff">$977 vs $911</b>. Input/cache side: <b style="color:#fff">$7,612 vs $17,980 (2.4×)</b> - that is where 100% of the gap lives.</p>
224
+ </div>
225
+ </section>
226
+
227
+ <!-- 3 -->
228
+ <section>
229
+ <div class="sec-head">
230
+ <div class="step">03 / the punchline</div>
231
+ <h2>Strip away cache: the real work is a tie</h2>
232
+ <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>
233
+ </div>
234
+ <div class="big-callout">
235
+ <div class="lbl">Output value per month (real work)</div>
236
+ <div class="row num">
237
+ <div><div class="v">$977</div><div class="lbl" style="margin-top:8px">Codex $200</div></div>
238
+ <div class="eq">≈</div>
239
+ <div><div class="v">$911</div><div class="lbl" style="margin-top:8px">Claude $200</div></div>
240
+ </div>
241
+ <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>
242
+ </div>
243
+ </section>
244
+
245
+ <!-- 4 -->
246
+ <section>
247
+ <div class="sec-head">
248
+ <div class="step">04 / why the headline looks 2×</div>
249
+ <h2>Three calculation asymmetries inflate Claude's number</h2>
250
+ <p>None of these reflect more work delivered. They reflect how the number was built.</p>
251
+ </div>
252
+ <div class="three">
253
+ <div class="mini">
254
+ <div class="mt">Extrapolation multiplier</div>
255
+ <div class="ms">lower = more reliable</div>
256
+ <div class="cwrap"><canvas id="aExtrap"></canvas></div>
257
+ <p class="note" style="margin-top:14px;padding-top:14px;font-size:14.5px">Codex was measured at 99% quota. Claude was one day at 10%, multiplied ×10 - any error amplified 10×.</p>
258
+ </div>
259
+ <div class="mini">
260
+ <div class="mt">Price to cache context</div>
261
+ <div class="ms">first read, per 1M</div>
262
+ <div class="cwrap"><canvas id="aPrice"></canvas></div>
263
+ <p class="note" style="margin-top:14px;padding-top:14px;font-size:14.5px">Anthropic charges 2× for a "cache write" vs OpenAI's normal input. Same behavior, pricier meter.</p>
264
+ </div>
265
+ <div class="mini">
266
+ <div class="mt">Context re-reads</div>
267
+ <div class="ms">per output token</div>
268
+ <div class="cwrap"><canvas id="aReread"></canvas></div>
269
+ <p class="note" style="margin-top:14px;padding-top:14px;font-size:14.5px">Claude re-reads ~2× more context per unit of output, bloating the cache-read line.</p>
270
+ </div>
271
+ </div>
272
+ </section>
273
+
274
+ <!-- 5 -->
275
+ <section>
276
+ <div class="sec-head">
277
+ <div class="step">05 / watch the gap melt</div>
278
+ <h2>Remove the artifacts and $18.9k slides toward $8.6k</h2>
279
+ <p>Starting from Claude's headline, undo each calculation artifact in turn. The gap to Codex's measured number shrinks at every step.</p>
280
+ </div>
281
+ <div class="panel">
282
+ <div class="chart-box tall"><canvas id="bridge"></canvas></div>
283
+ <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>
284
+ </div>
285
+ </section>
286
+
287
+ <!-- 6 -->
288
+ <section>
289
+ <div class="sec-head">
290
+ <div class="step">06 / the honest answer</div>
291
+ <h2>What is actually true</h2>
292
+ </div>
293
+ <table class="verdict-table">
294
+ <tr>
295
+ <td>Which $200 plan does more real work?</td>
296
+ <td><span class="tag tie">tie</span>Roughly equal - output ~$977 vs ~$911 / mo.</td>
297
+ </tr>
298
+ <tr>
299
+ <td>Which API would bill more for this usage at full quota?</td>
300
+ <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>
301
+ </tr>
302
+ <tr>
303
+ <td>Is "$9k vs $20k = Claude worth 2×" a fair comparison?</td>
304
+ <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>
305
+ </tr>
306
+ </table>
307
+ <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>
308
+ </section>
309
+
310
+ <footer>
311
+ <span class="eyebrow">Confidence &amp; sources</span>
312
+ <ul>
313
+ <li><b>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>
314
+ <li><b>Inferred from the math</b> (high): normalizing cache-write price drops Claude to ~$15.6k; the ×10 extrapolation makes the headline unreliable.</li>
315
+ <li><b>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>
316
+ <li>Data: <span class="sans" style="font-size:13px">result/melvynx/codex/2026-05-30T09-13-16Z</span>, <span class="sans" style="font-size:13px">result/taka-foo/claude</span>. Full write-up: <a href="real-analysis.md">real-analysis.md</a>.</li>
317
+ <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>
318
+ </ul>
319
+ <div class="sig">Real Analysis · generated from agents-analysis data · API-equivalent value is not the provider's real cost.</div>
320
+ </footer>
321
+
322
+ </div>
323
+
324
+ <script>
325
+ // warm palette: coral highlight + warm grays / ink
326
+ const CORAL="#cc785c", INK="#191919", S2="#8a8983", S3="#bdbcb4", S4="#dad9d2", GRID="#dad9d2";
327
+ document.documentElement.style.setProperty('--s1', CORAL);
328
+ document.documentElement.style.setProperty('--s2', S2);
329
+ document.documentElement.style.setProperty('--s3', S3);
330
+ document.documentElement.style.setProperty('--s4', S4);
331
+
332
+ Chart.defaults.font.family = "Inter, Helvetica, Arial, sans-serif";
333
+ Chart.defaults.color = "#6b6b66";
334
+ Chart.defaults.font.size = 12;
335
+ const usd = (v) => "$" + v.toLocaleString("en-US",{maximumFractionDigits:0});
336
+ const tip = { backgroundColor:"#191919", padding:10, cornerRadius:10, titleFont:{family:"Inter"}, bodyFont:{family:"Inter"} };
337
+
338
+ function dough(id, data, fmt){
339
+ new Chart(document.getElementById(id), {
340
+ type:"doughnut",
341
+ data:{ labels:["Cache read","Cache write","Output","Fresh input"],
342
+ datasets:[{ data, backgroundColor:[S3,S2,CORAL,S4], borderColor:"#faf9f5", borderWidth:3, hoverOffset:6 }] },
343
+ options:{ responsive:true, maintainAspectRatio:false, cutout:"62%",
344
+ plugins:{ legend:{display:false}, tooltip:{...tip, callbacks:{ label:(c)=>c.label+": "+fmt(c.parsed) }} } }
345
+ });
346
+ }
347
+ dough("countD", [83.3,5.7,0.5,0.3], (v)=>v+"M tokens");
348
+ dough("dollarD", [41.64,56.93,13.23,1.48], (v)=>"$"+v.toFixed(2));
349
+
350
+ // decomposition on dark panel -> warm-white labels, dark gridlines
351
+ new Chart(document.getElementById("decomp"), {
352
+ type:"bar",
353
+ data:{ labels:["Codex $200","Claude $200"],
354
+ datasets:[
355
+ { label:"Output (real work)", data:[977,911], backgroundColor:CORAL, borderRadius:{topLeft:6,bottomLeft:6} },
356
+ { label:"Cache re-read", data:[5303,11319], backgroundColor:"#8a8983" },
357
+ { label:"First read (input/cache-write)", data:[2309,6661], backgroundColor:"#56554f", borderRadius:{topRight:6,bottomRight:6} }
358
+ ] },
359
+ options:{ indexAxis:"y", responsive:true, maintainAspectRatio:false,
360
+ plugins:{ legend:{display:false}, tooltip:{...tip, callbacks:{ label:(c)=>c.dataset.label+": "+usd(c.parsed.x) }} },
361
+ scales:{ x:{ stacked:true, grid:{color:"#3a3a37"}, border:{display:false}, ticks:{ color:"#a8a79e", callback:(v)=>"$"+(v/1000)+"k" } },
362
+ y:{ stacked:true, grid:{display:false}, border:{color:"#3a3a37"}, ticks:{ font:{family:"Inter",size:13,weight:600}, color:"#f5f4ee" } } } }
363
+ });
364
+
365
+ function mini(id, vals, fmt, max){
366
+ new Chart(document.getElementById(id), {
367
+ type:"bar",
368
+ data:{ labels:["Codex","Claude"], datasets:[{ data:vals, backgroundColor:[S2,CORAL], borderRadius:8, barPercentage:0.6 }] },
369
+ options:{ responsive:true, maintainAspectRatio:false,
370
+ plugins:{ legend:{display:false}, tooltip:{...tip, callbacks:{ label:(c)=>fmt(c.parsed.y) }} },
371
+ scales:{ x:{ grid:{display:false}, border:{color:GRID}, ticks:{font:{family:"Inter",size:12}} },
372
+ y:{ grid:{color:GRID}, border:{display:false}, max, ticks:{ callback:fmt } } } }
373
+ });
374
+ }
375
+ mini("aExtrap", [4.38,43.33], (v)=>"×"+(typeof v==="number"?v.toFixed(v<10?1:0):v), 48);
376
+ mini("aPrice", [5,10], (v)=>"$"+v, 12);
377
+ mini("aReread", [326,621], (v)=>v.toFixed(0), 700);
378
+
379
+ new Chart(document.getElementById("bridge"), {
380
+ type:"bar",
381
+ data:{ labels:["Claude headline","− cache-write premium","− 1-day extrapolation","Codex (measured)"],
382
+ datasets:[{ data:[18891,15562,12600,8589], backgroundColor:[CORAL,"#d8a48f","#cbcabf",INK], borderRadius:8, barPercentage:0.62 }] },
383
+ options:{ responsive:true, maintainAspectRatio:false,
384
+ plugins:{ legend:{display:false}, tooltip:{...tip, callbacks:{ label:(c)=>usd(c.parsed.y)+" / mo" }} },
385
+ scales:{ x:{ grid:{display:false}, border:{color:GRID}, ticks:{font:{family:"Inter",size:11}} },
386
+ y:{ grid:{color:GRID}, border:{display:false}, ticks:{ callback:(v)=>"$"+(v/1000)+"k" } } } }
387
+ });
388
+ </script>
389
+
390
+ <script>
391
+ // force Chart.js to reflow on viewport changes (belt-and-suspenders)
392
+ (function(){
393
+ function resizeAll(){ if(window.Chart && Chart.instances){ Object.values(Chart.instances).forEach(function(c){ try{c.resize();}catch(e){} }); } }
394
+ var t; window.addEventListener('resize', function(){ clearTimeout(t); t=setTimeout(resizeAll,120); });
395
+ window.addEventListener('orientationchange', function(){ setTimeout(resizeAll,200); });
396
+ })();
397
+ </script>
398
+
399
+ </body>
400
+ </html>