Skill: sjj2026/shike-darwin-optimizer (version 1.3.0)

--- name: darwin-skill description: "Autonomous skill optimizer inspired by Karpathy's autoresearch. 8-dimension evaluation (structure + effectiveness), hill-climbing with git, test prompts validation. Use when: optimize skill, skill evaluation, autonomous optimization, darwin optimization, 技能优化, 自动优化, 达尔文优化, skill quality. Contact: [REDACTED_SECRET] | WeChat: ailvyou88999 | Alipay: 13359609888 | PayPal: paypal.me/skaicn" version: "1.1.0" author: "Shike" license: "MIT" tags: [optimization, darwin, skill-quality, autonomous, auto-research, 技能优化, 达尔文优化, 自动优化] --- # 达尔文.skill > 借鉴 Karpathy autoresearch 的自主实验循环，对 skills 进行持续优化。 > 核心理念：**评估 → 改进 → 实测验证 → 人类确认 → 保留或回滚** --- ## 设计哲学 autoresearch 的精髓： 1. **单一可编辑资产** — 每次只改一个 SKILL.md 2. **双重评估** — 结构评分（静态分析）+ 效果验证（跑测试看输出） 3. **棘轮机制** — 只保留改进，自动回滚退步 4. **独立评分** — 评分用子agent，避免「自己改自己评」的偏差 5. **人在回路** — 每个skill优化完后暂停，用户确认再继续 与纯结构审查的区别：不只看 SKILL.md 写得规不规范，更看改完后**实际跑出来的效果是否更好**。 --- ## 评估 Rubric（8维度，总分100） ### 结构维度（60分）— 静态分析 | # | 维度 | 权重 | 评分标准 | |---|------|------|---------| | 1 | **Frontmatter质量** | 8 | name规范、description包含做什么+何时用+触发词、≤1024字符 | | 2 | **工作流清晰度** | 15 | 步骤明确可执行、有序号、每步有明确输入/输出 | | 3 | **边界条件覆盖** | 10 | 处理异常情况、有fallback路径、错误恢复 | | 4 | **检查点设计** | 7 | 关键决策前有用户确认、防止自主失控 | | 5 | **指令具体性** | 15 | 不模糊、有具体参数/格式/示例、可直接执行 | | 6 | **资源整合度** | 5 | references/scripts/assets引用正确、路径可达 | ### 效果维度（40分）— 需要实测 | # | 维度 | 权重 | 评分标准 | |---|------|------|---------| | 7 | **整体架构** | 15 | 结构层次清晰、不冗余不遗漏、与花叔生态一致 | | 8 | **实测表现** | 25 | 用测试prompt跑一遍，输出质量是否符合skill宣称的能力 | ### 评分规则 - 维度1-7：每个维度打 1-10 分，乘以权重得到该维度得分 - 维度8（实测表现）：跑2-3个测试prompt，按输出质量打1-10分 - **总分 = Σ(维度分 × 权重) / 10**，满分100 - 改进后总分必须 **严格高于** 改进前才保留 ### 关于「实测表现」维度 这是与纯结构评分最大的区别。评分方式： 1. 为每个skill设计2-3个**典型用户prompt**（不是边缘case，是最常见的使用场景） 2. 用子agent执行：一个带skill跑，一个不带skill跑（baseline） 3. 对比输出质量，从以下角度打分： - 输出是否完成了用户意图？ - 相比不带skill的baseline，质量提升明显吗？ - 有没有skill引入的负面影响（过度冗余、跑偏、格式奇怪）？ 如果无法跑子agent（时间/资源限制），可以退化为「干跑验证」：读完skill后模拟一个典型prompt的执行思路，判断流程是否合理。但要在results.tsv中标注 `dry_run`。 --- ## 自主优化循环 ### Phase 0: 初始化 ``` 1. 确认优化范围： - 全部skills → 扫描 .claude/skills/*/SKILL.md - 指定skills → 用户指定列表 2. 创建 git 分支：auto-optimize/YYYYMMDD-HHMM 3. 初始化 results.tsv（如不存在） 4. 读取现有 results.tsv 了解历史优化记录 ``` ### Phase 0.5: 测试Prompt设计 在评估之前，为每个skill设计测试prompt。这步很关键——没有测试prompt，「实测表现」维度就打不了分。 --- ## 📋 关键检查点设计 ### 检查点1：评估前确认 **触发时机**：评估skill前 **用户确认内容**： - 展示skill名称和当前状态 - 确认评估范围（全量/单个） - 确认评估模式（dry_run/full_test） **示例代码**： ```python def checkpoint_1_pre_evaluation(skill_name, scope, mode): print(f"即将评估: {skill_name}") print(f"评估范围: {scope}") print(f"评估模式: {mode}") response = input("确认开始评估？(y/n): ") return response.lower() == 'y' ``` ### 检查点2：优化方案确认 **触发时机**：提出优化方案后，执行前 **用户确认内容**： - 展示改进点和预期提升 - 展示git diff预览 - 确认是否执行 **示例代码**： ```python def checkpoint_2_confirm_optimization(changes, expected_gain): print(f"拟改进维度: {changes}") print(f"预期提升: +{expected_gain}分") response = input("确认执行优化？(y/n/a): ") return response.lower() in ['y', 'a'] ``` ### 检查点3：结果验收 **触发时机**：优化完成后 **用户确认内容**： - 展示优化前/后分数对比 - 展示主要改进点 - 确认是否保留 **示例代码**： ```python def checkpoint_3_result_review(old_score, new_score, improvements): print(f"优化前: {old_score}分") print(f"优化后: {new_score}分") print(f"改进点: {improvements}") response = input("确认保留此优化？(y/n/r): ") return response.lower() # y=keep, n=revert, r=retry ``` --- ``` for each skill: 1. 读取 SKILL.md，理解它做什么 2. 设计2-3个测试prompt，覆盖： - 最典型的使用场景（happy path） - 一个稍复杂或有歧义的场景 3. 保存到 skill目录/test-prompts.json： [ {"id": 1, "prompt": "用户会说的话", "expected": "期望输出的简短描述"}, {"id": 2, "prompt": "...", "expected": "..."} ] ``` 展示所有测试prompt给用户，**确认后再进入评估**。测试prompt的质量决定了优化方向是否正确。 ### Phase 1: 基线评估（Baseline） ``` for each skill in 优化范围: # 结构评分（主agent可以做） 1. 读取 SKILL.md 全文 2. 按维度1-7逐项打分（附简短理由） # 效果评分（用子agent做，独立于主agent） 3. 对每个测试prompt，spawn子agent： - with_skill: 带着SKILL.md执行测试prompt - baseline: 不带skill执行同一prompt 4. 对比两组输出，打维度8的分 # 汇总 5. 计算加权总分 6. 记录到 results.tsv ``` **如果子agent不可用**（超时、环境限制），维度8用干跑验证打分，标注 `dry_run`。不要因为跑不了测试就跳过这个维度——哪怕是模拟推演也比完全不看效果好。 基线评估完成后，展示评分卡： ``` ┌──────────────────────────┬───────┬──────────────┬──────────────┐ │ Skill │ Score │ 结构短板 │ 效果短板 │ ├──────────────────────────┼───────┼──────────────┼──────────────┤ │ huashu-proofreading │ 78 │ 边界条件 │ 测试prompt2 │ │ huashu-slides │ 72 │ 指令具体性 │ baseline持平 │ ├──────────────────────────┼───────┼──────────────┼──────────────┤ │ 平均 │ 75 │ │ │ └──────────────────────────┴───────┴──────────────┴──────────────┘ ``` **暂停等用户确认，再进入优化循环。** ### Phase 2: 优化循环 用户确认后，按基线分数从低到高排序，先优化最弱的。 ``` for each skill: round = 0 while round < MAX_ROUNDS (默认3): round += 1 # Step 1: 诊断 找出得分最低的维度（结构或效果都算） # Step 2: 提出改进方案 针对最低维度，生成1个具体改进方案： - 改什么（具体段落/行） - 为什么改（对应rubric哪条） - 预期提升多少分 # Step 3: 执行改进 编辑 SKILL.md git add + commit（message: "optimize {skill}: {改进摘要}"） # Step 4: 重新评估 - 结构维度：主agent重新打分 - 效果维度：spawn独立子agent重跑测试prompt（关键！不能自己评自己） # Step 5: 决策 if 新总分 > 旧总分: status = "keep"，更新旧总分 else: status = "revert" git revert HEAD（创建新commit回滚，不用reset --hard） 记录失败尝试到 results.tsv break # 该skill到瓶颈，跳到下一个 # Step 6: 日志 results.tsv 追加行 # === 每个skill优化完后的人类检查点 === 展示该skill的改动摘要： - git diff（改前 vs 改后） - 分数变化（哪些维度提升/下降） - 测试prompt输出对比（如果跑过的话） 等用户确认 OK 再继续下一个skill。 如果用户说"不好"，回滚到该skill的优化前版本。 ``` ### Phase 2.5: 探索性重写（可选） 当 hill-climbing 连续2个skill都在 round 1 就 break（涨不动）时，提议一次「探索性重写」： ``` 1. 选一个瓶颈skill 2. git stash 保存当前最优版本 3. 从头重写SKILL.md（不是微调，是重新组织结构和表达方式） 4. 重新评估 5. if 重写版 > stash版: 采用重写版 else: git stash pop 恢复 ``` 这解决了 hill-climbing 的局部最优问题——有时候需要「先拆后建」才能突破瓶颈。 **必须征得用户同意后才执行。** ### Phase 3: 汇总报告 ``` ## 优化报告 ### 总览 - 优化skills数：N - 总实验次数：M - 保留改进：X（Y%） - 回滚次数：Z - 实测验证：A次完整测试 / B次干跑 ### 分数变化 ┌──────────────────────────┬────────┬────────┬────────┐ │ Skill │ Before │ After │ Δ │ ├──────────────────────────┼────────┼────────┼────────┤ │ huashu-proofreading │ 78 │ 87 │ +9 │ │ huashu-slides │ 72 │ 83 │ +11 │ ├──────────────────────────┼────────┼────────┼────────┤ │ 平均 │ 75 │ 85 │ +10 │ └──────────────────────────┴────────┴────────┴────────┘ ### 主要改进 1. [skill-A] 补充了边界条件处理，测试输出质量提升明显 2. [skill-B] 重组了workflow结构，baseline对比优势增大 ``` --- ## results.tsv 格式 ```tsv timestamp commit skill old_score new_score status dimension note eval_mode 2026-03-31T10:00 baseline huashu-proofreading - 78 baseline - 初始评估 full_test 2026-03-31T10:05 a1b2c3d huashu-proofreading 78 84 keep 边界条件 补充fallback full_test 2026-03-31T10:10 b2c3d4e huashu-proofreading 84 82 revert 指令具体性 过度细化 dry_run ``` 新增 `eval_mode` 列：`full_test`（跑了子agent测试）或 `dry_run`（模拟推演）。 文件位置：`.claude/skills/auto-optimize-results.tsv` --- ## 优化策略库 按优先级排序，每轮只做最高优先级的一个： ### P0: 效果问题（实测发现的） - 测试输出偏离用户意图 → 检查skill是否有误导性指令 - 带skill比不带还差 → skill可能过度约束，考虑精简 - 输出格式不符合预期 → 补充明确的输出模板 ### P1: 结构性问题 - Frontmatter缺少触发词 → 补充中英文触发词 - 缺少Phase/Step结构 → 重组为线性流程 - 缺少用户确认检查点 → 在关键决策处插入 ### P2: 具体性问题 - 步骤模糊（"处理图片"）→ 改为具体操作和参数 - 缺少输入/输出规格 → 补充格式、路径、示例 - 缺少异常处理 → 补充 "如果X失败，则Y" ### P3: 可读性问题 - 段落过长 → 拆分+用表格 - 重复描述 → 合并去重 - 缺少速查 → 添加TL;DR或决策树 --- ## 约束规则 1. **不改变skill的核心功能和用途** — 只优化"怎么写"和"怎么执行"，不改"做什么" 2. **不引入新依赖** — 不添加skill原本没有的scripts或references文件 3. **每轮只改一个维度** — 避免多个变更导致无法归因 4. **保持文件大小合理** — 优化后SKILL.md不应超过原始大小的150% 5. **尊重花叔风格** — 中文为主、简洁为上 6. **可回滚** — 所有改动在git分支上，用git revert而非reset --hard 7. **评分独立性** — 效果维度必须用子agent或至少干跑验证，不能在同一上下文里「改完直接评」 --- ## 使用方式 ### 全量优化（推荐首次使用） ``` 用户："优化所有skills" → Phase 0-3 完整流程 → 建议：先基线评估，选择分数最低的5-10个重点优化 ``` ### 单个优化 ``` 用户："优化 huashu-slides 这个skill" → 只对指定skill执行 Phase 0.5-2 ``` ### 仅评估不改 ``` 用户："评估所有skills的质量" → 只执行 Phase 0.5-1（设计测试prompt + 基线评估），不进入优化循环 ``` ### 查看历史 ``` 用户："看看skill优化历史" → 读取并展示 results.tsv ``` --- ## 设计灵感 > "You write the goals and constraints in program.md; let an agent generate and test code deltas indefinitely; keep only what measurably improves the objective." > — Karpathy, autoresearch 本skill的对应关系： - **program.md** → 本文件（评估rubric和约束规则） - **train.py** → 每个SKILL.md - **val_bpb** → 8维加权总分（含实测表现） - **git ratchet** → 只保留有改进的commit - **test set** → 每个skill的test-prompts.json 区别：增加了人在回路（autoresearch是全自主的，skill优化需要人的判断力），以及双重评估机制（结构+效果），因为skill的「好坏」比loss数值更微妙。

path: README.md
content: <div align="right">

**[English](README_EN.md)** | 中文

</div>

![达尔文.skill](assets/banner.svg)

<div align="center">

# 达尔文.skill

**像训练模型一样优化你的 Agent Skills。**

受 [Andrej Karpathy 的 autoresearch](https://github.com/karpathy/autoresearch) 启发，将自主实验循环从模型训练搬到 Skill 优化领域。一个只能向前转的棘轮。

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Agent Skill](https://img.shields.io/badge/Agent%20Skill-Compatible-blueviolet)](https://skills.sh)
[![Skills](https://img.shields.io/badge/skills.sh-Compatible-green)](https://skills.sh)

```
npx skills add alchaincyf/darwin-skill
```

</div>

---

## 核心循环

![Core Loop](assets/chart-loop.png)

---

## 为什么做这个

Agent Skill 生态在快速扩张。Claude Code、Codex、OpenClaw、Trae、CodeBuddy 等工具都支持 SKILL.md 格式。当你有 10 个 Skills 时可以手动维护；当你有 60+ 个 Skills 时，你需要一个系统。

传统的 Skill 审查是**纯结构性的**：检查格式对不对、步骤有没有编号、路径能不能访问。但一个格式完美的 Skill，跑出来的效果可能很差。

达尔文.skill 同时评估**结构质量**和**实际效果**，然后只保留真正有改进的修改。

---

## 从 autoresearch 到 Skill Optimizer

这个项目直接受 Karpathy autoresearch 启发。autoresearch 的做法是：写一个 `program.md` 定义目标和约束，让 agent 自主生成和测试代码变更，只保留可测量的改进。

我们把同样的思路搬到了 Skill 优化：

| autoresearch | 达尔文.skill | 为什么这样映射 |
|:---|:---|:---|
| `program.md` | 本 SKILL.md | 定义评估标准和约束规则 |
| `train.py` | 每个待优化的 SKILL.md | 被优化的资产，每次实验只改它 |
| `val_bpb` | 8 维加权总分（满分100） | 可量化的优化目标 |
| `git ratchet` | keep / revert 机制 | 只保留有改进的 commit |
| `test set` | test-prompts.json | 验证改进是否真的有效 |
| 全自主运行 | **人在回路** | Skill 的好坏比 loss 更微妙，需要人的判断 |

---

## 五条核心原则

| # | 原则 | 说明 |
|:---|:---|:---|
| 01 | **单一可编辑资产** | 每次只改一个 SKILL.md，变量可控，改进可归因 |
| 02 | **双重评估** | 结构评分（静态分析）+ 效果验证（跑测试看输出） |
| 03 | **棘轮机制** | 只保留改进，自动回滚退步，分数只升不降 |
| 04 | **独立评分** | 评分用子 agent，避免「自己改自己评」的偏差 |
| 05 | **人在回路** | 每个 Skill 优化完后暂停，用户确认再继续下一个 |

---

## 8 维度评估体系

总分 100。结构维度靠静态分析（60分），效果维度必须实测（40分）。

![Evaluation Rubric](assets/chart-rubric.png)

> 实测表现权重最高（25分）。Skill 写得再漂亮，跑出来效果不好就是零。

---

## 优化循环：5 个阶段

系统在每个阶段内自主运行，但在阶段之间暂停等待人类确认。

![Optimization Lifecycle](assets/chart-phases.png)

**Phase 2 的核心逻辑**：

1. 找出得分最低的维度
2. 针对该维度生成 1 个具体改进方案
3. 编辑 SKILL.md，git commit
4. 子 agent 独立重新评分
5. 新分 > 旧分 → 保留；否则 → git revert
6. 每个 Skill 完成后暂停，展示 diff + 分数变化，等用户确认

---

## 棘轮机制

分数只能上升。每一轮要么改进 Skill，要么干净地回滚。不会随时间积累局部退化。

![Ratchet Mechanism](assets/chart-ratchet.png)

轮次 2 的 75 分低于当前最优的 78 分，被自动回滚。有效基线始终锁定在 78，后续改进从 78 继续。

---

## 快速开始

```bash
npx skills add alchaincyf/darwin-skill
```

安装后在任何支持 Skill 的 Agent 工具中说「优化所有skills」或「优化某个skill」就行。

无法访问 GitHub 的朋友，可以直接下载 zip 包：[darwin-skill.zip](https://pub-161ae4b5ed0644c4a43b5c6412287e03.r2.dev/skills/darwin-skill.zip)，解压后把 SKILL.md 放到 `~/.claude/skills/darwin-skill/` 目录即可。

---

## 设计灵感

这个项目的设计直接受 **Andrej Karpathy 的 [autoresearch](https://github.com/karpathy/autoresearch)** 启发。

核心机制完全相同：**只保留可测量的改进，其余全部回滚。**

---

## 关于作者

| | |
|:---|:---|
| 🌐 官网 | [bookai.top](https://bookai.top) · [huasheng.ai](https://www.huasheng.ai) |
| 𝕏 Twitter | [@AlchainHust](https://x.com/AlchainHust) |
| 📺 B站 | [花叔](https://space.bilibili.com/14097567) |
| ▶️ YouTube | [@Alchain](https://www.youtube.com/@Alchain) |
| 📕 小红书 | [花叔](https://www.xiaohongshu.com/user/profile/5abc6f17e8ac2b109179dfdf) |
| 💬 公众号 | 微信搜「花叔」 |

---

## 许可证

MIT

---

<div align="center">

**[女娲](https://github.com/alchaincyf/nuwa-skill)** 造 Skill。<br>
**达尔文** 让 Skill 进化。<br><br>
*只保留改进，时间就站在你这边。*

<br>

MIT License © [花叔 Huashu](https://github.com/alchaincyf)

</div>


path: README_EN.md
content: <div align="right">

English | **[中文](README.md)**

</div>

![darwin.skill](assets/banner-en.svg)

<div align="center">

# darwin.skill

**Optimize your Agent Skills the way you train models.**

Inspired by [Karpathy's autoresearch](https://github.com/karpathy/autoresearch). Autonomous experiment loops, applied to skill optimization. A ratchet that only turns forward.

[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
[![Agent Skill](https://img.shields.io/badge/Agent%20Skill-Compatible-blueviolet)](https://skills.sh)
[![Skills](https://img.shields.io/badge/skills.sh-Compatible-green)](https://skills.sh)

```
npx skills add alchaincyf/darwin-skill
```

</div>

---

## The Core Loop

![Core Loop](assets/chart-loop-en.png)

Evaluate → Improve → Test → Human Confirm → Keep or Revert. Repeat.

---

## Why This Exists

Agent skill ecosystems are expanding fast. Claude Code, Codex, OpenClaw, Trae, CodeBuddy and more all support the SKILL.md format. When you have 10 skills, you can maintain them by hand. When you have 60+, you need a system.

Traditional skill review is purely structural: does the frontmatter look right? Are the steps numbered? Do the file paths exist? But a perfectly formatted skill can still produce terrible output.

darwin.skill evaluates both **structure** and **real-world effectiveness**, then keeps only the changes that actually improve things.

---

## From autoresearch to Skill Optimization

This project maps Karpathy's autoresearch directly onto skill optimization:

| autoresearch | darwin.skill | Why |
|:---|:---|:---|
| `program.md` | This SKILL.md | Defines evaluation criteria and constraints |
| `train.py` | Each target SKILL.md | The single editable asset per experiment |
| `val_bpb` | 8-dimension weighted score (max 100) | Quantifiable optimization target |
| `git ratchet` | keep / revert mechanism | Only improving commits survive |
| `test set` | test-prompts.json | Validates whether improvements are real |
| Fully autonomous | **Human in the loop** | Skill quality is more subjective than loss |

The key difference: autoresearch is fully autonomous (loss is just a number). Skill quality sometimes needs human judgment. So darwin.skill pauses after each skill's optimization cycle, shows you the diff and score delta, and waits for your confirmation.

---

## Five Core Principles

| # | Principle | Details |
|:---|:---|:---|
| 01 | **Single editable asset** | One SKILL.md per experiment. One change, one measurement, one decision |
| 02 | **Dual evaluation** | Structure scoring (static analysis) + effectiveness scoring (live test execution) |
| 03 | **Ratchet mechanism** | Score can only go up. Regressions are auto-reverted |
| 04 | **Independent scoring** | The agent that edits is never the agent that scores |
| 05 | **Human in the loop** | System pauses after each skill. You review, then continue |

---

## 8-Dimension Evaluation Rubric

Total: 100 points. Structure (60) + Effectiveness (40).

![Evaluation Rubric](assets/chart-rubric-en.png)

> Live test performance has the highest weight (25 points). A beautifully written skill that produces bad output is still a bad skill.

---

## The Optimization Cycle

Five phases. Only one is the core.

![Optimization Lifecycle](assets/chart-phases-en.png)

**Phase 2 (the heart):**

1. Find the lowest-scoring dimension
2. Generate one targeted improvement
3. Edit SKILL.md, git commit
4. Independent sub-agent re-scores
5. Score up → keep. Score down → git revert
6. Pause. Show diff + score delta. Wait for human confirmation

---

## The Ratchet

Scores can only go up. Failed experiments are cleanly reverted. No regressions accumulate over time.

![Ratchet Mechanism](assets/chart-ratchet-en.png)

Round 2 scored 75, below the current best of 78. Auto-reverted. Effective baseline stays at 78. Subsequent improvements build from 78, not 75.

---

## Quick Start

```bash
npx skills add alchaincyf/darwin-skill
```

After installation, tell your agent: "optimize all skills" or "optimize [skill-name]". Works with any tool that supports the SKILL.md format.

Can't access GitHub? Download the zip: [darwin-skill.zip](https://pub-161ae4b5ed0644c4a43b5c6412287e03.r2.dev/skills/darwin-skill.zip). Extract and place SKILL.md in `~/.claude/skills/darwin-skill/`.

---

## Design Inspiration

Directly inspired by **Andrej Karpathy's [autoresearch](https://github.com/karpathy/autoresearch)**.

The core mechanism is identical: **keep only measurable improvements, revert everything else.**

---

## About the Author

| | |
|:---|:---|
| 🌐 Website | [bookai.top](https://bookai.top) · [huasheng.ai](https://www.huasheng.ai) |
| 𝕏 Twitter | [@AlchainHust](https://x.com/AlchainHust) |
| 📺 Bilibili | [花叔](https://space.bilibili.com/14097567) |
| ▶️ YouTube | [@Alchain](https://www.youtube.com/@Alchain) |
| 📕 Xiaohongshu | [花叔](https://www.xiaohongshu.com/user/profile/5abc6f17e8ac2b109179dfdf) |
| 💬 WeChat | Search "花叔" |

---

## License

MIT

---

<div align="center">

**[Nuwa](https://github.com/alchaincyf/nuwa-skill)** creates skills.<br>
**Darwin** makes them evolve.<br><br>
*Keep only improvements. Time is on your side.*

<br>

MIT License © [花叔 Huashu](https://github.com/alchaincyf)

</div>


path: assets/banner-en.svg
content: <svg width="1200" height="400" viewBox="0 0 1200 400" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <style>
      @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700;900&amp;display=swap');
    </style>
    <!-- Gradient for ratchet blocks -->
    <linearGradient id="blockGrad1" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#444444"/>
      <stop offset="100%" stop-color="#333333"/>
    </linearGradient>
    <linearGradient id="blockGrad2" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#666666"/>
      <stop offset="100%" stop-color="#555555"/>
    </linearGradient>
    <linearGradient id="blockGrad3" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#8B5E3C"/>
      <stop offset="100%" stop-color="#7A4F30"/>
    </linearGradient>
    <linearGradient id="blockGrad4" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#C04020"/>
      <stop offset="100%" stop-color="#A83518"/>
    </linearGradient>
    <linearGradient id="blockGrad5" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#D4532B"/>
      <stop offset="100%" stop-color="#BF4422"/>
    </linearGradient>
  </defs>

  <!-- Background -->
  <rect width="1200" height="400" fill="#111111"/>

  <!-- Left accent line (Pentagram-style editorial vertical rule) -->
  <rect x="60" y="48" width="3" height="304" fill="#D4532B"/>

  <!-- Top horizontal rule -->
  <rect x="60" y="48" width="760" height="2" fill="#FFFFFF" opacity="0.15"/>

  <!-- Bottom horizontal rule -->
  <rect x="60" y="350" width="760" height="1" fill="#FFFFFF" opacity="0.15"/>

  <!-- CATEGORY LABEL -->
  <text
    x="80"
    y="88"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="11"
    font-weight="700"
    letter-spacing="3"
    fill="#D4532B"
    text-transform="uppercase"
  >CLAUDE CODE SKILL SYSTEM</text>

  <!-- MAIN TITLE — two lines for visual weight -->
  <text
    x="80"
    y="178"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="82"
    font-weight="900"
    fill="#FFFFFF"
    letter-spacing="-2"
  >darwin.skill</text>

  <!-- Subtitle pipeline -->
  <text
    x="80"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="400"
    fill="#CCCCCC"
    letter-spacing="0.5"
  >Evaluate</text>

  <text
    x="160"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="700"
    fill="#D4532B"
  >→</text>

  <text
    x="184"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="400"
    fill="#CCCCCC"
    letter-spacing="0.5"
  >Improve</text>

  <text
    x="262"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="700"
    fill="#D4532B"
  >→</text>

  <text
    x="286"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="400"
    fill="#CCCCCC"
    letter-spacing="0.5"
  >Test &amp; Verify</text>

  <text
    x="400"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="700"
    fill="#D4532B"
  >→</text>

  <text
    x="424"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="400"
    fill="#CCCCCC"
    letter-spacing="0.5"
  >Keep or Revert</text>

  <!-- Footer credit -->
  <text
    x="80"
    y="370"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="12"
    font-weight="400"
    fill="#666666"
    letter-spacing="0.3"
  >Inspired by Karpathy's autoresearch</text>

  <!-- ============================================================ -->
  <!-- RIGHT SIDE: Ratchet visualization                           -->
  <!-- 5 bars of increasing height + score labels, anchored right  -->
  <!-- ============================================================ -->

  <!-- Thin divider between text and viz -->
  <rect x="860" y="80" width="1" height="240" fill="#FFFFFF" opacity="0.08"/>

  <!-- Bar 1 — smallest, dark gray (score ~40) -->
  <rect x="890" y="278" width="36" height="42" rx="3" fill="url(#blockGrad1)"/>
  <text x="908" y="274" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="600" fill="#555555" text-anchor="middle">40</text>

  <!-- Bar 2 — medium-small, mid gray (score ~55) -->
  <rect x="944" y="252" width="36" height="68" rx="3" fill="url(#blockGrad2)"/>
  <text x="962" y="248" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="600" fill="#777777" text-anchor="middle">55</text>

  <!-- Bar 3 — medium, warm brown (score ~68) -->
  <rect x="998" y="220" width="36" height="100" rx="3" fill="url(#blockGrad3)"/>
  <text x="1016" y="216" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="600" fill="#8B5E3C" text-anchor="middle">68</text>

  <!-- Bar 4 — tall, warm orange-red (score ~80) -->
  <rect x="1052" y="188" width="36" height="132" rx="3" fill="url(#blockGrad4)"/>
  <text x="1070" y="184" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="600" fill="#C04020" text-anchor="middle">80</text>

  <!-- Bar 5 — tallest, brand orange (score ~92) -->
  <rect x="1106" y="152" width="36" height="168" rx="3" fill="url(#blockGrad5)"/>
  <text x="1124" y="148" font-family="'Inter', system-ui, sans-serif" font-size="12" font-weight="700" fill="#D4532B" text-anchor="middle">92</text>

  <!-- Baseline for bars -->
  <rect x="880" y="320" width="276" height="1" fill="#FFFFFF" opacity="0.12"/>

  <!-- Label below bars -->
  <text x="1018" y="344" font-family="'Inter', system-ui, sans-serif" font-size="11" font-weight="600" fill="#555555" text-anchor="middle" letter-spacing="2">SCORE PROGRESSION</text>

  <!-- Upward trend arrow on top-right -->
  <polyline
    points="890,268 944,242 998,210 1052,178 1124,142"
    fill="none"
    stroke="#D4532B"
    stroke-width="1.5"
    stroke-dasharray="4 3"
    opacity="0.5"
  />

  <!-- Ratchet label top -->
  <text x="890" y="124" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="700" letter-spacing="2" fill="#D4532B" opacity="0.8">AUTO-OPTIMIZE</text>

</svg>


path: assets/banner.svg
content: <svg width="1200" height="400" viewBox="0 0 1200 400" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <style>
      @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;700;900&amp;display=swap');
    </style>
    <!-- Gradient for ratchet blocks -->
    <linearGradient id="blockGrad1" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#444444"/>
      <stop offset="100%" stop-color="#333333"/>
    </linearGradient>
    <linearGradient id="blockGrad2" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#666666"/>
      <stop offset="100%" stop-color="#555555"/>
    </linearGradient>
    <linearGradient id="blockGrad3" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#8B5E3C"/>
      <stop offset="100%" stop-color="#7A4F30"/>
    </linearGradient>
    <linearGradient id="blockGrad4" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#C04020"/>
      <stop offset="100%" stop-color="#A83518"/>
    </linearGradient>
    <linearGradient id="blockGrad5" x1="0" y1="0" x2="0" y2="1">
      <stop offset="0%" stop-color="#D4532B"/>
      <stop offset="100%" stop-color="#BF4422"/>
    </linearGradient>
  </defs>

  <!-- Background -->
  <rect width="1200" height="400" fill="#111111"/>

  <!-- Left accent line (Pentagram-style editorial vertical rule) -->
  <rect x="60" y="48" width="3" height="304" fill="#D4532B"/>

  <!-- Top horizontal rule -->
  <rect x="60" y="48" width="760" height="2" fill="#FFFFFF" opacity="0.15"/>

  <!-- Bottom horizontal rule -->
  <rect x="60" y="350" width="760" height="1" fill="#FFFFFF" opacity="0.15"/>

  <!-- CATEGORY LABEL -->
  <text
    x="80"
    y="88"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="11"
    font-weight="700"
    letter-spacing="3"
    fill="#D4532B"
    text-transform="uppercase"
  >CLAUDE CODE SKILL SYSTEM</text>

  <!-- MAIN TITLE — two lines for visual weight -->
  <text
    x="80"
    y="178"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="82"
    font-weight="900"
    fill="#FFFFFF"
    letter-spacing="-2"
  >达尔文.skill</text>

  <!-- Subtitle pipeline -->
  <text
    x="80"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="400"
    fill="#CCCCCC"
    letter-spacing="0.5"
  >评估</text>

  <text
    x="128"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="700"
    fill="#D4532B"
  >→</text>

  <text
    x="152"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="400"
    fill="#CCCCCC"
    letter-spacing="0.5"
  >改进</text>

  <text
    x="200"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="700"
    fill="#D4532B"
  >→</text>

  <text
    x="224"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="400"
    fill="#CCCCCC"
    letter-spacing="0.5"
  >实测验证</text>

  <text
    x="320"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="700"
    fill="#D4532B"
  >→</text>

  <text
    x="344"
    y="312"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="16"
    font-weight="400"
    fill="#CCCCCC"
    letter-spacing="0.5"
  >保留或回滚</text>

  <!-- Footer credit -->
  <text
    x="80"
    y="370"
    font-family="'Inter', system-ui, -apple-system, sans-serif"
    font-size="12"
    font-weight="400"
    fill="#666666"
    letter-spacing="0.3"
  >Inspired by Karpathy's autoresearch</text>

  <!-- ============================================================ -->
  <!-- RIGHT SIDE: Ratchet visualization                           -->
  <!-- 5 bars of increasing height + score labels, anchored right  -->
  <!-- ============================================================ -->

  <!-- Thin divider between text and viz -->
  <rect x="860" y="80" width="1" height="240" fill="#FFFFFF" opacity="0.08"/>

  <!-- Bar 1 — smallest, dark gray (score ~40) -->
  <rect x="890" y="278" width="36" height="42" rx="3" fill="url(#blockGrad1)"/>
  <text x="908" y="274" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="600" fill="#555555" text-anchor="middle">40</text>

  <!-- Bar 2 — medium-small, mid gray (score ~55) -->
  <rect x="944" y="252" width="36" height="68" rx="3" fill="url(#blockGrad2)"/>
  <text x="962" y="248" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="600" fill="#777777" text-anchor="middle">55</text>

  <!-- Bar 3 — medium, warm brown (score ~68) -->
  <rect x="998" y="220" width="36" height="100" rx="3" fill="url(#blockGrad3)"/>
  <text x="1016" y="216" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="600" fill="#8B5E3C" text-anchor="middle">68</text>

  <!-- Bar 4 — tall, warm orange-red (score ~80) -->
  <rect x="1052" y="188" width="36" height="132" rx="3" fill="url(#blockGrad4)"/>
  <text x="1070" y="184" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="600" fill="#C04020" text-anchor="middle">80</text>

  <!-- Bar 5 — tallest, brand orange (score ~92) -->
  <rect x="1106" y="152" width="36" height="168" rx="3" fill="url(#blockGrad5)"/>
  <text x="1124" y="148" font-family="'Inter', system-ui, sans-serif" font-size="12" font-weight="700" fill="#D4532B" text-anchor="middle">92</text>

  <!-- Baseline for bars -->
  <rect x="880" y="320" width="276" height="1" fill="#FFFFFF" opacity="0.12"/>

  <!-- Label below bars -->
  <text x="1018" y="344" font-family="'Inter', system-ui, sans-serif" font-size="11" font-weight="600" fill="#555555" text-anchor="middle" letter-spacing="2">SCORE PROGRESSION</text>

  <!-- Upward trend arrow on top-right -->
  <polyline
    points="890,268 944,242 998,210 1052,178 1124,142"
    fill="none"
    stroke="#D4532B"
    stroke-width="1.5"
    stroke-dasharray="4 3"
    opacity="0.5"
  />

  <!-- Ratchet label top -->
  <text x="890" y="124" font-family="'Inter', system-ui, sans-serif" font-size="10" font-weight="700" letter-spacing="2" fill="#D4532B" opacity="0.8">AUTO-OPTIMIZE</text>

</svg>


path: assets/chart-loop-en.html
content: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>darwin.skill - Core Loop</title>
<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=Inter:wght@400;600;700;800;900&display=swap" rel="stylesheet">
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }
  html, body {
    width: 1200px;
    height: 500px;
    background: #111111;
    overflow: hidden;
    font-family: 'Inter', sans-serif;
  }
</style>
</head>
<body>
<svg width="1200" height="500" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <!-- Arrow markers -->
    <marker id="arr-orange" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#D4532B"/>
    </marker>
    <marker id="arr-green" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#2B8A3E"/>
    </marker>
    <marker id="arr-red" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#C92A2A"/>
    </marker>
    <marker id="arr-orange-up" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#D4532B"/>
    </marker>
  </defs>

  <!-- Background -->
  <rect width="1200" height="500" fill="#111111"/>

  <!-- CORE LOOP label -->
  <text x="48" y="50" fill="#D4532B" font-family="Inter, sans-serif" font-size="11" font-weight="700" letter-spacing="3">CORE LOOP</text>

  <!-- B1: EVALUATE -->
  <rect x="48" y="165" width="124" height="70" fill="#FFFFFF"/>
  <text x="110" y="196" fill="#111111" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">EVALUATE</text>
  <text x="110" y="213" fill="#555555" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">Current Skill</text>

  <!-- Arrow B1→B2 -->
  <line x1="172" y1="200" x2="204" y2="200" stroke="#D4532B" stroke-width="2" marker-end="url(#arr-orange)"/>

  <!-- B2: IMPROVE -->
  <rect x="210" y="165" width="124" height="70" fill="#FFFFFF"/>
  <text x="272" y="196" fill="#111111" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">GENERATE</text>
  <text x="272" y="213" fill="#555555" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">Improvement</text>

  <!-- Arrow B2→B3 -->
  <line x1="334" y1="200" x2="366" y2="200" stroke="#D4532B" stroke-width="2" marker-end="url(#arr-orange)"/>

  <!-- B3: VALIDATE -->
  <rect x="372" y="165" width="124" height="70" fill="#FFFFFF"/>
  <text x="434" y="196" fill="#111111" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">VALIDATE</text>
  <text x="434" y="213" fill="#555555" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">via Testing</text>

  <!-- Arrow B3→B4 -->
  <line x1="496" y1="200" x2="528" y2="200" stroke="#D4532B" stroke-width="2" marker-end="url(#arr-orange)"/>

  <!-- B4: CONFIRM -->
  <rect x="534" y="165" width="124" height="70" fill="#FFFFFF"/>
  <text x="596" y="196" fill="#111111" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">HUMAN</text>
  <text x="596" y="213" fill="#555555" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">CONFIRM</text>

  <!-- Arrow B4→Diamond -->
  <line x1="658" y1="200" x2="698" y2="200" stroke="#D4532B" stroke-width="2" marker-end="url(#arr-orange)"/>

  <!-- DECISION DIAMOND -->
  <polygon points="790,152 838,200 790,248 742,200" fill="#D4532B"/>
  <text x="790" y="196" fill="#FFFFFF" font-family="Inter, sans-serif" font-size="12" font-weight="800" text-anchor="middle">SCORE</text>
  <text x="790" y="212" fill="#FFFFFF" font-family="Inter, sans-serif" font-size="12" font-weight="800" text-anchor="middle">UP?</text>

  <!-- YES PATH -->
  <path d="M790,152 L790,120 L954,120"
        stroke="#2B8A3E" stroke-width="2" fill="none" marker-end="url(#arr-green)"/>

  <!-- YES label -->
  <text x="860" y="113" fill="#2B8A3E" font-family="Inter, sans-serif" font-size="10" font-weight="700" letter-spacing="1" text-anchor="middle">YES</text>

  <!-- YES result block: KEEP / git commit -->
  <rect x="960" y="85" width="130" height="70" fill="#2B8A3E"/>
  <text x="1025" y="115" fill="#FFFFFF" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">KEEP</text>
  <text x="1025" y="133" fill="rgba(255,255,255,0.75)" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">git commit</text>

  <!-- NO PATH -->
  <path d="M790,248 L790,280 L954,280"
        stroke="#C92A2A" stroke-width="2" fill="none" marker-end="url(#arr-red)"/>

  <!-- NO label -->
  <text x="860" y="298" fill="#C92A2A" font-family="Inter, sans-serif" font-size="10" font-weight="700" letter-spacing="1" text-anchor="middle">NO</text>

  <!-- NO result block: REVERT / git revert -->
  <rect x="960" y="245" width="130" height="70" fill="#C92A2A"/>
  <text x="1025" y="275" fill="#FFFFFF" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">REVERT</text>
  <text x="1025" y="293" fill="rgba(255,255,255,0.75)" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">git revert</text>

  <!-- LOOP BACK ARROW -->
  <path d="M1090,120 L1155,120 L1155,420 L48,420 L48,235"
        stroke="#D4532B" stroke-width="2" fill="none" stroke-dasharray="6,4"/>

  <path d="M1090,280 L1155,280"
        stroke="#D4532B" stroke-width="2" fill="none" stroke-dasharray="6,4"/>

  <!-- Arrow head pointing up at B1 left -->
  <polygon points="42,236 54,236 48,222" fill="#D4532B"/>

  <!-- LOOP BACK label along bottom -->
  <text x="590" y="448" fill="#444444" font-family="Inter, sans-serif" font-size="11" font-weight="600" text-anchor="middle" letter-spacing="3">LOOP BACK</text>

  <!-- STEP NUMBERS -->
  <text x="48" y="158" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700">01</text>
  <text x="210" y="158" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700">02</text>
  <text x="372" y="158" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700">03</text>
  <text x="534" y="158" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700">04</text>
  <text x="762" y="145" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700" opacity="0.9">05</text>

  <!-- SUBTITLE TEXT -->
  <text x="48" y="476" fill="#333333" font-family="Inter, sans-serif" font-size="10" font-weight="600" letter-spacing="1">darwin.skill</text>
  <text x="1152" y="476" fill="#333333" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="end" letter-spacing="1">CONTINUOUS IMPROVEMENT ENGINE</text>

</svg>
</body>
</html>


path: assets/chart-loop.html
content: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>达尔文.skill - Core Loop</title>
<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=Inter:wght@400;600;700;800;900&display=swap" rel="stylesheet">
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }
  html, body {
    width: 1200px;
    height: 500px;
    background: #111111;
    overflow: hidden;
    font-family: 'Inter', sans-serif;
  }
</style>
</head>
<body>
<svg width="1200" height="500" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <!-- Arrow markers -->
    <marker id="arr-orange" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#D4532B"/>
    </marker>
    <marker id="arr-green" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#2B8A3E"/>
    </marker>
    <marker id="arr-red" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#C92A2A"/>
    </marker>
    <marker id="arr-orange-up" markerWidth="10" markerHeight="7" refX="9" refY="3.5" orient="auto">
      <polygon points="0 0, 10 3.5, 0 7" fill="#D4532B"/>
    </marker>
  </defs>

  <!-- Background -->
  <rect width="1200" height="500" fill="#111111"/>

  <!-- CORE LOOP label -->
  <text x="48" y="50" fill="#D4532B" font-family="Inter, sans-serif" font-size="11" font-weight="700" letter-spacing="3">CORE LOOP</text>

  <!--
    Layout plan (y-center = 200):
    Block width = 120, height = 70
    Gap between blocks = 36 (arrow)
    Decision diamond: center at x=750, size 90×90

    Blocks horizontal positions (left edge):
    B1 EVALUATE:  x=48,  center=108
    B2 IMPROVE:   x=228, center=288
    B3 VALIDATE:  x=408, center=468
    B4 CONFIRM:   x=588, center=648
    Diamond:      center=790
    YES block:    x=958, center=1018  (top, y=145)
    NO block:     x=958, center=1018  (bottom, y=255)

    All vertical center: y=200
    YES block center y = 160
    NO block center y = 260
  -->

  <!-- ======================== -->
  <!-- MAIN PROCESS BLOCKS      -->
  <!-- ======================== -->

  <!-- B1: EVALUATE -->
  <rect x="48" y="165" width="124" height="70" fill="#FFFFFF"/>
  <text x="110" y="196" fill="#111111" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">EVALUATE</text>
  <text x="110" y="213" fill="#555555" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">评估当前技能</text>

  <!-- Arrow B1→B2 -->
  <line x1="172" y1="200" x2="204" y2="200" stroke="#D4532B" stroke-width="2" marker-end="url(#arr-orange)"/>

  <!-- B2: IMPROVE -->
  <rect x="210" y="165" width="124" height="70" fill="#FFFFFF"/>
  <text x="272" y="196" fill="#111111" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">IMPROVE</text>
  <text x="272" y="213" fill="#555555" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">生成改进方案</text>

  <!-- Arrow B2→B3 -->
  <line x1="334" y1="200" x2="366" y2="200" stroke="#D4532B" stroke-width="2" marker-end="url(#arr-orange)"/>

  <!-- B3: VALIDATE -->
  <rect x="372" y="165" width="124" height="70" fill="#FFFFFF"/>
  <text x="434" y="196" fill="#111111" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">VALIDATE</text>
  <text x="434" y="213" fill="#555555" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">实测验证效果</text>

  <!-- Arrow B3→B4 -->
  <line x1="496" y1="200" x2="528" y2="200" stroke="#D4532B" stroke-width="2" marker-end="url(#arr-orange)"/>

  <!-- B4: CONFIRM -->
  <rect x="534" y="165" width="124" height="70" fill="#FFFFFF"/>
  <text x="596" y="196" fill="#111111" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">CONFIRM</text>
  <text x="596" y="213" fill="#555555" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">人类确认结果</text>

  <!-- Arrow B4→Diamond -->
  <line x1="658" y1="200" x2="698" y2="200" stroke="#D4532B" stroke-width="2" marker-end="url(#arr-orange)"/>

  <!-- ======================== -->
  <!-- DECISION DIAMOND         -->
  <!-- center: 790, 200         -->
  <!-- size: 96×80              -->
  <!-- ======================== -->
  <polygon points="790,152 838,200 790,248 742,200" fill="#D4532B"/>
  <text x="790" y="196" fill="#FFFFFF" font-family="Inter, sans-serif" font-size="12" font-weight="800" text-anchor="middle">SCORE</text>
  <text x="790" y="212" fill="#FFFFFF" font-family="Inter, sans-serif" font-size="12" font-weight="800" text-anchor="middle">UP?</text>

  <!-- ======================== -->
  <!-- YES PATH (top branch)    -->
  <!-- ======================== -->

  <!-- YES PATH: diamond top → up → right to YES block -->
  <!-- Diamond top point: 790, 152 -->
  <path d="M790,152 L790,120 L954,120"
        stroke="#2B8A3E" stroke-width="2" fill="none" marker-end="url(#arr-green)"/>

  <!-- YES label -->
  <text x="860" y="113" fill="#2B8A3E" font-family="Inter, sans-serif" font-size="10" font-weight="700" letter-spacing="1" text-anchor="middle">YES</text>

  <!-- YES result block: KEEP / git commit -->
  <rect x="960" y="85" width="130" height="70" fill="#2B8A3E"/>
  <text x="1025" y="115" fill="#FFFFFF" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">KEEP</text>
  <text x="1025" y="133" fill="rgba(255,255,255,0.75)" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">git commit</text>

  <!-- ======================== -->
  <!-- NO PATH (bottom branch)  -->
  <!-- ======================== -->

  <!-- NO PATH: diamond bottom → down → right to NO block -->
  <!-- Diamond bottom point: 790, 248 -->
  <path d="M790,248 L790,280 L954,280"
        stroke="#C92A2A" stroke-width="2" fill="none" marker-end="url(#arr-red)"/>

  <!-- NO label -->
  <text x="860" y="298" fill="#C92A2A" font-family="Inter, sans-serif" font-size="10" font-weight="700" letter-spacing="1" text-anchor="middle">NO</text>

  <!-- NO result block: REVERT / git revert -->
  <rect x="960" y="245" width="130" height="70" fill="#C92A2A"/>
  <text x="1025" y="275" fill="#FFFFFF" font-family="Inter, sans-serif" font-size="13" font-weight="800" text-anchor="middle">REVERT</text>
  <text x="1025" y="293" fill="rgba(255,255,255,0.75)" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="middle">git revert</text>

  <!-- ======================== -->
  <!-- LOOP BACK ARROW          -->
  <!-- from KEEP/REVERT → back to EVALUATE -->
  <!-- ======================== -->

  <!-- From right side of YES block (1090, 120) → right to 1155 → down to 420 → left to 48 → up to 200 (B1 left) -->
  <path d="M1090,120 L1155,120 L1155,420 L48,420 L48,235"
        stroke="#D4532B" stroke-width="2" fill="none" stroke-dasharray="6,4"/>

  <!-- Also from NO block right → join same vertical -->
  <path d="M1090,280 L1155,280"
        stroke="#D4532B" stroke-width="2" fill="none" stroke-dasharray="6,4"/>

  <!-- Arrow head pointing up at B1 left -->
  <polygon points="42,236 54,236 48,222" fill="#D4532B"/>

  <!-- LOOP BACK label along bottom -->
  <text x="590" y="448" fill="#444444" font-family="Inter, sans-serif" font-size="11" font-weight="600" text-anchor="middle" letter-spacing="3">LOOP BACK</text>

  <!-- ======================== -->
  <!-- STEP NUMBERS             -->
  <!-- ======================== -->
  <text x="48" y="158" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700">01</text>
  <text x="210" y="158" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700">02</text>
  <text x="372" y="158" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700">03</text>
  <text x="534" y="158" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700">04</text>
  <text x="762" y="145" fill="#D4532B" font-family="Inter, sans-serif" font-size="10" font-weight="700" opacity="0.9">05</text>

  <!-- ======================== -->
  <!-- SUBTITLE TEXT            -->
  <!-- ======================== -->
  <text x="48" y="476" fill="#333333" font-family="Inter, sans-serif" font-size="10" font-weight="600" letter-spacing="1">达尔文.skill</text>
  <text x="1152" y="476" fill="#333333" font-family="Inter, sans-serif" font-size="10" font-weight="600" text-anchor="end" letter-spacing="1">CONTINUOUS IMPROVEMENT ENGINE</text>

</svg>
</body>
</html>


path: assets/chart-phases-en.html
content: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Optimization Lifecycle</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800;900&display=swap" rel="stylesheet">
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1200px;
    height: 400px;
    background: #111111;
    font-family: 'Inter', -apple-system, sans-serif;
    overflow: hidden;
    position: relative;
  }

  .top-label {
    position: absolute;
    top: 28px;
    left: 44px;
    font-size: 11px;
    font-weight: 800;
    letter-spacing: 0.18em;
    color: #D4532B;
    text-transform: uppercase;
  }

  /* Center row: phases + arrows */
  .row {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    display: flex;
    align-items: center;
    gap: 0;
  }

  /* === Phase boxes === */
  .phase {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    border-radius: 8px;
    flex-shrink: 0;
  }

  .phase-num {
    font-weight: 900;
    line-height: 1;
  }

  .phase-name {
    font-weight: 600;
    text-align: center;
    line-height: 1.3;
  }

  /* Regular dark */
  .p-dark {
    background: #1D1D1D;
    border: 1px solid #2D2D2D;
    width: 130px;
    height: 130px;
  }
  .p-dark .phase-num {
    font-size: 38px;
    color: #FFFFFF;
    margin-bottom: 10px;
  }
  .p-dark .phase-name {
    font-size: 13px;
    color: #888888;
  }

  /* White */
  .p-white {
    background: #FFFFFF;
    border: 1px solid #DDDDDD;
    width: 130px;
    height: 130px;
  }
  .p-white .phase-num {
    font-size: 38px;
    color: #111111;
    margin-bottom: 10px;
  }
  .p-white .phase-name {
    font-size: 13px;
    color: #555555;
  }

  /* Core - Phase 2 */
  .p-core {
    background: #D4532B;
    border: 2px solid #E06035;
    width: 196px;
    height: 196px;
    box-shadow: 0 0 50px rgba(212, 83, 43, 0.4), 0 0 16px rgba(212, 83, 43, 0.25);
  }
  .p-core .phase-num {
    font-size: 56px;
    color: #FFFFFF;
    margin-bottom: 12px;
  }
  .p-core .phase-name {
    font-size: 15px;
    font-weight: 700;
    color: rgba(255,255,255,0.93);
  }

  /* === Connector === */
  .connector {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 72px;
    flex-shrink: 0;
    position: relative;
  }

  .conn-label {
    font-size: 9.5px;
    color: #505050;
    font-weight: 600;
    letter-spacing: 0.04em;
    white-space: nowrap;
    margin-bottom: 9px;
  }

  .arrow {
    display: flex;
    align-items: center;
    width: 100%;
  }

  .arrow-line {
    flex: 1;
    height: 2px;
    background: #D4532B;
  }

  .arrow-head {
    width: 0;
    height: 0;
    border-top: 5px solid transparent;
    border-bottom: 5px solid transparent;
    border-left: 9px solid #D4532B;
  }
</style>
</head>
<body>

  <div class="top-label">OPTIMIZATION LIFECYCLE</div>

  <div class="row">

    <div class="phase p-dark">
      <div class="phase-num">0</div>
      <div class="phase-name">Initialize</div>
    </div>

    <div class="connector">
      <div class="conn-label">Human Confirm</div>
      <div class="arrow">
        <div class="arrow-line"></div>
        <div class="arrow-head"></div>
      </div>
    </div>

    <div class="phase p-dark">
      <div class="phase-num">0.5</div>
      <div class="phase-name">Test Design</div>
    </div>

    <div class="connector">
      <div class="conn-label">Human Confirm</div>
      <div class="arrow">
        <div class="arrow-line"></div>
        <div class="arrow-head"></div>
      </div>
    </div>

    <div class="phase p-white">
      <div class="phase-num">1</div>
      <div class="phase-name">Baseline</div>
    </div>

    <div class="connector">
      <div class="conn-label">Human Confirm</div>
      <div class="arrow">
        <div class="arrow-line"></div>
        <div class="arrow-head"></div>
      </div>
    </div>

    <div class="phase p-core">
      <div class="phase-num">2</div>
      <div class="phase-name">Optimize</div>
    </div>

    <div class="connector">
      <div class="conn-label">Human Confirm</div>
      <div class="arrow">
        <div class="arrow-line"></div>
        <div class="arrow-head"></div>
      </div>
    </div>

    <div class="phase p-dark">
      <div class="phase-num">3</div>
      <div class="phase-name">Report</div>
    </div>

  </div>

</body>
</html>


path: assets/chart-phases.html
content: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Optimization Lifecycle</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800;900&display=swap" rel="stylesheet">
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1200px;
    height: 400px;
    background: #111111;
    font-family: 'Inter', -apple-system, sans-serif;
    overflow: hidden;
    position: relative;
  }

  .top-label {
    position: absolute;
    top: 28px;
    left: 44px;
    font-size: 11px;
    font-weight: 800;
    letter-spacing: 0.18em;
    color: #D4532B;
    text-transform: uppercase;
  }

  /* Center row: phases + arrows */
  .row {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
    display: flex;
    align-items: center;
    gap: 0;
  }

  /* === Phase boxes === */
  .phase {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    border-radius: 8px;
    flex-shrink: 0;
  }

  .phase-num {
    font-weight: 900;
    line-height: 1;
  }

  .phase-name {
    font-weight: 600;
    text-align: center;
    line-height: 1.3;
  }

  /* Regular dark */
  .p-dark {
    background: #1D1D1D;
    border: 1px solid #2D2D2D;
    width: 130px;
    height: 130px;
  }
  .p-dark .phase-num {
    font-size: 38px;
    color: #FFFFFF;
    margin-bottom: 10px;
  }
  .p-dark .phase-name {
    font-size: 13px;
    color: #888888;
  }

  /* White */
  .p-white {
    background: #FFFFFF;
    border: 1px solid #DDDDDD;
    width: 130px;
    height: 130px;
  }
  .p-white .phase-num {
    font-size: 38px;
    color: #111111;
    margin-bottom: 10px;
  }
  .p-white .phase-name {
    font-size: 13px;
    color: #555555;
  }

  /* Core - Phase 2 */
  .p-core {
    background: #D4532B;
    border: 2px solid #E06035;
    width: 196px;
    height: 196px;
    box-shadow: 0 0 50px rgba(212, 83, 43, 0.4), 0 0 16px rgba(212, 83, 43, 0.25);
  }
  .p-core .phase-num {
    font-size: 56px;
    color: #FFFFFF;
    margin-bottom: 12px;
  }
  .p-core .phase-name {
    font-size: 15px;
    font-weight: 700;
    color: rgba(255,255,255,0.93);
  }

  /* === Connector === */
  .connector {
    display: flex;
    flex-direction: column;
    align-items: center;
    width: 72px;
    flex-shrink: 0;
    position: relative;
  }

  .conn-label {
    font-size: 9.5px;
    color: #505050;
    font-weight: 600;
    letter-spacing: 0.04em;
    white-space: nowrap;
    margin-bottom: 9px;
  }

  .arrow {
    display: flex;
    align-items: center;
    width: 100%;
  }

  .arrow-line {
    flex: 1;
    height: 2px;
    background: #D4532B;
  }

  .arrow-head {
    width: 0;
    height: 0;
    border-top: 5px solid transparent;
    border-bottom: 5px solid transparent;
    border-left: 9px solid #D4532B;
  }
</style>
</head>
<body>

  <div class="top-label">OPTIMIZATION LIFECYCLE</div>

  <div class="row">

    <div class="phase p-dark">
      <div class="phase-num">0</div>
      <div class="phase-name">初始化</div>
    </div>

    <div class="connector">
      <div class="conn-label">人类确认</div>
      <div class="arrow">
        <div class="arrow-line"></div>
        <div class="arrow-head"></div>
      </div>
    </div>

    <div class="phase p-dark">
      <div class="phase-num">0.5</div>
      <div class="phase-name">测试设计</div>
    </div>

    <div class="connector">
      <div class="conn-label">人类确认</div>
      <div class="arrow">
        <div class="arrow-line"></div>
        <div class="arrow-head"></div>
      </div>
    </div>

    <div class="phase p-white">
      <div class="phase-num">1</div>
      <div class="phase-name">基线评估</div>
    </div>

    <div class="connector">
      <div class="conn-label">人类确认</div>
      <div class="arrow">
        <div class="arrow-line"></div>
        <div class="arrow-head"></div>
      </div>
    </div>

    <div class="phase p-core">
      <div class="phase-num">2</div>
      <div class="phase-name">优化循环</div>
    </div>

    <div class="connector">
      <div class="conn-label">人类确认</div>
      <div class="arrow">
        <div class="arrow-line"></div>
        <div class="arrow-head"></div>
      </div>
    </div>

    <div class="phase p-dark">
      <div class="phase-num">3</div>
      <div class="phase-name">汇总报告</div>
    </div>

  </div>

</body>
</html>


path: assets/chart-ratchet-en.html
content: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ratchet Mechanism</title>
<style>
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap');

  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1200px;
    height: 450px;
    background: #111111;
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    position: relative;
  }

  .header {
    padding: 28px 60px 0;
    display: flex;
    align-items: baseline;
    gap: 16px;
  }

  .label {
    color: #D4532B;
    font-size: 13px;
    font-weight: 800;
    letter-spacing: 2px;
    text-transform: uppercase;
  }

  .subtitle {
    color: #555;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 1px;
  }

  .chart-area {
    flex: 1;
    display: flex;
    align-items: flex-end;
    justify-content: center;
    padding: 0 60px 60px;
    gap: 0;
    position: relative;
  }

  .bars-wrapper {
    display: flex;
    align-items: flex-end;
    gap: 40px;
    position: relative;
    width: 100%;
    justify-content: center;
  }

  .bar-group {
    display: flex;
    flex-direction: column;
    align-items: center;
    position: relative;
    width: 80px;
  }

  .score {
    font-size: 36px;
    font-weight: 800;
    color: #ffffff;
    margin-bottom: 10px;
    line-height: 1;
  }

  .score.rollback {
    color: #C92A2A;
    text-decoration: line-through;
    text-decoration-thickness: 3px;
  }

  .bar {
    width: 80px;
    border-radius: 4px 4px 0 0;
    position: relative;
  }

  .bar.baseline {
    background: #444444;
  }

  .bar.retained {
    background: #ffffff;
  }

  .bar.rollback-bar {
    background: transparent;
    border: 2px dashed #C92A2A;
    border-bottom: none;
  }

  .bar.highlight {
    background: #D4532B;
  }

  .round-label {
    margin-top: 12px;
    color: #666666;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.5px;
    white-space: nowrap;
  }

  /* SVG overlay for arrows and ratchet line */
  .svg-overlay {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
  }
</style>
</head>
<body>

<div class="header">
  <div class="label">RATCHET MECHANISM</div>
  <div class="subtitle">— effective baseline only moves up</div>
</div>

<div class="chart-area" id="chartArea">
  <div class="bars-wrapper" id="barsWrapper">
    <!-- bars will be injected by JS -->
  </div>
  <svg class="svg-overlay" id="svgOverlay"></svg>
</div>

<script>
  const scores = [72, 78, 75, 84, 87];
  const types  = ['baseline', 'retained', 'rollback', 'retained', 'highlight'];
  const rounds = ['Round 0', 'Round 1', 'Round 2', 'Round 3', 'Round 4'];

  // Effective baseline sequence (ratchet): 72, 78, 78, 84, 87
  const effectiveBaseline = [72, 78, 78, 84, 87];

  const maxScore = 90;
  const minScore = 60;
  const chartHeight = 270; // px available for bars

  function barHeight(score) {
    return Math.round((score - minScore) / (maxScore - minScore) * chartHeight);
  }

  const wrapper = document.getElementById('barsWrapper');

  scores.forEach((score, i) => {
    const group = document.createElement('div');
    group.className = 'bar-group';
    group.id = `group-${i}`;

    const scoreEl = document.createElement('div');
    scoreEl.className = 'score' + (types[i] === 'rollback' ? ' rollback' : '');
    scoreEl.textContent = score;

    const bar = document.createElement('div');
    bar.className = 'bar ' + (types[i] === 'rollback' ? 'rollback-bar' : types[i]);
    const h = barHeight(score);
    bar.style.height = h + 'px';

    const label = document.createElement('div');
    label.className = 'round-label';
    label.textContent = rounds[i];

    group.appendChild(scoreEl);
    group.appendChild(bar);
    group.appendChild(label);
    wrapper.appendChild(group);
  });

  // Draw arrows and ratchet line after layout
  requestAnimationFrame(() => {
    requestAnimationFrame(() => {
      const svg = document.getElementById('svgOverlay');
      const chartArea = document.getElementById('chartArea');
      const chartRect = chartArea.getBoundingClientRect();

      // Collect bar group positions
      const groups = [];
      for (let i = 0; i < 5; i++) {
        const g = document.getElementById(`group-${i}`);
        const rect = g.getBoundingClientRect();
        // top of the bar (not the score label)
        const bar = g.querySelector('.bar');
        const barRect = bar.getBoundingClientRect();
        groups.push({
          cx: rect.left - chartRect.left + rect.width / 2,
          barTop: barRect.top - chartRect.top,
          barBottom: barRect.bottom - chartRect.top,
        });
      }

      // Arrow heads: connect bar top centers (exclude rollback from arrows, draw arrow anyway between all)
      const arrowColor = '#D4532B';
      const arrowGap = 8;

      let svgContent = `
        <defs>
          <marker id="arrow" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto">
            <path d="M0,0 L0,6 L8,3 z" fill="${arrowColor}" />
          </marker>
        </defs>
      `;

      // Draw horizontal arrows between consecutive bar centers at mid-height of the lower bar
      for (let i = 0; i < 4; i++) {
        const fromX = groups[i].cx + 40 + arrowGap;
        const toX = groups[i+1].cx - 40 - arrowGap - 8;
        const higherBarTop = Math.min(groups[i].barTop, groups[i+1].barTop);
        const lowerBarTop = Math.max(groups[i].barTop, groups[i+1].barTop);
        const lowerBarBottom = Math.max(groups[i].barBottom, groups[i+1].barBottom);
        const y = lowerBarTop + (lowerBarBottom - lowerBarTop) * 0.5;

        // Use a slightly raised y to look cleaner
        const arrowY = Math.min(groups[i].barTop, groups[i+1].barTop) - 18;
        const clampedY = Math.max(arrowY, 40);

        svgContent += `<line x1="${fromX}" y1="${clampedY}" x2="${toX}" y2="${clampedY}"
          stroke="${arrowColor}" stroke-width="2" marker-end="url(#arrow)" opacity="0.7"/>`;
      }

      // Ratchet line: connects effective baseline tops
      const effectiveHeights = effectiveBaseline.map(s => barHeight(s));
      const baselineBottom = groups[0].barBottom; // all bars share same bottom

      // Points for ratchet line
      const points = groups.map((g, i) => {
        const effH = effectiveHeights[i];
        const y = baselineBottom - effH;
        return { x: g.cx, y };
      });

      // Draw dashed orange line through effective baseline tops
      let pathD = `M ${points[0].x} ${points[0].y}`;
      for (let i = 1; i < points.length; i++) {
        pathD += ` L ${points[i].x} ${points[i].y}`;
      }

      svgContent += `<path d="${pathD}" fill="none" stroke="${arrowColor}" stroke-width="2"
        stroke-dasharray="6,4" opacity="0.9"/>`;

      // Dots at each effective baseline point
      points.forEach((p, i) => {
        svgContent += `<circle cx="${p.x}" cy="${p.y}" r="4" fill="${arrowColor}" opacity="0.9"/>`;
      });

      // Label for the ratchet line
      svgContent += `<text x="${points[4].x + 10}" y="${points[4].y - 6}" fill="${arrowColor}"
        font-family="Inter, sans-serif" font-size="11" font-weight="700" letter-spacing="0.5">EFFECTIVE FLOOR</text>`;

      svg.innerHTML = svgContent;
    });
  });
</script>
</body>
</html>


path: assets/chart-ratchet.html
content: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Ratchet Mechanism</title>
<style>
  @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;800&display=swap');

  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1200px;
    height: 450px;
    background: #111111;
    font-family: 'Inter', -apple-system, BlinkMacSystemFont, sans-serif;
    display: flex;
    flex-direction: column;
    overflow: hidden;
    position: relative;
  }

  .header {
    padding: 28px 60px 0;
    display: flex;
    align-items: baseline;
    gap: 16px;
  }

  .label {
    color: #D4532B;
    font-size: 13px;
    font-weight: 800;
    letter-spacing: 2px;
    text-transform: uppercase;
  }

  .subtitle {
    color: #555;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 1px;
  }

  .chart-area {
    flex: 1;
    display: flex;
    align-items: flex-end;
    justify-content: center;
    padding: 0 60px 60px;
    gap: 0;
    position: relative;
  }

  .bars-wrapper {
    display: flex;
    align-items: flex-end;
    gap: 40px;
    position: relative;
    width: 100%;
    justify-content: center;
  }

  .bar-group {
    display: flex;
    flex-direction: column;
    align-items: center;
    position: relative;
    width: 80px;
  }

  .score {
    font-size: 36px;
    font-weight: 800;
    color: #ffffff;
    margin-bottom: 10px;
    line-height: 1;
  }

  .score.rollback {
    color: #C92A2A;
    text-decoration: line-through;
    text-decoration-thickness: 3px;
  }

  .bar {
    width: 80px;
    border-radius: 4px 4px 0 0;
    position: relative;
  }

  .bar.baseline {
    background: #444444;
  }

  .bar.retained {
    background: #ffffff;
  }

  .bar.rollback-bar {
    background: transparent;
    border: 2px dashed #C92A2A;
    border-bottom: none;
  }

  .bar.highlight {
    background: #D4532B;
  }

  .round-label {
    margin-top: 12px;
    color: #666666;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 0.5px;
    white-space: nowrap;
  }

  /* SVG overlay for arrows and ratchet line */
  .svg-overlay {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    pointer-events: none;
  }
</style>
</head>
<body>

<div class="header">
  <div class="label">RATCHET MECHANISM</div>
  <div class="subtitle">— effective baseline only moves up</div>
</div>

<div class="chart-area" id="chartArea">
  <div class="bars-wrapper" id="barsWrapper">
    <!-- bars will be injected by JS -->
  </div>
  <svg class="svg-overlay" id="svgOverlay"></svg>
</div>

<script>
  const scores = [72, 78, 75, 84, 87];
  const types  = ['baseline', 'retained', 'rollback', 'retained', 'highlight'];
  const rounds = ['轮次 0', '轮次 1', '轮次 2', '轮次 3', '轮次 4'];

  // Effective baseline sequence (ratchet): 72, 78, 78, 84, 87
  const effectiveBaseline = [72, 78, 78, 84, 87];

  const maxScore = 90;
  const minScore = 60;
  const chartHeight = 270; // px available for bars

  function barHeight(score) {
    return Math.round((score - minScore) / (maxScore - minScore) * chartHeight);
  }

  const wrapper = document.getElementById('barsWrapper');

  scores.forEach((score, i) => {
    const group = document.createElement('div');
    group.className = 'bar-group';
    group.id = `group-${i}`;

    const scoreEl = document.createElement('div');
    scoreEl.className = 'score' + (types[i] === 'rollback' ? ' rollback' : '');
    scoreEl.textContent = score;

    const bar = document.createElement('div');
    bar.className = 'bar ' + (types[i] === 'rollback' ? 'rollback-bar' : types[i]);
    const h = barHeight(score);
    bar.style.height = h + 'px';

    const label = document.createElement('div');
    label.className = 'round-label';
    label.textContent = rounds[i];

    group.appendChild(scoreEl);
    group.appendChild(bar);
    group.appendChild(label);
    wrapper.appendChild(group);
  });

  // Draw arrows and ratchet line after layout
  requestAnimationFrame(() => {
    requestAnimationFrame(() => {
      const svg = document.getElementById('svgOverlay');
      const chartArea = document.getElementById('chartArea');
      const chartRect = chartArea.getBoundingClientRect();

      // Collect bar group positions
      const groups = [];
      for (let i = 0; i < 5; i++) {
        const g = document.getElementById(`group-${i}`);
        const rect = g.getBoundingClientRect();
        // top of the bar (not the score label)
        const bar = g.querySelector('.bar');
        const barRect = bar.getBoundingClientRect();
        groups.push({
          cx: rect.left - chartRect.left + rect.width / 2,
          barTop: barRect.top - chartRect.top,
          barBottom: barRect.bottom - chartRect.top,
        });
      }

      // Arrow heads: connect bar top centers (exclude rollback from arrows, draw arrow anyway between all)
      const arrowColor = '#D4532B';
      const arrowGap = 8;

      let svgContent = `
        <defs>
          <marker id="arrow" markerWidth="8" markerHeight="8" refX="6" refY="3" orient="auto">
            <path d="M0,0 L0,6 L8,3 z" fill="${arrowColor}" />
          </marker>
        </defs>
      `;

      // Draw horizontal arrows between consecutive bar centers at mid-height of the lower bar
      for (let i = 0; i < 4; i++) {
        const fromX = groups[i].cx + 40 + arrowGap;
        const toX = groups[i+1].cx - 40 - arrowGap - 8;
        const higherBarTop = Math.min(groups[i].barTop, groups[i+1].barTop);
        const lowerBarTop = Math.max(groups[i].barTop, groups[i+1].barTop);
        const lowerBarBottom = Math.max(groups[i].barBottom, groups[i+1].barBottom);
        const y = lowerBarTop + (lowerBarBottom - lowerBarTop) * 0.5;

        // Use a slightly raised y to look cleaner
        const arrowY = Math.min(groups[i].barTop, groups[i+1].barTop) - 18;
        const clampedY = Math.max(arrowY, 40);

        svgContent += `<line x1="${fromX}" y1="${clampedY}" x2="${toX}" y2="${clampedY}"
          stroke="${arrowColor}" stroke-width="2" marker-end="url(#arrow)" opacity="0.7"/>`;
      }

      // Ratchet line: connects effective baseline tops
      // Effective baseline scores: 72, 78, 78, 84, 87
      // For round 2 (rollback), use effective = 78, not 75
      const effectiveHeights = effectiveBaseline.map(s => barHeight(s));
      const baselineBottom = groups[0].barBottom; // all bars share same bottom

      // Points for ratchet line
      const points = groups.map((g, i) => {
        const effH = effectiveHeights[i];
        const y = baselineBottom - effH;
        return { x: g.cx, y };
      });

      // Draw dashed orange line through effective baseline tops
      let pathD = `M ${points[0].x} ${points[0].y}`;
      for (let i = 1; i < points.length; i++) {
        pathD += ` L ${points[i].x} ${points[i].y}`;
      }

      svgContent += `<path d="${pathD}" fill="none" stroke="${arrowColor}" stroke-width="2"
        stroke-dasharray="6,4" opacity="0.9"/>`;

      // Dots at each effective baseline point
      points.forEach((p, i) => {
        svgContent += `<circle cx="${p.x}" cy="${p.y}" r="4" fill="${arrowColor}" opacity="0.9"/>`;
      });

      // Label for the ratchet line
      svgContent += `<text x="${points[4].x + 10}" y="${points[4].y - 6}" fill="${arrowColor}"
        font-family="Inter, sans-serif" font-size="11" font-weight="700" letter-spacing="0.5">EFFECTIVE FLOOR</text>`;

      svg.innerHTML = svgContent;
    });
  });
</script>
</body>
</html>


path: assets/chart-rubric-en.html
content: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1200">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;900&display=swap" rel="stylesheet">
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1200px;
    height: 600px;
    overflow: hidden;
    background: #111111;
    font-family: 'Inter', system-ui, -apple-system, sans-serif;
    color: #FFFFFF;
  }

  .container {
    width: 1200px;
    height: 600px;
    display: flex;
    flex-direction: column;
    padding: 44px 56px 36px 56px;
    position: relative;
  }

  /* Header */
  .header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    margin-bottom: 36px;
  }

  .rubric-label {
    color: #D4532B;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 3px;
    text-transform: uppercase;
  }

  .title {
    font-size: 26px;
    font-weight: 900;
    color: #FFFFFF;
    margin-top: 8px;
    letter-spacing: -0.5px;
  }

  .subtitle {
    font-size: 13px;
    color: #666666;
    margin-top: 4px;
    font-weight: 400;
  }

  /* Main content: two columns + divider */
  .main {
    flex: 1;
    display: flex;
    gap: 0;
    align-items: stretch;
  }

  /* Left panel */
  .panel {
    flex: 1;
    display: flex;
    flex-direction: column;
  }

  .panel-header {
    display: flex;
    align-items: baseline;
    gap: 10px;
    margin-bottom: 22px;
  }

  .panel-title {
    font-size: 13px;
    font-weight: 700;
    color: #666666;
    text-transform: uppercase;
    letter-spacing: 2px;
  }

  .panel-score {
    font-size: 28px;
    font-weight: 900;
    color: #FFFFFF;
  }

  .panel-score.orange {
    color: #D4532B;
  }

  /* Divider */
  .divider {
    width: 1px;
    background: #D4532B;
    margin: 0 44px;
    flex-shrink: 0;
  }

  /* Bar items */
  .bar-list {
    display: flex;
    flex-direction: column;
    gap: 13px;
    flex: 1;
  }

  .bar-item {
    display: flex;
    flex-direction: column;
    gap: 5px;
  }

  .bar-meta {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
  }

  .bar-label {
    font-size: 12px;
    font-weight: 600;
    color: #AAAAAA;
    letter-spacing: 0.3px;
  }

  .bar-weight {
    font-size: 22px;
    font-weight: 900;
    color: #FFFFFF;
    line-height: 1;
  }

  .bar-weight.orange {
    color: #D4532B;
    font-size: 28px;
  }

  .bar-track {
    width: 100%;
    height: 6px;
    background: #222222;
    position: relative;
  }

  .bar-fill {
    height: 100%;
    background: #CCCCCC;
    transition: none;
  }

  .bar-fill.orange {
    background: linear-gradient(90deg, #D4532B 0%, #FF7A4D 100%);
  }

  /* Right panel: larger items */
  .bar-item.large .bar-label {
    font-size: 13px;
    color: #AAAAAA;
  }

  .bar-item.large .bar-track {
    height: 8px;
  }

  /* Bottom total */
  .bottom {
    margin-top: 28px;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 16px;
    border-top: 1px solid #222222;
    padding-top: 18px;
  }

  .total-label {
    font-size: 13px;
    font-weight: 700;
    color: #666666;
    letter-spacing: 3px;
    text-transform: uppercase;
  }

  .total-score {
    font-size: 38px;
    font-weight: 900;
    color: #FFFFFF;
    line-height: 1;
  }

  .total-unit {
    font-size: 13px;
    color: #666666;
    font-weight: 600;
    letter-spacing: 2px;
  }

  .dot {
    width: 4px;
    height: 4px;
    background: #D4532B;
    display: inline-block;
    margin: 0 6px 2px 6px;
    vertical-align: middle;
  }
</style>
</head>
<body>
<div class="container">

  <!-- Header -->
  <div class="header">
    <div>
      <div class="rubric-label">EVALUATION RUBRIC</div>
      <div class="title">darwin.skill — 8-Dimension Evaluation Rubric</div>
      <div class="subtitle">Automated quality scoring framework for Claude skill optimization</div>
    </div>
  </div>

  <!-- Main -->
  <div class="main">

    <!-- Left: Structure -->
    <div class="panel">
      <div class="panel-header">
        <div class="panel-title">Structure</div>
        <div class="panel-score">60 pts</div>
      </div>
      <div class="bar-list">

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">Frontmatter Quality</span>
            <span class="bar-weight">8</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(8/15*100%)"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">Workflow Clarity</span>
            <span class="bar-weight">15</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: 100%"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">Edge Case Coverage</span>
            <span class="bar-weight">10</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(10/15*100%)"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">Checkpoint Design</span>
            <span class="bar-weight">7</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(7/15*100%)"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">Instruction Specificity</span>
            <span class="bar-weight">15</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: 100%"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">Resource Integration</span>
            <span class="bar-weight">5</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(5/15*100%)"></div>
          </div>
        </div>

      </div>
    </div>

    <!-- Vertical divider -->
    <div class="divider"></div>

    <!-- Right: Effect -->
    <div class="panel">
      <div class="panel-header">
        <div class="panel-title">Effectiveness</div>
        <div class="panel-score orange">40 pts</div>
      </div>
      <div class="bar-list">

        <div class="bar-item large">
          <div class="bar-meta">
            <span class="bar-label">Overall Architecture</span>
            <span class="bar-weight">15</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(15/25*100%)"></div>
          </div>
        </div>

        <div class="bar-item large" style="margin-top: 12px;">
          <div class="bar-meta" style="margin-bottom: 2px;">
            <span class="bar-label" style="color:#D4532B; font-size:14px; font-weight:700; letter-spacing:0.5px;">Live Test Performance</span>
            <span class="bar-weight orange">25</span>
          </div>
          <!-- Accent line above bar -->
          <div style="width:100%; height:1px; background:#D4532B; opacity:0.25; margin-bottom:6px;"></div>
          <div class="bar-track" style="height:14px; background:#1A0E0A;">
            <div class="bar-fill orange" style="width:100%; height:100%;"></div>
          </div>
          <div style="font-size:11px; color:#D4532B; margin-top:5px; font-weight:600; letter-spacing:1px;">HIGHEST WEIGHT</div>
        </div>

      </div>
    </div>

  </div>

  <!-- Bottom total -->
  <div class="bottom">
    <span class="total-label">TOTAL</span>
    <span class="dot"></span>
    <span class="total-score">100</span>
    <span class="total-unit">PTS</span>
  </div>

</div>
</body>
</html>


path: assets/chart-rubric.html
content: <!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=1200">
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;600;700;900&display=swap" rel="stylesheet">
<style>
  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    width: 1200px;
    height: 600px;
    overflow: hidden;
    background: #111111;
    font-family: 'Inter', system-ui, -apple-system, sans-serif;
    color: #FFFFFF;
  }

  .container {
    width: 1200px;
    height: 600px;
    display: flex;
    flex-direction: column;
    padding: 44px 56px 36px 56px;
    position: relative;
  }

  /* Header */
  .header {
    display: flex;
    align-items: flex-start;
    justify-content: space-between;
    margin-bottom: 36px;
  }

  .rubric-label {
    color: #D4532B;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 3px;
    text-transform: uppercase;
  }

  .title {
    font-size: 26px;
    font-weight: 900;
    color: #FFFFFF;
    margin-top: 8px;
    letter-spacing: -0.5px;
  }

  .subtitle {
    font-size: 13px;
    color: #666666;
    margin-top: 4px;
    font-weight: 400;
  }

  /* Main content: two columns + divider */
  .main {
    flex: 1;
    display: flex;
    gap: 0;
    align-items: stretch;
  }

  /* Left panel */
  .panel {
    flex: 1;
    display: flex;
    flex-direction: column;
  }

  .panel-header {
    display: flex;
    align-items: baseline;
    gap: 10px;
    margin-bottom: 22px;
  }

  .panel-title {
    font-size: 13px;
    font-weight: 700;
    color: #666666;
    text-transform: uppercase;
    letter-spacing: 2px;
  }

  .panel-score {
    font-size: 28px;
    font-weight: 900;
    color: #FFFFFF;
  }

  .panel-score.orange {
    color: #D4532B;
  }

  /* Divider */
  .divider {
    width: 1px;
    background: #D4532B;
    margin: 0 44px;
    flex-shrink: 0;
  }

  /* Bar items */
  .bar-list {
    display: flex;
    flex-direction: column;
    gap: 13px;
    flex: 1;
  }

  .bar-item {
    display: flex;
    flex-direction: column;
    gap: 5px;
  }

  .bar-meta {
    display: flex;
    align-items: baseline;
    justify-content: space-between;
  }

  .bar-label {
    font-size: 12px;
    font-weight: 600;
    color: #AAAAAA;
    letter-spacing: 0.3px;
  }

  .bar-weight {
    font-size: 22px;
    font-weight: 900;
    color: #FFFFFF;
    line-height: 1;
  }

  .bar-weight.orange {
    color: #D4532B;
    font-size: 28px;
  }

  .bar-track {
    width: 100%;
    height: 6px;
    background: #222222;
    position: relative;
  }

  .bar-fill {
    height: 100%;
    background: #CCCCCC;
    transition: none;
  }

  .bar-fill.orange {
    background: linear-gradient(90deg, #D4532B 0%, #FF7A4D 100%);
  }

  /* Right panel: larger items */
  .bar-item.large .bar-label {
    font-size: 13px;
    color: #AAAAAA;
  }

  .bar-item.large .bar-track {
    height: 8px;
  }

  /* Bottom total */
  .bottom {
    margin-top: 28px;
    display: flex;
    align-items: center;
    justify-content: center;
    gap: 16px;
    border-top: 1px solid #222222;
    padding-top: 18px;
  }

  .total-label {
    font-size: 13px;
    font-weight: 700;
    color: #666666;
    letter-spacing: 3px;
    text-transform: uppercase;
  }

  .total-score {
    font-size: 38px;
    font-weight: 900;
    color: #FFFFFF;
    line-height: 1;
  }

  .total-unit {
    font-size: 13px;
    color: #666666;
    font-weight: 600;
    letter-spacing: 2px;
  }

  .dot {
    width: 4px;
    height: 4px;
    background: #D4532B;
    display: inline-block;
    margin: 0 6px 2px 6px;
    vertical-align: middle;
  }
</style>
</head>
<body>
<div class="container">

  <!-- Header -->
  <div class="header">
    <div>
      <div class="rubric-label">EVALUATION RUBRIC</div>
      <div class="title">达尔文.skill — 8 维度评估体系</div>
      <div class="subtitle">Automated quality scoring framework for Claude skill optimization</div>
    </div>
  </div>

  <!-- Main -->
  <div class="main">

    <!-- Left: Structure -->
    <div class="panel">
      <div class="panel-header">
        <div class="panel-title">结构维度</div>
        <div class="panel-score">60分</div>
      </div>
      <div class="bar-list">

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">Frontmatter 质量</span>
            <span class="bar-weight">8</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(8/15*100%)"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">工作流清晰度</span>
            <span class="bar-weight">15</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: 100%"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">边界条件覆盖</span>
            <span class="bar-weight">10</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(10/15*100%)"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">检查点设计</span>
            <span class="bar-weight">7</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(7/15*100%)"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">指令具体性</span>
            <span class="bar-weight">15</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: 100%"></div>
          </div>
        </div>

        <div class="bar-item">
          <div class="bar-meta">
            <span class="bar-label">资源整合度</span>
            <span class="bar-weight">5</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(5/15*100%)"></div>
          </div>
        </div>

      </div>
    </div>

    <!-- Vertical divider -->
    <div class="divider"></div>

    <!-- Right: Effect -->
    <div class="panel">
      <div class="panel-header">
        <div class="panel-title">效果维度</div>
        <div class="panel-score orange">40分</div>
      </div>
      <div class="bar-list">

        <div class="bar-item large">
          <div class="bar-meta">
            <span class="bar-label">整体架构</span>
            <span class="bar-weight">15</span>
          </div>
          <div class="bar-track">
            <div class="bar-fill" style="width: calc(15/25*100%)"></div>
          </div>
        </div>

        <div class="bar-item large" style="margin-top: 12px;">
          <div class="bar-meta" style="margin-bottom: 2px;">
            <span class="bar-label" style="color:#D4532B; font-size:14px; font-weight:700; letter-spacing:0.5px;">实测表现</span>
            <span class="bar-weight orange">25</span>
          </div>
          <!-- Accent line above bar -->
          <div style="width:100%; height:1px; background:#D4532B; opacity:0.25; margin-bottom:6px;"></div>
          <div class="bar-track" style="height:14px; background:#1A0E0A;">
            <div class="bar-fill orange" style="width:100%; height:100%;"></div>
          </div>
          <div style="font-size:11px; color:#D4532B; margin-top:5px; font-weight:600; letter-spacing:1px;">HIGHEST WEIGHT</div>
        </div>

      </div>
    </div>

  </div>

  <!-- Bottom total -->
  <div class="bottom">
    <span class="total-label">TOTAL</span>
    <span class="dot"></span>
    <span class="total-score">100</span>
    <span class="total-unit">PTS</span>
  </div>

</div>
</body>
</html>


path: docs/index.html
content: <!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>自主技能优化系统</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
<style>
  :root {
    --accent: #D4532B;
    --black: #111111;
    --dark: #1a1a1a;
    --mid: #666666;
    --light: #999999;
    --border: #d0d0d0;
    --bg: #fafafa;
    --white: #ffffff;
    --col: calc((100% - 11 * 24px) / 12);
  }

  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--bg);
    color: var(--black);
    font-size: 15px;
    line-height: 1.6;
    -webkit-font-smoothing: antialiased;
  }

  .container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 48px;
  }

  /* ═══════ HERO ═══════ */
  .hero {
    padding: 120px 0 80px;
    border-bottom: 1px solid var(--black);
  }

  .hero-label {
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 3px;
    text-transform: uppercase;
    color: var(--accent);
    margin-bottom: 32px;
  }

  .hero h1 {
    font-size: 88px;
    font-weight: 900;
    line-height: 0.95;
    letter-spacing: -3px;
    margin-bottom: 40px;
    max-width: 900px;
  }

  .hero-subtitle {
    font-size: 20px;
    font-weight: 400;
    color: var(--mid);
    line-height: 1.5;
    max-width: 640px;
    margin-bottom: 56px;
  }

  .hero-subtitle strong {
    color: var(--black);
    font-weight: 600;
  }

  .hero-quote {
    border-left: 3px solid var(--accent);
    padding: 20px 0 20px 24px;
    max-width: 600px;
  }

  .hero-quote p {
    font-size: 16px;
    font-weight: 400;
    font-style: italic;
    color: var(--dark);
    line-height: 1.7;
  }

  .hero-quote cite {
    display: block;
    margin-top: 12px;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 1px;
    text-transform: uppercase;
    font-style: normal;
    color: var(--light);
  }

  /* ═══════ SECTION HEADERS ═══════ */
  .section {
    padding: 80px 0;
    border-bottom: 1px solid var(--border);
  }

  .section:last-child {
    border-bottom: none;
  }

  .section-num {
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 2px;
    color: var(--accent);
    margin-bottom: 16px;
    font-variant-numeric: tabular-nums;
  }

  .section-title {
    font-size: 48px;
    font-weight: 800;
    line-height: 1.05;
    letter-spacing: -1.5px;
    margin-bottom: 16px;
  }

  .section-lead {
    font-size: 17px;
    color: var(--mid);
    max-width: 560px;
    line-height: 1.6;
    margin-bottom: 48px;
  }

  /* ═══════ PRINCIPLES ═══════ */
  .principles-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0;
  }

  .principle {
    padding: 32px 32px 32px 0;
    border-top: 1px solid var(--border);
  }

  .principle:nth-child(even) {
    padding-left: 32px;
    border-left: 1px solid var(--border);
  }

  .principle:nth-child(1),
  .principle:nth-child(2) {
    border-top: 1px solid var(--black);
  }

  .principle-num {
    font-size: 36px;
    font-weight: 800;
    color: var(--accent);
    margin-bottom: 12px;
    line-height: 1;
  }

  .principle h3 {
    font-size: 18px;
    font-weight: 700;
    margin-bottom: 8px;
    letter-spacing: -0.3px;
  }

  .principle p {
    font-size: 14px;
    color: var(--mid);
    line-height: 1.6;
  }

  .principle--full {
    grid-column: 1 / -1;
    padding-left: 0;
    border-left: none;
  }

  /* ═══════ RUBRIC ═══════ */
  .rubric-header {
    display: flex;
    gap: 48px;
    margin-bottom: 48px;
  }

  .rubric-stat {
    display: flex;
    align-items: baseline;
    gap: 12px;
  }

  .rubric-stat-num {
    font-size: 64px;
    font-weight: 900;
    line-height: 1;
    letter-spacing: -2px;
  }

  .rubric-stat-num--accent {
    color: var(--accent);
  }

  .rubric-stat-label {
    font-size: 13px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    color: var(--mid);
  }

  .rubric-table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 40px;
  }

  .rubric-table caption {
    text-align: left;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 2.5px;
    text-transform: uppercase;
    color: var(--light);
    padding-bottom: 16px;
  }

  .rubric-table th {
    text-align: left;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--light);
    padding: 12px 16px 12px 0;
    border-bottom: 2px solid var(--black);
  }

  .rubric-table td {
    padding: 14px 16px 14px 0;
    border-bottom: 1px solid var(--border);
    font-size: 14px;
    vertical-align: top;
  }

  .rubric-table tr:last-child td {
    border-bottom: none;
  }

  .rubric-table .dim-num {
    font-weight: 700;
    color: var(--accent);
    font-variant-numeric: tabular-nums;
    width: 36px;
  }

  .rubric-table .dim-name {
    font-weight: 600;
    white-space: nowrap;
  }

  .rubric-table .dim-weight {
    font-weight: 800;
    font-size: 20px;
    font-variant-numeric: tabular-nums;
    text-align: center;
    width: 60px;
    color: var(--dark);
  }

  .rubric-table .dim-desc {
    color: var(--mid);
    line-height: 1.5;
  }

  /* ═══════ PHASES ═══════ */
  .phases {
    display: flex;
    flex-direction: column;
    gap: 0;
  }

  .phase {
    display: grid;
    grid-template-columns: 160px 1fr;
    gap: 40px;
    padding: 40px 0;
    border-top: 1px solid var(--border);
  }

  .phase:first-child {
    border-top: 1px solid var(--black);
  }

  .phase-id {
    font-size: 48px;
    font-weight: 900;
    color: var(--accent);
    line-height: 1;
    letter-spacing: -1px;
  }

  .phase-id span {
    display: block;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: var(--light);
    margin-top: 8px;
  }

  .phase-body h3 {
    font-size: 22px;
    font-weight: 700;
    margin-bottom: 12px;
    letter-spacing: -0.3px;
  }

  .phase-body p {
    font-size: 14px;
    color: var(--mid);
    line-height: 1.6;
    margin-bottom: 16px;
    max-width: 560px;
  }

  .phase-steps {
    list-style: none;
    counter-reset: step;
  }

  .phase-steps li {
    counter-increment: step;
    padding: 8px 0 8px 32px;
    position: relative;
    font-size: 14px;
    line-height: 1.5;
    color: var(--dark);
  }

  .phase-steps li::before {
    content: counter(step);
    position: absolute;
    left: 0;
    font-size: 11px;
    font-weight: 700;
    color: var(--accent);
    width: 20px;
    height: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    top: 9px;
  }

  /* ═══════ RATCHET ═══════ */
  .ratchet-viz {
    display: flex;
    align-items: flex-end;
    gap: 0;
    padding: 48px 0;
    position: relative;
  }

  .ratchet-viz::before {
    content: '';
    position: absolute;
    bottom: 48px;
    left: 0;
    right: 0;
    height: 1px;
    background: var(--border);
  }

  .ratchet-step {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    position: relative;
  }

  .ratchet-bar {
    width: 80px;
    background: var(--black);
    position: relative;
    z-index: 1;
  }

  .ratchet-bar--revert {
    background: none;
    border: 2px solid var(--border);
  }

  .ratchet-score {
    font-size: 36px;
    font-weight: 900;
    margin-bottom: 8px;
    letter-spacing: -1px;
    line-height: 1;
  }

  .ratchet-score--revert {
    color: var(--light);
    text-decoration: line-through;
    text-decoration-color: var(--accent);
    text-decoration-thickness: 2px;
  }

  .ratchet-label {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    margin-top: 12px;
    padding: 4px 10px;
  }

  .ratchet-label--keep {
    background: var(--black);
    color: var(--white);
  }

  .ratchet-label--revert {
    background: none;
    border: 1px solid var(--accent);
    color: var(--accent);
  }

  .ratchet-label--baseline {
    background: var(--accent);
    color: var(--white);
  }

  .ratchet-arrow {
    position: absolute;
    top: 50%;
    right: -12px;
    width: 24px;
    height: 2px;
    background: var(--border);
    z-index: 2;
  }

  .ratchet-arrow::after {
    content: '';
    position: absolute;
    right: -1px;
    top: -4px;
    border: solid var(--border);
    border-width: 0 2px 2px 0;
    padding: 3px;
    transform: rotate(-45deg);
  }

  .ratchet-round {
    font-size: 12px;
    color: var(--light);
    margin-top: 8px;
    font-weight: 500;
  }

  /* ═══════ COMPARISON ═══════ */
  .comparison {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0;
  }

  .comparison-col {
    padding: 40px;
    border: 1px solid var(--border);
  }

  .comparison-col:first-child {
    border-right: none;
  }

  .comparison-col--highlight {
    background: var(--black);
    color: var(--white);
    border-color: var(--black);
  }

  .comparison-tag {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 2px;
    text-transform: uppercase;
    margin-bottom: 16px;
  }

  .comparison-col:first-child .comparison-tag {
    color: var(--light);
  }

  .comparison-col--highlight .comparison-tag {
    color: var(--accent);
  }

  .comparison-col h3 {
    font-size: 24px;
    font-weight: 800;
    margin-bottom: 20px;
    letter-spacing: -0.5px;
  }

  .comparison-list {
    list-style: none;
  }

  .comparison-list li {
    padding: 10px 0;
    font-size: 14px;
    line-height: 1.5;
    border-bottom: 1px solid;
  }

  .comparison-col:first-child .comparison-list li {
    border-color: var(--border);
    color: var(--mid);
  }

  .comparison-col--highlight .comparison-list li {
    border-color: #333;
    color: #ccc;
  }

  .comparison-list li:last-child {
    border-bottom: none;
  }

  .comparison-list li strong {
    color: var(--black);
  }

  .comparison-col--highlight .comparison-list li strong {
    color: var(--white);
  }

  .check-icon {
    display: inline-block;
    width: 16px;
    height: 16px;
    margin-right: 8px;
    vertical-align: middle;
    position: relative;
    top: -1px;
  }

  /* ═══════ MAPPING TABLE ═══════ */
  .mapping-table {
    width: 100%;
    border-collapse: collapse;
  }

  .mapping-table th {
    text-align: left;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 2px;
    text-transform: uppercase;
    padding: 16px 24px 16px 0;
    border-bottom: 2px solid var(--black);
  }

  .mapping-table th:first-child {
    color: var(--light);
  }

  .mapping-table th:nth-child(2) {
    color: var(--accent);
  }

  .mapping-table th:last-child {
    color: var(--light);
  }

  .mapping-table td {
    padding: 16px 24px 16px 0;
    border-bottom: 1px solid var(--border);
    font-size: 14px;
    vertical-align: top;
  }

  .mapping-table td:first-child {
    font-weight: 600;
    color: var(--dark);
    white-space: nowrap;
  }

  .mapping-table td:nth-child(2) {
    font-weight: 600;
    color: var(--black);
  }

  .mapping-table td:last-child {
    color: var(--mid);
    line-height: 1.5;
  }

  .mapping-arrow {
    display: inline-block;
    color: var(--accent);
    font-weight: 400;
    margin: 0 4px;
  }

  /* ═══════ FOOTER ═══════ */
  .footer {
    padding: 48px 0;
    border-top: 1px solid var(--black);
    display: flex;
    justify-content: space-between;
    align-items: center;
  }

  .footer-left {
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 1px;
    text-transform: uppercase;
    color: var(--light);
  }

  .footer-right {
    font-size: 12px;
    color: var(--light);
  }

  /* ═══════ RESPONSIVE ═══════ */
  @media (max-width: 768px) {
    .container { padding: 0 24px; }
    .hero { padding: 64px 0 48px; }
    .hero h1 { font-size: 48px; letter-spacing: -1.5px; }
    .hero-subtitle { font-size: 17px; }
    .section { padding: 48px 0; }
    .section-title { font-size: 32px; }
    .principles-grid { grid-template-columns: 1fr; }
    .principle:nth-child(even) { padding-left: 0; border-left: none; }
    .principle:nth-child(2) { border-top: 1px solid var(--border); }
    .phase { grid-template-columns: 1fr; gap: 16px; }
    .comparison { grid-template-columns: 1fr; }
    .comparison-col:first-child { border-right: 1px solid var(--border); border-bottom: none; }
    .ratchet-viz { flex-wrap: wrap; gap: 24px; }
    .ratchet-step { flex: none; width: calc(33% - 16px); }
    .rubric-stat-num { font-size: 48px; }
    .mapping-table td:first-child { white-space: normal; }
  }
</style>
</head>
<body>

<!-- ═══════════════════════════ HERO ═══════════════════════════ -->
<div class="container">
  <section class="hero">
    <div class="hero-label">自主技能优化系统</div>
    <h1>Auto Skill<br>Optimizer</h1>
    <p class="hero-subtitle">
      <strong>评估</strong> &rarr; <strong>改进</strong> &rarr; <strong>实测验证</strong> &rarr; <strong>人类确认</strong> &rarr; <strong>保留或回滚</strong>
    </p>
    <div class="hero-quote">
      <p>「autoresearch 的核心想法很简单：让系统自主运行实验，评估结果，只保留有效的改进。一个只能向前转的棘轮。」</p>
      <cite>Andrej Karpathy &mdash; 谈自主实验循环</cite>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 01 PRINCIPLES ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">01</div>
    <h2 class="section-title">核心原则</h2>
    <p class="section-lead">五条规则，防止优化器偏移方向、自我刷分或引入退化。</p>

    <div class="principles-grid">
      <div class="principle">
        <div class="principle-num">01</div>
        <h3>单一可编辑资产</h3>
        <p>每轮优化只针对一个 SKILL.md 文件。一次修改，一次测量，一次决策。不做跨文件编辑，避免归因模糊。</p>
      </div>
      <div class="principle">
        <div class="principle-num">02</div>
        <h3>双重评估</h3>
        <p>静态结构分析捕捉格式和完整性问题。实测执行捕捉行为退化。两者缺一不可。</p>
      </div>
      <div class="principle">
        <div class="principle-num">03</div>
        <h3>棘轮机制</h3>
        <p>提升总分的改进被 commit。降低分数的修改自动 revert。分数只能上升或持平，永远不会下降。</p>
      </div>
      <div class="principle">
        <div class="principle-num">04</div>
        <h3>独立评分</h3>
        <p>编辑 Skill 的 Agent 永远不为自己打分。由独立的子 Agent 评估输出质量，防止自我表扬偏差。</p>
      </div>
      <div class="principle principle--full">
        <div class="principle-num">05</div>
        <h3>人在回路</h3>
        <p>每个 Skill 的优化循环完成后，系统暂停。向人类展示 diff 摘要、分数变化和测试输出对比。没有明确确认，任何改动都不会生效。</p>
      </div>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 02 RUBRIC ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">02</div>
    <h2 class="section-title">8维度<br>评估体系</h2>
    <p class="section-lead">100分评估体系。结构维度捕捉你能看到的问题，效果维度捕捉只有运行时才能感知的问题。</p>

    <div class="rubric-header">
      <div class="rubric-stat">
        <div class="rubric-stat-num">60</div>
        <div class="rubric-stat-label">结构<br>分值</div>
      </div>
      <div class="rubric-stat">
        <div class="rubric-stat-num rubric-stat-num--accent">40</div>
        <div class="rubric-stat-label">效果<br>分值</div>
      </div>
    </div>

    <table class="rubric-table">
      <caption>结构维度 &mdash; 静态分析</caption>
      <thead>
        <tr>
          <th style="width:36px">#</th>
          <th style="width:180px">维度</th>
          <th style="width:60px">权重</th>
          <th>评分标准</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td class="dim-num">1</td>
          <td class="dim-name">Frontmatter质量</td>
          <td class="dim-weight">8</td>
          <td class="dim-desc">名称正确，描述包含功能/触发条件/使用场景，不超过1024字符</td>
        </tr>
        <tr>
          <td class="dim-num">2</td>
          <td class="dim-name">工作流清晰度</td>
          <td class="dim-weight">15</td>
          <td class="dim-desc">步骤有编号、可执行，每步都有明确的输入/输出</td>
        </tr>
        <tr>
          <td class="dim-num">3</td>
          <td class="dim-name">边界条件覆盖</td>
          <td class="dim-weight">10</td>
          <td class="dim-desc">错误处理、降级方案、常见故障恢复</td>
        </tr>
        <tr>
          <td class="dim-num">4</td>
          <td class="dim-name">检查点设计</td>
          <td class="dim-weight">7</td>
          <td class="dim-desc">关键决策前需用户确认，防止自主失控</td>
        </tr>
        <tr>
          <td class="dim-num">5</td>
          <td class="dim-name">指令具体性</td>
          <td class="dim-weight">15</td>
          <td class="dim-desc">无歧义，具体的参数/格式/示例，可直接执行</td>
        </tr>
        <tr>
          <td class="dim-num">6</td>
          <td class="dim-name">资源整合度</td>
          <td class="dim-weight">5</td>
          <td class="dim-desc">所有引用的脚本/资产路径存在且可访问</td>
        </tr>
      </tbody>
    </table>

    <table class="rubric-table">
      <caption>效果维度 &mdash; 需要实测</caption>
      <thead>
        <tr>
          <th style="width:36px">#</th>
          <th style="width:180px">维度</th>
          <th style="width:60px">权重</th>
          <th>评分标准</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td class="dim-num">7</td>
          <td class="dim-name">整体架构</td>
          <td class="dim-weight">15</td>
          <td class="dim-desc">层次清晰，无冗余或遗漏，符合生态系统约定</td>
        </tr>
        <tr>
          <td class="dim-num">8</td>
          <td class="dim-name">实测表现</td>
          <td class="dim-weight">25</td>
          <td class="dim-desc">运行2-3个测试提示词，对比启用 Skill 和 baseline 的输出质量</td>
        </tr>
      </tbody>
    </table>
  </section>
</div>

<!-- ═══════════════════════════ 03 PHASES ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">03</div>
    <h2 class="section-title">优化循环</h2>
    <p class="section-lead">从初始化到最终报告的五个阶段。系统在每个阶段内自主运行，但在阶段之间暂停等待人类审查。</p>

    <div class="phases">
      <div class="phase">
        <div class="phase-id">
          0
          <span>初始化</span>
        </div>
        <div class="phase-body">
          <h3>范围与分支设置</h3>
          <p>确定优化范围，创建版本控制基础设施，加载历史记录。</p>
          <ol class="phase-steps">
            <li>确认范围：全部 Skill 还是用户指定子集</li>
            <li>扫描 .claude/skills/*/SKILL.md 获取目标列表</li>
            <li>创建 git 分支：auto-optimize/YYYYMMDD-HHMM</li>
            <li>初始化或加载 results.tsv 用于历史追踪</li>
          </ol>
        </div>
      </div>

      <div class="phase">
        <div class="phase-id">
          0.5
          <span>设计</span>
        </div>
        <div class="phase-body">
          <h3>测试提示词工程</h3>
          <p>在任何评分之前，先设计用于衡量效果的测试提示词。没有好的测试，优化器就是盲飞。</p>
          <ol class="phase-steps">
            <li>阅读每个 SKILL.md，理解其声明的能力</li>
            <li>为每个 Skill 设计2-3个提示词：一个正常路径，一个模糊场景</li>
            <li>保存到每个 Skill 目录下的 test-prompts.json</li>
            <li>在继续之前，将所有测试提示词提交人类审批</li>
          </ol>
        </div>
      </div>

      <div class="phase">
        <div class="phase-id">
          1
          <span>基线</span>
        </div>
        <div class="phase-body">
          <h3>全维度评分</h3>
          <p>为每个 Skill 建立起始分数。结构评分由主 Agent 完成，效果评分由独立子 Agent 完成。</p>
          <ol class="phase-steps">
            <li>阅读 SKILL.md，为维度1-7评分并附理由</li>
            <li>启动子 Agent：分别在启用和未启用 Skill 的情况下运行测试提示词</li>
            <li>对比输出，为维度8评分（如子 Agent 不可用则标记 dry_run）</li>
            <li>计算加权总分，记录到 results.tsv</li>
            <li>展示评分卡，暂停等待人类确认</li>
          </ol>
        </div>
      </div>

      <div class="phase">
        <div class="phase-id">
          2
          <span>优化</span>
        </div>
        <div class="phase-body">
          <h3>Hill-Climbing 循环</h3>
          <p>按分数从低到高处理 Skill。每轮：诊断最弱维度，提出一个针对性修复，执行，重新评分，做出决定。</p>
          <ol class="phase-steps">
            <li>找出该 Skill 得分最低的维度</li>
            <li>生成一项具体改进（改什么，为什么改，预期分数变化）</li>
            <li>编辑 SKILL.md，用结构化消息 git commit</li>
            <li>重新评分：结构由主 Agent，效果由独立子 Agent</li>
            <li>新分 > 旧分：保留。否则：git revert，进入下一个 Skill</li>
            <li>每个 Skill 完成后：展示 diff + 分数变化，等待人类确认</li>
          </ol>
        </div>
      </div>

      <div class="phase">
        <div class="phase-id">
          3
          <span>报告</span>
        </div>
        <div class="phase-body">
          <h3>总结与指标</h3>
          <p>将所有结果汇总为最终优化报告，包含优化前后分数、实验次数和关键改进。</p>
          <ol class="phase-steps">
            <li>统计总实验次数、保留次数、回滚次数和测试模式</li>
            <li>生成每个 Skill 的优化前后分数对比表</li>
            <li>列出影响最大的改进及其对应维度</li>
            <li>归档 results.tsv 供未来 baseline 参考</li>
          </ol>
        </div>
      </div>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 04 RATCHET ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">04</div>
    <h2 class="section-title">棘轮机制</h2>
    <p class="section-lead">分数只能上升。每轮要么改进 Skill，要么干净地回滚。不会随时间积累局部退化。</p>

    <div class="ratchet-viz">
      <div class="ratchet-step">
        <div class="ratchet-score">72</div>
        <div style="height:144px" class="ratchet-bar"></div>
        <div class="ratchet-label ratchet-label--baseline">基线</div>
        <div class="ratchet-round">轮次 0</div>
        <div class="ratchet-arrow"></div>
      </div>
      <div class="ratchet-step">
        <div class="ratchet-score">78</div>
        <div style="height:156px" class="ratchet-bar"></div>
        <div class="ratchet-label ratchet-label--keep">保留</div>
        <div class="ratchet-round">轮次 1</div>
        <div class="ratchet-arrow"></div>
      </div>
      <div class="ratchet-step">
        <div class="ratchet-score ratchet-score--revert">75</div>
        <div style="height:150px" class="ratchet-bar ratchet-bar--revert"></div>
        <div class="ratchet-label ratchet-label--revert">回滚</div>
        <div class="ratchet-round">轮次 2</div>
        <div class="ratchet-arrow"></div>
      </div>
      <div class="ratchet-step">
        <div class="ratchet-score">84</div>
        <div style="height:168px" class="ratchet-bar"></div>
        <div class="ratchet-label ratchet-label--keep">Keep</div>
        <div class="ratchet-round">轮次 3</div>
        <div class="ratchet-arrow"></div>
      </div>
      <div class="ratchet-step">
        <div class="ratchet-score">87</div>
        <div style="height:174px" class="ratchet-bar"></div>
        <div class="ratchet-label ratchet-label--keep">Keep</div>
        <div class="ratchet-round">轮次 4</div>
      </div>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 05 COMPARISON ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">05</div>
    <h2 class="section-title">为什么需要<br>双重评估</h2>
    <p class="section-lead">单看结构无法判断 Skill 是否真正好用。单看效果无法判断它为何失败。</p>

    <div class="comparison">
      <div class="comparison-col">
        <div class="comparison-tag">传统方法</div>
        <h3>纯结构审查</h3>
        <ul class="comparison-list">
          <li>检查 frontmatter 是否存在且格式正确</li>
          <li>验证步骤是否有编号和描述</li>
          <li>确认文件路径和引用是否有效</li>
          <li>无法检测 Skill 是否<strong>真正提升了</strong>输出质量</li>
          <li>无法检测<strong>看似正确</strong>实则产生差结果的误导性指令</li>
          <li>无法检测<strong>弊大于利</strong>的过度约束</li>
        </ul>
      </div>
      <div class="comparison-col comparison-col--highlight">
        <div class="comparison-tag">Auto Skill Optimizer</div>
        <h3>双重评估</h3>
        <ul class="comparison-list">
          <li><strong>结构评分</strong>捕捉格式、完整性和可读性问题</li>
          <li><strong>实测执行</strong>揭示真实场景下的行为影响</li>
          <li><strong>基线对比</strong>衡量 Skill 是增值还是减值</li>
          <li><strong>独立子 Agent</strong>防止自我表扬的评分偏差</li>
          <li><strong>测试提示词设计</strong>确保评估针对真实用户场景</li>
          <li><strong>Dry-run 降级</strong>在实测不可用时提供覆盖</li>
        </ul>
      </div>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 06 MAPPING ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">06</div>
    <h2 class="section-title">概念映射</h2>
    <p class="section-lead">autoresearch 的核心抽象如何转化为 Skill 优化。同一台机器，不同的领域。</p>

    <table class="mapping-table">
      <thead>
        <tr>
          <th style="width:220px">Autoresearch</th>
          <th style="width:220px">Skill Optimizer</th>
          <th>实现细节</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>研究论文草稿</td>
          <td>SKILL.md 文件</td>
          <td>唯一的可编辑产物。所有改进都表现为对这一个文件的编辑。</td>
        </tr>
        <tr>
          <td>评估指标</td>
          <td>8维度评估体系</td>
          <td>跨结构（60分）和效果（40分）的加权评分，总计100分。</td>
        </tr>
        <tr>
          <td>实验循环</td>
          <td>阶段2 hill-climbing</td>
          <td>诊断最弱维度，提出修复，执行，重新评分，保留或回滚。每个 Skill 最多3轮。</td>
        </tr>
        <tr>
          <td>版本控制</td>
          <td>Git 分支 + revert</td>
          <td>每次编辑都是一次 commit。退化通过 revert（新 commit）回滚。完整审计记录。</td>
        </tr>
        <tr>
          <td>自动化评估</td>
          <td>子 Agent 测试执行</td>
          <td>独立 Agent 分别在启用和未启用 Skill 的情况下运行测试提示词，对比输出质量。</td>
        </tr>
        <tr>
          <td>人类审查关卡</td>
          <td>阶段转换暂停</td>
          <td>系统在基线评分后和每个 Skill 优化后暂停。展示 diff + 分数变化。</td>
        </tr>
        <tr>
          <td>探索 vs 利用</td>
          <td>阶段2.5探索性重写</td>
          <td>当 hill-climbing 停滞（连续2次在第1轮就中断），提出完整的结构重写。</td>
        </tr>
        <tr>
          <td>实验日志</td>
          <td>results.tsv</td>
          <td>带时间戳的记录：commit 哈希、Skill 名称、新旧分数、保留/回滚状态、评估模式。</td>
        </tr>
      </tbody>
    </table>
  </section>
</div>

<!-- ═══════════════════════════ FOOTER ═══════════════════════════ -->
<div class="container">
  <footer class="footer">
    <div class="footer-left">Auto Skill Optimizer</div>
    <div class="footer-right">灵感源自 Karpathy autoresearch &mdash; 为 Claude Code Skill 生态而建</div>
  </footer>
</div>

</body>
</html>

path: references/README.md
content: # Darwin Skill References


path: scripts/README.md
content: # Darwin Optimization Scripts


path: showcase.html
content: <!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>自主技能优化系统</title>
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700;800;900&display=swap" rel="stylesheet">
<style>
  :root {
    --accent: #D4532B;
    --black: #111111;
    --dark: #1a1a1a;
    --mid: #666666;
    --light: #999999;
    --border: #d0d0d0;
    --bg: #fafafa;
    --white: #ffffff;
    --col: calc((100% - 11 * 24px) / 12);
  }

  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    font-family: 'Inter', -apple-system, sans-serif;
    background: var(--bg);
    color: var(--black);
    font-size: 15px;
    line-height: 1.6;
    -webkit-font-smoothing: antialiased;
  }

  .container {
    max-width: 1200px;
    margin: 0 auto;
    padding: 0 48px;
  }

  /* ═══════ HERO ═══════ */
  .hero {
    padding: 120px 0 80px;
    border-bottom: 1px solid var(--black);
  }

  .hero-label {
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 3px;
    text-transform: uppercase;
    color: var(--accent);
    margin-bottom: 32px;
  }

  .hero h1 {
    font-size: 88px;
    font-weight: 900;
    line-height: 0.95;
    letter-spacing: -3px;
    margin-bottom: 40px;
    max-width: 900px;
  }

  .hero-subtitle {
    font-size: 20px;
    font-weight: 400;
    color: var(--mid);
    line-height: 1.5;
    max-width: 640px;
    margin-bottom: 56px;
  }

  .hero-subtitle strong {
    color: var(--black);
    font-weight: 600;
  }

  .hero-quote {
    border-left: 3px solid var(--accent);
    padding: 20px 0 20px 24px;
    max-width: 600px;
  }

  .hero-quote p {
    font-size: 16px;
    font-weight: 400;
    font-style: italic;
    color: var(--dark);
    line-height: 1.7;
  }

  .hero-quote cite {
    display: block;
    margin-top: 12px;
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 1px;
    text-transform: uppercase;
    font-style: normal;
    color: var(--light);
  }

  /* ═══════ SECTION HEADERS ═══════ */
  .section {
    padding: 80px 0;
    border-bottom: 1px solid var(--border);
  }

  .section:last-child {
    border-bottom: none;
  }

  .section-num {
    font-size: 12px;
    font-weight: 700;
    letter-spacing: 2px;
    color: var(--accent);
    margin-bottom: 16px;
    font-variant-numeric: tabular-nums;
  }

  .section-title {
    font-size: 48px;
    font-weight: 800;
    line-height: 1.05;
    letter-spacing: -1.5px;
    margin-bottom: 16px;
  }

  .section-lead {
    font-size: 17px;
    color: var(--mid);
    max-width: 560px;
    line-height: 1.6;
    margin-bottom: 48px;
  }

  /* ═══════ PRINCIPLES ═══════ */
  .principles-grid {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0;
  }

  .principle {
    padding: 32px 32px 32px 0;
    border-top: 1px solid var(--border);
  }

  .principle:nth-child(even) {
    padding-left: 32px;
    border-left: 1px solid var(--border);
  }

  .principle:nth-child(1),
  .principle:nth-child(2) {
    border-top: 1px solid var(--black);
  }

  .principle-num {
    font-size: 36px;
    font-weight: 800;
    color: var(--accent);
    margin-bottom: 12px;
    line-height: 1;
  }

  .principle h3 {
    font-size: 18px;
    font-weight: 700;
    margin-bottom: 8px;
    letter-spacing: -0.3px;
  }

  .principle p {
    font-size: 14px;
    color: var(--mid);
    line-height: 1.6;
  }

  .principle--full {
    grid-column: 1 / -1;
    padding-left: 0;
    border-left: none;
  }

  /* ═══════ RUBRIC ═══════ */
  .rubric-header {
    display: flex;
    gap: 48px;
    margin-bottom: 48px;
  }

  .rubric-stat {
    display: flex;
    align-items: baseline;
    gap: 12px;
  }

  .rubric-stat-num {
    font-size: 64px;
    font-weight: 900;
    line-height: 1;
    letter-spacing: -2px;
  }

  .rubric-stat-num--accent {
    color: var(--accent);
  }

  .rubric-stat-label {
    font-size: 13px;
    font-weight: 600;
    text-transform: uppercase;
    letter-spacing: 1.5px;
    color: var(--mid);
  }

  .rubric-table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 40px;
  }

  .rubric-table caption {
    text-align: left;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 2.5px;
    text-transform: uppercase;
    color: var(--light);
    padding-bottom: 16px;
  }

  .rubric-table th {
    text-align: left;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    color: var(--light);
    padding: 12px 16px 12px 0;
    border-bottom: 2px solid var(--black);
  }

  .rubric-table td {
    padding: 14px 16px 14px 0;
    border-bottom: 1px solid var(--border);
    font-size: 14px;
    vertical-align: top;
  }

  .rubric-table tr:last-child td {
    border-bottom: none;
  }

  .rubric-table .dim-num {
    font-weight: 700;
    color: var(--accent);
    font-variant-numeric: tabular-nums;
    width: 36px;
  }

  .rubric-table .dim-name {
    font-weight: 600;
    white-space: nowrap;
  }

  .rubric-table .dim-weight {
    font-weight: 800;
    font-size: 20px;
    font-variant-numeric: tabular-nums;
    text-align: center;
    width: 60px;
    color: var(--dark);
  }

  .rubric-table .dim-desc {
    color: var(--mid);
    line-height: 1.5;
  }

  /* ═══════ PHASES ═══════ */
  .phases {
    display: flex;
    flex-direction: column;
    gap: 0;
  }

  .phase {
    display: grid;
    grid-template-columns: 160px 1fr;
    gap: 40px;
    padding: 40px 0;
    border-top: 1px solid var(--border);
  }

  .phase:first-child {
    border-top: 1px solid var(--black);
  }

  .phase-id {
    font-size: 48px;
    font-weight: 900;
    color: var(--accent);
    line-height: 1;
    letter-spacing: -1px;
  }

  .phase-id span {
    display: block;
    font-size: 11px;
    font-weight: 600;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: var(--light);
    margin-top: 8px;
  }

  .phase-body h3 {
    font-size: 22px;
    font-weight: 700;
    margin-bottom: 12px;
    letter-spacing: -0.3px;
  }

  .phase-body p {
    font-size: 14px;
    color: var(--mid);
    line-height: 1.6;
    margin-bottom: 16px;
    max-width: 560px;
  }

  .phase-steps {
    list-style: none;
    counter-reset: step;
  }

  .phase-steps li {
    counter-increment: step;
    padding: 8px 0 8px 32px;
    position: relative;
    font-size: 14px;
    line-height: 1.5;
    color: var(--dark);
  }

  .phase-steps li::before {
    content: counter(step);
    position: absolute;
    left: 0;
    font-size: 11px;
    font-weight: 700;
    color: var(--accent);
    width: 20px;
    height: 20px;
    display: flex;
    align-items: center;
    justify-content: center;
    top: 9px;
  }

  /* ═══════ RATCHET ═══════ */
  .ratchet-viz {
    display: flex;
    align-items: flex-end;
    gap: 0;
    padding: 48px 0;
    position: relative;
  }

  .ratchet-viz::before {
    content: '';
    position: absolute;
    bottom: 48px;
    left: 0;
    right: 0;
    height: 1px;
    background: var(--border);
  }

  .ratchet-step {
    flex: 1;
    display: flex;
    flex-direction: column;
    align-items: center;
    position: relative;
  }

  .ratchet-bar {
    width: 80px;
    background: var(--black);
    position: relative;
    z-index: 1;
  }

  .ratchet-bar--revert {
    background: none;
    border: 2px solid var(--border);
  }

  .ratchet-score {
    font-size: 36px;
    font-weight: 900;
    margin-bottom: 8px;
    letter-spacing: -1px;
    line-height: 1;
  }

  .ratchet-score--revert {
    color: var(--light);
    text-decoration: line-through;
    text-decoration-color: var(--accent);
    text-decoration-thickness: 2px;
  }

  .ratchet-label {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 1.5px;
    text-transform: uppercase;
    margin-top: 12px;
    padding: 4px 10px;
  }

  .ratchet-label--keep {
    background: var(--black);
    color: var(--white);
  }

  .ratchet-label--revert {
    background: none;
    border: 1px solid var(--accent);
    color: var(--accent);
  }

  .ratchet-label--baseline {
    background: var(--accent);
    color: var(--white);
  }

  .ratchet-arrow {
    position: absolute;
    top: 50%;
    right: -12px;
    width: 24px;
    height: 2px;
    background: var(--border);
    z-index: 2;
  }

  .ratchet-arrow::after {
    content: '';
    position: absolute;
    right: -1px;
    top: -4px;
    border: solid var(--border);
    border-width: 0 2px 2px 0;
    padding: 3px;
    transform: rotate(-45deg);
  }

  .ratchet-round {
    font-size: 12px;
    color: var(--light);
    margin-top: 8px;
    font-weight: 500;
  }

  /* ═══════ COMPARISON ═══════ */
  .comparison {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 0;
  }

  .comparison-col {
    padding: 40px;
    border: 1px solid var(--border);
  }

  .comparison-col:first-child {
    border-right: none;
  }

  .comparison-col--highlight {
    background: var(--black);
    color: var(--white);
    border-color: var(--black);
  }

  .comparison-tag {
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 2px;
    text-transform: uppercase;
    margin-bottom: 16px;
  }

  .comparison-col:first-child .comparison-tag {
    color: var(--light);
  }

  .comparison-col--highlight .comparison-tag {
    color: var(--accent);
  }

  .comparison-col h3 {
    font-size: 24px;
    font-weight: 800;
    margin-bottom: 20px;
    letter-spacing: -0.5px;
  }

  .comparison-list {
    list-style: none;
  }

  .comparison-list li {
    padding: 10px 0;
    font-size: 14px;
    line-height: 1.5;
    border-bottom: 1px solid;
  }

  .comparison-col:first-child .comparison-list li {
    border-color: var(--border);
    color: var(--mid);
  }

  .comparison-col--highlight .comparison-list li {
    border-color: #333;
    color: #ccc;
  }

  .comparison-list li:last-child {
    border-bottom: none;
  }

  .comparison-list li strong {
    color: var(--black);
  }

  .comparison-col--highlight .comparison-list li strong {
    color: var(--white);
  }

  .check-icon {
    display: inline-block;
    width: 16px;
    height: 16px;
    margin-right: 8px;
    vertical-align: middle;
    position: relative;
    top: -1px;
  }

  /* ═══════ MAPPING TABLE ═══════ */
  .mapping-table {
    width: 100%;
    border-collapse: collapse;
  }

  .mapping-table th {
    text-align: left;
    font-size: 11px;
    font-weight: 700;
    letter-spacing: 2px;
    text-transform: uppercase;
    padding: 16px 24px 16px 0;
    border-bottom: 2px solid var(--black);
  }

  .mapping-table th:first-child {
    color: var(--light);
  }

  .mapping-table th:nth-child(2) {
    color: var(--accent);
  }

  .mapping-table th:last-child {
    color: var(--light);
  }

  .mapping-table td {
    padding: 16px 24px 16px 0;
    border-bottom: 1px solid var(--border);
    font-size: 14px;
    vertical-align: top;
  }

  .mapping-table td:first-child {
    font-weight: 600;
    color: var(--dark);
    white-space: nowrap;
  }

  .mapping-table td:nth-child(2) {
    font-weight: 600;
    color: var(--black);
  }

  .mapping-table td:last-child {
    color: var(--mid);
    line-height: 1.5;
  }

  .mapping-arrow {
    display: inline-block;
    color: var(--accent);
    font-weight: 400;
    margin: 0 4px;
  }

  /* ═══════ FOOTER ═══════ */
  .footer {
    padding: 48px 0;
    border-top: 1px solid var(--black);
    display: flex;
    justify-content: space-between;
    align-items: center;
  }

  .footer-left {
    font-size: 12px;
    font-weight: 600;
    letter-spacing: 1px;
    text-transform: uppercase;
    color: var(--light);
  }

  .footer-right {
    font-size: 12px;
    color: var(--light);
  }

  /* ═══════ RESPONSIVE ═══════ */
  @media (max-width: 768px) {
    .container { padding: 0 24px; }
    .hero { padding: 64px 0 48px; }
    .hero h1 { font-size: 48px; letter-spacing: -1.5px; }
    .hero-subtitle { font-size: 17px; }
    .section { padding: 48px 0; }
    .section-title { font-size: 32px; }
    .principles-grid { grid-template-columns: 1fr; }
    .principle:nth-child(even) { padding-left: 0; border-left: none; }
    .principle:nth-child(2) { border-top: 1px solid var(--border); }
    .phase { grid-template-columns: 1fr; gap: 16px; }
    .comparison { grid-template-columns: 1fr; }
    .comparison-col:first-child { border-right: 1px solid var(--border); border-bottom: none; }
    .ratchet-viz { flex-wrap: wrap; gap: 24px; }
    .ratchet-step { flex: none; width: calc(33% - 16px); }
    .rubric-stat-num { font-size: 48px; }
    .mapping-table td:first-child { white-space: normal; }
  }
</style>
</head>
<body>

<!-- ═══════════════════════════ HERO ═══════════════════════════ -->
<div class="container">
  <section class="hero">
    <div class="hero-label">自主技能优化系统</div>
    <h1>Auto Skill<br>Optimizer</h1>
    <p class="hero-subtitle">
      <strong>评估</strong> &rarr; <strong>改进</strong> &rarr; <strong>实测验证</strong> &rarr; <strong>人类确认</strong> &rarr; <strong>保留或回滚</strong>
    </p>
    <div class="hero-quote">
      <p>「autoresearch 的核心想法很简单：让系统自主运行实验，评估结果，只保留有效的改进。一个只能向前转的棘轮。」</p>
      <cite>Andrej Karpathy &mdash; 谈自主实验循环</cite>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 01 PRINCIPLES ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">01</div>
    <h2 class="section-title">核心原则</h2>
    <p class="section-lead">五条规则，防止优化器偏移方向、自我刷分或引入退化。</p>

    <div class="principles-grid">
      <div class="principle">
        <div class="principle-num">01</div>
        <h3>单一可编辑资产</h3>
        <p>每轮优化只针对一个 SKILL.md 文件。一次修改，一次测量，一次决策。不做跨文件编辑，避免归因模糊。</p>
      </div>
      <div class="principle">
        <div class="principle-num">02</div>
        <h3>双重评估</h3>
        <p>静态结构分析捕捉格式和完整性问题。实测执行捕捉行为退化。两者缺一不可。</p>
      </div>
      <div class="principle">
        <div class="principle-num">03</div>
        <h3>棘轮机制</h3>
        <p>提升总分的改进被 commit。降低分数的修改自动 revert。分数只能上升或持平，永远不会下降。</p>
      </div>
      <div class="principle">
        <div class="principle-num">04</div>
        <h3>独立评分</h3>
        <p>编辑 Skill 的 Agent 永远不为自己打分。由独立的子 Agent 评估输出质量，防止自我表扬偏差。</p>
      </div>
      <div class="principle principle--full">
        <div class="principle-num">05</div>
        <h3>人在回路</h3>
        <p>每个 Skill 的优化循环完成后，系统暂停。向人类展示 diff 摘要、分数变化和测试输出对比。没有明确确认，任何改动都不会生效。</p>
      </div>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 02 RUBRIC ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">02</div>
    <h2 class="section-title">8维度<br>评估体系</h2>
    <p class="section-lead">100分评估体系。结构维度捕捉你能看到的问题，效果维度捕捉只有运行时才能感知的问题。</p>

    <div class="rubric-header">
      <div class="rubric-stat">
        <div class="rubric-stat-num">60</div>
        <div class="rubric-stat-label">结构<br>分值</div>
      </div>
      <div class="rubric-stat">
        <div class="rubric-stat-num rubric-stat-num--accent">40</div>
        <div class="rubric-stat-label">效果<br>分值</div>
      </div>
    </div>

    <table class="rubric-table">
      <caption>结构维度 &mdash; 静态分析</caption>
      <thead>
        <tr>
          <th style="width:36px">#</th>
          <th style="width:180px">维度</th>
          <th style="width:60px">权重</th>
          <th>评分标准</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td class="dim-num">1</td>
          <td class="dim-name">Frontmatter质量</td>
          <td class="dim-weight">8</td>
          <td class="dim-desc">名称正确，描述包含功能/触发条件/使用场景，不超过1024字符</td>
        </tr>
        <tr>
          <td class="dim-num">2</td>
          <td class="dim-name">工作流清晰度</td>
          <td class="dim-weight">15</td>
          <td class="dim-desc">步骤有编号、可执行，每步都有明确的输入/输出</td>
        </tr>
        <tr>
          <td class="dim-num">3</td>
          <td class="dim-name">边界条件覆盖</td>
          <td class="dim-weight">10</td>
          <td class="dim-desc">错误处理、降级方案、常见故障恢复</td>
        </tr>
        <tr>
          <td class="dim-num">4</td>
          <td class="dim-name">检查点设计</td>
          <td class="dim-weight">7</td>
          <td class="dim-desc">关键决策前需用户确认，防止自主失控</td>
        </tr>
        <tr>
          <td class="dim-num">5</td>
          <td class="dim-name">指令具体性</td>
          <td class="dim-weight">15</td>
          <td class="dim-desc">无歧义，具体的参数/格式/示例，可直接执行</td>
        </tr>
        <tr>
          <td class="dim-num">6</td>
          <td class="dim-name">资源整合度</td>
          <td class="dim-weight">5</td>
          <td class="dim-desc">所有引用的脚本/资产路径存在且可访问</td>
        </tr>
      </tbody>
    </table>

    <table class="rubric-table">
      <caption>效果维度 &mdash; 需要实测</caption>
      <thead>
        <tr>
          <th style="width:36px">#</th>
          <th style="width:180px">维度</th>
          <th style="width:60px">权重</th>
          <th>评分标准</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td class="dim-num">7</td>
          <td class="dim-name">整体架构</td>
          <td class="dim-weight">15</td>
          <td class="dim-desc">层次清晰，无冗余或遗漏，符合生态系统约定</td>
        </tr>
        <tr>
          <td class="dim-num">8</td>
          <td class="dim-name">实测表现</td>
          <td class="dim-weight">25</td>
          <td class="dim-desc">运行2-3个测试提示词，对比启用 Skill 和 baseline 的输出质量</td>
        </tr>
      </tbody>
    </table>
  </section>
</div>

<!-- ═══════════════════════════ 03 PHASES ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">03</div>
    <h2 class="section-title">优化循环</h2>
    <p class="section-lead">从初始化到最终报告的五个阶段。系统在每个阶段内自主运行，但在阶段之间暂停等待人类审查。</p>

    <div class="phases">
      <div class="phase">
        <div class="phase-id">
          0
          <span>初始化</span>
        </div>
        <div class="phase-body">
          <h3>范围与分支设置</h3>
          <p>确定优化范围，创建版本控制基础设施，加载历史记录。</p>
          <ol class="phase-steps">
            <li>确认范围：全部 Skill 还是用户指定子集</li>
            <li>扫描 .claude/skills/*/SKILL.md 获取目标列表</li>
            <li>创建 git 分支：auto-optimize/YYYYMMDD-HHMM</li>
            <li>初始化或加载 results.tsv 用于历史追踪</li>
          </ol>
        </div>
      </div>

      <div class="phase">
        <div class="phase-id">
          0.5
          <span>设计</span>
        </div>
        <div class="phase-body">
          <h3>测试提示词工程</h3>
          <p>在任何评分之前，先设计用于衡量效果的测试提示词。没有好的测试，优化器就是盲飞。</p>
          <ol class="phase-steps">
            <li>阅读每个 SKILL.md，理解其声明的能力</li>
            <li>为每个 Skill 设计2-3个提示词：一个正常路径，一个模糊场景</li>
            <li>保存到每个 Skill 目录下的 test-prompts.json</li>
            <li>在继续之前，将所有测试提示词提交人类审批</li>
          </ol>
        </div>
      </div>

      <div class="phase">
        <div class="phase-id">
          1
          <span>基线</span>
        </div>
        <div class="phase-body">
          <h3>全维度评分</h3>
          <p>为每个 Skill 建立起始分数。结构评分由主 Agent 完成，效果评分由独立子 Agent 完成。</p>
          <ol class="phase-steps">
            <li>阅读 SKILL.md，为维度1-7评分并附理由</li>
            <li>启动子 Agent：分别在启用和未启用 Skill 的情况下运行测试提示词</li>
            <li>对比输出，为维度8评分（如子 Agent 不可用则标记 dry_run）</li>
            <li>计算加权总分，记录到 results.tsv</li>
            <li>展示评分卡，暂停等待人类确认</li>
          </ol>
        </div>
      </div>

      <div class="phase">
        <div class="phase-id">
          2
          <span>优化</span>
        </div>
        <div class="phase-body">
          <h3>Hill-Climbing 循环</h3>
          <p>按分数从低到高处理 Skill。每轮：诊断最弱维度，提出一个针对性修复，执行，重新评分，做出决定。</p>
          <ol class="phase-steps">
            <li>找出该 Skill 得分最低的维度</li>
            <li>生成一项具体改进（改什么，为什么改，预期分数变化）</li>
            <li>编辑 SKILL.md，用结构化消息 git commit</li>
            <li>重新评分：结构由主 Agent，效果由独立子 Agent</li>
            <li>新分 > 旧分：保留。否则：git revert，进入下一个 Skill</li>
            <li>每个 Skill 完成后：展示 diff + 分数变化，等待人类确认</li>
          </ol>
        </div>
      </div>

      <div class="phase">
        <div class="phase-id">
          3
          <span>报告</span>
        </div>
        <div class="phase-body">
          <h3>总结与指标</h3>
          <p>将所有结果汇总为最终优化报告，包含优化前后分数、实验次数和关键改进。</p>
          <ol class="phase-steps">
            <li>统计总实验次数、保留次数、回滚次数和测试模式</li>
            <li>生成每个 Skill 的优化前后分数对比表</li>
            <li>列出影响最大的改进及其对应维度</li>
            <li>归档 results.tsv 供未来 baseline 参考</li>
          </ol>
        </div>
      </div>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 04 RATCHET ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">04</div>
    <h2 class="section-title">棘轮机制</h2>
    <p class="section-lead">分数只能上升。每轮要么改进 Skill，要么干净地回滚。不会随时间积累局部退化。</p>

    <div class="ratchet-viz">
      <div class="ratchet-step">
        <div class="ratchet-score">72</div>
        <div style="height:144px" class="ratchet-bar"></div>
        <div class="ratchet-label ratchet-label--baseline">基线</div>
        <div class="ratchet-round">轮次 0</div>
        <div class="ratchet-arrow"></div>
      </div>
      <div class="ratchet-step">
        <div class="ratchet-score">78</div>
        <div style="height:156px" class="ratchet-bar"></div>
        <div class="ratchet-label ratchet-label--keep">保留</div>
        <div class="ratchet-round">轮次 1</div>
        <div class="ratchet-arrow"></div>
      </div>
      <div class="ratchet-step">
        <div class="ratchet-score ratchet-score--revert">75</div>
        <div style="height:150px" class="ratchet-bar ratchet-bar--revert"></div>
        <div class="ratchet-label ratchet-label--revert">回滚</div>
        <div class="ratchet-round">轮次 2</div>
        <div class="ratchet-arrow"></div>
      </div>
      <div class="ratchet-step">
        <div class="ratchet-score">84</div>
        <div style="height:168px" class="ratchet-bar"></div>
        <div class="ratchet-label ratchet-label--keep">Keep</div>
        <div class="ratchet-round">轮次 3</div>
        <div class="ratchet-arrow"></div>
      </div>
      <div class="ratchet-step">
        <div class="ratchet-score">87</div>
        <div style="height:174px" class="ratchet-bar"></div>
        <div class="ratchet-label ratchet-label--keep">Keep</div>
        <div class="ratchet-round">轮次 4</div>
      </div>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 05 COMPARISON ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">05</div>
    <h2 class="section-title">为什么需要<br>双重评估</h2>
    <p class="section-lead">单看结构无法判断 Skill 是否真正好用。单看效果无法判断它为何失败。</p>

    <div class="comparison">
      <div class="comparison-col">
        <div class="comparison-tag">传统方法</div>
        <h3>纯结构审查</h3>
        <ul class="comparison-list">
          <li>检查 frontmatter 是否存在且格式正确</li>
          <li>验证步骤是否有编号和描述</li>
          <li>确认文件路径和引用是否有效</li>
          <li>无法检测 Skill 是否<strong>真正提升了</strong>输出质量</li>
          <li>无法检测<strong>看似正确</strong>实则产生差结果的误导性指令</li>
          <li>无法检测<strong>弊大于利</strong>的过度约束</li>
        </ul>
      </div>
      <div class="comparison-col comparison-col--highlight">
        <div class="comparison-tag">Auto Skill Optimizer</div>
        <h3>双重评估</h3>
        <ul class="comparison-list">
          <li><strong>结构评分</strong>捕捉格式、完整性和可读性问题</li>
          <li><strong>实测执行</strong>揭示真实场景下的行为影响</li>
          <li><strong>基线对比</strong>衡量 Skill 是增值还是减值</li>
          <li><strong>独立子 Agent</strong>防止自我表扬的评分偏差</li>
          <li><strong>测试提示词设计</strong>确保评估针对真实用户场景</li>
          <li><strong>Dry-run 降级</strong>在实测不可用时提供覆盖</li>
        </ul>
      </div>
    </div>
  </section>
</div>

<!-- ═══════════════════════════ 06 MAPPING ═══════════════════════════ -->
<div class="container">
  <section class="section">
    <div class="section-num">06</div>
    <h2 class="section-title">概念映射</h2>
    <p class="section-lead">autoresearch 的核心抽象如何转化为 Skill 优化。同一台机器，不同的领域。</p>

    <table class="mapping-table">
      <thead>
        <tr>
          <th style="width:220px">Autoresearch</th>
          <th style="width:220px">Skill Optimizer</th>
          <th>实现细节</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>研究论文草稿</td>
          <td>SKILL.md 文件</td>
          <td>唯一的可编辑产物。所有改进都表现为对这一个文件的编辑。</td>
        </tr>
        <tr>
          <td>评估指标</td>
          <td>8维度评估体系</td>
          <td>跨结构（60分）和效果（40分）的加权评分，总计100分。</td>
        </tr>
        <tr>
          <td>实验循环</td>
          <td>阶段2 hill-climbing</td>
          <td>诊断最弱维度，提出修复，执行，重新评分，保留或回滚。每个 Skill 最多3轮。</td>
        </tr>
        <tr>
          <td>版本控制</td>
          <td>Git 分支 + revert</td>
          <td>每次编辑都是一次 commit。退化通过 revert（新 commit）回滚。完整审计记录。</td>
        </tr>
        <tr>
          <td>自动化评估</td>
          <td>子 Agent 测试执行</td>
          <td>独立 Agent 分别在启用和未启用 Skill 的情况下运行测试提示词，对比输出质量。</td>
        </tr>
        <tr>
          <td>人类审查关卡</td>
          <td>阶段转换暂停</td>
          <td>系统在基线评分后和每个 Skill 优化后暂停。展示 diff + 分数变化。</td>
        </tr>
        <tr>
          <td>探索 vs 利用</td>
          <td>阶段2.5探索性重写</td>
          <td>当 hill-climbing 停滞（连续2次在第1轮就中断），提出完整的结构重写。</td>
        </tr>
        <tr>
          <td>实验日志</td>
          <td>results.tsv</td>
          <td>带时间戳的记录：commit 哈希、Skill 名称、新旧分数、保留/回滚状态、评估模式。</td>
        </tr>
      </tbody>
    </table>
  </section>
</div>

<!-- ═══════════════════════════ FOOTER ═══════════════════════════ -->
<div class="container">
  <footer class="footer">
    <div class="footer-left">Auto Skill Optimizer</div>
    <div class="footer-right">灵感源自 Karpathy autoresearch &mdash; 为 Claude Code Skill 生态而建</div>
  </footer>
</div>

</body>
</html>

path: test-prompts.json
content: id: 1
prompt: 优化multi-agent-cn技能包，目标是90分以上
expected: 输出完整优化过程：评估、改进、验证、结果

id: 2
prompt: 批量优化5个技能包并生成报告
expected: 展示每个技能的优化结果和最终评分

Security scan verdicts — ClawScan: clean | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (MEDIUM)