228 lines
10 KiB
Markdown
228 lines
10 KiB
Markdown
# 03 · 执行协议(所有执行模型必读)
|
||
|
||
> 本协议约束每一个领取任务卡的模型。违反协议 = 交付无效,任务重派。
|
||
|
||
---
|
||
|
||
## 一、接单流程(强制顺序)
|
||
|
||
```text
|
||
1. 通读任务卡 → 确认「边界」段(哪些文件不许动)
|
||
2. 读项目根 README + 最近 2 份 PROGRESS/迭代报告(了解项目惯例与雷区)
|
||
3. 跑「基线测试」——确认开工前测试是绿的;有红的先记录,不背锅
|
||
4. 实施(最小变更原则)
|
||
5. 跑「验收命令」——全绿
|
||
6. 写 PROGRESS_<任务ID>.md 到项目根
|
||
7. 交付:代码 + PROGRESS + 关键命令输出摘要
|
||
```
|
||
|
||
**禁止跳步**:不读文档就动手、不跑基线就改代码、不跑验收就宣称完成——三者任一发生,交付直接打回。
|
||
|
||
---
|
||
|
||
## 二、PROGRESS 文件格式(交付凭证)
|
||
|
||
写到**项目根目录**,文件名 `PROGRESS_<任务ID>.md`:
|
||
|
||
```markdown
|
||
# PROGRESS — <任务ID> <任务名>
|
||
|
||
- 状态:done | partial | blocked
|
||
- 执行模型:<模型名>
|
||
- 日期:YYYY-MM-DD
|
||
- 分支/提交:<commit hash 或"未提交">
|
||
|
||
## 改动文件
|
||
- path/to/file1(新增/修改,一句话说明)
|
||
- path/to/file2
|
||
|
||
## 验收命令与结果
|
||
(粘贴关键输出,不要只写"通过")
|
||
|
||
```bash
|
||
$ <命令>
|
||
<关键输出,最后一行是结论>
|
||
```
|
||
|
||
## 基线对照
|
||
- 开工前:<测试结果>
|
||
- 完工后:<测试结果>
|
||
|
||
## 遗留问题 / 下一模型注意事项
|
||
- ...
|
||
```
|
||
|
||
---
|
||
|
||
## 三、质量红线(硬性)
|
||
|
||
1. **不许伪造**:测试跑不绿就写 partial/blocked,附原始输出。伪造一次 = 该模型在该项目永久降级为 C 级。
|
||
2. **不许删测试**:既有测试只许更绿。删测试用例、跳过断言、注释掉失败用例 = 交付无效。
|
||
3. **不许夹带**:任务卡外的一律不做。看到顺手能修的 bug,写进 PROGRESS 的「遗留问题」,不顺手改。
|
||
4. **不许碰密钥**:`.env`、`~/.dsh/secrets`、`(服务器数据)` 目录——只读都不许,物理隔离。
|
||
5. **不许破坏契约**:改 API 响应结构/字段名必须保持向后兼容或双写过渡,并在 PROGRESS 说明。
|
||
6. **不许强推**:不执行 `git push --force`、不 rebase 他人提交、不 git reset 别人的改动。
|
||
7. **不许超时硬干**:预计超预算时,先交「阶段报告 + 断点说明」,让调度器续派,不许烂尾。
|
||
|
||
---
|
||
|
||
## 四、各项目雷区(前人踩过的坑,直接记)
|
||
|
||
### 可乐工具(chunyu)
|
||
- **vite 代理前缀匹配过宽**:`/api` 会连 `/api-docs` 一起劫持——改代理时必须用精确规则(见 C-01)。
|
||
- **生产 nginx 正则带尾斜杠**:`^/(api|user|...)/` 依然劫持子路径,改完前端要同步审查 `nginx-docker.conf`。
|
||
- 前端 67 页组件,路由引用散落各处——改路由名必须 grep 全量 `navigation(` 调用。
|
||
- 后端全异步(adrf):新视图必须 async,不要写同步视图混挂。
|
||
|
||
### EnglishDrill
|
||
- **granian 孤儿 worker**:只杀父进程会留 worker 占端口,表现为"改了代码不生效"。用 `tools/devserver.ps1 restart`。
|
||
- **E2E 双模式**:`tests/e2e/run_e2e.py`(默认 ASGI 进程内 / `--http` 真实 granian)。隔离库 `backend/.tmp/e2e-db.sqlite3`,不碰开发库。
|
||
- **值收口层**:外部 id 必须走 `core/helpers.py` 的 `as_int` 等收口函数,禁止裸 `int()` 进 ORM(曾造成 44 处 5xx)。
|
||
- **stats 口径**:分类统计必须带 `is_deleted=False`,否则和 `/api/categories` 打架(BUG-2 教训)。
|
||
- 前端登录守卫在 `src/App.tsx:29`。
|
||
|
||
### dealerhub
|
||
- 460 passed / 4 skipped 是基线;4 个跳过是 PG 并发用例(D-02 处理)。
|
||
- 测试命令:`pytest`(在 `backend/`);前端 `npm test` + `npm run build`。
|
||
- `makemigrations --check --dry-run` 必须干净。
|
||
- 演示数据重建:`seed_demo --reset`;改数据模型要同步改 seed。
|
||
|
||
### DSP
|
||
- 双端:Web(Vue3)+ Android;后端 Django + Channels。
|
||
- 转码依赖本地 ffmpeg;nginx 托管静态视频。
|
||
- 无 E2E 套件——S-01 会建;在此之前以 `backend/tests` 为准。
|
||
|
||
### DSH / 基础设施
|
||
- `~/.dsh/settings.yaml` 是**热配置**:改前备份(`.bak_<日期>`),改后 YAML 解析校验。插件曾覆盖式写入破坏能力声明(2026-09-08 事故)。
|
||
- 测试:`server/` 下 `pytest -q`,用独立测试库 `postgres_test`,conftest 拒绝在生产库跑。
|
||
- 探活:`GET /healthz`。
|
||
|
||
---
|
||
|
||
## 五、命令速查(执行模型常用)
|
||
|
||
```bash
|
||
# 可乐工具
|
||
cd chunyu_project && python manage.py runserver 8002 # 后端(开发)
|
||
cd chunyu_project_react && npm run dev # 前端 5173
|
||
|
||
# EnglishDrill
|
||
cd backend && python -m granian --interface asgi config.asgi:application --port 8756
|
||
python tests/e2e/run_e2e.py # E2E(ASGI 模式)
|
||
python tests/e2e/run_e2e.py --http # E2E(真实 granian)
|
||
|
||
# dealerhub
|
||
cd backend && pytest -q
|
||
cd frontend && npm test && npm run build
|
||
|
||
# DSH
|
||
cd server && .venv/Scripts/python -m pytest -q
|
||
```
|
||
|
||
---
|
||
|
||
## 六、验收回执(规划者视角)
|
||
|
||
每个任务交付后,规划者按任务卡「验收标准」逐条核对:
|
||
1. 验收命令原始输出是否齐全、结论是否全绿;
|
||
2. 改动文件是否越界;
|
||
3. 基线是否未被破坏(对照开工前);
|
||
4. PROGRESS 格式是否完整。
|
||
|
||
四查通过 → `done`;任一不过 → 打回并注明「哪条标准、缺什么证据」。
|
||
|
||
---
|
||
|
||
## 七、接力协议(Handoff Bundle / 断点续接)
|
||
|
||
> 由 I-04 落地。目的:**接手模型不重复问路、不重做已验证部分**。
|
||
> 工具:`PLANNING/tools/handoff_bundle.py`(只读,不改任何项目文件)
|
||
|
||
### 7.1 交接包标准(Handoff Bundle)
|
||
|
||
一份合格的交接包 = 六个部分,缺一即视为上下文不足,接手模型有权要求补充:
|
||
|
||
| # | 部分 | 内容 | 尺寸上限 |
|
||
|---|---|---|---|
|
||
| 0 | 接手须知 | 断点续接规则、密钥红线、交付定义 | 固定 |
|
||
| 1 | 任务卡全文 | 原文,硬约束的唯一来源 | 全文 |
|
||
| 2 | 作业规范 | 本协议 §一/§二/§三/§四 | 摘要 |
|
||
| 3 | 项目上下文 | README + 最近 2 份 PROGRESS | 90 行 / 70 行 |
|
||
| 4 | 相关源码清单 | 卡里点名过的路径 → 逐个核实存在性/大小/改动时间;未解析的给近似候选 | 自动 |
|
||
| 5 | 基线命令与输出 | 命令默认只列;`--run-baseline` 才真跑并抓取 | 每命令末 40 行 |
|
||
|
||
**生成命令**:
|
||
|
||
```bash
|
||
cd vscode/PLANNING
|
||
python tools/handoff_bundle.py C-01 # 打到 stdout
|
||
python tools/handoff_bundle.py C-01 --out bundles/bundle-C-01.md
|
||
python tools/handoff_bundle.py C-01 --run-baseline # 连基线输出一起抓(重型套件仍跳过)
|
||
python tools/handoff_bundle.py C-01 --run-baseline --include-heavy # 连全量套件一起跑
|
||
```
|
||
|
||
基线命令登记在 `PLANNING/tools/project-baselines.json` —— **加新项目时补一条,不要改脚本**。
|
||
|
||
### 7.2 断点续接(上游交了 partial)
|
||
|
||
接手模型必须拿到并核对三件东西,缺一不接受续接:
|
||
|
||
1. **改动清单**:改了哪些文件 + 每个文件的 diff 摘要;
|
||
2. **测试状态**:哪些用例已绿、哪些仍红(附原始输出);
|
||
3. **遗留问题**:上游 PROGRESS 的「遗留问题 / 下一模型注意事项」段。
|
||
|
||
处理顺序:
|
||
|
||
```text
|
||
读上游 PROGRESS → 复跑一遍上游声称已绿的验收命令(确认不是虚报)
|
||
→ 只从断点继续,不重做已验证部分
|
||
→ 完成后【更新】而非重写 PROGRESS_<ID>.md,追加自己的段落(标执行模型与日期)
|
||
```
|
||
|
||
**禁止**:推倒重来、丢弃上游已验证成果、把 partial 当 blocked 重新起一版。
|
||
|
||
### 7.3 调度器集成
|
||
|
||
`python tasks.py bundle C-01` 已内置轻量版交接包(卡 + 协议要点 + README + PROGRESS);
|
||
需要源码清单与基线捕获时用 `tools/handoff_bundle.py`(本协议的完整实现)。
|
||
|
||
---
|
||
|
||
## 八、新模型入职 SOP(一页纸)
|
||
|
||
> 由 I-04 落地。工具:`PLANNING/evals/tools/run_eval.py`。全程 **30-40 分钟**。
|
||
|
||
```text
|
||
1. 前置:新模型网关可达 + 环境变量里有 key(key 只从环境变量读,工具不碰配置文件)
|
||
PowerShell: $env:DSH_API_KEY='<key>'
|
||
2. 自检题库(一次性,确认没被改坏):
|
||
cd vscode/PLANNING/evals && python tools/run_eval.py --audit
|
||
3. 跑评估(全新会话,逐题单发,不启用任何项目 skill 提示):
|
||
python tools/run_eval.py --model <新模型> --transport openai \
|
||
--base-url <网关>/v1 --api-key-env DSH_API_KEY
|
||
—— 或人工发题:python tools/run_eval.py --list-questions 逐条复制题面
|
||
4. 产出:evals/results/<模型>-<日期>.json / .md / .log.md
|
||
自动项即时出分;人工项写入 .manual.template.json
|
||
5. 评委补判人工项 → 定稿等级:
|
||
python tools/run_eval.py --manual results/<模型>-<日期>.manual.template.json
|
||
6. 成绩回填(**规划者执行,工具不自动写**):
|
||
- PLANNING/model-registry.json → 该模型 scores / grade / grade_basis / verified
|
||
- PLANNING/01-模型分工矩阵.md → 对应行与派单范围
|
||
7. 首单观察:派一张低风险验证卡(推荐 D-02 或 I-01 辅助位),比对评估画像与真实交付
|
||
8. 合格 → 正式启用;不合格 → 降级/限场景,并在 registry 的 limits 里写明限制
|
||
```
|
||
|
||
**评估纪律(防作弊,见 `evals/README.md`)**:
|
||
|
||
- 题面文件里的「评分点」段**永不**发给被测模型(`--audit` 会硬校验题面不含评分点);
|
||
- 每个模型一份独立的 dim4 fixture 副本,不污染原件;
|
||
- 单项超时按未完成计(runner 默认单题 600s,每维 ≤10 分钟);
|
||
- 硬否决(dim5 <50% / dim4 伪造证据 / dim6 虚报验收)→ 直接 C 级,与总分无关。
|
||
|
||
**已登记规格缺陷(待规划者裁定,不由执行模型自行改)**:
|
||
|
||
- `SPEC-DEFECT-1`:`README.md §四` / `evals/README.md §四` / `evals/scoring.md §一` 称「满分 **36** 分」,
|
||
但 `scoring.md` 维度表各行相加 = **42**,且与 16 道题面声明的分值合计一致。
|
||
等级换算用百分比故不影响评级,但绝对总分口径需统一。
|
||
`run_eval.py --audit` 会把它标为 `[KNOWN]` 而不是静默通过。
|