Skip to content

feat(workspace): make report editions reviewable from Home - #8146

Merged
loopx-agent merged 4 commits into
mainfrom
codex/app-review-materials-20261106
Nov 6, 2026
Merged

loopx-agent merged 4 commits into
mainfrom
codex/app-review-materials-20261106

Conversation

@huangruiteng

@huangruiteng huangruiteng commented Nov 5, 2026 •

Copy link
Copy Markdown
Collaborator

生成的周期报告目前容易混在普通待办里,用户难以找到原材料、反馈原会话或判断哪个版本还没处理。此变更在 Home 增加独立的「待验收成果」数量与标题,点击后打开 Goal 成果页的对应版本,并提供阅读、反馈草稿及现有预览确认式验收。

行为与边界

  • 复用内置 HTML/Markdown 生成包;内容按摘要冻结,审阅状态只由现有 canonical User Todo 管理。阅读、刷新、切换格式均不确认验收;处理某一版不等于 Goal 验收。
  • 相同生产者重试不重复提醒、不重新打开已处理版;修订版独立处理。原材料损坏或权威读取失败时保留待审状态,页面不提供验收操作。
  • 反馈定位生产者的原 managed Session,等待目标 composer 就绪后准备草稿;没有原 Session 时等待选择已有会话。不会自动发送。
  • Goal 周期报告可选择原会话、每日/每周日历并开启「材料就绪后请求验收」。默认关闭,不提供设备级启用;报告生成、原会话完整投递和游标恢复沿用现有 owner。08:30 是调度时间,不能据此宣称 09:00 完成 SLA 已通过。
  • HTML 使用无脚本、无同源权限的 sandbox;验收按钮在宿主,外部来源从文字版打开。借鉴 Porthole 的隔离边界,未引入任意 HTML 应用或 host bridge。
  • 同域整理:将两类 Goal 结果的读路由放回已有结果 reader,chat_server.py 从基线 2,046 行减至 2,044 行,没有提高模块预算。新语义是 periodic_report 局部 binding/action;继续复用 User action、Goal 配置与会话 owner。

验证

  • 35 项报告审阅与既有成果 HTTP 路由测试通过,覆盖真实 File/SQLite、默认关闭、未迁移不可用、异源/错 Goal/错会话、篡改、重试与旧 renderer 恢复。
  • 原报告发布队列的 4 种真实 File/SQLite 恢复场景通过:模型工作不重复,报告消息只产生一次。此前更大的原会话定向组 21 项通过。
  • TypeScript owner/authoring tests、根类型检查、前端类型检查与构建、attention smoke、字体 tokens、Ruff、双语 RFC diff 检查通过。
  • 隔离 wheel 的产品源码与待审源码逐文件一致。Ego 浏览器使用真实 Chat 后端与合成 canonical SQLite:Home 4→验收一版→3,第二版仍待审;损坏/恢复、文字来源、原 Session 草稿、刷新保留选择,以及日历配置预览/保存/读回均已验证。桌面 1200×854、窄屏 390×844(无水平溢出),混合 5 个版本。

未通过与未验证

扩大回归曾在 108 项通过后出现 2 个原报告 runner 用例失败并中断;这两个用例在当前版本单独重跑通过。导出的 7edd100bdd main 基线也复现其中一个失败。这不等于完整扩大回归已通过。

已集成 main 817dd2461a。当前提交的 6 项直接检查、19 项选定检查均无执行失败;整体 gate 仍为 quality_receipt_missing。保留一个未修改函数的既存结构 advisory,以及三张图片的人工审阅 hold。像素已检查为合成数据,最终独立审阅仍需核验。最新 main 的原 worker 恢复组另有 9 项通过。独立 exact-scope change-quality receipt、键盘进入/返回时的焦点恢复复核、维护者审阅/合入、发布安装以及真实日历时点的材料质量和准时性资格仍待完成。未启动新的模型/benchmark 任务,未查询或手动触发 CI。保留既有 Vite chunk-size 警告。

视觉证据

测试边界:独立 wheel + 真实后端 + 合成数据;不是已发布或已安装能力。最终源码 revision:2113662d914e487fb29abfd4d12555c808b7eee5。

桌面 Home(已处理第一版,其余三份仍待审):

Home

对应版本的完整阅读与反馈:

Reader

窄屏首屏直接显示判断正文:

Narrow reader

旧 Home(7edd100bdd 的 UI;同类合成数据,处理前 4 份材料与 1 个普通待办混排。此图只对照 UI,不代表完整 baseline 后端资格):

home-main-before

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent | gpt-6.1-sol | OpenAI | runtime_reported | reasoning_effort=max

动机 / Motivation

REQUEST_CHANGES。精确 head:2113662d914e487fb29abfd4d12555c808b7eee5,独立 base:817dd2461a93b376e3420363a36f77e89287fcf8。需要在 Home 找到待审报告并阅读、反馈或处理某一版本的用户。四份待审报告在完整存储中仍为 open,Home 只显示三份;加入三个普通 P0 待办后,待验收成果区域消失,报告并未处理。报告阅读、单版本验收和原 Session 草稿路径可用,但 Home 提醒不能稳定覆盖真实待审材料。本 PR 不承担真实日历准时性、模型质量、安装发布或整个 Goal 的验收。

[P2] 请在通用 Todo 截断前派生材料提醒。 apps/presentation/dashboard/src/features/personal-workspace/manager-brief.tsx:83 从 attentionRows 筛选 review,但实际 project_asset.user_todos.items 已有 item_limit=3,不是完整报告清单。真实 canonical SQLite 中四份 open 材料在 Home 只显示三份;经正常 writer 新增三个普通 P0 User actions 后,材料原状态保持,Home 的整个「待验收成果」区域消失。这使待审版本随无关工作增长而失去提醒,不能用原生绑定 helper 或干净截图证明完整。在截断前由完整 canonical Todo 生成独立的报告待审数量和有界标题,并保留可进入完整目录的入口;不能从通用前三项反推材料是否存在。 回归应从真实 File/SQLite status 进入渲染,而非直接向组件注入完整 attention 数组。

改动思路 / Approach

保留既有 artifact、canonical User action 与 typed owner;Home 必须从完整来源派生报告摘要,不能用通用前三条冒充完整材料清单。先修复 Home 的完整待审数量和有界标题来源,保留现有阅读、原会话草稿与单版本确认;不扩大为新 scheduler 或第二验收账本。

这套分工总体合理:报告包只保存冻结内容,User Todo 单独管理人的处理状态;Python 做字节、注册与文件 IO,TS 规划操作身份和行投影,宿主复用既有 preview/apply。直接增加阅读页有价值;另设 acceptance 数据库或让 HTML 调宿主会重复 authority。本次问题在真实 producer 与 bounded consumer 的连接,不能靠全局增大通用列表上限解决。

具体改动 / Changes

规范依据为 docs/development/design.md,spec_revision 817dd2461a93b376e3420363a36f77e89287fcf8,并在实现前检查既有 frontend task-first 与 periodic-report 激活/投递契约。DESIGN-attention:未满足,Home 数量及入口受通用前三项限制;DESIGN-decide-in-place:已实现单版本预览/取消/确认及独立读回;DESIGN-truthful-result:读取、生成、人的处理和整个 Goal 验收分离;DESIGN-populated-page:已检查长内容、混合版本、窄屏及损坏/恢复。新指南是本次行为披露,不拿它倒推基线已承诺新的 API。

关键代码讲解

  • request_report_review(loopx/capabilities/periodic_report/review.py:58)核 registered producer、原 Goal/Agent/Session,验证内置 Markdown/HTML 包,按固定摘要保存;已有 canonical binding 可恢复旧 renderer 的原内容,不重新打开已处理版。显式 CLI 与原 managed report 的 review_required 分支是真实生产调用方。
  • planReportReview 和共享 reportReviewDigest 以 role/class/action/binding 精确识别材料,复用现有 User action 及稳定 operation id。authoring_scope.ts 仅扩展 human action 可携带引用,仍拒绝把它当 gate 或 Agent ownership;内容中的“请审阅”不会自动分类。
  • GoalReportReviews 通过同源、Goal-scoped HTTP 读取;HTML 使用空 sandbox 和限制性 CSP,操作在外层宿主,文字版保留完整正文。校验失败时没有验收按钮;修复原材料后仍能读取同一 open 版本。
  • ManagerBrief 的新分组是本次缺口:上游已经明确是 overview,而过滤后却成为看似完整的独立材料计数。修复应使用该 canonical owner 的完整报告 facts,再生成有界展示。

42 路径的完整范围包括报告 producer/config、reader、通用 User action 引用、UI/原会话导航、现有结果路由整理、测试和三张图。提取注册身份与 sibling result dispatch 没有建立新的决策 owner。默认关闭的 Goal 选项只允许原 managed Session 的 weekly-progress 路由,设备级启用被拒绝。

对主干的风险 / Risks

PASS:独立运行的 20 项决定性用例覆盖真实 File/SQLite、default-off/legacy 未迁移、异源/错 Goal/错 Agent/Session、篡改、旧 renderer、重试不重开,以及原模型工作完成后 review queue 两种失败/恢复方式不重复模型调用。16 项 TS scope/binding 用例、root control-plane tsc、前端 tsc、Chat 构建及配置的 mypy(17 个源码文件)通过,Vite 原有 chunk-size warning 保留。

真实浏览器使用本精确 head 的编译资产和实际 Chat/Core 后端:取消预览后仍 open;确认只处理第一版,其余版本不变;已知原 Session 的反馈带正确 Todo 草稿且没有发送。损坏版显示错误、无验收动作;恢复原文件后依旧待审并可读取。无 source Session 时,既有目录会复用唯一或已保存会话;这仅准备草稿,建议将新指南的“总是先选择”措辞与该既有行为对齐,不据此另立当前 blocker。

语义与 CI 对齐

FAIL:python -m ruff check tests loopx/canary loopx/control_plane loopx/domain_packs loopx/presentation 在 base 通过,在 head 的新增 tests/capabilities/test_periodic_report_review.py 报 6 个 E702(65、70、198、228 行);这是本次新增的标准验证失败,应拆开这些分号语句。premerge 的 6 项 direct、19 项 selected 没有执行失败,另有一个结构 advisory 和三张图片 manual hold;同命令 base/head 的 maintainability 检查均报未修改的 _admitted_interaction_next_cli_actions 过大(各 1 项,无 magnitude regression);我已逐张检查图片,内容为合成示例;PNG 无文本/EXIF metadata,机器 hold 状态仍据实保留。不能把它们改写成完整 merge gate 通过。

Head 扩展回归终态 214 passed / 2 failed;相同既有模块的 immutable base 为 195 passed / 1 failed。already_admitted-True-sqlite 在两边都出现 route not host executable,单项重跑 head 通过而 base 仍失败;retained_probe-True-file 在 head 全量及单项重跑均失败,base 通过。整个有界运行集合保留,后者因果未明;不能声称完整 default-off/worker parity 已证明。不把作者较早绿测或后续单次成功当作本轮全通过。完整矩阵与公开 readback 一起保存。wait_for_ci=false,未查询、轮询或等待 CI。没有提高预算、删除有效断言或把失败换成跳过。新增 action/binding 属于 report 局部词汇,普通 Todo 和原报告兼容性仍由实际入口对照决定。

我的整体评价 / Verdict

long_horizon 和 user_experience 均尚未证明完整:存储与阅读路径有效,但无关工作累积会抹掉 Home 提醒。这个切片无需完成整个报告系统或真实 09:00 SLA;需要先解决它自身的待审可发现性,并修复新增 lint 失败。架构复用和代码规模总体相称,最小修复是补全已有摘要来源,不是追加第二份状态。

已检查实际构建的 Home、长正文阅读、文字版与展开来源;桌面和窄屏层级可读,标题、正文与操作清晰,技术摘要位于展开区。Home 漏显是本次实测的事实覆盖问题。 未验证安装版 native WebView、真实日历时点、实际模型质量及完整键盘焦点恢复;首屏键盘进入曾观察到 BODY 焦点,未据此另立未经隔离的阻塞。 本轮没有单独检查 390px Home 默认态;窄屏阅读页和损坏恢复已实看,不将其冒充 narrow default Home。

English verdict: REQUEST_CHANGES 2113662; Home loses pending material reminders under the existing three-Todo cap, and the new test file fails standard Ruff validation. Preserve the working reader/recovery paths and repair the bounded summary source.

Comment on lines +83 to +84
const reviews = attentionRows.filter(row => row.attention?.details?.reportReview === true)
.map(row => ({...row, meta: [row.goal.title, row.attention?.details?.createdBy ?? row.attention?.details?.boundAgent].filter(Boolean).join(" · ")}));

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] 在通用 Todo 截断前派生材料提醒

这里从 attentionRows 筛选报告,但真实 project_asset.user_todos.items 已限定为前三条。我通过实际编译的前端和真实 canonical SQLite/HTTP 后端验证:四份仍 open 的报告在 Home 只显示三份;经正常 writer 加入三个普通 P0 User actions 后,四份报告未变,整个「待验收成果」区域却消失。用户会随无关工作累积而失去所有材料提醒。请从完整 canonical Todo 在通用截断前派生独立报告数量及有界标题,并保留完整目录入口;回归应从真实 status 进入渲染,覆盖 >3 份报告和无关高优先事项,而非只给组件完整数组。

if (!/^[a-f0-9]{64}$/.test(digest)) throw new Error("Invalid report bundle digest");
const goal = requireNonEmptyString(input.goal_id, "goal_id");
const agent = requireNonEmptyString(input.agent_id, "agent_id");
const title = requireNonEmptyString(input.title, "report title");

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max

[P2] 沿用已有报告标题的 Unicode 码点限制

补充同一 head 已有的 REQUEST_CHANGES;不重复 Home/Ruff 结论。这一行把已有 Python len(title) <= 200 合同改成了 UTF-16 单元计数。例如 "🧪" * 101 是合法的101码点标题,却在这里得到 title.length === 202 而被拒绝。

我用同一生成脚本在不可变 base 817dd2461a93b376e3420363a36f77e89287fcf8 与本 head 2113662d914e487fb29abfd4d12555c808b7eee5 生成 ASCII101、中文101、非BMP101 三组报告;两边均生成有效的内置 Markdown/HTML 包,且每组规范化包摘要相同。随后在真实隔离 SQLite 上调用公开 periodic-report request-review dry-run:前两组成功,非BMP组 exit1,仅返回 Effect runtime handler failed unexpectedly;直接调用此 TS planner 则得到 Report title exceeds its existing limit。确认没有新增材料或 Todo 副作用。

这是新消费者拒绝其既有生产者合同允许的输入;并非声称基线已有这个新 CLI。ManagedSessionReports.deliver_ready 在原报告消息/游标写入前调用同一请求函数,所以启用自动送审时也存在阻断投递的源码路径风险(未执行真实 emoji 模型投递)。

请保持原200码点上限和冻结标题,用同一 Unicode 度量校验,并通过公开 CLI 补 ASCII/中文/非BMP 的200码点接受、201拒绝及拒绝无副作用用例。不要通过截断标题或提高无关预算改变内容身份。

English: additional verified P2 finding; valid non-BMP report titles are rejected by the new UTF-16-based consumer check. The existing REQUEST_CHANGES conclusion remains appropriate.

@mergify

mergify Bot commented Nov 6, 2026

Copy link
Copy Markdown

This pull request has merge conflicts with main and cannot be merged
until they are resolved. Please rebase or merge the base branch, @huangruiteng.

Choose the remote for the base repository, not an out-of-date fork.
For a fork clone, first inspect git remote -v; upstream must point
to https://github.com/loopx-project/loopx.git. If it is absent, add it
with git remote add upstream https://github.com/loopx-project/loopx.git.
Then run:

git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEAD

For a same-repository clone whose origin points to
https://github.com/loopx-project/loopx.git, use origin instead of
upstream for fetch/rebase. If you prefer merging the base, use
git merge <base-remote>/main and push normally.

Keep the DCO Signed-off-by trailer on every commit when you rebase.
https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/working-with-forks/syncing-a-fork

@mergify mergify Bot added the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Nov 6, 2026
@huangruiteng
huangruiteng force-pushed the codex/app-review-materials-20261106 branch from 2113662 to ae67141 Compare November 6, 2026 09:10
Signed-off-by: huangruiteng <huangrt01@163.com>
Derive capability-bound User action counts from the full canonical Todo summary, keep only bounded titles, and preserve an explicit complete-directory entry. Reuse the shared digest and Unicode limits, and align the Home chat smoke with the current explicit Chat view.

Signed-off-by: huangruiteng <huangrt01@163.com>
@huangruiteng
huangruiteng force-pushed the codex/app-review-materials-20261106 branch from ae67141 to b96e6ef Compare November 6, 2026 09:11
@mergify mergify Bot removed the needs-rebase Mergify: the pull request has merge conflicts with its base branch label Nov 6, 2026

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent | gpt-6.1-sol | OpenAI | runtime_reported | reasoning_effort=max

动机 / Motivation

REQUEST_CHANGES。精确 head:b96e6ef163523dcda3c31b90c6f9156f834f8a06,独立实际 base:b1499ffb1500ee3fd7d10a55494e59746be0c2f0。需要在 Home 找到待审报告、阅读某一版本并向原会话反馈的用户。四份报告仍为 open、另一份已处理,并有三个无关 P0 User actions 时,当前 Home 显示7份待验收成果;展开可见三份报告各出现两次。完整 canonical 来源已保留4份待审报告;新的两路 UI 投影因来源身份不一致重复合并,尚未实现准确的待审数量。本 PR 不证明真实日历准时性、模型材料质量、已安装版本或整个 Goal 验收。

[P2] 先对齐来源身份,再合并两路报告投影。 manager-brief.tsx:97-107 用 sourceId 参与去重,但 dashboard-page.tsx:1086-1096 新建的摘要 attention 没有 sourceId;同一 Todo 在普通队列有 /status.json、在摘要为空,因此Map留下两份。真实 Chat/Core + synthetic SQLite 的完整目录为5个版本,其中4个open;当前编译的 Home 显示7,展开三份标题和 Todo ID 各重复两次。将完整摘要的报告行与普通 attention 行按同一个真实 source/Goal/Todo 身份合并,保留跨来源隔离;数量以完整 canonical 统计为准,并补实际 status 到渲染的回归。

改动思路 / Approach

冻结内容与 canonical User action 分开是合理边界:既有 Todo 管人的处理,报告文件只管字节;复用原 Session、preview/apply、结果 reader 与 typed binding,避免第二验收账本。本 PR 应完整交付报告版本的发现、阅读、原会话草稿和单版本处理;现在需在现有投影连接处修复来源身份,不必增加新状态或 scheduler。

没有必要新建 acceptance store,也不应通过增加通用 Todo 上限处理这次问题。TS complete-source summary 已正确地在显示截断前派生数量,故旧版“无关P0抹掉材料”缺口在 producer 边界得到修复;问题转移到普通 UI 消费路径。当前 browser smoke 给组件能力摘要,但普通 Todo 数组没有同一批报告,遗漏了真实重叠路径;不能用该绿测证明正常 Home 合并正确。

具体改动 / Changes

规范依据:docs/development/design.md,spec_revision b1499ffb1500ee3fd7d10a55494e59746be0c2f0。design.md:86 的 truthful read model 未满足,具体反例是4变7;design.md:92 的单版本预览/确认与实际读回沿用既有owner;design.md:966 的长内容、混合状态、desktop/narrow和损坏恢复已检查并保留实际缺陷。新指南是本次行为披露,不拿新文案替代旧规范。

关键代码讲解

  • request_report_review(review.py:58)核 registered producer、原Goal/Agent/Session,验证内置成对 Markdown/HTML,冻结内容摘要并复用稳定User action身份。done版重试不重开,修订版和不同生产者分别处理;旧renderer格式经已有binding恢复,不强迫重新解释历史字节。
  • projectCapabilityActions(todos/read_projection.ts:111)从完整native User Todo派生count与最多3条标题,排除done/archive/superseded;project_asset保留该有界投影。真实File/SQLite的7份报告加3个普通P0测试通过,说明后端不再从前三条反推不存在材料。
  • ManagerBrief 合并该摘要和普通attention;两者必须共享同一个真实source/Goal/Todo身份。现在 Math.max 把错误候选数当作更完整的事实,是本次P2的直接出口。修复时保留真实跨来源隔离,不能全局删除source维度。
  • GoalReportReviews 使用Goal-scoped HTTP、请求代数fence和精确Todo校验;HTML为空sandbox且无host bridge,操作留在宿主。损坏版没有验收按钮,恢复原字节后仍是同一待审版。文字版保留完整内容,反馈只准备原Session的草稿。
  • planReportReview 现在用 [...title].length 保持200 Unicode码点限制;ASCII/中文/非BMP的200接受、201拒绝均已独立通过Node用例。此前UTF-16补充意见的缺口已消除,没有重复发布旧发现。

完整47路径为30处生产 +761/-41、11处测试/fixture +497/-11,以及106行文档和3张图。共享registered identity与结果read路由整理未建立新决策owner。Goal-only review_required 默认关闭,机器级true被拒绝;显式手动请求与API可用性不等于后台自动启用。

对主干的风险 / Risks

PASS:本轮扩大Python集合中201项通过,覆盖真实File/SQLite、明确关闭/未迁移、错Goal/producer/Session/Origin、伪造HTML、篡改、旧renderer、重试不重开和队列失败后不重复模型工作。57项Node scope/binding/read tests、root/frontend类型检查、实际Chat构建、attention smoke和配置的mypy17文件通过。

FAIL/UNVERIFIED:完整Python命令另有2项失败:original report pump 的 already_admitted-True-file(route not host executable)和 retained_probe-True-sqlite(canonical no-model admission probe没有产生后续Turn)。同一两项选择器在immutable base重跑为前者失败、后者通过;head重跑则前者通过、后者失败。故不能凭“各1失败”归为等价,也不能用head一次绿色认证前者已稳定。保留完整有界运行集合与未明因果;本PR的完整默认关闭/原worker接续资格尚未证明,不臆造新的功能缺陷或要求修复无关代码。

实际浏览器使用当前head编译资产与真实后端、合成canonical SQLite:Home去重失败可独立复现;原Session反馈草稿带正确Todo且未发送;关闭确认保持open;随后原生确认只处理修复后的第三版,其余状态不变,canonical由4open降为3,而Home仍显示6;损坏/恢复保留同一版本。已实看1200×854与390×844的长标题/正文和操作,窄屏无水平溢出。阅读页/样式/三张原图相对2113662没有变化;图片像素为合成示例,metadata只有ICC色彩资料,原图仍按其原revision使用,不能证明本次新Home合并。

语义与 CI 对齐

原生premerge的6项direct和19项selected执行无失败;整体exit1仍有3个binary visual_evidence manual holds,未写成merge gate通过。标准Ruff在base/head的完整输出逐字相同:未修改 tests/test_chat_codex_history.py 有3个F811;上一版新增review测试的6个E702已不存在。语义advisory识别了既有display field集合新增binding;它复用Todo词汇,新的通用capability summary仍为派生投影,具体违约在source identity丢失。未用更高预算、删断言、跳过或历史批准消除失败。wait_for_ci=false,未查询、轮询或等待CI。

我的整体评价 / Verdict

当前整体仍 not_yet_proven。user_experience 为regression:后端完整计数正确,普通Home却虚增并重复同一材料;long_horizon 的原报告接续仍有必要验证缺口。冻结内容与 canonical User action 分开是合理边界:既有 Todo 管人的处理,报告文件只管字节;复用原 Session、preview/apply、结果 reader 与 typed binding,避免第二验收账本。本 PR 应完整交付报告版本的发现、阅读、原会话草稿和单版本处理;现在需在现有投影连接处修复来源身份,不必增加新状态或 scheduler。

已实看当前构建的桌面和390px阅读、完整目录、损坏/恢复及 Home 展开;正文与操作可读,但 Home 的重复标题与虚增数量破坏了真实状态判断。未资格化安装版 WebView、真实日历时点、完整键盘焦点恢复;Home 键盘进入阅读后曾落在 BODY,未另立未经隔离的 blocker。先修复完整source lineage与实际重叠消费回归,保留已工作的阅读、原会话草稿及单版本状态;无需再加状态机或扩大为全部报告/日历验收。独立change-quality记录失败和实际manual holds,代码结论、原生readiness、合并授权分别处理;此次没有合并或安装。

English verdict: REQUEST_CHANGES b96e6ef; Home double-counts the same report editions because summary and ordinary attention rows carry different source identities. Canonical4 open editions render as7, and original-worker recovery validation remains intermittent.

...row,
meta: [goal.title, row.attention?.details?.createdBy ?? row.attention?.details?.boundAgent].filter(Boolean).join(" · "),
}));
const count = Math.max(goal.reportReviewCount ?? 0, bounded.length);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] 合并两路报告行前保留同一个 source 身份

新 capability summary 的 reportReviewAttention 在 dashboard-page.tsx:1086-1096 未设置 sourceId,普通 attention 的同一 Todo 则带 /status.json。这里的 Map key 把空来源和该来源当成两个身份,再用 bounded.length 抬高完整 canonical count。我在当前精确 head 的真实 Chat/Core + 合成 canonical SQLite 上验证:5个版本中4个open,Home显示7;展开后3个Todo ID各出现两次(空source与/status.json)。通过现有预览确认只处理一版后,存储还剩3open,Home仍显示6。请在既有来源投影处对齐真实source/Goal/Todo身份后去重,保留跨来源隔离,并以完整canonical count为准。回归需从实际status进入正常渲染,同时包含能力摘要、普通报告attention和无关P0事项;只注入摘要的fixture无法覆盖此缺口。

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent · gpt-6.1-sol · OpenAI · runtime_reported · reasoning_effort=max

REQUEST_CHANGES:补充当前精确版本的一项新 P2:切换报告并起草反馈后,返回阅读页会跳回最初那份。发布前发现同 head 的独立评审已经指出首页重复计数;本文保留本轮独立复核,不重复发布该行内意见。

动机 / Motivation

周期报告的阅读者需要从首页找到尚待处理的材料,读完原版本,再验收或给原对话反馈。

旧路径把报告与普通待办混在一起,正文难以连续阅读;本次增加独立材料目录和阅读页,准备让同一份材料的查阅与处理连起来。

已验证完整原文、单版本验收和原对话反馈草稿;首页数量及返回后的阅读版本仍有可复现错误。

本次边界是可选的报告审阅,不包括自动批准报告、接管其他任务或证明长期模型工作已经完成。

还需在现有首页投影中统一同一来源的报告身份,并让最初的首页定位只生效一次,保留后来选择的阅读版本。

改动思路 / Approach

报告生成仍由原来的 periodic_report provider 负责,新增的材料读取保存生成时的 HTML 与 Markdown。这里的“版本”指当时那份不可变材料,阅读不会验收它;验收继续调用现有 Todo 的预览、执行和回执,反馈则只准备原对话的草稿。这样可以读到当时的全文,也保留同一报告多版之间的边界。

材料生产留在 periodic_report provider,Todo 意图与摘要由现有 TS owner 处理,HTTP 与页面只作读取和受控动作;无需第二套验收账本。

当前 PR 应交付原版本读取、单份处理与回到原对话的闭环;两项修复都应留在现有来源归一化和阅读选择状态中。

不改动会继续让阅读者在普通待办和原报告之间来回查找。只增加“标记完成”也无法提供全文阅读与原对话反馈,因此这个增量有实际价值。另建验收账本或调度器会扩大维护和权限边界,没有必要;当前两项问题可以在现有投影与选择状态内修复。

具体改动 / Changes

审查的是完整 b1499ffb1500ee3fd7d10a55494e59746be0c2f0..b96e6ef163523dcda3c31b90c6f9156f834f8a06,包括 47 个路径、文本 +1364/-52 和 3 张二进制截图,不仅是最后两次修补。文字分类为生产 30 个路径 +761/-41、测试/fixture 11 个 +497/-11、文档 6 个 +106;截图不计入文本行数。前轮提出的摘要截断方向已改为 canonical 完整计数,非 BMP 标题校验和新增测试的 E702 已修正;这些修正不等于整个用户流程通过。

关键代码讲解

  1. review.py:61 request_report_review 校验 Goal 中的真实 producer、原 Session 和成对的内置渲染产物,再通过共享 TS plan 与正常 Todo 作者入口写入。摘要和稳定操作标识使重复执行复用同一版,已完成版本不会被重新打开。它没有授予 Agent 接管其他工作的权限。
  2. read_projection.ts:111 projectCapabilityActions 在普通列表截断之前计算全部指定 action kind,再给出有限预览;完整目录继续用 canonical 快照分页读取。这个方向解决了“摘要未列出就当成不存在”的问题,但前端必须把同一来源的不同投影合并成同一个条目。
  3. manager-brief.tsx:94 ManagerBrief 合并报告摘要与普通 attention。当前两边携带的来源标识不同,Map 把同一 Todo 当成不同项,随后把重复条目长度当成总数下限,形成 F1。
  4. goal-report-reviews.tsx:61 GoalReportReviews 用被动 GET 读取原 HTML/Markdown,通过无脚本 sandbox 显示,并复用现有预览/处理按钮。选择写入按 Goal/source 划分的 sessionStorage;但父层留下的初始 focusTodoId 在重新挂载时再次覆盖当前选择,形成 F2。

规范依据是 docs/development/design.md,固定在审查前的 b1499ffb1500ee3fd7d10a55494e59746be0c2f0,没有用本 PR 新增的教程反过来定义验收:earn-the-users-attention not_met,首页主要数量应是真实可处理工作的数量;explanations-on-demand implemented,正文、来源链接、文字版和版本详情在实际阅读页可达;populated-page-review not_met,长内容和多条混合状态的实际页面暴露了重复条目及阅读上下文丢失。前端 task-first 交付要求也意味着单个组件通过不能代替首页到反馈再返回的完整路径。

对主干的风险 / Risks

已有 F1 的独立复核 · 合并前统一当前来源身份

在真实构建的 Chat/Dashboard 和隔离 SQLite 中,生成 8 个报告 Todo,保持 7 个待审、1 个完成,再加入 42 个无关高优先操作。独立 HTTP 目录回读为 8 个版本、7 个 open;首页却显示“待验收成果 10”,展开有 10 行但只有 7 个不同 Todo,三个版本各出现两次。报告摘要行没有 sourceId,普通 attention 同一 Todo 带 /status.json,manager-brief.tsx:97 的 key 因而不同,之后 Math.max 又把重复行数提升为总数。

最小修复是把同一当前控制面来源的两条投影归一,再按来源、Goal、Todo 合并,保留真正不同来源的隔离。不能直接去掉 source 维度,也不能让重复 teaser 数量覆盖 canonical 总数。回归应走真实 status→model→Home,同时含摘要和普通 attention,断言 7 个待审、7 个不同 Todo;处理一个后为 6。现有组件 smoke 没同时提供这两条来源路径,所以即使它通过,此反例仍成立。

F2 · [P2] 返回阅读页时保留后来选择的报告

从首页打开 A,回到成果目录选 B,点击“提出反馈”,再点击“成果”。已独立确认草稿属于 B 的原 managed Session,没有发送;但返回后标题变回 A,sessionStorage 也被覆写为 A。goal-report-reviews.tsx:84 每次挂载选择 focusTodoId ?? saved,而父层 [personal-workspace-page.tsx:2779](https://github.com/loopx-project/loopx/blob/b96e6ef163523dcda3c31b90c6f9156f834f8a06/apps/presentation/dashboard/src/features/personal-workspace/personal-workspace-page.tsx#L2779) 仍传最初的 A。这会在连续处理多份材料时反复丢失当前阅读位置。

应把首页定位当成一次性的导航意图,或同步后来的目录选择。真实回归需覆盖 Home A→目录 B→反馈草稿→成果,断言仍读 B、存储仍为 B;再检查刷新、返回以及 Goal/source 切换。无需增加一次确认或新会话。

验证与限制

状态 独立验证 实际结果
PASS B/H Dashboard 与 Chat 构建;H TS typecheck、57 项 TS 回归、attention-details smoke、mypy 构建与这些检查通过;mypy 检查 17 个 source 文件。
PASS File/SQLite 的真实 CLI、各 200 字的 a/研/🧪 标题,执行、重放、独立读取 六组保留完整标题且无重复 Todo;正确摘要的 201 字输入被拒且未新增 Todo,但返回通用 Effect runtime 错误,未把它当成精确诊断通过。
PASS 实际页面取消、验收、损坏与恢复 取消后仍 open;新预览后仅目标版本 done,目录变为 6 open/2 done;损坏原材料时无验收按钮,恢复原字节并刷新后可再次读取。
FAIL 真实 Home 和阅读往返 F1、F2 均复现,需修复后按相同路径重跑。
UNVERIFIED 七文件 Python 回归及辨别性重跑 完整 H:262 passed/3 failed;相同三个失败 node 单独在 H 为 3 passed、在 B 为 2 failed/1 passed。保留整个有界运行集合,不宣称失败已修复或默认关闭路径已完全稳定。
FAIL(基线同样) 配置的标准 Ruff 范围 B/H 均为未改动的 tests/test_chat_codex_history.py 三个 F811,身份和细节相同;不要求本 PR 修复无关文件。
PASS / 保留门禁 native premerge 直接检查及 Python compile 通过,所选 19 项执行通过;命令仍因 3 张截图人工门禁退出 1。已查看三张当前图片,内容为合成页面;原 merge_gate_passed=false 没有被改写。

自动创建审阅材料仍由 Goal 的 review_required 显式开启;省略/false、允许的原 managed conversation、错误 preset/route 和 machine-level 拒绝路径均有检查。这个标志不把 user_action 变成阻塞其他 Agent 的 user_gate。原 scheduler、报告窗口和重试 owner 保留;不过上述 native worker 不稳定性意味着本次不能把所有关闭路径的兼容性都记为已证明。按本轮计划没有查询、轮询或等待 GitHub CI。

语义与 CI 对齐

这次复用了现有 typed Todo/action owner,扩展 capability action 摘要和报告 binding 词汇;vocabulary 与 RFC 双语差异直接检查通过。当前违反的是同一 canonical Todo 的来源身份与当前阅读版本的投影语义,触发和最小修复见 F1/F2。修复后重跑真实状态到 Home 的去重/计数,以及 A→B→反馈→成果路径,并运行 uv run --extra test loopx canary premerge --from-git-diff --git-diff-base b1499ffb1500ee3fd7d10a55494e59746be0c2f0。没有通过削减断言或放宽门限消除失败。

我的整体评价 / Verdict

这是 justified_increment:读取不可变原材料、准确路由原 Session 草稿和单份 canonical 验收已形成可验证增量。架构与代码量相称,继续保留原始产物比生成另一套验收状态更合适;不需要为了这两项问题增设服务或新协议。还需在现有首页投影中统一同一来源的报告身份,并让最初的首页定位只生效一次,保留后来选择的阅读版本。

long_horizon 在本次有界报告队列中为 preserved:被动读不完成工作,重放不重新打开已处理版本,普通工作不被报告项接管;没有声称真实模型持续执行或完整成本已得到改善。user_experience 为 regression:队列数量不实且返回会覆盖当前选择,因此当前版本不能批准。

真实构建页面在长标题、重复正文和已处理/待处理混合数据下可阅读,正文先于版本摘要;但首页重复行与返回后跳错版本损害整个审阅流程。

实际查看了 1200×854 和 390×844 的默认、文字版、下部来源与版本展开、错误及恢复状态;内容包含重复长正文和混合完成状态。未验证已安装 App、真实模型或外部消息投递、多来源并发使用;本次是合成数据与真实 Chat/SQLite 后端的本地构建。

精确审查版本为 b96e6ef163523dcda3c31b90c6f9156f834f8a06,发布前再次核对远端头与既有评审。下一轮应给出 F1/F2 同路径修复后的真实回读,并保留 native worker 的未决稳定性、Ruff 基线与 premerge 门禁区别。本轮不执行合并。

English verdict: REQUEST_CHANGES at b96e6ef. This review adds a reproduced P2 stale reading selection after feedback navigation and independently confirms the previously published count defect. Exact-version acceptance and Unicode CLI readback pass; native-worker intermittency and separate merge holds remain disclosed.

navigation.current = destination;
let saved: string | null = null;
try {saved = sessionStorage.getItem(storageKey);} catch { /* Reading works without storage. */ }
selectedId.current = focusTodoId ?? saved;

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[P2] 不要在返回阅读页时重新应用已消费的首页定位

从首页打开 A,回目录选 B,点击“提出反馈”后再回“成果”,真实页面跳回 A 并把 sessionStorage 的 B 覆写为 A。草稿已独立确认属于 B 的原 Session;原因是父层仍传最初 A,而重新挂载时这里再次优先 focusTodoId。请消费一次性定位或同步之后的选择,并覆盖 A→B→反馈→成果仍保留 B 的真实回归。

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE — exact head 96ffedd3552e4579f40de6461ab0d1949fa0c404.

Both prior P2 findings are closed:

  • Report summary rows now receive the active status-source identity before ManagerBrief merges them with ordinary attention rows, preserving cross-source isolation while deduplicating the same Goal/Todo.
  • Later report selections are synchronized back to the parent, so returning from feedback/catalog navigation cannot reapply the stale initial Home selection.
  • The Home browser fixture now carries the same report editions through both capability summary and ordinary Todo attention; the real status-to-render path passes and preserves canonical count 4.

Verification: full Dashboard/Chat build passes, smoke:home-browser passes with duplicate-source overlap, smoke:attention-details passes. The relevant Python/Report suite produced 183 passes plus the previously documented intermittent already_admitted-True-sqlite worker failure, which also reproduced independently and is outside these UI fixes. Current main was merged with DCO.

@loopx-agent
loopx-agent merged commit 2c427b4 into main Nov 6, 2026
8 of 10 checks passed
@loopx-agent
loopx-agent deleted the codex/app-review-materials-20261106 branch November 6, 2026 13:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants