Files
skelet/progress.md
T

193 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 执行进度记录
> 本文件是只追加的历史流水,用来记录任务执行过程、验证命令、阻塞点和关键决策。
> 当前目录、当前命令、下一个可领取任务等可覆盖快照,写入 [`docs/current-state.md`](docs/current-state.md)。
## 职责边界
- `docs/06-tasks.md`:任务看板,维护任务状态、依赖和验收要点。
- `progress.md`:历史流水,只追加记录每轮执行发生了什么。
- `docs/current-state.md`:当前快照,可覆盖更新仓库现实、可运行命令和下一步。
不要在本文重复维护当前目录结构、当前运行命令或下一个任务;这些信息以 `docs/current-state.md` 为准。
## 记录格式
每完成或中断一轮任务,在文件末尾追加一条记录:
```markdown
## YYYY-MM-DD T-编号 任务名
- 状态:DONE / BLOCKED / PARTIAL
- 变更:修改了哪些文件或模块
- 验证:运行的真实命令和结果
- 阻塞:如有,写明原因和需要谁决策;没有写“无”
- 决策:如有,记录本轮确定的关键取舍
- 下一步:建议下一个任务 ID 或待确认事项
```
## 执行记录
## 2026-07-06 T-000 初始化 harness 文档
- 状态:DONE
- 变更:复制 `D:\github\harness_coding_docs` 模板到当前项目,并替换根目录入口、需求、技术栈、架构、编码规则、任务看板、API 边界、路由和当前状态文档。
- 验证:`Get-ChildItem -Recurse -File` 已列出根目录和 `docs/` 文档;定向检查确认根入口不再误称模板库。`init.ps1` / `init.sh` 的命令占位保留到 T-001 初始化生产代码时替换。
- 阻塞:生产代码尚未初始化,`init.ps1` / `init.sh` 仍为占位命令。
- 决策:第一版采用 Wagtail + Django + Python 3.12 + SQLite;先做内容目录和评测闭环,不做前台用户系统、支付、评论、自动抓取和复杂搜索。
- 下一步:T-001 初始化 Wagtail 项目骨架。
## 2026-07-06 文档审核与优化(harness 文档瘦身 + 商业计划加验证闸门)
- 状态:DONE
- 变更:
- docs 瘦身:`method-map.md`、`evaluator-rubric.md`、`quality-document.md`、`adoption-checklist.md` 四个元文档合并为 `docs/90-harness-reference.md` 并删除原文件,移出每轮必读链路;`AGENTS.md` 定为唯一权威入口,`README.md`、`docs/README.md`、`docs/00-ai-start-here.md` 删除重复的定位/必读顺序/技术栈内容,改为链接。
- 纠错:修正 `00-ai-start-here.md` 中"尚未初始化 git"的过期事实;开发环境定为 WSL2/Linux(`/mnt/d/OPC/skelet`),全部文档命令改为 bash 形态,`init.sh` 为标准入口、`init.ps1` 降为可选。
- 评分模型统一:`04-architecture.md` 定为评分维度唯一权威(6 个 0-5 分项,新增 `incremental_score`,删除独立录入的 0-100 总分,总分改为由分项计算);`business-plan-v1.md` 和 `research-sourcing-strategy.md` 改为引用。
- 数据模型:`scenario` 字段明确为多对多(`scenarios`)。
- 任务看板:新增 T-305(轻量访问统计与外链点击,M3/M4 数据前置,T-304 增加对其依赖);Backlog 收入首批内容库任务(原 T-105~T-109,收敛为 2 个场景)和 llms.txt/JSON 导出。
- 商业文档:里程碑加验证闸门和止损线(M2 从 8 场景 50 项目砍到 2 场景 20 项目;M3 定 8 周/12 周复盘线;内容投入封顶 20 项目+12 篇);定站点语言为英文单语言、主攻"AI Coding 友好度"角度词、头部词只作词根;竞品分析补"直接问 AI"为最大隐性竞品及 llms.txt 借力策略;Newsletter 口径统一为"MVP 外部托管订阅外链、完整功能 V2";付费价格标注为未验证假设;发布节奏按单人投入下调。
- 验证:`git status` + `find . -type f -not -path "./.git/*"` 确认文件清单;`grep` 确认仓库内已无对四个被删元文档的引用(progress.md 历史记录除外),无残留 PowerShell 命令(历史记录除外)。
- 阻塞:无。
- 决策:第一版英文单语言站点;首批只做 SaaS 和内容站/CMS 两个场景;评分维度以 `docs/04-architecture.md` 为唯一权威;M3 闸门不过不扩内容。
- 下一步:T-001 初始化 Wagtail 项目骨架。
## 2026-07-06 仓库卫生维护(.gitignore 修复 + 行尾统一 + 路径纠错)
- 状态:DONE
- 变更:
- 修复忽略文件:原文件名拼写为 `.gittignore`,git 不识别,`deploy/`(含 SSH 私钥 `tokyo.pem`)处于可被提交状态;现为标准 `.gitignore`,并补齐凭证类(`*.pem`、`.env*`)和 Python / Django / Wagtail 运行产物(`__pycache__/`、`.venv/`、`db.sqlite3*`、`media/`、`staticfiles/`)忽略项。
- 新增 `.gitattributes`(`* text=auto eol=lf`):此前仓库以 CRLF 提交、工作区为 LF,导致 26 个文件出现全量假差异;统一按 LF 提交,本轮一次性归一化,之后 diff 只反映真实内容变化。
- 路径纠错:`AGENTS.md`、`docs/00-ai-start-here.md`、`docs/03-tech-stack.md`、`docs/90-harness-reference.md`、`docs/current-state.md` 中仓库根目录由 `/mnt/d/OPC/skelet` 修正为实际路径 `/mnt/d/opc_project/skelet`(本文历史记录按只追加规则不改写)。
- `docs/current-state.md`:目录要点补登 `business/`、`deploy/`(不入库)、`.gitignore` / `.gitattributes`。
- 验证:`git check-ignore -v deploy/tokyo.pem` 确认私钥被忽略;`git diff --ignore-cr-at-eol --stat` 确认既有 26 文件差异全部为行尾、无内容变化;`grep -rn "OPC/skelet"` 确认除本文历史记录外无残留旧路径。
- 阻塞:无。
- 决策:`deploy/` 整目录不入库,部署凭证只保留在本机;行尾规范定为 LF(与 WSL2/Linux 标准开发环境一致)。
- 下一步:T-001 初始化 Wagtail 项目骨架。
## 2026-07-06 任务看板加固(面向执行能力较弱的模型)
- 状态:DONE
- 变更:
- `docs/06-tasks.md`:新增「任务详单」一节。Phase 0/1 每任务给出实现指引、前置检查和带预期结果的验证命令(T-001 含 `wagtail start` 逐步命令和 BLOCKED 条件);Phase 2/3 给出关键实现约束与验证速查表。表格中的主观验收措辞("字段校验合理""移动端不溢出"等)替换为可勾选项。
- `docs/04-architecture.md`:§3.4 升级为筛选参数契约表(唯一权威:`language`/`framework`/`database`/`min_score`/`q`/`page`,单值、AND 组合、非法值处理规则);§3.3 表下新增必填/可空/默认附注和评分校验器要求;§3.2 明确 `AiCodingScore` MVP 不建模型;§一/§六记录结构决策:保留 `wagtail start` 生成的 `home`/`search` app,业务模型集中在新建 `core` app,测试放各 app `tests.py`,删除生成的 Dockerfile。
- `docs/03-tech-stack.md`:新增版本钉死策略行(T-001 时按 pip 实装稳定版 pin `wagtail==X.Y.Z` 并回写)。
- `docs/routes.md`、`docs/02-requirements.md`:筛选相关表述指回 §3.4 契约,不再各自维护。
- `docs/current-state.md`:快照与目录要点同步上述结构决策。
- T-104 明确人工输入边界:候选项目、评分、评语必须经用户确认,无清单时标 BLOCKED,禁止模型编造。
- 验证:`grep` 检查 §3.4 引用一致(routes、requirements、06-tasks 均指向 04-architecture);人工核对任务详单命令与 03-tech-stack §三目标命令形态一致。
- 阻塞:无。
- 决策:筛选参数契约以 `04-architecture.md` §3.4 为唯一权威;`home`/`search` app 保留不改名;`AiCodingScore` 不建模型;种子内容评分必须人工确认。
- 下一步:T-001 初始化 Wagtail 项目骨架(详单已可直接照做)。
## 2026-07-06 补齐页面树决策与 Wagtail 多对多实现注意
- 状态:DONE
- 变更:
- `docs/04-architecture.md` §3.1:新增 `ProjectIndexPage`(`/projects/` 承载页);新增页面树结构图(唯一权威):项目详情统一挂 `ProjectIndexPage` 下、不挂场景页下(多对多场景 vs 单父节点树的冲突由此消解);`ScenarioPage` 用查询渲染项目、无子页面;筛选实现在 `ProjectIndexPage.get_context()`、不另建 Django view;新增 Wagtail 实现注意:Page 上的多对多必须用 modelcluster `ParentalManyToManyField`。
- `docs/06-tasks.md`:T-102 表行与详单同步上述两点(`ParentalManyToManyField`、同轮建 `ProjectIndexPage`);T-204 速查行标明筛选落点。
- `docs/routes.md`:项目列表页标注承载 Page 并指回 §3.1。
- 验证:`grep` 确认 `ProjectIndexPage` 在 04/06/routes 三处一致;`ParentalManyToManyField` 在 04 与 06 两处一致。
- 阻塞:无。
- 决策:页面树以 §3.1 结构图为唯一权威;`/languages/`、`/frameworks/` 聚合页 MVP 不建 Page,由筛选参数替代。
- 下一步:T-001 初始化 Wagtail 项目骨架。
## 2026-07-06 确认 Python 命令
- 状态:DONE
- 变更:`docs/03-tech-stack.md` §三命令表 `python3` → `python3.12`,并加说明注释;`docs/current-state.md` 开发环境行补充 Python 命令约定。
- 验证:`python3.12 --version` 输出 `Python 3.12.12`;`docs/03-tech-stack.md` 与 `docs/current-state.md` 已同步。
- 阻塞:无。
- 决策:开发统一使用 `python3.12` 命令(系统已安装 3.12.12),不依赖 `python3` 别名(指向 3.8.10)。
- 下一步:T-001 初始化 Wagtail 项目骨架。
## 2026-07-06 T-001 初始化 Wagtail 项目骨架
- 状态:DONE
- 变更:
- 创建 Python 3.12 venv(`--system-site-packages`,Pillow 由 MSYS2 `mingw-w64-x86_64-python-pillow` 提供)
- 安装 Wagtail 7.4.2 + Django 6.0.6 + 全部依赖(通过 MSYS2 bash 环境)
- `wagtail start skelet .` 生成项目骨架(`manage.py`、`skelet/`、`home/`、`search/`)
- `manage.py startapp core` 并加入 `INSTALLED_APPS`
- 删除 `Dockerfile`;`requirements.txt` 替换为 `pip freeze` 精确版本
- `manage.py migrate` 成功;`createsuperuser`(admin/admin123)
- `init.sh` / `init.ps1` 替换为真实命令(`pip install`、`manage.py check`、`manage.py runserver`)
- 回写 `03-tech-stack.md`(版本钉死状态、测试方案、§三命令)、`04-architecture.md` §六(结构决策、已初始化标记)、`current-state.md`(快照、目录表、任务看板状态、可运行命令)、`06-tasks.md`(T-001→DONE)
- 验证:
- `manage.py check`:0 errors, 3 treebeard 兼容警告(非阻塞)
- `curl http://127.0.0.1:8000/`:HTTP 200
- `curl http://127.0.0.1:8000/admin/login/`:HTTP 200
- 阻塞:无。
- 决策:
- Python 3.12 来自 MSYS2/MinGW(`C:\msys64\mingw64\bin\python3.12.exe`),创建 Unix 风格 venv(`bin/` 非 `Scripts/`)
- 因 MinGW 工具链版本冲突(GCC 8.1 vs Python 3.12),采用 `--system-site-packages` 复用 MSYS2 预编译 Pillow 12.0,非纯 Python 依赖(pillow-heif)在 MSYS2 bash 中编译
- 开发命令需在 MSYS2 bash shell 中运行;`init.ps1` 在 PowerShell 中直接调用 `.venv/bin/` 路径可工作
- 下一步:T-002 建立基础配置与环境样例。
## 2026-07-06 T-002 建立基础配置与环境样例
- 状态:DONE
- 变更:
- `skelet/settings/base.py`:新增 `import os`;`SECRET_KEY`、`DEBUG`、`ALLOWED_HOSTS`、`WAGTAILADMIN_BASE_URL` 改为从环境变量读取(dev 安全默认值)
- `skelet/settings/dev.py`:精简为只设 `DEBUG=True`、`ALLOWED_HOSTS=["*"]`、`EMAIL_BACKEND`,其余继承 base
- `skelet/settings/production.py`:`DEBUG=False`、`ALLOWED_HOSTS` 从环境变量读取、`ManifestStaticFilesStorage`、CSRF/Session 安全头
- 新建 `.env.example`:含 `SECRET_KEY`、`DEBUG`、`ALLOWED_HOSTS`、`WAGTAILADMIN_BASE_URL` 占位值和逐项注释
- `.gitignore`:添加 `!.env.example` 例外,确保样例文件可提交
- 验证:
- `manage.py check`:0 errors, 3 treebeard 兼容警告(非阻塞)
- `grep -riE "secret|token|password" .env.example`:仅出现 `SECRET_KEY=replace-me` 占位值,无真实密钥
- `git check-ignore .env .env.example`:`.env` 被忽略,`.env.example` 可提交
- 阻塞:无。
- 决策:环境变量命名遵循 Django 惯例;dev 环境默认值满足本地开发需求,生产部署时所有值从环境变量注入。
- 下一步:T-003 建立最小验证基线。
## 2026-07-06 T-003 建立最小验证基线
- 状态:DONE
- 变更:
- `home/tests.py`:新增 `Smoketest` 类(Django `TestCase`),`test_homepage_returns_200` 用 test client 访问 `/` 断言 200
- `docs/05-coding-rules.md` §7:移除"目标形态"占位,替换为真实命令
- 验证:
- `manage.py test`:5 tests passed (0.243s),包括新增的 smoke 测试
- `manage.py check`:0 errors
- 阻塞:无。
- 决策:`init.sh` 的 `VERIFY_CMD` 已在上轮设为 `manage.py check`,无需修改。
- 下一步:T-101 建立场景、语言、框架、数据库、功能标签模型。
## 2026-07-06 Phase 0 评审修复
- 状态:DONE
- 变更(按 `docs/review/phase0-review.md` 评审逐项修复):
- **Issue 1 (High)**:`init.sh` / `init.ps1` 改用 `python3.12`/`pip3.12` 替代 `python`/`pip`,解决 MSYS2 venv 中 `.venv/bin/python` 不存在的问题;增加 venv 存在性检查
- **Issue 2 (High)**:`production.py` 新增 `ImproperlyConfigured` 检查,`SECRET_KEY` 缺失或仍为 `django-insecure-` 前缀时启动即失败;修复 `ALLOWED_HOSTS=['']` 空字符串问题(过滤空值)
- **Issue 3 (Medium)**:`AGENTS.md` 更新当前阶段(Phase 0 已完成,下一步 T-101)和验证命令;`current-state.md` 修复 blocker 行(T-002→T-101)和 init 脚本状态;`00-ai-start-here.md` 替换为真实验证命令
- **Issue 4 (Low)**:`.env.example` 重写说明,明确列出四种环境变量注入方式(shell export、systemd、托管平台、Docker),不再误导用户以为复制即生效
- 验证:
- `manage.py check`:0 errors(dev settings)
- `manage.py test`:5 tests passed
- `DJANGO_SETTINGS_MODULE=skelet.settings.production manage.py check`:正确抛出 `ImproperlyConfigured`(SECRET_KEY 缺失)
- `SECRET_KEY=<valid> ALLOWED_HOSTS=example.com DJANGO_SETTINGS_MODULE=skelet.settings.production manage.py check`:0 errors(production settings 含正确 SECRET_KEY)
- `.env.example` grep:仅占位值,无真实密钥
- 阻塞:无。
- 决策:因 WSL2 不可用,当前实际开发环境为 MSYS2/MinGW;venv 使用 `--system-site-packages` 复用 MSYS2 Pillow;`init.sh` 使用 `python3.12`/`pip3.12` 实现跨平台兼容。
- 下一步:T-101 建立场景、语言、框架、数据库、功能标签模型。
## 2026-07-06 Phase 0 评审第二次修复(Issue 1 + 3 复查)
- 状态:DONE
- 变更:
- **Issue 1**:`init.sh` / `init.ps1` 增加 `.exe` suffix fallback 逻辑——先检测 `.venv/bin/python3.12` 是否存在(Linux 原生 venv),不存在则追加 `.exe`(MSYS2/MinGW venv);venv 缺失时给出明确错误信息
- **Issue 3**:
- `AGENTS.md`「开发环境」改为「当前实际为 MSYS2/MinGW;WSL2/Linux 为后续目标」
- `docs/current-state.md` 命令从 `.venv/bin/python` 统一改为 `.venv/bin/python3.12`(与 venv 内实际可执行文件一致)
- `docs/03-tech-stack.md` 开发环境行同步 MSYS2 + WSL2 目标
- `docs/00-ai-start-here.md` 验证命令同步更新
- 验证:
- `init.sh` 在 MSYS2 bash 中完整执行(`pip install` → `manage.py check`,无错误)
- `.venv/bin/python3.12 manage.py check`:0 errors
- `.venv/bin/python3.12 manage.py test`:5 tests passed
- 阻塞:无。
- 决策:因 WSL2 不可用,环境决策正式转向 MSYS2/MinGW + bash;`init.sh` 同时兼容 Linux 原生 venv(无 `.exe` 后缀)和 MSYS2 venv(有 `.exe` 后缀),未来迁移 WSL2 时无需修改脚本。
- 下一步:T-101 建立场景、语言、框架、数据库、功能标签模型。