# 干净状态检查清单

在提交前和每次会话结束时运行此清单。

## 构建与测试

- [ ] `python -m pytest --tb=short -q` 全部通过
- [ ] `python -m mypy src/ --ignore-missing-imports` 无类型错误
- [ ] `ruff check src/` 无 lint 警告

## 代码质量

- [ ] 无残留的 `print()` 调试语句
- [ ] 无残留的 `breakpoint()` 或 `pdb` 调用
- [ ] 无 `# TODO` 标记未在 progress 中记录的内容
- [ ] 所有新函数都有类型注解

## 安全

- [ ] `.env` 文件不在 git 暂存区
- [ ] 无 API key 或密钥硬编码在源码中
- [ ] `.gitignore` 包含 `venv/`、`__pycache__/`、`.env`

## 状态管理

- [ ] `claude-progress.md` 已更新为当前状态
- [ ] `feature_list.json` 反映实际的功能状态
- [ ] 无未记录的半完成步骤

## 仓库

- [ ] `git status` 中无意外文件
- [ ] 下一个会话可以直接运行 `./init.sh` 继续工作


File created successfully at: /root/projects/learn-harness-engineering/templates/standard/clean-state-checklist.md

# 干净状态检查清单

在提交前和每次会话结束时运行此清单。

## 构建与测试

- [ ] `python -m pytest --tb=short -q` 全部通过
- [ ] `python -m mypy src/ --ignore-missing-imports` 无类型错误
- [ ] `ruff check src/` 无 lint 警告

## 代码质量

- [ ] 无残留的 `print()` 调试语句
- [ ] 无残留的 `breakpoint()` 或 `pdb` 调用
- [ ] 无 `# TODO` 标记未在 progress 中记录的内容
- [ ] 所有新函数都有类型注解

## 安全

- [ ] `.env` 文件不在 git 暂存区
- [ ] 无 API key 或密钥硬编码在源码中
- [ ] `.gitignore` 包含 `venv/`、`__pycache__/`、`.env`

## 状态管理

- [ ] `claude-progress.md` 已更新为当前状态
- [ ] `feature_list.json` 反映实际的功能状态
- [ ] 无未记录的半完成步骤

## 仓库

- [ ] `git status` 中无意外文件
- [ ] 下一个会话可以直接运行 `./init.sh` 继续工作


Write

# 架构文档

本文件是系统的顶层地图。保持简洁，需要时指向更深入的文档。

## 系统形状

- 产品：{{项目名称}}
- 主要用户工作流：{{主要工作流描述}}
- 运行时表面：{{cli / web / api / desktop}}
- 产品行为的真实来源：本文件 + `feature_list.json`

## 模块地图

| 模块 | 职责 | 主要入口 | 关联规格 |
|------|------|----------|----------|
| `src/{{模块a}}/` | {{职责描述}} | {{入口文件}} | {{规格路径}} |
| `src/{{模块b}}/` | {{职责描述}} | {{入口文件}} | {{规格路径}} |

## 层级模型

使用固定的方向性模型，防止 agent 发明临时架构：

```
types → config → repo → service → api → cli/ui
```

低层不得依赖高层。跨层关注点应通过显式的 provider 或 adapter 边界进入。

## 硬依赖规则

- 低层模块不得导入高层模块。
- CLI/UI 不得绕过 service 层的契约。
- 数据访问必须通过 repository 或等效适配器。
- 共享工具必须保持通用，不得积累领域逻辑。
- 新依赖应在相关计划或设计文档中说明理由。

## 热点区域

- {{最难安全修改的区域}}
- {{边界薄弱或测试脆弱的区域}}

## 变更检查清单

当你触及架构相关代码时：

1. 如果模块地图或允许的边界发生变化，更新本文件。
2. 如果推理发生变化，更新相关设计文档。
3. 如果规则应该被机械地执行，添加或更新可执行检查。


File created successfully at: /root/projects/learn-harness-engineering/templates/standard/docs/ARCHITECTURE.md

# 架构文档

本文件是系统的顶层地图。保持简洁，需要时指向更深入的文档。

## 系统形状

- 产品：{{项目名称}}
- 主要用户工作流：{{主要工作流描述}}
- 运行时表面：{{cli / web / api / desktop}}
- 产品行为的真实来源：本文件 + `feature_list.json`

## 模块地图

| 模块 | 职责 | 主要入口 | 关联规格 |
|------|------|----------|----------|
| `src/{{模块a}}/` | {{职责描述}} | {{入口文件}} | {{规格路径}} |
| `src/{{模块b}}/` | {{职责描述}} | {{入口文件}} | {{规格路径}} |

## 层级模型

使用固定的方向性模型，防止 agent 发明临时架构：

```
types → config → repo → service → api → cli/ui
```

低层不得依赖高层。跨层关注点应通过显式的 provider 或 adapter 边界进入。

## 硬依赖规则

- 低层模块不得导入高层模块。
- CLI/UI 不得绕过 service 层的契约。
- 数据访问必须通过 repository 或等效适配器。
- 共享工具必须保持通用，不得积累领域逻辑。
- 新依赖应在相关计划或设计文档中说明理由。

## 热点区域

- {{最难安全修改的区域}}
- {{边界薄弱或测试脆弱的区域}}

## 变更检查清单

当你触及架构相关代码时：

1. 如果模块地图或允许的边界发生变化，更新本文件。
2. 如果推理发生变化，更新相关设计文档。
3. 如果规则应该被机械地执行，添加或更新可执行检查。


{
  "permissions": {
    "allow": [
      "Bash(python:*)",
      "Bash(python3:*)",
      "Bash(pip install:*)",
      "Bash(pip3 install:*)",
      "Bash(python -m pytest:*)",
      "Bash(python -m mypy:*)",
      "Bash(ruff:*)",
      "Bash(git init:*)",
      "Bash(git add:*)",
      "Bash(git commit:*)",
      "Bash(git log:*)",
      "Bash(git diff:*)",
      "Bash(git status:*)",
      "Bash(git stash:*)",
      "Bash(git branch:*)",
      "Bash(git checkout:*)",
      "Bash(git switch:*)",
      "Bash(wc -l:*)",
      "Bash(chmod +x:*)"
    ],
    "deny": [
      "Read(venv/**)",
      "Read(__pycache__/**)",
      "Read(.git/**)",
      "Read(node_modules/**)"
    ]
  }
}


{
  "hooks": {
    "PreCommit": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "python -m pytest --tb=short -q && ruff check src/"
          }
        ]
      }
    ]
  }
}


File created successfully at: /root/projects/learn-harness-engineering/templates/standard/.claude/settings.json

Bash(python:*)
Bash(python3:*)
Bash(pip install:*)
Bash(pip3 install:*)
Bash(python -m pytest:*)
Bash(python -m mypy:*)
Bash(ruff:*)
Bash(git init:*)
Bash(git add:*)
Bash(git commit:*)
Bash(git log:*)
Bash(git diff:*)
Bash(git status:*)
Bash(git stash:*)
Bash(git branch:*)
Bash(git checkout:*)
Bash(git switch:*)
Bash(wc -l:*)
Bash(chmod +x:*)


File created successfully at: /root/projects/learn-harness-engineering/templates/standard/.claude/hooks.json

python -m pytest --tb=short -q && ruff check src/


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: b678dc93-efeb-4116-9b4b-0f14274d4343, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402034444284953761RkBgqn8r) (request id: 202604021144277465393830XwqgrSj)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: eca88240-4fc4-4a94-bc6a-3c9c22db7b79, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402034503253368234NLrhZdch) (request id: 20260402114446700262100oMaqDXjn)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 0729b684-f5cf-4898-8663-62b5b10e4c38, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402034524222079785F0qhsEEx) (request id: 20260402114505828515178t2lEaCWl)


Bash

Make init.sh executable


(Bash completed with no output)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402034637969095726cnBqGqPl) (request id: 20260402114620172269383pwFvjX7T)


Updated task #5 status


Updated task #6 status


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402034718972736609RfFyuftx) (request id: 20260402114700679412567jaCBqRBM)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: b678dc93-efeb-4116-9b4b-0f14274d4343, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402034740101478417h4lFevJR) (request id: 20260402114721593540058CGbrj1e0)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402034759461296344LiA4juOE) (request id: 20260402114742946805615lwinuJmh)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: eca88240-4fc4-4a94-bc6a-3c9c22db7b79, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402034817137240125Q0B9ZMzI) (request id: 20260402114803708865622r8Eqhnq9)


standard/ 完成。现在创建 full/ — 先写核心文件（与 standard 相同的增强版），再写新增文件：


Write

# CLAUDE.md

你正在一个为长期实现工作而设计的仓库中工作。
优先考虑可靠的完成、跨会话的连续性和明确的验证，而不是速度。

## 启动循环

每次会话开始时：

1. 运行 `pwd` 确认在正确的仓库根目录。
2. 读取 `claude-progress.md` 获取最新验证状态和下一步。
3. 读取 `feature_list.json` 选择最高优先级未完成功能。
4. 运行 `git log --oneline -5` 查看最近提交。
5. 运行 `./init.sh`。
6. 在开始新工作前运行基线验证。

如果基线验证已经失败，先修复它。不要在破损的起始状态上堆积新功能。

## Python 标准

- **类型注解**：所有函数参数和返回值必须有类型注解。
- **数据校验**：使用 Pydantic 模型，不使用裸字典。
- **文档字符串**：Google 风格，简洁。
- **文件路径**：使用 `pathlib`，不使用 `os.path`。
- **依赖管理**：`requirements.txt` 或 `pyproject.toml`。
- **安全**：不要在终端输出 API key 或密钥。
- **上下文**：不要读取 `venv/`、`node_modules/` 或大数据文件。

## TDD 工作流

- 实现任何逻辑之前，先写或确认失败的测试用例。
- 使用 `pytest` 作为默认测试框架。
- 测试文件放在 `tests/` 目录，与 `src/` 结构对应。
- 运行 `python -m pytest --tb=short -q` 验证。
- 目标测试覆盖率 80% 以上。

## Human-in-the-Loop 协议（强制）

生成超过 20 行或修改核心逻辑的代码后，必须自动执行：

1. **自我解释**：简要说明改了什么、为什么改。
2. **结构检查**：是否引入了新依赖？是否改变了函数签名？
3. **风险评估**：这个变更最可能破坏什么？
4. **验证计划**：告诉用户应该运行哪个命令来验证。

## 工作规则

- 一次只做一个功能。
- 不要仅因为添加了代码就标记功能完成。
- 保持变更在所选功能范围内，除非阻塞迫使进行窄范围的支持性修复。
- 不要在实现过程中悄悄更改验证规则。
- 优先使用持久化仓库制品而非聊天摘要。

## 架构约束

项目遵循 `docs/ARCHITECTURE.md` 中定义的层级模型和依赖规则。
修改代码前，确认你了解当前模块属于哪个层级。

提交前运行 `bash scripts/check-architecture.sh` 检查架构违规。

## 运行时可观测性

如果项目有结构化日志，调试时检查：
- 服务初始化事件
- API 调用及其参数
- 关键路径执行记录
- 错误和异常详情

## 技能引用

### 功能重叠领域只用 Superpowers
- 设计/头脑风暴 → superpowers:brainstorming
- 编写/执行计划 → superpowers:writing-plans / executing-plans
- TDD → superpowers:test-driven-development
- 代码审查 → superpowers:requesting-code-review
- 调试 → superpowers:systematic-debugging
- 验证 → superpowers:verification-before-completion

### 特定技术审查用 ECC
- Python 审查 → everything-claude-code:python-review
- 安全审计 → everything-claude-code:security-review
- 数据库审查 → everything-claude-code:database-review

## 路由地图

- `docs/ARCHITECTURE.md`：模块地图、层级模型、依赖规则
- `quality-document.md`：各领域和层级的健康评分
- `feature_list.json`：功能状态的唯一真实来源
- `claude-progress.md`：会话日志和当前验证状态
- `clean-state-checklist.md`：提交前仓库健康检查
- `evaluator-rubric.md`：工作质量评估标准

## 自定义命令

- `/check`：运行完整验证（pytest + mypy + ruff）
- `/status`：查看项目当前状态摘要
- `/handoff`：生成会话交接文档

## 必需制品

- `feature_list.json`：功能状态的唯一真实来源
- `claude-progress.md`：会话日志和当前验证状态
- `init.sh`：标准启动和验证路径
- `session-handoff.md`：大型会话的紧凑交接
- `clean-state-checklist.md`：提交前仓库健康检查

## 完成定义

一个功能只有在以下条件全部满足时才算完成：

- 目标行为已实现
- 必需的验证实际运行了
- 证据记录在 `feature_list.json` 或 `claude-progress.md` 中
- 仓库可从标准启动路径重新启动
- `scripts/check-architecture.sh` 无违规

## 会话结束前

1. 更新 `claude-progress.md`。
2. 更新 `feature_list.json`。
3. 记录任何未解决的风险或阻塞。
4. 运行 `bash scripts/check-architecture.sh`。
5. 如果任何领域或层级有显著变化，更新 `quality-document.md`。
6. 在工作处于安全状态时提交，附带描述性消息。
7. 使仓库足够干净，下一个会话可以直接运行 `./init.sh`。


File created successfully at: /root/projects/learn-harness-engineering/templates/full/CLAUDE.md

# CLAUDE.md

你正在一个为长期实现工作而设计的仓库中工作。
优先考虑可靠的完成、跨会话的连续性和明确的验证，而不是速度。

## 启动循环

每次会话开始时：

1. 运行 `pwd` 确认在正确的仓库根目录。
2. 读取 `claude-progress.md` 获取最新验证状态和下一步。
3. 读取 `feature_list.json` 选择最高优先级未完成功能。
4. 运行 `git log --oneline -5` 查看最近提交。
5. 运行 `./init.sh`。
6. 在开始新工作前运行基线验证。

如果基线验证已经失败，先修复它。不要在破损的起始状态上堆积新功能。

## Python 标准

- **类型注解**：所有函数参数和返回值必须有类型注解。
- **数据校验**：使用 Pydantic 模型，不使用裸字典。
- **文档字符串**：Google 风格，简洁。
- **文件路径**：使用 `pathlib`，不使用 `os.path`。
- **依赖管理**：`requirements.txt` 或 `pyproject.toml`。
- **安全**：不要在终端输出 API key 或密钥。
- **上下文**：不要读取 `venv/`、`node_modules/` 或大数据文件。

## TDD 工作流

- 实现任何逻辑之前，先写或确认失败的测试用例。
- 使用 `pytest` 作为默认测试框架。
- 测试文件放在 `tests/` 目录，与 `src/` 结构对应。
- 运行 `python -m pytest --tb=short -q` 验证。
- 目标测试覆盖率 80% 以上。

## Human-in-the-Loop 协议（强制）

生成超过 20 行或修改核心逻辑的代码后，必须自动执行：

1. **自我解释**：简要说明改了什么、为什么改。
2. **结构检查**：是否引入了新依赖？是否改变了函数签名？
3. **风险评估**：这个变更最可能破坏什么？
4. **验证计划**：告诉用户应该运行哪个命令来验证。

## 工作规则

- 一次只做一个功能。
- 不要仅因为添加了代码就标记功能完成。
- 保持变更在所选功能范围内，除非阻塞迫使进行窄范围的支持性修复。
- 不要在实现过程中悄悄更改验证规则。
- 优先使用持久化仓库制品而非聊天摘要。

## 架构约束

项目遵循 `docs/ARCHITECTURE.md` 中定义的层级模型和依赖规则。
修改代码前，确认你了解当前模块属于哪个层级。

提交前运行 `bash scripts/check-architecture.sh` 检查架构违规。

## 运行时可观测性

如果项目有结构化日志，调试时检查：
- 服务初始化事件
- API 调用及其参数
- 关键路径执行记录
- 错误和异常详情

## 技能引用

### 功能重叠领域只用 Superpowers
- 设计/头脑风暴 → superpowers:brainstorming
- 编写/执行计划 → superpowers:writing-plans / executing-plans
- TDD → superpowers:test-driven-development
- 代码审查 → superpowers:requesting-code-review
- 调试 → superpowers:systematic-debugging
- 验证 → superpowers:verification-before-completion

### 特定技术审查用 ECC
- Python 审查 → everything-claude-code:python-review
- 安全审计 → everything-claude-code:security-review
- 数据库审查 → everything-claude-code:database-review

## 路由地图

- `docs/ARCHITECTURE.md`：模块地图、层级模型、依赖规则
- `quality-document.md`：各领域和层级的健康评分
- `feature_list.json`：功能状态的唯一真实来源
- `claude-progress.md`：会话日志和当前验证状态
- `clean-state-checklist.md`：提交前仓库健康检查
- `evaluator-rubric.md`：工作质量评估标准

## 自定义命令

- `/check`：运行完整验证（pytest + mypy + ruff）
- `/status`：查看项目当前状态摘要
- `/handoff`：生成会话交接文档

## 必需制品

- `feature_list.json`：功能状态的唯一真实来源
- `claude-progress.md`：会话日志和当前验证状态
- `init.sh`：标准启动和验证路径
- `session-handoff.md`：大型会话的紧凑交接
- `clean-state-checklist.md`：提交前仓库健康检查

## 完成定义

一个功能只有在以下条件全部满足时才算完成：

- 目标行为已实现
- 必需的验证实际运行了
- 证据记录在 `feature_list.json` 或 `claude-progress.md` 中
- 仓库可从标准启动路径重新启动
- `scripts/check-architecture.sh` 无违规

## 会话结束前

1. 更新 `claude-progress.md`。
2. 更新 `feature_list.json`。
3. 记录任何未解决的风险或阻塞。
4. 运行 `bash scripts/check-architecture.sh`。
5. 如果任何领域或层级有显著变化，更新 `quality-document.md`。
6. 在工作处于安全状态时提交，附带描述性消息。
7. 使仓库足够干净，下一个会话可以直接运行 `./init.sh`。


{
  "project": "{{项目名称}}",
  "description": "{{项目描述}}",
  "last_updated": "YYYY-MM-DD",
  "rules": {
    "single_active_feature": true,
    "passing_requires_evidence": true,
    "do_not_skip_verification": true
  },
  "status_legend": {
    "not_started": "工作尚未开始。",
    "in_progress": "该功能是当前的活跃任务。",
    "blocked": "工作无法继续，直到已记录的阻塞被解决。",
    "passing": "必需的验证已通过，证据已记录。"
  },
  "features": [
    {
      "id": "F01",
      "priority": 1,
      "area": "{{功能领域}}",
      "title": "{{功能标题}}",
      "user_visible_behavior": "{{用户可见的行为描述}}",
      "status": "not_started",
      "verification": [
        "运行 python -m pytest tests/test_xxx.py -v",
        "确认测试全部通过",
        "手动验证功能行为"
      ],
      "evidence": [],
      "notes": ""
    }
  ]
}


File created successfully at: /root/projects/learn-harness-engineering/templates/full/feature_list.json

{{项目描述}}

该功能是当前的活跃任务。

工作无法继续，直到已记录的阻塞被解决。

必需的验证已通过，证据已记录。

{{功能标题}}

{{用户可见的行为描述}}

运行 python -m pytest tests/test_xxx.py -v


#!/usr/bin/env bash
# {{项目名称}} — 标准启动脚本
# 用法: ./init.sh

set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$ROOT_DIR"

echo "==> 工作目录: $PWD"

# ── 依赖安装 ──────────────────────────────────────────────
echo "==> 同步依赖"
if [ -f "requirements.txt" ]; then
  pip install -r requirements.txt -q
elif [ -f "pyproject.toml" ]; then
  pip install -e ".[dev]" -q
else
  echo "    [跳过] 未找到 requirements.txt 或 pyproject.toml"
fi

# ── 基线验证 ──────────────────────────────────────────────
echo "==> 运行基线测试"
python -m pytest --tb=short -q

# ── 类型检查 ──────────────────────────────────────────────
if command -v mypy &> /dev/null; then
  echo "==> 运行类型检查"
  python -m mypy src/ --ignore-missing-imports || echo "    [警告] mypy 发现类型错误"
fi

# ── lint 检查 ─────────────────────────────────────────────
if command -v ruff &> /dev/null; then
  echo "==> 运行 lint 检查"
  ruff check src/ || echo "    [警告] ruff 发现 lint 问题"
fi

# ── 架构约束检查 ──────────────────────────────────────────
if [ -f "scripts/check-architecture.sh" ]; then
  echo "==> 运行架构约束检查"
  bash scripts/check-architecture.sh || echo "    [警告] 发现架构违规"
fi

echo "==> 启动完成。基线状态已验证。"


File created successfully at: /root/projects/learn-harness-engineering/templates/full/init.sh

#!/usr/bin/env bash
# {{项目名称}} — 标准启动脚本
# 用法: ./init.sh

set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$ROOT_DIR"

echo "==> 工作目录: $PWD"

# ── 依赖安装 ──────────────────────────────────────────────
echo "==> 同步依赖"
if [ -f "requirements.txt" ]; then
  pip install -r requirements.txt -q
elif [ -f "pyproject.toml" ]; then
  pip install -e ".[dev]" -q
else
  echo "    [跳过] 未找到 requirements.txt 或 pyproject.toml"
fi

# ── 基线验证 ──────────────────────────────────────────────
echo "==> 运行基线测试"
python -m pytest --tb=short -q

# ── 类型检查 ──────────────────────────────────────────────
if command -v mypy &> /dev/null; then
  echo "==> 运行类型检查"
  python -m mypy src/ --ignore-missing-imports || echo "    [警告] mypy 发现类型错误"
fi

# ── lint 检查 ─────────────────────────────────────────────
if command -v ruff &> /dev/null; then
  echo "==> 运行 lint 检查"
  ruff check src/ || echo "    [警告] ruff 发现 lint 问题"
fi

# ── 架构约束检查 ──────────────────────────────────────────
if [ -f "scripts/check-architecture.sh" ]; then
  echo "==> 运行架构约束检查"
  bash scripts/check-architecture.sh || echo "    [警告] 发现架构违规"
fi

echo "==> 启动完成。基线状态已验证。"


# 进度日志

## 当前验证状态

- 仓库根目录：{{项目路径}}
- 标准启动路径：`./init.sh`
- 标准验证路径：`python -m pytest --tb=short -q`
- 当前最高优先级未完成功能：
- 当前阻塞：无

## 会话记录

### 会话 001

- 日期：
- 目标：
- 完成内容：
- 运行的验证：
- 捕获的证据：
- 提交记录：
- 更新的文件或制品：
- 已知风险或未解决的问题：
- 下一步最佳行动：

### 会话 002

- 日期：
- 目标：
- 完成内容：
- 运行的验证：
- 捕获的证据：
- 提交记录：
- 更新的文件或制品：
- 已知风险或未解决的问题：
- 下一步最佳行动：


File created successfully at: /root/projects/learn-harness-engineering/templates/full/claude-progress.md

# 进度日志

## 当前验证状态

- 仓库根目录：{{项目路径}}
- 标准启动路径：`./init.sh`
- 标准验证路径：`python -m pytest --tb=short -q`
- 当前最高优先级未完成功能：
- 当前阻塞：无

## 会话记录

### 会话 001

- 日期：
- 目标：
- 完成内容：
- 运行的验证：
- 捕获的证据：
- 提交记录：
- 更新的文件或制品：
- 已知风险或未解决的问题：
- 下一步最佳行动：

### 会话 002

- 日期：
- 目标：
- 完成内容：
- 运行的验证：
- 捕获的证据：
- 提交记录：
- 更新的文件或制品：
- 已知风险或未解决的问题：
- 下一步最佳行动：


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: eca88240-4fc4-4a94-bc6a-3c9c22db7b79, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402034947218021500ZJujhG4r) (request id: 2026040211493270310655TS813R8U)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 0729b684-f5cf-4898-8663-62b5b10e4c38, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035002954623587vr7ZFs66) (request id: 20260402114949410878610ZUjyBMTD)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: eca88240-4fc4-4a94-bc6a-3c9c22db7b79, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 2026040203501996689292674Q0jfyu) (request id: 20260402115005869460052OVXVyAdB)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 2026040203503886035647mtiJt3aL) (request id: 20260402115024326161599HS9ZfWnL)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 2026040203505664600343727JNSzYM) (request id: 20260402115044182874607RknVola3)


现在创建 full/ 的 standard 继承文件和新增文件：


# 会话交接

## 当前已验证的状态

- 正在工作的内容：
- 实际运行的验证：

## 本次会话的变更

- 添加的代码或行为：
- 基础设施或 harness 的变更：

## 未完成或未验证的内容

- 已知缺陷：
- 未验证的路径：
- 下一个会话的风险：

## 下一步最佳行动

- 最高优先级未完成功能：
- 为什么它是下一个：
- 什么算作通过：
- 在此步骤中不得改变什么：

## 关键命令

- 启动：`./init.sh`
- 验证：`python -m pytest --tb=short -q`
- 架构检查：`bash scripts/check-architecture.sh`
- 完整检查：使用 `/check` 命令
- 聚焦调试命令：


File created successfully at: /root/projects/learn-harness-engineering/templates/full/session-handoff.md

# 会话交接

## 当前已验证的状态

- 正在工作的内容：
- 实际运行的验证：

## 本次会话的变更

- 添加的代码或行为：
- 基础设施或 harness 的变更：

## 未完成或未验证的内容

- 已知缺陷：
- 未验证的路径：
- 下一个会话的风险：

## 下一步最佳行动

- 最高优先级未完成功能：
- 为什么它是下一个：
- 什么算作通过：
- 在此步骤中不得改变什么：

## 关键命令

- 启动：`./init.sh`
- 验证：`python -m pytest --tb=short -q`
- 架构检查：`bash scripts/check-architecture.sh`
- 完整检查：使用 `/check` 命令
- 聚焦调试命令：


# 干净状态检查清单

在提交前和每次会话结束时运行此清单。

## 构建与测试

- [ ] `python -m pytest --tb=short -q` 全部通过
- [ ] `python -m mypy src/ --ignore-missing-imports` 无类型错误
- [ ] `ruff check src/` 无 lint 警告
- [ ] 测试覆盖率 >= 80%

## 架构

- [ ] `bash scripts/check-architecture.sh` 无违规
- [ ] 无跨层违规的 import
- [ ] 新模块已在 `docs/ARCHITECTURE.md` 中记录

## 代码质量

- [ ] 无残留的 `print()` 调试语句
- [ ] 无残留的 `breakpoint()` 或 `pdb` 调用
- [ ] 无 `# TODO` 标记未在 progress 中记录的内容
- [ ] 所有新函数都有类型注解
- [ ] 所有公开 API 都有文档字符串

## 运行时验证

- [ ] 应用/服务可以正常启动
- [ ] 关键路径执行无错误
- [ ] 日志输出正常（如果有结构化日志）

## 安全

- [ ] `.env` 文件不在 git 暂存区
- [ ] 无 API key 或密钥硬编码在源码中
- [ ] `.gitignore` 包含 `venv/`、`__pycache__/`、`.env`

## 数据完整性

- [ ] 测试数据与 fixture 保持一致
- [ ] 无损坏的配置文件

## 状态管理

- [ ] `claude-progress.md` 已更新为当前状态
- [ ] `feature_list.json` 反映实际的功能状态
- [ ] `quality-document.md` 如有变化已更新
- [ ] 无未记录的半完成步骤

## 仓库

- [ ] `git status` 中无意外文件
- [ ] 提交消息描述性清晰
- [ ] 下一个会话可以直接运行 `./init.sh` 继续工作


File created successfully at: /root/projects/learn-harness-engineering/templates/full/clean-state-checklist.md

# 干净状态检查清单

在提交前和每次会话结束时运行此清单。

## 构建与测试

- [ ] `python -m pytest --tb=short -q` 全部通过
- [ ] `python -m mypy src/ --ignore-missing-imports` 无类型错误
- [ ] `ruff check src/` 无 lint 警告
- [ ] 测试覆盖率 >= 80%

## 架构

- [ ] `bash scripts/check-architecture.sh` 无违规
- [ ] 无跨层违规的 import
- [ ] 新模块已在 `docs/ARCHITECTURE.md` 中记录

## 代码质量

- [ ] 无残留的 `print()` 调试语句
- [ ] 无残留的 `breakpoint()` 或 `pdb` 调用
- [ ] 无 `# TODO` 标记未在 progress 中记录的内容
- [ ] 所有新函数都有类型注解
- [ ] 所有公开 API 都有文档字符串

## 运行时验证

- [ ] 应用/服务可以正常启动
- [ ] 关键路径执行无错误
- [ ] 日志输出正常（如果有结构化日志）

## 安全

- [ ] `.env` 文件不在 git 暂存区
- [ ] 无 API key 或密钥硬编码在源码中
- [ ] `.gitignore` 包含 `venv/`、`__pycache__/`、`.env`

## 数据完整性

- [ ] 测试数据与 fixture 保持一致
- [ ] 无损坏的配置文件

## 状态管理

- [ ] `claude-progress.md` 已更新为当前状态
- [ ] `feature_list.json` 反映实际的功能状态
- [ ] `quality-document.md` 如有变化已更新
- [ ] 无未记录的半完成步骤

## 仓库

- [ ] `git status` 中无意外文件
- [ ] 提交消息描述性清晰
- [ ] 下一个会话可以直接运行 `./init.sh` 继续工作


# 架构文档

本文件是系统的顶层地图。保持简洁，需要时指向更深入的文档。

## 系统形状

- 产品：{{项目名称}}
- 主要用户工作流：{{主要工作流描述}}
- 运行时表面：{{cli / web / api / desktop}}
- 产品行为的真实来源：本文件 + `feature_list.json`

## 模块地图

| 模块 | 职责 | 主要入口 | 关联规格 |
|------|------|----------|----------|
| `src/{{模块a}}/` | {{职责描述}} | {{入口文件}} | {{规格路径}} |
| `src/{{模块b}}/` | {{职责描述}} | {{入口文件}} | {{规格路径}} |

## 层级模型

使用固定的方向性模型，防止 agent 发明临时架构：

```
types → config → repo → service → api → cli/ui
```

低层不得依赖高层。跨层关注点应通过显式的 provider 或 adapter 边界进入。

## 硬依赖规则

- 低层模块不得导入高层模块。
- CLI/UI 不得绕过 service 层的契约。
- 数据访问必须通过 repository 或等效适配器。
- 共享工具必须保持通用，不得积累领域逻辑。
- 新依赖应在相关计划或设计文档中说明理由。

## 热点区域

- {{最难安全修改的区域}}
- {{边界薄弱或测试脆弱的区域}}

## 变更检查清单

当你触及架构相关代码时：

1. 如果模块地图或允许的边界发生变化，更新本文件。
2. 如果推理发生变化，更新相关设计文档。
3. 如果规则应该被机械地执行，添加或更新可执行检查。


File created successfully at: /root/projects/learn-harness-engineering/templates/full/docs/ARCHITECTURE.md


# 质量文档

各产品领域和架构层的质量快照。Agent 和人类都可以用此文档快速了解代码库的强项和需要改进的地方。

**更新频率：** 每次重要会话后，或开始新工作阶段前。

**评分标准：**

- **A**：所有验证通过，架构干净，agent 可读，测试稳定
- **B**：验证通过，基本干净，可读性或测试覆盖有小缺口
- **C**：部分工作，已知差距，某些代码区域 agent 难以理解
- **D**：不工作，或有重大结构问题

---

## 产品领域

| 领域 | 等级 | 验证状态 | Agent 可读性 | 测试稳定性 | 关键差距 | 最后更新 |
|------|------|----------|-------------|-----------|----------|----------|
| {{领域1}} | - | - | - | - | - | - |
| {{领域2}} | - | - | - | - | - | - |
| {{领域3}} | - | - | - | - | - | - |

## 架构层

| 层级 | 等级 | 边界执行 | Agent 可读性 | 关键差距 | 最后更新 |
|------|------|----------|-------------|----------|----------|
| {{层级1}} | - | - | - | - | - |
| {{层级2}} | - | - | - | - | - |
| {{层级3}} | - | - | - | - | - |

## 变更历史

### YYYY-MM-DD

- 变更内容：
- 升级的领域：
- 降级的领域：
- 新发现的差距：
- 已关闭的差距：


File created successfully at: /root/projects/learn-harness-engineering/templates/full/quality-document.md

# 质量文档

各产品领域和架构层的质量快照。Agent 和人类都可以用此文档快速了解代码库的强项和需要改进的地方。

**更新频率：** 每次重要会话后，或开始新工作阶段前。

**评分标准：**

- **A**：所有验证通过，架构干净，agent 可读，测试稳定
- **B**：验证通过，基本干净，可读性或测试覆盖有小缺口
- **C**：部分工作，已知差距，某些代码区域 agent 难以理解
- **D**：不工作，或有重大结构问题

---

## 产品领域

| 领域 | 等级 | 验证状态 | Agent 可读性 | 测试稳定性 | 关键差距 | 最后更新 |
|------|------|----------|-------------|-----------|----------|----------|
| {{领域1}} | - | - | - | - | - | - |
| {{领域2}} | - | - | - | - | - | - |
| {{领域3}} | - | - | - | - | - | - |

## 架构层

| 层级 | 等级 | 边界执行 | Agent 可读性 | 关键差距 | 最后更新 |
|------|------|----------|-------------|----------|----------|
| {{层级1}} | - | - | - | - | - |
| {{层级2}} | - | - | - | - | - |
| {{层级3}} | - | - | - | - | - |

## 变更历史

### YYYY-MM-DD

- 变更内容：
- 升级的领域：
- 降级的领域：
- 新发现的差距：
- 已关闭的差距：


# 评估评分卡

在实现完成后、最终验收前使用此评分卡。

| 类别 | 问题 | 得分 (0-2) | 备注 |
|------|------|-----------|------|
| 正确性 | 实现的行为是否与请求的功能匹配？ |  |  |
| 验证 | 必需的检查是否实际运行了，并有证据？ |  |  |
| 范围纪律 | 会话是否保持在所选功能范围内？ |  |  |
| 可靠性 | 结果能否经受重启或重新运行而无需修复？ |  |  |
| 可维护性 | 代码和文档对下一个会话是否足够清晰？ |  |  |
| 交接准备度 | 新会话能否仅从仓库制品继续工作？ |  |  |

**评分标准：**
- **2**：完全满足，无需改进
- **1**：基本满足，有小缺口
- **0**：不满足或缺失

## 判定

- [ ] 接受
- [ ] 修订
- [ ] 阻塞

## 必需的后续行动

- 缺失的证据：
- 必需的修复：
- 下一次审查触发条件：


File created successfully at: /root/projects/learn-harness-engineering/templates/full/evaluator-rubric.md

# 评估评分卡

在实现完成后、最终验收前使用此评分卡。

| 类别 | 问题 | 得分 (0-2) | 备注 |
|------|------|-----------|------|
| 正确性 | 实现的行为是否与请求的功能匹配？ |  |  |
| 验证 | 必需的检查是否实际运行了，并有证据？ |  |  |
| 范围纪律 | 会话是否保持在所选功能范围内？ |  |  |
| 可靠性 | 结果能否经受重启或重新运行而无需修复？ |  |  |
| 可维护性 | 代码和文档对下一个会话是否足够清晰？ |  |  |
| 交接准备度 | 新会话能否仅从仓库制品继续工作？ |  |  |

**评分标准：**
- **2**：完全满足，无需改进
- **1**：基本满足，有小缺口
- **0**：不满足或缺失

## 判定

- [ ] 接受
- [ ] 修订
- [ ] 阻塞

## 必需的后续行动

- 缺失的证据：
- 必需的修复：
- 下一次审查触发条件：


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035220551129907RlSXSJvI) (request id: 20260402115212938884906Vpp8mBHv)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035231361840050z8Dqey29) (request id: 20260402115223262515974Ory3nwDb)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035241559458860iUbJgdwJ) (request id: 20260402115234309404284cdMc5406)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035253678404792hAo8UCNf) (request id: 20260402115246131513224NIvB6h7N)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: eca88240-4fc4-4a94-bc6a-3c9c22db7b79, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035307312484040hWO7QmXt) (request id: 20260402115300588375966zBYUXHUl)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: b678dc93-efeb-4116-9b4b-0f14274d4343, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035326203436396LKofqdwZ) (request id: 20260402115317798718327GFToEcvt)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035358157555041RygPA8Cs) (request id: 20260402115346358039749wmkvsm79)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: eca88240-4fc4-4a94-bc6a-3c9c22db7b79, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 202604020354465849650798BH35mBu) (request id: 20260402115438875303644JpSiFKBt)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035533135862752T8Cq3kse) (request id: 20260402115524159575718VzaAryaJ)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035625361376367fKkf4HsE) (request id: 20260402115614368172882BURQXUNA)


API Error: 429 {"error":{"type":"new_api_error","message":"This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402035710379994457sAVzN6j4) (request id: 20260402115703558509922aZ33mKS7)"},"type":"error"}


重试


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: b678dc93-efeb-4116-9b4b-0f14274d4343, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045457776146448drkj2jnb) (request id: 20260402125456120853704ltrpWc34)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045501951750632XwXwnRiv) (request id: 20260402125501575760038WW7jIxPo)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045507341310118MEBUahOK) (request id: 20260402125506115423643yrD2mBT4)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045512569478129A05E551R) (request id: 20260402125512334148364GGtNX9gj)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045520908735053lC5Sd9cy) (request id: 202604021255204291504386E8uniSa)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: ecba28c9-2dc3-4392-9918-1c89d59f8d6b, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045535317520349CoFtLfG2) (request id: 20260402125533900396134kVK2Z1ay)


The user said "重试" (retry). They want me to retry the last operation. Let me continue creating the remaining files for the full/ directory - the scripts, .claude/ config, commands, and skills. Then proceed to the README and verification.


继续创建 full/ 的 scripts/、.claude/ 配置、commands 和 skills：


#!/usr/bin/env bash
# 架构约束自动检查
# 用法: bash scripts/check-architecture.sh

set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

ERRORS=0

echo "==> 检查架构约束"

# ── 检查循环导入 ──────────────────────────────────────────
echo "    检查循环导入..."
if command -v python &> /dev/null; then
  # 使用 Python AST 简单检测可疑的循环引用模式
  python -c "
import ast, sys, os
from pathlib import Path

src = Path('src')
if not src.exists():
    sys.exit(0)

modules = {}
for f in src.rglob('*.py'):
    if f.name == '__init__.py':
        continue
    try:
        tree = ast.parse(f.read_text())
        imports = []
        for node in ast.walk(tree):
            if isinstance(node, ast.ImportFrom) and node.module:
                imports.append(node.module)
        modules[str(f)] = imports
    except SyntaxError:
        print(f'    [警告] 语法错误: {f}')

# 简单的双向引用检测
for f1, imps1 in modules.items():
    for f2, imps2 in modules.items():
        if f1 >= f2:
            continue
        m1 = str(Path(f1).with_suffix('')).replace('/', '.')
        m2 = str(Path(f2).with_suffix('')).replace('/', '.')
        if any(m2.endswith(i) or i.endswith(m2.split('.')[-1]) for i in imps1) and \
           any(m1.endswith(i) or i.endswith(m1.split('.')[-1]) for i in imps2):
            print(f'    [可疑] 可能的循环引用: {f1} <-> {f2}')
" || true
fi

# ── 检查敏感文件 ──────────────────────────────────────────
echo "    检查敏感文件..."
if git ls-files --cached | grep -qE '\.env$|credentials|secret'; then
  echo "    [错误] 发现敏感文件在 git 追踪中:"
  git ls-files --cached | grep -E '\.env$|credentials|secret'
  ERRORS=$((ERRORS + 1))
fi

# ── 检查调试代码残留 ──────────────────────────────────────
echo "    检查调试代码残留..."
if [ -d "src" ]; then
  DEBUG_HITS=$(grep -rn "breakpoint()\|pdb\.set_trace()\|import pdb" src/ 2>/dev/null || true)
  if [ -n "$DEBUG_HITS" ]; then
    echo "    [错误] 发现调试代码残留:"
    echo "$DEBUG_HITS"
    ERRORS=$((ERRORS + 1))
  fi
fi

# ── 检查 .gitignore 基本项 ────────────────────────────────
echo "    检查 .gitignore..."
if [ -f ".gitignore" ]; then
  for pattern in "venv" "__pycache__" ".env"; do
    if ! grep -q "$pattern" .gitignore; then
      echo "    [警告] .gitignore 缺少 $pattern"
    fi
  done
else
  echo "    [警告] 未找到 .gitignore 文件"
fi

# ── 汇总 ─────────────────────────────────────────────────
echo ""
if [ $ERRORS -gt 0 ]; then
  echo "==> 发现 $ERRORS 个架构违规。请修复后再提交。"
  exit 1
else
  echo "==> 架构检查通过。"
  exit 0
fi


File created successfully at: /root/projects/learn-harness-engineering/templates/full/scripts/check-architecture.sh

#!/usr/bin/env bash
# 架构约束自动检查
# 用法: bash scripts/check-architecture.sh

set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

ERRORS=0

echo "==> 检查架构约束"

# ── 检查循环导入 ──────────────────────────────────────────
echo "    检查循环导入..."
if command -v python &> /dev/null; then
  # 使用 Python AST 简单检测可疑的循环引用模式
  python -c "
import ast, sys, os
from pathlib import Path

src = Path('src')
if not src.exists():
    sys.exit(0)

modules = {}
for f in src.rglob('*.py'):
    if f.name == '__init__.py':
        continue
    try:
        tree = ast.parse(f.read_text())
        imports = []
        for node in ast.walk(tree):
            if isinstance(node, ast.ImportFrom) and node.module:
                imports.append(node.module)
        modules[str(f)] = imports
    except SyntaxError:
        print(f'    [警告] 语法错误: {f}')

# 简单的双向引用检测
for f1, imps1 in modules.items():
    for f2, imps2 in modules.items():
        if f1 >= f2:
            continue
        m1 = str(Path(f1).with_suffix('')).replace('/', '.')
        m2 = str(Path(f2).with_suffix('')).replace('/', '.')
        if any(m2.endswith(i) or i.endswith(m2.split('.')[-1]) for i in imps1) and \
           any(m1.endswith(i) or i.endswith(m1.split('.')[-1]) for i in imps2):
            print(f'    [可疑] 可能的循环引用: {f1} <-> {f2}')
" || true
fi

# ── 检查敏感文件 ──────────────────────────────────────────
echo "    检查敏感文件..."
if git ls-files --cached | grep -qE '\.env$|credentials|secret'; then
  echo "    [错误] 发现敏感文件在 git 追踪中:"
  git ls-files --cached | grep -E '\.env$|credentials|secret'
  ERRORS=$((ERRORS + 1))
fi

# ── 检查调试代码残留 ──────────────────────────────────────
echo "    检查调试代码残留..."
if [ -d "src" ]; then
  DEBUG_HITS=$(grep -rn "breakpoint()\|pdb\.set_trace()\|import pdb" src/ 2>/dev/null || true)
  if [ -n "$DEBUG_HITS" ]; then
    echo "    [错误] 发现调试代码残留:"
    echo "$DEBUG_HITS"
    ERRORS=$((ERRORS + 1))
  fi
fi

# ── 检查 .gitignore 基本项 ────────────────────────────────
echo "    检查 .gitignore..."
if [ -f ".gitignore" ]; then
  for pattern in "venv" "__pycache__" ".env"; do
    if ! grep -q "$pattern" .gitignore; then
      echo "    [警告] .gitignore 缺少 $pattern"
    fi
  done
else
  echo "    [警告] 未找到 .gitignore 文件"
fi

# ── 汇总 ─────────────────────────────────────────────────
echo ""
if [ $ERRORS -gt 0 ]; then
  echo "==> 发现 $ERRORS 个架构违规。请修复后再提交。"
  exit 1
else
  echo "==> 架构检查通过。"
  exit 0
fi


#!/usr/bin/env bash
# 会话结束自动清理
# 用法: bash scripts/session-cleanup.sh

set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

echo "==> 会话结束清理"

# ── 运行测试 ──────────────────────────────────────────────
echo "==> [1/4] 运行测试"
python -m pytest --tb=short -q
TEST_RESULT=$?

# ── 运行 lint ─────────────────────────────────────────────
echo "==> [2/4] 运行 lint"
if command -v ruff &> /dev/null; then
  ruff check src/ || true
fi

# ── 运行类型检查 ──────────────────────────────────────────
echo "==> [3/4] 运行类型检查"
if command -v mypy &> /dev/null; then
  python -m mypy src/ --ignore-missing-imports || true
fi

# ── 架构检查 ──────────────────────────────────────────────
echo "==> [4/4] 运行架构检查"
if [ -f "scripts/check-architecture.sh" ]; then
  bash scripts/check-architecture.sh || true
fi

# ── 提醒 ─────────────────────────────────────────────────
echo ""
echo "========================================="
echo "  会话结束提醒"
echo "========================================="
echo "  [ ] claude-progress.md 是否已更新？"
echo "  [ ] feature_list.json 是否反映实际状态？"
echo "  [ ] quality-document.md 是否需要更新？"
echo "  [ ] 是否有未提交的安全工作？"
echo "========================================="

if [ $TEST_RESULT -ne 0 ]; then
  echo ""
  echo "  [警告] 测试未全部通过！请修复后再结束会话。"
fi


File created successfully at: /root/projects/learn-harness-engineering/templates/full/scripts/session-cleanup.sh

#!/usr/bin/env bash
# 会话结束自动清理
# 用法: bash scripts/session-cleanup.sh

set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

echo "==> 会话结束清理"

# ── 运行测试 ──────────────────────────────────────────────
echo "==> [1/4] 运行测试"
python -m pytest --tb=short -q
TEST_RESULT=$?

# ── 运行 lint ─────────────────────────────────────────────
echo "==> [2/4] 运行 lint"
if command -v ruff &> /dev/null; then
  ruff check src/ || true
fi

# ── 运行类型检查 ──────────────────────────────────────────
echo "==> [3/4] 运行类型检查"
if command -v mypy &> /dev/null; then
  python -m mypy src/ --ignore-missing-imports || true
fi

# ── 架构检查 ──────────────────────────────────────────────
echo "==> [4/4] 运行架构检查"
if [ -f "scripts/check-architecture.sh" ]; then
  bash scripts/check-architecture.sh || true
fi

# ── 提醒 ─────────────────────────────────────────────────
echo ""
echo "========================================="
echo "  会话结束提醒"
echo "========================================="
echo "  [ ] claude-progress.md 是否已更新？"
echo "  [ ] feature_list.json 是否反映实际状态？"
echo "  [ ] quality-document.md 是否需要更新？"
echo "  [ ] 是否有未提交的安全工作？"
echo "========================================="

if [ $TEST_RESULT -ne 0 ]; then
  echo ""
  echo "  [警告] 测试未全部通过！请修复后再结束会话。"
fi


{
  "permissions": {
    "allow": [
      "Bash(python:*)",
      "Bash(python3:*)",
      "Bash(pip install:*)",
      "Bash(pip3 install:*)",
      "Bash(python -m pytest:*)",
      "Bash(python -m mypy:*)",
      "Bash(ruff:*)",
      "Bash(bash scripts/:*)",
      "Bash(git init:*)",
      "Bash(git add:*)",
      "Bash(git commit:*)",
      "Bash(git log:*)",
      "Bash(git diff:*)",
      "Bash(git status:*)",
      "Bash(git stash:*)",
      "Bash(git branch:*)",
      "Bash(git checkout:*)",
      "Bash(git switch:*)",
      "Bash(wc -l:*)",
      "Bash(chmod +x:*)"
    ],
    "deny": [
      "Read(venv/**)",
      "Read(__pycache__/**)",
      "Read(.git/**)",
      "Read(node_modules/**)"
    ]
  }
}


{
  "hooks": {
    "PreCommit": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "python -m pytest --tb=short -q && ruff check src/ && bash scripts/check-architecture.sh"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Edit",
        "hooks": [
          {
            "type": "notification",
            "message": "提醒：如果修改了核心逻辑，请确认已先写了对应的测试用例（TDD 工作流）。"
          }
        ]
      }
    ]
  }
}


File created successfully at: /root/projects/learn-harness-engineering/templates/full/.claude/settings.json

Bash(python:*)
Bash(python3:*)
Bash(pip install:*)
Bash(pip3 install:*)
Bash(python -m pytest:*)
Bash(python -m mypy:*)
Bash(ruff:*)
Bash(bash scripts/:*)
Bash(git init:*)
Bash(git add:*)
Bash(git commit:*)
Bash(git log:*)
Bash(git diff:*)
Bash(git status:*)
Bash(git stash:*)
Bash(git branch:*)
Bash(git checkout:*)
Bash(git switch:*)
Bash(wc -l:*)
Bash(chmod +x:*)


File created successfully at: /root/projects/learn-harness-engineering/templates/full/.claude/hooks.json

python -m pytest --tb=short -q && ruff check src/ && bash scripts/check-architecture.sh

提醒：如果修改了核心逻辑，请确认已先写了对应的测试用例（TDD 工作流）。


现在创建 commands 和 skills：


运行完整的项目验证检查，汇总结果。

请按顺序执行以下检查并汇总报告：

1. **测试**：`python -m pytest --tb=short -q`
2. **类型检查**：`python -m mypy src/ --ignore-missing-imports`
3. **Lint**：`ruff check src/`
4. **架构约束**：`bash scripts/check-architecture.sh`

对每项检查报告：通过/失败 + 关键问题（如有）。

最后给出一个总体状态：全部通过 / 有问题需修复。


查看当前项目状态摘要。

请执行以下步骤并生成简洁的状态报告：

1. 读取 `feature_list.json`，统计各状态的功能数量。
2. 读取 `claude-progress.md`，提取当前验证状态和最近的会话记录。
3. 运行 `git log --oneline -5` 查看最近提交。
4. 运行 `git status` 查看未提交的变更。

输出格式：
```
## 项目状态摘要

### 功能进度
- 通过: X / 总计: Y
- 进行中: ...
- 未开始: ...
- 阻塞: ...

### 最近提交
...

### 未提交变更
...

### 下一步
...
```


File created successfully at: /root/projects/learn-harness-engineering/templates/full/.claude/commands/check.md

运行完整的项目验证检查，汇总结果。

请按顺序执行以下检查并汇总报告：

1. **测试**：`python -m pytest --tb=short -q`
2. **类型检查**：`python -m mypy src/ --ignore-missing-imports`
3. **Lint**：`ruff check src/`
4. **架构约束**：`bash scripts/check-architecture.sh`

对每项检查报告：通过/失败 + 关键问题（如有）。

最后给出一个总体状态：全部通过 / 有问题需修复。


生成会话交接文档。

请执行以下步骤并更新 `session-handoff.md`：

1. 读取 `claude-progress.md` 获取当前状态。
2. 运行 `git log --oneline -10` 查看本次会话的提交。
3. 运行 `git diff HEAD~5 --stat`（或适当数量）查看变更了哪些文件。
4. 读取 `feature_list.json` 确认功能状态。
5. 运行 `python -m pytest --tb=short -q` 确认当前测试状态。

基于以上信息，填写 `session-handoff.md` 的所有章节：
- 当前已验证的状态
- 本次会话的变更
- 未完成或未验证的内容
- 下一步最佳行动
- 关键命令

写入文件后，同时更新 `claude-progress.md` 的最新会话记录。


File created successfully at: /root/projects/learn-harness-engineering/templates/full/.claude/commands/status.md

查看当前项目状态摘要。

请执行以下步骤并生成简洁的状态报告：

1. 读取 `feature_list.json`，统计各状态的功能数量。
2. 读取 `claude-progress.md`，提取当前验证状态和最近的会话记录。
3. 运行 `git log --oneline -5` 查看最近提交。
4. 运行 `git status` 查看未提交的变更。

输出格式：
```
## 项目状态摘要

### 功能进度
- 通过: X / 总计: Y
- 进行中: ...
- 未开始: ...
- 阻塞: ...

### 最近提交
...

### 未提交变更
...

### 下一步
...
```


File created successfully at: /root/projects/learn-harness-engineering/templates/full/.claude/commands/handoff.md

生成会话交接文档。

请执行以下步骤并更新 `session-handoff.md`：

1. 读取 `claude-progress.md` 获取当前状态。
2. 运行 `git log --oneline -10` 查看本次会话的提交。
3. 运行 `git diff HEAD~5 --stat`（或适当数量）查看变更了哪些文件。
4. 读取 `feature_list.json` 确认功能状态。
5. 运行 `python -m pytest --tb=short -q` 确认当前测试状态。

基于以上信息，填写 `session-handoff.md` 的所有章节：
- 当前已验证的状态
- 本次会话的变更
- 未完成或未验证的内容
- 下一步最佳行动
- 关键命令

写入文件后，同时更新 `claude-progress.md` 的最新会话记录。


---
name: {{项目技能名称}}
description: {{项目专属技能的一句话描述}}
allowed-tools:
  - Read
  - Glob
  - Grep
  - Bash
  - Write
  - Edit
  - AskUserQuestion
  - Agent
---

# {{项目技能名称}}

## 概述

{{描述此技能的用途和适用场景}}

## 触发条件

当用户请求以下操作时激活此技能：
- {{触发条件1}}
- {{触发条件2}}

## 工作流程

### 1. 理解请求
- 确认用户的具体需求
- 如果有歧义，通过 AskUserQuestion 澄清

### 2. 执行
- {{具体执行步骤1}}
- {{具体执行步骤2}}
- {{具体执行步骤3}}

### 3. 验证
- 运行相关测试确认结果
- 向用户报告执行结果

## 约束

- {{约束1}}
- {{约束2}}

## 示例

用户：{{示例输入}}
行为：{{预期行为}}


File created successfully at: /root/projects/learn-harness-engineering/templates/full/.claude/skills/project/SKILL.md

---
name: {{项目技能名称}}
description: {{项目专属技能的一句话描述}}
allowed-tools:
  - Read
  - Glob
  - Grep
  - Bash
  - Write
  - Edit
  - AskUserQuestion
  - Agent
---

# {{项目技能名称}}

## 概述

{{描述此技能的用途和适用场景}}

## 触发条件

当用户请求以下操作时激活此技能：
- {{触发条件1}}
- {{触发条件2}}

## 工作流程

### 1. 理解请求
- 确认用户的具体需求
- 如果有歧义，通过 AskUserQuestion 澄清

### 2. 执行
- {{具体执行步骤1}}
- {{具体执行步骤2}}
- {{具体执行步骤3}}

### 3. 验证
- 运行相关测试确认结果
- 向用户报告执行结果

## 约束

- {{约束1}}
- {{约束2}}

## 示例

用户：{{示例输入}}
行为：{{预期行为}}


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045802989760063L2Fv0tPg) (request id: 20260402125802447551109DoWHsMGn)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 27959934-ce75-49b8-aea6-e39efb3f4011, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045805658298463FDUqqpRe) (request id: 2026040212580586869886RWh0cDyN)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: b678dc93-efeb-4116-9b4b-0f14274d4343, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 2026040204580944246379bCzwbmjF) (request id: 20260402125808687214942u5nOvo9e)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 0729b684-f5cf-4898-8663-62b5b10e4c38, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045813263882745sWwd5FwY) (request id: 20260402125812978779120AnJzFmc7)


This request would exceed your organization's rate limit of 2,000,000 input tokens per minute (org: 0729b684-f5cf-4898-8663-62b5b10e4c38, model: claude-opus-4-6). For details, refer to: https://***.com/***/***/*** You can see the response headers for current usage. Please reduce the prompt length or the maximum tokens requested, or try again later. You may also contact sales at https://***.com/*** to discuss your options for a rate limit increase. (request id: 20260402045819798900476hLMTSLsJ) (request id: 20260402125819508007745noGDjh96)


Bash

Make scripts executable


The user doesn't want to proceed with this tool use. The tool use was rejected (eg. if it was a file edit, the new_string was NOT written to the file). STOP what you are doing and wait for the user to tell you how to proceed.


[Request interrupted by user for tool use]


重试


Set executable permission on shell scripts


(Bash completed with no output)


Updated task #6 status


Updated task #7 status


Write

# Python Harness 模板

基于 [Learn Harness Engineering](../docs/) 课程最佳实践，为 Python 项目打造的 Claude Code harness 模板。

## 三个层级

| 层级 | 目录 | 适用场景 | 文件数 |
|------|------|----------|--------|
| **核心精简版** | `core/` | 小型脚本、工具、快速原型 | 4 |
| **完整版** | `standard/` | 中型项目、多会话开发 | 9 + `.claude/` |
| **全功能版** | `full/` | 大型项目、团队协作、质量评估 | 13 + `.claude/` 完整生态 |

## 快速开始

```bash
# 1. 复制你需要的层级到新项目
cp -r templates/standard/ /path/to/your-new-project/

# 2. 全局替换占位符
cd /path/to/your-new-project/
grep -r "{{" .   # 查看所有需要替换的占位符

# 3. 替换关键占位符
# {{项目名称}}、{{项目描述}}、{{功能领域}}、{{功能标题}} 等

# 4. 初始化 git 并运行
git init
chmod +x init.sh
./init.sh
```

## 各层级包含的文件

### core/（核心精简版）

```
CLAUDE.md              — 根指令：启动循环、Python 标准、TDD、HiL 协议
feature_list.json      — 功能状态跟踪（行为 + 验证 + 状态三元组）
init.sh                — 标准启动：pip install → pytest → mypy → ruff
claude-progress.md     — 跨会话进度日志
```

### standard/（完整版）= core +

```
session-handoff.md     — 会话交接模板
clean-state-checklist.md — 提交前健康检查清单
docs/ARCHITECTURE.md   — 架构文档模板
.claude/settings.json  — Claude Code 权限配置
.claude/hooks.json     — PreCommit 自动化 hook
```

### full/（全功能版）= standard +

```
quality-document.md    — 按领域/层级的质量评分
evaluator-rubric.md    — 6 维工作质量评分卡
scripts/check-architecture.sh  — 架构约束自动检查
scripts/session-cleanup.sh     — 会话结束自动清理
.claude/commands/check.md      — /check 运行完整验证
.claude/commands/status.md     — /status 查看项目状态
.claude/commands/handoff.md    — /handoff 生成交接文档
.claude/skills/project/SKILL.md — 项目专属技能模板
.claude/hooks.json             — 增强版 hooks（含架构检查 + TDD 提醒）
```

## 核心设计原则

1. **WIP=1**：一次只做一个功能，做完验证后再做下一个
2. **TDD 优先**：先写失败测试，再实现逻辑
3. **验证驱动**：功能完成 = 验证通过 + 证据记录
4. **会话连续性**：每次会话结束前更新 progress 和 feature_list
5. **干净退出**：仓库始终处于可直接 `./init.sh` 继续的状态

## 占位符列表

| 占位符 | 含义 | 示例 |
|--------|------|------|
| `{{项目名称}}` | 项目名 | `meeting` |
| `{{项目描述}}` | 一句话描述 | `多智能体会议系统` |
| `{{项目路径}}` | 仓库根路径 | `/root/projects/meeting` |
| `{{功能领域}}` | 功能所属领域 | `core` / `api` / `cli` |
| `{{功能标题}}` | 功能简短标题 | `创建会议` |
| `{{模块a}}` | 模块目录名 | `models` |
| `{{职责描述}}` | 模块职责 | `数据模型定义` |
| `{{主要工作流描述}}` | 产品工作流 | `用户发起会议 → 选择参与者 → 执行讨论 → 生成报告` |


File created successfully at: /root/projects/learn-harness-engineering/templates/README.md

# Python Harness 模板

基于 [Learn Harness Engineering](../docs/) 课程最佳实践，为 Python 项目打造的 Claude Code harness 模板。

## 三个层级

| 层级 | 目录 | 适用场景 | 文件数 |
|------|------|----------|--------|
| **核心精简版** | `core/` | 小型脚本、工具、快速原型 | 4 |
| **完整版** | `standard/` | 中型项目、多会话开发 | 9 + `.claude/` |
| **全功能版** | `full/` | 大型项目、团队协作、质量评估 | 13 + `.claude/` 完整生态 |

## 快速开始

```bash
# 1. 复制你需要的层级到新项目
cp -r templates/standard/ /path/to/your-new-project/

# 2. 全局替换占位符
cd /path/to/your-new-project/
grep -r "{{" .   # 查看所有需要替换的占位符

# 3. 替换关键占位符
# {{项目名称}}、{{项目描述}}、{{功能领域}}、{{功能标题}} 等

# 4. 初始化 git 并运行
git init
chmod +x init.sh
./init.sh
```

## 各层级包含的文件

### core/（核心精简版）

```
CLAUDE.md              — 根指令：启动循环、Python 标准、TDD、HiL 协议
feature_list.json      — 功能状态跟踪（行为 + 验证 + 状态三元组）
init.sh                — 标准启动：pip install → pytest → mypy → ruff
claude-progress.md     — 跨会话进度日志
```

### standard/（完整版）= core +

```
session-handoff.md     — 会话交接模板
clean-state-checklist.md — 提交前健康检查清单
docs/ARCHITECTURE.md   — 架构文档模板
.claude/settings.json  — Claude Code 权限配置
.claude/hooks.json     — PreCommit 自动化 hook
```

### full/（全功能版）= standard +

```
quality-document.md    — 按领域/层级的质量评分
evaluator-rubric.md    — 6 维工作质量评分卡
scripts/check-architecture.sh  — 架构约束自动检查
scripts/session-cleanup.sh     — 会话结束自动清理
.claude/commands/check.md      — /check 运行完整验证
.claude/commands/status.md     — /status 查看项目状态
.claude/commands/handoff.md    — /handoff 生成交接文档
.claude/skills/project/SKILL.md — 项目专属技能模板
.claude/hooks.json             — 增强版 hooks（含架构检查 + TDD 提醒）
```

## 核心设计原则

1. **WIP=1**：一次只做一个功能，做完验证后再做下一个
2. **TDD 优先**：先写失败测试，再实现逻辑
3. **验证驱动**：功能完成 = 验证通过 + 证据记录
4. **会话连续性**：每次会话结束前更新 progress 和 feature_list
5. **干净退出**：仓库始终处于可直接 `./init.sh` 继续的状态

## 占位符列表

| 占位符 | 含义 | 示例 |
|--------|------|------|
| `{{项目名称}}` | 项目名 | `meeting` |
| `{{项目描述}}` | 一句话描述 | `多智能体会议系统` |
| `{{项目路径}}` | 仓库根路径 | `/root/projects/meeting` |
| `{{功能领域}}` | 功能所属领域 | `core` / `api` / `cli` |
| `{{功能标题}}` | 功能简短标题 | `创建会议` |
| `{{模块a}}` | 模块目录名 | `models` |
| `{{职责描述}}` | 模块职责 | `数据模型定义` |
| `{{主要工作流描述}}` | 产品工作流 | `用户发起会议 → 选择参与者 → 执行讨论 → 生成报告` |


Updated task #8 status


现在验证：


Bash

List all template files


templates/core/CLAUDE.md
templates/core/claude-progress.md
templates/core/feature_list.json
templates/core/init.sh
templates/full/.claude/commands/check.md
templates/full/.claude/commands/handoff.md
templates/full/.claude/commands/status.md
templates/full/.claude/hooks.json
templates/full/CLAUDE.md
templates/full/claude-progress.md
templates/full/.claude/settings.json
templates/full/.claude/skills/project/SKILL.md
templates/full/clean-state-checklist.md
templates/full/docs/ARCHITECTURE.md
templates/full/evaluator-rubric.md
templates/full/feature_list.json
templates/full/init.sh
templates/full/quality-document.md
templates/full/scripts/check-architecture.sh
templates/full/scripts/session-cleanup.sh
templates/full/session-handoff.md
templates/README.md
templates/standard/.claude/hooks.json
templates/standard/CLAUDE.md
templates/standard/claude-progress.md
templates/standard/.claude/settings.json
templates/standard/clean-state-checklist.md
templates/standard/docs/ARCHITECTURE.md
templates/standard/feature_list.json
templates/standard/init.sh
templates/standard/session-handoff.md


grep -r "{{" templates/ --include="*.md" --include="*.json" -h | sort -u | head -30

Check placeholder consistency


      "area": "{{功能领域}}",
description: {{项目专属技能的一句话描述}}
  "description": "{{项目描述}}",
grep -r "{{" .   # 查看所有需要替换的占位符
name: {{项目技能名称}}
  "project": "{{项目名称}}",
| `src/{{模块a}}/` | {{职责描述}} | {{入口文件}} | {{规格路径}} |
| `src/{{模块b}}/` | {{职责描述}} | {{入口文件}} | {{规格路径}} |
      "title": "{{功能标题}}",
      "user_visible_behavior": "{{用户可见的行为描述}}",
| `{{主要工作流描述}}` | 产品工作流 | `用户发起会议 → 选择参与者 → 执行讨论 → 生成报告` |
- 主要用户工作流：{{主要工作流描述}}
- 产品：{{项目名称}}
- 仓库根目录：{{项目路径}}
- {{具体执行步骤1}}
- {{具体执行步骤2}}
- {{具体执行步骤3}}
| `{{功能标题}}` | 功能简短标题 | `创建会议` |
| `{{功能领域}}` | 功能所属领域 | `core` / `api` / `cli` |
| {{层级1}} | - | - | - | - | - |
| {{层级2}} | - | - | - | - | - |
| {{层级3}} | - | - | - | - | - |
{{描述此技能的用途和适用场景}}
- {{最难安全修改的区域}}
| `{{模块a}}` | 模块目录名 | `models` |
用户：{{示例输入}}
- {{约束1}}
- {{约束2}}
| `{{职责描述}}` | 模块职责 | `数据模型定义` |
行为：{{预期行为}}


python -m json.tool templates/core/feature_list.json > /dev/null && echo "core JSON OK" && python -m json.tool templates/standard/feature_list.json > /dev/null && echo "standard JSON OK" && python -m json.tool templates/full/feature_list.json > /dev/null && echo "full JSON OK" && python -m json.tool templates/standard/.claude/settings.json > /dev/null && echo "standard settings OK" && python -m json.tool templates/full/.claude/settings.json > /dev/null && echo "full settings OK" && python -m json.tool templates/standard/.claude/hooks.json > /dev/null && echo "standard hooks OK" && python -m json.tool templates/full/.claude/hooks.json > /dev/null && echo "full hooks OK"

Validate all JSON files


bash -n /root/projects/learn-harness-engineering/templates/core/init.sh && echo "core init.sh OK" && bash -n /root/projects/learn-harness-engineering/templates/standard/init.sh && echo "standard init.sh OK" && bash -n /root/projects/learn-harness-engineering/templates/full/init.sh && echo "full init.sh OK" && bash -n /root/projects/learn-harness-engineering/templates/full/scripts/check-architecture.sh && echo "check-architecture.sh OK" && bash -n /root/projects/learn-harness-engineering/templates/full/scripts/session-cleanup.sh && echo "session-cleanup.sh OK"

Validate shell script syntax


Error: Exit code 127
/bin/bash: line 1: python: command not found


<tool_use_error>Cancelled: parallel tool call Bash(python -m json.tool templates/core/featu…) errored</tool_use_error>


python3 -m json.tool /root/projects/learn-harness-engineering/templates/core/feature_list.json > /dev/null && echo "core JSON OK" && python3 -m json.tool /root/projects/learn-harness-engineering/templates/standard/feature_list.json > /dev/null && echo "standard JSON OK" && python3 -m json.tool /root/projects/learn-harness-engineering/templates/full/feature_list.json > /dev/null && echo "full JSON OK" && python3 -m json.tool /root/projects/learn-harness-engineering/templates/standard/.claude/settings.json > /dev/null && echo "standard settings OK" && python3 -m json.tool /root/projects/learn-harness-engineering/templates/full/.claude/settings.json > /dev/null && echo "full settings OK" && python3 -m json.tool /root/projects/learn-harness-engineering/templates/standard/.claude/hooks.json > /dev/null && echo "standard hooks OK" && python3 -m json.tool /root/projects/learn-harness-engineering/templates/full/.claude/hooks.json > /dev/null && echo "full hooks OK"

Validate JSON files with python3


bash -n /root/projects/learn-harness-engineering/templates/core/init.sh && echo "core OK" && bash -n /root/projects/learn-harness-engineering/templates/standard/init.sh && echo "standard OK" && bash -n /root/projects/learn-harness-engineering/templates/full/init.sh && echo "full OK" && bash -n /root/projects/learn-harness-engineering/templates/full/scripts/check-architecture.sh && echo "check-arch OK" && bash -n /root/projects/learn-harness-engineering/templates/full/scripts/session-cleanup.sh && echo "cleanup OK"

Validate shell script syntax


core JSON OK
standard JSON OK
full JSON OK
standard settings OK
full settings OK
standard hooks OK
full hooks OK


core OK
standard OK
full OK
check-arch OK
cleanup OK


所有验证通过。


全部完成。模板已生成在 `templates/` 目录下：

**结构总览（31 个文件）：**

| 层级 | 文件数 | 关键特色 |
|------|--------|----------|
| `core/` | 4 | CLAUDE.md + feature_list.json + init.sh + progress |
| `standard/` | 10 | + 交接、检查清单、架构文档、settings、hooks |
| `full/` | 17 | + 质量评分、评估卡、自动化脚本、commands、skills |

**使用方式：** `cp -r templates/standard/ /path/to/new-project/` 然后 `grep -r "{{" .` 替换占位符即可。


node "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "stop:check-console-log" "scripts/hooks/check-console-log.js" "standard,strict"

node "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "stop:session-end" "scripts/hooks/session-end.js" "minimal,standard,strict"

node "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "stop:evaluate-session" "scripts/hooks/evaluate-session.js" "minimal,standard,strict"

node "${CLAUDE_PLUGIN_ROOT}/scripts/hooks/run-with-flags.js" "stop:cost-tracker" "scripts/hooks/cost-tracker.js" "minimal,standard,strict"


harness如何定义


由于负载过高，为了尽量保证用户体验，本站已开启限流，当前用户本周无法使用，请下周重试


<local-command-caveat>Caveat: The messages below were generated by the user while running local commands. DO NOT respond to these messages or otherwise consider them in your response unless the user explicitly asks you to.</local-command-caveat>


<command-name>/exit</command-name>
            <command-message>exit</command-message>
            <command-args></command-args>


<local-command-stdout>Goodbye!</local-command-stdout>


No response requested.


are you ok


There's an issue with the selected model (claude-opus-4-6[1m]). It may not exist or you may not have access to it. Run /model to pick a different model.


<command-name>/model</command-name>
            <command-message>model</command-message>
            <command-args></command-args>


<local-command-stdout>Set model to Sonnet 4.6 (default)</local-command-stdout>


There's an issue with the selected model (claude-sonnet-4-6). It may not exist or you may not have access to it. Run /model to pick a different model.


<command-name>/model</command-name>
            <command-message>model</command-message>
            <command-args>GLM-5-FP8</command-args>


<local-command-stdout>Set model to GLM-5-FP8</local-command-stdout>


用户在问 "are you ok"，这是一个简单的问候/确认问题。我应该简短回复确认我的状态正常。

这不是一个需要使用 skill 的任务——只是一个简单的问候。


好的，我状态正常！

上一个会话已完成 **Python Harness 模板** 的生成，共 31 个文件分布在 `templates/` 目录下：

- `core/` — 4 个核心文件
- `standard/` — 10 个文件 + `.claude/` 配置
- `full/` — 17 个文件 + 完整 `.claude/` 生态

有什么需要继续的吗？