Compare commits

..
Author SHA1 Message Date
weichenandCursor 1d57adddf9 Revise the fast-slow r2 proposal for the second review
Why: Second review kept stages 1-4 at "needs revision": narrow-screen placement
conflicted, unread and current/history rules were inconsistent, idempotency and
quote authorization scope were open, NB12 lacked acceptance for closing a
satisfied choice, and the light-notice assumption had no decidable walkthrough.
Evidence: SELF only. Consistency script PASS (NB01-NB24 and text structure);
real model, browser walkthrough and make test are NOT_RUN.
Impact: Documents only, r2-draft.3. Stage conclusions stay unreviewed; no
business code is authorized.
Refs: Dev task feature/fast-slow-r2-nonblocking

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 06:38:37 +00:00
weichenandCursor a672adb7aa Revise the fast-slow r2 proposal after review
Why: stages 1-4 needed spec conflicts closed before another review, without treating the agent review as approval.
Evidence: SELF consistency check over NB01-NB24; product tests NOT_RUN.
Impact: proposal text only. Review status stays unreviewed. No business code.
Refs: docs/proposals/2026-10-15-fast-slow-r2-nonblocking.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 05:56:20 +00:00
weichen 0f06abd57c Merge authoritative main into the documents task branch
Why: the r2 revision must sit on the current documents baseline before Dev sync.

Evidence: fetched origin/main=d668a3e0ac345dc80a72d15469f25918c4535ee6.

Impact: integrate upstream documents without rewriting task history.

Refs: feature/fast-slow-r2-nonblocking
2026-10-15 05:48:32 +00:00
weichen d668a3e0ac Merge pull request 'Record the svc plugin compose proposal' (#107) from feature/svc-plugin-compose-design into main
Why: keep the compose proposal in the document set while it remains under review.
Evidence: this repository has no workflow; head 2a8deac89d contains origin/main. Backend CI is already green and merged.
Impact: proposal status stays pending review. Inclusion is not approval.
Refs: #107
2026-10-15 03:58:32 +00:00
weichenandCursor 3a43ce6856 Record the pending fast-slow r2 interaction proposal
Why: Approved r1.1 still auto-reports background completion and the live timeline repeats progress. This draft proposes one task card per background job and waits for review before any product change.
Evidence: SELF source audit against Backend 0a57853 and Frontend 5ab8143. No tests run; this change is documentation only.
Impact: Proposal, implementation plan, and index only. r1.1 stays effective until review. No product code.
Refs: Dev feature/fast-slow-r2-nonblocking
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 03:53:33 +00:00
weichenandCursor 2a8deac89d Add the svc plugin compose deploy proposal
Why: deploy needs a reviewed design for compiling selected plugins into the base binary before that behavior is treated as approved.
Evidence: the proposal records the throwaway compose build; implementation status stays unreviewed.
Impact: adds a pending proposal and an index link. Inclusion does not approve the design.
Refs: Dev .task/feature-svc-plugin-compose.md
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-15 02:03:03 +00:00
weichen 87b88018b9 Merge pull request 'Record U1-U6 completion and owner-blocked exit in the DHF plan' (#106) from feature/dhf-u5u6-progress into main 2026-10-14 18:12:19 +00:00
weichen 136534ce0d Record U1-U6 completion and owner-blocked exit in the DHF plan
Why: the plan's progress annex still described the pre-adjudication
state (44 needs-review, U2-U6 pending); the authoritative record must
reflect the 2026-10-14 landing: batch adjudication, publication flip
(44/44 published), U5 product-loop wiring with pilot pass, U6
per-identity matrix (41 PASS + 2 EXPECTED_BLOCKED + 1 EXPECTED_LIMITED),
and the owner-side exit items (deployment pilot, independent REPLAY,
U4 originals) now blocked on the owner per the handoff checklist.

Evidence: docs-only change in the Documents repo; all referenced RDM
PRs (#377/#381/#383/#385/#387/#389/#391) carry green CI and merged
state; pilot and matrix outputs are recorded in the RDM task cards and
docs/records/dhf/.

Impact: plan annex only; no code or asset change.

Refs: RDM docs/records/dhf/package-review-decision-2026-10-14.md;
RDM docs/records/dhf/u6-acceptance.md; u6-replay-handoff.md
2026-10-14 18:10:20 +00:00
weichen 19aa34efe6 Merge pull request 'Record approved manual merge queue expansion plan' (#105) from feature/merge-queue-manual-phase2-plan into main 2026-10-14 14:32:01 +00:00
weichen a665c2d0b9 Record approval of manual expansion plan
Why: Preserve the owner’s Stage 5 decision and implementation method on the reviewed plan object.

Evidence: Owner approved plan 28c4ceb in the task conversation; git diff --check and relative links passed (SELF).

Impact: Documentation status only; Dev implementation remains subject to Stage 6 and 7 review.

Refs: Agent-System-Documents #105; Agent-System-Dev #518
2026-10-14 14:31:48 +00:00
weichen 28c4ceb173 Plan controlled manual merge queue expansion
Why: The approved Stage 4 design needs a reviewable Stage 5 implementation and test sequence.

Evidence: git diff --check, relative-link validation, M2-1 through M2-6 coverage, and placeholder scan passed (SELF).

Impact: Documentation only; no Dev queue activation or task takeover.

Refs: Agent-System-Documents #104; Agent-System-Dev #518
2026-10-14 14:29:48 +00:00
weichen 8e3b5b0d28 Merge pull request 'Record approved manual merge queue expansion design' (#104) from feature/merge-queue-manual-phase2-design into main 2026-10-14 14:27:46 +00:00
weichen 77c8cc2548 Record approval of manual merge queue expansion design
Why: Preserve the owner’s Stage 4 conclusion against the reviewed design object.

Evidence: Owner approved Documents PR #104 design aa4d372 in the task conversation; git diff --check passed.

Impact: Design only; Stage 5 implementation and test plan remains unapproved.

Refs: Agent-System-Documents #104; Agent-System-Dev #518
2026-10-14 14:26:28 +00:00
weichen aa4d372f01 Describe controlled manual merge queue expansion
Why: The first trial reduced final CI churn, while later Dev merges exposed gaps in shared window records that must be addressed before broadening manual coordination.

Evidence: SELF Gitea API snapshot for PR #539–#548, current #518 comments, protection and open PR states; fixed first-trial report and current project rules reviewed.

Impact: Add a stage-4 design and evidence snapshot only; no queue activation, platform protection change, production task takeover, or workflow edit.

Refs: Dev issue #518; Documents 2026-10-14 merge queue trial report
2026-10-14 14:20:34 +00:00
weichen 5909cb37cf Merge pull request 'Record merged state of the first U1 increment in the DHF plan note' (#103) from feature/dhf-plan-progress-note into main 2026-10-14 09:53:20 +00:00
8 changed files with 1131 additions and 0 deletions
@@ -17,6 +17,7 @@ execution: code
- owner 已批准 r0.1 的需求、方案和实施计划并授权 U1–U6 按阶段推进,另批准 E1-R1 隔离追加试验。U1 当前增量已走完阶段 6–10:阶段 6/7 获 owner 人工结论,独立 Review 闭合整改,最终 HEAD 的 GATE 与独立重放核验记录在案,三份交付 PR 均已合入。
- RDM 已封装 44 个逻辑原件,owner 分别接受项目建议书、F01、F02、DI 四份确切四哈希包(内容与版式接受,正式发布授权仍未给出);全部 44 项仍 `needs-review`,正式发布数 0。E1/E1-R1 使 14 DOC 均有转换候选,但逐项 Word 保真 **NOT_PASSED**;其余 40 项待包级裁定。F01/F02 的正式类型/存量字典升级及 U2–U6 真实产品流程仍未完成。
- U1 当前增量的终态以归档任务卡为准:Dev 仓 `.task/archive/feature-dhf-template-pipeline-plan.md`(随 Dev #542 归档合入)。合入记录:[Documents #102](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Documents/pulls/102) merge `9062445db808`、[RDM #365](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-RDM/pulls/365) merge `57d2214feb0a`、[Dev #540](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/540) merge `11aa76a3bc1c`,三个 main 树各自与受测 head 一致。U1 剩余 40 项包级裁定、14 DOC 保真对照、类型合同与 U2–U6 按本方案顺序继续;此前 WIP/待整改表述与旧 GATE 不再作为放行依据。
- **2026-10-14 收口(本轮)**:批量 1–5 包级裁定获 owner「全部按推荐」批复并落档(RDM `docs/records/dhf/package-review-decision-2026-10-14.md`);其余 DOC 11 份(#377)与 DOCX 17 份(#381)四哈希候选包合入,44/44 具备候选包;owner 同轮授权 catalog 翻转,#383 将 44 项全部置 `published`+confirmed+绑定四哈希+issues 全清。U5 交付命令接线与实例播种随 #385 落地,真实产品二进制全链路试点 PASS;U6 逐项验收矩阵随 #387 完成——44/44 入账=41 PASS+2 EXPECTED_BLOCKED(F01/F02 字典门禁,owner 裁定暂缓)+1 EXPECTED_LIMITED(无槽位确认报告,空填充 fail-closed 拒绝实测),0 FAIL;过程中修复 F05/F06 封面双层嵌套缺陷并补登记 11 个批量裁定 docType。卡片 #379/#382/#384/#386/#388/#390/#392 全部归档,RDM main `c5ea0f5`。交接文档 [u6-replay-handoff.md](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-RDM/src/branch/main/docs/records/dhf/u6-replay-handoff.md) 固化 owner 侧三项动作:①部署发布包+三用户真实试点(回传导出 Word SHA256 与审签元数据);②独立审阅者以一键驱动 `scripts/dhf-u6-replay.sh` 完成 R1–R4 重放并签署(作者 SELF 试运行全绿,审阅者重跑方为 REPLAY);③提供带附件/页眉页脚的真实原件路径以启动 U4。独立 REPLAY 与真实环境试点完成前,本方案 DoD 的「试点交付/全量交付」两项维持 owner 阻塞态。
修订 r0.1;需求负责人 weichen;方案编制 Codex;各仓实施负责人待立项指定。
本文件是 DHF 接入专项的评审草案,授权终点为源码/资产调查、方案和计划文档、记忆归档。
@@ -0,0 +1,113 @@
# Dev main 第二轮 manual 合入调度实施与测试计划
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 让第二轮三个已授权真实任务在同一人工窗口中按序完成最终同步、审核、CI 与智能体合入,同时把所有已知 Dev main 写入及失败退出记录在唯一调度 Issue;正常排队推进不使等待分支反复重跑最终 CI。
**Architecture:** 保留现有 Gitea 分支保护、三项 PR 检查和 `task-sync`;Dev `policy/` 仅说明项目采纳、写者覆盖、记录字段及停止条件。Issue #518 是动态窗口唯一来源,原任务卡保留授权与阶段结论。只读对账从实际 main PR/合入列表反查 #518 的先前领取与事后释放;无原子锁、无自动调度服务。
**Tech Stack:** Git/Gitea 1.27 API、Dev `make precheck`/`make evidence`/`make task-sync`、Markdown 规范与 JSON 收据、现有 `.gitea/workflows/ci.yaml`。
**Spec:** [已批准的阶段 4 设计](2026-10-14-merge-queue-manual-phase2.md),Documents PR #104(合入 `8e3b5b0d2838f89430683ec731a15b32b4fa5eae`);[首轮报告](../records/2026-10-14-merge-queue-trial.md)与 Dev #518 是历史与动态证据,不能以本计划代替实时回读。
## Global Constraints
- 范围仅为 Dev 仓库 ID=29、`refs/heads/main`;普通、闭卡、紧急和机器人目标写入都纳入同一记录。组件仓按自身目标协调。
- 第二轮样本为**随后实际就绪的三个已授权真实任务**;闭卡单列。#482、#512、#537 不因本计划自动取得接管或合入授权。
- 现有 Gitea 保护、必需检查、CI workflow 和 runner 全局配置保持不变;最终 PR HEAD 的 `test`、`test-pg`、`svc-realcombo` 均须取得真实 GATE。
- 采用单一协调者维护的 `manual` 窗口。Issue 编辑、评论、`content_version` 和本地锁都不是平台原子互斥;旧执行者未确认退出时不得接管。
- 无进展 20 分钟、单窗口 90 分钟、已知基础设施失败最多额外重试一次、队列每 30 分钟复核;领取前当场核对 runner 容量。
- 阶段 5–7 依 `policy/delivery.md` 分别取得人工结论;阶段 8–9 由智能体审阅、核验精确 HEAD 与平台准入并合入。阶段 5 批准不等于第二轮已启用。
- 所有通过断言区分 GATE、REPLAY、SELF;本地输出经 `make evidence` 写入,固定后收据置于源码外;未知结果先读回,不盲目重复副作用请求。
## Review Focus
1. **已知写者仍从另一入口推进 main:**任务 2 的对账应查到实际合入但缺先前领取,暂停新领取并标记受影响候选失效。
2. **Issue 中只有事后补记:**任务 2 的对账应区分先前领取与事后释放;#539 不能被算作合格覆盖。
3. **候选固定后内容或 base 变化:**任务 3 的核验应建立新尝试,并拒用旧 Review/CI;同基线重复 `task-sync` 应保持 HEAD 不变。
4. **合入响应未知或协调者失联:**任务 3 应先回读 PR/main 并保持 `reconciling`,确认前执行者退出后才释放/交接。
5. **没有三个已就绪任务:**任务 4 应保持 `waiting`,不接管 #482/#512 或制造生产 PR,不把缺样本写为通过。
| 设计验收 | 计划中的主要验证 |
|---|---|
| M2-1 | 任务 2 入队字段、任务 4 三个真实任务与等待期间最终 CI 清单 |
| M2-2 | 任务 2 的逐合入只读对账、任务 4 每次 main 推进后的覆盖核对 |
| M2-3 | 任务 3 的同基线无变更与变更后新尝试重放 |
| M2-4 | 任务 3 的精确 HEAD 三项 GATE/智能体合入、任务 4 的每任务对象记录 |
| M2-5 | 任务 4 对正常排队造成的最终 CI 废弃数和所有 CI 成本分类 |
| M2-6 | 任务 2/3 的异常决策表与任务 4 的自然退出/`NOT_RUN` 记录 |
---
### Task 1: 固定实施范围与 Dev 规范入口(M2-1、M2-3)
**Files:**
- Modify: Dev `policy/merge-queue.md` 的状态、项目调度记录、启动与同步、采纳顺序及验收表。
- Modify: Dev `policy/adoption.md` 中合入调度采纳行。
- Modify: Dev `policy/tool-adaptation-matrix.md` 的 A10/A11 行。
- Read only: Dev `AGENTS.md`、`policy/delivery.md`、`policy/governance.md`、Guidelines 固定版 `standards/merge-queue.md`。
**Interfaces:** 仅细化已固定通用规范,不改 `task-sync`、`make evidence` 或 CI 接口。规范链接指向 Documents 阶段 4 设计和 #518;`policy/adoption.md` 区分“规范已合入”“第二轮待启用”“manual 能力”;A10 说明 Issue 协作与平台准入的不同强度。
- [ ] 在 Dev 当前 main 创建未占用收据路径,运行下列启动门禁并确认 READY;按输出读必读规范。新任务用同一收据建独立工作区,记录 R0 与写者归属;若任务已登记则在原 worktree 改用 `make task-resume PRECHECK_RECEIPT="$mq_receipt"`,不重复开卡。BUSY、SYNC_REQUIRED、REMOTE_UNVERIFIED 先排除。
```bash
mq_receipt="/tmp/mq-phase2-stage6-precheck-$(date -u +%Y%m%dT%H%M%SZ)-$$.json"
RECEIPT="$mq_receipt" CMD='make precheck' make evidence
make task-start NAME=feature/merge-queue-manual-phase2 PRECHECK_RECEIPT="$mq_receipt"
```
- [ ] 对照当前 Dev main、Guidelines gitlink、#518 与已合入设计。把 `policy/merge-queue.md` 首轮“本轮三个任务待完成”“本分支”等已过期时态改为历史结果,把第二轮规则明确标为 `approved/pending-activation`,并逐项写明 `ready_at`、`queue_entered_at`、`attempt_id`、`initial_base_sha`、`source_head_sha`、`sync_base_sha`、`frozen_head_sha`、组件/检查定义、Review 与 GATE、实际合入/释放。动态值只在 #518,不复制静态队列表。
- [ ] 在 `policy/adoption.md` 与 A10/A11 中指向同一设计及项目规则:保留首轮原始证据范围;第二轮标 `manual`、`pending-activation`,不可升级成 `enforced` 或声称自动互斥;现有源码外收据能力保持原样。
- [ ] 检查 `AGENTS.md` 与 `policy/delivery.md` 对合入窗口及阶段 7–9 的指向。若现有入口已覆盖,只记录无需修改;若确有入口断链,按文档范围补链接并将变化列入 Review。
- [ ] 运行 `git diff --check`、Markdown 相对链接检查和规则一致性检查:阶段 5 批准后尚未启用、缺写者覆盖时必须保持 waiting、三个必需检查没有删减。若动到治理脚本或任务卡模板,另运行 `CMD='make test-governance' make evidence`;纯文档不制造新脚本测试。
- [ ] 将本单元源码与 SELF 检查收据写入原任务卡并提交;阶段 6 人工评审前不把 #518 标为第二轮 active。
### Task 2: 建立 #518 入队模板与只读覆盖对账(M2-1、M2-2、M2-6)
**Files:**
- Modify: Dev `policy/merge-queue.md` 的记录示例、写者覆盖、异常与暂停规则。
- Prepare then update after Stage 6 approval: Gitea Dev Issue #518 正文的第二轮入口与追加式评论模板;不建立第二份队列状态文件。
- Save outside source: 每次只读 Gitea API 对账的原始脱敏 JSON/`make evidence` 收据;必要结论只引用对象和链接。
**Interfaces:** #518 条目至少包含 `entry_id`、目标、PR/任务卡、owner/协调者、授权与阶段版本、依赖、`queue_entered_at`、`ready_at`、状态;领取评论补 Task 1 的 attempt 字段;释放评论补实际 PR/main SHA、合入结果及 GATE 链接。`ready_at` 未知标 `NOT_MEASURED`,不足条件标 `blocked`。
- [ ] 只读查询 Dev 当前 main SHA、开放 PR、仓库协作者、可写工作区 owner、机器人/webhook/workflow 入口、#518 正文与评论,生成带观察时间和对象 SHA 的 SELF 清单;无法查到的写者类别标“未核验”,不推断不存在。
- [ ] 在 Task 1 规范中给出普通、闭卡、紧急、机器人共同的入队/领取/释放字段,规定 `blocked` 不占窗口;跨仓组件未就绪不占 Dev 窗口。未知来源与旧执行者未退出必须暂停或 `reconciling`,不得靠 20 分钟超时接管。
- [ ] 固定只读对账步骤:枚举观察区间内实际合入 Dev main 的 PR/merge SHA;逐个在 #518 找**合入前**同目标同 attempt 的领取和**合入后**释放;同时反查 Issue 中仍占用但 PR 已关闭/合入的窗口。分列“合格、仅事后补记、未找到、结果不明”,保留 API 原始响应与分页范围。
- [ ] 用 [阶段 4 SELF 快照](../records/2026-10-14-manual-phase2-source-audit.json) 回放对账口径:#539 属“仅事后补记”,#540/#542 能找到领取/释放,其余七个仅可记“在该次 #518 观察中未找到”;不得倒推出其他渠道绝无协调。源记录更新后另取实时快照,不用历史快照证明当前覆盖。
- [ ] 将模板与覆盖清单先作为 Dev PR/任务卡可审附件;Stage 6 人工确认后才更新 #518 的**待启用**入口。写入前读回 `content_version` 与活动窗口,遇到别人更新先重算差异;请求结果未知先 GET 对账,不重复 PATCH/POST。
- [ ] 当场向每位**已知目标写者**核实采用同一窗口的确认;未确认类别逐项留记录。没有全体已知写者覆盖,不转 active、不领取三个样本。人工确认不等于 Gitea 执行端隔离。
### Task 3: 用现有门禁交付 Dev 规则并验证异常边界(M2-3、M2-4)
**Files:**
- Modify: Task 1/2 的 Dev 规则差异及原任务卡(仅在候选固定前)。
- Save outside source: 最终 precheck、task-sync、直接相关检查、Review 和 CI 的原始收据及对象索引。
**Interfaces:** 复用 `make task-sync`、`make evidence`、Gitea PR/Actions 与现有分支保护;不新增自动队列或跳过 CI 的入口。
- [ ] 在阶段 6 人工通过后,正式测试前对 Dev 规则 PR 执行一次 `make task-sync`,处理真实冲突、确认组件不回退,先写完任务卡和需提交证据,再固定并推送 PR HEAD。若有脚本/模板改动跑 `make test-governance`,Dev 组合按变更影响跑 `make test`/`make build`,由 `make evidence` 保存完整 SELF 输出。
- [ ] 在临时真实 Git 场景复核同 base/head 重复 `task-sync` 的 HEAD、索引和组件不变;目标前进或候选内容变时,新 attempt 的 base/head 与旧 CI/Review 不同,旧结果不能放行。若本增量未改同步脚本,引用现有治理回归并做最小重放,不重复整个历史试行。
- [ ] 用只读或隔离模拟验证异常决策表:未登记 main 推进→暂停及候选失效;合入 API 超时/断连→`reconciling` 并先读 PR/main;代码/Review 失败→当前条目 blocked 并安全释放;未发生真实生产故障的路径只标模拟或 `NOT_RUN`。
- [ ] 阶段 7 人工审阅固定候选与测试映射后,由智能体完成阶段 8 Review 与影响重放;阶段 9 合入前再次同步核对最新 base/head/组件及当次要求的 GATE 身份、SHA、三项结果。合入请求固定 `head_commit_id` 且 `force_merge=false`,回读 PR/main 树与合入 SHA。若候选改变,重新测试及受影响评审,不沿用旧绿灯。
- [ ] 把实际阶段 6/7/8/9 结果及 GATE/REPLAY/SELF 来源写入原任务记录;规则 PR 合入并不自动启用第二轮任务窗口。
### Task 4: 第二轮启用、三任务试行与收口(M2-1–M2-6)
**Files:**
- Update dynamically: Gitea Dev Issue #518 与每个**原任务**的任务卡/PR。
- Create after actual observation: Documents `docs/records/<实际日期>-merge-queue-manual-phase2-trial.md`;与 #518 互链,不复制动态队列状态。
- Update only after result review: Dev `policy/adoption.md`、`policy/tool-adaptation-matrix.md` 的实际能力和状态(若有变化)。
**Interfaces:** Task 2 的 #518 模板;每个任务原有人工阶段与接管授权;固定 PR HEAD 的三项 GATE;智能体合入入口。此任务不承担其他任务业务代码实现。
- [ ] 在规则 PR 合入、#518 模板已登记、已知目标写者确认覆盖、无活动/未知窗口、runner 容量当场核验后,由负责人审阅启用条件与当前清单,再把第二轮从 `pending-activation` 切为 `manual active`。缺任何条件保持 `waiting`,继续独立局部开发。
- [ ] 只让三个**实际就绪且已有自身实施/合入授权**的任务依 `queue_entered_at`/`ready_at` 顺序入队;协调者在领取前核对原卡阶段结论、PR head、依赖、组件与其他写者退出。#482/#512 只有重新满足这些条件才可参与,不能因本计划自动接管。
- [ ] 每次领取后按 Task 3 固定并通过当前 HEAD 必需检查、Review 与人工阶段结论,智能体串行合入并释放;闭卡 PR 使用独立窗口,成本单列。每 30 分钟复查等待队列,记录 runner 等待与人的依赖/准备等待;时间缺失记 `NOT_MEASURED`。
- [ ] 每次 main 实际推进后运行 Task 2 只读覆盖对账;发现未登记合入、并行窗口、对象不符、旧执行者未退出接管或来源伪造时立即暂停新领取,先核清受影响候选和写者。未知合入结果不重发 POST。已合入成果不自动回退。
- [ ] 三项完成或触发停止条件时,按 M2-1–M2-6 列每个真实任务的最终 base/head、同步/新尝试原因、Review、GATE、合入树、开发/最终/main push/组件/闭卡 CI 次数与耗时、废弃原因;仅正常已登记顺序推进造成的最终 CI 废弃数作为目标指标。没有可比历史基线时不报告节省百分比,未发生的退出路径记 `NOT_RUN`。
- [ ] 用户评审第二轮报告后决定继续 manual、调整预算、停止或另立自动准入;仅实际合入与经核验的能力可更新 Dev 采纳/矩阵。阶段 10 的安全回收按工作区 owner 和 `task-finish` 现场检查执行,任务闭合经有授权的 `task-close` 与智能体 PR 合入;保留所有原始收据。
## Stage 5 decision and stop rule
2026-10-14,负责人 weichen 在本任务会话中对 Documents 草稿 PR #105 的计划稿 `28c4ceb17315e1bb06f8e39c8407eb525effb8fe` 回复“通过阶段 5”,并选择由当前智能体逐项实施。批准覆盖本计划的阶段 6 候选编制与自检,不替代阶段 6–7 的人工结论,也不等于 #518 第二轮 active。任何实施中发现原子互斥、角色隔离或执行端 fencing 被要求为通过条件,应停止扩围并回到阶段 4 重设计,不能靠文字提升 `manual` 能力。
@@ -0,0 +1,74 @@
# Dev main 合入调度第二轮 manual 扩围设计
状态:**阶段 4 方案设计与[阶段 5 实施计划](2026-10-14-merge-queue-manual-phase2-implementation-plan.md)均已通过;阶段 6 实施待评审**。2026-10-14,负责人 weichen 在本任务会话中对 Documents 草稿 PR #104 的规范稿 `aa4d372f01d0473928c570aa69c09ca771f2de45` 明确回复“通过阶段 4”,随后对 PR #105 的计划稿 `28c4ceb17315e1bb06f8e39c8407eb525effb8fe` 回复“通过阶段 5”,选择由当前智能体实施。这些批准不等于启用第二轮窗口或接管其他任务。执行协调者须在每个窗口明确登记。本文只设计 Dev 仓 `refs/heads/main` 的下一轮人工调度,不启用自动队列。
主记录:[Dev 调度 Issue #518](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/issues/518);既有规则:[Development-Guidelines 固定版合入调度](https://git-home.u1680832.nyat.app:30319/weichen/Development-Guidelines/src/commit/2f5b19872be2a4597838a4131ad75d1be089ee5e/standards/merge-queue.md)、[Dev 项目细化](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/src/branch/main/policy/merge-queue.md);首轮结果:[三任务试行报告](../records/2026-10-14-merge-queue-trial.md)。本稿为下一轮范围与验收设计;动态队列状态只维护在 #518,不复制第二份任务进度表。
## 1. 评审结论与问题
首轮 #489、#488、#486 在同一协调者下顺序合入,每个真实任务只有一次最终 PR CI,三项各自合入后的 main CI 另计;没有因首轮正常顺序合入废弃的最终 CI。首轮报告将 MQ1、MQ5–MQ7 的未覆盖部分及自动原子领取、旧执行者拒绝列为部分满足或 `NOT_RUN`,不得据此宣布全仓自动约束已就位。
2026-10-14 22:13(Asia/Shanghai)对 #518 当前正文/评论和 Dev PR #539–#548 的只读 API 对照([SELF 观察快照](../records/2026-10-14-manual-phase2-source-audit.json),原始本机文件 `/tmp/mq-manual-expansion-audit-20261014.json`)显示:这十个 PR 均已合入;[#540](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/540)、[#542](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/542) 有窗口领取与释放记录;#539 只有合入后的事实记录;其余七个在当前 #518 正文与所返回的评论中找不到对应 PR 的窗口记录。这是**记录覆盖缺口**,不等于断言这些合入未经其他人工协调。它使“所有 Dev main 写入者都受同一 manual 窗口控制”的结论无法成立。
[#537](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/537) 曾取得旧候选绿色 GATE,但 Stage 8 审阅判为 `NOT READY`,窗口释放,后由用户取消且 PR 未合入;该例证明 CI 与人工阶段结论须分别核验。[#542](https://git-home.u1680832.nyat.app:30319/weichen/Agent-System-Dev/pulls/542) 的归档文字变化使旧候选作废,run 3100 不能放行新 head,run 3107 才属于实际合入对象。两者是应保留的正常失败/恢复事实,不计为“因正常排队 main 移动而浪费的 CI”。
目前 Dev 开放 PR 只有 #482 与 #512:#482 非草稿但落后 main、平台回读不可合入;#512 为草稿。两者的既有绿色状态均属于旧对象,且未取得本轮写者接管确认。因此**当前没有可直接领取的第二轮任务**,不得为凑满数量生成生产 PR、自动同步它们或把队列扩围理解为接管授权。
平台当前只读回读(SELF):Dev `main` 禁直推/强推,拒绝落后分支,要求三个 PR 检查上下文 `ci / test`、`ci / test-pg`、`ci / svc-realcombo`,管理员不可绕过合入。它仍不能区分共用账号下的人与智能体,也未把 #518 的窗口写入变成原子锁或执行端 fencing。本轮不变更保护、批准数、CI workflow 或 runner 全局设置。
## 2. 目标、范围与非目标
**目标:**在保留人工阶段评审和现有平台准入的前提下,将首轮单一协调者的经验扩展为可供多个已授权任务 owner 依次使用的 **manual** 窗口;在候选固定后减少因正常排队合入而造成的无效同步和完整 CI;准确统计没有节省的成本与退出案例。
**范围:**仅 Dev 仓库 ID=29、托管实例 `git-home.u1680832.nyat.app:30319` 的 `refs/heads/main`。普通 PR、任务卡闭合、紧急和机器人目标写入均须出现在同一调度记录;不同组件仓按各自目标协调。候选任务原卡仍是需求、授权、阶段和证据的主记录。第二轮以随后实际就绪的三个已授权真实任务为观察样本,闭卡 PR 单列成本与窗口,不充作三个业务任务。
**非目标:**自动优先级、合并列车、批量/预测合并、复制旧 CI 状态、降低必需检查、调整分支保护、发布/部署、代替其他任务 owner 编写业务代码。#482、#512 和已取消的 #537 不因本设计自动变为就绪或重新授权。
取舍:立即把所有 PR 宣称为受控 manual,管理成本最低,却与七条找不到 #518 窗口记录的实际合入不符;只点名三个任务而放任其他 main 写入,不能解决等待者因外部推进失效的问题;直接建设自动队列需要真实原子领取和执行端旧代次拒绝,超出用户选择的 manual 范围。本设计选择先确认已知写者覆盖与记录完整性,再接收三个真实就绪任务;覆盖不足时诚实标记并暂停,保留以后另立自动机制的边界。
## 3. 第二轮 manual 协议
### 3.1 入队与覆盖
任务 owner 在最终同步之前登记目标仓库/分支、任务卡与 PR、授权范围及阶段结论、源 HEAD、依赖/组件、现有写者和预计最小重放集。`ready_at` 只在依赖已落主干、必要人工结论与写者排他确认均齐备时记录。尚缺任一条件的条目标 `blocked`,可以继续自己的局部开发,不领取窗口;入队不要求提前合入不断移动的 main。组件仓未交付时不占 Dev 窗口,也不持有一个目标窗口等待另一个目标。
第二轮启用前,协调者核对当时的开放 PR、可推进 main 的工作区 owner、仓库协作者、机器人/webhook 和 workflow 入口,并取得**已知目标写者**采用同一窗口的确认。普通、闭卡、紧急及机器人合入均须走 #518;仍有未接入写者时如实登记其范围,不能声明全写者覆盖,也不能保证等待任务免于外部 main 移动。
协调者按就绪时间与已批准的紧急理由安排顺序,领取前读回 #518、实际 Dev main/PR、分支保护和 runner 资源。#518 的当前窗口字段只写一个目标尝试;评论保留追加式时间线。领取后再读回核对,无匹配或发现另一执行者时停止。Issue 的 `content_version`、本地锁和评论均**不等于平台原子互斥**;本模式依靠明确写者遵约和受保护分支的最终准入。协调者换手时须确认前执行者退出及未知合入结果,不能凭 20 分钟超时自动接管。
### 3.2 固定、检查与合入
一个窗口以 `attempt_id` 标识:`target`, `owner/coordinator`, `claimed_at`, `last_progress_at`, `initial_base_sha`, `source_head_sha`, `sync_base_sha`, `frozen_head_sha`, 组件清单、检查定义、Review 对象、GATE 运行与真实结果。新增 `ready_at` 与 `queue_entered_at`,使任务等待时间和 runner 等待时间分开计算;时间未知时记 `NOT_MEASURED`,不倒推填造。
窗口领取后执行一次真实 `task-sync`,处置冲突、物化已合入组件并完成应提交的任务卡/收据;此时才固定父仓候选。目标未变的验收、Review、合入节点只做同基线核验,不生成记录提交或重复完整 CI。最终 CI 仍由现行 workflow 在**固定 PR HEAD**上运行 `test`、`test-pg`、`svc-realcombo`;独立 Review、人工阶段结论与 CI 分别审查。合入前再次核对最新 base/head、组件、保护和三个 GATE 作业身份与结果;智能体使用固定 `head_commit_id`、`force_merge=false` 经 PR 合入,回读实际 main 树、合入 SHA、组件和后续 main push CI。
源 HEAD、目标 base、组件、检查定义或相关环境改变时建立新尝试,并按影响补测/复审。旧结果保留其对象范围;不为减少 CI 次数制造绿色状态。开发期 CI、最终 PR CI、合入后 main CI、组件 CI 和闭卡 CI 分开统计。
### 3.3 失效、异常与未登记推进
发现 #518 未登记的 main 推进时,协调者先读回目标、PR、运行和活动窗口;将受影响的固定候选标失效,记录缺口来源与对象,暂停本轮新领取,待写者覆盖和影响范围核清后恢复。不得把“记录中没有”推断为平台阻断已生效。代码或 Review 失败、依赖不满足、需要人工决定超时:保存现场与原始证据,受影响条目 `blocked` 并安全释放;其它目标和局部开发继续。合入请求超时、断连或结果不明:保持目标 `reconciling`,查询 PR/main 真实状态;未确认旧执行者退出前不重发有副作用的请求,也不移交窗口。
预算沿用首轮:无进展 20 分钟、单窗口 90 分钟、已知基础设施失败最多额外重试一次、等待队列每 30 分钟复核一次。领取前重新核对当时 runner 容量,不把首轮的 capacity=12 当作永久事实;资源不足先等待,不在窗口中空占名额。预算变化必须在实际成本复盘后另行评审。
## 4. 验收、观察和停止条件
| ID | 可判定条件 | 证据与边界 |
|---|---|---|
| M2-1 | 第二轮的三个真实任务均有原卡授权、阶段结论、owner 确认和先行组件;等待期间不为追 main 重跑最终 CI | 每任务原 R0、入队/就绪/领取时间、固定 base/head、源外收据;缺任务时保持等待,不制造 PR |
| M2-2 | 每次 Dev main 实际合入在 #518 可找到同对象的先前领取和事后释放;闭卡、紧急、机器人同样登记 | 以实际 main merge/PR 列表对照 Issue 正文/时间线;遗漏即覆盖失败,不能声称“全写者受控” |
| M2-3 | 稳定候选同基线重复 `task-sync` 不改 HEAD;对象变化拒用旧 Review/CI | 独立重放及精确运行 SHA;本轮记录每次新尝试原因 |
| M2-4 | 三个真实任务各自取得当前 HEAD 三项必需 GATE 后由智能体合入,实际树与候选一致 | PR/run/job/actor/runner 链接及合入后 main 回读;平台仍是最终准入 |
| M2-5 | 正常已登记任务顺序合入造成的最终 CI 废弃数为 0;候选整改、外部推进和基础设施失败另计 | 完整列出开发、最终、main push、组件、闭卡运行次数/耗时与废弃原因;无可比基线不报告节省百分比 |
| M2-6 | 自然发生的 blocked/withdrawn/reconciling 均如实记录并安全处理;某类未发生则标 `NOT_RUN` | 不制造生产故障凑数;#537 历史可作设计参考,不冒充第二轮执行 |
若有未登记 main 合入、并行窗口、对象不匹配仍合入、伪造来源、旧执行者未退出即接管,立即暂停扩围并先对账;这是试行停止条件,不自动回退已经合入的成果。三个条目及闭卡均核验后形成第二轮报告,人工评审是否保持 manual、调整预算或另立自动准入项目。本轮即使全部满足,也只证明声明范围内的**人工协作**;自动锁、所有角色的执行端隔离和旧代次 fencing 继续 `NOT_RUN`。
## 5. 采纳顺序与阶段 4 决定
1. 阶段 4 已由用户按规范稿 `aa4d372` 批准;智能体完成本设计的 Review 与 Documents PR 合入。阶段 5 计划获批前不改 Dev 规则/Issue 状态,不领取新任务。
2. 另编实施/测试计划:对账 `policy/merge-queue.md`、`policy/adoption.md`、`policy/tool-adaptation-matrix.md` 的首轮历史快照与当前动态入口,确定 #518 第二轮条目模板和只读合入覆盖核对方法;有脚本变更时运行 `make test-governance`。规范源码、项目采纳及 Issue 记录分别标阶段,不把计划写入视作已启用。
3. 经计划阶段评审后,按 Dev 首次 precheck、独立工作区、Review、当前 HEAD CI 与智能体 PR 合入流程交付必要规范更新。高后果保护变更若将来必要,仍由用户亲手执行,本设计不要求该动作。
4. 各真实任务 owner 在自己的授权与阶段下自愿入队;协调者确认全写者覆盖、同目标唯一窗口和资源,再领取。当前 #482/#512 不满足这一步。
5. 第二轮达到三个真实任务或触发停止条件后,按本设计 M2 指标复盘;由用户作继续、调整或回退的阶段决定。
**阶段 4 决定:**用户已批准以“先补全 Dev main 合入记录覆盖、后接收三个真实就绪任务”的受控扩围作为第二轮设计,遗漏目标推进立即暂停、现有预算不变、闭卡单列成本,当前无就绪任务时保持 `waiting`。这一决定只批准设计;#518 与仓库规则的第二轮启用仍受阶段 5–7 评审及实际写者覆盖核验约束。
@@ -0,0 +1,80 @@
# svc 插件组合部署(--with)方案 r1
状态:**待评审**。日期:2026-10-14。负责人:weichen。
任务卡:Dev `.task/feature-svc-plugin-compose.md`。
需求来源:部署时用交互或参数选择把哪些插件与基座编译成同一个二进制服务,并在服务中激活这些插件。
## 1. 范围
做:
- 每次 `svc.sh` 的 agent deploy 可以选择零个或多个已登记插件。
- 被选中的插件与 `--from` 指定的 Dev 基座编译成一个仍名为 `agent-system` 的二进制。
- 部署后校验这些插件已注册且命令面处于启用;失败走现有 release 回退。
- 插件清单来自 Dev 仓 `plugins/registry.json`,不自动发现。
不做:
- 不做 sidecar,不把插件部署成独立服务。
- 不让插件自带基座 pin。基座就是本次 `--from` 的 Dev 提交;对不上就构建失败并报原因。
- 第一版最多一个带静态工作台(`web`)的插件。
- 不删除旧的 `--from rdm`。它仍用 RDM 仓自己的 `pins/` 构建,与 `--with` 互斥。
## 2. 步骤 0 试验结论(不留代码)
2026-10-14 在 `/tmp/svc-compose-spike` 复制当前 Dev 的 backend 模块,空白导入
`agent-system-rdm/plugins/rdm`(指向 `~/.cache/agent-system-svc/rdm-src`),
`go mod edit -require/-replace` 后执行 `CGO_ENABLED=0 go build -mod=mod`。
- 构建成功。产物约 40MB,`version` 仍是基座的 `agent-system 0.1.0-dev`。
- `go version -m` 显示主模块 `agent-system-backend`,依赖 `agent-system-rdm v0.0.0`。
- 二进制内可见 `rdm.project.create` 与 `rdm.ping`。
- 聚焦依赖(`golang.org/x/*`、`github.com/jackc/*`、`modernc.org/sqlite`、`gopkg.in/yaml`)版本无变化。
- 新增模块只有 `agent-system-rdm`、`github.com/kr/text`、`github.com/rogpeppe/go-internal`。
- 默认 `-mod=readonly` 会拒绝更新 `go.mod`/`go.sum`,组合构建必须使用 `-mod=mod`。
- 依赖模块自己的 `replace` 不生效,插件按主模块(Dev 基座)解析 `agent-system-backend`。这正是“基座以 Dev 提交为准”所要的结果。
试验目录是一次性的,不进入任何仓库。
## 3. 行为
### 3.1 选择
- `--with rdm,foo` 选择插件;`--with rdm@<sha>` 钉住单个插件提交;`--with none` 明确不带插件。
- 标准输入是终端且没有 `--with` 时,按登记表给出编号勾选。默认勾选上次 `svc.env` 的 `plugins=`;第一次默认不选。回车接受默认,`none` 清空。
- 非交互且没有 `--with`:沿用上次选择,没有则不带插件。已有脚本和 CI 的行为不变。
- `--dry-run` 打印基座提交和每个插件的提交,不构建。
- `--from rdm` 与 `--with`(除 `none`)互斥。`--from release` 不能再注入插件。
### 3.2 构建
1. 物化 Dev 提交的隔离 worktree,并完成前端构建,使嵌入资源就绪。`--from local` 不改主检出的 `go.mod`:把 backend 模块复制到 `runtime/.worktrees/` 再构建。
2. 每个插件使用独立源仓缓存(`~/.cache/agent-system-svc/plugin-<id>`,`repoEnv` 可覆盖克隆地址)并物化 worktree。
3. 在这份一次性 backend 副本里生成 `cmd/agent-system/zz_plugins_gen.go`(空白导入 `entryPackage`),并用 `go mod edit` 增加 `require` 与 `replace`。
4. `go build -mod=mod` 产出 `agent-system`。基座的 `version`、身份和 `user` 等子命令保持不变。
5. 测试可设 `SVC_COMPOSE_STUB=1`,跳过真实 `go build`,只记录插件选择。这不是生产路径。
### 3.3 激活与记录
- `GET /api/plugins` 与 `GET /api/registry` 的 `compiled` 列表必须包含每个所选插件。
- `GET /api/commands` 中该插件 `commandPrefix` 下至少有一条 `enabled` 命令。
- 插件在而命令全部禁用时,用与设置播种相同的临时管理员 key 调用 `POST /api/plugins/{id}/enabled`,再复查。失败则 `svc_rollback_deploy`。
- `svc.env` 写 `plugins=id@sha,id@sha`。`source` 形如 `dev@<sha>+rdm@<sha>`。release 目录的 `release.json` 带同一 `plugins` 字段。
- `update` 把基座升到远端最新,并原样带上已记录的 `--with`,不再询问。`recover` 只拉起已有二进制,不重新选择。
- 插件 id 集合变化(含从无到有、从有到无)与源种类变化一样,需要 `--allow-source-switch`。只改提交不需要。
### 3.4 工作台
登记表里 `web` 非空的插件,沿用现有伴生 static 服务(`<name>web`)。多于一个带 `web` 的插件直接拒绝。
## 4. 跨仓
- Backend:`extension.InProc` 增加可选 `HostOptions` 与 `CLI`。布尔默认按“任一为 true”合并,不覆盖显式 serve 旗标。`GET /api/registry` 增加 `compiled`。
- RDM:`plugins/rdm` 在 `InProc` 上声明 `HostOptions`(含关闭上传自动索引、会话卡镜像、执行原语)和 `-bootstrap-admin` 钩子。RDM 自己的 `main.go` 继续可用,旧 `--from rdm` 不依赖这次钩子。
- Dev:`scripts/svc.sh`、`plugins/registry.json`、`docs/svc.md`、`help plugins`、`tests/test_svc_plugins.py`,并推进 backend 与 documents 的 gitlink。
## 5. 验收
- 登记、选择、换源门禁、dry-run、stub 部署与激活走 `tests/test_svc_plugins.py`。
- Backend 的合并与 CLI 钩子走 `go test ./pkg/extension/`。
- 真实 `go build` 组合(Dev 提交 + RDM 提交)在步骤 0 已证实可编译。带网络的完整 `svc deploy --with rdm` 与 `make test-lifecycle` 不在本增量的 stub 套件里,未在本机再跑时标 NOT_RUN。
@@ -0,0 +1,188 @@
---
title: 快慢通道 r2 非阻塞对话与任务卡实施计划
date: 2026-10-15
revision: r2-draft.3
status: pending-review
owner: weichen
execution: plan-only
parent: 2026-10-15-fast-slow-r2-nonblocking.md@r2-draft.3
---
# 快慢通道 r2 实施计划
状态:**阶段 5 文稿已按阶段 1–4 的修订联动更新,仍未评审。** 须等阶段 1–4 通过后再单独评审。
批准前不写业务代码,不推送,不合入。
规格依据 [r2 增补方案](2026-10-15-fast-slow-r2-nonblocking.md) @ r2-draft.3。r1.1 在 r2 阶段 4 批准前仍然有效。
**Goal:** 先闭合非阻塞闭环:完整结果、原卡到达、卡内选择、已读、请求复用,以及右栏不可见时的完整操作。再做进展归并、滚动、时间和面板整理。
**Architecture:** 服务端任务卡仍是唯一快照。增量 1 交付全部 P0,并保持 NB14、NB23。增量 2 交付 P1。不把前台 outbox 做成跨刷新存储。
**Tech Stack:** Go(Core/Backend)、React+TypeScript(UI/Frontend)、既有 ActivityCard、HITL、事件 seq 与 `make evidence`。
## 全局约束
- 视觉继续消费 `@ui/tokens.css`、`mk-*` 和 Collapsible。不新增裸色值、私有 `@keyframes`、行内字号或 `<details>`。
- 异步状态只有一个所有者。事件按 seq 处理,过期事件丢弃。
- 折叠和归并是展示规则。已保存且有权查看的公开过程、工具名、授权参数和输出继续可回放。隐藏思维链、系统或开发者提示、凭据、原始请求载荷和未授权工具数据不进入投影。
- 右栏关闭、切到文件或窄屏时,中栏展示同一 taskId 的完整卡片与操作。
- 跨仓顺序:Core 契约 → Backend → UI → Frontend → Documents 指针与 Dev gitlink。组合验证用 `make test`。
- 与 `feature/fast-slow-u2-u3-plan` 并行。本分支从 Dev `origin/main` 的 R0 `63e70d8b91ccb1691ce9b78a373e4e8bc9da24a2` 切出;修订前已同步到 `692735e91d6a9ab07ddd3686feb60a56b270728a`。不从该 U3 分支堆叠。
- 证据写入任务卡只用 `CMD=… make evidence`。本地记录标 SELF。合入所需的 GATE 不在本计划的交付终点里。
## 明确不做
- 不跑新的模型质量试验,不改模型路由。
- 不把「先不选择」或自由输入解释为授权同意。
- 不离线重写旧会话的模型正文。存量只改读取和展示。
- 不实现前台消息的跨刷新、跨会话恢复,不新增 outbox 的服务端草稿、恢复鉴权或删除语义。
- 不把工具开始或结束记成新的阶段记录。
## 增量 1:P0 非阻塞闭环
对应 NB01、NB02、NB05、NB07、NB08、NB09、NB10、NB11、NB12、NB13、NB18、NB19、NB21、NB22、NB24。
NB14 与 NB23 在本增量保持,不单独排工作项。
完成条件:方案 §1.2 的六步走查里,完成不新增中栏消息,选择不锁住无关对话,重复明确指令不新开任务,右栏关闭时中栏能读摘要、处理选择并打开文件。同一摘要请求只执行一次。增量 1 结束时,重复进展行和滚动联动仍可能存在,留在增量 2。
### W1 — Backend:完成卡读取最终结果
**Files:**
- Modify: `modules/backend/internal/runmgr/runmgr.go`(约 2241 行的 160 字摘要)
- Test: `modules/backend/internal/runmgr` 下现有完成卡测试
**内容:** 用户可见概览使用已形成的要点。没有可靠要点时写入「整理结果已生成,查看完整结果」,并保留全文入口。停止把 `truncate(fullText, 160)` 当作摘要。旧卡已写入的短摘要按方案 §4.9 只读展示,展示文案的存量折叠留到增量 2 的 NB20。
### W2 — Backend:完成和失败只更新原卡
**Files:**
- Modify: `modules/backend/internal/runmgr/runmgr.go` `deliverNotices` / `startNoticeRun`(约 2536、2602、2634 行)
- Modify: `modules/backend/internal/runtime/verify.go`(约 43 行 `materialNoticeBackstopReason`)
- Test: 通知与终轮兜底的现有测试
**内容:** 材料整理完成或失败时更新原卡、写未读、发一次轻提示事件。移除强制汇报和强制 `confirm_choice`。不调用 `claimConversation` 来占住会话。失败保留已保存的部分结果和原因,不显示成功完成。
真实模型前后对照:此工作项改变提示词和终轮门禁。状态 `NOT_RUN`。原因:2026-10-15 用户确认模型质量试验不是这些交互修复的前置条件。补救:增量 1 获实施授权后,按 `modules/backend/eval/live/` 或等价最小重放集补一次任务级对照,写入任务卡并标来源。未补之前,任务卡不得把该行为写成「已用真实模型验证」。
### W3 — Core/Backend:选择、已读与任务请求
**Files:**
- Modify: Core HITL / ActivityCard 契约(选择状态、请求键、未读、结果版本)
- Modify: `modules/backend/internal/runmgr/material.go` `materialKey`(约 44 行)及派发去重
- Modify: `modules/backend/internal/runmgr/runmgr.go`(约 805 行,自由输入投影)
- Test: 幂等、过期选择、已读转换、授权隔离、安全投影夹具
**内容:** 选择状态为待选、已选、暂不处理。暂不处理可回到待选且不新建请求。已读与未读按方案 §4.5 的互斥状态表实现:已读只在用户针对具体结果版本主动展开、打开全文、激活「有 1 项更新」或显式标记时发生,布局自动展开、刷新、重挂载、进入视口都不算;新的成功或失败终态版本使任务未读,仅启动重试不触发;未读数只在此前没有未读版本的任务上加一;当前工作与工作历史互斥,正在阅读的历史卡暂留原位。请求键由授权作用域(认证账号、项目、来源会话)加材料内容 hash、解析版本、用途、请求版本组成,复用须归属一致且请求者仍有权限,否则按无既有请求处理且不泄露其存在。按钮和绑定后的聊天消息共用该键。重复提交和重复的明确指令返回已有任务。引用在发送和组装模型上下文时各重新鉴权,撤销后不注入内容、不泄露存在性。重新生成或改变范围才递增版本。过期或已处理的选项刷新为服务端状态,不能再提交。自由输入和「先不选择」不算授权同意。投影排除 NB23 列出的隐藏内容。
确定性绑定先覆盖:卡片输入、显式任务引用、同时点明该材料与用途动作的句子。其余消息保持为新话题,并保留原选择。含糊消息只澄清。命中并绑定后,无论复用已有请求还是新启一次,都把所属任务卡的选择写为「已选」(记录选项、来源为聊天指令、时间)并关闭待选区;多选卡只关闭被满足的选项;重复指令不新增选择记录(NB12)。
### W4 — Frontend/UI:同一张卡的两种落位
**Files:**
- Modify: `modules/frontend/src/components/Conversation.tsx`
- Modify: `modules/frontend/src/components/ConversationWork.tsx`
- Modify: UI 任务卡与确认卡
- Test: 组件测试与 `design-guard`
**内容:** 右栏「工作」可见时,中栏只留关联入口。右栏关闭、切到文件或窄屏时,中栏内联展开同一 taskId 的完整卡片(窄屏同样内联,不做抽屉或遮罩;展开不移动输入焦点、不改写滚动位置、不因展开本身标已读):摘要、依据、单选或多选、补充输入、「按此处理」、「先不选择」、打开文件。处理后展示实际选择。输入区放可移除的引用标签。未引用时不把结果版本写成已经读过。收起提示「后台工作 N 项 · 新结果 M 项」打开同一面板。
### W5 — 聊天队列不被后台占用
**Files:**
- Modify: Backend 会话占用,使后台 run 和普通待选不再返回让聊天一直排队的占用
- Test: 后台整理进行中的新消息能进入对话
**内容:** 不修改 `modules/frontend/src/outbox.ts` 的存储,也不把排队消息写成可跨刷新恢复的记录。前台生成中的短暂内存排队可以保留。危险授权继续只阻塞依赖它的工作。
### 增量 1 测试与停止
测试:完成卡、通知、请求幂等(含跨账号、跨项目、跨会话与权限撤销后不命中)、选择与已读状态机(含布局自动展开、刷新、重挂载不算已读,同任务重复完成不重复加一,失败终态未读,启动重试不未读,阅读中历史卡暂留原位)、直接交代后选择关闭、引用两次鉴权、右栏关闭时的同一任务、授权隔离、NB23 夹具。浏览器走查留到阶段 7,其中轻提示可达性走查按方案 §4.11.1,由非作者逐项记录。
停止条件:无关消息被静默当成选择答复;「先不选择」或自由输入触发了需授权的动作;同一请求键产生两份结果;完成或失败通知再次插入中栏长回复;右栏关闭时不能读摘要或提交选择;展开内容出现 NB23 排除项。出现任一条即停增量 1,不进入增量 2。
## 增量 2:P1 归并、滚动、时间与面板
对应 NB03、NB04、NB06、NB15、NB16、NB17、NB20。前置:增量 1 已提交,且 r2 阶段 4、5 已批准。
完成条件:重复累计进展只占一行;工具起止不新增阶段记录;中栏滚动不带动右栏;完整时间戳有悬停、键盘、触屏和读屏路径;旧的 160 字摘要被标明为当时保存的开头。
### W6 — Backend/Frontend:进展按任务归并
**Files:**
- Modify: `modules/backend/internal/runtime/sub_loop.go`(约 210 行,累计文本进度)
- Modify: `modules/frontend/src/live.ts`(约 244 行,`runEventsToTimeline`)
- Modify: `modules/frontend/src/store.ts`(`agent.progress` 写入)
- Test: `modules/frontend/test/live.test.ts`
**内容:** 同一子任务的文本流更新同一条展示。阶段变化才新增阶段记录。工具开始和结束只更新活动行并进入执行记录。原始事件保留。运行中的要点不收「我来检索」和工具调用。旧会话按同一规则折叠,详细记录仍按 seq 可查。
### W7 — Frontend:两栏独立滚动与历史分区
**Files:**
- Modify: `modules/frontend/src/components/Conversation.tsx`(约 659 行)
- Modify: `modules/frontend/src/scrollsync.ts`
- Modify: 右栏当前工作 / 工作历史
- Test: `modules/frontend/test/scrollsync.test.ts`
**内容:** 去掉滚动百分比联动。保留点击「查看关联任务」和「定位发起消息」后的定位与 `flashElement`。当前工作与工作历史按方案 §4.8 排序。阅读中的卡不因更新而自动排序、展开或跳转,只显示「有 1 项更新」。
### W8 — 时间标签
**Files:** Frontend 消息与任务卡组件;必要时 Core 卡片时间字段。只用 `@ui` 已有原语。
**内容:** 消息时刻来自创建时间,后台更新不回写。卡片显示创建、更新、完成。跨天显示日期。完整时间戳同时支持悬停、键盘聚焦、触屏点按和屏幕阅读器(`time` 的 `datetime` 与完整本地时间的可访问名称)。选择记录带提交时间。
### 增量 2 测试与停止
测试:进展回放、滚动、时间的非悬停路径、旧会话折叠。阶段 7 用方案 §1.2 和边界做浏览器走查,含窄屏。
停止条件:归并导致原始事件不可回放;工具起止被写成新的阶段记录;完成卡在全文存在时仍只显示开头;滚动改动把定位高亮一起删掉;完整时间只剩悬停。出现任一条即停止增量 2 的后续工作项。
## 验收映射
| 场景 | 需求 | 增量 | 证据形态 |
|---|---|---|---|
| 上传后一张材料卡持续更新 | NB02 | 1 | Backend 任务身份测试 |
| 整理完成不新增中栏回合,失败同样留在原卡 | NB07 NB21 | 1 | 通知测试;浏览器走查留阶段 7 |
| 全文可读,没有要点时用诚实入口 | NB05 | 1 | 完成卡测试 |
| 「总结一下这份材料」第二次不新开摘要 | NB12 NB13 | 1 | 请求键测试 |
| 先不选择可重新展开;过期选择不能再提交;已读、再次未读与当前/历史分组 | NB09–NB11 NB16 NB22 NB24 | 1 | 状态机测试(NB16 分组迁移的展示部分在增量 2) |
| 右栏关闭仍能读、选、打开文件;窄屏内联不开抽屉 | NB01 NB18 | 1 | 同一 taskId 测试;浏览器走查留阶段 7 |
| 右栏关闭时一步定位并完成一次选择,焦点与两栏滚动不变 | NB07 NB18 NB24 | 1 | 方案 §4.11.1 非作者走查记录;阶段 7 前 `NOT_RUN` |
| 直接交代后关闭已满足的选择 | NB12 | 1 | 选择状态测试 |
| 请求复用与引用的授权边界 | NB08 NB13 | 1 | 跨账号、跨项目、权限撤销夹具 |
| 后台进行中新消息进入对话 | NB19 | 1 | 会话占用测试 |
| 授权放弃不算同意;展开不见隐藏内容 | NB14 NB23 | 1 | 回归夹具 |
| 重复进展不刷行,工具起止不进阶段记录 | NB03 NB04 NB06 NB20 | 2 | `live.test.ts` |
| 滚动独立,点击才定位;历史分区不抢阅读 | NB15 NB16 | 2 | `scrollsync.test.ts` |
| 完整时间不只有悬停 | NB17 | 2 | 组件测试;读屏路径留阶段 7 |
阶段 7 之前,上表浏览器项保持 `NOT_RUN`。单测通过只证明机制。
## 文件范围汇总
| 仓库 | 增量 1 | 增量 2 |
|---|---|---|
| Core | 选择状态、请求键、未读、结果版本 | 卡片时间字段,若现有字段不够 |
| Backend | `runmgr.go` 完成摘要、`deliverNotices`、`verify.go`、`material.go`、会话占用 | `sub_loop.go` 进度 |
| UI | 卡内选择、未读、右栏关闭时的完整卡 | 历史分区、时间 |
| Frontend | `Conversation.tsx`、`ConversationWork.tsx`、引用标签 | `live.ts`、`store.ts`、`scrollsync.ts` |
| Documents | 本计划与方案状态 | 获批后回写进展 |
| Dev | gitlink 与任务卡 | gitlink 与任务卡 |
`modules/frontend/src/outbox.ts` 不在本计划的修改范围内。
## 评审
| 阶段 | 对象 | 结论 |
|---|---|---|
| 5 实施计划 | 本稿增量 1、增量 2 @ r2-draft.3 | 未评审 |
阶段 1–4 通过并且本稿获批之后,才允许按增量 1 写业务代码。增量 2 在增量 1 完成并确认偏差后继续;若增量 1 改变了本计划的接口或顺序,先修订本稿再继续。
@@ -0,0 +1,460 @@
---
title: 快慢通道 r2 非阻塞对话与任务卡
date: 2026-10-15
revision: r2-draft.3
status: pending-review
owner: weichen
execution: design-only
parent: 2026-10-12-fast-slow-channel-display.md@r1.1
---
# 快慢通道 r2:非阻塞对话与任务卡
状态:**阶段 1–4 已按第二轮评审意见修订(r2-draft.3),结论仍为未评审。** 本稿是已批准方案
[r1.1](2026-10-12-fast-slow-channel-display.md) 的增补候选。评审通过前,r1.1 仍是有效方案;
下文「拟取代」条款在阶段 4 批准后才生效。业务代码、模型试验、推送、PR、合入与部署均未授权。
授权依据:2026-10-15 用户确认独立兄弟分支,并确认本轮只产出阶段 1–5 文档、逐阶段评审。
Dev 任务分支 `feature/fast-slow-r2-nonblocking`。任务启动 R0
`63e70d8b91ccb1691ce9b78a373e4e8bc9da24a2`。修订前已 `task-sync`,同步基线
`692735e91d6a9ab07ddd3686feb60a56b270728a`(包含 `7a0f934`)。
实施计划见 [r2 实施计划](2026-10-15-fast-slow-r2-nonblocking-plan.md)。
## 1. 需求拆解
### 1.1 目标
保留现有视觉风格。中栏是一条连续对话,右栏是持续更新的任务卡。后台结果写回自己的卡片,
默认只给轻提示。用途选择留在任务卡里,用户可以继续聊天、稍后决定,或用一句话直接交代下一步。
右栏关闭、切到文件或窄屏时,同一张卡的阅读和操作改由中栏内联展开承担,不另开抽屉。
### 1.2 用户场景
以下时间是验收走查的预期,不是已发生的运行结果。
1. 11:04 上传说明书。中栏给出简短收件反馈。右栏立即出现一张材料整理卡。
2. 后台开始整理。同一张卡更新阶段和已经形成的要点。用户可以继续发消息。
3. 11:05 整理完成。右栏出现内容概览、完整整理结果、来源和可选下一步。中栏保持原有对话顺序。
4. 用户说「总结一下这份材料」。系统把要求关联到该材料。已有同范围请求时复用并显示进展;没有时才启动一次摘要任务。右栏显示它的进展。
5. 用户转而讨论别的问题。中栏继续当前话题。摘要完成后更新自己的卡片,并显示未读提示。
6. 用户查看摘要。在右栏读要点、展开全文或打开文件。需要追问时,可以把结果引用到对话后再提问;不引用也可以问,但回答不得声称看过未带入的版本。
若第 3 步出现的用途区选择「先不选择」,用途区收起,材料整理结果仍可查,会话里没有挂起的前台回合。
之后可以点「暂不处理 · 可随时继续」重新展开原选择区。
### 1.3 子需求
| 主题 | 用户可观察到的结果 |
|---|---|
| 栏职责 | 发言在中栏。右栏「工作」可见时,后台进度、阶段成果和完整结果在同一张右栏任务卡,中栏只留关联入口。右栏关闭、切到文件或窄屏时,中栏内联展开同一张卡和操作(窄屏同样内联,不使用抽屉) |
| 一张卡 | 一项后台工作从开始到结束保持同一身份、同一来源消息和同一材料 |
| 阅读层级 | 概览、工作详情、执行记录对应 r1.1 的 L0–L3。可展开的是已保存且有权查看的公开摘要、工具名、授权参数和输出 |
| 进展 | 同一段流式文字更新原位置;阶段变化才新增阶段记录。工具开始和结束只进入活动行和执行记录 |
| 完成正文 | 展示可读要点和完整结果;没有可靠短摘要时说明结果已生成并给出入口 |
| 到达 | 原卡更新、轻提示一次;此前没有未读版本的任务才使未读数加一;对话历史、焦点和滚动位置保持不动。只有用户针对该结果版本的主动动作才算已读,布局自动展开、刷新、重挂载和出现在视口都不算(状态表见 §4.5) |
| 引用 | 引用保证该结果版本进入下一回合。未引用时助手只可按权限查询,且不得声称看过未带入的内容 |
| 选择 | 用途选项、补充要求和「先不选择」都在任务卡内,不占住会话。暂不处理可以重新展开 |
| 直接交代 | 语义清楚的材料用途指令绑定该材料,复用已有同范围请求;没有时才启动工作。无论复用还是新启,被该指令满足的选择都转为「已选」,原待选区关闭(验收见 NB12) |
| 汇合 | 选择按钮和聊天消息进入同一个任务请求;重复提交看到已有进展。请求键限定在认证账号、项目和来源会话内,复用前必须归属一致且请求者仍有权限(验收见 NB13) |
| 滚动 | 两栏各自滚动;只有点击关联入口才定位和高亮 |
| 时间 | 消息时间固定;卡片分别标创建、更新、完成;选择和阶段带事件时间。完整时间戳不只有悬停 |
### 1.4 边界与非目标
纳入:信息归属、任务卡投影、进展去重、完成正文、到达通知、已读与再次更新、用途选择、
暂不处理的重新展开、任务请求幂等、滚动、时间戳、存量事件的读取规则、安全展示边界,
以及这些行为的测试计划。
不纳入:
- 新的模型质量试验、提示词效果对照和供应商切换。触及提示词与终轮门禁的真实模型对照
在实施时按交付规范标注;本轮把它标为 `NOT_RUN`,不把它当作交互修复的前置条件。
- 视觉风格重做、新的颜色字号和第四栏。
- 在跑任务的动态改写。改变范围或要求重新生成时,建立新的结果版本。
- 部署、线上修复,以及 U3 质量线 `feature/fast-slow-u2-u3-plan` 的传输与工具流工作。
- 前台消息跨刷新、跨会话的 outbox 可靠性。作者私有草稿、服务端持久化、恢复鉴权和删除语义另立需求。
### 1.5 待澄清(不阻塞本稿结构)
| 项 | 本稿采取的写法 | 需要评审时裁定 |
|---|---|---|
| 「语义十分清楚」由谁判定 | 先用确定性规则:卡片输入、显式任务引用、或与待选材料及用途词同时出现的指令 | 是否以后增加模型判断 |
| 存量 160 字摘要 | 历史卡保留已保存正文,并提供完整结果入口;新完成卡按本节规则生成 | 是否离线回填旧卡 |
| 引用是否为读取结果的前提 | 引用保证该结果版本进入本轮。未引用时只允许受权限约束的查询,并禁止声称看过未带入的内容 | 是否改为「不引用就不能读」 |
## 2. 需求评估
### 2.1 价值与现状
2026-10-15 对一次真实会话的只读核对,已经把现象对应到固定组合里的实现。
修订文稿前又在 `task-sync` 之后重验行号。来源为 SELF:只读源码,没有改业务代码,没有调用模型。
核对对象:Dev 同步基线 `692735e91d6a9ab07ddd3686feb60a56b270728a` 物化后的组件
Backend `80bb123c874cd9eb0e25f12ccd41e888f727a7e1`、
Frontend `5ab81432d10291e1885256293192bc96038fa061`、
Core `5773e74086791731059730bd3726dc8c9cd1381f`、
UI `e295caeef377a0e9588a3057d280864b2a011b71`、
Documents `0f06abd57c7bfa9e88dfea22e2a46719a7bfc5bf`(已含 Documents `origin/main`
`d668a3e0ac345dc80a72d15469f25918c4535ee6`)。
原稿记录的 Backend `0a57853154e331cdb02a6a74ec2e13033b843e63` 已被本次同步取代。
行号属于这次检出,后续提交移动后以当时文件为准。
| 现象 | 当前实现 | 符合度 |
|---|---|---|
| 协作进展重复 | `runtime/sub_loop.go` 每个 `text_delta` 发布累计文本前 80 字(约 210 行);`live.ts` `runEventsToTimeline`(约 244 行)把每条追加成「协作进展」 | 需调整后符合。事件可以留,展示要按任务归并 |
| 右栏看不到完整结果 | `runmgr.go` 约 2241 行在摘要为空或为「完成」时 `truncate(fullText, 160)`。全文已在 `payload.Text` 和落库消息里 | 需调整后符合。读取已有全文即可,不必先提高模型质量 |
| 整理结束后出现新回复和选择卡 | `deliverNotices`(约 2536 行)经 `startNoticeRun`(约 2602 行)占住会话;约 2634 行要求汇报并立即 `confirm_choice`;`verify.go` 约 43 行对弱模型再强制一次 | 需调整后符合。这是行为变更,批准前不能动 |
| 已处理仍写「可自由输入」 | `AskHITL` 约 805 行只把一句 Markdown 放进投影,没有输入控件,处理后也不替换 | 需调整后符合 |
| 两栏滚动位置奇怪 | `Conversation.tsx` 约 659 行用 `scrollsync.ts` 的滚动百分比带动右栏 | 需调整后符合 |
| 同一摘要像处理了两遍 | `material.go` `materialKey`(约 44 行)只用文件名和解析字数,没有「材料内容 + 用途 + 请求版本」这一任务请求身份 | 需调整后符合 |
项目定位仍然是对话推进工作、服务端权威、通用基座。r2 不把文档审签或业务风险等级写进基座。
### 2.2 可行性、成本与风险
| 项 | 判断 |
|---|---|
| 可行性 | 完整结果、事件和任务卡已经存在。P0 改完成通知、选择状态、已读和请求幂等。P1 改进展归并、滚动、时间和面板整理 |
| 成本 | 跨 Core、Backend、Frontend、UI 与 Dev gitlink。Documents 只承载方案。无新模型调用预算。不新增 outbox 服务端存储 |
| 依赖 | 既有 ActivityCard、HITL、事件 seq、工件预览。内容身份沿用 r1.1 §8.3:内容 hash 与解析版本 |
| 在途重叠 | Dev `feature/fast-slow-u2-u3-plan` 及 Documents 同名远端分支在做 U3 r0.1–r0.6,会碰到 `runmgr.go`、`store.ts`、`live.ts`。本任务是兄弟分支,不堆叠、不暂停对方。合入前各自 `task-sync`,冲突按语义核验 |
| 信息架构 | 原稿把中栏写成始终只留入口,与 DESIGN.md「右栏关闭或切到文件时中栏承担完整卡片与操作」以及 r1.1 R11 冲突。修订后两种可见性共用同一 taskId |
| 范围 | 原稿把前台排队的跨刷新恢复放进核心闭环。那会带出作者私有草稿、服务端持久化、恢复鉴权和删除语义。本轮拿掉,只保留后台任务和普通待选不占聊天队列 |
| 风险 | 取消自动汇报会改变用户已经习惯的「做完会在对话里说一声」。轻提示和未读必须真实可达,否则结果会被漏看。右栏关闭时若中栏没有完整操作,R11 会退步 |
| 行为面 | P0 会改 `startNoticeRun` 提示和终轮兜底。交付规范要求真实模型前后对照。用户已说明该对照不是这些交互修复的前置条件,故计划中标 `NOT_RUN` 并写补救,不用「预期改善」代替证据 |
### 2.3 与 r1.1 的拟取代条款
下列条款在本稿阶段 4 获得人工批准后,由 r2 取代。批准前 r1.1 原文保持有效。
| r1.1 | r2 拟采用 |
|---|---|
| §9.1 多任务相继完成时,原卡先显示结果,父会话空闲后再合并汇报 | 只更新原卡,加未读和一次轻提示。不启动前台汇报回合 |
| §9.4 前台忙时沿用输入排队 | 前台正在生成时可以短暂排队。后台运行和普通待选卡不占聊天队列。跨刷新、跨会话恢复排队消息不在本轮 |
| §5 右栏顺序「需要你处理 → 当前查看 → 其他进行中 → 新结果 → 已收纳」 | 收敛为「当前工作」和「工作历史」。新任务在上,历史按完成或处理时间倒序并默认折叠 |
| R10 完成后把结论回投到对话 | 右栏更新。引用把结果版本带入下一回合;不引用时不得声称已读该版本。右栏不可见时,中栏展示同一张卡 |
| §6.1「后台结束」默认在快通道给结论 | 快通道保持用户正在进行的对话。结果留在原任务卡;右栏不可见时由中栏展示这张卡 |
r1.1 的其余已批准内容继续有效:四层阅读里 L3 执行记录仍保留、失败与成功分开、来源不编造、
更新不抢占正在阅读的文件、材料内容身份不用文件名加字数冒充、成果不是思维链、
右栏关闭与窄屏时主要能力完整(R11)。
## 3. 需求表
项目符合度依据第 2 节源码核对。处理结论在阶段 3 评审前均为待定;下表给出建议结论,供评审确认。
「纳入本增量」指 r2 实施计划中的增量,不表示现在可以写业务代码。
层级:P0 是核心非阻塞闭环;P1 是时间、归并和面板整理;「约束」必须保持,不单独排期。
| ID | 描述 | 符合度 | 层级 | 可判定验收 | 依赖 | 建议结论 |
|---|---|---|---|---|---|---|
| NB01 | 中栏按发送顺序展示用户发言和助手对当前问题的回复。右栏「工作」可见时,后台进度、阶段成果和完整结果不复制进中栏,只留关联入口。右栏关闭、切到文件或窄屏时,中栏展开同一任务的完整卡片与操作 | 需调整后符合 | P0 | 右栏展开时,材料整理的子任务日志不进入第一轮快速回复。右栏关闭时,不打开右栏即可读摘要和依据、处理用途选择、打开文件,且与右栏是同一任务 ID | 既有消息与 run 事件 | 纳入增量 1 |
| NB02 | 一项后台工作从开始到结束只维护一张任务卡,身份和触发消息、材料保持不变 | 需调整后符合;r1.1 R02 已有方向,完成通知目前会另起回合 | P0 | 走查场景 1–3 步始终是同一张材料卡;刷新后仍是同一 ID | 任务登记 | 纳入增量 1 |
| NB03 | 概览、工作详情、执行记录三层可读,并映射 r1.1 L0–L3。可展开的是已保存、且当前用户有权查看的公开工作摘要、工具名、已授权参数和输出 | 需调整后符合 | P1 | 默认见名称、材料、状态、时间和当前事项;展开可见完整结果与执行记录。折叠不删除已保存的公开事件 | 既有事件回放 | 纳入增量 2 |
| NB04 | 同一段流式文字更新原位置。只有阶段变化才新增阶段记录。工具开始和工具结束只更新活动行并进入执行记录 | 需调整后符合 | P1 | 用一段重复开头的进度事件回放,时间线里该段只占一行。工具起止不增加阶段行。原始事件仍在详细记录中可查 | `agent.progress` | 纳入增量 2 |
| NB05 | 完成卡读取后台最终结果。没有可靠短摘要时显示「整理结果已生成,查看完整结果」 | 需调整后符合 | P0 | 完成卡正文能打开全文。开头是标题或表格时,概览不把截断标题当成摘要 | 已落库的子代理消息 | 纳入增量 1 |
| NB06 | 运行中的「当前发现」只收已经形成的实质结果。检索开场和工具调用只进入活动行或执行记录 | 需调整后符合 | P1 | 「我来检索」「正在调用工具」不出现在「已整理的要点」 | 阶段与工具事件 | 纳入增量 2 |
| NB07 | 后台完成时更新原卡、标记新结果版本,并给出一次轻提示。此前没有未读版本的任务才使工作入口未读数加一,同一任务再来新版本不重复加一 | 需调整后符合;当前会 `claimConversation` 后启动通知回合 | P0 | 完成时中栏消息条数不变,滚动位置不变,输入焦点不变。提示含材料名,例如「《说明书》的材料整理已完成」。同一任务连续完成两个版本,未读数只增加 1,两次轻提示不叠加成两条未读 | 卡片与未读 | 纳入增量 1 |
| NB08 | 用户可以把结果引用到当前输入。引用可移除。发送后才成为新回合,并带上被引用的结果版本。引用保证该版本进入本轮;未引用时不得声称看过未带入的内容 | 符合度待核实:输入区尚无此引用标签 | P0 | 引用后提问出现在对话末尾,时间是发送时间,回答可以使用该结果版本而不再跑一遍同一摘要。未引用的提问不把该版本写成已经读过,除非权限内查询实际读到并加以说明。引用在发送时和组装模型上下文时各重新鉴权一次:权限被撤销后,该版本内容不注入上下文,提示与回答也不透露该资源是否存在,表现与引用不存在的资源一致 | 任务结果版本 | 纳入增量 1 |
| NB09 | 用途选择放在所属任务卡底部,含单选或多选、补充输入、「按此处理」和「先不选择」。右栏不可见时,同一选择出现在中栏的同一张卡上 | 需调整后符合 | P0 | 选择出现时用户仍能发送无关消息并得到回复。推荐项有标识,且不会自动执行 | HITL 投影 | 纳入增量 1 |
| NB10 | 自由输入是卡片里的真实控件。处理后展示实际选择和补充要求,并与后续生成的完成状态分开 | 需调整后符合 | P0 | 处理后可见「已选择:简明摘要;重点:使用流程和技术参数」,同时后续任务仍显示自己的进行中或完成。失效的「可自由输入」不再出现 | `AskHITL` 投影 | 纳入增量 1 |
| NB11 | 「先不选择」收起选择区,留下「暂不处理 · 可随时继续」,不催问、不自动重开。点该提示重新展开原选择区并回到待选,不新建请求 | 需调整后符合 | P0 | 收起后没有挂起的前台回合;刷新后仍是收起状态。点提示后选项恢复,任务请求数不变 | 选择状态持久化 | 纳入增量 1 |
| NB12 | 明确回答当前材料用途的发言,绑定该材料并复用已有同范围请求;没有时才启动一次工作。其他问题按新话题处理,原选择保留。直接交代后,被该指令满足的选择转为「已选」并关闭待选区 | 需调整后符合 | P0 | 第二次说「总结一下这份材料的摘要」不新开摘要任务,只显示已有进展。同时讨论无关问题时,原选择仍在。直接说「帮我做简明摘要」后,无论复用已有请求还是新启一次,所属任务卡的选择状态都变为已选(记录选项、来源为聊天指令和时间),不再留下待选区,也不留下「先不选择」的收起提示;重复说同一指令不产生第二条选择记录。多选卡只关闭被指令满足的选项,其余选项仍可选 | 确定性绑定规则 | 纳入增量 1 |
| NB13 | 选择按钮和聊天消息汇合到同一任务请求。已有工作只显示进展。明确要求重新生成或改变范围时才建立新结果版本 | 需调整后符合 | P0 | 两个入口几乎同时提交,只产生一个摘要任务和一组结果文件。再次要求「重新生成」才出现新版本。请求键限定在认证账号、项目、来源会话,再加材料内容 hash、解析版本、用途和请求版本;只有归属一致且请求者仍有权限时才复用。换账号、换项目或换会话提交相同内容不命中既有请求,也看不到其进展;权限撤销后重复提交不返回既有任务,表现与没有既有请求一致 | 内容 hash、用途、请求版本 | 纳入增量 1 |
| NB14 | 需要授权的操作继续等待授权,并且只阻止依赖该授权的工作。自由输入和「先不选择」不算同意 | 符合;危险确认已经独立。需保持 | 约束 | 授权卡未处理时,无关对话仍可发送。两种放弃动作不会让被授权动作执行 | 既有 HITL | 随增量 1 保持,不单独排期 |
| NB15 | 取消按滚动百分比联动。关联只在用户点击「查看关联任务」或「定位发起消息」时定位并高亮 | 需调整后符合 | P1 | 滚动中栏时右栏位置不变。点击入口后目标高亮。用户正在看旧卡时,新结果只显示「有 1 项更新」 | `scrollsync.ts` | 纳入增量 2 |
| NB16 | 右栏分当前工作与工作历史。当前工作含进行中、确实等待输入的任务、新到未查看的结果,新任务在上。历史默认折叠。当前工作与工作历史互斥,一张卡同一时刻只在其一 | 需调整后符合 | P1 | 用途选择和选择历史留在所属任务卡内,不另堆「已处理」卡。阅读旧卡时卡片不因更新而自动排序、展开或跳转;正在阅读的历史卡收到更新时暂留原位并显示「有 1 项更新」,用户离开该卡后再按未读状态迁入当前工作 | 卡片排序 | 纳入增量 2 |
| NB17 | 消息常驻显示时刻,跨天显示日期。完整时间戳除悬停外,键盘聚焦、触屏点按和屏幕阅读器也能得到(`time` 的 `datetime` 与含完整本地时间的可访问名称)。卡片分别标创建、更新、完成。选择记录带提交时间 | 需调整后符合 | P1 | 键盘、触屏和读屏得到的完整时间与悬停一致。后台更新不改变已有消息的时间。选择时间与后续任务的开始、完成时间彼此可区分 | 消息 `createdAt`、卡片时间 | 纳入增量 2 |
| NB18 | 右栏「工作」可见时中栏只留入口。右栏关闭、切到文件或窄屏时,中栏内联展开同一 taskId 的完整卡片与操作。窄屏只保留这一种落位,不使用抽屉 | 需调整后符合;`ConversationWork` 已有收起摘要,需改成同一面板,并在中栏补齐操作 | P0 | 收起、窄屏、文件入口和右栏展开打开的是同一任务 ID。窄屏下点击入口在中栏内联展开该卡,不出现抽屉或遮罩,输入焦点不移动,已读只按 NB24 判定。右栏关闭时可以读摘要和依据、处理确认或用途选择、打开文件 | 现有右栏 | 纳入增量 1 |
| NB19 | 后台运行和普通待选卡不使聊天一直排队。前台生成中可以短暂排队。跨刷新、跨会话恢复不在本需求 | 需调整后符合;当前完成后通知回合会占住会话 | P0 | 材料整理进行中直接发送的新消息进入对话,而不是一直停在本地队列。刷新之后排队消息是否还在,不作为本需求的验收 | 会话占用 | 纳入增量 1 |
| NB20 | 升级后仍能阅读旧会话。重复进展按新规则折叠展示,原始事件还在。旧完成卡若只有 160 字摘要,概览标明这是当时保存的开头,并尽量链到已存全文 | 需调整后符合 | P1 | 打开含 80 次重复进展的历史会话,默认时间线没有 80 行相同开头;详细记录仍能按事件查看 | 旧事件只读 | 纳入增量 2 |
| NB21 | 后台失败时原卡进入失败状态,保留已保存的部分结果和原因,不启动汇报回合。未读与轻提示仍发生一次。对应 r1.1 R08、R17 | 需调整后符合;失败目前可能随通知回合出现 | P0 | 失败卡不显示成功完成。中栏消息条数不因失败汇报增加。已保存的部分结果仍可打开 | 原任务卡与 run 终态 | 纳入增量 1 |
| NB22 | 选择已过期或已处理时,界面刷新成服务端状态,旧选项不能再次提交。对应 r1.1 R07 | 需调整后符合;r1.1 已有方向,r2 选择改到卡内后须保持 | P0 | 服务端返回已处理或版本过期后,原选项不可提交,中栏与右栏状态一致 | 选择版本 | 纳入增量 1 |
| NB23 | 展开不得展示隐藏思维链、系统或开发者提示、凭据、原始请求载荷、未授权工具数据。展开不提升权限。成果不是思维链(r1.1 §7.3) | 需保持;r1.1 §7.3 已批准 | 约束 | 夹具含上述类别时,任务卡、中栏入口和引用标签都不可见这些内容 | 现有权限 | 随增量 1 保持,不单独排期 |
| NB24 | 已读、再次未读、当前/历史分组和暂不处理按 §4.5 的互斥状态表转换。只有用户针对具体结果版本主动展开、打开全文、激活「有 1 项更新」或显式标记,才算已读;布局切换、刷新、组件重挂载和仅出现在视口不算。新的成功或失败终态版本使任务未读,仅启动重试不触发。未读数增加的是此前没有未读版本的任务,不是每个结果事件 | 符合度待核实:未读与暂不处理尚无这一状态机 | P0 | 右栏关闭后因布局切换自动展开该卡,未读仍在;刷新和重挂载后未读不变;用户手动展开该版本后未读消失。同一任务已有未读时再完成新版本,未读数不变;已读后再完成才加一。失败终态使任务未读,启动重试不使其未读。正在阅读的历史卡收到更新时暂留原位显示「有 1 项更新」,用户离开后迁入当前工作;激活该提示才把新版本标为已读。点「暂不处理 · 可随时继续」回到待选且不新建请求 | 结果版本与选择状态 | 纳入增量 1 |
## 4. 方案设计
### 4.1 方案选择
| 方案 | 结果 | 结论 |
|---|---|---|
| A. 只改样式和截断长度 | 重复行、自动回合和滚动联动还在 | 不采用 |
| B. 完成后仍自动追加一轮短回复 | 对话顺序仍会被后台打断 | 不采用 |
| C. 完成后完全无提示 | 容易漏看结果 | 不采用 |
| D. 右栏持续更新同一张卡,加未读和一次轻提示;选择留在卡内;对话只在用户引用或主动提问时继续;右栏不可见时中栏承担同一张卡 | 对齐第 1 节场景,并保持 R11 | **推荐** |
### 4.2 职责
```text
右栏「工作」可见时
中栏:用户与助手发言;前台回合的折叠过程;「已启动材料整理」→ 打开该任务;文件打开入口
右栏:当前工作(新在上);同一任务卡;选择与选择历史;工作历史
右栏关闭、切到「文件」或窄屏时
中栏:除上述发言外,展开同一 taskId 的完整卡片与操作(摘要、依据、选择、打开文件)
文件入口:仍只做列表和预览
```
异步状态只有一个所有者:服务端任务快照。前端按事件 seq 更新,过期事件丢弃。
中栏入口、中栏展开卡和右栏卡片读取同一任务 ID,不各算一份摘要。
### 4.3 任务卡与 r1.1 四层阅读
| r2 卡片层 | r1.1 | 默认展示 |
|---|---|---|
| 概览 | L0 一行汇总加 L1 工作摘要 | 任务名称、关联材料、状态、创建/更新/完成时间,以及当前在做什么或已经得到什么 |
| 工作详情 | L2 阶段与依据 | 内容要点、完整结果、依据、范围、文件、选择与补充要求 |
| 执行记录 | L3 执行记录 | 已保存且当前用户有权查看的公开过程、工具名、已授权参数和输出,默认折叠 |
不在任何一层展示:隐藏思维链、系统或开发者提示、凭据、原始请求载荷、未授权工具数据。
展开不提升权限。这是 r1.1 §7.3「成果不是思维链」在 r2 的保持项(NB23)。
运行时活动行使用真实阶段,例如「已提取文档文字」「正在整理内容结构」。
「已整理的要点」只接收已经形成的实质结果。工具名和「我来检索」留在活动行或执行记录,不进入要点。
完成时概览切到「整理结果」。正文来自后台最终消息的结构化要点;要点缺失时显示
「整理结果已生成,查看完整结果」,并链到已保存全文。实现上停止把全文开头 160 字写入用户可见摘要。
### 4.4 进展归并
`agent.progress` 继续可以高频产生,原始事件不删。展示层为每个子任务维护一条「当前文字」:
同一文本流的后续累计内容替换这一条。阶段变化才新增阶段记录。
工具开始和工具结束只更新活动行,并记入执行记录,不新增阶段记录。
回放与实时使用同一归并规则,避免刷新后再次刷出重复行。
### 4.5 到达、已读与引用
未读、已读和分组共用一套互斥状态。状态属于「任务 × 结果版本」,由服务端持有,前端只投影。
**1. 已读判定(唯一入口)**
只有用户针对具体结果版本做出下列主动动作之一,该版本才算已读:
- 主动展开该版本的工作详情;
- 主动打开该版本的完整结果或全文;
- 激活该卡上的「有 1 项更新」;
- 显式点「标记已读」。
下列情形一律不算已读:布局切换(右栏关闭、切到文件、窄屏)带来的自动展开、页面刷新、
组件重挂载、卡片仅出现在视口、轻提示出现或消失。已读按版本记录;已读旧版本不使新版本已读。
**2. 未读转换与计数**
| 事件 | 该任务未读 | 未读数 |
|---|---|---|
| 新的成功终态版本 | 置为未读 | 此前该任务没有未读版本才加 1 |
| 新的失败终态版本(含失败后的新尝试以失败结束) | 置为未读 | 同上 |
| 仅启动重试或重新生成(尚无终态) | 不变 | 不变 |
| 已有未读版本时又来新终态版本 | 仍为未读,未读版本集合增加 | 不变 |
| 用户对最新未读版本做出 §1 动作 | 清除该任务未读(仍有更旧未读版本时一并清除,已读按「用户看到最新版」计) | 减 1 |
未读数 = 仍有未读版本的任务数,不按结果事件条数计。轻提示每次终态版本到达发一次,
多任务同时完成可合并成一条计数提示;轻提示不影响未读数。
**3. 当前工作与工作历史互斥**
| 卡片状态 | 所在分组 |
|---|---|
| 进行中、等待输入、有未读版本 | 当前工作 |
| 已读、无待选、无进行中的终态卡 | 工作历史(默认折叠) |
| 正在被用户阅读的历史卡收到新终态版本 | 暂留工作历史原位,卡上显示「有 1 项更新」,不改变排序、展开状态和滚动位置;用户离开该卡后,按其未读状态迁入当前工作 |
| 阅读中的历史卡,用户激活「有 1 项更新」 | 新版本标为已读,卡片留在原位 |
一张卡同一时刻只属于一个分组。「正在阅读」指用户已主动展开该卡且仍停留在其中;
离开指展开态被用户收起或焦点和展开目标切到其他卡。
**4. 与选择状态的关系**
选择状态(待选 / 已选 / 暂不处理)与未读相互独立,各自转换。「暂不处理」写入 `deferred`
并收起选择区。点「暂不处理 · 可随时继续」回到待选并展开原选项,不新建请求,也不改变未读。
选择已过期时改为刷新服务端状态,不恢复旧选项。
**5. 引用**
引用保证被引用的结果版本进入下一条用户消息的上下文。它不是助手读取结果的唯一前提。
引用动作本身不算已读。
后台完成时:
- 原任务卡写入结果版本,标记「新结果」。
- 按 §2 更新未读,按 §3 决定分组。
- 轻提示一次,带材料名。
- 不插入历史消息,不追加助手长回复,不移动焦点,不改变滚动位置。
「引用结果到对话」在输入区放一个可移除标签。用户发出下一条消息时,该消息成为普通回合,
并记录被引用的任务和结果版本。助手回答相关问题时可以读取这个已经完成的版本。
没有引用时,助手只可通过当前用户已有权限的任务结果查询读取。回答不得写成「我已看过该版本」,
除非这次查询实际读到了它,并说明读到的是哪一版。
多个任务同时完成时,每张卡各自更新,未读按任务计数,轻提示可以合并成一条计数,
仍然不启动汇报回合。
### 4.6 选择
卡片底部:
```text
接下来想怎样处理?
这一步可以稍后决定,你可以继续对话。
○ 看一份简明摘要
○ 提取参数与重点
○ 检查缺项和不一致
补充要求
[例如:先关注使用流程和技术参数……]
[按此处理] [先不选择]
```
- 互斥方案用单选。可以组合的事项用多选,并写明「可多选」。
- 推荐标记只是标识。
- 「先不选择」写入选择状态 `deferred`,选择区收起为「暂不处理 · 可随时继续」。
- 点该提示重新展开原选择区,状态回到待选,不新建任务请求。
- 选择历史保留选项、补充要求、提交时间和后续工作结果。
- 「已选择」与「生成完成」是两条状态。
需要授权的操作仍使用现有确认卡,只阻塞依赖该授权的工作。自由输入和「先不选择」的存储值
不得被执行器解释为同意。
### 4.7 直接消息与任务请求
绑定到待选任务的入口只有三个:卡片内输入、消息里明确引用该任务、确定性规则判定为在回答
该材料的用途。规则至少同时识别材料指向和用途动作。无法同时满足时,只澄清关联,不静默绑定。
任务请求键由两部分组成:授权作用域(认证账号、项目、来源会话)和现有内容字段
(材料内容 hash、解析版本、用途、请求版本)。选择按钮与聊天消息使用同一键。
复用既有请求须同时满足:作用域三项与既有请求一致,且请求者此刻仍有权限访问该项目、会话和材料。
任一不满足时不命中既有请求:不返回其进展,也不提示存在相同请求,按没有既有请求处理。
已有未完成或已完成且范围相同的请求时,展示其进展,不另起一份。重复的明确指令也走这条规则,
不再次启动工作。用户明确要求重新生成或改变范围时,请求版本递增,保留旧结果。
直接交代的收尾:确定性规则命中并绑定后,无论复用已有请求还是新启一次,都把所属任务卡的
选择状态写为「已选」,记录选项、来源(聊天指令)和提交时间,并关闭待选区;不留下待选区,
也不留下「暂不处理」收起提示。指令只满足多选卡中的部分选项时,只关闭这些选项。
重复的同一指令不新增选择记录。规则未命中或有歧义时,选择状态保持不变。
`materialKey` 继续可以存在于受控元数据,供旧客户端识别;用户默认卡身不展示内部键。
内容身份以 hash 和解析版本为准,与 r1.1 §8.3 一致。
### 4.8 右栏、滚动与时间
当前工作:进行中、确实等待输入、新到未查看。新任务在上。
工作历史:按完成或处理时间倒序,默认折叠成紧凑行。
删除中栏滚动百分比到右栏的写入。`flashElement` 只在用户点击定位后使用。
用户停留在某张历史卡时,新结果不改变排序、展开状态和滚动位置,只显示「有 1 项更新」。
消息时间来自消息创建时间,后台卡更新不回写它。跨天显示日期。
完整时间戳有四条路径:指针悬停、键盘聚焦、触屏点按、屏幕阅读器。
实现使用 `time` 元素的 `datetime`,可访问名称包含完整本地时间。
具体控件在阶段 5 确认,只用 `@ui` 已有原语,不新增私有样式。
卡片显示「创建」「更新」「完成」。选择记录显示「11:09 已选择:简明摘要」。
阶段和执行记录显示事件时间。正文流式输出不逐段显示时间。
右栏「工作」可见时,中栏只留短入口。右栏关闭、切到文件或窄屏时,中栏展开同一任务的完整卡片与操作。
窄屏只有一种落位:中栏内联展开同一 taskId 的卡,不打开抽屉或遮罩。内联展开不移动输入焦点,
不改写两栏滚动位置,也不因展开本身标记已读(见 §4.5)。收起提示打开的同样是这一任务面板。
### 4.9 失败与存量
| 情况 | 表现 | 需求 |
|---|---|---|
| 后台失败 | 原卡进入失败状态,保留已保存的部分结果和原因。不启动汇报回合。未读与轻提示仍发生一次 | NB21 |
| 选择已过期或已处理 | 刷新成服务端状态。过期选项不能再次提交 | NB22 |
| 重复点击 | 同一请求键只执行一次,按钮进入已提交 | NB13 |
| 刷新与断线 | 卡片、选择状态和未读从服务端恢复。连接提示不改写业务终态。前台排队消息的跨刷新恢复不在本轮 | NB19 的排除项 |
| 旧的重复进展 | 默认按 4.4 折叠;详细记录按原始 seq 查阅 | NB20 |
| 旧的 160 字摘要 | 概览标明这是当时保存的开头,并链到已存全文。不把旧摘要改写成新的模型结果 | NB20 |
| 无全文可链 | 显示「当时只保存了开头,完整结果不可用」 | NB20 |
### 4.10 数据与权限
新增或收紧的状态:任务请求键、选择状态(待选 / 已选 / 暂不处理)、结果未读、输入区引用。
它们归属会话和项目的现有权限。未读是展示状态,不改变 run 终态。
引用只携带当前用户已经能阅读的任务结果版本,并在两个时点重新鉴权:发送消息时,和组装模型上下文时。
任一时点权限已撤销:不注入该版本内容;用户可见提示和助手回答不得区分「无权」与「不存在」,
不泄露资源是否存在、标题或大小。任务请求键的授权作用域见 §4.7;复用前同样按请求者当前权限判定。
不新增跨项目读取。执行记录的可见性保持现有权限,展开不提升权限。
公开投影排除隐藏思维链、系统或开发者提示、凭据、原始请求载荷和未授权工具数据。
不新增前台 outbox 的服务端记录,也不定义作者私有草稿的保存、恢复和删除。
### 4.11 待验证假设
| 假设 | 验证 | 若失败 |
|---|---|---|
| 最终消息里能够稳定抽出要点 | 增量 1 用已保存子代理消息做投影测试 | 没有要点就用诚实占位,不回退到截断开头 |
| 确定性绑定能覆盖「总结一下这份材料」这类句子,同时不误绑无关消息 | 增量 1 的语句样本,含无关话题、含糊句和重复的明确指令 | 含糊句只澄清。重复明确指令复用已有请求。不在未批准时改成模型判断 |
| 去掉自动汇报后,轻提示足够让用户找到结果;右栏关闭时中栏卡片同样可达 | 阶段 7 的浏览器走查,按下方 §4.11.1 逐项记录 | 调整提示位置或中栏展开,仍不恢复自动长回复 |
#### 4.11.1 轻提示可达性走查
前置:右栏关闭;中栏输入框有焦点且含未发送文字;两栏均已滚动到非初始位置并记录像素位置;
材料整理在后台完成并留下一个待选的用途选择。
| 步骤 | 通过判据 |
|---|---|
| 1 完成到达 | 轻提示出现并含材料名;中栏消息条数不变;输入焦点、输入文字和两栏滚动位置与前置记录一致 |
| 2 一步定位 | 只点一次轻提示或未读入口,同一 taskId 的卡在中栏内联展开并可见,无需先打开右栏 |
| 3 完成一次选择 | 在该卡内选一个用途并提交,卡内显示实际选择;其间不要求打开右栏 |
| 4 状态不被污染 | 全过程输入焦点和输入文字不变,两栏滚动位置在展开前后一致(卡片自身展开导致的高度变化不得牵动另一栏);未读只在步骤 2 的主动展开后减少,步骤 1 结束时仍为未读 |
执行与记录:由非作者执行并按步骤逐项记录通过或失败、浏览器与视口、对象 SHA、时间、执行人;
作者本人的走查只能标 SELF,不替代这份记录。窄屏视口重复一遍,并确认全程没有抽屉或遮罩出现。
任一步失败,本假设按「若失败」处理。该走查在阶段 7 前保持 `NOT_RUN`。
## 5. 验收场景
主场景即 1.2。边界同时覆盖:多个任务同时完成、右栏关闭、切到文件、刷新、重复点击、
重复的明确指令、直接交代后选择关闭、旧选择过期、后台失败、暂不处理后再展开、未读与再次更新、
布局自动展开不算已读、跨账号或权限撤销后的请求复用和引用、窄屏内联展开。
判据:进展不刷重复行;完整结果能读到;选择不锁住无关对话;同一摘要只执行一次;
结果到达不改变消息顺序;历史记录的是用户实际决定;右栏不可见时中栏能完成阅读、选择和打开文件;
排除项不会出现在展开内容里。
这些场景在本稿阶段是计划,状态 `NOT_RUN`。设计文档的保存不表示场景已通过。
## 6. 评审记录
| 阶段 | 对象 | 结论 | 评审人 | 时间 | 依据 |
|---|---|---|---|---|---|
| 1 需求拆解 | 本稿 §1 @ r2-draft.3 | 未评审 | — | — | 待人工确认与原始意图一致 |
| 2 需求评估 | 本稿 §2 @ r2-draft.3 | 未评审 | — | — | 待人工确认取舍与 U3 并行方式 |
| 3 需求表确认 | 本稿 §3 NB01–NB24 | 未评审 | — | — | 待人工确认范围与验收条件 |
| 4 方案设计 | 本稿 §4 @ r2-draft.3 | 未评审 | — | — | 待人工批准后,拟取代条款才生效 |
| 5 实施计划 | [实施计划](2026-10-15-fast-slow-r2-nonblocking-plan.md) | 未评审 | — | — | 待阶段 1–4 通过后单独评审;未授权写业务代码 |
### 6.1 修订记录
| 项 | 内容 |
|---|---|
| 对象 | Dev `7b87e03`、Documents `3a43ce6` 上的 r2-draft |
| 意见 | 阶段 1–4 建议「需修改」,不是拒绝。阶段 5 未评审 |
| 来源 | SELF。智能体评审不能替代人工阶段批准 |
| 本稿 | r2-draft.2。阶段结论保持未评审 |
| 裁定 | 引用是保证上下文,不是读取结果的唯一前提。已读以展开详情、完整结果或显式标记为准,视口曝光不算。这两项仍可在人工评审时改 |
| 同步 | 修订前 `task-sync` 到 Dev `692735e`。该提交包含评审提到的 `7a0f934`。Documents `origin/main` 为 `d668a3e`。§2.1 行号已按 Backend `80bb123` 重验 |
#### 第二轮(r2-draft.2 → r2-draft.3)
| 项 | 内容 |
|---|---|
| 对象 | Dev `13d2315`、Documents `a672adb` 上的 r2-draft.2 |
| 意见 | 阶段 1、3、4 建议「需修改」,阶段 2 内容可接受但随阶段 1 保持未评审,阶段 5 未评审。不是拒绝,未发现不可行项 |
| 来源 | SELF。智能体复审不能代签人工批准;阶段 1–4 仍为未评审 |
| 本稿 | r2-draft.3。仅改文稿,未改业务代码 |
| 1 窄屏落位 | 只保留中栏内联展开同一 `taskId`,删除窄屏抽屉表述(§1.1、§1.3、NB18、§4.8) |
| 2 状态机 | 新增 §4.5 互斥状态:已读判定唯一入口、未读转换与计数、当前/历史分组互斥、与选择状态的关系;NB07、NB16、NB24、§1.3 同步 |
| 3 授权边界 | §4.7 请求键限定认证账号、项目、来源会话,复用须归属一致且仍有权限;§4.10 引用在发送与组装上下文时重新鉴权,撤销后不注入也不泄露存在性;NB08、NB13 验收补充 |
| 4 直接交代 | NB12 验收与 §4.7 写入「直接交代后关闭已满足的选择」,含多选部分满足与重复指令 |
| 5 可达走查 | 新增 §4.11.1:右栏关闭时一步定位并完成一次选择,焦点与两栏滚动不变,由非作者逐项记录;§5 边界同步 |
| 待澄清项 | 按评审建议保留 §1.5 当前写法:确定性绑定、不离线回填旧摘要、引用不是读取的唯一前提 |
| 同步 | 修订前 `task-sync` 到 Dev `ff3a562`(相对 `692735e` 只新增任务卡闭合提交,未推进业务组件) |
| 现场 | 任务卡相对 `13d2315` 曾有 114 行未提交删除(主要是两段 SELF 收据);经用户确认后先另存补丁到源码外 `/tmp`,再还原,随后启动检查 READY |
| 未执行 | 真实模型、浏览器走查和 `make test`:`NOT_RUN` |
源码核对:SELF,2026-10-15,对象见 §2.1。真实模型、浏览器和部署:`NOT_RUN`。
+5
View File
@@ -4,6 +4,8 @@
本索引负责导航与差异提示,规划正文、批准范围和验收条件仍以链接的主记录及其批准版本为准。
合入授权不批准新方向、不调整里程碑范围、不启动新的业务任务。
待评审(收录不是批准):[svc 插件组合部署(--with)方案 r1](2026-10-14-svc-plugin-compose-deploy.md)。
## 先看哪一份
- [IAM I1 权限边界与公开扩展合同 r1](2026-10-13-iam-i1-permission-contract.md):
@@ -15,6 +17,9 @@
- [快慢通道展示与动态工作摘要方案 r1.1](2026-10-12-fast-slow-channel-display.md):
运行卡呈现状态、已完成工作、当前发现与剩余项;四层阅读、阶段成果、来源、异常恢复及 U1–U4。
2026-10-12 方案设计已批准(阶段 1–4);首批仅 U1;[U1 实施计划 r1](2026-10-12-fast-slow-channel-display-u1-plan.md) 待阶段 5 批准;业务实施和运行验收 NOT_RUN。
候选增补 [r2 非阻塞对话与任务卡](2026-10-15-fast-slow-r2-nonblocking.md) 与
[r2 实施计划](2026-10-15-fast-slow-r2-nonblocking-plan.md) 已修订为 r2-draft.3,阶段结论仍为未评审。
评审通过前 r1.1 仍然有效,r2 不取代已批准条款,也不授权业务代码。
Generative UI 方向已收口(U1–U7 全部落地,2026-10-12):[使用说明与评测记录](2026-10-12-generative-ui-usage-and-evaluation.md)(final);
主记录 [r2](2026-10-10-generative-ui-plugin.md) 与 [U5 动作范围 r2](2026-10-11-generative-ui-u5-action-scope.md) 保留为过程权威。
@@ -0,0 +1,210 @@
{
"source": "SELF",
"observed_at_utc": "2026-10-14T14:13:54.776253+00:00",
"repo": "weichen/Agent-System-Dev",
"main_sha": "e1bc2602e18a89e4d75a4bf6cd80bc7f9b4d2164",
"queue_issue": 518,
"issue_content_version": 34,
"issue_updated_at": "2026-10-14T13:41:21Z",
"active_window": "- 当前窗口:无(mq-dev-20261014-537-01 因独立 Stage 8 Review 的三项 Important 整改与安全设计重审,于 2026-10-14T06:06:23.872984+00:00 主动释放)。旧固定 head=6a2f7cd3e610a263b6348efe9084e386dc88f30c / base=4f84c2e1630cd0311643529fae1c3a99f1dd5d64 的 GATE run3076/3077、阶段7人工批准均只对应旧对象;PR #537 已按用户撤销指示关闭,迁移专用远端与本地分支已删除;该任务不再排队。旧 GATE 和阶段结论仅为历史记录。",
"branch_protection": {
"enable_push": false,
"enable_force_push": false,
"block_on_outdated_branch": true,
"enable_status_check": true,
"status_check_contexts": [
"ci / test (pull_request)",
"ci / test-pg (pull_request)",
"ci / svc-realcombo (pull_request)"
],
"required_approvals": 0,
"block_admin_merge_override": true
},
"post_trial_prs": [
{
"number": 539,
"merged": true,
"merge_sha": "d40579ed7fe3bbca68d3c6fcd1bce6707688d59e",
"merged_at": "2026-10-14T06:40:54Z",
"head_sha": "3b0e100fba149dbb29066c2ca3d2a74bbe1d4443",
"issue_body_ref": false,
"issue_comment_refs": [
{
"id": 6017,
"created_at": "2026-10-14T06:42:12Z",
"head": "<!-- facts-539-merge-record-20261014T0700Z -->"
}
]
},
{
"number": 540,
"merged": true,
"merge_sha": "11aa76a3bc1c5047791f9a2de154e451634b6567",
"merged_at": "2026-10-14T08:08:07Z",
"head_sha": "889f64f88167a5314ebfa42a41f9c7a57f91b404",
"issue_body_ref": false,
"issue_comment_refs": [
{
"id": 6025,
"created_at": "2026-10-14T07:02:56Z",
"head": "<!-- dhf-u1-stage7-wip-20261014-01a137f8 -->"
},
{
"id": 6059,
"created_at": "2026-10-14T08:04:24Z",
"head": "<!-- mq-dev-20261014-dhf-u1-01-claim -->"
},
{
"id": 6066,
"created_at": "2026-10-14T08:09:12Z",
"head": "<!-- mq-dev-20261014-dhf-u1-01-release -->"
},
{
"id": 6097,
"created_at": "2026-10-14T08:32:38Z",
"head": "<!-- mq-dev-20261014-dhf-cardclose-01-claim -->"
}
]
},
{
"number": 541,
"merged": true,
"merge_sha": "d23fb4363dcc0a206e71e47f9cd23a644c7e1c70",
"merged_at": "2026-10-14T07:33:18Z",
"head_sha": "221afaeb169b826ecd38567296319c20c0e94b18",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 542,
"merged": true,
"merge_sha": "7e9ebdea5055a63c713ccc0fb1f938ffe35a6b9d",
"merged_at": "2026-10-14T08:46:12Z",
"head_sha": "60d48e0580a36b2e6f93c77bb1edbe9bd0be342e",
"issue_body_ref": false,
"issue_comment_refs": [
{
"id": 6097,
"created_at": "2026-10-14T08:32:38Z",
"head": "<!-- mq-dev-20261014-dhf-cardclose-01-claim -->"
},
{
"id": 6106,
"created_at": "2026-10-14T08:35:39Z",
"head": "<!-- mq-dev-20261014-dhf-cardclose-02-replacement -->"
},
{
"id": 6117,
"created_at": "2026-10-14T08:47:12Z",
"head": "<!-- mq-dev-20261014-dhf-cardclose-02-release -->"
}
]
},
{
"number": 543,
"merged": true,
"merge_sha": "da93edf23408ca871ae489ac2123e10734c24413",
"merged_at": "2026-10-14T09:24:42Z",
"head_sha": "deac1025f1810d7a535c44a16dd6368eb652c979",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 544,
"merged": true,
"merge_sha": "2dbe11c5d970e7d6a71d0ce1a00eb399bfbbd427",
"merged_at": "2026-10-14T09:00:43Z",
"head_sha": "b926c701f261995b6e1acabf277bbfdfa47829ca",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 545,
"merged": true,
"merge_sha": "c8eead49c5e68b2e295927c0e82cc57bcb04bad5",
"merged_at": "2026-10-14T09:10:29Z",
"head_sha": "00b35c5e6f5e0a0bc8072ff5c8c56378e6641d85",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 546,
"merged": true,
"merge_sha": "3538d40f45ad5a7c779426eb3322f79751db380c",
"merged_at": "2026-10-14T09:40:57Z",
"head_sha": "4a15fa0ceadf716fb93cc2966f099f3915b5f9d9",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 547,
"merged": true,
"merge_sha": "bcf225d0b981dcd69f8c736010c69b6a92d04341",
"merged_at": "2026-10-14T09:53:34Z",
"head_sha": "8522502e6e6db7a438a8f6fd391e1aa334c7a161",
"issue_body_ref": false,
"issue_comment_refs": []
},
{
"number": 548,
"merged": true,
"merge_sha": "e1bc2602e18a89e4d75a4bf6cd80bc7f9b4d2164",
"merged_at": "2026-10-14T10:05:47Z",
"head_sha": "b89dd1c20ef4aa5c93a144f00e722a81dee87a50",
"issue_body_ref": false,
"issue_comment_refs": []
}
],
"open_prs": [
{
"number": 512,
"draft": true,
"mergeable": false,
"head_sha": "89125b8dda5f8f988a8a760ed64bf00827e1de5c",
"base_sha": "e1bc2602e18a89e4d75a4bf6cd80bc7f9b4d2164",
"title": "[WIP] Deliver progressive U2/U3 work with reliable sourced checkpoints"
},
{
"number": 482,
"draft": false,
"mergeable": false,
"head_sha": "d5e8d6ab7a368f08b29e968b6f65f8898f2b28f5",
"base_sha": "e1bc2602e18a89e4d75a4bf6cd80bc7f9b4d2164",
"title": "Pin the SQLite activity guard and document its refusals"
}
],
"selected_runs": [
{
"run": 3088,
"head_sha": "6463ef430640c56940b82776adb504ee272f030c",
"status": "completed",
"conclusion": "success",
"started_at": "2026-10-14T07:02:04Z",
"completed_at": "2026-10-14T07:09:41Z"
},
{
"run": 3092,
"head_sha": "889f64f88167a5314ebfa42a41f9c7a57f91b404",
"status": "completed",
"conclusion": "success",
"started_at": "2026-10-14T07:49:37Z",
"completed_at": "2026-10-14T07:58:00Z"
},
{
"run": 3100,
"head_sha": "7dd8d0f52ed930fbcabc05f5c4b1fb2b41b10bc5",
"status": "completed",
"conclusion": "success",
"started_at": "2026-10-14T08:28:25Z",
"completed_at": "2026-10-14T08:43:31Z"
},
{
"run": 3107,
"head_sha": "60d48e0580a36b2e6f93c77bb1edbe9bd0be342e",
"status": "completed",
"conclusion": "success",
"started_at": "2026-10-14T08:33:36Z",
"completed_at": "2026-10-14T08:45:31Z"
}
]
}