Skip to content

Add windows-latest to the squad-ci test matrix (BLOCKED on #1803) #1806

Description

@bradygaster

BLOCKED — do not implement yet. Adding windows-latest today turns CI red on every push (#1803: the failing set moves 7–9 run to run at the same commit). A matrix everyone ignores is worse than no matrix, because it manufactures the coverage illusion this work exists to remove. Sequence: resolve #1803 → triage the failing set → fix or explicitly quarantine each → then add the row and keep it green from day one.

The ask

.github/workflows/squad-ci.yml runs ubuntu-latest only. The single Windows matrix in the repo is squad-agents-ai-ci.yml, a .NET job that does not run the TypeScript suite. So no Windows signal exists for the main test suite.

Why this is worth doing — five instances from one night

This is filed as a list rather than a principle because the list is the argument. Each of these is a defect CI structurally could not see, and — the part that matters — each was found inside the remedy for the previous one.

# Defect Where it hid
1 #1770 — repo-health reporters crashed on any finding message containing a backtick The gate that catches unsafe git operations crashed precisely when it found one. A crashed reporter is indistinguishable from a clean run.
2 #1786 — the test fixture for the backtick fix triggered the backtick bug in CI The fixture quoted a denylisted git command; the scanner wrapped it in backticks; the base-branch reporter died with the exact production error.
3 #1788 — a CRLF shebang made check-changeset-drift.test.ts load 0 of 8 tests Dead since #1481 (2026-07-19). Green on Linux the whole time. Then check-shebang-eol.mjsthe lint written to catch this — reproduced the bug on its first run, because it was authored with CRLF.
4 #1804*.js text eol=lf, added in #1790, created CRLF-blob churn in 2 files The gate shipped in the same PR reported passed: all 45 shebanged files are pinned to LF, exit 0, while app.js and rss.xml.js churned. The rule and its blind spot landed together.
5 #1805 — widening that gate from 45 → ~1800 files blew Windows' 32767-char command-line limit A Windows-only crash of the gate itself, introduced inside the fix for a Windows-only defect. Invisible on Linux, where the same argv is fine.

Every one was found by a human working on a Windows box. Not one was caught by CI, and #3 in particular sat green for a month.

The specific shape CI misses

EOL defects come in two mirror-image forms with an identical git status symptom, opposite causes, and opposite remedies — and the wrong remedy is silent in both directions:

blob worktree remedy wrong remedy does
.mjs (#1788) CRLF ❌ LF git add --renormalize re-checkout: nothing
.snap (#1790) LF CRLF ❌ rewrite worktree as LF --renormalize: stages nothing, appears to succeed

That second row is the dangerous one: the obvious repair returns success while changing nothing. Linux never reaches either state.

Scope when unblocked

  • Add windows-latest to the test job matrix in squad-ci.yml.
  • Every failure triaged as fix or explicit quarantine with a linked issue — never a blanket skip.
  • Treat "environmental" classifications with suspicion. check-changeset-drift.test.ts sat in that bucket and was nothing of the kind — it was a dead gate (check-changeset-drift.test.ts silently runs zero tests on Windows (shebang + CRLF) #1788). Assume the rest are similarly unexamined until each is individually re-derived.

Blocked by #1803. Related: #1770, #1786, #1788, #1793, #1804, #1805.

Metadata

Metadata

Assignees

No one assigned

    Labels

    squadSquad triage inbox — Lead will assign to a membersquad:boosterAssigned to Booster (CI/CD Engineer)

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions