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

90 lines
5.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-15T05:24:24Z
status: verified
score: 8/8 must-haves verified
overrides_applied: 0
gaps: []
---
# Phase 6: 在输入框输入@时,可引用已生成文件和已上传附件 Verification Report
**Phase Goal:** 在当前线程聊天输入框中实现 `@` 文件引用artifacts + uploads并通过 `additional_kwargs.files` 稳定提交且具备回归测试。
**Verified:** 2026-04-15T05:24:24Z
**Status:** verified
**Re-verification:** Yes — after 06-05 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而非纯文本 | ✓ VERIFIED | `input-box.tsx` 渲染 `reference-chip`,并支持按钮删除与空输入 `Backspace` 删除最后一项。 |
| 3 | 同名场景显示“文件名+类型+路径尾段”,且上限 10ATREF-02 | ✓ VERIFIED | `MAX_REFERENCES_PER_MESSAGE = 10`;候选与预览均显示 `filename + typeLabel + pathTail`;超过上限提示“单条消息最多引用 10 个文件”。 |
| 4 | 引用通过 `additional_kwargs.files` 提交,不新增并行主结构 | ✓ VERIFIED | `hooks.ts` 提交链路写入 `additional_kwargs: { files: filesForSubmit }`。 |
| 5 | 引用提交带来源元信息且兼容既有渲染链路ATREF-03 | ✓ VERIFIED | `FileInMessage` 保留 `ref_kind/ref_source` 可选字段,消息渲染链路保持兼容。 |
| 6 | 失效引用软剔除并继续发送文本ATREF-03 | ✓ VERIFIED | `buildFilesForSubmit` 丢弃 `stale``hooks.ts` toast 后继续发送。 |
| 7 | 回归测试覆盖候选/chip/上限/软失败ATREF-04 | ✓ VERIFIED | `DF-INPUT-007/008/009` 重新验证通过008 不再永久跳过。 |
| 8 | 存在 style/logic/tests/docs 提交分组计划ATREF-04 | ✓ VERIFIED | `06-COMMIT-GUIDE.md` 保持 `style -> logic -> tests -> docs` 分组约束。 |
**Score:** 8/8 truths verified
### Required Artifacts
| Artifact | Expected | Status | Details |
| --- | --- | --- | --- |
| `frontend/src/components/workspace/input-box.tsx` | `@` 候选、过滤、chip、键盘交互、上限 10 | ✓ VERIFIED | 使用 `DropdownMenu` 候选层,包含类型/路径去歧义显示。 |
| `frontend/src/core/threads/hooks.ts` | 统一提交 `additional_kwargs.files` | ✓ VERIFIED | `filesForSubmit` 汇总后进入提交 envelope。 |
| `frontend/src/core/threads/submit-files.ts` | uploads/references 合并与 artifact 物化 | ✓ VERIFIED | `materializeArtifactReferences` + `buildFilesForSubmit` 正常工作。 |
| `frontend/src/core/messages/utils.ts` | `FileInMessage` 扩展兼容 | ✓ VERIFIED | 字段扩展为可选,未破坏旧数据。 |
| `frontend/src/core/threads/hooks.test.ts` | 提交流程与软失败单测 | ✓ VERIFIED | 4 条测试通过。 |
| `frontend/tests/e2e/input-and-compose.spec.ts` | `@` 引用 E2E 回归 | ✓ VERIFIED | `DF-INPUT-007/008/009` 全部通过。 |
| `.planning/phases/06-/06-COMMIT-GUIDE.md` | 分组提交计划 | ✓ VERIFIED | 分组与执行顺序清晰。 |
### Key Link Verification
| From | To | Via | Status | Details |
| --- | --- | --- | --- | --- |
| `input-box.tsx` | `uploads/hooks.ts` | `useUploadedFiles(threadId)` | ✓ WIRED | 候选来源连接正常。 |
| `input-box.tsx` | `thread.values.artifacts` | thread artifacts 候选源 | ✓ WIRED | 直接读取。 |
| `input-box.tsx` | `hooks.ts` | `PromptInputMessage.references` | ✓ WIRED | `handleSubmit` 将 references 合并后提交。 |
| `hooks.ts` | `submit-files.ts` | `buildFilesForSubmit/materializeArtifactReferences` | ✓ WIRED | 提交前标准化已接入。 |
| `hooks.ts` | `additional_kwargs.files` | 提交 envelope | ✓ WIRED | 主链路输出一致。 |
| `input-box.tsx` | `dropdown-menu.tsx` | Dropdown 候选面板 | ✓ WIRED | 使用 `DropdownMenuContent/Item`。 |
### Behavioral Spot-Checks
| Behavior | Command | Result | Status |
| --- | --- | --- | --- |
| 提交构建与软失败单测 | `cd frontend && node --test src/core/threads/hooks.test.ts` | 4 passed, 0 failed | ✓ PASS |
| 类型检查 | `cd frontend && pnpm -s typecheck` | exit 0 | ✓ PASS |
| 引用回归 E2E | `cd frontend && pnpm -s test:e2e --grep "DF-INPUT-007|DF-INPUT-008|DF-INPUT-009"` | 3 passed | ✓ PASS |
### Requirements Coverage
| Requirement | Source Plan | Description | Status | Evidence |
| --- | --- | --- | --- | --- |
| ATREF-01 | 06-02, 06-05 | `@` 仅显示当前线程候选并支持过滤 | ✓ SATISFIED | 候选来源与过滤行为已验证。 |
| ATREF-02 | 06-02, 06-05 | chip 展示 + 同名去歧义(文件名+类型+路径尾段)+ 上限 10 | ✓ SATISFIED | 代码常量/文案/E2E 断言已统一为 10。 |
| ATREF-03 | 06-01, 06-05 | `additional_kwargs.files` 提交 + 元信息 + stale 软剔除 | ✓ SATISFIED | hooks + submit-files + 单测通过。 |
| ATREF-04 | 06-03, 06-05 | 单测+E2E 回归 + 提交分组计划 | ✓ SATISFIED | 关键 E2E 用例稳定通过,分组文档完整。 |
Orphaned requirements for Phase 6: None.
### Anti-Patterns Found
| File | Line | Pattern | Severity | Impact |
| --- | --- | --- | --- | --- |
| `frontend/src/components/workspace/input-box.tsx` | 745 | `TODO` connector 占位注释 | Info | 与 Phase 6 验证目标无阻断关系。 |
### Gaps Summary
No unresolved verification gaps in Phase 6.
---
_Verified: 2026-04-15T05:24:24Z_
_Verifier: Codex (re-verified with current workspace state)_