Skip to content

ci: W01 重复重运行 + W02 分段计时与缓存 + W03 投影提前失败 + W05 快照读超时 - #164

Merged
DTALEX66 merged 8 commits into
mainfrom
ci/w01-w05-efficiency-and-timeout-20261014
Oct 15, 2026
Merged

DTALEX66 merged 8 commits into
mainfrom
ci/w01-w05-efficiency-and-timeout-20261014

Conversation

@DTALEX66

Copy link
Copy Markdown
Owner

范围(按方案第一批:W01 / W02 / W03 / W05)

W01 消除同源重复重运行 — work-lab-gate.yml、wlr-060-gates.yml
两个 workflow 都同时响应 push 与 pull_request,同一源提交因此跑两套重检查(实测 16m39s 的 push 运行与 15m30s 的 PR 运行对应同一棵树)。GitHub 默认按 github.ref 分组,而分支 push 与它的 PR 分别是 refs/heads/x 与 refs/pull/N/merge,默认分组看不见这对重复。改为按源分支分组;main 上刻意 cancel-in-progress: false(被取消的运行其 aggregate 永不报告,而 main 的严格汇总就是合并证据)→ 同组排队,main 串行而不丢判决;不同 PR / 不同分支永不互相取消。另加 workflow_dispatch 入口,并修掉它带来的空 BEFORE_SHA(原先会 git diff 空串导致整个 plan 步失败)。

W02 分段计时 + 真实依赖缓存 — scripts/ci/required_groups.json、work-lab-gate.yml、.project/governance/toolchain-declarations.json
observer-frontend-typecheck 原先把 npm ci + typecheck + build + test 四条命令挤在一步里,job 名报的是它们的和。拆成四个具名组 → 四步(命令与 fail-fast 语义一字未改)。新增 actions/cache@0057852b…(40 位 SHA 钉住):~/.cargo/registry + ~/.cargo/git 按 Cargo.lock 取键;crate 的 target 目录额外带 commit —— 源码变更不可能被整份旧构建冒充成本次构建;restore-keys 只预热依赖对象。缓存命中不被记录成性能结论,计时只来自上面四步。

未做:token-monitor 的同类缓存(其 job 尚未改);cargo check 的冗余判定按方案要求"先核对覆盖范围",本轮未删。

W03 投影错误提前失败 — work-lab-gate.yml
PR #163 上实测:一份过期的工具清单要等 2712 个治理测试跑完(2m11s、251 个模块)才被报出来,真正的缺陷于是披着「governance failed」的外衣到达。把合同目录、SSOT 与工具清单三件 shape 检查提到治理批之前——同类错误现在几秒内以它自己的名字失败。这是增加一道早信号,治理批仍原样跑同样的检查。

W05 快照读超时 — apps/observer/frontend/src/lib/api.ts(+2 例测试)
fetchSnapshot 没有超时:一次永不返回的 GET 会让调用方的 inFlight 永远为 true,之后每个 tick 只置 followUp 然后等待——界面停在最后一份良好投影上却仍宣称在轮询。给 GET 加 8 秒读截止并真正 abort(从外面 Promise.race 只会让底层请求继续挂着并叠加);effect 卸载时 abort 同一个 controller,闭合顺序先置 closed 再 abort,使拆除过程中的中断不被报成读失败。保留 inFlight 合并、低 revision 拒绝、UNKNOWN 与不伪造 LIVE 的语义。

本机证据

DISPLAY_SCALING_GATE_PASS · GEOMETRY_GATE_PASS · 切片 12/12 · 可读性四变体 PASS
SSE_REVISION_GATE_PASS(含 exit=1 的设计对照)· EVIDENCE_SEAL_PASS
bundle 24db480fc0c8ed18
OBSERVER_FRONTEND_CONTRACTS_PASS js=0 vitest=0(739 例,+2)
SUPPLY_CHAIN_PASS workflows=2 actions=16 source=pinned-sha
FAILFAST_GROUP_TESTS_PASS · 工具链声明 8 passed

基线说明与边界

W01 · work-lab-gate.yml / wlr-060-gates.yml
两个 workflow 都同时响应 push 与 pull_request,同一源提交因此跑两套重检查
(实测 16m39s 的 push 运行与 15m30s 的 PR 运行对应同一棵树)。GitHub 默认按 github.ref 分组,
而分支 push 与它的 PR 分别是 refs/heads/x 与 refs/pull/N/merge,默认分组看不见这对重复。
改为按**源分支**分组并 cancel-in-progress;main 上刻意不取消(被取消的运行其 aggregate 永不报告,
而 main 的严格汇总就是合并证据),同组改为排队,于是 main 串行而不丢判决。
另加 workflow_dispatch 入口,并修掉它带来的空 BEFORE_SHA(原先会 git diff 空串而整步失败)。

W02 · required_groups.json / work-lab-gate.yml / toolchain-declarations.json
observer-frontend-typecheck 原先把 npm ci + typecheck + build + test 四条命令挤在一步里,
job 名报的是它们的和(实测 observer 16m02s,build 的名字都不出现)。
拆成四个具名组 → 四步,命令与 fail-fast 语义一字未改;工具链声明同步。
新增 actions/cache(钉 40 位 SHA):~/.cargo/registry + ~/.cargo/git 按 Cargo.lock 取键,
crate 的 target 目录额外带 commit ——源码变更不可能被整份旧构建冒充成本次构建;
restore-keys 仍只预热依赖对象。缓存命中不被记录成性能结论,计时只来自上面四步。

W03 · work-lab-gate.yml
PR #163 上实测:一份过期的工具清单要等 2712 个治理测试跑完(2m11s、251 个模块)才被报出来,
真正的缺陷(投影在输入暂存之前测量)于是披着「governance failed」的外衣到达。
把合同目录、SSOT 与工具清单三件 shape 检查提到治理批之前:同类错误现在几秒内以它自己的名字失败。
这是**增加**一道早信号,治理批仍然原样跑同样的检查。

W05 · apps/observer/frontend/src/lib/api.ts (+2 例测试)
fetchSnapshot 没有超时:一次永不返回的 GET 会让调用方的 inFlight 永远为 true,
之后每个 tick 只置 followUp 然后等待——界面停在最后一份良好投影上却仍宣称在轮询。
给 GET 加 8 秒读截止并真正 abort(从外面 Promise.race 只会让底层请求继续挂着并叠加),
effect 卸载时 abort 同一个 controller;闭合顺序先置 closed 再 abort,
使拆除过程的中断不会被报成一次读失败。保留 inFlight 合并、低 revision 拒绝与 UNKNOWN 语义。
测试:悬挂请求到期被 abort 且**下一次读仍能成功**;外层 abort 能转发到 socket。

证据:新 bundle 24db480fc0c8ed18,切片 12/12、GEOMETRY/LEGIBILITY/SSE 全 PASS、
EVIDENCE_SEAL_PASS;前端合同 OBSERVER_FRONTEND_CONTRACTS_PASS js=0 vitest=0(739 例,+2);
SUPPLY_CHAIN_PASS workflows=2 actions=16;FAILFAST_GROUP_TESTS_PASS;工具链声明 8 passed。

基线说明:为让 display-scaling 门可判(它读 tauri.conf.json 的面板声明),本分支堆叠在 #163 之上,
继承那里的 780->680 修复;#163 未合并前本 PR 的 base 就是它。
# Conflicts:
#	.project/governance/generated/CURRENT_STATE.json
#	.project/governance/generated/CURRENT_STATE.md
PR #164 上实测到 W01 首版的副作用:按源分支分组 + cancel-in-progress 确实消除了重复运行,
但被取消的那次运行其作业仍以同名 check 挂在该提交上,于是 PR 显示 integration/observer 红,
而真正存活的那次运行是健康的——去重成功了,报告在撒谎。AGENTS.md 也写明被取消/跳过必需的作业
会让 aggregate 失败。

改为从源头消除重复:work-lab-gate 与 wlr-060 的 push 触发限定到 main,分支由 pull_request 运行
覆盖(同一棵树);workflow_dispatch 保留为手动入口。于是不存在跨事件类型的取消,不会凭空产生红。
并撤销中途尝试过的作业级 if 守卫——它会让 plan 声明需要而作业被跳过,使 aggregate 的语义
与本机无法验证的行为绑定,属于用另一种不一致换一种不一致。

如实登记的偏差:**没有 PR 的分支 push 现在不会有运行**(要等 PR 存在)。这是不动 plan/aggregate
合同的前提下消除重复的代价,已写入本批的未完成项。

校验:YAML 可解析;SUPPLY_CHAIN_PASS workflows=2 actions=16;FAILFAST_GROUP_TESTS_PASS;
引用 workflow 的四组门全部 PASS(test_aggregate_gate / test_authority_index_paths_resolve /
test_governance_gate / test_supply_chain_tools),其中 pytest 形态 22 passed。
W05 给 fetchSnapshot 加超时/abort 以及在 effect 里挂 controller,使 api.ts 的既有行号整体下移,
UIV2-INTERFACE-BINDING-MATRIX.csv 的 B04 指针因此落在一处空行上。CI(PR #164 的 governance 批)
抓到,本机未跑该门所以漏了——**这是同一类漂移第二次咬到我**:凡在 api.ts 这类被逐行引用的文件里插行,
就必须复跑指针门;行号按被引文本反查实测,不凭估算(我第一次写成 541,实测是 555)。
复测 test_ui_v2_csv_citations_resolve 8 passed、默认加载引用门同批通过。
@DTALEX66
DTALEX66 changed the base branch from wui/hud-200pct-and-source-times-20261014 to main October 15, 2026 15:11
@DTALEX66
DTALEX66 merged commit c240927 into main Oct 15, 2026
12 checks passed
@DTALEX66
DTALEX66 deleted the ci/w01-w05-efficiency-and-timeout-20261014 branch October 15, 2026 15:29
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.

1 participant