deerflow2/.planning/phases/06-/06-VERIFICATION.md

135 lines
9.6 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

---
phase: 06-
verified: 2026-04-15T07:42:05Z
status: gaps_found
score: 8/10 must-haves verified
overrides_applied: 0
re_verification:
previous_status: verified
previous_score: 8/8
gaps_closed:
- "提及文件ref_kind=mention发送时不再被识别为本次新上传文件。"
gaps_remaining:
- "Validation/UAT/Requirements 文档闭环未完成,状态与当前实现不一致。"
regressions: []
gaps:
- truth: "Validation 文档的 Wave 0 缺口被关闭或显式替换为可执行命令。"
status: failed
reason: "06-VALIDATION.md 仍包含 pending/未签核项,未体现 06-05/06-06 后的最新验证结果。"
artifacts:
- path: ".planning/phases/06-/06-VALIDATION.md"
issue: "Per-Task 状态仍有 ⚠️/⬜ pendingValidation Sign-Off 全部未勾选Approval 仍为 pending。"
missing:
- "回写 06-05/06-06 最新自动化结果并完成 Validation Sign-Off。"
- truth: "must_haves、requirements-completed、UAT gaps 已形成一致闭环。"
status: failed
reason: "实现已前进,但 UAT/REQUIREMENTS 追踪状态仍停留在 diagnosed/pending文档闭环不一致。"
artifacts:
- path: ".planning/phases/06-/06-UAT.md"
issue: "status 仍为 diagnosed且仍记录“mention 被当作 upload”为 failed。"
- path: ".planning/REQUIREMENTS.md"
issue: "ATREF-01..04 在需求与 Traceability 表中仍为 Pending。"
missing:
- "按当前代码与测试结果更新 06-UAT.md 的 test/gap 状态。"
- "回写 REQUIREMENTS.md 中 ATREF-01..04 的状态(至少 Traceability。"
---
# Phase 6: 在输入框输入@时,可引用已生成文件和已上传附件 Verification Report
**Phase Goal:** 在当前线程聊天输入框中实现 `@` 文件引用artifacts + uploads并通过 `additional_kwargs.files` 稳定提交且具备回归测试。
**Verified:** 2026-04-15T07:42:05Z
**Status:** gaps_found
**Re-verification:** Yes — after 06-06 gap closure
## Goal Achievement
### Observable Truths
| # | Truth | Status | Evidence |
| --- | --- | --- | --- |
| 1 | `@` 仅展示当前线程候选并支持过滤ATREF-01 | ✓ VERIFIED | `input-box.tsx` 使用 `thread.values.artifacts` + `useUploadedFiles(threadId)` 聚合,`findMentionToken`+`mentionQuery` 过滤。 |
| 2 | 选中候选后显示可删除引用 chipATREF-02 | ✓ VERIFIED | [input-box.tsx](/home/mt/Project/deerflow2/frontend/src/components/workspace/input-box.tsx:562) 渲染 `reference-inline-preview/reference-chip`,并支持 remove。 |
| 3 | 同名去歧义“文件名+类型+路径尾段”且上限 10ATREF-02 | ✓ VERIFIED | [input-box.tsx](/home/mt/Project/deerflow2/frontend/src/components/workspace/input-box.tsx:568) 展示 type+pathTail[input-box.tsx](/home/mt/Project/deerflow2/frontend/src/components/workspace/input-box.tsx:348) 限制第 11 个并 toast。 |
| 4 | 引用通过 `additional_kwargs.files` 单一 envelope 提交ATREF-03 | ✓ VERIFIED | [hooks.ts](/home/mt/Project/deerflow2/frontend/src/core/threads/hooks.ts:610) 提交 `additional_kwargs: { files }`[submit-files.ts](/home/mt/Project/deerflow2/frontend/src/core/threads/submit-files.ts:82) 写入 `ref_kind/ref_source`。 |
| 5 | stale 引用软剔除且文本继续发送ATREF-03 | ✓ VERIFIED | [submit-files.ts](/home/mt/Project/deerflow2/frontend/src/core/threads/submit-files.ts:73) 跳过 stale[hooks.ts](/home/mt/Project/deerflow2/frontend/src/core/threads/hooks.ts:596) 仅 toast 后继续 submit。 |
| 6 | **06-06**mention 不被识别为新上传文件 | ✓ VERIFIED | [uploads_middleware.py](/home/mt/Project/deerflow2/backend/packages/harness/deerflow/agents/middlewares/uploads_middleware.py:172) `ref_kind=="mention"` 直接跳过。 |
| 7 | `<uploaded_files>` new_files 仅包含真实上传 | ✓ VERIFIED | `_files_from_kwargs` 过滤 mention 后才进入 `new_files`;回归测试 [test_uploads_middleware_core_logic.py](/home/mt/Project/deerflow2/backend/tests/test_uploads_middleware_core_logic.py:146) 与 [test_uploads_middleware_core_logic.py](/home/mt/Project/deerflow2/backend/tests/test_uploads_middleware_core_logic.py:162)。 |
| 8 | ATREF-04 自动化回归可执行(单测+E2E | ✓ VERIFIED | `node --test hooks.test.ts` 4 通过;`pnpm test:e2e --grep DF-INPUT-007/008/009` 3 通过;`uv run pytest -k \"mention or files_from_kwargs\"` 2 通过。 |
| 9 | Validation 的 Wave 0 闭环完成 | ✗ FAILED | [06-VALIDATION.md](/home/mt/Project/deerflow2/.planning/phases/06-/06-VALIDATION.md:45) 仍有 `pending`[06-VALIDATION.md](/home/mt/Project/deerflow2/.planning/phases/06-/06-VALIDATION.md:68) Sign-Off 未完成。 |
| 10 | must_haves / requirements-completed / UAT gaps 闭环一致 | ✗ FAILED | [06-UAT.md](/home/mt/Project/deerflow2/.planning/phases/06-/06-UAT.md:2) 仍 `diagnosed` 且 mention 误判仍记 failed[REQUIREMENTS.md](/home/mt/Project/deerflow2/.planning/REQUIREMENTS.md:72) `ATREF-01..04` 仍 Pending。 |
**Score:** 8/10 truths verified
### Required Artifacts
| Artifact | Expected | Status | Details |
| --- | --- | --- | --- |
| `backend/packages/harness/deerflow/agents/middlewares/uploads_middleware.py` | mention 与 upload 语义分离 | ✓ VERIFIED | `_files_from_kwargs` 过滤 `ref_kind=mention`。 |
| `backend/tests/test_uploads_middleware_core_logic.py` | mention 过滤回归测试 | ✓ VERIFIED | 新增 mention-only / mixed-list 两条测试。 |
| `frontend/src/components/workspace/input-box.tsx` | 候选、chip、上限、去歧义 | ✓ VERIFIED | UI 合同字段和 testid 都在位。 |
| `frontend/src/core/threads/hooks.ts` | 单一 files envelope + soft-fail | ✓ VERIFIED | 两条提交流程都接入 `buildFilesForSubmit`。 |
| `.planning/phases/06-/06-VALIDATION.md` | 与当前验证状态一致 | ⚠️ PARTIAL | 文档仍有 pending/未签核项。 |
| `.planning/phases/06-/06-UAT.md` | gap closure 已回写 | ✗ FAILED | 仍停留在旧诊断结果。 |
### Key Link Verification
| From | To | Via | Status | Details |
| --- | --- | --- | --- | --- |
| `input-box.tsx` | `hooks.ts` | `PromptInputMessage.references` | ✓ WIRED | `onSubmit` 注入 `references` 并发送。 |
| `hooks.ts` | `submit-files.ts` | `buildFilesForSubmit/materializeArtifactReferences` | ✓ WIRED | 提交前统一归一化并构建 files。 |
| `submit-files.ts` | `uploads_middleware.py` | `additional_kwargs.files[*].ref_kind/ref_source` | ✓ WIRED | 前端写 `ref_kind=mention`,后端读取并过滤 mention。 |
| `uploads_middleware.py` | agent context | `<uploaded_files>` 注入 | ✓ WIRED | `new_files` 过滤后再注入内容。 |
| `06-UAT.md` | 06-05/06-06 实现结果 | gap 状态回写 | ✗ NOT_WIRED | 文档未更新到最新实现。 |
### Data-Flow Trace (Level 4)
| Artifact | Data Variable | Source | Produces Real Data | Status |
| --- | --- | --- | --- | --- |
| `hooks.ts` | `filesForSubmit` | `buildFilesForSubmit(uploadedFileInfo, normalizedReferences)` | Yes | ✓ FLOWING |
| `submit-files.ts` | `referenceFiles[*].ref_kind/ref_source` | `message.references`(含 artifact materialization | Yes | ✓ FLOWING |
| `uploads_middleware.py` | `new_files` | `message.additional_kwargs.files` | Yes过滤 mention仅保留真实 upload | ✓ FLOWING |
### Behavioral Spot-Checks
| Behavior | Command | Result | Status |
| --- | --- | --- | --- |
| 引用构建与软失败单测 | `cd frontend && node --test src/core/threads/hooks.test.ts` | 4 passed, 0 failed | ✓ PASS |
| `@` 引用 E2E 主链路 | `cd frontend && pnpm -s test:e2e --grep "DF-INPUT-007|DF-INPUT-008|DF-INPUT-009"` | 3 passed | ✓ PASS |
| mention 过滤后端回归 | `cd backend && uv run pytest -q tests/test_uploads_middleware_core_logic.py -k "mention or files_from_kwargs"` | 2 passed | ✓ PASS |
| 直接 `pytest` 入口可用性 | `cd backend && python3 -m pytest -q ...` | `No module named pytest` | ? SKIP需使用 `uv run` |
### Requirements Coverage
| Requirement | Source Plan | Description | Status | Evidence |
| --- | --- | --- | --- | --- |
| ATREF-01 | 06-02, 06-05 | `@` 候选限定当前线程并可过滤 | ✓ SATISFIED | 代码链路 + DF-INPUT-007 通过。 |
| ATREF-02 | 06-02, 06-05 | chip 展示 + 去歧义 + 上限 10 | ✓ SATISFIED | 输入框合同与 DF-INPUT-009 通过。 |
| ATREF-03 | 06-01, 06-05 | `additional_kwargs.files` 提交 + stale 软剔除 | ✓ SATISFIED | hooks/submit-files + hooks.test 通过。 |
| ATREF-04 | 06-03, 06-05, 06-06 | 自动化回归 + 提交分组计划 | ✓ SATISFIED | E2E/单测/后端回归 + COMMIT-GUIDE。 |
Orphaned requirements for Phase 6: None.
### Anti-Patterns Found
| File | Line | Pattern | Severity | Impact |
| --- | --- | --- | --- | --- |
| `frontend/src/components/workspace/input-box.tsx` | 745 | TODO 注释 | Info | 与 Phase 6 核心目标无阻断。 |
| `frontend/src/components/workspace/input-box.tsx` | 1128 | TODO 注释 | Info | 与 mention/upload 链路无直接关系。 |
### Human Verification Required
### 1. 候选面板视觉锚定
**Test:** 在真实页面滚动和不同窗口宽度下,输入 `@` 观察候选面板是否“紧贴输入框上方”。
**Expected:** 面板稳定贴近输入框上边缘,不出现明显漂移。
**Why human:** 这是视觉/交互感知问题,自动化命中无法覆盖所有布局场景。
### Gaps Summary
代码与自动化层面06-06 新增 gapmention 被当作 upload已关闭且回归测试通过。当前阻塞来自**文档闭环**`06-VALIDATION.md`、`06-UAT.md`、`REQUIREMENTS.md` 未同步到最新验证状态导致“must_haves / requirements-completed / UAT gaps”三者不一致。
---
_Verified: 2026-04-15T07:42:05Z_
_Verifier: Codex (gsd-verifier)_