Repository navigation
[Bug]: required windows-powershell lane is red because the same quota JSON pays 31 chars per owned-root character and exceeds its 40,000 ceiling #7134
Description
Preflight
- I searched existing issues and discussions for this behavior.
- This report is not an unpatched security vulnerability.
- The report and attachments contain no credentials or private/internal material.
Issue origin
Observed or reproduced in a real environment.
LoopX version or commit
69adacd312b8cfad9c26f2d7d276807da220c8b5 (main, 2026-10-23). The first failing run I sampled is at 4f931fccd (39896330012, 2026-10-23T03:41Z); the lane has failed on every sampled PR run since.
Host or runtime surface
Not host-specific (the windows-powershell job of the Python Tests workflow on windows-latest).
LoopX area
Build, packaging, installer, or CI.
Problem
The required windows-powershell job of Python Tests (a merge-gate need) is red on main, and it fails on every PR whose change classification runs it. The failing step is Qualify the native Windows CLI output differential, at python examples/control_plane/cli-output-budget-regression-smoke.py:
AssertionError: quota_should_run/crowded/json emitted 40806 chars; baseline ceiling is 40000
This is a measurement-fixture portability defect, not a product-output regression. The complete executable routes render the owned fixture root once per action (13 registry routes and 13 runtime-root routes). The same semantic payload measures 39,810 JSON characters when the owned root is short (24 characters) and 40,860 at a 58-character root: 31 serialized characters per owned-root character. The hosted Windows runner owns a 53-character root (C:\Users\RUNNER~1\AppData\Local\Temp\lxb-<hash>), which adds about 900 characters of JSON path escaping to the unchanged payload. The previous 40,000-character ceiling was calibrated against the short root, so the native runner can never satisfy it without shortening routes.
Minimal reproduction (native Windows, current main)
git switch --detach 69adacd312b8cfad9c26f2d7d276807da220c8b5
uv sync --extra test
$env:TEMP = "D:\Temp\" + ("p" * 28) # same 36-character native %TEMP% length as the hosted runner
New-Item -ItemType Directory -Force $env:TEMP | Out-Null
uv run --extra test python examples/control_plane/cli-output-budget-regression-smoke.pyLocal measurements of the same fixture and command, with the owned root created under namespaces of different lengths:
| Owned fixture-root length | quota_should_run/crowded/json chars |
|---|---|
| 24 (short calibration root) | 39,810 |
| 58 | 40,860 |
| 53 (hosted runner root) | 40,806 (CI job 120295929975) |
Expected vs actual
- Expected: the absolute hot-path ceiling covers the complete executable routes the product actually emits on the native host; a longer host path must not decide the agent-facing budget.
- Actual: the same payload exceeds the 40,000 ceiling by ~800 characters only because the runner's owned root is longer, so the required Windows lane is red for every PR and is being merged through admin bypass.
Who is affected and how much
- Every pull request whose classification runs
Python Tests:windows-powershellis amerge-gateneed. I sampled 25 consecutive PR runs from 2026-10-23T03:41Z to 07:47Z and all of them failed this step; earlier merged PRs#7089,#7100and#7128also carry the failure. - Maintainers must repeatedly bypass the required gate or ask contributors to ignore a known-red check, which hides real Windows regressions in the same job.
- The output-budget contract itself is weakened by host-path sensitivity: a native Windows agent turn pays ~900 characters of path escaping that the budget claims to bound.
Proposed repair
Keep the complete executable routes and qualify the crowded JSON ceiling against the measured native layout: raise quota_should_run crowded JSON from 40,000 to 41,200. A focused regression measures the serialized cost per owned-root character from two owned root lengths and requires the 53-character runner root to fit. Line, growth, semantic and every other surface ceiling stay unchanged. This follows the existing native-path budget precedent in docs/reference/contracts/interface-budget-contract.md (brief JSON 10,500 -> 10,800) and the budget decision guide.
AI disclosure: this report was reproduced and drafted with AI assistance at my request, under my direction and review.
Activity
JasonBuildAI commentedon Oct 23, 2026
Superseded and resolved on main by #7095 (merged 2026-10-23T08:18:45Z), which raised the
quota_should_runcrowded JSON ceiling to 42,000 after the same native measurement ("Native Windows paired base/head both emit 40,701 JSON chars") and added bounded base-ceiling diagnostics. My reproduction and the 31-characters-per-owned-root-character evidence match that change; the fix already exists, so this issue is closed without a separate PR.AI disclosure: reproduced and drafted with AI assistance at my request, under my direction and review.