@wenaixi/dsh-ponytail 4.9.0-dsh.0
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/AGENTS.md +32 -0
- package/CHANGELOG.md +29 -0
- package/LICENSE +21 -0
- package/README.md +140 -0
- package/assets/benchmark-3model.svg +21 -0
- package/assets/benchmark-agentic.svg +62 -0
- package/assets/logo-dark.png +0 -0
- package/assets/logo-dark.svg +115 -0
- package/assets/logo-greenpt-dark.svg +27 -0
- package/assets/logo-greenpt.svg +27 -0
- package/assets/logo.png +0 -0
- package/assets/social-preview.png +0 -0
- package/assets/waitlist-banner-es.png +0 -0
- package/assets/waitlist-banner-ko.png +0 -0
- package/assets/waitlist-banner.png +0 -0
- package/cordis.patch.yml +4 -0
- package/lib/ponytail-config.d.ts +28 -0
- package/lib/ponytail-config.d.ts.map +1 -0
- package/lib/ponytail-config.js +125 -0
- package/lib/ponytail-config.js.map +1 -0
- package/lib/ponytail-instructions.d.ts +5 -0
- package/lib/ponytail-instructions.d.ts.map +1 -0
- package/lib/ponytail-instructions.js +81 -0
- package/lib/ponytail-instructions.js.map +1 -0
- package/lib/ponytail-runtime.d.ts +16 -0
- package/lib/ponytail-runtime.d.ts.map +1 -0
- package/lib/ponytail-runtime.js +63 -0
- package/lib/ponytail-runtime.js.map +1 -0
- package/lib/ponytail.d.ts +74 -0
- package/lib/ponytail.d.ts.map +1 -0
- package/lib/ponytail.js +553 -0
- package/lib/ponytail.js.map +1 -0
- package/package.json +77 -0
- package/skills/ponytail/SKILL.md +77 -0
- package/skills/ponytail-audit/SKILL.md +31 -0
- package/skills/ponytail-debt/SKILL.md +31 -0
- package/skills/ponytail-gain/SKILL.md +37 -0
- package/skills/ponytail-help/SKILL.md +65 -0
- package/skills/ponytail-review/SKILL.md +45 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
# Ponytail, lazy senior dev mode
|
|
2
|
+
|
|
3
|
+
You are a lazy senior developer. Lazy means efficient, not careless. The best code is the code never written.
|
|
4
|
+
|
|
5
|
+
Before writing any code, stop at the first rung that holds:
|
|
6
|
+
|
|
7
|
+
1. Does this need to be built at all? (YAGNI)
|
|
8
|
+
2. Does it already exist in this codebase? Reuse the helper, util, or pattern that's already here, don't re-write it.
|
|
9
|
+
3. Does the standard library already do this? Use it.
|
|
10
|
+
4. Does a native platform feature cover it? Use it.
|
|
11
|
+
5. Does an already-installed dependency solve it? Use it.
|
|
12
|
+
6. Can this be one line? Make it one line.
|
|
13
|
+
7. Only then: write the minimum code that works.
|
|
14
|
+
|
|
15
|
+
The ladder runs after you understand the problem, not instead of it: read the task and the code it touches, trace the real flow end to end, then climb.
|
|
16
|
+
|
|
17
|
+
Bug fix = root cause, not symptom: a report names a symptom. Grep every caller of the function you touch and fix the shared function once — one guard there is a smaller diff than one per caller, and patching only the path the ticket names leaves a sibling caller still broken.
|
|
18
|
+
|
|
19
|
+
Rules:
|
|
20
|
+
|
|
21
|
+
- No abstractions that weren't explicitly requested.
|
|
22
|
+
- No new dependency if it can be avoided.
|
|
23
|
+
- No boilerplate nobody asked for.
|
|
24
|
+
- Deletion over addition. Boring over clever. Fewest files possible.
|
|
25
|
+
- Shortest working diff wins, but only once you understand the problem. The smallest change in the wrong place isn't lazy, it's a second bug.
|
|
26
|
+
- Question complex requests: "Do you actually need X, or does Y cover it?"
|
|
27
|
+
- Pick the edge-case-correct option when two stdlib approaches are the same size, lazy means less code, not the flimsier algorithm.
|
|
28
|
+
- Mark deliberate simplifications that cut a real corner with a known ceiling (global lock, O(n²) scan, naive heuristic) with a `ponytail:` comment naming the ceiling and upgrade path.
|
|
29
|
+
|
|
30
|
+
Not lazy about: understanding the problem (read it fully and trace the real flow before picking a rung, a small diff you don't understand is just laziness dressed up as efficiency), input validation at trust boundaries, error handling that prevents data loss, security, accessibility, the calibration real hardware needs (the platform is never the spec ideal, a clock drifts, a sensor reads off), anything explicitly requested. Lazy code without its check is unfinished: non-trivial logic leaves ONE runnable check behind, the smallest thing that fails if the logic breaks (an assert-based demo/self-check or one small test file; no frameworks, no fixtures). Trivial one-liners need no test.
|
|
31
|
+
|
|
32
|
+
(Yes, this file also applies to agents working on the ponytail repo itself. Especially to them.)
|
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
所有重要变更记录于此,格式基于 [Keep a Changelog](https://keepachangelog.com/zh-CN/1.0.0/),版本号与上游 [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail) 同步。
|
|
4
|
+
|
|
5
|
+
> **版本策略**:每个版本固定带 `-dsh.N` 后缀(如 `4.9.0-dsh.0`、`4.9.0-dsh.1`),初始即 `-dsh.0`。上游发新版时重置为新上游版本的 `-dsh.0`(如 `4.10.0-dsh.0`),用 `pnpm run bump:dsh -- 4.10.0`。递增:`pnpm run bump:dsh`。遵循 SemVer 预发布语义。
|
|
6
|
+
|
|
7
|
+
## [4.9.0-dsh.0] - 2026-08-21
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- 完整移植上游 v4.9.0:6 个 Skill(`ponytail` / `ponytail-review` / `ponytail-audit` / `ponytail-debt` / `ponytail-gain` / `ponytail-help`)
|
|
11
|
+
- Always-on 梯子注入(`systemPrompt` section, `order: 50`),随 `lite/full/ultra/off/review` 动态裁剪
|
|
12
|
+
- 复刻 hooks 行为:`activate` / `mode-tracker` / `subagent` / `config` / `instructions` / `runtime`
|
|
13
|
+
- `PONYTAIL_DEFAULT_MODE` env > cordis 配置 > 配置文件 > `full` 三级回退,`review` 不可作默认,BOM 处理、`isShellSafe`、`isDeactivationCommand` 全量对齐
|
|
14
|
+
- 中文化:6 个 Skill 的 `description` 与正文、fallback 指令、hook 日志、systemPrompt 注入文本全部中文,触发词兼容中英文
|
|
15
|
+
- `CLAUDE.md` 核心记忆库、`LICENSE`(MIT)、`README.md`、`CHANGELOG.md`、`assets/`、`AGENTS.md`
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
- DSH 形态:单一插件包 `@wenaixi/dsh-ponytail`,`dsh.bundle.patch = ./cordis.patch.yml`,包名引用挂载
|
|
19
|
+
- 注入文本中文化:`PONYTAIL 已激活 — 等级:…`,`hook` 日志全中文
|
|
20
|
+
- 版本统一带 `-dsh.N` 后缀,初始 `4.9.0-dsh.0`
|
|
21
|
+
|
|
22
|
+
### Fixed
|
|
23
|
+
- `initialMode` 优先级修正为 `env > cordis 显式 config > 文件 > full`,与上游语义一致
|
|
24
|
+
|
|
25
|
+
### Notes
|
|
26
|
+
- 无空 tool(不在 `ctx.tools` 注册任何占位),`scripts/verify.mjs` 校验
|
|
27
|
+
- 构建:`pnpm build` (`tsc -p tsconfig.build.json`),`pnpm typecheck`,`pnpm verify`
|
|
28
|
+
|
|
29
|
+
[4.9.0-dsh.0]: https://github.com/Wenaixi/dsh-ponytail/releases/tag/v4.9.0-dsh.0
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 DietrichGebert
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# dsh-ponytail
|
|
2
|
+
|
|
3
|
+
<p align="center">
|
|
4
|
+
<picture>
|
|
5
|
+
<source media="(prefers-color-scheme: dark)" srcset="assets/logo-dark.png">
|
|
6
|
+
<img src="assets/logo.png" width="180" alt="Ponytail" />
|
|
7
|
+
</picture>
|
|
8
|
+
</p>
|
|
9
|
+
|
|
10
|
+
<p align="center">
|
|
11
|
+
<strong>懒惰的资深工程师 · 移植到 DeepSeek Harness</strong><br/>
|
|
12
|
+
<em>The best code is the code you never wrote.</em>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
<p align="center">
|
|
16
|
+
<a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-111111?style=flat-square" alt="MIT"/></a>
|
|
17
|
+
<a href="https://www.npmjs.com/package/@wenaixi/dsh-ponytail"><img src="https://img.shields.io/npm/v/@wenaixi/dsh-ponytail?color=111111&style=flat-square" alt="npm"/></a>
|
|
18
|
+
<img src="https://img.shields.io/badge/version-4.9.0--dsh.0-111111?style=flat-square" alt="version"/>
|
|
19
|
+
<img src="https://img.shields.io/badge/DSH-0.1.1--rc.2-333333?style=flat-square" alt="DSH"/>
|
|
20
|
+
<img src="https://img.shields.io/badge/skills-6-008080?style=flat-square" alt="skills"/>
|
|
21
|
+
</p>
|
|
22
|
+
|
|
23
|
+
<p align="center">
|
|
24
|
+
<a href="CHANGELOG.md">Changelog</a> · <a href="https://github.com/DietrichGebert/ponytail">上游</a> · <a href="https://www.npmjs.com/package/@wenaixi/dsh-ponytail">npm</a>
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
> [DietrichGebert/ponytail](https://github.com/DietrichGebert/ponytail) v4.9.0 的 DSH 完整移植版 — always-on 注入 + 6 个中文 Skill,无空 tool。
|
|
30
|
+
|
|
31
|
+
## 🚀 安装(默认装到 `web`)
|
|
32
|
+
|
|
33
|
+
> `web` 即日常的 DSH Web UI(3080)。示例中的 `demo` 可换成任意 `--profile <name>`。
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# 方式一:npm(推荐,下次启动 web 生效,无需手动重启 3080)
|
|
37
|
+
dsh plugin --profile web add @wenaixi/dsh-ponytail
|
|
38
|
+
|
|
39
|
+
# 方式二:GitHub 直装(lib 已提交,无需构建)
|
|
40
|
+
dsh plugin --profile web add github:Wenaixi/dsh-ponytail
|
|
41
|
+
dsh plugin --profile web add github:Wenaixi/dsh-ponytail#v4.9.0-dsh.0
|
|
42
|
+
|
|
43
|
+
# 方式三:本地 / tarball
|
|
44
|
+
pnpm install && pnpm build && dsh plugin --profile web add ./
|
|
45
|
+
pnpm pack && dsh plugin --profile web add ./wenaixi-dsh-ponytail-4.9.0-dsh.0.tgz
|
|
46
|
+
|
|
47
|
+
# 卸载
|
|
48
|
+
dsh plugin --profile web remove @wenaixi/dsh-ponytail
|
|
49
|
+
|
|
50
|
+
# 验证(不重启 3080)
|
|
51
|
+
dsh --profile web --dump-config | grep -A2 ponytail
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
> `WARN missing peer @deepseek-ai/...` 属正常,peer 由 DSH 运行时提供;`Packages: +2 Done` 即成功。
|
|
55
|
+
|
|
56
|
+
## ✨ 特性
|
|
57
|
+
|
|
58
|
+
- **梯子 7 阶**:YAGNI → 复用 → 标准库 → 平台原生 → 已有依赖 → 一行 → 最小实现,`off` 时静默
|
|
59
|
+
- **6 个中文 Skill**(`rank: 550`):`ponytail` / `ponytail-review` / `ponytail-audit` / `ponytail-debt` / `ponytail-gain` / `ponytail-help`
|
|
60
|
+
- **三档强度**:`lite` / `full`(默认)/ `ultra`
|
|
61
|
+
- **无空 tool**:全部能力经 `ctx.skills` 暴露
|
|
62
|
+
|
|
63
|
+
| 能力 | 说明 |
|
|
64
|
+
|---|---|
|
|
65
|
+
| `ponytail` | 7 阶梯子,触发词兼容中英文 |
|
|
66
|
+
| `ponytail-review` | diff 评审,`delete/stdlib/native/yagni/shrink` |
|
|
67
|
+
| `ponytail-audit` | 全仓审计,按可删收益排序 |
|
|
68
|
+
| `ponytail-debt` | 收割 `ponytail:` 注释 |
|
|
69
|
+
| `ponytail-gain` | 收益看板(benchmark 中位数) |
|
|
70
|
+
| `ponytail-help` | 速查卡 |
|
|
71
|
+
|
|
72
|
+
## 🪝 Hook 注入
|
|
73
|
+
|
|
74
|
+
> 上游 `hooks/` 的 4 个生命周期 Hook 已合并进单一 DSH 插件,无需宿主配置。
|
|
75
|
+
|
|
76
|
+
| 上游 | DSH 侧 |
|
|
77
|
+
|---|---|
|
|
78
|
+
| `ponytail-config.js` | `src/ponytail-config.ts`(`env > 文件 > full`,`review` 不可默认) |
|
|
79
|
+
| `ponytail-instructions.js` | `src/ponytail-instructions.ts`(按 `lite/full/ultra` 裁剪 + 中文 fallback) |
|
|
80
|
+
| `ponytail-runtime.js` | `src/ponytail-runtime.ts`(`.ponytail-active` + 三平台识别) |
|
|
81
|
+
| `ponytail-activate.js` + `mode-tracker.js` + `subagent.js` | `src/ponytail.ts` 统一合并 |
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
启动: env PONYTAIL_DEFAULT_MODE → cordis defaultMode → ~/.config/ponytail/config.json → full
|
|
85
|
+
→ setMode(flag 文件)
|
|
86
|
+
|
|
87
|
+
每轮请求前: agent/pre-step (waterfall, 必须 return next())
|
|
88
|
+
→ 解析 /ponytail 族 / stop ponytail → 切 currentMode + 写 flag → next()
|
|
89
|
+
|
|
90
|
+
注入: systemPrompt:section { name: ponytail, order: 50 }
|
|
91
|
+
order 50 在 persona(0) 之后、工具(100) 之前;同步读 SKILL.md 按 currentMode 裁剪
|
|
92
|
+
off → 空,review → 指向技能,读盘失败 → 中文 fallback,assembly 前以 readMode() 对齐
|
|
93
|
+
|
|
94
|
+
持久化: /ponytail default <mode> → 写入 config.json
|
|
95
|
+
子智能体: PONYTAIL_SUBAGENT_MATCHER 正则(非法 warn 回退),共享同一 section
|
|
96
|
+
HMR: 全部走 ctx,热重载逆序自动清理
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`systemPrompt` 而非 `agent.inject`:落入日志可重建,`order: 50` 优先级高,每次 `assemble` 动态求值,`off` 零成本。Flag 兼容 `CLAUDE_PLUGIN_ROOT` / `PLUGIN_DATA` / `QODER_SESSION_ID`。
|
|
100
|
+
|
|
101
|
+
## ⚙️ 配置
|
|
102
|
+
|
|
103
|
+
```yaml
|
|
104
|
+
- insert:
|
|
105
|
+
- id: ponytail
|
|
106
|
+
name: "@wenaixi/dsh-ponytail"
|
|
107
|
+
config:
|
|
108
|
+
providerName: ponytail
|
|
109
|
+
defaultMode: full # off|lite|full|ultra
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
优先级:`PONYTAIL_DEFAULT_MODE` env > `cordis.defaultMode` > `~/.config/ponytail/config.json` > `full`。持久化:`/ponytail default <mode>` 写入文件,`review` 不可作默认。
|
|
113
|
+
|
|
114
|
+
## 🎮 使用
|
|
115
|
+
|
|
116
|
+
- 自动生效,无需手动触发
|
|
117
|
+
- `/ponytail [lite|full|ultra|off]` / `/ponytail default <mode>` / `/ponytail-review` / `/ponytail-audit` / `/ponytail-debt` / `/ponytail-gain` / `/ponytail-help`
|
|
118
|
+
- 退出:`stop ponytail` / `normal mode`(整句)或 `/ponytail off`
|
|
119
|
+
|
|
120
|
+
## 🛠️ 开发
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
pnpm typecheck && pnpm build && node scripts/verify.mjs
|
|
124
|
+
dsh --profile web --patch ./cordis.patch.yml --dump-config
|
|
125
|
+
pnpm dsh web --patch ./cordis.patch.yml # 热重载
|
|
126
|
+
# 发版:pnpm run bump:dsh && pnpm build && npm publish --provenance --access public
|
|
127
|
+
# 或 push tag v* 触发 GitHub Actions publish.yml
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
- 版本:每个版本固定带 `-dsh.N`(初始 `4.9.0-dsh.0`),`pnpm run bump:dsh` 递增,上游发新版时 `pnpm run bump:dsh -- 4.10.0` 重置
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 🔗 上游
|
|
135
|
+
|
|
136
|
+
原仓 https://github.com/DietrichGebert/ponytail(MIT,v4.9.0)· 本包 MIT · `ponytail:` 债务台账、`ponytail-gain` 永不输出本仓实时值
|
|
137
|
+
|
|
138
|
+
## 📄 许可
|
|
139
|
+
|
|
140
|
+
[MIT](LICENSE) © DietrichGebert / Wenaixi
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
<svg viewBox="0 0 860 336" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system, 'Segoe UI', Helvetica, Arial, sans-serif">
|
|
2
|
+
<title>Median lines of code per arm across three models</title>
|
|
3
|
+
<text x="20" y="26" font-size="15" font-weight="600" fill="#8b949e">Median lines of code. 10 runs per cell. Lower is leaner.</text>
|
|
4
|
+
<text x="20" y="45" font-size="12" fill="#8b949e" opacity="0.85">Ponytail writes 80-94% less code, costs 42-75% less, and runs 3-6x faster than a no-skill agent.</text>
|
|
5
|
+
<rect x="20" y="58" width="12" height="12" rx="2" fill="#8b949e"/><text x="38" y="69" font-size="13" fill="#8b949e">baseline (no skill)</text>
|
|
6
|
+
<rect x="190" y="58" width="12" height="12" rx="2" fill="#d9822b"/><text x="208" y="69" font-size="13" fill="#8b949e">caveman</text>
|
|
7
|
+
<rect x="300" y="58" width="12" height="12" rx="2" fill="#2da44e"/><text x="318" y="69" font-size="13" fill="#8b949e">ponytail</text>
|
|
8
|
+
<text x="112" y="119" font-size="13" font-weight="600" fill="#8b949e" text-anchor="end">Haiku</text>
|
|
9
|
+
<rect x="120" y="92" width="508" height="14" rx="2" fill="#8b949e"/><text x="634" y="103" font-size="11" fill="#8b949e">518</text>
|
|
10
|
+
<rect x="120" y="110" width="114" height="14" rx="2" fill="#d9822b"/><text x="240" y="121" font-size="11" fill="#d9822b">116</text>
|
|
11
|
+
<rect x="120" y="128" width="38" height="14" rx="2" fill="#2da44e"/><text x="164" y="139" font-size="11" fill="#2da44e" font-weight="600">39</text>
|
|
12
|
+
<text x="112" y="193" font-size="13" font-weight="600" fill="#8b949e" text-anchor="end">Sonnet</text>
|
|
13
|
+
<rect x="120" y="166" width="680" height="14" rx="2" fill="#8b949e"/><text x="806" y="177" font-size="11" fill="#8b949e">693</text>
|
|
14
|
+
<rect x="120" y="184" width="118" height="14" rx="2" fill="#d9822b"/><text x="244" y="195" font-size="11" fill="#d9822b">120</text>
|
|
15
|
+
<rect x="120" y="202" width="43" height="14" rx="2" fill="#2da44e"/><text x="169" y="213" font-size="11" fill="#2da44e" font-weight="600">44</text>
|
|
16
|
+
<text x="112" y="267" font-size="13" font-weight="600" fill="#8b949e" text-anchor="end">Opus</text>
|
|
17
|
+
<rect x="120" y="240" width="251" height="14" rx="2" fill="#8b949e"/><text x="377" y="251" font-size="11" fill="#8b949e">256</text>
|
|
18
|
+
<rect x="120" y="258" width="66" height="14" rx="2" fill="#d9822b"/><text x="192" y="269" font-size="11" fill="#d9822b">67</text>
|
|
19
|
+
<rect x="120" y="276" width="50" height="14" rx="2" fill="#2da44e"/><text x="176" y="287" font-size="11" fill="#2da44e" font-weight="600">51</text>
|
|
20
|
+
<text x="120" y="324" font-size="11" fill="#8b949e" opacity="0.8">Median of 10 runs/cell, default temperature. 5 tasks (email, debounce, CSV sum, countdown, rate-limit), same model per group. Reproduce: npx promptfoo eval -c benchmarks/promptfooconfig.yaml</text>
|
|
21
|
+
</svg>
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
<svg viewBox="0 0 860 488" xmlns="http://www.w3.org/2000/svg" font-family="-apple-system, 'Segoe UI', Helvetica, Arial, sans-serif">
|
|
2
|
+
<title>Each arm vs the no-skill baseline across every metric, plus safety, Claude Code on Haiku 4.5</title>
|
|
3
|
+
<text x="430" y="24" font-size="15" font-weight="600" fill="#8b949e" text-anchor="middle">Every metric vs the no-skill baseline (Claude Code, Haiku 4.5, 12 tasks)</text>
|
|
4
|
+
|
|
5
|
+
<rect x="212" y="38" width="12" height="12" rx="2" fill="#8b949e"/><text x="229" y="48" font-size="12" fill="#8b949e">baseline</text>
|
|
6
|
+
<rect x="300" y="38" width="12" height="12" rx="2" fill="#d9822b"/><text x="317" y="48" font-size="12" fill="#8b949e">caveman</text>
|
|
7
|
+
<rect x="392" y="38" width="12" height="12" rx="2" fill="#2da44e"/><text x="409" y="48" font-size="12" fill="#8b949e">ponytail</text>
|
|
8
|
+
<rect x="478" y="38" width="12" height="12" rx="2" fill="#8957e5"/><text x="495" y="48" font-size="12" fill="#8b949e">yagni-oneliner</text>
|
|
9
|
+
|
|
10
|
+
<text x="32" y="248" font-size="12" fill="#8b949e" text-anchor="middle" transform="rotate(-90 32 248)">% of baseline (lower is leaner)</text>
|
|
11
|
+
<line x1="85" y1="360" x2="815" y2="360" stroke="#8b949e" stroke-opacity="0.55"/>
|
|
12
|
+
<line x1="85" y1="305" x2="815" y2="305" stroke="#8b949e" stroke-opacity="0.16"/>
|
|
13
|
+
<line x1="85" y1="250" x2="815" y2="250" stroke="#8b949e" stroke-opacity="0.16"/>
|
|
14
|
+
<line x1="85" y1="195" x2="815" y2="195" stroke="#8b949e" stroke-opacity="0.16"/>
|
|
15
|
+
<line x1="85" y1="140" x2="815" y2="140" stroke="#8b949e" stroke-opacity="0.45" stroke-dasharray="4 4"/>
|
|
16
|
+
<text x="78" y="364" font-size="11" fill="#8b949e" text-anchor="end">0%</text>
|
|
17
|
+
<text x="78" y="309" font-size="11" fill="#8b949e" text-anchor="end">25%</text>
|
|
18
|
+
<text x="78" y="254" font-size="11" fill="#8b949e" text-anchor="end">50%</text>
|
|
19
|
+
<text x="78" y="199" font-size="11" fill="#8b949e" text-anchor="end">75%</text>
|
|
20
|
+
<text x="78" y="144" font-size="11" fill="#8b949e" text-anchor="end">100%</text>
|
|
21
|
+
|
|
22
|
+
<!-- LOC -->
|
|
23
|
+
<rect x="108" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="123" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
|
|
24
|
+
<rect x="146" y="184" width="30" height="176" rx="2" fill="#d9822b"/><text x="161" y="179" font-size="10" fill="#d9822b" text-anchor="middle">80%</text>
|
|
25
|
+
<rect x="184" y="259" width="30" height="101" rx="2" fill="#2da44e"/><text x="199" y="254" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">46%</text>
|
|
26
|
+
<rect x="222" y="213" width="30" height="147" rx="2" fill="#8957e5"/><text x="237" y="208" font-size="10" fill="#8957e5" text-anchor="middle">67%</text>
|
|
27
|
+
<text x="180" y="380" font-size="13" fill="#8b949e" text-anchor="middle">LOC</text>
|
|
28
|
+
<text x="180" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base 191</text>
|
|
29
|
+
|
|
30
|
+
<!-- tokens -->
|
|
31
|
+
<rect x="288" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="303" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
|
|
32
|
+
<rect x="326" y="125" width="30" height="235" rx="2" fill="#d9822b"/><text x="341" y="120" font-size="10" fill="#d9822b" text-anchor="middle">107%</text>
|
|
33
|
+
<rect x="364" y="188" width="30" height="172" rx="2" fill="#2da44e"/><text x="379" y="183" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">78%</text>
|
|
34
|
+
<rect x="402" y="171" width="30" height="189" rx="2" fill="#8957e5"/><text x="417" y="166" font-size="10" fill="#8957e5" text-anchor="middle">86%</text>
|
|
35
|
+
<text x="360" y="380" font-size="13" fill="#8b949e" text-anchor="middle">tokens</text>
|
|
36
|
+
<text x="360" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base 349k</text>
|
|
37
|
+
|
|
38
|
+
<!-- cost -->
|
|
39
|
+
<rect x="468" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="483" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
|
|
40
|
+
<rect x="506" y="136" width="30" height="224" rx="2" fill="#d9822b"/><text x="521" y="131" font-size="10" fill="#d9822b" text-anchor="middle">102%</text>
|
|
41
|
+
<rect x="544" y="184" width="30" height="176" rx="2" fill="#2da44e"/><text x="559" y="179" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">80%</text>
|
|
42
|
+
<rect x="582" y="188" width="30" height="172" rx="2" fill="#8957e5"/><text x="597" y="183" font-size="10" fill="#8957e5" text-anchor="middle">78%</text>
|
|
43
|
+
<text x="540" y="380" font-size="13" fill="#8b949e" text-anchor="middle">cost</text>
|
|
44
|
+
<text x="540" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base $0.10</text>
|
|
45
|
+
|
|
46
|
+
<!-- time -->
|
|
47
|
+
<rect x="648" y="140" width="30" height="220" rx="2" fill="#8b949e"/><text x="663" y="135" font-size="10" fill="#8b949e" text-anchor="middle">100%</text>
|
|
48
|
+
<rect x="686" y="136" width="30" height="224" rx="2" fill="#d9822b"/><text x="701" y="131" font-size="10" fill="#d9822b" text-anchor="middle">102%</text>
|
|
49
|
+
<rect x="724" y="199" width="30" height="161" rx="2" fill="#2da44e"/><text x="739" y="194" font-size="10" font-weight="600" fill="#2da44e" text-anchor="middle">73%</text>
|
|
50
|
+
<rect x="762" y="206" width="30" height="154" rx="2" fill="#8957e5"/><text x="777" y="201" font-size="10" fill="#8957e5" text-anchor="middle">70%</text>
|
|
51
|
+
<text x="720" y="380" font-size="13" fill="#8b949e" text-anchor="middle">time</text>
|
|
52
|
+
<text x="720" y="395" font-size="10" fill="#8b949e" opacity="0.8" text-anchor="middle">base 69s</text>
|
|
53
|
+
|
|
54
|
+
<text x="20" y="418" font-size="11" fill="#8b949e" opacity="0.8">Each bar = that arm's mean as a % of the no-skill baseline (the gray 100% bars). Lower is leaner / cheaper / faster; caveman rises above 100% on tokens, cost and time. n=4.</text>
|
|
55
|
+
|
|
56
|
+
<line x1="20" y1="438" x2="815" y2="438" stroke="#8b949e" stroke-opacity="0.25"/>
|
|
57
|
+
<text x="20" y="460" font-size="11" fill="#8b949e" opacity="0.9">Safety, separate 6-task adversarial tier (path-traversal, SQLi, token forgery, malformed input, rate-limit). Higher is safer:</text>
|
|
58
|
+
<text x="90" y="478" font-size="12" fill="#8b949e">baseline 100%</text>
|
|
59
|
+
<text x="230" y="478" font-size="12" fill="#d9822b">caveman 100%</text>
|
|
60
|
+
<text x="370" y="478" font-size="12" font-weight="600" fill="#2da44e">ponytail 100%</text>
|
|
61
|
+
<text x="510" y="478" font-size="12" fill="#8957e5">yagni-oneliner <tspan fill="#cf222e" font-weight="600">95%</tspan> (dropped a guard once)</text>
|
|
62
|
+
</svg>
|
|
Binary file
|