Repository navigation
fix(ci): stabilize required dashboard-browser goal-hierarchy shard - #6890
Conversation
Signed-off-by: JasonBuildAI <jasonbuildai@gmail.com>
ef83e02 to
713f9ce
Compare
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; runtime_reported; reasoning_effort=max
动机
受影响的是依赖 Goal 子树浏览器回归来判断改动是否安全的贡献者和维护者。例如,页面目录和选中行已经出现,但另外两个子 Goal 的状态请求还没有发出,旧测试就会把未完成的读取误报成产品漏读;新测试等待目标请求全部完成后再核对范围。本机实际 base/head 的覆盖率和普通浏览器场景四次均通过;新头保留精确子树、无关 Goal 不读、失效范围和拒绝恢复等原断言,等待条件明确排除了已知的过早检查窗口。本片只改现有 smoke 的同步;不改变产品读取范围、UI、权限、任务或配额,也不声称本机已经复现每次必现的原始竞态或证明整个远端分片健康。
改动思路
复用现有产品 loader 和原测试,补齐观察时序即可。产品仍由两个 worker 读取目录,测试里的 networkidle 和选中行出现不构成“整个读取已经完成”的证明。新增局部 helper 同时检查预期 Goal 都已观察到、当前没有未完成的 status route,再进入原有断言。没有扩成新重试框架,也没有修改产品权限或读取选择。
具体改动
本次实际基线 88df41c2261708ec587a50723e4b1ee5aad587de,精确 head 713f9ced6b1fdf0d39c22ad1794f4537a61e442b;只改 examples/personal-workspace-browser/goal-hierarchy.mjs,+25/-6。既有前序 #6834 的产品范围与历史恢复断言保留。该文件属于已存在的必需 dashboard-browser coverage 场景,修正这里的同步有持续维护价值,没有新增重复 smoke。
关键代码讲解
waitForStatusReads等待全部 expected ID 和inFlightStatusReads === 0,15秒后带读取列表与未完成数报错。它不从 log 删除无关 ID,因此后面的精确断言仍能发现越界读取。/status.json路由 用 try/finally 成对维护 inflight,覆盖正常 fulfillment 和失败路径;初始8个 Goal 完成后才清 log,防止把合法初始请求计入后续范围操作。- scope/reload 屏障 等待4个子树请求,reload 前先排空当前 handler,reload 后再等待全部4个。原来的 subset、deepEqual、失效 root、拒绝恢复和跨 source Back 断言保持原样。
规格依据:https://github.com/loopx-project/loopx/issues/6886,`spec_revision=2026-10-19T13:43:44Z`,使用事先读取的 Expected behavior:
- Expected-initial-workspace-drain:implemented;初始完整读取后清 log。
- Expected-four-subtree-reads:implemented;scope/reload 后等待 research、portfolio、calibration、graph 全部读取。
- Expected-no-unrelated-goal-state:implemented;原精确集合和失效范围不读断言继续执行,额外读取不会被 helper 过滤。
对主干的风险
未发现本片的可行动阻塞。风险限定在测试等待与失败诊断:漏读会等到15秒报错,额外 Goal 仍会让原断言失败,handler 异常会通过 finally 释放 inflight 计数。真实场景继续覆盖 denied child 恢复、缺失/非法 root、层级排序、键盘/窄屏、reload/Back 和 source/root 一起恢复;Turn、action 与源修改均为零。产品路径逐字节不变,用户无需新增导航、输入或确认。
独立本地验证使用 Node24.21.0、Python3.14.8:实际 base 的 coverage/普通模式分别23.09/19.23秒,新 head 分别22.78/16.95秒,四次均通过。这只是有界样本,不能用单次耗时宣称性能收益;本机这次没有重现旧失败,也不把 issue 的 hosted 复现冒领为本次结果。JavaScript 语法和 committed diff 检查通过。原生预合并直接检查通过,所选 semantic-vocabulary smoke 在真实 base/head 都以同样的44个独立 py/ts twins、预算43失败,相关 owner 与文件未被本片修改;它是独立的既存合并资格问题。没有查询、轮询或等待远端 CI。
我的整体评价
APPROVE 这一精确 head 的有界测试修复。产品的连续任务与状态 owner 完全不变;等待仅存在于已有回归中,不引入运行时重试或自动操作。用户的 Goal 浏览、收起展开、Back、拒绝恢复与失效范围交互保留;贡献者得到更明确的请求完成屏障和超时诊断,无新增用户输入或确认轮次。局部同步机制与问题规模相称,保留原产品和范围 oracle;不要求用新 UI、更多 example 或运行真实模型来扩大这次修复。先前长期运行案例的交付建议在这里用于确认真实调用点和维护收益,不代表测试通过就证明长期净益。原生 approval closeout 与 merge readiness 需另行读回;批准不授予合并或清除其他评审的权限,44/43既存失败继续如实保留。
English verdict: APPROVE 713f9ced6b1fdf0d39c22ad1794f4537a61e442b. The existing Goal-hierarchy regression now waits for the complete observed request set and drained handlers while preserving exact subtree and negative-path assertions. Actual base/head coverage and normal browser runs all passed locally; the historical race did not reproduce in this sample. The unchanged44/43 semantic vocabulary failure remains a separate baseline/readiness issue. Remote CI was not consulted.
Goal And Delivered Outcome
d8c62a0bfa2004210a5deda3cf8a3ceb4747fbb2.dashboard-browser (3)shard and aggregatechecksmerge gate are red onmain: thegoal-hierarchybrowser scenario assertsstatusReadsimmediately after a scoped reload, before the two-worker snapshot fan-out has issuedportfolioandgraphunder coverage instrumentation. The same failure is visible on open PRs fix(quota): honor agent choice over advisory Todo priority #6877, feat(content-ops): add media providers and Goal artifact production #6876, refactor(todos): compose full readback in one TypeScript transaction #6874, and fix(chat): keep completed-history pages independent across Goals #6496.f149d8e24andLOOPX_DASHBOARD_COVERAGE=1, the scenario fails in 8.6s atreusing loaded subtree snapshots must not open unrelated Goal state; with this change it passes in 43.8s. The hosted failure expected[calibration, graph, portfolio, research]but observed only[calibration, research].loopx-project/loopx:mainat88df41c22(the branch was originally based onf149d8e24).Author Declaration
AI disclosure: this change was drafted with AI assistance at my request, under my direction and review.
Human direction: the human operator set the scope constraints and reviewed the submitted change.
Implemented against
d8c62a0bfa2004210a5deda3cf8a3ceb4747fbb2.waitForStatusReadsinexamples/personal-workspace-browser/goal-hierarchy.mjsgoal-hierarchyscenariosubtreeGoalIdsandwaitForStatusReadsin the same filegoal-hierarchyscenariodeepEqualscope assertiongoal-hierarchyscenariogit diff --statScope And Continuation
semantic-vocabulary-drift-smoke44/43 baseline failure is outside this test-only change.Validation
713f9ced6staticpassedunitpassedintegrationfailedf149d8e24with the original file andLOOPX_DASHBOARD_COVERAGE=1:AssertionError: reusing loaded subtree snapshots must not open unrelated Goal stateafter 8.6s.integrationpassed713f9ced6withLOOPX_DASHBOARD_COVERAGE=1andLOOPX_PERSONAL_WORKSPACE_SCENARIO=goal-hierarchy: passed in 43.8s against the development dashboard and synthetic fixture backend.integrationpassedintegrationpasseddashboard-browser (3)at PR head713f9ced6: job passed in 10m59s; thegoal-hierarchyscenario passed in 31.6s. https://github.com/loopx-project/loopx/actions/runs/39266409846/job/118117881255integrationfailedpersonal-workspace-contract.test.mjsfails its existingLark App count does not flash a false zero while loadingsource assertion, andtests/control_plane_ts/content_digest_single_owner.test.tsfails its existing consumer-set assertion. Both reproduce locally at this head and neither reads the changed scenario file.staticpassedloopx canary premergedirect checks (git diff --check, staged/unstaged diff checks, RFC bilingual check) and public-boundary scan for the changed path.integrationfailedloopx canary premergealso selectedexamples/semantic-vocabulary-drift-smoke.py; it failed with44 independently maintained py/ts twins; budget is 43. This scans the complete tracked tree and is unrelated to the single changed.mjstest file; the maintainability ratchet and public-boundary checks passed.dashboard-browser (3)job passed at713f9ced6withgoal-hierarchyat 31.6s. Other hosted jobs remain red on pre-existing assertions outside this one-file test change; they are disclosed above and are not modified or masked here. The remaining Python test shards were still running when this description was updated.Frontend / Visual Evidence
Type of Change
LoopX Area
Technical Direction
Shared-authority RFC fixture impact
Boundary Checklist
.loopx/,.codex/goals/, and liveACTIVE_GOAL_STATE.md).python3 scripts/check_rfc_bilingual.py --base origin/main --head HEADpasses, or no paired RFC changed.one`.
Signed-off-bytrailer (git commit -s).