Skip to content

ci(windows): qualify host-hardened control-plane suites on native Windows - #6639

Merged
loopx-agent merged 1 commit into
loopx-project:mainfrom
JasonBuildAI:codex/agent-l9x3
Oct 16, 2026
Merged

loopx-agent merged 1 commit into
loopx-project:mainfrom
JasonBuildAI:codex/agent-l9x3

Conversation

@JasonBuildAI

@JasonBuildAI JasonBuildAI commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Goal And Delivered Outcome

Change

  • .github/workflows/python-tests.yml (windows-powershell job only):
    • new step "Install the TypeScript suite dependencies" (npm ci --ignore-scripts in the repository root): the host-qualified suites import real packages, and this lane never installed the root dependencies, so goal_acceptance_authority.test.ts could not resolve pg (the first CI run on this PR failed exactly there with ERR_MODULE_NOT_FOUND: Cannot find package 'pg'). The ubuntu typescript-core lane already installs them.
    • new step "Qualify host-hardened control-plane suites on native Windows" running the 11 Windows-qualified suites with node 22.22.3 and --experimental-sqlite.
  • scripts/ci/test_windows_lane_coverage.py: pins the contract — the lane must run on a pinned Windows runner label (no expression), depend on changes, activate on exactly needs.changes.outputs.python_tests == 'true' and not be made non-blocking; no scope (workflow, lane, step) may inject NODE_OPTIONS; every listed suite must exist in the checkout; and the step that mentions them must be one single-line node --no-warnings --experimental-sqlite --experimental-strip-types --test <listed files> command with no if, no continue-on-error and no YAML merge key. A suite therefore cannot stay "listed" while being skipped, muted, commented out, masked by shell plumbing, turned into a --test-only no-op, or split into a multi-line block where a bare trailing path is a silent no-op in PowerShell.
Suite Native Windows fix that made it host-qualified
checkpoint_artifacts.test.ts #6562 / #6566 durability flush through a read-only handle
sqlite_backup.test.ts #6258 backup archive flush through a writable handle (also touched by #6356)
agent_preferences.test.ts, authority_archive.test.ts, canonical_task_lease_renew.test.ts, cold_source_import.test.ts, coordination_runtime_shadow.test.ts, effect_runtime_snapshot.test.ts, goal_acceptance_authority.test.ts, quota_void_commit.test.ts, shadow_entry_delivery.test.ts #6351 / #6356 host-hardened assertions
  • checks/changes context: the guard runs in the existing changes job discovery (python -m unittest discover -s scripts/ci -p 'test_*.py'), which passed on this PR.

Author Declaration

  • Written by: AI agent (DeepSeek V4.1 Flash Free on OpenCode, provider "opencode") working on behalf of @JasonBuildAI; the human operator directed the task, chose the topic from the recorded Windows-regression evidence, and reviewed every published artifact.

Implemented against

Criterion (spec clause) Disposition Symbol / path Test or command
PR #6566 review: add the checkpoint suite to the windows-powershell lane implemented .github/workflows/python-tests.yml (new step) node --experimental-sqlite --experimental-strip-types --test tests/control_plane_ts/checkpoint_artifacts.test.ts
#6351/#6356: the host-hardened suites must hold on native Windows implemented the nine #6356 suites listed above same step; run green on native Windows (below)
#6258: backup durability suite must run on native Windows implemented tests/control_plane_ts/sqlite_backup.test.ts same step
Coverage cannot silently drop or be muted again implemented scripts/ci/test_windows_lane_coverage.py python -m unittest discover -s scripts/ci -p 'test_*.py' (runs in the changes job)
Python twin of the same durability class (tests/test_state_backup.py, #6258) deferred tests/test_state_backup.py not added: symlink-dependent tests need a privilege this verification host lacks (WinError 1314), so Windows-green cannot be shown here; named as the remaining gap below
  • Self-check before submission: ran the contract test unmodified (green) and under seventeen single-edit mutated workflow copies (all red, each failing with an explicit assertion and a non-zero exit: deletion of a suite, step if: false, step continue-on-error: true, echo for node, a flipped activation condition, a commented-out suite list, a trailing ; exit 0, a false && activation prefix, a | block scalar splitting the list across shell lines, an ubuntu-latest runner swap, dropping changes from needs, a YAML merge key injecting if: false, NODE_OPTIONS: --test-only at step, lane and workflow scope, a runs-on expression that can resolve to ubuntu, and a lane-level continue-on-error), restoring the workflow byte-identically after each (SHA256 unchanged); ran scripts/ci unittest discovery (identical failing identities at base and head); ruff clean; ran the 11 suites on native Windows under node v22.22.3; ran the canary premerge gate. Read the lane end-to-end, review_gate.py, and the #6356/#6258/#6566 diffs before editing. Deliberately not included: Python suites whose native Windows execution is privilege-gated on this host, and the other suites with a win32 branch that carry no recorded Windows fix (listed below).

Validation

  • Native Windows host (Windows 11), the 11 added suites under the lane's pinned runtime:
    node --no-warnings --experimental-sqlite --experimental-strip-types --test <11 suites> → # tests 271 / # pass 246 / # fail 0 / # skipped 25 / duration_ms 48102 (exit 0). The 25 skips are 20 PostgreSQL-provider cases (no LOOPX_TEST_POSTGRES_URL), 3 "file symlink creation needs Windows host privileges" and 2 POSIX-only cases (mode 000 read denial needs a non-root POSIX host, the linux directory-sync boundary needs a POSIX host).
  • Contract test: python -m unittest discover -s scripts/ci -p 'test_*.py' → the two new tests pass, and the mutation battery above shows the guard red with an explicit assertion for all seventeen single-edit bypasses (deletion, step if: false, step continue-on-error: true, echo instead of node, flipped activation condition, commented-out suite list, trailing ; exit 0, false && activation prefix, | block scalar with a bare trailing path, ubuntu-latest runner, needs without changes, YAML merge key injecting if: false, NODE_OPTIONS: --test-only at step/lane/workflow scope, runs-on expression, lane-level continue-on-error) and green only for the unmodified workflow.
  • python -m ruff check scripts/ci/test_windows_lane_coverage.py → All checks passed!
  • CI readback on this PR: the first windows-powershell run (head f0a243dd8) failed the new step because that lane installed no root dependencies — ERR_MODULE_NOT_FOUND: Cannot find package 'pg' imported from tests/control_plane_ts/goal_acceptance_authority.test.ts (job-step conclusion read from the Actions jobs API; reproduced locally with the same node version by moving node_modules aside: # fail 1, same module error). The root npm ci --ignore-scripts step added in 4454cbffd addresses it. The changes job (which executes scripts/ci unittests, i.e. the new contract test) and every other prerequisite lane passed on that run.
  • loopx canary premerge --from-git-diff (after the fork main was fast-forwarded so the gate diffs against the real base): direct checks 3/3 passed, python3 -m py_compile passed, examples/semantic-vocabulary-drift-smoke.py passed, and the public boundary scan over the changed paths passed. Five catalog-canary checks fail, all of them identically at base dda6f7ef7 without this diff (control-plane-maintainability-ratchet-smoke.py, which the gate itself reports as advisory_inherited_failure "known baseline smoke failure did not mention changed files"; cli-output-budget-regression-smoke.py, failing on its POSIX /tmp fixture path on Windows; benchmark-candidate-source-boundary-smoke.py; benchmark-artifact-path-filter-smoke.py; content-ops-public-handle-observation-smoke.py), and the four scripts/ci unittest failures/errors (a Windows-invalid newline-in-path fixture, plus temp-directory teardown noise) are identical at base and head.

Scope And Continuation

  • Useful delta: the control-plane suites that encode native Windows filesystem, durability, lease and SQLite behavior are qualified by the required Windows lane, and a contract test keeps them there — including against being skipped or muted.
  • Remaining gap: (1) tests/test_state_backup.py — the Python twin of fix(backup): flush state backup archives through writable handles on Windows #6258 — still runs only on ubuntu; (2) suites with a win32 branch but no recorded Windows fix (effect_runtime_io, effect_runtime_compile_cache, host_process, host_process_group, configuration_backup, source_transfer, shadow_management, turn_journal_query, delegation_preview_bridge, replan_history, zcode_guard) remain outside the lane.
  • Next owner/dependency: extend WINDOWS_QUALIFIED_SUITES and the lane step together when a native Windows fix lands; the contract test makes that the path of least resistance. A broader derived rule ("every win32 branch runs on Windows") is possible once those remaining suites are verified Windows-green.
  • Why this boundary: the added coverage is exactly the set with a recorded native Windows fix, each verified green on a native Windows host under the lane's Node runtime; the change touches only CI configuration and its contract test, so it is independently reversible.

Drafted with AI assistance at my request, under my direction and review.

JasonBuildAI added a commit to JasonBuildAI/loopx that referenced this pull request Oct 16, 2026

@JasonBuildAI JasonBuildAI left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Independent review record — exact head 7bd2f81ff

Reviewed through an independent adversarial sub-agent session (separate worktree, its own command runs) plus my own re-verification at this head. The sub-agent's verdict was APPROVE WITH NOTES for the intermediate head 4454cbffd; every note it raised was applied in the delta to 7bd2f81ff, and that delta is re-verified below.

Value. Premises verified independently: the base lane (dda6f7ef7) really ran only 6 of the 266 suites in tests/control_plane_ts/ (test_python_runtime, scheduler_heartbeat_commit, scheduler_heartbeat_commit_cli, sqlite_authority_store, local_authority_provider, sqlite_runtime_admission), and none of the added suites appears anywhere in the base workflow's run strings (zero matches). Provenance checks: #6258 touched sqlite_backup.test.ts, #6356 touched the nine host-hardened suites, and #6566 (fix for #6562) touched checkpoint_artifacts.test.ts; the follow-up sentence quoted from the #6566 review exists in that review.

Scope. Additions only (git diff realupstream/main..HEAD --stat → 25 + 75 lines, two files), confined to the windows-powershell job. Job if/needs/runs-on/timeout-minutes and the merge-gate job are untouched; no deletions.

Logic and edge cases. The guard is now load-bearing rather than a textual tripwire. Six mutated workflow copies were run against it, restoring the workflow byte-identically each time (SHA256 equal after the battery, git diff --exit-code HEAD clean): baseline green; deleting one suite line red; step-level if: false red; step continue-on-error: true red; echo in place of node red; flipping the activation condition to == 'false' red.

Over-abstraction. None: a 75-line standard-library unittest that reuses the existing scripts/ci discovery (which runs in the changes job), no new vocabulary, configuration surface, or framework.

Test and verification sufficiency. The 11 suites reproduce at node v22.22.3: 271 tests / 246 pass / 0 fail / 25 skipped / 48.1s, exit 0, and a per-suite loop shows every suite contributes tests (no suite silently absent or wholly skipped). Named blind spots: GitHub's Windows runner is privileged, so the 3 symlink-privilege-skipping tests here will execute there; total lane budget usage is not measured end-to-end, only the added run (~48s locally, lane limit 30 min).

Check-output plausibility. Counts reproduced. Every "pre-existing failure" claim was checked head vs base: the five catalog-canary failures and the scripts/ci unittest failures/errors have identical identities at base dda6f7ef7 without this diff.

Findings raised by the review, and their disposition at this head

  1. The guard only detected removal (it stayed green for step if: false, continue-on-error: true, echo-for-node, and a flipped activation condition) → fixed by the hardening above; the battery is the evidence.
  2. The body said "4 catalog-canary failures" while listing five, and the scripts/ci discovery noise was under-described → corrected in the body (five, with identities).
  3. "each carries a win32 branch" was inaccurate → corrected (nine of the ten #6356-touched suites carry an explicit branch; goal_acceptance_authority.test.ts was hardened with a CRLF-aware fence).
  4. checkpoint_provider_head.test.ts was attributed to the #6562 family without support in that diff → removed from both the lane and the list, leaving the 11 suites that each have a recorded Windows fix.
  5. "#6356-host-hardened 10 suites" counted a suite listed under #6258 → wording corrected.
  6. The lane installed no root dependencies, so goal_acceptance_authority.test.ts could not resolve pg; the first CI run failed exactly there → reproduced locally by moving node_modules aside (same ERR_MODULE_NOT_FOUND), fixed with the root npm ci --ignore-scripts step that the ubuntu typescript-core lane already performs.

Remaining verification gap, stated explicitly. The windows-powershell run for this head was still in progress when this record was written; the check list on this PR is the final readback. Nothing else about this change is unverified.

Verdict for this head: APPROVE WITH NOTES — the coverage addition and contract test are genuine and independently reproduced, all review notes are applied, and only the final CI confirmation is outstanding.

Drafted with AI assistance at my request, under my direction and review.

JasonBuildAI added a commit to JasonBuildAI/loopx that referenced this pull request Oct 16, 2026
…rd + final head (2026-10-16T13:48:10Z)

Signed-off-by: JasonBuildAI <jasonbuildai@gmail.com>

@JasonBuildAI JasonBuildAI left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Independent review record (update) — exact head b8b446c69

This record updates the previous review on head 7bd2f81ff (#6639 (review)) after a second adversarial pass.

What the second pass found. The delta from 4454cbffd to 7bd2f81ff was confirmed correct (11-suite set == guard list, all files exist, guard strictly stronger than before, suites reproduce at 271 / 246 / 0 / 25, exit 0). It also demonstrated three bypasses that still kept the guard green:

  • a # prefix before the suite list in the folded run: scalar (one line, so the whole command — flags and file list — is commented out while every suite remains a token; node then falls back to default discovery);
  • a trailing ; exit 0 after the last suite token (suites run but the step can never fail);
  • a false && prefix on the job if (the activation substring is still present, but the lane never activates).

What changed in this head. scripts/ci/test_windows_lane_coverage.py now pins the whole contract instead of substrings: the qualifying step's token list must be exactly node --no-warnings --experimental-sqlite --experimental-strip-types --test <the listed suites>, the step must have no if and no continue-on-error, and the lane activation must equal needs.changes.outputs.python_tests == 'true'.

Evidence at this head (nine single-edit mutated workflow copies; the workflow was restored byte-identically after each, SHA256 equal, git status clean apart from the intended guard edit).

Mutation Guard
unmodified workflow GREEN
delete sqlite_backup.test.ts line RED
step if: false RED
step continue-on-error: true RED
echo instead of node RED
job if flipped to == 'false' RED
comment out the first suite line (# ) RED
trailing ; exit 0 RED
job if prefixed with false && RED

Re-ran after the battery: the 11 suites still reproduce (271 tests / 246 pass / 0 fail / 25 skipped, exit 0) and ruff is clean; the guard itself is unchanged in behavior except for the added strictness above.

Residual, stated explicitly. The guard is a lexical contract over the workflow text; it is not a sandbox against someone deliberately restructuring the file (for example reintroducing an equivalent runner elsewhere while rewriting this contract test too). That limit is inherent to a workflow-contract test and is why the real merge gate (scripts/ci/review_gate.py, which maps windows-powershell to python_tests and requires success) stays the authority for "the lane actually ran and passed". The lane's own CI run for this head is the final end-to-end readback and is still in progress at the time of writing.

Verdict for this head: APPROVE WITH NOTES — the previously demonstrated bypasses are closed and re-verified red; the only open item is the CI readback for this head.

Drafted with AI assistance at my request, under my direction and review.

@JasonBuildAI JasonBuildAI left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Independent review record (second update) — exact head 456675163

This record updates the reviews on 7bd2f81ff and b8b446c69 after a third adversarial pass.

What the third pass found. The delta to b8b446c69 was confirmed correct (guard v2 pins the full node --test token list and the activation string; all mandated red cases red, workflow restored byte-identically). It also demonstrated one silent-skip hole that mattered, plus three structural green paths:

  • run: | (literal block) with the suite list split across shell lines: Python split() flattens the newlines, so the guard stayed green, while on the runner a bare trailing relative path is a silent no-op in PowerShell — the last suite would simply not execute (268 tests instead of 271, no failure).
  • runs-on: windows-latest → ubuntu-latest (the same files already run on ubuntu elsewhere, so the win32 branches would never execute while the lane stayed green).
  • dropping changes from needs (the activation expression then resolves against a null output, silently skipping the lane).
  • a YAML merge key (<<: {if: false}) — PyYAML BaseLoader does not expand merges, so the guard never saw the injected if.

What changed in this head. The guard now also requires the qualifying step's command to be a single line (no newline inside the pinned run scalar), the lane to run on a windows* runner, the lane's needs to include changes, and the step to carry no YAML merge key.

Evidence at this head (twelve single-edit mutated workflow copies; after every case the workflow was restored byte-identically, SHA256 unchanged, and each failure is an explicit assertion rather than a parse error).

Mutation Guard
unmodified workflow GREEN
delete sqlite_backup.test.ts line RED (assertion)
step if: false RED (assertion)
step continue-on-error: true RED (assertion)
echo instead of node RED (assertion)
job if → == 'false' RED (assertion)
# comment on the first suite line RED (assertion)
trailing ; exit 0 RED (assertion)
job if prefixed with false && RED (assertion)
run: >- → run: | block scalar (bare trailing path) RED (assertion)
runs-on: ubuntu-latest RED (assertion)
needs without changes RED (assertion)
<<: {if: false} merge key on the step RED (assertion)

Residual, stated explicitly. A lexical workflow contract cannot be a complete sandbox: someone who rewrites the contract test in the same edit can always defeat it, and the third pass still found that a duplicated run key is resolved last-wins by both PyYAML and Actions (harmless here, since both read the same effective command), and that a job-level defaults.run.working-directory would fail loudly rather than silently skip. The authority for "the lane ran and passed" remains the required check itself plus scripts/ci/review_gate.py, which maps windows-powershell to python_tests and requires success. The lane's CI run for this head is the final end-to-end readback and is still in progress at the time of writing.

Verdict for this head: APPROVE WITH NOTES — the demonstrated silent-skip and structural bypasses are closed and re-verified red; the only open item is the CI readback for this head.

Drafted with AI assistance at my request, under my direction and review.

…dows

The required windows-powershell lane ran a curated subset of tests/control_plane_ts, so the suites the project hardened or fixed specifically for native Windows (loopx-project#6356 host-hardened assertions, loopx-project#6258 backup durability flush, loopx-project#6562 checkpoint durability flush) never executed on a Windows host in CI; the checkpoint regression confirmed that gap by shipping with green qualification. Run those suites in the lane under its qualified SQLite runtime, install the root dependencies the lane was missing so their provider imports resolve, and pin the coverage with a contract test: the qualifying step must stay one single-line node --test command over exactly those files with no environment override, and the lane must stay a pinned Windows runner depending on the change classification, activating on python_tests and gating the merge.

Signed-off-by: JasonBuildAI <jasonbuildai@gmail.com>

@JasonBuildAI JasonBuildAI left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Independent review record (third update) — exact head 45f20f8f7

This record updates the reviews on 7bd2f81ff, b8b446c69 and 456675163 after a fourth adversarial pass.

What the fourth pass found. The delta to 456675163 was confirmed correct (all four structural bypasses from the previous pass now red with explicit assertions, workflow restored byte-identically, list identity intact). It also demonstrated one empirically silent skip that mattered, plus two structural green paths:

  • env: NODE_OPTIONS: --test-only (or --test-name-pattern) on the step: the guard stayed green, node exited 0, and no test body executed — verified on the lane's own node version (1..0, exit 0). The guard never inspected env.
  • runs-on: ${{ 'ubuntu-latest' || 'windows-latest' }}: the windows substring check passed while the expression can resolve to ubuntu, losing native Windows execution silently.
  • lane-level continue-on-error: true: suites still run, but the lane can fail while the workflow run concludes successfully.

What changed in this head. The guard now rejects an expression in runs-on (the lane must pin a Windows label), rejects continue-on-error at lane level as well as step level, and rejects NODE_OPTIONS in the workflow, lane and qualifying-step environment — the three scopes that could turn the node --test command into a no-op.

Evidence at this head (eighteen single-edit mutated workflow copies; the verdict is taken from the process exit code, and after every case the workflow is restored byte-identically with SHA256 identity verified).

Mutation Guard
unmodified workflow GREEN (exit 0)
delete a suite line RED (assertion, exit 1)
step if: false RED (assertion)
step continue-on-error: true RED (assertion)
echo instead of node RED (assertion)
job if → == 'false' RED (assertion)
# comment on the first suite line RED (assertion)
trailing ; exit 0 RED (assertion)
job if prefixed with false && RED (assertion)
run: >- → run: | block scalar RED (assertion)
runs-on: ubuntu-latest RED (assertion)
needs without changes RED (assertion)
<<: {if: false} merge key RED (assertion)
NODE_OPTIONS: --test-only in the step env RED (assertion)
NODE_OPTIONS: --test-only in the lane env RED (assertion)
NODE_OPTIONS: --test-only in the workflow env RED (assertion)
runs-on expression resolving to ubuntu RED (assertion)
lane-level continue-on-error: true RED (assertion)

Residual, stated explicitly. A lexical workflow contract cannot be a complete sandbox, and the fourth pass still listed green paths that are not silent skips: a YAML anchor added to the run scalar, a folded job if (after folding and stripping it is byte-identical to the pinned expression), a trailing NBSP, a duplicated windows-powershell: key (last-wins in both PyYAML and Actions, so both read the same job), timeout-minutes: 0 and an unknown IF: key (expected to be rejected loudly by the Actions parser rather than ignored). Someone who rewrites this contract test in the same edit can always defeat it; that is inherent to a text-level guard. The authority for "the lane ran and passed" remains the required check plus scripts/ci/review_gate.py, which maps windows-powershell to python_tests and requires success. The lane's CI run for this head is the final end-to-end readback and is still in progress at the time of writing.

Verdict for this head: APPROVE WITH NOTES — the demonstrated silent-skip vector and the structural gaps are closed and re-verified red; the only open item is the CI readback for this head.

Drafted with AI assistance at my request, under my direction and review.

@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

Exact head: 45f20f8f764390fb6ecf43feae3e9ac4020c990f

动机

维护 Windows 兼容性、依靠必需 CI lane 判断控制面改动能否合入的贡献者。

已有十一组测试包含 Windows 修复,却没有进入原生 Windows lane;后续回归仍可能在绿灯下漏过。提案把这些既有测试真正接入该 lane,并让移除、跳过或把执行改成空跑的常见编辑立即失败。

当前工作流通过十九项 CI 单测,旧工作流不能通过新增覆盖检查;十七种破坏性工作流变体全部被拒绝。按工作流解析出的同一条 Node 22.22.3 命令在 base 和 head 均得到 251 通过、20 个可选 PostgreSQL 跳过、零失败。

这是十一组已登记测试的持续 Windows 接入,不是所有 Windows 分支的全面认证;本机运行 macOS,未运行原生 Windows runner,也未查询、等待或重跑远端 CI。

独立判定依据:https://github.com/loopx-project/loopx/issues/6638;revision 2026-10-16T13:45:41Z。按 What happens 的十一项已知缺口逐项核对;Expected 的全部 Windows 行为覆盖是更广目标,本次只认定一个可独立验收的增量。

其余尚未登记的 Windows 分支、Python backup 验证及独立 worktree 观察测试仍由各自实现和 Windows lane 维护者接续;本 PR 不宣称一并完成。

改动思路

已有工作流和 CI unittest owner 足以承载这个缺口。固定列表对应已登记的真实套件,维护成本是后续同步更新列表;不需要动态发现框架、产品运行时开关或新权限模型。

当前 PR 交付既有十一组测试在 Windows lane 中的接入与防失效检查;测试实现、其他 Windows 分支和独立新测试仍由原维护边界负责,避免把 CI 接线扩大成跨平台框架。

具体改动

工作流仍使用 python_tests 的原有触发条件、windows-powershell required job、Windows runner 和原本用于 SQLite 的 Node 22.22.3。在该 Node 准备完成后增加根目录 npm ci --ignore-scripts,再以一条 YAML folded command 调用十一条实际 suite 路径,补足包括 pg 导入所需的依赖;没有修改测试实现或生产运行时。

workflow() 使用 BaseLoader 读取实际 YAML;test_windows_lane_still_qualifies_every_code_change() 核对 literal Windows runner、changes 依赖、原激活条件、job 的失败传播以及 workflow/job 的 NODE_OPTIONS。test_windows_qualified_suites_are_unconditionally_executed_in_the_lane() 检查十一条文件真实存在、完整 node token 序列、单行命令,并拒绝 step 的 if、continue-on-error、YAML merge 和 NODE_OPTIONS。它们进入现有 scripts/ci unittest discovery,无需另设测试入口。

独立验证运行同一套 discovery:base 17 项通过,head 19 项通过。把实际 base YAML 交给新增检查时因缺少执行步骤失败;移除 suite、echo/comment、尾随 exit 0、多行裸路径、跳过/吞错、激活条件、非 Windows/表达式 runner、缺 changes,以及三层 NODE_OPTIONS 等十七种负例均失败;无关 step 自己的环境变量通过。另以真实 Node marker 证明普通测试执行了函数体,而 NODE_OPTIONS=--test-only 会退出 0 却不执行函数体,避免只证明字符串匹配。

按当前 YAML 解出的十一套命令,在 base/head 的 Node 22.22.3 各得到 271 total、251 pass、20 optional PostgreSQL skip、0 fail;十一套源文件逐字节相同。因此交付增量是可靠接线,不是声称又修了测试内部行为。Ruff、语义 advisory 后完整语义检查通过;premerge 执行 4 项 direct、7 项 selected,无 blocking failure。

对主干的风险

固定十一条列表需要随真正新增的 Windows suite 一起维护;它不自动发现未来所有平台分支。此检查防止当前列举的常见失效编辑,不是对任意 shell、其他 action 或 GitHub 配置的安全沙箱。额外依赖安装与测试会增加 lane 时间,本次没有伪造完整远端 job 的耗时或成功证明。

本机实际执行环境是 macOS。上面的 251/20 数据不能替换 issue 中作者的原生 Windows 246/25 记录;作者记录只是外部证据。本次没有查询、轮询或等待 GitHub CI,也未执行原生 PowerShell runner。PostgreSQL 可选项的跳过不计作通过,且本 PR 不改其存储实现。实际 base/head 的 maintainability ratchet 均只报告相同 DSH 既有 oversized function,失败全文与因果文件字节一致,作为 inherited advisory 单列,不拿它掩盖新检查失败。

我的整体评价

APPROVE。已登记十一组套件的必需 lane 接入、失败传播及空跑防护形成一个完整、可回退的交付增量,没有发现当前 head 的阻断问题。其余尚未登记的 Windows 分支、Python backup 验证及独立 worktree 观察测试仍由各自实现和 Windows lane 维护者接续;本 PR 不宣称一并完成。

未来改动可维护性复核:现有 CI discovery 和局部清单足够,额外通用框架没有当前收益。评审结论不授予合并、部署或共享 CLI 升级权限。

English verdict: APPROVE - 45f20f8f764390fb6ecf43feae3e9ac4020c990f; the eleven recorded suites are wired into the required Windows lane and protected against tested skip/no-op mutations; local Node22 251 pass/20 optional skips per arm, native Windows unexecuted here.

@loopx-agent
loopx-agent merged commit 43feada into loopx-project:main Oct 16, 2026
27 of 34 checks passed
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.

[Bug]: native Windows lane never runs the control-plane suites the project hardened and fixed for Windows, so Windows-only regressions ship qualified

2 participants