docs: record dockerignore hole and tightened step retry contract

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
weichen
2026-09-13 19:21:56 +00:00
co-authored by Cursor
parent 6fd685fd47
commit d9c1791e56
4 changed files with 17 additions and 11 deletions
@@ -39,7 +39,7 @@ severity: high
| 层 | 性质 | 证据 | 问题 |
|---|---|---|---|
| MiniMax / PI SDK | **外部 provider 瞬时故障** | 同 message `terminated`;SDK 三次 `Connection error`;`auto_retry_end success=false` | 流式 `write` 未落地;in-process 重试耗尽 |
| 模板 | 产品前置条件 | 容器 `/app` 无 `templates/`;`template.md` 为两段 stub「待确认」 | writer 被迫一次性超长 `write`,拉长流式窗口 |
| 模板 | 产品前置条件 | `.dockerignore` 的 `*.md` 把 `templates/docs/*.md` 排除出 build context;即使 `COPY templates /app/templates`,镜像内仍无官方稿,`GetDocTemplate` 失败后 `workspace.go` 回落两段 stub「待确认」 | writer 被迫一次性超长 `write`,拉长流式窗口 |
| `runner.mjs` | **产品韧性缺口** | `agent_settled` 后文件头 `Outcome: SUCCESS` | 把 settle 当成成功;进程 0 ≠ 产物存在 |
| Go `runOneStep` / `AppendTrace` | **产品韧性缺口** | `trace.jsonl` `success=true` + 空 digest | 以 backend `Success` / 进程 0 入账,未按目标文件 fail-closed,也未对瞬时失败做**全新 step invocation** |
| 映射 | 产品契约 | 绝对路径 / `./` / 重复 `tasks/01_draft/output.md` | 即使 write 落地,旧映射也可能认不到 |
@@ -73,4 +73,5 @@ app 日志:`taskrun_status_transition run_id=run_1789325979820025769 error="st
## 开放问题
- 占槽后真实 UI-11 重跑;本任务保持 `in_progress`,不得标 `done`
- 本轮不重建容器;embed + runner 新契约随下次镜像生效。Go 侧必须能在**旧 runner 假成功**时靠 `execution.log` 识别瞬时失败并全新重试
- 本轮不执行 `env-service` 重建;Dockerfile / `.dockerignore` 已按 `/app/templates/docs` 读路径修好并做 context 实测。占槽后的镜像重建才带进运行中的 dev 容器
- Go 侧必须能在**旧 runner 假成功**时靠 `execution.log` 识别瞬时失败并全新重试;仅修 runner 假成功只会更早 FAIL,不会单独提高成功率
+2 -2
View File
@@ -1,11 +1,11 @@
# 当前焦点
**更新**: 2026-09-13
**production_ready**: no(DOCREV:schema **30**;第11轮 UI-11 prelim output 契约;不操作容器)
**production_ready**: no(DOCREV:schema **30**;第11轮 UI-11 prelim output 契约;编码可改 Dockerfile / 测 build context,不执行 env-service 重建)
## 焦点
1. **DOCREV-RT**: [prelim_design 缺 output.md 产物契约修复](short-term/2026-09-13-document-revision-prelim-output.md)(`fix/document-revision-prelim-output`:不伪造产物 / 不改 prompt / 不重跑 E2E / 不重建容器;仍 `in_progress`)
1. **DOCREV-RT**: [prelim_design 缺 output.md 产物契约修复](short-term/2026-09-13-document-revision-prelim-output.md)(`fix/document-revision-prelim-output`:Dockerfile + dockerignore 已测 context;有界全新 step 重试;不伪造产物 / 不改 prompt / 不重跑 E2E / 不执行 env-service 重建;仍 `in_progress`)
2. **CHAT**: [刷新恢复整改已实施](short-term/2026-09-13-chat-history-refresh-remediation.md)(待合 dev + PI E2E 补录)
3. **CI**: `TEST_DATABASE_URL` + 真实 PI E2E 实录;INTENT 发布 blocker 见 conversation-intent short-term
@@ -21,13 +21,14 @@ mutex: document-revision-prelim-output
- `internal/agent` 路径映射、目标强制、瞬时/永久分类、`Result.Retryable`
- `internal/squad` `runOneStep` 有界全新 invocation
- `deploy/pi-agent/runner.mjs` + `settle-policy.mjs`
- `deploy/app/Dockerfile` COPY templates/configs(下次镜像)
- `deploy/app/Dockerfile` `COPY templates` / `COPY configs` 到 `/app`;`.dockerignore` 放行官方 markdown
- Docker build context / `/app/templates/docs` 读路径实测(不执行 env-service 重建)
- 文档:audit / remediation / CURRENT
## 非目标
- 不伪造 `output.md`;不执行截断 `write` 参数;不改 E2E prompt;不放宽缺失校验
- 不触碰/提交证据目录;不操作/重建容器;本轮不重跑 E2E
- 不触碰/提交证据目录;不执行 env-service 重建/重启;本轮不重跑 E2E
- 不改 FEATURE-MATRIX;不合 `dev`;不 push
- 不对永久缺失(干净 settle 后无产物、`prompt_empty`、治理)无限重试
@@ -38,7 +39,9 @@ mutex: document-revision-prelim-output
3. [x] embed / 映射 / runner fail-closed + 单测 + 门禁
4. [x] 纳入现场时序:write 已流出但 `terminated`;SDK retry 1–3 Connection error;`auto_retry_end success=false`;仍 `agent_settled`;trace `success=true`
5. [x] settle-policy + Go 分类 + `runOneStep` 有界全新重试 + 单测
6. [ ] 占槽后真实 UI 重跑(本轮不做)
6. [x] `.dockerignore` 放行 `templates/**/*.md`;Docker context 实测 `/app/templates/docs/prelim_design.md`
7. [x] 已有目标不覆盖;仅 provider+缺文件或 runner 明确失败才重试
8. [ ] 占槽后真实 UI 重跑(本轮不做)
## 验收标准
@@ -23,23 +23,25 @@ updated: 2026-09-13
| 波次 | 内容 | 验收 |
|------|------|------|
| Wave 0 | `//go:embed` 官方 `templates/docs/*.md`;`GetDocTemplate` 先读 embed | 无盘上 `templates/` 时仍是正式模板 |
| Wave 0 | `.dockerignore` 放行 `templates/**/*.md` 与 `configs/**/*.md`;`COPY templates/configs` 到 `/app` | `TestDockerBuildContext_TemplatesDocsReadable`:镜像内可读官方 `prelim_design.md` |
| Wave 0 | Runner `rel_path` 归一化;缺产物则 `Success=false` | 绝对 / `./` / 重复子目录能落盘;空 patches 失败 |
| Wave 0 | `runner.mjs`:`auto_retry_end` 失败或目标不存在不得 `ok:true` | 与现场 `agent_settled` 假成功对齐 |
| Wave 1 | `settle-policy`:`terminated` / `Connection error` / `auto_retry_end` 后 settle 失败,返回 `retryable` | 干净 settle + 缺文件 → `retryable=false` |
| Wave 1 | Go `AssessStepFailure` + `runOneStep` 有界全新 invocation(≤2) | 瞬时可恢复;永久缺失只调用 1 次;耗尽仍 fail-closed |
| Wave 1 | 旧 runner 假成功:扫描 `execution.log` 识别 settled failure | 不依赖本轮 rebuild 容器 |
| Wave 1 | Go `AssessStepFailure` + `runOneStep` 有界全新 invocation(≤2) | 仅 `(provider terminated/connection + 缺目标)` 或 runner 明确失败;已有目标不覆盖;永久缺失 1 次;耗尽 fail-closed |
| Wave 1 | 旧 runner 假成功:扫描 `execution.log` 识别 settled failure | 不依赖本轮 env-service 重建 |
## 取舍
- 不从 `execution.log` 截断的 `write` 参数拼出正文。
- 不改 UI-11 prompt。Dockerfile 补 `COPY templates/configs` 仅供下次镜像,本轮不 rebuild。
- 不改 UI-11 prompt。Dockerfile / dockerignore 已修并测 context;不执行 env-service 重建。
- 产品重试是**新的** `backend.Execute` / 新 PI 进程,不是回放 SDK 半截 session,也不是执行截断 toolCall。
- 超时(整步 timeout)不按瞬时重试,避免 2×30min。
## 验收标准
- [x] embed + 路径映射 + runner fail-closed + 单测
- [x] 瞬时/永久分类 + 有界全新 step 重试 + 单测(本机门禁;真实 UI 未重跑)
- [x] dockerignore 放行官方 markdown;Docker context 可读 `/app/templates/docs/prelim_design.md`
- [x] 瞬时/永久分类 + 有界全新 step 重试 + 已有目标不覆盖 + 单测(本机门禁;真实 UI 未重跑)
- [ ] 占槽后真实 UI-11 PASS 才可将本任务标 `done`
## 相关链接