Compare commits

...
Author SHA1 Message Date
Brooklyn Nicholson 6212b5e4af fix(ci): route root npm manifest changes into the Python lane
The change classifier treated package.json / package-lock.json as
python-irrelevant, so a lockfile-only PR skipped the Python lane entirely.
But several Python invariant tests read these files (assistant-ui tap cluster,
electron pin, lazy-deps, lockfile churn) — so a lockfile change can break the
Python suite. #63970 merged green (Python skipped on the PR) then reddened main
(push fails open and runs everything).

Drop root npm from the _py_irrelevant denylist so lockfile changes run Python,
honoring the classifier's own contract: never skip a lane a change could break.
Root npm still triggers the frontend lane as before.
2026-07-15 03:17:29 -04:00
2 changed files with 9 additions and 3 deletions
+5 -1
View File
@@ -56,7 +56,11 @@ def _is_docs(p: str) -> bool:
def _py_irrelevant(p: str) -> bool:
return _is_docs(p) or p in _ROOT_NPM or p.startswith(_PY_SKIP) or p.startswith(_DOCKER_META)
# Root npm manifests are NOT python-irrelevant: several Python invariant
# tests read package.json / package-lock.json (tap-cluster, electron pin,
# lazy-deps, lockfile churn), so a lockfile-only change can break the Python
# suite. Omitting them here is what let #63970 merge green then redden main.
return _is_docs(p) or p.startswith(_PY_SKIP) or p.startswith(_DOCKER_META)
def _is_scan(p: str) -> bool:
+4 -2
View File
@@ -50,8 +50,10 @@ CASES = {
"uv.lock → python": (["uv.lock"], _lanes(python=True)),
"ts package → frontend": (["apps/desktop/src/app.tsx"], _lanes(frontend=True)),
"ui-tui → frontend": (["ui-tui/src/entry.ts"], _lanes(frontend=True)),
# Lockfile bump shifts every TS package's tree, but not the Python suite.
"root lockfile → frontend, not python": (["package-lock.json"], _lanes(frontend=True)),
# Lockfile bump shifts every TS package's tree AND feeds Python invariant
# tests that read package-lock.json (tap-cluster, electron pin, lazy-deps).
"root lockfile → frontend + python": (["package-lock.json"], _lanes(frontend=True, python=True)),
"root package.json → frontend + python": (["package.json"], _lanes(frontend=True, python=True)),
"website → site": (["website/docs/intro.md"], _lanes(site=True)),
# SKILL.md reads like docs, but the skill-doc tests read skills/, so a
# skill edit must still run Python.