From d9c1791e5665929b973f169fd68f578dcf4e6040 Mon Sep 17 00:00:00 2001 From: weichen Date: Sun, 13 Sep 2026 19:21:56 +0000 Subject: [PATCH] docs: record dockerignore hole and tightened step retry contract Co-authored-by: Cursor --- .../2026-09-13-document-revision-prelim-output.md | 5 +++-- .doc/ops/CURRENT.md | 4 ++-- .../2026-09-13-document-revision-prelim-output.md | 9 ++++++--- .../2026-09-13-document-revision-prelim-output.md | 10 ++++++---- 4 files changed, 17 insertions(+), 11 deletions(-) diff --git a/.doc/audit/2026-09-13-document-revision-prelim-output.md b/.doc/audit/2026-09-13-document-revision-prelim-output.md index ee777fb0..a3872b8b 100644 --- a/.doc/audit/2026-09-13-document-revision-prelim-output.md +++ b/.doc/audit/2026-09-13-document-revision-prelim-output.md @@ -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,不会单独提高成功率 diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 771d2da8..dd094c69 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -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 diff --git a/.doc/ops/short-term/2026-09-13-document-revision-prelim-output.md b/.doc/ops/short-term/2026-09-13-document-revision-prelim-output.md index 3db27cf1..eb4e657a 100644 --- a/.doc/ops/short-term/2026-09-13-document-revision-prelim-output.md +++ b/.doc/ops/short-term/2026-09-13-document-revision-prelim-output.md @@ -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 重跑(本轮不做) ## 验收标准 diff --git a/.doc/remediation/2026-09-13-document-revision-prelim-output.md b/.doc/remediation/2026-09-13-document-revision-prelim-output.md index 1c72a322..d8677802 100644 --- a/.doc/remediation/2026-09-13-document-revision-prelim-output.md +++ b/.doc/remediation/2026-09-13-document-revision-prelim-output.md @@ -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` ## 相关链接