135 lines
9.6 KiB
Markdown
135 lines
9.6 KiB
Markdown
---
|
||
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 状态仍有 ⚠️/⬜ pending,Validation 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 | 选中候选后显示可删除引用 chip(ATREF-02) | ✓ VERIFIED | [input-box.tsx](/home/mt/Project/deerflow2/frontend/src/components/workspace/input-box.tsx:562) 渲染 `reference-inline-preview/reference-chip`,并支持 remove。 |
|
||
| 3 | 同名去歧义“文件名+类型+路径尾段”且上限 10(ATREF-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 新增 gap(mention 被当作 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)_
|