Skip to content

fix(app): retain team feedback identity across navigation and reload - #5838

Merged
huangruiteng merged 2 commits into
mainfrom
codex/l1-original-result-readback-20261007
Oct 7, 2026
Merged

huangruiteng merged 2 commits into
mainfrom
codex/l1-original-result-readback-20261007

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

When a team-report feedback message commits but its response is lost, following a linked report or reloading currently discards the submission ID. Retyping the objection can then create a second coordinator inbox input.

The evidence reader now saves the original ID, body and observed artifact versions before dispatch, restores them without sending, and retries the same envelope through the existing inbox. Confirmed feedback can start a separate explicit draft. Missing or malformed tab-local recovery storage blocks a fresh dispatch; this is a disclosed change to evidence feedback. Inbox delivery remains distinct from applied feedback or requester adoption.

Validation: reproduced the lost-input baseline; rebuilt and verified the packaged bundle; packaged recovery smoke with production Chat HTTP/inbox/store proved one input and transcript row after lost acknowledgement, navigation/reload and exact retry, including withdrawn evidence, paused-coordinator refusal, malformed recovery, keyboard and 390px/reduced-motion. Existing packaged evidence-return regression and 20 Chat mode tests passed; semantic advisory/full-tree check and public-boundary checks passed. The advisory supports LoopX sources and does not cover the new App fixture files; those use existing inbox vocabulary. The new smoke runs in packaged frontend CI.

Visual evidence uses public-safe synthetic team reports: desktop recovery, 390px receipt. The existing report/context remains primary; failed evidence stays withdrawn, with only the exact prior feedback recoverable and identifiers under disclosure. This nested evidence interaction does not change the product entry screen.

Owning acceptance: Live Team Workspace L1/V1/V2/V3/V6 and roadmap R3 continuity. Team evidence is synthetic; the inbox/store and its typed admission are real. This candidate does not qualify independent semantic verification, live requester adoption or native WKWebView behavior and is not installed. CLI/Lark effect rules use their existing owner. The RFC checkpoint retains those gaps.

Future-facing pass: keeps recovery local to the evidence reader; the existing steering cache is bound to active Turn steering and has a different retirement/fallback contract. Sharing backend ingress authority is retained without a parameterized second recovery framework. Product/runtime changes are left for maintainer review and merge.

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 Author

Choose a reason for hiding this comment

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

Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=xhigh

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

精确 head 00808158fc19f1ed967278f77fdf422608f93745;独立核验完整 PR 后,没有发现当前恢复切片的阻塞问题。

动机

查看团队产物并向协调员反馈的用户,会在发送响应丢失后切换证据或重新加载页面。

原来反馈已进入收件箱,但页面丢失发送标识和文字,用户重新输入同一反馈会产生第二条输入;现在返回或重载恢复原反馈,用户明确重试时沿用首次标识、正文和产物版本。

独立打包客户端及真实 HTTP/磁盘收件箱对照复现基线两条输入,当前 head 重试后仍只有一条输入、一个原有 Turn;没有自动发送。

当前切片只恢复同一浏览器标签中的团队反馈,不增加执行权限,不宣称反馈已应用、跨标签恢复或原生 App 已升级。

真实语义异议、独立精确版本验收、请求方实际采用及原生 WKWebView 安装态仍由现有 L1 验收 owner 完成;本 PR 不关闭整个团队工作区验收。

改动思路

反馈正文和首次版本是用户不可推导的原始意图,页面重挂载前必须保留;仅延长组件寿命无法覆盖重载。收件箱保留唯一准入与去重所有权,新增缓存只属于现有 TypeScript 证据面板。 当前边界是同标签反馈的发送前保存、响应不确定后的精确重试和明确新意图;不新增服务、共享恢复框架、配置开关或接收者生命周期。

调用链是已有团队证据面板 → sendLoopXMessage(inbox) → 原协调员 HTTP 入口 → 既有类型化准入与收件箱去重。缓存不能证明任务验收、协调员应用或当前产物仍有效;读证据失败仍清除旧报告,只有原反馈保持原样待核实。

具体改动

完整 7 个路径、文本 +280/-11:goal-team-evidence.tsx 在现有组件里增加有界 FeedbackAttempt 和私有恢复解析器,发送前保存并读回同一标签中的 session/operation 键;重试冻结首次文字、版本与 id。恢复不发消息,已确认 pending/delivered 后用户可明确撰写新反馈。package.json 将新恢复 smoke 接入已有打包工作区验证;两个 smoke 文件分别提供临时真实 HTTP/收件箱和失联、导航、重载、暂停、损坏缓存的浏览器场景。RFC 新检查点及两张合成截图说明增量与未验边界;图片已逐张检查,没有发布本地运行资料。

关键符号:

  • apps/presentation/dashboard/src/features/personal-workspace/goal-team-evidence.tsx:12 的 restoreFeedback:读取有界原意图;坏数据或读取失败阻断新发送,缺少缓存仅表示没有这个标签中的已保存意图。
  • apps/presentation/dashboard/src/features/personal-workspace/goal-team-evidence.tsx:60 的 send:保存并核对后调用原 inbox,响应不确定时保留原 id/正文/版本。
  • apps/presentation/dashboard/src/features/personal-workspace/goal-team-evidence.tsx:88 的 newFeedback:匹配原反馈的确认回执后才能明确清除自己的缓存并开始新意图。
  • loopx/chat_ingress.py 的 create_ingress_receipt/require_matching_replay:不变的准入后效应 owner,对同 id 不同正文仍拒绝,原消息与回执保持一次写入。

判定依据先于实现读取:基线团队工作区 RFC,即 docs/architecture/rfcs/live-team-workspace-v0.md @ 8205c8bc1d4c4bd50451fa23b0b56897caaeed8e。V1 核验本反馈的真实 pending 与缺失应用证明;V2 核验重载、失联、版本撤回及原反馈去重;V6 核验普通关闭模式、实际暂停拒绝与缺失来源。V3 的本切片 desktop/390px、键盘 Enter、reduced motion 与 unavailable 路径已测,整个工作区 screen reader/200% 和安装态仍保留原验收;L1 的真实异议、独立精确版本验收和实际采用保持 deferred。另核对原 R3 调用方—反馈—持久结果—后续继续的边界,没有用这个恢复 PR 宣称完成整个路线。

对主干的风险

独立执行的相同固定 HTTP 夹具、相同原反馈和打包 B/H 客户端复现:基线返回后文字为空,再输入导致两个不同 id、两条真实收件箱输入;head 返回与重载保留原文字,在原报告撤回时也不偷偷换正文或版本,键盘重试后的实际收件箱、transcript 都仅一条,原 Turn 仍一个。故测试对历史缺陷敏感,而不是从新 helper 推导预期。

UI 的 ingress 投影特意不提供已提交回执:再次返回后显示待核实,第三次精确重试仍一条输入,避免把有界投影的缺失误当真实效应不存在。另一操作的草稿不继承原反馈;临时写缓存失败在 POST 前拒绝,恢复存储后同一入口重试可进入真实收件箱,再为另一操作明确发送得到第二条不同意图。已确认后新反馈对实际 paused 后端被拒绝,即便合成 UI 仍显示启用;损坏缓存不发送替代输入。原报告读取失败仍撤回展示;收件箱 receipt 只显示等待读取或应用未确认。

本地 dashboard TypeScript 检查、打包并核验来源、20 项既有 chat-mode 测试、完整树语义 smoke 均通过;普通 Goal 对话在 B/H 的语义文本/控件相同,两边均无反馈缓存、POST 或 inbox 写入。语义 advisory 返回 0 个支持的变更载体,不能据此认证 TSX 含义。两边都有既有 Vite 大 chunk 提示,未放宽预算或隐藏失败。没有查询、轮询或等待 CI。

真实边界是打包客户端、生产 HTTP、现有类型化准入和临时磁盘收件箱;团队产物和协调员投影为合成,首次响应丢失为故障注入。浏览器使用 Ego 执行同一恢复流程及额外储存/投影缺失案例,没有调用作者的 Playwright 启动脚本。最初私有代理误把仅供收件箱的 HTTP fixture 当静态资源服务器,导致缺少 assets_dir;为私有服务补齐打包资源路径后执行完整对照。几次定位器把原生 dialog 当 role 属性、使用基线不存在的 aria-label,或在储存失败后仍找“发送反馈”均已按实际状态修正,未改产品或删断言。没有把这些本地调用错误计为 PR 回归。

我的整体评价

justified_increment;long_horizon=improved,user_experience=improved,范围限于同标签的有界继续。反馈正文和首次版本是用户不可推导的原始意图,页面重挂载前必须保留;仅延长组件寿命无法覆盖重载。收件箱保留唯一准入与去重所有权,新增缓存只属于现有 TypeScript 证据面板。 当前边界是同标签反馈的发送前保存、响应不确定后的精确重试和明确新意图;不新增服务、共享恢复框架、配置开关或接收者生命周期。

未来便利性检查已审视相邻 steering-recovery.ts:它绑定活动 Turn,退休与失败回退均不同;合并成参数化框架会混淆恢复寿命,现有本地 helper 加原 inbox owner 足够。没有必要为此新增通用能力、第二状态 owner 或额外配置步骤。

真实语义异议、独立精确版本验收、请求方实际采用及原生 WKWebView 安装态仍由现有 L1 验收 owner 完成;本 PR 不关闭整个团队工作区验收。 不将合成版本关系、receipt 或截图当独立语义判断。当前 head 的审查批准与 GitHub 的正式 self-approval/合并权分开:本账户是作者,所以发布 COMMENTED 的批准结论,不称平台已经 APPROVED;运行面由维护者决定合并。

English verdict: APPROVE - exact head 0080815; independently reproduced the base duplicate-input defect and verified packaged head navigation/reload, immutable retry, real HTTP/disk inbox deduplication, projection lag, scoped storage recovery and paused refusal. Dashboard typecheck/build, 20 chat-mode tests and full-tree semantic check passed. CI not consulted; this is a bounded same-tab recovery increment, with live L1 adoption and native installed-host qualification still open.

@huangruiteng
huangruiteng merged commit 7ba772d into main Oct 7, 2026
24 of 31 checks passed
@huangruiteng
huangruiteng deleted the codex/l1-original-result-readback-20261007 branch October 7, 2026 05:12
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