refactor: sync 6 project skills to atomstorm upstream via symlinks

Replace local skill directories with symlinks pointing to
atomstorm-claude-skills upstream (b83c4d9):
write-article, paper-illustration, my-world, dao-analysis,
import-draft, multi-review

Also removes stale multi-review and paper-illustration variants.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
lizikk 2026-03-29 22:33:17 +08:00
parent e12c995c3a
commit 376bf52ccd
27 changed files with 6 additions and 3859 deletions

1
.claude/skills/dao-analysis Symbolic link
View File

@ -0,0 +1 @@
/home/kang/apps/atomstorm-claude-skills/dao-analysis

View File

@ -1,129 +0,0 @@
---
name: dao-analysis
description: >
Structured 8-layer analysis using Dao-Method-Technique-Tool (道-法-术-器) framework.
Output: a structured insight document with 8 orthogonal layers from Why to Do,
with measurable metrics and iteration rules.
USE WHEN: User wants to deeply analyze existing content (article, transcript,
concept, experience, system prompt, workflow) to extract layered insights.
Trigger phrases: 道法术器分析、深度分析、拆解、8层框架、extract insights、
analyze this、break this down、这篇文章为什么火。
DON'T USE WHEN:
- User wants to CREATE new content from a topic → use write-article instead.
- User wants to REVIEW/CRITIQUE a draft for publishing quality → use multi-review instead.
- User wants to IMPORT an external file into vault → use import-draft instead.
- User says "写文章"、"生成草稿" → not this skill (creation ≠ analysis).
---
# 道-法-术-器 结构化分析技能
## 定位
将任意信息/素材/经验转化为 8 层结构化洞察体系,从"为何"到"怎么做"到"怎么迭代",每一层正交、可证伪、可追溯。
## 路由规则Use when / Don't use when
Use this skill when:
- 用户提供一段信息(文章、转写、笔记、经验、概念)并要求深度分析
- 用户明确要求"道法术器分析"或"8 层框架分析"
- 用户需要从素材中提炼可执行的经验体系
- 用户说"分析"、"拆解"、"为什么火"、"extract insights"
Do NOT use this skill when:
- 用户想**写新文章**(从选题到草稿) → use `write-article`
- 用户想**审查/批评**已有草稿的发布质量 → use `multi-review` or `/review`
- 用户想**导入**外部文件到 vault → use `import-draft`
- 用户想**加载 vault 上下文** → use `my-world`
- 用户说"写文章"、"生成草稿"、"create a draft" → not this skill
Edge cases:
- "分析一下这篇文章为什么火" → **this skill**(分析 = dao-analysis
- "帮我把这篇文章改写成新文章" → **not this skill**(改写创作 = write-article
- "审查我的草稿质量" → **not this skill**(审查 = multi-review
- "拆解这个 system prompt 的设计思路" → **this skill**(拆解 = analysis
## 输入
用户提供以下信息(支持多种形式):
| 字段 | 必选 | 说明 |
|------|------|------|
| 信息 | 是 | 原文/要点/转写/URL如提供 URL先用 `url-to-markdown` 采集) |
| 使用场景 | 否 | 分析偏向哪个领域(管理/技术/关系/学习等) |
| 偏好语汇 | 否 | `修行`(道家隐喻)或 `中性工程化`(默认) |
| 输出范围 | 否 | `full`(全 8 层,默认)或 `quick`(仅 L0-L4 精简版) |
## 工作流
### Step 1: 读取素材
- 若用户提供 vault 内笔记路径,使用 Obsidian CLI 读取
- 若用户提供 URL提示可用 `url-to-markdown` 技能先采集
- 若用户直接粘贴文本,直接使用
### Step 2: 证据提取E# 表)
在任何分析之前,先提取 6-15 条证据,每条标注:
- 编号 E#
- 原句/要点(短摘)
- 类型:事实 / 观点 / 比喻 / 推测
- 可信度:高 / 中 / 低(一句话理由)
> 这是整个分析的地基。后续每个层级的每条结论都必须回溯到 E#。
### Step 3: 逐层分析L0 -> L7
严格按顺序执行,不可跳层。每层的判别问题、输出模板、条数要求详见 `references/framework.md`
**层级速览**
```
L0 无极 ─ 信息边界与缺口(不立论,只定范围)
L1 太极 ─ 第一性矛盾(核心张力 A <-> B
L2 道 ─ Why目的/价值/取舍D# 命题)
L3 法 ─ What世界模型/因果假设M# 命题)
L4 术 ─ How原则/策略/决策规则P# 启发式)
L5 器 ─ Do动作/工具/话术/流程T# 工具包)
L6 指标 ─ 加速度/速度/位移观测链
L7 迭代 ─ 复盘模板 + 更新规则 + 7天实验
```
**正交规则**:每层只回答自己的判别问题。若一条内容同时回答两个层的问题,必须拆分为两条分别归层。
**映射规则**每个低层产物必须标注来自哪些高层结论ID 引用链)。
```
E# (证据) -> D# (道) -> M# (法) -> P# (术) -> T# (器)
-> 指标
-> 迭代规则
```
### Step 4: 收束总纲
用一句话输出:**"在 X 情境,优先 Y 而非 Z"**,标注对应 D#、M#、P#。
### Step 5: 输出格式化
- 使用 Markdown 格式,每层用 `## L{n}` 二级标题
- 编号系统贯穿全文E#、D#、M#、P#、T#
- quick 模式:只输出 L0-L4省略 L5-L7
## 质量门禁
| 检查项 | 要求 |
|--------|------|
| 证据覆盖 | 每个 D#/M#/P# 至少引用 1 个 E# |
| 正交归层 | 无跨层混写(一段只回答一个层的问题) |
| 可证伪性 | 每个 M# 有明确的"若出现__则不成立"信号 |
| 映射完整 | P# 标注来源 D#+M#T# 标注来源 P# |
| 取舍明确 | 每个 D# 有"宁可__也要__"结构 |
| 指标可测 | L6 每个指标有记录方式、周期、阈值 |
任一检查项未通过,回退修正后再输出。
## 参考资料
完整的 8 层框架规范(每层的判别问题、输出模板、条数要求、注意事项):
- `references/framework.md` — 在执行 Step 3 时加载此文件获取详细规范

View File

@ -1,134 +0,0 @@
# 道-法-术-器 八层分析框架 — 完整规范
> 源自:`00-inbox/2026-03-02-dao-method-technique-tool-framework.md`
---
## 总规则
- **披露顺序不可跳层**L0 -> L1 -> L2 -> L3 -> L4 -> L5 -> L6 -> L7
- **归层判别**:一条内容若同时回答两个层的问题,必须拆分为两条分别归层
- **每条洞察要可落地可证伪**:必须有证据、前提、边界、可观测信号
- **层间映射**每个低层产物必须标注来自哪些高层结论ID 引用)
---
## 证据层(贯穿全程:先给 E# 再推导)
在进入 L1 之前,先输出"证据表 E#6-15 条)"
| 字段 | 说明 |
|------|------|
| E# | 编号 |
| 原句/要点 | 短摘 |
| 类型 | 事实 / 观点 / 比喻 / 推测 |
| 可信度 | 高 / 中 / 低(一句话理由) |
---
## L0 无极:信息边界与缺口
> 不立论,只定范围。
输出:
1. **主题范围**一句话(覆盖什么、不覆盖什么)
2. **缺口清单**:若要推到"可执行经验",还缺哪些信息(<=3 条追问)
3. **风险提示**:这份信息可能有哪些偏见/立场/样本局限(<=3 条)
---
## L1 太极:第一性矛盾(统一场)
> 回答:**"这份信息在解决哪一个核心矛盾/张力?"**
输出:
- **核心矛盾**A <-> B用对立结构表达
- **目标方向**:倾向 A 还是倾向 B为什么引用证据编号
---
## L2 一(道 / Why目的、价值、取舍
> 判别问题:**"什么值得?为了什么?宁可失去什么也要守住什么?"**
输出 2-5 条,每条模板:
- **道-命题 D#**(一句话)
- **取舍结构**宁可__也要__ / 优先__而非__
- **证据引用**E#...
注意:这一层只谈"价值与目的",不谈方法。
---
## L3 二(法 / What世界模型、因果假设
> 判别问题:**"世界/人性/组织/关系是如何运作的?因果链是什么?"**
输出 3-7 条,每条:
- **模型/因果命题 M#**(一句话)
- **关键变量**X、Y、Z
- **因果方向**X -> Y在条件 C 下)
- **证据引用**E#...
- **可证伪信号**若出现__则此模型可能不成立
注意:这一层只解释"是什么/为什么会这样",不直接给行动步骤。
---
## L4 四(术 / How原则、策略、决策规则
> 判别问题:**"在什么条件下,应当如何选择?"**
输出 5-12 条,每条:
- **原则/启发式 P#**(规则句:如果...就...;优先...而非...
- **前提**:成立需要什么
- **边界**:不适用/会反噬的情况
- **映射**:来自 D# + M#(必须标注)
- **证据引用**E#...
注意:这一层给"决策规则",不写工具模板细节。
---
## L5 八(器 / Do动作、工具、话术、流程
> 判别问题:**"我现在就能照着做吗?能否变成清单/步骤/模板?"**
输出 3-7 个"工具包 T#",每个包含:
- **触发场景**
- **目标**
- **步骤**1-2-3...
- **话术/模板**(如适用)
- **常见误用 -> 纠偏**
- **映射**:来自 P#(必须标注)
---
## L6 加速度-速度-位移:指标与反馈
按"加速度/速度/位移"给指标,形成由高到低的观测链:
- **加速度指标 A**驱动变化的变化2 个
- 例:学习/沟通/决策质量的提升率、冲突升级率变化
- **速度指标 V**行为频率与强度2 个
- 例:每周复盘次数、关键对话发起次数
- **位移指标 S**结果与状态2 个
- 例:关系质量评分、项目结果、睡眠/情绪稳定度
每个指标必须写清:如何记录、周期、阈值、对应哪个工具包 T#。
---
## L7 生生不息:迭代律
输出:
1. **复盘模板**<=5 问)
2. **更新规则**(条件句):
- 若出现__信号/指标)-> 保留/增强/删除/改边界(指向 P# / T#
3. **7 天最小实验**:做什么、记录什么、如何判定有效
---
## 最终收束
用一句话输出总纲:**"在 X 情境,优先 Y 而非 Z"**,并标注它对应的 D#、M#、P#。

1
.claude/skills/import-draft Symbolic link
View File

@ -0,0 +1 @@
/home/kang/apps/atomstorm-claude-skills/import-draft

View File

@ -1,183 +0,0 @@
---
name: import-draft
description: "Import external drafts into content-forge vault for publishing workflow. Use when the user has an existing draft file from another project or external location and wants to bring it into the content-forge production pipeline. Trigger words: import draft, 迁移草稿, 入库, 导入文章, bring into vault, move to drafts."
---
# Import Draft
Import external draft files into content-forge vault's `02-drafts/` directory, preparing them for the standard publishing workflow (format → assets → review → publish).
## When to Use
Use this skill when:
- User has a draft written outside the vault (another project, external file, etc.)
- User says "import this draft", "migrate this article", "bring into vault"
- Draft needs to go through content-forge publishing pipeline
- Draft may need modifications (image paths, frontmatter, etc.)
Do NOT use this skill when:
- Draft already exists in `02-drafts/` → use edit commands instead
- User wants to create new content from topic → use `write-article` skill instead
## Workflow
### Step 1: Read External Draft
Read the external draft file using the Read tool.
```
Read the file at <external_path>
```
Execution requirements:
- Read the complete file content
- Note the file location and any embedded resources (images, etc.)
### Step 2: Quality Check
Analyze the draft and list issues that need fixing before import.
Check for:
- **Image references**: Are paths correct? Do images exist?
- **Frontmatter**: Does it exist? Is it complete?
- **Structure**: Is the markdown well-formed?
- **Content issues**: Dead links, missing sections, formatting problems
Output format:
```markdown
## 草稿检查报告
### 文件信息
- 路径: <original_path>
- 行数: <N>
- 大小: <X>KB
### 🔴 必须修改(入库前)
| # | 问题 | 当前 | 建议 |
|---|------|------|------|
| 1 | ... | ... | ... |
### 🟡 建议修改(可选)
| # | 问题 | 建议 |
|---|------|------|
| 1 | ... | ... |
### ✅ 无问题项
- ...
```
### Step 3: Wait for User Confirmation
**CRITICAL**: Do NOT proceed to write without user confirmation.
Ask the user:
1. Which issues to fix
2. Whether to fix now or import as-is
3. Confirmation before any vault write
Output:
```
请确认:
1. 需要修改哪些问题?
2. 现在修改还是先入库再改?
3. 确认后我将写入 vault
```
### Step 4: Prepare Frontmatter
Generate standard frontmatter based on content-forge specification.
Required fields (see `references/frontmatter-spec.md`):
- `id`, `title`, `slug`, `status`, `content_type`, `channels`
- `language`, `source_urls`, `assets`, `cover_image`, `template`
- `owner`, `created_at`, `updated_at`
Slug generation:
- Extract from filename if possible
- Or generate from title (lowercase, hyphens, no special chars)
- Format: `YYYY-MM-DD-<slug>.md`
### Step 5: Write to Vault
Write the draft to `02-drafts/` directory.
```bash
# First cd to vault directory
cd /home/kang/apps/content-forge/content-forge
# Create the draft file
obsidian create path="02-drafts/<YYYY-MM-DD>-<slug>.md" content="<DRAFT_WITH_FRONTMATTER>"
```
Execution requirements:
- Must cd to vault directory first (obsidian CLI bug workaround)
- File must go to `02-drafts/` directory
- Filename must have date prefix
### Step 6: Set Frontmatter Properties
Set each frontmatter field using obsidian property:set.
```bash
# Required fields
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="id" value="<YYYY-MM-DD>-<slug>"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="title" value="<title>"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="slug" value="<slug>"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="status" value="draft"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="content_type" value="article"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="channels" value='["wechat","x"]' type=list
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="language" value="zh-CN"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="source_urls" value='[]' type=list
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="assets" value='[]' type=list
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="cover_image" value=""
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="template" value="article"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="owner" value="content-forge"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="created_at" value="<YYYY-MM-DD>T00:00:00+08:00"
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="updated_at" value="<YYYY-MM-DD>T00:00:00+08:00"
```
### Step 7: Migrate Assets (Optional)
If the draft has images, offer to migrate them to `05-assets/<slug>/`.
```bash
# Create assets directory
mkdir -p /home/kang/apps/content-forge/content-forge/05-assets/<slug>/
# Copy images
cp <external_image_paths> /home/kang/apps/content-forge/content-forge/05-assets/<slug>/
# Update draft's assets field
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="assets" value='["05-assets/<slug>/cover.png"]' type=list
```
## Output Constraints
- Always wait for user confirmation before writing to vault
- List all issues before asking for confirmation
- Generate complete frontmatter, don't skip required fields
- Report success/failure clearly after write
## Quality Checklist
Before marking complete, verify:
- [ ] External draft fully read
- [ ] Quality issues listed and categorized
- [ ] User confirmed which issues to fix
- [ ] Frontmatter generated per spec
- [ ] Draft written to `02-drafts/`
- [ ] All frontmatter fields set correctly
- [ ] Assets migrated (if applicable)
- [ ] Final verification: `obsidian read path="02-drafts/<file>"` succeeds
## Failure Handling
- File not found: Return `[✗] 文件不存在: <path>`
- Vault not accessible: Return `[✗] Vault 不可用,请运行 obsidian vault 检查`
- Write failed: Return `[✗] 写入失败: <error>` and do not proceed
- User denies confirmation: Stop and wait for further instructions
## References
- `references/frontmatter-spec.md` — Complete frontmatter specification

View File

@ -1,125 +0,0 @@
# Frontmatter Specification
## Required Fields
All drafts in `01-topics/`, `02-drafts/`, `03-review/`, `04-published/` must contain these fields:
```yaml
---
id: "YYYY-MM-DD-slug" # Unique identifier, matches filename
title: "文章标题" # Display title
slug: "article-slug" # URL-friendly identifier
status: "draft" # inbox | topic | draft | formatting | review | polish | publishing | published | revision | blocked | archived
content_type: "article" # article | thread | x-post | wechat-post | infographic
channels: ["wechat", "x"] # Target publish channels
language: "zh-CN" # Language code
source_urls: [] # Original source URLs if any
assets: [] # Vault-relative paths to images/files
cover_image: "" # Path to cover image
template: "article" # Template used
owner: "content-forge" # Content owner
created_at: "YYYY-MM-DDT00:00:00+08:00" # ISO 8601 timestamp
updated_at: "YYYY-MM-DDT00:00:00+08:00" # ISO 8601 timestamp
published_at: null # Set when published
---
```
## Optional Fields
```yaml
# Cycle tracking
cycle_days: null # Days from creation to publish
stage_days: # Days spent in each stage
inbox: 0
topic: 0
draft: 0
review: 0
total: 0
# Promotion fields (for /promote command)
promotion_status: null # null | planned | promoting | converted | paused
promotion_channels: [] # ["newsletter", "webinar", "x-thread", "linkedin"]
holding_patterns: [] # ["email-list", "youtube", "podcast"]
conversion_type: null # null | "lead-magnet" | "webinar" | "product-sale"
repurposed_from: null # slug of original content
repurposed_to: [] # slugs of derivative content
evergreen: false # Can be re-promoted?
# Write-article skill extensions
style: "tech_blog" # tech_blog | opinion | tutorial | social_short
audience: "developers" # Target audience
tags: [] # Content tags
source_notes: [] # Obsidian note paths used as source
# Review & Polish (managed by /review command)
review_status: null # null | pending | in_progress | passed | failed
review_issues: [] # [{id, category, severity, description, status}]
# category: structure | factual | style | format
# severity: critical | high | medium | low
review_passed_at: null # ISO 8601 timestamp when review passed
polish_status: null # null | pending | skipped | done
polish_version: 0 # Incremented on each polish iteration
polished_at: null # ISO 8601 timestamp when polish completed
revision_count: 0 # Number of revision cycles (max 3)
revision_history: [] # [{date, issues_fixed: [], notes}]
```
## Status Workflow
```
inbox → topic → draft → formatting → review → polish → publishing → published
↓ ↓ ↓
revision ←───────── blocked
archived
```
### Review → Polish Flow
```
┌─────────────┐
│ review │
└──────┬──────┘
┌────────────┼────────────┐
▼ ▼ ▼
┌──────────┐ ┌──────────┐ ┌──────────┐
│ passed │ │ failed │ │ revision │
└────┬─────┘ └────┬─────┘ └────┬─────┘
│ │ │
▼ ▼ │
┌──────────┐ ┌──────────┐ │
│ polish │ │ blocked │◄┘
└────┬─────┘ └──────────┘
│ ▲
▼ │ (revision_count > 3)
┌──────────┐ │
│publishing│───────────┘
└──────────┘
```
### Revision Rules
- **Trigger**: Critical ≥ 1 OR High > 1
- **Limit**: revision_count ≤ 3 per article
- **Overflow**: auto → blocked for human decision
## Field Constraints
- `id` and `slug` must be unique across all stages
- `status` can only progress forward (with exceptions for revision/blocked)
- `assets` must use vault-relative paths (e.g., `05-assets/slug/image.png`)
- `channels` determines which publish skills to use
- `created_at` never changes after initial creation
- `updated_at` changes on every modification
## Naming Convention
Files: `YYYY-MM-DD-<slug>.md`
- Date: creation or import date
- Slug: lowercase, hyphens only, no special chars
- Example: `2026-03-03-claude-code-auto-memory-deep-dive.md`
Assets: `05-assets/<slug>/filename.ext`
- Assets live in a directory named after the slug
- Example: `05-assets/claude-code-auto-memory/cover.png`

1
.claude/skills/multi-review Symbolic link
View File

@ -0,0 +1 @@
/home/kang/apps/atomstorm-claude-skills/multi-review

View File

@ -1,218 +0,0 @@
---
name: multi-review
description: >
Use MCO (Multi-CLI Orchestrator) to run parallel content review across multiple AI agents.
Output: structured findings report with severity, consensus/divergence, and actionable fixes.
USE WHEN: User wants to review/critique an existing draft or topic for quality,
accuracy, or readability using multiple AI perspectives.
Trigger phrases: 审查、review、critique、多角度审查、cross-check、质量检查。
DON'T USE WHEN:
- User wants to CREATE new content from a topic → use write-article instead.
- User wants to deeply ANALYZE content structure (dao framework) → use dao-analysis instead.
- User wants to IMPORT an external file → use import-draft instead.
- User wants to see vault status → use my-world instead.
- User says "写文章"、"生成草稿"、"分析为什么火" → not this skill.
---
# multi-review — Multi-Agent Content Review
Use MCO (Multi-CLI Orchestrator) to run parallel content review across multiple AI agents, combining perspectives for comprehensive feedback.
## 路由规则Use when / Don't use when
Use this skill when:
- Reviewing drafts before publication (`03-review/` stage)
- Evaluating topic quality and angles (`01-topics/` stage)
- Cross-checking technical accuracy in tech blogs
- Getting diverse feedback on content structure
- 用户说"审查我的草稿"、"review this"、"帮我检查质量"
Do NOT use this skill when:
- 用户想**写新文章**(从选题到草稿) → use `write-article`
- 用户想**深度分析**内容(道法术器框架) → use `dao-analysis`
- 用户想**导入**外部文件到 vault → use `import-draft`
- 用户想**加载 vault 上下文** → use `my-world`
Edge cases:
- "审查我的草稿" → **this skill**(审查 = multi-review
- "分析这篇文章为什么火" → **not this skill**(深度分析 = dao-analysis
- "帮我把草稿改好" → **this skill**(改好需要先审查发现问题)
- "写一篇新文章" → **not this skill**(创作 = write-article
## Prerequisites
```bash
mco doctor
# Should show at least 2 providers READY
```
## Workflow
### Step 1: Identify Target Content
```bash
cd /home/kang/apps/content-forge/content-forge
obsidian files folder="02-drafts"
obsidian files folder="03-review"
```
### Step 2: Read Content to Review
```bash
obsidian read path="<file-path>"
```
### Step 3: Run Multi-Agent Review
Use MCO to get feedback from multiple agents:
```bash
mco review --repo /home/kang/apps/content-forge \
--prompt "Review the content in <file-path> for:
1. Clarity and readability
2. Technical accuracy
3. Structure and flow
4. Missing information or gaps
5. Suggestions for improvement
Provide specific, actionable feedback." \
--providers claude,codex \
--target-paths content-forge/<file-path> \
--synthesize \
--format report
```
### Step 4: Synthesize Results
When `--synthesize` is enabled, MCO will:
1. Collect findings from all agents
2. Deduplicate similar issues
3. Track which agent found what (`detected_by`)
4. Generate a consensus/divergence summary
### Step 5: Apply Feedback
Review the synthesized output and decide which suggestions to incorporate. Update the content manually (Golden Rule: Agents Read, Humans Write).
## Claude Provider Configuration
MCO-Plus supports custom configuration for the Claude provider via `--provider-permissions-json`:
### Switch cc Environment
Use a different cc-managed API endpoint:
```bash
mco run --prompt "..." --providers claude \
--provider-permissions-json '{"claude":{"cc_env":"bigmodel"}}'
```
Available cc environments (check with `cc ls`):
- `88` — 88code.org
- `bigmodel` — 智谱 BigModel
- `cclaude` — cclaude.codes
- `relay` — relay.nf.video
- `vibe` — vibe.codesuc.top
### Switch Model
Specify Claude model:
```bash
mco run --prompt "..." --providers claude \
--provider-permissions-json '{"claude":{"model":"opus"}}'
```
Model options: `opus`, `sonnet`, `haiku`, or full model name (e.g., `claude-sonnet-4-6`)
### Combined Usage
```bash
mco review --repo /home/kang/apps/content-forge \
--prompt "Review this content" \
--providers claude,codex \
--provider-permissions-json '{"claude":{"cc_env":"bigmodel","model":"sonnet"}}' \
--target-paths content-forge/02-drafts/<file>.md \
--synthesize
```
## Output Format
MCO returns structured findings:
```
=== Multi-Agent Review ===
Task: Review <file-path>
Providers: claude, codex
## Findings (deduplicated)
### Issue 1: [description]
- Severity: High/Medium/Low
- Detected by: claude, codex
- Location: [specific section]
- Suggestion: [actionable fix]
### Issue 2: [description]
...
## Consensus
- Points all agents agreed on
## Divergence
- Points where agents disagreed
## Summary
- Total issues: X
- Critical: Y
- Suggestions: Z
```
## Integration with Content Pipeline
| Stage | MCO Use Case |
|-------|--------------|
| `01-topics` | Evaluate topic quality, identify gaps |
| `02-drafts` | Pre-review feedback before human review |
| `03-review` | Parallel expert review |
| `04-published` | Post-mortem analysis for improvement |
## Example Prompts
### Draft Review
```
Review this draft for clarity, accuracy, and engagement.
Focus on: technical correctness, logical flow, reader value.
```
### Topic Evaluation
```
Evaluate this topic idea for:
1. Reader interest potential
2. Uniqueness vs existing content
3. Suggested angles to explore
```
### Technical Accuracy Check
```
Verify all technical claims in this content.
Flag any inaccuracies or outdated information.
Suggest corrections with sources.
```
## Configuration
Default providers: `claude,codex` (both ready on this system)
To add more providers:
- `gemini` — requires Gemini CLI installed
- `opencode` — requires OpenCode installed
- `qwen` — requires Qwen Code installed
## Reference
- MCO-Plus Fork: https://github.com/CSZHK/mco-plus
- Original MCO: https://github.com/mco-org/mco
- cc Skill: `~/.claude/skills/cc/` (Claude Multi-Environment Manager)

1
.claude/skills/my-world Symbolic link
View File

@ -0,0 +1 @@
/home/kang/apps/atomstorm-claude-skills/my-world

View File

@ -1,132 +0,0 @@
---
name: my-world
description: >
One-shot context loader for the content-forge Obsidian vault. Loads projects,
topics, drafts, knowledge graph, and current priorities into context.
USE WHEN: User wants to see what's in the vault, check pipeline status,
or start a session with full context awareness. Trigger phrases: 加载上下文、
vault 状态、我的世界、what's in my vault、load context、show pipeline。
DON'T USE WHEN:
- User wants to CREATE new content → use write-article instead.
- User wants to ANALYZE existing content deeply → use dao-analysis instead.
- User wants to REVIEW a draft → use multi-review instead.
- User wants to IMPORT an external file → use import-draft instead.
- User says "写文章"、"分析"、"审查" → not this skill (read-only context loading only).
---
# /my-world — Load My World
Load the entire content-forge vault context into the current session in one shot.
## 路由规则Use when / Don't use when
Use this skill when:
- Session 开始时需要加载 vault 全量上下文
- 需要查看当前 pipeline 状态(哪些选题/草稿/审核中)
- 需要了解知识图谱状态orphans, dead ends, unresolved links
- 用户说"加载上下文"、"vault 状态"、"我有什么在做"
Do NOT use this skill when:
- 用户想**写新文章** → use `write-article`
- 用户想**分析/拆解**内容 → use `dao-analysis`
- 用户想**审查**草稿质量 → use `multi-review`
- 用户想**导入**外部文件 → use `import-draft`
Edge cases:
- "帮我看看 vault 里有什么" → **this skill**(查看 = context loading
- "写一篇关于 XX 的文章" → **not this skill**(创作 = write-article
- "分析一下我的草稿" → **not this skill**(分析 = dao-analysis 或 multi-review
## What It Does
1. Read vault stats (file count, tags, recent activity)
2. Scan all active content (topics, drafts, in-review)
3. Map the knowledge graph (backlinks, wikilinks, orphans)
4. Surface current priorities and blockers
5. Present a concise world-view summary
## Important: Vault Directory
All `obsidian` CLI commands must run from within the vault directory to auto-detect the vault:
```bash
cd /home/kang/apps/content-forge/content-forge
```
Run all subsequent commands after this `cd`. The `vault=` parameter is unreliable; directory-based detection is the correct approach.
## Execution Steps
### Step 1: Vault Health
```bash
cd /home/kang/apps/content-forge/content-forge
obsidian vault
obsidian files total
obsidian tags counts sort=count
```
### Step 2: Active Content Pipeline
Scan each pipeline stage for active items:
```bash
obsidian files folder="00-inbox"
obsidian files folder="01-topics"
obsidian files folder="02-drafts"
obsidian files folder="03-review"
obsidian files folder="04-published"
```
For each file found, read its frontmatter to extract `title`, `status`, `content_type`, `channels`:
```bash
obsidian properties path="<file-path>"
```
### Step 3: Knowledge Graph
```bash
obsidian orphans
obsidian deadends
obsidian unresolved
```
### Step 4: Recent Activity
```bash
obsidian recents
```
### Step 5: Summarize
Present a concise summary in this format:
```
=== My World ===
Vault: content-forge (X files, Y tags)
Pipeline:
inbox: N items
topics: N items (list titles)
drafts: N items (list titles + status)
review: N items (list titles)
published: N items total
Knowledge Graph:
Orphans: N (notes with no incoming links)
Dead ends: N (notes with no outgoing links)
Unresolved: N (broken [[wikilinks]])
Recent: (last 5 files touched)
Priorities:
- (inferred from draft/review status and recency)
```
## Output
A structured world-view that gives full context for the session. No files are written — this is read-only.

View File

@ -0,0 +1 @@
/home/kang/apps/atomstorm-claude-skills/paper-illustration

View File

@ -1,128 +0,0 @@
# paper-illustration Skill Architecture
## File Budget
```
.claude/skills/paper-illustration/
├── SKILL.md ~280 行 ~1,800 字 接口层(工作流 + 约束)
├── ARCHITECTURE.md ~120 行 ~800 字 架构总览(本文件)
└── references/
├── illustration-taxonomy.md ~210 行 ~1,400 字 6 种图表类型分类 + prompt 模板
├── academic-styles.md ~185 行 ~1,200 字 5 种会议风格规范
└── critic-checklist.md ~130 行 ~800 字 5 维度 20 项质量检查
─────────────────
~925 行 ~6,000 字 总上下文消耗
```
## Progressive Disclosure Architecture
```
Agent 加载顺序(上下文消耗)
─────────────────────────────────────────────────────────────
第 1 层SKILL.md必加载~1,800 字)
┌──────────────────────────────────────────────────────────┐
│ frontmatter 触发匹配 + 路由规则 │
│ 输入要求 2 必填 + 8 可选 │
│ 决策树 figure_type 自动检测 │
│ 路由表 figure_type → backend 映射 │
│ 6 步工作流 摘要+指针,不含详细规则 │
│ 8 条 NEVER 零容忍规则 │
│ 失败处理 6 种失败模式 │
└──────────────┬───────────────────────────────────────────┘
│ 按需加载(只在对应 Step 触发时读取)
第 2 层references/(按需,~3,400 字)
┌────────────────────────┐ ┌───────────────────┐ ┌──────────────────┐
│ illustration-taxonomy │ │ academic-styles │ │ critic-checklist │
│ │ │ │ │ │
│ Step 1 → §1-§6 分类 │ │ Step 3 → 风格参数 │ │ Step 5 → 评估 │
│ Step 1 → §7 自动检测 │ │ Step 4 → 色值/字号 │ │ │
│ Step 4 → §8 prompt 模板│ │ │ │ │
└────────────────────────┘ └───────────────────┘ └──────────────────┘
第 3 层:外部依赖(运行时)
┌──────────────────────────────────────────────────────────┐
│ basic-image-gen skill AI 图像生成 │
│ matplotlib/seaborn 代码生成(用户本地 Python
│ obsidian CLI vault 资产管理 │
└──────────────────────────────────────────────────────────┘
```
## 6-Step Workflow x File Dependency Matrix
```
Step 名称 SKILL.md taxonomy styles checklist basic-image-gen vault
──── ──── ──────── ──────── ────── ───────── ────────────── ─────
1 Retrieve & Classify ✓ 指令 ✓ §1-§7 ✓ obsidian read
2 Plan Blueprint ✓ 模板
3 Apply Style ✓ 约束 ✓ 全文
4 Generate Figure ✓ 路由 ✓ §8 prompt ✓ 色值 ✓ conceptual
5 Critic Evaluation ✓ 约束 ✓ 全文
6 Archive to Vault ✓ 模板 ✓ obsidian property:set
```
Step 4 是资源消耗峰值——同时需要 taxonomyprompt 模板)+ styles色值字号+ basic-image-gen外部 skill。这是合理的生成阶段是整个 skill 的核心价值所在。
## Content-Forge Pipeline Integration
```
content-forge 生产线 paper-illustration 覆盖范围
──────────────────────────────────────────────────────────────
S0 选题入库 ──▶ 01-topics/*.md
S2 草稿生成 ──▶ write-article
S4 格式清洗 ──▶ format-markdown
┌─────────────────────────────────────────────┐
│ S5 视觉资产 │
│ │
│ ┌─ paper-illustration ◀── NEW (学术图表) │
│ │ Step 1: 读取源笔记 + 分类 figure_type │
│ │ Step 2: Figure Blueprint │
│ │ Step 3: 风格参数NeurIPS/ICML/...
│ │ Step 4: matplotlib 代码 / AI 图像 │
│ │ Step 5: Critic 5 维度评估 │
│ │ Step 6: 存入 05-assets/ │
│ │ │
│ ├─ baoyu-cover-image社媒封面
│ ├─ baoyu-article-illustrator博客配图
│ └─ baoyu-xhs-images小红书配图
└─────────────────────────────────────────────┘
S6 审核 ──▶ /review + /multi-review
S8 发布 ──▶ post-to-wechat / post-to-x
```
paper-illustration 与 baoyu-* 系列平级,在 S5视觉资产阶段按内容类型路由学术内容走 paper-illustration社媒内容走 baoyu-*。
## Differentiation Matrix
```
paper-illustration baoyu-article-illustrator baoyu-cover-image
───────────────── ──────────────────────── ─────────────────
目的 信息性学术图表 装饰性博客配图 社媒封面图
输出 图片 + 可复现代码 仅图片 仅图片
受众 学术审稿人 博客读者 社媒用户
文字处理 标签/坐标轴/图例 极少装饰文字 标题文字
可复现性 必须(代码输出) 无需 无需
后端 matplotlib + AI AI only AI only
质量检查 20 项 Critic 无结构化检查 无结构化检查
迭代 ≤3 轮 无 无
```
## Architecture Scorecard
| Dimension | Rating | Notes |
|-----------|--------|-------|
| Progressive Disclosure | PASS | SKILL.md 摘要+指针3 个 reference 按需加载 |
| Cross-File Consistency | PASS | 图表类型名在 SKILL.md 和 taxonomy.md 完全一致 |
| Single Responsibility | PASS | taxonomy=分类, styles=风格, checklist=评估 |
| Extensibility | PASS | 新增会议风格只需扩展 academic-styles.md |
| Vault Integration | PASS | 读取 obsidian read, 归档 property:set + 05-assets/ |
| Quality Assurance | PASS | 20 项 Critic checklist, 18/20 pass threshold, ≤3 rounds |
| Context Efficiency | PASS | 总量 ~6,000 字Step 4 峰值 ~3 源(合理,生成阶段固有复杂度) |

View File

@ -1,368 +0,0 @@
---
name: paper-illustration
description: >
Generate publication-quality academic paper illustrations from scientific
content. 6 figure types: architecture diagrams, data plots, conceptual
illustrations, process flows, comparison charts, result visualizations.
Outputs AI-generated images (via basic-image-gen) or reproducible code
(matplotlib/mermaid/TikZ). Academic style compliance (NeurIPS/ICML/ACL/IEEE).
USE WHEN: User wants to create academic figures, paper illustrations, or
scientific diagrams from vault notes or raw content.
Trigger phrases: 论文插图、学术配图、paper figure、scientific illustration、
架构图、实验结果图、ablation figure、generate figures for paper、
数据可视化、流程图、对比图、概念图。
DON'T USE WHEN:
- User wants decorative blog illustrations → use baoyu-article-illustrator.
- User wants social media cover images → use baoyu-cover-image.
- User wants infographics for Xiaohongshu → use baoyu-xhs-images.
- User wants general AI image generation → use basic-image-gen directly.
- User says "封面"、"配图"、"社媒" without academic context → not this skill.
---
# Paper-Illustration: Academic Figure Generation Skill
## Purpose
Generate publication-quality figures from scientific content with reproducible code output. Every data-driven figure must be reproducible from code; every conceptual figure must be visually precise.
Core principle: **Code-first, AI-image fallback** — data figures (plots, charts) always go through matplotlib/seaborn code generation (text accuracy guaranteed); conceptual figures go through `basic-image-gen` (AI excels at creative visuals).
## Routing Rules (Use when / Don't use when)
Use this skill when:
- User wants **academic-quality** figures for papers, presentations, or technical reports
- User says "论文插图"、"paper figure"、"实验结果图"、"ablation study plot"
- Content involves data visualization, system architecture, or scientific processes
- User needs **reproducible** figure code (matplotlib, mermaid, TikZ)
Do NOT use this skill when:
- User wants **decorative** blog/social illustrations → `baoyu-article-illustrator`
- User wants **cover images** for articles → `baoyu-cover-image`
- User wants **infographics** for social media → `baoyu-xhs-images` or `baoyu-infographic`
- User wants **general AI images** without academic context → `basic-image-gen`
- Content has no scientific/technical structure to visualize
Edge cases:
- "帮我画个系统架构图" with paper context → **this skill** (academic architecture diagram)
- "帮我画个系统架构图" for blog post → **not this skill** (use baoyu-article-illustrator)
- "生成实验对比图" → **this skill** (data-driven, needs reproducible code)
- "做个信息图" → **not this skill** (use baoyu-infographic)
## Input Requirements
Required:
- `source`: Vault note path OR raw text content describing the figure subject
- `figure_type`: One of 6 types (auto-detected if omitted, see Decision Tree below)
Optional:
- `venue`: Academic venue style — `neurips` (default) | `icml` | `acl` | `ieee` | `nature`
- `output_format`: `code` (default for data types) | `image` (default for conceptual) | `both`
- `slug`: Asset slug for vault storage (derived from source note if omitted)
- `caption`: Figure caption (generated if omitted)
- `data`: Inline data dict/CSV for data-driven figures
- `colorblind_mode`: `true` | `false` (default: `true` — always colorblind-safe)
- `subfigures`: Number of subfigures (for multi-panel layouts)
- `dpi`: Output resolution (default: 300, minimum: 150)
- `language`: Label language — `en` (default) | `zh-CN`
## Figure Type Decision Tree
```
Source content analysis
├─ Contains numeric data / experimental results?
│ ├─ Comparing methods/models? ─────────────── comparison-chart
│ ├─ Showing trends / distributions? ────────── data-plot
│ └─ Showing ablation / metrics table? ──────── result-visualization
├─ Describes a system / model architecture?
│ └─ Has components + connections? ──────────── architecture-diagram
├─ Describes a sequential process / pipeline?
│ └─ Has ordered steps + decisions? ─────────── process-flow
└─ Describes an abstract concept / metaphor?
└─ Needs creative visual representation? ──── conceptual
```
## Figure Type → Backend Routing
```
figure_type Primary Backend Fallback
───────────────────── ───────────────────── ────────────────
architecture-diagram Mermaid → basic-image-gen TikZ
data-plot matplotlib code —code only
conceptual basic-image-gen SVG description
process-flow Mermaid flowchart TikZ
comparison-chart matplotlib code —code only
result-visualization matplotlib/seaborn code —code only
```
**Key constraint**: Data-driven types (data-plot, comparison-chart, result-visualization) NEVER use AI image generation. Text on axes, labels, and legends must be pixel-perfect — only code can guarantee this.
## Mandatory Workflow (6 Steps — No Skipping)
### Step 1: Retrieve & Classify
Read source content and classify figure type. Load `references/illustration-taxonomy.md` for classification guidance.
```bash
# If source is a vault note path
cd "${VAULT_PATH:-/home/kang/apps/content-forge/content-forge}"
obsidian read path="<source_note_path>"
```
Actions:
- Read all source material (vault notes, inline data, referenced papers)
- Auto-detect `figure_type` using the Decision Tree above (if not provided)
- Extract key elements: entities, relationships, data points, labels
- Confirm figure_type with user if ambiguous
Output:
```
## Figure Classification
- Source: [vault path or "inline content"]
- Detected type: [figure_type]
- Key elements: [list of entities/data points]
- Confidence: [high/medium/low]
- [?] Ambiguous — suggest [type_a] or [type_b], awaiting user choice (if low confidence)
```
### Step 2: Plan the Figure (Blueprint)
Generate a structured Figure Blueprint describing the visual composition.
Blueprint format:
```yaml
figure_blueprint:
type: <figure_type>
title: "<descriptive title>"
caption: "<self-contained caption describing content and key findings>"
dimensions:
width: <inches>
height: <inches>
aspect_ratio: "<W:H>"
layout:
grid: "<NxM>" # for subfigures
elements:
- id: "element_1"
type: "<box|arrow|label|axis|legend|...>"
content: "<text or data reference>"
position: "<relative position description>"
data_mapping: # for data-driven types only
x_axis: "<variable name>"
y_axis: "<variable name>"
series: ["<method_1>", "<method_2>"]
error_bars: true/false
text_elements:
labels: ["<label_1>", "<label_2>"]
annotations: ["<annotation_1>"]
```
Constraints:
- Every text element must be explicitly listed (no implicit labels)
- Data mappings must reference actual data from Step 1
- Caption must be self-contained (understandable without reading the paper)
### Step 3: Apply Academic Style
Load `references/academic-styles.md` and apply venue-specific styling to the Blueprint.
Style augmentation adds:
- Color palette (hex values, colorblind-safe)
- Font family and sizes (axis labels, titles, legends)
- Line widths and marker styles
- Figure size constraints (single-column vs double-column)
- Caption format (numbered, style-specific)
Output: Enhanced Blueprint with all visual parameters specified as concrete values (no "use default" — every parameter must be a number or hex code).
### Step 4: Generate Figure
Route to the appropriate backend based on figure_type.
#### 4a. Code-based generation (data-plot, comparison-chart, result-visualization)
Generate complete, runnable Python code:
```python
import matplotlib.pyplot as plt
import matplotlib
import numpy as np
# import seaborn as sns # if needed
# --- Style Configuration (from Step 3) ---
matplotlib.rcParams.update({
'font.family': '<font_family>',
'font.size': <base_size>,
'axes.labelsize': <label_size>,
'axes.titlesize': <title_size>,
'legend.fontsize': <legend_size>,
'figure.dpi': <dpi>,
})
# --- Data ---
# <data from Step 1, hardcoded for reproducibility>
# --- Plot ---
fig, ax = plt.subplots(figsize=(<width>, <height>))
# <plotting code>
# --- Labels & Legend ---
ax.set_xlabel('<x_label>')
ax.set_ylabel('<y_label>')
ax.legend(loc='best', frameon=True)
# --- Output ---
plt.tight_layout()
plt.savefig('<slug>_fig.png', dpi=<dpi>, bbox_inches='tight')
plt.savefig('<slug>_fig.pdf', bbox_inches='tight') # vector format
plt.show()
```
**Code output rules**:
- Print code to terminal (NEVER write .py files to vault)
- All data must be inline (no external file references)
- Must include both raster (PNG) and vector (PDF) save commands
- Must include `tight_layout()` and explicit DPI
- Must include all imports at the top
#### 4b. Mermaid-based generation (architecture-diagram, process-flow)
Generate Mermaid code, then optionally render via `basic-image-gen` for high-quality output:
```mermaid
graph TD
A[Component A] --> B[Component B]
B --> C{Decision}
C -->|Yes| D[Output 1]
C -->|No| E[Output 2]
```
For AI-enhanced rendering:
- Convert Mermaid to a detailed text description
- Use `basic-image-gen` with academic-style prompt (from Step 3)
- Prompt template: see `references/illustration-taxonomy.md`
#### 4c. AI image generation (conceptual)
Use `basic-image-gen` with a carefully engineered prompt:
- Include all text elements from Blueprint (labels, annotations)
- Specify exact colors from venue palette
- Request "clean, minimalist, scientific illustration style"
- Specify "white background, no decorative elements, no shadows, no 3D effects"
### Step 5: Critic Evaluation
Load `references/critic-checklist.md` and evaluate the generated figure.
5 dimensions, 20 items — every item scored PASS/FAIL:
- **Clarity** (5 items): caption, labels, hierarchy, overlap, whitespace
- **Accuracy** (4 items): data fidelity, encoding, axes, error bars
- **Style** (5 items): palette, colorblind, grayscale, fonts, size
- **Reproducibility** (3 items): code completeness, imports, output config
- **Caption** (3 items): content description, key findings, subfigure refs
Evaluation output:
```
## Critic Evaluation — Round N/3
| Dimension | Score | Issues |
|-----------------|-------|--------|
| Clarity | 4/5 | [!] Legend overlaps data points |
| Accuracy | 4/4 | — |
| Style | 5/5 | — |
| Reproducibility | 3/3 | — |
| Caption | 2/3 | [!] Missing key finding in caption |
Overall: REVISE (16/20, threshold: 18/20)
Revision actions:
1. Move legend to upper-left corner
2. Add "Method A outperforms by 12%" to caption
```
**Iteration rules**:
- Threshold: 18/20 to PASS
- Maximum 3 revision rounds
- Each revision must address ALL flagged issues
- If round 3 still fails: output with `[!] Quality warning` and list remaining issues
### Step 6: Archive to Vault
Store final assets and update vault metadata.
```bash
cd "${VAULT_PATH:-/home/kang/apps/content-forge/content-forge}"
# Create asset directory (if source is vault note)
# mkdir -p "05-assets/<slug>/"
# For code-based figures: user runs the code, saves output to 05-assets/<slug>/
# For AI-generated figures: basic-image-gen saves to 05-assets/<slug>/
# Update source note's frontmatter (if vault note)
obsidian property:set path="<source_note_path>" name="assets" \
value='["05-assets/<slug>/<filename>.png"]'
```
Output summary:
```
## Figure Generation Complete
[✓] Type: <figure_type>
[✓] Backend: <matplotlib|mermaid|basic-image-gen>
[✓] Critic: PASS (score/20) — round N
[✓] Assets: 05-assets/<slug>/<filename>.{png,pdf}
[✓] Code: <printed to terminal | N/A>
Caption:
"Figure N. <caption text>"
```
## NEVER Rules (8 Items — Zero Tolerance)
1. **NEVER** use AI image generation for data-driven figures (data-plot, comparison-chart, result-visualization). Text on axes, labels, and legends is unreliable in AI-generated images. Always use matplotlib/seaborn code.
2. **NEVER** use more than 7 distinct colors in a single figure. Beyond 7, use patterns (hatching, markers, line styles) to differentiate series. Color is a scarce resource.
3. **NEVER** rely solely on red-green distinction. Always include a secondary encoding (shape, pattern, label) for colorblind accessibility. Test with simulated deuteranopia.
4. **NEVER** output a figure without a caption. Every figure must have a self-contained caption that describes what is shown and highlights key findings.
5. **NEVER** generate matplotlib code without `plt.tight_layout()` and explicit DPI setting. Clipped labels and low-resolution output are publication-rejection-worthy bugs.
6. **NEVER** use decorative elements: drop shadows, 3D effects, gradients, bevels, or ornamental borders. Academic figures must be clean, flat, and information-dense.
7. **NEVER** skip the Critic evaluation step (Step 5). Even if the figure "looks fine", run the 20-item checklist. Visual intuition misses subtle issues.
8. **NEVER** write code files (.py, .mmd) to the vault. Code output goes to terminal. Only image assets (.png, .pdf, .svg) go to `05-assets/`. Vault is for content, not code.
## Output Constraints
- All code output is printed to terminal, not saved as files
- Image assets go to `05-assets/<slug>/` with vault-relative paths
- Default language for labels: English (override with `language: zh-CN`)
- Default colorblind mode: ON (override with `colorblind_mode: false`)
- Default DPI: 300 (minimum 150, recommended 300-600 for print)
- Caption language matches `language` parameter
- Vector format (PDF) always generated alongside raster (PNG) for code-based figures
## Failure Handling
- Missing source content: `[?] Missing input: source` — stop and ask
- Ambiguous figure_type: `[?] Cannot determine figure type` — present options, ask user
- `basic-image-gen` unavailable: `[✗] Image generation failed` — fall back to Mermaid/TikZ code
- Data insufficient for plot: `[?] Insufficient data` — request specific data points
- Critic fails after 3 rounds: `[!] Quality warning: <remaining_issues>` — output with disclaimer
- `obsidian` CLI failure: `[✗] <command> failed: <error>` — stop subsequent steps
## Reference Files
- `references/illustration-taxonomy.md` — 6 figure types: structure, routing, prompt templates, decision tree
- `references/academic-styles.md` — Venue-specific styles: NeurIPS/ICML/ACL/IEEE/Nature with hex colors, fonts, sizes
- `references/critic-checklist.md` — 5 dimensions x 20 items: Clarity, Accuracy, Style, Reproducibility, Caption

View File

@ -1,21 +0,0 @@
# paper-illustration Reference Files
This directory contains detailed documentation that supplements SKILL.md.
## Files
- `illustration-taxonomy.md` — 6 figure types: structure templates, routing rules, prompt engineering, auto-detection heuristics
- `academic-styles.md` — Venue-specific visual parameters: NeurIPS/ICML/ACL/IEEE/Nature with hex colors, fonts, sizes
- `critic-checklist.md` — 5 dimensions x 20 items quality evaluation: Clarity, Accuracy, Style, Reproducibility, Caption
## Loading Rules
1. **illustration-taxonomy.md**: Load at Step 1 (Retrieve & Classify) and Step 4 (Generate Figure)
2. **academic-styles.md**: Load at Step 3 (Apply Style) and Step 4 (Generate Figure)
3. **critic-checklist.md**: Load at Step 5 (Critic Evaluation)
## Guidelines
1. **Single Source**: Don't duplicate content from SKILL.md
2. **Load on Demand**: Claude reads these files only at the relevant Step
3. **Cross-References**: Each file notes which SKILL.md sections reference it

View File

@ -1,281 +0,0 @@
# Academic Styles Reference
> Loaded by Step 3 (Apply Academic Style). Provides venue-specific visual parameters: colors, fonts, sizes, spacing, caption format. Every value is concrete — no "use default".
## Table of Contents
1. [Universal Rules](#1-universal-rules)
2. [NeurIPS Style (Default)](#2-neurips-style-default)
3. [ICML Style](#3-icml-style)
4. [ACL Style](#4-acl-style)
5. [IEEE Style](#5-ieee-style)
6. [Nature Style](#6-nature-style)
7. [Color Palettes Quick Reference](#7-color-palettes-quick-reference)
8. [Font Sizes Quick Reference](#8-font-sizes-quick-reference)
---
## 1. Universal Rules
These apply to ALL venues. Venue-specific sections override where noted.
### Colorblind Safety
- Primary encoding: color + shape/pattern (never color alone)
- Forbidden pairs: pure red (#FF0000) vs pure green (#00FF00)
- Mandatory test: simulate deuteranopia — all series still distinguishable
- Maximum distinct colors per figure: 7 (use hatching/markers beyond 7)
### Grayscale Compatibility
- Figure must remain interpretable when printed in grayscale
- Use varying lightness values, not just hue differences
- Add patterns (hatching, dots) to filled regions as backup encoding
### Typography
- Minimum font size: 8pt at final print size
- Label font size: 9-10pt
- Title font size: 10-12pt (if shown on figure)
- Legend font size: 8-9pt
- All text must survive 50% reduction without becoming illegible
### Resolution
- Raster output: minimum 300 DPI (600 DPI recommended for print)
- Vector output: PDF preferred (no rasterization artifacts)
- Always generate both PNG (300 DPI) and PDF
### Layout
- Margins: sufficient whitespace around all elements (no clipped text)
- Always call `plt.tight_layout()` or equivalent
- Grid lines: light gray (#CCCCCC), thin (0.5pt), behind data
- Axis spines: visible top and right spines optional (NeurIPS removes them)
---
## 2. NeurIPS Style (Default)
**Page width**: 5.5" (single column), 11.0" (full width)
**Figure width**: 5.5" (single), 2.6" (half)
### Color Palette (seaborn "muted" inspired, 7 colors)
| Index | Name | Hex | RGB | Use |
|-------|---------|-----------|-----------------|-----|
| 0 | Blue | `#4878D0` | (72, 120, 208) | Primary / "Ours" |
| 1 | Orange | `#EE854A` | (238, 133, 74) | Secondary / Baseline |
| 2 | Green | `#6ACC64` | (106, 204, 100) | Tertiary |
| 3 | Red | `#D65F5F` | (214, 95, 95) | Alert / Worst |
| 4 | Purple | `#956CB4` | (149, 108, 180) | Additional |
| 5 | Brown | `#8C613C` | (140, 97, 60) | Additional |
| 6 | Pink | `#DC7EC0` | (220, 126, 192) | Additional |
### Fonts
- Family: `serif` (Times New Roman or similar)
- Body: 10pt, Labels: 9pt, Legend: 8pt, Title: 11pt
- matplotlib: `'font.family': 'serif'`
### Axes
- Remove top and right spines: `ax.spines['top'].set_visible(False)`
- Tick direction: `out`
- Tick length: 4pt
- Grid: `alpha=0.3, linestyle='--', linewidth=0.5`
### Caption Format
```
Figure N: <Description>. <Key finding>.
```
---
## 3. ICML Style
**Page width**: 6.75" (single column), 13.5" (full width)
**Figure width**: 6.75" (single), 3.25" (half)
### Color Palette (cooler tones)
| Index | Name | Hex | Use |
|-------|-----------|-----------|-----|
| 0 | Dark Blue | `#1F77B4` | Primary / "Ours" |
| 1 | Orange | `#FF7F0E` | Secondary |
| 2 | Teal | `#2CA02C` | Tertiary |
| 3 | Crimson | `#D62728` | Alert |
| 4 | Violet | `#9467BD` | Additional |
| 5 | Sienna | `#8C564B` | Additional |
| 6 | Gray | `#7F7F7F` | Neutral/Baseline |
### Fonts
- Family: `serif` (Computer Modern / Times)
- Body: 10pt, Labels: 9pt, Legend: 8pt
- matplotlib: `'font.family': 'serif', 'mathtext.fontset': 'cm'`
### Caption Format
```
Figure N. <Description>. <Key finding>.
```
---
## 4. ACL Style
**Page width**: 6.0" (single column)
**Figure width**: 6.0" (single), 2.9" (half)
### Color Palette (warm academic)
| Index | Name | Hex | Use |
|-------|------------|-----------|-----|
| 0 | Royal Blue | `#2166AC` | Primary |
| 1 | Warm Red | `#B2182B` | Secondary |
| 2 | Teal | `#35978F` | Tertiary |
| 3 | Gold | `#DFC27D` | Highlight |
| 4 | Purple | `#762A83` | Additional |
| 5 | Dark Gray | `#525252` | Neutral |
### Fonts
- Family: `serif` (Times New Roman)
- Body: 10pt, Labels: 9pt, Legend: 8pt
- matplotlib: `'font.family': 'serif'`
### Special Notes
- NLP figures often include text examples — ensure text is readable
- Attention heatmaps: use sequential colormap (`Blues` or `YlOrRd`)
- Dependency trees: horizontal layout preferred
### Caption Format
```
Figure N: <Description>.
```
---
## 5. IEEE Style
**Page width**: 3.5" (single column), 7.16" (double column)
**Figure width**: 3.5" (single), 7.16" (full)
### Color Palette (high contrast, traditional)
| Index | Name | Hex | Use |
|-------|----------|-----------|-----|
| 0 | Blue | `#0072B2` | Primary |
| 1 | Orange | `#E69F00` | Secondary |
| 2 | Green | `#009E73` | Tertiary |
| 3 | Red | `#CC79A7` | Alert (pink-red, colorblind-safe) |
| 4 | Sky Blue | `#56B4E9` | Additional |
| 5 | Vermilion| `#D55E00` | Additional |
| 6 | Black | `#000000` | Baseline/Reference |
**Note**: This is the Wong colorblind-safe palette, recommended for all IEEE publications.
### Fonts
- Family: `sans-serif` (Helvetica / Arial)
- Body: 8pt, Labels: 8pt, Legend: 7pt, Title: 9pt
- matplotlib: `'font.family': 'sans-serif'`
### Special Notes
- IEEE is stricter on figure size due to two-column format
- Single-column figures: max 3.5" wide — everything must be readable at this size
- Prefer subfigure grids over wide panoramic figures
- Line width: minimum 1pt (thin lines disappear in print)
### Caption Format
```
Fig. N. <Description>.
```
---
## 6. Nature Style
**Page width**: 3.5" (single column), 7.2" (double column)
**Figure width**: 3.5" (single), 7.2" (full)
### Color Palette (Nature-inspired, elegant)
| Index | Name | Hex | Use |
|-------|-----------|-----------|-----|
| 0 | Nature Blue | `#3B4CC0` | Primary |
| 1 | Nature Red | `#B40426` | Secondary |
| 2 | Nature Green| `#1B7837` | Tertiary |
| 3 | Gold | `#F2C14E` | Highlight |
| 4 | Teal | `#008080` | Additional |
| 5 | Dark Gray | `#404040` | Neutral |
### Fonts
- Family: `sans-serif` (Helvetica / Arial)
- Body: 7pt, Labels: 7pt, Legend: 6pt, Title: 8pt
- matplotlib: `'font.family': 'sans-serif', 'font.size': 7`
### Special Notes
- Nature has the strictest size limits — maximize information density
- Prefer panel layouts (a, b, c, d) with lowercase bold letters
- Panel labels: **a**, **b**, **c** at top-left of each subfigure
- Color: used sparingly, key data only — backgrounds always white
### Caption Format
```
Figure N | <Title in bold>. <Description>. a, <Panel a description>. b, <Panel b description>.
```
---
## 7. Color Palettes Quick Reference
### matplotlib Code Snippets
```python
# NeurIPS (default)
COLORS_NEURIPS = ['#4878D0', '#EE854A', '#6ACC64', '#D65F5F', '#956CB4', '#8C613C', '#DC7EC0']
# ICML
COLORS_ICML = ['#1F77B4', '#FF7F0E', '#2CA02C', '#D62728', '#9467BD', '#8C564B', '#7F7F7F']
# ACL
COLORS_ACL = ['#2166AC', '#B2182B', '#35978F', '#DFC27D', '#762A83', '#525252']
# IEEE (Wong colorblind-safe)
COLORS_IEEE = ['#0072B2', '#E69F00', '#009E73', '#CC79A7', '#56B4E9', '#D55E00', '#000000']
# Nature
COLORS_NATURE = ['#3B4CC0', '#B40426', '#1B7837', '#F2C14E', '#008080', '#404040']
```
### Choosing "Ours" Color
Convention: the first color in each palette (index 0, a shade of blue) is used for "our method". This creates visual prominence and is consistent with reader expectations.
---
## 8. Font Sizes Quick Reference
| Venue | Body | Labels | Legend | Title | Min |
|---------|------|--------|--------|-------|-----|
| NeurIPS | 10pt | 9pt | 8pt | 11pt | 8pt |
| ICML | 10pt | 9pt | 8pt | 10pt | 8pt |
| ACL | 10pt | 9pt | 8pt | 10pt | 8pt |
| IEEE | 8pt | 8pt | 7pt | 9pt | 7pt |
| Nature | 7pt | 7pt | 6pt | 8pt | 6pt |
**Rule of thumb**: If in doubt, use larger font sizes. Reviewers complain about unreadable figures far more often than oversized text.
---
*Cross-reference: SKILL.md §Step 3, §NEVER Rules #2 #3 #6*

View File

@ -1,185 +0,0 @@
# Critic Checklist Reference
> Loaded by Step 5 (Critic Evaluation). 5 dimensions, 20 items. Each scored PASS/FAIL. Threshold: 18/20 to pass. Maximum 3 revision rounds.
## Table of Contents
1. [Scoring Rules](#scoring-rules)
2. [Dimension 1: Clarity (5 items)](#dimension-1-clarity-5-items)
3. [Dimension 2: Accuracy (4 items)](#dimension-2-accuracy-4-items)
4. [Dimension 3: Style (5 items)](#dimension-3-style-5-items)
5. [Dimension 4: Reproducibility (3 items)](#dimension-4-reproducibility-3-items)
6. [Dimension 5: Caption (3 items)](#dimension-5-caption-3-items)
7. [Evaluation Output Template](#evaluation-output-template)
8. [Revision Protocol](#revision-protocol)
---
## Scoring Rules
- Each item: PASS (1 point) or FAIL (0 points)
- Total: 20 points maximum
- Pass threshold: 18/20 (90%)
- Maximum revision rounds: 3
- Each revision must address ALL flagged FAIL items
- Items not applicable to the figure type: auto-PASS (e.g., error bars for conceptual figures)
---
## Dimension 1: Clarity (5 items)
| ID | Check | PASS Criteria | Common FAIL |
|----|-------|---------------|-------------|
| C1 | Caption self-explanatory | Reader understands figure without reading paper body | Caption says only "Results" with no detail |
| C2 | Labels readable | All text >= minimum font size at print dimensions | 6pt text on IEEE single-column figure |
| C3 | Visual hierarchy | Most important data visually prominent (size, color, position) | All lines same weight, "Ours" indistinguishable |
| C4 | No overlapping elements | Labels, legends, data points, annotations do not occlude each other | Legend sits on top of data region |
| C5 | Adequate whitespace | Margins around figure, between subfigures, around legends | Elements crammed to edges, no breathing room |
### How to Fix Common FAIL
- **C1**: Add "showing that [method] achieves [X]% improvement over [baseline]" to caption
- **C2**: Increase font size or reduce figure complexity (fewer elements)
- **C3**: Use thicker lines / brighter colors for "Ours", thinner / muted for baselines
- **C4**: Relocate legend (outside plot area, or to whitespace region)
- **C5**: Add `plt.tight_layout(pad=1.5)` or increase figure dimensions
---
## Dimension 2: Accuracy (4 items)
| ID | Check | PASS Criteria | Common FAIL |
|----|-------|---------------|-------------|
| A1 | Data fidelity | Plotted values exactly match source data (spot-check 3 points) | Transposed rows/columns, wrong method assigned to line |
| A2 | Encoding faithful | Visual encoding matches data semantics (e.g., larger bar = larger value) | Inverted y-axis without indicator, log scale unlabeled |
| A3 | Axes honest | No truncated axes without break markers; scale is fair | Y-axis starts at 90% making 1% difference look huge |
| A4 | Error bars correct | Error bars represent stated metric (std, sem, CI) and are labeled | Error bars present but unlabeled, or wrong metric |
### How to Fix Common FAIL
- **A1**: Cross-reference code data arrays with source table, print values to verify
- **A2**: Check axis direction, scale type (linear/log), and legend-to-data mapping
- **A3**: Start y-axis at 0, or use axis break (`//`) marker if truncated
- **A4**: Add "(mean +/- std, n=5)" to caption or legend
---
## Dimension 3: Style (5 items)
| ID | Check | PASS Criteria | Common FAIL |
|----|-------|---------------|-------------|
| S1 | Palette matches venue | Colors from venue-specific palette in academic-styles.md | Using matplotlib default colors instead of venue palette |
| S2 | Colorblind safe | All series distinguishable under simulated deuteranopia | Red and green lines only differ by hue |
| S3 | Grayscale compatible | Figure readable when desaturated (for B&W printing) | Two series both map to medium gray |
| S4 | Font compliant | Font family and sizes match venue specification | Sans-serif used for NeurIPS (should be serif) |
| S5 | Size compliant | Figure fits within venue column width at stated dimensions | 8" wide figure for IEEE single-column (max 3.5") |
### How to Fix Common FAIL
- **S1**: Replace colors with hex values from `references/academic-styles.md`
- **S2**: Add secondary encoding (markers: o, s, ^, D, v) alongside color
- **S3**: Add line styles (solid, dashed, dotted, dash-dot) as tertiary encoding
- **S4**: Update `matplotlib.rcParams['font.family']`
- **S5**: Adjust `figsize` to venue constraints
---
## Dimension 4: Reproducibility (3 items)
| ID | Check | PASS Criteria | Common FAIL |
|----|-------|---------------|-------------|
| R1 | Code complete | Code runs without modification (all data inline, no external files) | References `data.csv` that doesn't exist |
| R2 | Imports present | All required imports listed at top of code | Missing `import seaborn as sns` |
| R3 | Output configured | Explicit DPI, savefig with bbox_inches='tight', both PNG and PDF | No savefig, or missing DPI, or only PNG |
**Scope**: Only applies to code-based figures (data-plot, comparison-chart, result-visualization). Auto-PASS for AI-generated figures.
### How to Fix Common FAIL
- **R1**: Replace file reads with inline data arrays (`np.array([...])`)
- **R2**: Run code mentally — every function call must have its import
- **R3**: Add `plt.savefig('fig.png', dpi=300, bbox_inches='tight')` + PDF variant
---
## Dimension 5: Caption (3 items)
| ID | Check | PASS Criteria | Common FAIL |
|----|-------|---------------|-------------|
| P1 | Content described | Caption describes WHAT the figure shows (not just "Results") | "Figure 1: Comparison." — no detail |
| P2 | Key finding stated | Caption highlights the main takeaway for the reader | Describes setup but not conclusion |
| P3 | Subfigures referenced | Multi-panel figures: each panel described in caption (a, b, c) | 4 panels but caption only mentions "left" and "right" |
### How to Fix Common FAIL
- **P1**: Structure as "Figure N: [verb] [what]. [context]." e.g., "Figure 3: Comparison of training convergence across 5 methods on CIFAR-10."
- **P2**: Add final sentence: "Method A converges 2x faster than the strongest baseline."
- **P3**: Add "(a) Training loss. (b) Validation accuracy. (c) Inference latency."
---
## Evaluation Output Template
```
## Critic Evaluation — Round N/3
| Dim. | Items | Score | Failed IDs | Issues |
|-----------------|-------|-------|------------|--------|
| Clarity | 5 | X/5 | [CX] | [description] |
| Accuracy | 4 | X/4 | [AX] | [description] |
| Style | 5 | X/5 | [SX] | [description] |
| Reproducibility | 3 | X/3 | [RX] | [description] |
| Caption | 3 | X/3 | [PX] | [description] |
|-----------------|-------|-------|------------|--------|
| **Total** | **20**| **X/20** | | |
Verdict: PASS (>= 18) / REVISE (< 18)
[If REVISE:]
Revision actions:
1. [Fix for failed item 1]
2. [Fix for failed item 2]
...
```
---
## Revision Protocol
### Round Management
```
Round 1: Initial evaluation
↓ REVISE → apply fixes
Round 2: Re-evaluate ALL items (not just failed ones)
↓ REVISE → apply fixes
Round 3: Final evaluation
↓ REVISE → output with [!] Quality warning
↓ PASS → proceed to Step 6
```
### Rules
1. Each round evaluates ALL 20 items fresh (fixes can introduce new issues)
2. Revision must address every FAIL item — no "defer to next round"
3. After round 3, if still < 18/20:
- Output the figure with explicit warning
- List all remaining FAIL items
- Suggest user manual review
4. A PASS in any round immediately proceeds to Step 6 (no unnecessary iterations)
### Quality Warning Format
```
[!] Quality warning: Figure output with 2 unresolved issues after 3 revision rounds.
Remaining issues:
- [S2] Colorblind safety: series 3 and 5 may be confusing under deuteranopia
- [C4] Minor legend overlap with rightmost data point
Recommendation: Manual review before submission.
```
---
*Cross-reference: SKILL.md §Step 5, §NEVER Rule #7*

View File

@ -1,291 +0,0 @@
# Illustration Taxonomy Reference
> Loaded by Step 1 (Retrieve & Classify). Provides structure templates, routing rules, prompt engineering guidance, and auto-detection heuristics for all 6 figure types.
## Table of Contents
1. [Architecture Diagram](#1-architecture-diagram)
2. [Data Plot](#2-data-plot)
3. [Conceptual Illustration](#3-conceptual-illustration)
4. [Process Flow](#4-process-flow)
5. [Comparison Chart](#5-comparison-chart)
6. [Result Visualization](#6-result-visualization)
7. [Auto-Detection Heuristics](#7-auto-detection-heuristics)
8. [Prompt Engineering Templates](#8-prompt-engineering-templates)
---
## 1. Architecture Diagram
**Purpose**: Show system components and their interconnections. Common in ML papers (model architecture), systems papers (distributed systems), and software engineering papers.
**Structural template**:
- Top-level: input → processing layers → output
- Each layer: named box with internal description
- Connections: directed arrows with optional labels (data type, tensor shape)
- Optional: skip connections, attention mechanisms, residual paths
**Key elements to extract**:
- Named components (encoder, decoder, attention head, loss function)
- Data flow direction (left-to-right or top-to-bottom)
- Tensor shapes / data dimensions at each stage
- Grouping (which components form a module)
**Backend**: Mermaid (structure) → `basic-image-gen` (polished rendering)
**Exemplar description** (text-based reference):
> A Transformer encoder-decoder diagram: input embeddings feed into N stacked encoder blocks (each containing multi-head self-attention + feed-forward + layer norm), connected by residual arrows. Decoder blocks mirror the structure with added cross-attention. All arrows are labeled with tensor dimensions. Clean white background, consistent box sizing, horizontal flow.
**Common mistakes**:
- Too many components crammed into one figure — split into overview + detail figures
- Arrows crossing without clear layering — use consistent flow direction
- Missing dimension annotations — reviewers need to verify tensor shapes
---
## 2. Data Plot
**Purpose**: Visualize quantitative experimental results. The most common figure type in empirical papers.
**Subtypes**:
- Line plot (trends over epochs, hyperparameter sweeps)
- Bar chart (discrete comparisons, ablation results)
- Scatter plot (correlation, embedding visualization)
- Histogram (distribution of scores, latency)
- Box plot (variance across runs, statistical comparison)
- Heatmap (attention weights, confusion matrices)
**Structural template**:
- X-axis: independent variable (clearly labeled with units)
- Y-axis: dependent variable (clearly labeled with units)
- Legend: method names, consistent with paper text
- Error bars / confidence intervals: when multiple runs exist
- Grid: light gray, no heavy gridlines
**Key elements to extract**:
- Data values (exact numbers from tables or inline)
- Variable names and units
- Method/baseline names (must match paper text exactly)
- Number of runs / seeds (for error bars)
**Backend**: matplotlib/seaborn code — NEVER AI image generation
**Common mistakes**:
- Truncated y-axis without break marker — misleading visual
- Missing error bars when results vary across seeds
- Legend covering data points — move to whitespace area
- Inconsistent method colors across subfigures
---
## 3. Conceptual Illustration
**Purpose**: Explain abstract ideas, metaphors, or high-level intuitions that cannot be expressed as data or architecture.
**Structural template**:
- Central metaphor / visual analogy
- Labeled regions or entities
- Visual encoding of relationships (proximity, size, color)
- Minimal text annotations (key terms only)
**Key elements to extract**:
- Core concept and its visual metaphor
- Entities and their relationships
- Any text that must appear in the figure
- Target impression (what should the reader understand at a glance)
**Backend**: `basic-image-gen` (AI excels at creative visual metaphors)
**Exemplar description**:
> A clean scientific illustration showing knowledge distillation: a large "Teacher" network (detailed, multi-layered structure) on the left, connected by flowing arrows labeled "soft labels" to a smaller, simpler "Student" network on the right. The teacher is rendered in deep blue, the student in teal. White background, no decorative elements, all text in sans-serif font.
**Common mistakes**:
- Too abstract — reviewers need to understand without reading the caption
- Decorative clutter (gradients, shadows) — breaks academic norms
- Text too small or embedded in complex visuals — must be readable at print size
---
## 4. Process Flow
**Purpose**: Show sequential steps, decision points, and branching logic. Common in method sections and algorithm descriptions.
**Structural template**:
- Start/end: rounded rectangles
- Process steps: rectangles with action descriptions
- Decisions: diamonds with yes/no branches
- Data stores: cylinders or parallelograms
- Flow: top-to-bottom or left-to-right, consistent direction
**Key elements to extract**:
- Ordered steps (numbered or sequential)
- Decision points and their conditions
- Parallel branches (if any)
- Loop/iteration indicators
- Input/output at boundaries
**Backend**: Mermaid flowchart (primary), TikZ (fallback)
**Exemplar description**:
> A training pipeline flowchart: "Raw Data" → "Preprocessing" → "Feature Extraction" → diamond "Validation Loss Decreasing?" → Yes: "Continue Training" (loops back) → No: "Early Stop" → "Evaluate on Test Set" → "Report Results". Clean boxes with consistent padding, single-color scheme, directional arrows.
**Common mistakes**:
- Too many steps in one diagram — split into phases
- Inconsistent box sizes — standardize width
- Missing decision labels (yes/no/condition)
---
## 5. Comparison Chart
**Purpose**: Compare multiple methods, models, or configurations across shared metrics. The "table as a figure" pattern.
**Subtypes**:
- Grouped bar chart (methods × metrics)
- Radar/spider chart (multi-dimensional comparison)
- Parallel coordinates (many dimensions)
- Table with heatmap coloring (for many metrics)
**Structural template**:
- X-axis: methods/models (categorical)
- Y-axis: metric value (numerical)
- Grouping: by metric or by method
- Highlighting: best result bolded or starred
- Baseline: horizontal dashed line for reference method
**Key elements to extract**:
- Method names (must match paper text)
- Metric names and values
- Which method is "ours" (for highlighting)
- Baseline/reference method
- Statistical significance markers (if applicable)
**Backend**: matplotlib code — NEVER AI image generation
**Common mistakes**:
- Too many methods/metrics in one chart — split or use table
- No baseline reference line — hard to judge improvement
- Inconsistent ordering — sort by performance or alphabetically
---
## 6. Result Visualization
**Purpose**: Show qualitative or semi-quantitative results: attention maps, feature visualizations, generated samples, ablation grids.
**Subtypes**:
- Attention heatmap overlay
- Feature map / activation visualization
- Sample grid (generated vs real)
- Ablation grid (each cell = one config)
- Confusion matrix
- t-SNE / UMAP embedding plots
**Structural template**:
- Grid layout: rows = conditions, columns = samples/metrics
- Consistent cell sizing
- Row/column headers clearly labeled
- Color scale legend (for heatmaps)
- Highlight: circles or boxes around key regions
**Key elements to extract**:
- What each row/column represents
- Color scale meaning and range
- Which samples to highlight and why
- Grid dimensions (rows × columns)
**Backend**: matplotlib/seaborn code (heatmaps, grids), `basic-image-gen` (overlays on real images)
**Common mistakes**:
- Missing color scale legend — uninterpretable
- Grid cells too small at print size — ensure readability
- No row/column labels — reader cannot identify conditions
---
## 7. Auto-Detection Heuristics
Keyword-based classification from source content:
| Keywords / Patterns | Detected Type |
|---|---|
| "accuracy", "F1", "BLEU", "%", table of numbers, "vs", "baseline" | comparison-chart |
| "epoch", "learning rate", "loss curve", "over time", "trend" | data-plot |
| "architecture", "encoder", "decoder", "layer", "module", "block" | architecture-diagram |
| "step 1", "then", "if...then", "pipeline", "workflow", "algorithm" | process-flow |
| "ablation", "heatmap", "attention map", "feature map", "t-SNE" | result-visualization |
| "intuition", "concept", "metaphor", "analogy", "overview" | conceptual |
**Confidence scoring**:
- 3+ keywords from one category → HIGH confidence
- 2 keywords → MEDIUM confidence
- 1 keyword or keywords from multiple categories → LOW confidence (ask user)
**Tie-breaking rules**:
- Numeric data present → prefer data-driven types (data-plot > comparison-chart > result-visualization)
- No numeric data → prefer structural types (architecture-diagram > process-flow > conceptual)
---
## 8. Prompt Engineering Templates
### For `basic-image-gen` (architecture-diagram, conceptual)
**Base template**:
```
Create a publication-quality scientific illustration for an academic paper.
Subject: {description_from_blueprint}
Style requirements:
- Clean white background
- No decorative elements (no shadows, no 3D, no gradients)
- Flat design with consistent line weights
- Colors: {palette_from_academic_styles}
- All text in {font_family}, minimum {min_font_size}pt equivalent
- Professional academic illustration style
Text elements that MUST appear legibly:
{list_all_labels_and_annotations}
Layout: {layout_description}
Aspect ratio: {width}:{height}
```
### For architecture diagrams specifically
**Architecture template**:
```
Create a clean technical architecture diagram for a research paper.
Components (left to right / top to bottom):
{component_list_with_descriptions}
Connections:
{arrow_descriptions_with_labels}
Style: flat design, {venue} conference style, colors {hex_values},
sans-serif labels, consistent box sizing, white background.
No decorative elements. Print-ready at {width}" x {height}".
```
### For conceptual illustrations
**Concept template**:
```
Create a minimalist scientific concept illustration.
Core concept: {concept_description}
Visual metaphor: {metaphor_description}
Must include these labeled elements:
{element_list}
Style: clean, academic, flat design. Colors: {hex_values}.
White background, no gradients or shadows.
All text must be clearly readable at small print size.
```
---
*Cross-reference: SKILL.md §Decision Tree, §Figure Type → Backend Routing*

View File

@ -0,0 +1 @@
/home/kang/apps/atomstorm-claude-skills/write-article

View File

@ -1,173 +0,0 @@
# write-article Skill 生产架构总览
## 文件体量
```
.claude/skills/write-article/
├── SKILL.md ~330 行 ~2,000 字 接口层(工作流 + 约束)
└── references/
├── material-anchors.md ~150 行 ~1,000 字 素材锚点(四类锚点 + 脚手架 + 编织规则)
├── content-quality.md ~275 行 ~1,800 字 质量框架(标题/去AI味/完读率/素材密度)
├── writing-styles.md 122 行 ~750 字 风格模板5 种)
└── personas.md 145 行 ~650 字 人格配置1 个 + 扩展模板)
─────────────────
~1,022 行 ~6,200 字 总上下文消耗
```
## 渐进式披露架构
```
Agent 加载顺序(上下文消耗)
─────────────────────────────────────────────────────────────
第 1 层SKILL.md必加载~1,600 字)
┌──────────────────────────────────────────────────────────┐
│ frontmatter 触发匹配 + 依赖声明 │
│ 目标 流量池公式 + 质量底线 │
│ 输入要求 5 必填 + 7 可选 + style×persona 矩阵 │
│ 7 步工作流 摘要+指针,不含详细规则 │
│ 输出约束 6 条硬性规则 │
│ 失败处理 3 种失败模式 │
│ 风格参考 5 个文件指针 │
└──────────────┬───────────────────────────────────────────┘
│ 按需加载(只在对应 Step 触发时读取)
第 2 层references/(按需,~4,200 字)
┌──────────────────────┐ ┌────────────────────┐ ┌──────────────────┐ ┌───────────────┐
│ material-anchors.md │ │ content-quality.md │ │ writing-styles.md│ │ personas.md │
│ │ │ │ │ │ │ │
│ Step 1b → §1-§3 │ │ Step 3 → §1 标题 │ │ Step 4 → 选风格 │ │ Step 2 → 激活 │
│ 素材锚点+脚手架 │ │ Step 4a → §2 去AI │ │ │ │ │
│ Step 4 → §4 编织 │ │ Step 4b → §3 完读率│ │ │ │ │
│ Step 7 → §4.4 门禁 │ │ Step 7 → §4 门禁 │ │ │ │ │
└──────────────────────┘ └────────────────────┘ └──────────────────┘ └───────────────┘
第 3 层vault 内文件(仅 lizi_kk 风格触发)
┌──────────────────────────────────────────────────────────┐
│ templates/author-style-lizi-kk.md 详细风格指南 │
│ personal-context/ (5 篇) 已发表文章参考 │
│ 通过 obsidian read 读取,不占 skill 上下文 │
└──────────────────────────────────────────────────────────┘
```
架构判定三层分离合理。SKILL.md 是接口references 是实现vault 文件是数据。Agent 不需要一次性加载全部 4,400 字。
## 7 步工作流 × 文件依赖矩阵
```
Step 名称 SKILL.md content-quality writing-styles personas material-anchors vault 文件
──── ──── ──────── ─────────────── ────────────── ──────── ──────────────── ──────────
1a 读取素材 ✓ 指令 ✓ obsidian read
1b 提取素材锚点 ✓ 约束 ✓ §1-§3 锚点+脚手架
2 激活人格 ✓ 格式 ✓ 激活
3 标题工程 ✓ 约束 ✓ §1 详细公式
4 生成草稿 ✓ 约束 ✓ §2 去AI味 ✓ 选风格 ✓ 口吻 ✓ §4 编织规则 ✓ lizi_kk 模板
✓ §3 完读率 ✓ personal-context
5 创建文件 ✓ 模板 ✓ obsidian create
6 验证 frontmatter ✓ 清单 ✓ obsidian read
7 质量检查 ✓ 门禁 ✓ §4 完整清单 ✓ §4.4 素材密度
```
Step 4 是资源消耗峰值——同时需要 5 个参考源。这是合理的,因为生成草稿是整个 skill 的核心价值所在。
## 跨文件一致性检查
```
检查项 结果 备注
─────────────────────────────────────────────────────────────
风格数量声明一致 ✓ SKILL.md "5种" = writing-styles.md "5类"
persona 数据一致20000+ ✓ personas.md:27 = personas.md:75
frontmatter 字段对齐 CLAUDE.md §4.2 ✓ 14 个必填字段全覆盖
门禁清单覆盖所有质量维度 ✓ 基础(4) + 标题(3) + 去AI味(8) + 完读率(6) + 素材密度(6) = 27 项
SKILL.md 指针与 content-quality.md 章节对应 ✓ §1/§2/§3/§4含§4.4素材密度)均有对应引用
SKILL.md 指针与 material-anchors.md 对应 ✓ §1-§3(Step 1b) + §4(Step 4) + §4.4(Step 7)
material-anchors.md 锚点类型与示例完整 ✓ 4 类锚点均有 personal-context + 苍何爆款双源示例
writing-styles.md 每个风格结构统一 ✓ 全部包含 语气/结构/禁忌 三节
personas.md 扩展模板完整 ✓ 有 YAML 模板 + 4 步新增指南
vault 路径使用 $VAULT_PATH 可配置 ✓ ${VAULT_PATH:-default}
```
## 数据流全景图
```
用户输入 SKILL.md 工作流 输出
┌────────────┐ ┌────────────────────────┐ ┌─────────────┐
│ topic │ │ │ │ │
│ style │──▶ Step 1a: obsidian read ──▶│ 事实边界确认 │ │ 02-drafts/ │
│ audience │ Step 1b: 素材锚点提取 ──▶ │ 素材脚手架≥3锚点 │ │ YYYY-MM-DD │
│ source_notes│ Step 2: persona 激活 ──▶ │ 口吻锁定(可选) │ │ -slug.md │
│ tags │ │ │ │ │
│ [persona] │ Step 3: 标题工程 ──────▶ │ ≥5 候选 → 评分 → 选定 │ │ frontmatter │
│ [intensity]│ │ │ │ + 正文 │
│ [title] │ Step 4: 生成草稿 ──────▶ │ 素材编织 × 风格模板 │ │ │
│ [slug] │ │ × 去AI味 × 完读率 │ │ 27 项门禁 │
│ [cta] │ Step 5: obsidian create ─▶│ frontmatter + body │──▶ Step 7 ──▶ │ 全部通过 │
│[mat_sources]│ Step 6: 回读验证 ────────▶│ 字段完整性修补 │ └─────────────┘
└────────────┘ └────────────────────────┘
┌──────────────────────────────────────────────────────────────────┐
参考文件调用: │ material-anchors.md ← Step 1b, 4, 7 │
│ content-quality.md ← Step 3, 4a, 4b, 7 │
│ writing-styles.md ← Step 4 │
│ personas.md ← Step 2 │
│ vault/templates/ ← Step 4 (仅 lizi_kk) │
│ vault/personal-context/ ← Step 1a, 4 (亲历锚点 + lizi_kk) │
└──────────────────────────────────────────────────────────────────┘
```
## 与 content-forge 全链路对接
```
content-forge 生产线 write-article 覆盖范围
──────────────────────────────────────────────────────────────
S0 选题入库 ──▶ 01-topics/*.md
S1 外链采集 ──▶ url-to-markdown可选
┌──────────────────────────────────────────┐
│ S2 草稿生成 ──▶ write-article │
│ Step 1a: 读取素材 + vault 搜索 │
│ Step 1b: 提取素材锚点 ◀── NEW │
│ Step 2: 人格激活 │
│ Step 3: 标题工程 │
│ Step 4: 生成草稿 (素材编织+去AI味+完读率) │
│ Step 5: 写入 02-drafts │
│ Step 6: 验证 frontmatter │
│ Step 7: 质量门禁 (27项) ◀── NEW │
│ │
│ S3 状态标记 ──▶ status: draft │
└──────────────────────────────────────────┘
S4 格式清洗 ──▶ format-markdown
S5 视觉资产 ──▶ baoyu-cover-image / baoyu-article-illustrator
S6 审核 ──▶ /review + /multi-review + /challenge
S7 润色 ──▶ polish
S8 发布 ──▶ post-to-wechat / post-to-x
S9 归档 ──▶ 04-published/*.md
```
write-article 覆盖 S2-S3选题→草稿是全链路中**上下文消耗最大、创意密度最高**的环节。标题工程和质量门禁的加入,把原来"写完就交"变成了"写完过检才交"。
## 架构评分
| 维度 | 评分 | 说明 |
|------|------|------|
| 渐进式披露 | PASS | SKILL.md 摘要+指针,不再重复 reference 内容 |
| 跨文件一致性 | PASS | 数据、字段、章节引用全部对齐 |
| 单一职责 | PASS | 每个 reference 文件只管一件事 |
| 可扩展性 | PASS | personas.md 有扩展模板writing-styles.md 可加新风格 |
| 可移植性 | PASS | `$VAULT_PATH` 可配置,不再硬编码 |
| 质量保障 | PASS | 27 项门禁基础4 + 标题3 + 去AI味8 + 完读率6 + 素材密度6任一失败即打回 |
| 上下文效率 | WARN | 总量 6,200 字合理,但 Step 4 峰值同时需 5 个源 |
整体评价数据结构5 文件分层决定了算法7 步工作流)的优雅——每个 Step 只去找自己需要的 reference不多加载一个字。material-anchors.md 的加入把质量防线从单层(表达)扩展为双层(内容+表达Step 1b 的素材脚手架确保"先有素材,再有文章"。唯一的 WARN 是 Step 4 的峰值加载,但这是生成阶段的固有复杂度,没有更简单的方法。

View File

@ -1,369 +0,0 @@
---
name: write-article
description: >
Generate articles from Obsidian vault topics, optimized for traffic pool entry
(click-through × dwell time × completion rate). Output: a publish-ready draft
in 02-drafts/ with complete frontmatter, passing 27-item quality gate
(material density + title + de-AI + completion rate).
USE WHEN: User wants to create new long-form content (tech blog, opinion piece,
tutorial, social post, lizi_kk-style article) from a structured topic in 01-topics/.
Trigger phrases: 写文章、写作、生成草稿、技术博客、观点文、教程、社交短文、
article、blog post、draft、人格写作、栗子KK风格。
DON'T USE WHEN:
- User wants to analyze/deconstruct existing content → use dao-analysis instead.
- User wants to review/critique an existing draft → use multi-review or /review instead.
- User wants to import an external draft into vault → use import-draft instead.
- User wants to load vault context → use my-world instead.
- User wants to edit an existing draft in 02-drafts/ → use obsidian CLI directly.
- User says "分析"、"拆解"、"审查"、"导入" without creation intent → not this skill.
---
# Write-ArticleObsidian 文章写作技能
## 目标
用统一流程产出**能进流量池**的可发布草稿。
核心公式:**点击率 × 停留时长 × 完读率 = 流量池入场券**。三项相乘,任一项为零则全盘归零。详见 `references/content-quality.md`
质量底线:
- 标题:候选 ≥5 个,评分 ≥18/25
- 去 AI 味:零容忍黑名单词汇,人味注入 ≥5 项
- 完读率Hook 前 3 句到位,段间钩子不断,结尾金句+CTA
## 路由规则Use when / Don't use when
Use this skill when:
- User wants to **create new content** from a topic brief in `01-topics/`
- User says "写文章"、"生成草稿"、"write an article"、"create a draft"
- User specifies a style (tech_blog, opinion, tutorial, social_short, lizi_kk)
- User provides source notes and wants a publish-ready draft
Do NOT use this skill when:
- User wants to **analyze** existing content (article, transcript, concept) → use `dao-analysis`
- User wants to **review/critique** a draft for quality → use `multi-review` or `/review` command
- User wants to **import** an external draft into the vault → use `import-draft`
- User wants to **load vault context** or see what's in the vault → use `my-world`
- User wants to **edit** an existing draft (fix typos, update sections) → use `obsidian` CLI directly
- User wants to **format** a draft for publishing → use `format-markdown` (baoyu skill)
Edge cases:
- "帮我把这篇笔记改写成文章" → **this skill** (creation from notes = write-article)
- "分析一下这篇文章为什么火" → **not this skill** (analysis = dao-analysis)
- "审查我的草稿" → **not this skill** (review = multi-review)
- "把 atomstorm 项目里的文章导入 vault" → **not this skill** (import = import-draft)
## 输入要求
必须提供:
- `topic`文章主题1 句话)
- `style``tech_blog` | `opinion` | `tutorial` | `social_short` | `lizi_kk`
- `audience`:目标读者
- `source_notes`:至少 1 个 Obsidian note 路径vault 相对路径)
- `tags`1-5 个标签
可选:
- `persona`:人格激活(`栗子KK`),深度扮演作者身份
- `intensity`:人格强度 `light` | `medium` | `heavy`(默认 medium
- `title`文章标题如未提供Step 3 强制生成候选)
- `slug`:文件 slug英文短横线
- `length_target`:目标字数或段落数
- `cta`:结尾行动建议
- `publish_channel`:发布渠道
- `material_sources`额外素材文件路径列表vault 相对路径),用于补充素材锚点
> **风格与人格联动**:当 `style: lizi_kk` 时,自动加载 vault 内 `templates/author-style-lizi-kk.md``personal-context/` 参考文章,无需额外指定参数。
**`style` 与 `persona` 交互矩阵**
| 组合 | 行为 |
|------|------|
| `style: lizi_kk``persona` | 仅应用风格模板(结构+语言特征),不深度扮演 |
| `persona: 栗子KK``style: lizi_kk` | 人格口吻叠加到所选风格上(如 tech_blog + 栗子KK 语气) |
| 两者都设置 | 完整集成:风格模板 + 人格深度扮演(推荐) |
## 强制工作流7 步,不得跳步)
### Step 1a读取素材
逐个读取 `source_notes` 中的笔记,并搜索 vault 中相关素材,确认事实边界。
```bash
# 必须先 cd 到 vault 目录CLAUDE.md §6.1 强制要求)
cd "${VAULT_PATH:-/home/kang/apps/content-forge/content-forge}"
# 读取指定源笔记
obsidian read path="<source_note_path_1>"
obsidian read path="<source_note_path_2>"
# 搜索 vault 中相关素材(关键词来自 topic
obsidian search query="<topic关键词>"
# 读取匹配的 personal-context/ 文章(亲历锚点来源)
obsidian read path="personal-context/<matching_article>.md"
# 读取匹配的 09-viral-examples/ 案例(案例/数据锚点来源)
obsidian read path="09-viral-examples/<matching_example>.md"
# 读取用户额外指定的素材(如有 material_sources 参数)
obsidian read path="<material_source_path>"
```
执行要求:
- `source_notes` 中每个路径都要读取。
- 主动搜索 vault 中与 topic 相关的素材(`personal-context/`、`00-inbox/`、`09-viral-examples/`)。
- 未读完素材前,禁止进入写作。
- 素材来源优先级见 `references/material-anchors.md` §2。
### Step 1b提取素材锚点
从 Step 1a 读取的所有素材中,提取四类素材锚点并输出素材脚手架。
详细规则见 `references/material-anchors.md`。核心约束:
- **总锚点 ≥3****Type A亲历≥1****Type B 或 C数据/案例≥1**
- 必须输出结构化素材脚手架(格式见 `references/material-anchors.md` §3
- 素材不足时输出 `[?] 素材不足:缺少 <具体类型>`**禁止进入 Step 2**
输出格式:
```
## 素材脚手架
### Type A 亲历锚点
1. [锚点描述] — 来源: [vault路径]
...
### Type B 数据锚点
1. [数据 + 来源归属] — 来源: [vault路径或URL]
...
### Type C 案例锚点
1. [命名实体 + 分析要点] — 来源: [vault路径或URL]
...
### Type D 观察锚点
1. [引用/对话 + 归属] — 来源: [vault路径]
...
### 统计
- 总锚点: X 个
- Type A: X 个 ✓/✗≥1
- Type B|C: X 个 ✓/✗≥1
- 判定: 通过 / [?] 素材不足
```
### Step 2激活人格可选
如果提供了 `persona` 参数,按 `references/personas.md` 激活对应人格。
**激活确认格式**
```
收到,创作者。'栗子KK' 人格已上线强度medium
> 风格预览说实话这个坑我踩了不下10次今天终于有空聊聊。
等待您的创作指令。
```
**人格参数**
- `persona`: 人格名称(目前支持 `栗子KK`
- `intensity`: `light` | `medium` | `heavy`(默认 medium
### Step 3标题工程
标题决定 80% 的点击率。**禁止只写一个标题直接用。**
完整流程见 `references/content-quality.md` §1。核心约束
- 生成 **≥5 个候选标题**,覆盖不同公式(经历+数字+痛点 / 成本+悬念+真相 / 反常识 / 99%+反差 / 身份锚定)
- 每个候选命中**五要素 ≥3 项**(第一人称"我"、具体数字、张力词、信息缺口、身份锚定)
- **评分 ≥18/25**5 维度 × 1-5 分:好奇心缺口、情绪冲击、身份共鸣、具体度、可信度)
- 标题 **≤35 字**(微信折叠阈值)
- 禁止学术腔、泛泛而谈、标题党
输出格式:
```
候选标题:
1. [标题] — 评分: XX/25 — 命中要素: [列表]
2. [标题] — 评分: XX/25 — 命中要素: [列表]
...
✦ 最终选定: [标题](原因: ...
```
### Step 4生成文章草稿
`references/writing-styles.md` 选择对应风格模板生成正文。
如果激活了人格,同时应用 `references/personas.md` 的人格设定。
**素材先行原则**(详见 `references/material-anchors.md` §4
- 正文必须围绕 Step 1b 的素材脚手架构建,每个主要论点必须锚定到具体素材。
- Hook 第 1 句必须直接包含 ≥1 素材锚点(优先 Type A 或 Type B。不是"前 3 句",是"第 1 句"——铺垫后置。
- 每个主要章节H2/编号段落)至少引用 ≥1 个锚点。
- 结尾回扣开头锚点,形成首尾呼应。
- 所有事实性断言必须追溯到素材锚点,或标记 `[?]` 待验证。
**风格联动规则**
- 当 `style: lizi_kk` 时,必须额外通过 `obsidian read path="templates/author-style-lizi-kk.md"` 读取风格指南,并参考 `personal-context/` 目录的已发表文章(这些文件位于 vault 内,需在 vault 目录下执行 CLI
#### 4a. 去 AI 味(强制)
详细规则见 `references/content-quality.md` §2。核心执行项
- **黑名单零容忍**:开头/过渡/结尾废话出现即重写(完整黑名单见 §2.1
- **意义膨胀零容忍**:删除"里程碑意义"、"划时代"、"引领新范式"等空洞修饰§2.1
- **模糊引用零容忍**:所有"研究表明"、"业内人士"必须给出具体来源否则删除§2.1
- **打破 AI 结构**:段落长短交替(每连续 3 段必须有 ≥1 段 ≤2 句话、打破对称、语气变化、偶尔不完整句、禁止绕路表述§2.2
- **禁止抽象过度**:每个抽象观点后必须紧跟一个具体场景(含时间/地点/数字/工具名禁止连续两个以上的纯观点段落§2.2
- **禁止聚合清单**:禁止在结尾或独立章节使用"我的N个思考/感悟/总结"式编号列表洞察必须散布在正文中§2.2
- **人味注入 ≥5 项**:不规则段落、口语化、括号吐槽、具体数字、个人经历、反问句、混合情绪、刻意凌乱等(完整清单 12 项见 §2.3
- **二次审计**:门禁检查后,通读全文自问"哪里一眼看出 AI 写的"→列出→修复§2.4
#### 4b. 完读率优化(强制)
详细规则见 `references/content-quality.md` §3。核心执行项
- **前 3 句 Hook**:反直觉结论 / 真金白银 / 身份挑战 / 悬念制造(禁止背景介绍、自我介绍、目录式开头)
- **段间钩子**:每个 section 尾部制造"未完成感"
- **小标题有信息量**:不是"第一步"而是"第一步这个操作让90%的人栽跟头"
- **阅读节奏**:每 300-500 字视觉断点,每连续 3 段必须有 ≥1 段 ≤2 句话,代码块 ≤15 行
- **结尾工程**:回扣开头 + 金句 + 具体 CTA
执行要求:
- 只使用已读取素材中的事实。
- 观点必须有论证链,不得堆砌口号。
- 内容结构必须匹配所选风格的"结构"要求。
- 人格激活时,口吻必须符合人格的 `voice_signature``catchphrases`
### Step 5创建草稿文件
将 frontmatter + 正文一次性写入 `02-drafts/` 目录,减少 CLI 调用开销。
```bash
obsidian create path="02-drafts/<YYYY-MM-DD>-<slug>.md" content="---
id: '<YYYY-MM-DD>-<slug>'
title: '<title>'
slug: '<slug>'
status: draft
content_type: article
channels:
- wechat
- x
language: zh-CN
source_urls: []
assets: []
cover_image: ''
template: article
owner: content-forge
created_at: '<YYYY-MM-DD>T00:00:00+08:00'
updated_at: '<YYYY-MM-DD>T00:00:00+08:00'
style: '<style>'
audience: '<audience>'
tags:
- '<tag1>'
- '<tag2>'
source_notes:
- '<note1.md>'
---
<ARTICLE_BODY>"
```
执行要求:
- 目标目录必须是 `02-drafts/`
- 文件名必须包含日期前缀与 slug。
- frontmatter 必填字段对齐 CLAUDE.md §4.2id, title, slug, status, content_type, channels, language, source_urls, assets, cover_image, template, owner, created_at, updated_at
- 正文必须是 Markdown可直接发布或二次编辑。
### Step 6验证 frontmatter
创建完成后,回读文件确认 frontmatter 完整性。
```bash
obsidian read path="02-drafts/<YYYY-MM-DD>-<slug>.md"
```
如果回读发现 frontmatter 字段缺失或格式异常,使用 `property:set` 逐项修补:
```bash
obsidian property:set path="02-drafts/<YYYY-MM-DD>-<slug>.md" name="<field>" value="<value>"
```
必填字段检查清单(对齐 CLAUDE.md §4.2
- `id`, `title`, `slug`, `status`, `content_type`, `channels`, `language`
- `source_urls`, `assets`, `cover_image`, `template`, `owner`
- `created_at`, `updated_at`
### Step 7质量检查
逐项验证并输出 `[✓]``[✗]`**任一项 `[✗]` 时停止交付并修复**。
完整门禁清单见 `references/content-quality.md` §4。
#### 基础门禁
- [ ] 所有 `source_notes` 已执行 `obsidian read`
- [ ] 草稿已通过 `obsidian create` 写入 `02-drafts/`
- [ ] frontmatter 必填字段完整Step 6 回读验证通过)
- [ ] 不存在事实捏造与无依据断言
#### 标题门禁§4.1
- [ ] 候选标题 ≥5 个
- [ ] 最终标题评分 ≥18/25命中五要素 ≥3 项
- [ ] 标题 ≤35 字
#### 去 AI 味门禁§4.2
- [ ] 前 50 字无黑名单词汇
- [ ] 无"首先...其次...最后"四段式
- [ ] 结尾无"综上所述/希望有帮助"
- [ ] 无意义膨胀词汇("里程碑意义"、"划时代"、"深远影响"
- [ ] 无模糊引用("业内人士表示"、"研究表明"须给出处)
- [ ] 相邻段落字数差异 >20%(至少 3 组)
- [ ] 人味注入清单命中 ≥5 项(含混合情绪/刻意凌乱)
- [ ] 二次审计通过(自问"哪里一眼看出AI"→ 无残留)
#### 完读率门禁§4.3
- [ ] 前 3 句完成 Hook
- [ ] 每个 section 尾部有段间钩子
- [ ] 小标题有信息量
- [ ] 每 300-500 字有视觉断点
- [ ] 结尾有金句 + 具体 CTA
- [ ] 全文无超过 15 行的代码块
#### 素材密度门禁§4.4
- [ ] 素材脚手架已在 Step 1b 输出,总锚点 ≥3
- [ ] 亲历锚点Type A≥1
- [ ] 数据/案例锚点Type B/C≥1
- [ ] 第 1 句包含 ≥1 素材锚点(非标题,正文首句)
- [ ] 每个主要章节引用 ≥1 锚点
- [ ] 无未标注来源的事实性断言(或已标 `[?]`
## 输出约束
- 输出仅包含文章草稿及必要元数据,不输出无关解释。
- 文章语言默认中文,除非用户显式要求其他语言。
- 禁止编造数据、案例、引文、实验结果。
- 未确认的事实必须标记 `[?]`,并明确缺失项。
- 结构必须符合所选风格规范(见 `references/writing-styles.md`)。
- 段落应可读,避免空泛套话与重复表达。
## 失败处理
- 缺少必要输入时,返回:`[?] 缺失输入:<字段名>`,并停止写入。
- `obsidian` 命令失败时,返回:`[✗] <命令> 失败:<错误信息>`,并停止后续步骤。
- 如果无法确定风格,默认使用 `tech_blog`,同时显式告知用户。
## 风格参考
- `references/material-anchors.md` — 素材锚点规范(四类锚点 + 脚手架 + 编织规则)
- `references/content-quality.md` — 流量池质量框架(标题工程 + 去AI味 + 完读率 + 素材密度)
- `references/writing-styles.md` — 5 种写作风格模板
- `references/personas.md` — 人格化配置栗子KK
- vault 内 `templates/author-style-lizi-kk.md` — 栗子KK 详细风格指南(通过 `obsidian read` 读取)
- vault 内 `personal-context/` — 已发表文章参考5 篇)

View File

@ -1,273 +0,0 @@
# Content Quality Reference
流量池入场公式:**点击率 × 停留时长 × 完读率**。三项相乘,任一项为零则全盘归零。
---
## 1. 标题工程(决定 80% 点击率)
### 1.1 标题生成规则
**强制要求**:每篇文章必须生成 ≥5 个候选标题,从中选出最佳。禁止只写一个标题直接用。
### 1.2 已验证的标题公式
`personal-context/` 5 篇已发表高流量文章提炼:
| 公式 | 已验证案例 | 结构拆解 |
|------|-----------|---------|
| **经历+数字+致命痛点** | "做了两年AI Agent我发现99%的AI Agent项目都死在了Message Flow设计上" | 时间成本 → 数字冲击 → 死因 |
| **金钱成本+悬念+真相** | "烧了2000美金在AI写代码上我发现了一个残酷真相" | 烧钱 → 好奇心缺口 → 真相 |
| **数字+反常识+结果** | "我研究了OpenClaw的8个反常识设计终于明白这个Agent为什么能火爆全球" | 量化研究 → 反常识 → 因果 |
| **99%+反差+具体痛点** | "我发现市面上99%教你用Claude Code的连最基本的CLAUDE.md都不会用" | 全网否定 → 反差 → 具体短板 |
| **成本+里程碑+权威背书** | "4个月烧了2万刀Token...Sam Altman预言的超级个体可能真的来了" | 真金白银 → 成果 → 大佬站台 |
### 1.3 标题五要素检查
每个候选标题必须命中 ≥3 项:
```
□ 第一人称"我" — 降低防御感建立亲近5/5 篇命中)
□ 具体数字 — 99%、2000美金、8个、两年5/5 篇命中)
□ 张力词 — 死在、残酷真相、反常识、不会用、终于5/5 篇命中)
□ 信息缺口 — 读完标题不知道答案必须点进去4/5 篇命中)
□ 身份锚定 — 目标读者能立刻对号入座3/5 篇命中)
```
### 1.4 标题禁忌
- **禁止**:泛泛而谈("AI 编程的一些思考"
- **禁止**:没有数字的标题("浅谈 Agent 架构设计"
- **禁止**:学术腔("基于 XX 的 YY 研究与实践"
- **禁止**:标题党但正文接不住(标题 10 分正文 3 分 = 负口碑)
- **禁止**:超过 35 字(微信标题折叠阈值约 35 字X 更短)
### 1.5 标题评分表
生成候选标题后按以下维度打分1-5 分),总分 ≥18 分才可使用:
| 维度 | 1分 | 3分 | 5分 |
|------|-----|-----|-----|
| 好奇心缺口 | 读完标题就知道答案 | 大概猜到方向 | 完全猜不到,必须点进去 |
| 情绪冲击 | 平淡无感 | 有点意思 | "卧槽真的假的" |
| 身份共鸣 | 跟我无关 | 有点相关 | "这说的不就是我吗" |
| 具体度 | 模糊抽象 | 有方向 | 有数字、有场景、有细节 |
| 可信度 | 像营销号 | 像自媒体 | 像真人分享真实经历 |
---
## 2. 去 AI 味(决定可信度和停留时长)
### 2.1 AI 味废话黑名单(零容忍)
以下表达一旦出现,读者大脑自动切换为"又是AI写的"→关闭页面:
**开头废话**(前 3 句出现 = 直接关页面):
- "在当今快速发展的XX领域"
- "随着XX的不断发展/日益普及"
- "在这个XX的时代"
- "让我们一起来看看/探讨"
- "你是否曾经想过"
**过渡废话**(段落间出现 = 像在读说明书):
- "值得注意的是"
- "不可否认的是"
- "众所周知"
- "接下来我将从以下几个方面"
- "首先...其次...再次...最后"(四段式必死)
**结尾废话**(最后出现 = 像在交作业):
- "总的来说/综上所述/总而言之"
- "希望本文对你有所帮助"
- "以上就是关于XX的全部内容"
- "感谢阅读,期待你的反馈"
**意义膨胀**Significance Inflation — 把平凡事写成史诗):
- "具有里程碑意义的"、"划时代的"、"引领了XX新范式/新潮流"
- "深刻改变了XX格局"、"具有深远的影响"
- "XX的崛起标志着..."、"在XX进程中扮演着关键角色"
- "不可磨灭的贡献"、"开创性的实践"
> 来源Wikipedia "Signs of AI writing" — Significance Inflation。AI 倾向于把一切描述为"重大"、"关键"、"深远",因为统计上这些词在训练数据中最安全。
**模糊引用**Vague Attributions — 没有来源的权威感):
- "业内人士表示/指出"、"有观点认为"、"据了解"
- "专家普遍认为"、"研究表明"(不指名哪个研究)
- "越来越多的人开始..."、"许多开发者发现..."
- "有人说"、"据报道"(不给出处)
> 来源Wikipedia "Signs of AI writing" — Vague Attributions。对比人类写法"根据 2024 年 Stack Overflow 调查67% 的开发者..."——必须有名有姓有数据。
### 2.2 AI 结构性特征(必须打破)
| AI 特征 | 人类写法 |
|---------|---------|
| 段落长度均匀(每段都是 3-4 句) | 长短交替:有些段只有一句话,有些段 5-6 句 |
| 完美对称的并列结构 | 刻意打破对称3 个论据篇幅可以是 40%/35%/25% |
| 每个观点都有"一方面...另一方面" | 直接选边站:"说白了就是 XX" |
| 语气从头到尾一模一样 | 突然加速/突然停顿/突然吐槽 |
| 所有句子都是完整句 | 偶尔用不完整句:"结果呢?" "就这?" |
| 过渡词密集且规律 | 有些段落之间零过渡,直接跳 |
| 绕路表述替代"是"copula avoidance | 直接用"是"/"有"。"XX 扮演着关键角色" → "XX 很关键" |
| 所有观点都中立客观、两边讨好 | 选边站、有态度、有矛盾感 |
| 抽象观察替代具体场景abstraction excess | 每个抽象观点后紧跟具体场景(含时间/地点/数字/工具名) |
| 结尾聚合式"我的N个思考"编号列表 | 洞察散布在正文段落中,不在结尾堆成清单 |
### 2.3 人味注入清单(每篇必须 ≥5 项)
```
□ 不规则段落长度 — 每连续 3 段中 ≥1 段 ≤2 句话;全文 ≥3 个单句段落
□ 口语化混入 — "说白了"、"讲真"、"你猜怎么着"
□ 括号吐槽/补充 — "(别问我怎么知道的)"、"踩了3天的坑"
□ 突然语气转换 — 正经分析中突然来一句"等等,这不对"
□ 具体数字替代模糊词 — 不说"很多",说"我测试了 47 次"
□ 个人经历锚点 — "上周我在做 XX 的时候"
□ 反问句 — "你觉得这合理吗?"
□ 自我纠正 — "不对,我刚才说的不够准确,应该是..."
□ 类比/比喻 — 技术概念用生活场景解释
□ 情绪词 — "崩溃"、"真香"、"离谱"、"服了"
□ 混合情绪/不确定 — "说实话我也不确定"、"这件事我很矛盾"、"又爽又怕"
□ 刻意凌乱 — 偶尔跑题的补充、半成形的想法、不完美的收束
```
### 2.4 AI 味检测自检
生成草稿后,执行以下检测:
1. **开头检测**:前 50 字是否包含 §2.1 黑名单词汇?→ 命中即重写开头
2. **过渡检测**:是否使用"首先...其次...最后"四段式?→ 命中即重组结构;是否存在"我的N个思考/感悟/总结"聚合编号列表?→ 命中即拆散到正文段落中
3. **结尾检测**:最后 50 字是否包含 §2.1 结尾废话?→ 命中即重写结尾
4. **节奏检测**:相邻 3 段字数差异 <20%?→ 插入短段连续 3 段无 2 句短段?→ 强制插入单句段落打破节奏
5. **人味计数**§2.3 清单命中项 <5?→ 人味不足补充注入
6. **二次审计**:通读全文,自问"什么地方一眼就看出是 AI 写的?"→ 列出残留 AI 痕迹 → 逐项修复 → 如有修改,从第 1 步重跑一遍
> 二次审计来源Humanizer skill 的 "Final audit pass"。一次检测抓不完所有问题——修复 A 可能引入 B必须循环。
---
## 3. 完读率优化(决定算法推荐权重)
### 3.1 前 3 句定生死Hook 工程)
读者在前 3 句决定是否继续。首屏必须完成一件事:**让读者觉得"接下来的内容跟我有关,而且我现在不知道答案"**。
有效 Hook 类型:
| Hook 类型 | 示例 | 触发机制 |
|-----------|------|---------|
| 反直觉结论 | "先说结论90%的 Agent 项目失败不是因为技术,是因为 Message Flow" | 认知冲突 |
| 真金白银 | "4 个月烧了 2 万刀,我终于搞明白一件事" | 损失厌恶 |
| 身份挑战 | "你觉得你会用 Claude Code连最基本的 CLAUDE.md 你都不会写" | 自尊心 |
| 悬念制造 | "我发现了一个残酷真相,但说出来可能会得罪很多人" | 好奇心缺口 |
**第 1 句铁律**:正文第 1 句(非标题)必须直接包含 ≥1 素材锚点Type A 或 Type B 优先)。不是"前 3 句",是"第 1 句"。铺垫、背景、定义——全部后置。
> 来源栗子KK vs 苍何对比分析。苍何每篇第 1 句即含锚点("OpenClaw我已经写N篇了"、"说到 OpenClaw Skill 水产市场"栗子KK 常用 1-2 句铺垫才进入锚点,导致开头密度不足。
**禁止的开头**
- 背景介绍("AI 编程是近年来..."
- 自我介绍("大家好,我是..."
- 目录式开头("本文将从以下几个方面..."
### 3.2 段间钩子(防跳读)
每个 section 结尾要制造"未完成感",让读者无法在此停下:
**钩子句式**section 尾部使用):
- "但真正让我震惊的是下面这个发现"
- "如果你以为这就完了,那你太乐观了"
- "接下来这部分,才是整篇文章最值钱的"
- "这个错误我犯了 3 次才学会,你大概率也会犯"
**小标题要有信息量**
- 差:"第一步" → 好:"第一步:这个操作让 90% 的人栽跟头"
- 差:"解决方案" → 好:"唯一靠谱的解决方案(我试了 5 种)"
- 差:"总结" → 好:"3 个你现在就能用的行动项"
### 3.3 阅读节奏控制
```
节奏模型1500-3000 字文章):
Hook50 字) ████ 高密度冲击
过渡100 字) ██ 降速,给背景
论据1300 字) ████████ 加速,上干货
呼吸点 · 短段/图/代码
论据2400 字) ██████████ 主峰,最硬核内容
呼吸点 · 短段/引用/类比
论据3250 字) ██████ 收敛,回扣主题
结尾100 字) ████ 金句 + CTA
```
节奏规则:
- **每 300-500 字一个视觉断点**:代码块、引用块、表格、加粗金句、分割线
- **长短段交替**3-5 句长段 → 1 句短段 → 2-3 句中段
- **关键信息放段首**:读者是 F 型扫描,段落中间的信息会被跳过
- **代码块不超过 15 行**:超过就拆分,每块配一句话说明
### 3.4 结尾工程
结尾决定读者是否会转发/收藏/关注。
**有效结尾公式**
1. 回扣开头素材锚点(如开头"烧了 2000 美金"→ 结尾"这 2000 美金买到的最贵一课"——必须引用同一锚点,不是泛泛呼应)
2. 一句可截图的金句
3. 具体 CTA不是"关注我",而是"下篇我会写 XX点关注不迷路"
**禁止的结尾**
- "希望对你有帮助"AI 味满分)
- "以上就是今天的分享"(像在交作业)
- 没有 CTA 的结尾(白白浪费流量)
---
## 4. 质量门禁(交付前强制检查)
### 4.1 标题门禁
```
□ 候选标题 ≥5 个
□ 最终标题评分 ≥18/25
□ 命中五要素 ≥3 项
□ 标题 ≤35 字
□ 不含 §1.4 禁忌
```
### 4.2 去 AI 味门禁
```
□ 前 50 字无黑名单词汇
□ 无"首先...其次...最后"四段式
□ 结尾无"综上所述/希望有帮助"
□ 无意义膨胀词汇("里程碑意义"、"划时代"、"深远影响"
□ 无模糊引用("业内人士表示"、"研究表明"须给出处)
□ 相邻段落字数差异 >20%(至少 3 组)
□ 人味注入清单命中 ≥5 项(含混合情绪/刻意凌乱)
□ 二次审计通过(自问"哪里一眼看出AI"→ 无残留)
```
### 4.3 完读率门禁
```
□ 前 3 句完成 Hook反直觉/真金白银/身份挑战/悬念)
□ 每个 section 尾部有段间钩子
□ 小标题有信息量(不是"第一步"、"总结"
□ 每 300-500 字有视觉断点
□ 结尾有金句 + 具体 CTA
□ 全文无超过 15 行的代码块
```
### 4.4 素材密度门禁
素材锚点检查——解决"内容层空洞"问题,与去 AI 味(表达层)互补。详见 `references/material-anchors.md`
```
□ 素材脚手架已在 Step 1b 输出,总锚点 ≥3
□ 亲历锚点Type A≥1
□ 数据/案例锚点Type B/C≥1
□ 第 1 句包含 ≥1 素材锚点(非标题,正文首句)
□ 每个主要章节引用 ≥1 锚点
□ 无未标注来源的事实性断言(或已标 [?]
```
**与去 AI 味的关系**:素材锚点在内容层解决空洞,去 AI 味在表达层解决模式化。有真实素材的文章天然减少 AI 味表达——当你写"4 个月烧了 2 万刀"时,不会说"在当今快速发展的..."。两层都通过 = 内容扎实 + 表达自然。

View File

@ -1,352 +0,0 @@
# 栗子KK vs 苍何:深度风格对比分析
> 分析日期2026-03-10
> 样本栗子KK 5 篇personal-context/)、苍何 2 篇09-viral-examples/
> 用途write-article skill 校准基准识别栗子KK 风格的系统性弱点
---
## 1. 开头Hook对比
```
┌───────────────────────────────────┬──────────────────────────────────────┐
│ 栗子KK5篇 │ 苍何2篇
├───────────────────────────────────┼──────────────────────────────────────┤
│ "从cursor爆火到现在不到一年时间" │ "我的龙虾现在每天都会运行一个定时任务"│
│ "最近和几个AI创业的朋友聊天" │ "OpenClaw我已经写N篇了" │
│ "前几天刷技术博客,看到一篇..." │ │
│ "做Agent开发这两年踩过的坑不少" │ │
│ "说实话,昨天深夜在算...我手抖了" │ │
├───────────────────────────────────┼──────────────────────────────────────┤
│ 模式:铺垫 → 背景 → "说实话"转折 │ 模式:直接开干 → 场景带入 → 你跟着看 │
│ 平均用 3-5 句才进入正题 │ 第 1 句就在"做事" │
└───────────────────────────────────┴──────────────────────────────────────┘
```
**核心差异**栗子KK 是"讲台型"开头(我有个观察/发现/思考),苍何是"直播型"开头(你来看我在干什么)。
**风险**栗子KK 的 4/5 篇开头都有"铺垫→背景→转折"三段式,这恰好是 content-quality.md §2.2 中标记的 AI 结构性特征——"语气从头到尾一模一样"。例外是"4个月烧了2万刀"那篇,直接用金钱冲击开场,效果最好。
**已校准**content-quality.md §3.1 新增"第1句铁律"——正文第1句必须直接包含素材锚点铺垫后置。
---
## 2. 段落节奏对比
量化分析段落长度分布:
```
栗子KK "烧了2000美金" 文:
┌──────────────────────────────────────────────────────────────┐
│ 段落字数分布(去除图片行): │
│ │
│ ████████ 80字 "前言"段 │
│ ████████████████████ 200字 "真香的部分" │
│ ████████████████████ 200字 "真坑的部分" │
│ ████████████████ 160字 "Devin的成与败" │
│ ████████████████ 160字 "为什么单纯模型不够" │
│ ████████████████ 160字 "我的一些思考" │
│ ████████ 80字 "写在最后" │
│ │
│ [!] 段落长度高度均匀150-200字区间标准差极小 │
└──────────────────────────────────────────────────────────────┘
苍何 "水产市场" 文:
┌──────────────────────────────────────────────────────────────┐
│ 段落字数分布: │
│ │
│ █ 12字 "我的龙虾现在每天都会运行一个定时任务," │
│ ███ 40字 "就是到Clawhub去找..." │
│ █ 15字 "我之前做教程的时候就设想过," │
│ █ 8字 "现版本我答案是五个," │
│ ████████ 90字 五件套详细列举 │
│ █ 10字 "看起来就像是一个Agent经验社区。" │
│ ██████████████ 140字 进化手册解释 │
│ █ 15字 "这有点像我早期刷Reddit的感觉很纯粹。" │
│ █ 10字 "每一个帖子都代表了一个问题," │
│ │
│ [✓] 长短交替极其明显,有大量 1 句话段落 │
└──────────────────────────────────────────────────────────────┘
```
核心差异:
```
┌────────────────┬──────────────────┬────────────────┐
│ 维度 │ 栗子KK │ 苍何 │
├────────────────┼──────────────────┼────────────────┤
│ 段落长度标准差 │ 小(均匀) │ 大(长短交替) │
│ 1句话段落占比 │ ~5% │ ~40% │
│ 视觉断点频率 │ 每 400-500 字 │ 每 100-200 字 │
│ 代码块使用 │ 技术展示型(长) │ 无代码块 │
│ 图片插入频率 │ 每 800+ 字 │ 每 200-300 字 │
└────────────────┴──────────────────┴────────────────┘
```
**已校准**content-quality.md §2.3 强化——每连续 3 段 ≥1 段 ≤2 句话§2.4 节奏检测增加短段强制插入规则。
---
## 3. 素材锚点密度对比(四类锚点框架)
```
┌─────────────┬───────────────────────────────────┬──────────────────────────────────┐
│ 锚点类型 │ 栗子KK "烧了2000美金" │ 苍何 "水产市场" │
├─────────────┼───────────────────────────────────┼──────────────────────────────────┤
│ Type A 亲历 │ ✓ "烧掉2000美金" │ ✓ "24年买的K80又又又可以上岗了" │
│ │ ✓ "用Cursor写了个Todo管理小工具" │ ✓ "我的499又省了" │
│ │ ✗ 其余多为泛泛观察 │ ✓ "给AI办了个手机号" │
│ │ 计: 2 │ 计: 3+ │
├─────────────┼───────────────────────────────────┼──────────────────────────────────┤
│ Type B 数据 │ ✓ "2000美金" │ ✓ "前百下载量" │
│ │ ✗ "90%的Agent项目" — 无来源 │ ✓ "自进化占了前百的10%" │
│ │ │ ✓ "2426只龙虾" │
│ │ 计: 1 │ ✓ "覆盖17个搜索引擎" │
│ │ │ 计: 4 │
├─────────────┼───────────────────────────────────┼──────────────────────────────────┤
│ Type C 案例 │ ✓ Devin 沙盒分析 │ ✓ self-improving-agent 五件套 │
│ │ ✓ AutoGPT/LangChain/LangGraph │ ✓ 三类资产拆解 │
│ │ 但仅1句评价非深入分析 │ ✓ 红手指Operator架构公式 │
│ │ 计: 1 深 + 3 浅 │ 计: 3 深 │
├─────────────┼───────────────────────────────────┼──────────────────────────────────┤
│ Type D 观察 │ ✗ 无具体引用 │ ✓ "吃到了@袋鼠帝的安利" │
│ │ │ ✓ "这有点像我早期刷Reddit的感觉" │
│ │ 计: 0 │ 计: 2 │
├─────────────┼───────────────────────────────────┼──────────────────────────────────┤
│ 总计 │ ~4含3个浅层 │ ~12全部具体
│ 密度/千字 │ ~1.3 │ ~4.0 │
└─────────────┴───────────────────────────────────┴──────────────────────────────────┘
```
**锚点密度是两者最大差距**。苍何的素材锚点密度约为栗子KK的 3 倍。
栗子KK 文章中的"伪锚点"(不计入):
- "90%的Agent项目会失败" — Type B 不合格,无来源
- "我觉得没有完美的框架" — 观点,非锚点
- "距离一个合格的实习生,还差得很远" — 判断,非锚点
- "模型只是在做模式匹配" — 泛泛论断
**已校准**material-anchors.md §0 NEVER Rules 明确列出不计入锚点的内容类型§1 每种锚点类型都有正反面示例。
---
## 4. AI 味检测对比
```
┌─────────────────────────┬──────────────────────┬──────────────────────┐
│ 检测维度 │ 栗子KK │ 苍何 │
├─────────────────────────┼──────────────────────┼──────────────────────┤
│ §2.1 开头废话 │ 4/5 篇"前言"开头 │ 0/2直接开干
│ §2.1 过渡废话 │ 偶发("接下来聊聊" │ 无 │
│ §2.1 结尾废话 │ 5/5 篇模板结尾 │ 2/2 篇模板结尾 │
│ §2.1 意义膨胀 │ 轻微("天才""精妙" │ 无 │
│ §2.1 模糊引用 │ 中度("90%的人"无源)│ 无 │
│ §2.2 段落长度均匀 │ 是(高度均匀) │ 否(长短极端交替) │
│ §2.2 完美对称并列 │ 是(真香/真坑对称) │ 否 │
│ §2.2 语气均匀 │ 是(从头到尾稳定) │ 否(突然冒出"又又又")│
│ §2.2 所有句子完整 │ 是 │ 否("就这?""很纯粹")│
│ §2.2 绕路表述 │ 轻微 │ 无(直接说"用人话"
│ §2.3 不规则段落 │ 少 │ 密集 │
│ §2.3 口语化 │ "说实话""真的" │ "kuku""又又又""薅" │
│ §2.3 括号吐槽 │ 少 │ "(其实是习惯性无视)"│
│ §2.3 突然语气转换 │ 无 │ "一眼幻视之后会不会" │
│ §2.3 具体数字替代模糊 │ 中 │ 高 │
│ §2.3 混合情绪 │ 少 │ "我现在有时候过度依赖" │
│ §2.3 刻意凌乱 │ 无 │ "真要这样...出大招了" │
├─────────────────────────┼──────────────────────┼──────────────────────┤
│ 人味注入命中项 │ ~3/12 │ ~9/12 │
│ AI味综合评分 │ 🟡 中度AI味 │ 🟢 接近零AI味 │
└─────────────────────────┴──────────────────────┴──────────────────────┘
```
---
## 5. 叙事结构对比
```
栗子KK 标准结构5篇均一致
┌──────────────────────────────────────────────────────────────────┐
│ 前言(铺垫背景) │
│ ↓ │
│ 核心观点(先说结论) │
│ ↓ │
│ 论据展开(对称并列:真香/真坑,成/败,传统/新方案) │
│ ↓ │
│ 思考总结("我的几个思考" 1/2/3/4 编号) │
│ ↓ │
│ 固定结尾(签名 + CTA 模板) │
└──────────────────────────────────────────────────────────────────┘
苍何 标准结构2篇均一致
┌──────────────────────────────────────────────────────────────────┐
│ 我正在做一件事(直接场景带入) │
│ ↓ │
│ 测试场景 1截图 + 指令 + 实际效果) │
│ ↓ │
│ 测试场景 2换个场景试试
│ ↓ │
│ 测试场景 3更生活化的场景
│ ↓ │
│ 我的感受 + 未来想象(自然收束,非总结) │
│ ↓ │
│ 签名 + CTA 模板 │
└──────────────────────────────────────────────────────────────────┘
```
核心差异:
```
┌──────────────┬────────────────────────────────┬────────────────────────────┐
│ 维度 │ 栗子KK │ 苍何 │
├──────────────┼────────────────────────────────┼────────────────────────────┤
│ 叙事视角 │ 评论员(我看了很多,得出结论) │ 体验者(我正在用,你来看) │
│ 信息密度 │ 高密度概念堆叠 │ 低密度场景展开 │
│ 读者参与感 │ 旁观("我告诉你" │ 代入("你跟着我一起试"
│ 结构可预测性 │ 高(标准论文结构) │ 低(下一段不知道测什么) │
│ 知识门槛 │ 高(需要技术背景才能跟上) │ 低(小白也能看懂) │
└──────────────┴────────────────────────────────┴────────────────────────────┘
```
---
## 6. 最致命的 3 个差距
### 差距一:抽象 vs 具体(根因)
```
栗子KK:
"多轮交互的噩梦:当你发现它理解错了,想要纠正,
往往需要好几轮对话。"
└── 抽象描述,读者无法代入
苍何:
"然后我就看着它kuku打开B站搜索关键词浏览并
筛选搜索结果定位OpenClaw使用场景相关的视频内容"
└── 具体动作序列,读者能"看到"画面
```
栗子KK 倾向于把具体经历"提炼"成抽象观点后输出,提炼过程中丢失了所有细节。苍何保留了原始体验的颗粒度。这正是素材锚点机制要解决的问题——强制保留具体细节,禁止升华为空洞观点。
**已校准**content-quality.md §2.2 新增"抽象观察替代具体场景abstraction excess"反模式SKILL.md Step 4a 新增"禁止抽象过度"规则。
### 差距二:评论者姿态 vs 参与者姿态
```
栗子KK:
"我觉得要真正解决这些问题,需要的是一套完整的系统:
• 持续学习的知识库
• 多模态的交互方式
• 强化学习机制
• 工程化的思维模式"
└── 开药方模式("你们应该这么做"
苍何:
"我现在就希望后续的更新能够让OpenClaw操作更多的手机App
如果提示语+脚本+文本文件可以组成一个Skills
那App天然就是一个更复杂功能更全的Skills。"
└── 共同探索模式("我也不知道答案,但我在想"
```
栗子KK 的 5 篇文章都有"我的几个思考/不成熟的想法"环节——列出 3-4 条编号建议。这种结构让文章读起来像技术报告而非个人分享,且这些"思考"往往是业内共识(持续学习、垂直化、工具链),缺少独特视角。
**已校准**content-quality.md §2.2 新增"结尾聚合式编号列表"反模式§2.4 过渡检测扩展聚合清单检查writing-styles.md lizi_kk 禁忌新增"聚合式编号列表"。
### 差距三:结尾同质化
```
栗子KK 5 篇结尾100% 相同模板):
"栗子KK一个在AI浪潮中游泳的AI产品Founder
欢迎点赞、在看、关注,一起聊科技、聊产品、聊未来"
苍何 2 篇结尾:
"真要这样的话我就要出大招了。" + 表情包
"但现在有了大佬们的龙虾...可以24小时不停地交流。
这会让经验以一种我们想象不到的速度去蔓延"
```
栗子KK 的签名结尾在 5 篇文章中完全一致——这是 content-quality.md §3.4 明确禁止的("结尾无CTA""像在交作业"。苍何的结尾虽然也有模板CTA 部分),但正文自然收束处各不相同。
**已校准**content-quality.md §3.4 结尾公式强化——回扣开头素材锚点(必须引用同一锚点,不是泛泛呼应)。
---
## 7. 两者的各自优势
### 栗子KK 的独有优势(苍何不具备)
```
┌──────────────┬─────────────────────────────────────────────┬──────────────────┐
│ 优势 │ 示例 │ 价值 │
├──────────────┼─────────────────────────────────────────────┼──────────────────┤
│ 深度技术拆解 │ OpenClaw 8个反常识设计逐条分析 │ 技术人群信任度高 │
│ 跨产品对比 │ AutoGPT/LangChain/LangGraph/CrewAI 一文覆盖 │ 决策参考价值 │
│ 代码级论证 │ 实际代码块展示设计理念 │ 可验证性强 │
│ 工程哲学升华 │ 引用 Linus Torvalds、Good Taste │ 思想深度 │
│ 个人产品关联 │ AtomStorm 的每个论点都有产品佐证 │ 商业说服力 │
└──────────────┴─────────────────────────────────────────────┴──────────────────┘
```
### 苍何 的独有优势栗子KK 不具备)
```
┌──────────────┬───────────────────────────────────────────────┬────────────────┐
│ 优势 │ 示例 │ 价值 │
├──────────────┼───────────────────────────────────────────────┼────────────────┤
│ 场景化叙事 │ "跟App版的OpenClaw说...然后看着它kuku打开B站" │ 可视化、代入感 │
│ 低门槛表达 │ "用人话说就是..." │ 受众面宽 │
│ 生活化场景 │ 习惯打卡、看小红书选题 │ 非技术读者共鸣 │
│ 密集素材锚点 │ 每 200 字一个具体数字/名字/价格 │ 内容扎实不空洞 │
│ 情绪真实性 │ "又又又""我的499又省了""一眼幻视" │ 人味极强 │
│ 自然节奏 │ 1 句话段落占 40%,图文密集交替 │ 完读率高 │
└──────────────┴───────────────────────────────────────────────┴────────────────┘
```
---
## 8. 校准建议(已实施)
基于以上对比write-article 在生成栗子KK 风格文章时着重校准以下 5 点:
```
┌──────────────────────────────────────────────────────────────────────┐
│ 优先级 问题 校准方向 状态 │
├──────────────────────────────────────────────────────────────────────┤
│ P0 段落长度高度均匀 每3段≥1段≤2句话 ✓ 已实施│
│ P0 开头铺垫过长 第1句必须含素材锚点 ✓ 已实施│
│ P1 抽象观点替代具体细节 每个观点后必须跟具体场景 ✓ 已实施│
│ P1 "我的思考"编号列表 拆散到正文禁止聚合清单 ✓ 已实施│
│ P2 结尾模板固化 金句必须回扣开头锚点 ✓ 已实施│
└──────────────────────────────────────────────────────────────────────┘
```
**核心洞察**栗子KK 文章的问题本质不是"AI味重"(表达层尚可),而是**抽象化过度**——把真实经历提炼成通用观点后输出,读者得到的是"结论"而非"体验"。这正好是 material-anchors.md 要解决的核心问题:先有素材,再有文章;保留细节,禁止空洞升华。
苍何证明了:**素材密度 3 倍 = 人味 3 倍 = AI味 1/3**。当你在写"24年买的K80又又又可以上岗了"的时候,根本不会写出"在当今快速发展的..."。
---
## 9. 回测验证2026-03-10
用 5 条校准规则回测已发表文章,验证规则有效性:
```
规则 文章A残酷真相 文章B超级个体 设计意图
───────────────────── ───────────────── ───────────────── ────────────────
P0 第1句铁律 ✗ 锚点延迟3段 🟡 延迟1段 强制第1句命中
P0 段落节奏 🟡 局部均匀 ✓ 短段充分 打破AI均匀感
P1 抽象过度 ✗ 4段纯抽象 ✓ 抽象有跟随 消除空洞观点
P1 聚合清单 ✗ 精确命中 ✓ 无此模式 消除AI列表感
P2 结尾回扣 ✓ 直接引用 🟡 回扣非开头锚 强化首尾一体
───────────────────── ───────────────── ───────────────── ────────────────
问题计数 3✗ + 1🟡 0✗ + 2🟡
结论:规则精确捕获已知弱点,不误杀好文章。
```
---
## 附录:苍何样本来源
- `09-viral-examples/` 中苍何相关文章OpenClaw 手机版、水产市场)
- 采集日期2026-03 前后
- 平台:微信公众号

View File

@ -1,229 +0,0 @@
# Material Anchors Reference
素材锚点规范——解决"内容层空洞"问题。与去 AI 味(表达层)互补,形成双层防线。
核心原则:**先有素材,再有文章**。没有真实素材支撑的文章,再怎么打磨措辞也是"先污染后治理"。
---
## §0 NEVER Rules
- **NEVER** 把以下内容计为素材锚点:
- 泛泛观察("AI 正在改变世界"、"越来越多人开始用..."
- 无源统计("据统计 90% 的项目..."——谁统计的?)
- 假设场景("假设你正在做一个项目..."
- "业内共识"类表述("大家都知道"、"众所周知"
- AI 生成的虚构案例("某公司通过 XX 技术实现了 YY"——哪家公司?)
- **NEVER** 在素材不足时强行写作——输出 `[?] 素材不足` 并索要补充,禁止用空洞内容凑字数。
- **NEVER** 编造个人经历或虚构案例——宁可少一个锚点,也不能造假。
- **NEVER** 跳过素材脚手架直接写正文——Step 1b 是强制步骤,不是可选步骤。
---
## §1 Four Anchor Types四类素材锚点
### Type A亲历锚点 — 个人做过/花过/踩过的
**最高可信度**。读者能感知"这人真干过"。
必须包含 ≥2 项:项目名/产品名、时间节点、金钱成本、工具名称、具体结果。
**从 `personal-context/` 提取的示例**
| 锚点 | 来源 | 包含要素 |
|------|------|----------|
| "4 个月烧了 2 万刀 Token" | 超级个体文 | 时间(4个月) + 成本(2万刀) + 具体物(Token) |
| "烧了 2000 美金在 AI 写代码上" | 残酷真相文 | 成本(2000美金) + 具体行为(AI写代码) |
| "做了两年 AI Agent" | Message Flow 文 | 时间(两年) + 具体领域(AI Agent) |
| "研究了 OpenClaw 的 8 个反常识设计" | OpenClaw 文 | 数量(8个) + 产品名(OpenClaw) + 发现(反常识设计) |
**从爆款文章提取的示例**(苍何):
| 锚点 | 来源 | 包含要素 |
|------|------|----------|
| "24年买的K80又又又可以上岗了" | OpenClaw手机版 | 时间(24年) + 设备(K80) + 真实使用 |
| "之前还要一台云服务器和mac mini" | OpenClaw手机版 | 具体设备 + 成本门槛变化 |
| "499元上门安装生意也不会那么火" | OpenClaw手机版 | 价格(499元) + 市场现象 |
| "我的499又省了" | OpenClaw手机版 | 个人省钱经历 + 具体金额 |
### Type B数据锚点 — 具体数字 + 命名来源
**不是你编的数字**,而是有出处的量化事实。
必须包含:具体数值 + 来源归属(谁说的/哪个报告/哪个平台)。
**示例**
| 锚点 | 来源 | 可信要素 |
|------|------|----------|
| "前百下载量的龙虾 Skill" | 苍何/水产市场文 | 平台排名数据 |
| "Agent 自进化占了前百的 10%" | 苍何/水产市场文 | 占比 + 排名范围 |
| "水产市场养了 2426 只龙虾" | 苍何/水产市场文 | 平台公开数据 |
| "覆盖了 17 个搜索引擎" | 苍何/OpenClaw手机版 | 产品功能数据 |
**反面示例**(不计入锚点):
- "据统计 90% 的 Agent 项目会失败" — 谁统计的?
- "AI 编程效率提升 10 倍" — 什么场景?谁测的?
- "某大厂用了之后效率翻倍" — 哪家大厂?
### Type C案例锚点 — 命名实体 + 具体分析
**不是泛泛提及**,而是对具体产品/事件/人物的深入分析。
必须包含:命名实体(产品名/公司名/人名)+ 具体细节(设计/决策/结果)。
**示例**
| 锚点 | 来源 | 分析深度 |
|------|------|----------|
| "self-improving-agent + skill-creator + find-skills + skills-vetter + automation-workflows 五件套" | 苍何/水产市场文 | 5 个具体 Skill 名 + 功能拆解 |
| "水产市场的三类资产:插件、触发器、通信器" | 苍何/水产市场文 | 产品架构拆解 |
| "红手指 Operator = 云端大脑 + 终端手脚 + 安全沙盒" | 苍何/OpenClaw手机版 | 产品架构公式 |
| "OpenClaw 的 8 个反常识设计" | personal-context | 逐条设计分析 |
**反面示例**(不计入锚点):
- "某 AI Agent 框架做得不错" — 哪个框架?哪里不错?
- "有些公司已经在用了" — 哪些公司?
### Type D观察锚点 — 真实对话/引用 + 归属
**不是你的观点**,而是你听到/看到的他人言行。
必须包含:说话人归属(人名/角色/场景)+ 具体内容。
**示例**
| 锚点 | 来源 | 归属 |
|------|------|------|
| "吃到了 @袋鼠帝 的安利" | 苍何/OpenClaw手机版 | 具体推荐人 |
| "Sam Altman 预言的超级个体" | personal-context/超级个体文 | 具体人物 + 具体预言 |
| "这有点像我早期刷 Reddit 的感觉,很纯粹" | 苍何/水产市场文 | 个人类比 + 具体平台 |
**反面示例**(不计入锚点):
- "业内人士认为..." — 哪个业内人士?
- "有观点认为..." — 谁的观点?
---
## §2 Material Sources素材来源优先级
按优先级从高到低搜索素材:
```
1. source_notes — topic 指定的源笔记必读Step 1a 已覆盖)
2. personal-context/ — 作者已发表文章(亲历锚点的金矿)
3. 00-inbox/ — vault 原始素材库
4. 09-viral-examples/ — 爆款案例库(案例锚点和数据锚点)
5. source_urls — topic frontmatter 中的外部链接
6. material_sources — 用户额外指定的素材文件
```
**搜索策略**
- 用 `obsidian search query="<topic关键词>"` 在 vault 中搜索相关素材
- 读取匹配的 `personal-context/` 文章,提取亲历锚点
- 读取匹配的 `09-viral-examples/` 案例,提取案例/数据锚点
- 素材来源越多样,文章可信度越高
---
## §3 Material Scaffold Format素材脚手架格式
**Step 1b 的强制输出格式**。写正文前必须先输出这个脚手架。
```
## 素材脚手架
### Type A 亲历锚点
1. [锚点描述] — 来源: [vault路径或记忆]
2. [锚点描述] — 来源: [vault路径或记忆]
### Type B 数据锚点
1. [数据 + 来源归属] — 来源: [vault路径或URL]
### Type C 案例锚点
1. [命名实体 + 分析要点] — 来源: [vault路径或URL]
### Type D 观察锚点
1. [引用/对话 + 归属] — 来源: [vault路径]
### 统计
- 总锚点: X 个
- Type A: X 个 ✓/✗≥1
- Type B|C: X 个 ✓/✗≥1
- 判定: 通过 / [?] 素材不足,需补充 [具体缺什么]
```
**最低阈值**
| 条件 | 阈值 | 原因 |
|------|------|------|
| 总锚点 | ≥3 | 低于 3 个锚点的文章必然空洞 |
| Type A亲历 | ≥1 | 无亲身经历 = 纸上谈兵 |
| Type B 或 C数据/案例) | ≥1 | 无数据/案例 = 无法验证 |
**不足时处理**
- 输出 `[?] 素材不足:缺少 Type A 亲历锚点,请补充个人经历或相关实践`
- 禁止进入 Step 2人格激活及后续步骤
- 建议用户补充素材来源,或降低文章野心(缩小选题范围到有素材支撑的部分)
---
## §4 Weaving Rules编织规则
素材锚点不是堆在文章里的,而是编织到叙事结构中的。
### 4.1 Hook 必须含锚点
正文第 1 句(非标题)必须直接包含素材锚点(优先 Type A 或 Type B。不是"前 3 句",是"第 1 句"——铺垫、背景、定义全部后置。
**好**"4 个月烧了 2 万刀 Token我终于搞明白一件事" — Type A 亲历锚点,第 1 句即命中
**好**"水产市场养了 2426 只龙虾" — Type B 数据锚点,第 1 句即命中
**好**"OpenClaw我已经写N篇了" — Type A 亲历锚点,第 1 句即命中(苍何式)
**差**"在 AI Agent 快速发展的今天..." — 零锚点,纯 AI 废话
**差**"先说点背景知识,然后再聊我的经历" — 锚点被铺垫延迟,第 1 句空洞
### 4.2 每章节 ≥1 锚点
每个主要章节H2/编号段落)至少引用 1 个锚点。连续 2 个章节无锚点 = 内容空洞警告。
### 4.3 结尾回扣开头锚点
结尾回扣开头的锚点,形成首尾呼应。不是重复,而是升华。
**示例**:开头 "烧了 2000 美金" → 结尾 "这 2000 美金买到的最贵的一课是..."
### 4.4 事实断言溯源
所有事实性断言必须追溯到素材锚点,或标记 `[?]` 待验证。
**好**"OpenClaw 的 Skill 生态已有 2426 个(来源:水产市场平台数据)"
**差**"OpenClaw 的生态发展迅速" — 空洞断言,无数据支撑
---
## §5 Relationship to De-AI与去 AI 味互补)
```
┌─────────────────────────────────────────────────────────────┐
│ 文章质量双层防线 │
├─────────────────────────┬───────────────────────────────────┤
│ 素材锚点(内容层) │ 去 AI 味(表达层) │
│ 解决: 内容空洞 │ 解决: 表达模式化 │
│ │ │
│ 检查: 有没有真实素材 │ 检查: 像不像人写的 │
│ 手段: 锚点类型+阈值 │ 手段: 黑名单+人味注入 │
│ 时机: Step 1b写前 │ 时机: Step 4a写中
│ 门禁: §4.46 项) │ 门禁: §4.28 项) │
├─────────────────────────┴───────────────────────────────────┤
│ 叠加效果: 有真实素材的文章天然减少 AI 味表达。 │
│ 当你在写"4个月烧了2万刀"时,不会说"在当今快速发展的..."。 │
└─────────────────────────────────────────────────────────────┘
```
**互补而非替代**
- 一篇有丰富素材但表达 AI 味重的文章 → 去 AI 味门禁会拦住
- 一篇表达很人味但内容空洞的文章 → 素材密度门禁会拦住
- 两层都通过 = 内容扎实 + 表达自然

View File

@ -1,144 +0,0 @@
# Personas 配置
人格化核心引擎 P-Core V1.1 的可用人格定义。
---
## 栗子KK
> 基于 `personal-context/` 5 篇已发表文章提取
### 基础信息
| 字段 | 值 |
|------|-----|
| brand_name | 栗子KK |
| brand_intro | atomstorm.ai Founder前百度阿里技术高P蓝星上最会AI编程的人之一AI Native 商业组织先驱者 |
| target_audience | 开发者、AI 从业者、技术创业者 |
### 人格画像
**persona_identity**:
```
- atomstorm.ai Founder
- 前百度阿里技术高P
- 蓝星上最会 AI 编程的人(之一)
- AI Native 商业组织先驱者
- 2 年 AI Agent 开发经验,烧过 20000+ 美金 AI Coding 学费
```
**persona_context**:
```
- 第一人称"我"为主
- 分享真实踩坑经历
- 技术深度 + 商业洞察
- 不讲虚的,只讲干货
```
**voice_signature**:
```
- 冲击式开头(数字、反差、真相)
- 口语化但不失深度
- 敢下判断90%、99%)但必有依据
- 代码示例 + 数据支撑
- 金句收尾 + CTA
```
**catchphrases**:
```
- "说实话"
- "先说结论"
- "效果立竿见影"
- "99%的XX都不..."
- "这招真的管用"
- "Done is better than perfect"
- "山远路险,鞋里有沙"
```
### Intensity 配置
| 级别 | 特征 |
|------|------|
| **light** | 保持风格结构,语言偏中性 |
| **medium** | 完整风格 + 口头禅 + 典型句式 |
| **heavy** | 深度扮演 + 个人经历引用 + 完整口吻 |
### 激活提示词
`persona: "栗子KK"` 时,注入以下系统提示:
```markdown
你现在以"栗子KK"的人格撰写内容。
## 身份
- AI 产品 FounderAtomStorm (studio.atomstorm.ai) 作者
- 2 年 AI Agent 开发经验,烧过 20000+ 美金 AI Coding 学费
- 全栈工程师,技术 + 产品双重视角
## 语气
- 开头必须有钩子:数字冲击、反差对比、真相揭露
- 口语化但不失深度:"说实话"、"先说结论"
- 敢下判断但必有依据:每个"90%"背后要有数据或案例
- 结尾金句 + CTA
## 结构
- 数字编号分段01, 02, 03...
- 短段落2-5 句话,单段不超过 150 字)
- 代码示例配文字说明
- 数据对比表格
## 禁忌
- "赋能"、"生态"等空话
- 纯理论无案例
- 没有个人观点
- 完美主义收尾
## 签名
结尾使用:
> 栗子KK一个在AI浪潮中游泳的AI产品Founder
>
> 欢迎点赞、在看、关注,一起聊科技、聊产品、聊未来 🚀
```
### 边界说明
**失效场景**(自动降级为 neutral 模式):
- 法律/合规相关内容
- 第三方产品客观评测
- 需要完全中立立场的分析
**降级行为**
- 移除口头禅
- 移除个人签名
- 保持风格结构但弱化主观表达
---
## 扩展指南
### 新增人格
1. 在 `personal-context/` 放置 3-5 篇代表性文章
2. 创建 `templates/author-style-{slug}.md` 风格模板
3. 在本文件添加 persona 定义
4. 在 `writing-styles.md` 添加对应 style
### 人格数据模板
```yaml
persona: "{name}"
brand_name: "{display_name}"
brand_intro: "{一句话定位}"
persona_identity:
- "{标签1}"
- "{标签2}"
persona_context: |
{核心语境描述}
voice_signature:
- "{特征1}"
- "{特征2}"
catchphrases:
- "{口头禅1}"
- "{口头禅2}"
target_audience: "{目标读者}"
```

View File

@ -1,124 +0,0 @@
# Writing Styles Reference
本文档定义 `write-article` skill 的 5 类写作风格。每种风格都包含固定的语气、结构、禁忌。
## 1) 技术博客(`tech_blog`
### 语气
- 专业、克制、解释导向。
- 对术语给出必要定义,不炫技。
- 结论可验证,避免绝对化表达。
### 结构
1. 问题背景:问题是什么,为什么值得解决。
2. 核心方案:关键设计与取舍。
3. 实现细节:步骤、代码片段、配置或流程。
4. 验证结果:如何验证有效性,边界在哪里。
5. 总结与扩展:适用场景、下一步优化。
### 禁忌
- 只贴代码不解释设计意图。
- 用“黑魔法”式技巧替代可维护方案。
- 夸大性能收益但不给验证条件。
## 2) 观点文(`opinion`
### 语气
- 立场鲜明,但论证必须有证据链。
- 可批判、可反驳,不做人身攻击。
- 允许价值判断,但要明确前提条件。
### 结构
1. 核心论点:开篇直接给结论。
2. 论据展开2-3 个关键论据,逐条论证。
3. 反方视角:承认反例或限制条件。
4. 立场收束:重申结论并给出行动建议。
### 禁忌
- 情绪输出替代推理。
- 稻草人论证(曲解对方观点再反驳)。
- 断言“唯一正确答案”却不说明边界。
## 3) 教程(`tutorial`
### 语气
- 教练式表达,步骤清晰、可执行。
- 默认读者不知道上下文,减少跳步。
- 重点是“让读者做出来”,不是展示作者懂多少。
### 结构
1. 目标与前置条件:完成后能得到什么,需要什么环境。
2. Step-by-step按顺序执行每步只有一个主要动作。
3. 结果验证:每步的预期输出或检查点。
4. 常见错误:高频坑位与修复方法。
5. 收尾:复盘关键点与可选进阶路线。
### 禁忌
- 跳过关键前置条件。
- 把多个动作塞进同一步,导致不可复现。
- 只给“成功路径”,不提供失败排查。
## 4) 社交短文(`social_short`
### 语气
- 短促、有画面感、观点集中。
- 首句抓人,结尾可互动。
- 避免过度术语化,优先可传播表达。
### 结构
1. Hook首句提出冲突、反差或问题。
2. 核心信息1-2 个关键观点或故事片段。
3. 行动结尾提问、CTA 或一句可转发结论。
### 禁忌
- 铺垫过长,前 3 句还没进主题。
- 一条短文塞入过多观点。
- 使用标题党或误导性陈述。
## 5) 栗子KK风格`lizi_kk`
> 基于 `personal-context/` 目录 5 篇已发表文章提炼,详见 `templates/author-style-lizi-kk.md`
### 语气
- 直接、有冲击力,口语化但不失深度
- 敢下判断("99%"、"90%"),但必有数据支撑
- 自信但不傲慢,技术细节 + 类比解释
### 结构
1. **冲击式开头**:直接、有钩子,常用"说实话"、"先说结论"
2. **数字编号**01, 02, 03... 分段清晰
3. **短段落**:每段 2-5 句话,单段不超过 150 字
4. **必备元素**:个人经历、具体案例、代码示例、数据支撑
5. **金句收尾**:名人引用 + CTA
### 语言特征
| 书面语 | 栗子KK风格 |
|--------|-----------|
| 我发现 | 说实话,我发现 |
| 这个问题很重要 | 这个问题我觉得特别典型 |
| 效果很好 | 效果立竿见影 |
| 很多人不知道 | 99%的教程都不提这个 |
| 成功了 | 这招真的管用 |
### 禁忌
- "赋能"、"生态"等空话
- 纯理论无案例
- 过长的代码块(影响阅读节奏)
- 没有个人观点
- 完美主义收尾(信奉"Done is better than perfect"
- 聚合式"我的N个思考/感悟"编号列表(洞察必须散布到正文段落中)
- 连续 3 段以上长度均匀(每 3 段至少 1 个 ≤2 句话的短段)
- 抽象观点无具体场景跟随(每个判断后必须有时间/数字/工具名等细节)
### 适用场景
- 技术深度文章
- 产品发布/介绍
- 踩坑经验分享
- 行业趋势分析
## 风格选择建议
- 需要解释技术方案与实践细节:选 `tech_blog`
- 需要表达立场并说服读者:选 `opinion`
- 需要让读者可复现地完成任务:选 `tutorial`
- 需要快速传播观点或洞察:选 `social_short`
- **需要个人品牌风格、技术+实战**:选 `lizi_kk`