Skip to content

Commit 528b92b

Browse files
committed
ci(workflows): enforce 4 drift checks in CI that only ran locally
miner:env-reference:check, manifest:drift-check, engine-parity:drift-check, and branding-drift:check were all part of the local `npm run test:ci` aggregate but never wired into .github/workflows/ci.yml -- the exact same gap class the "Selfhost env-reference drift check" comment already documents having bitten twice before. Confirmed harmful live: the miner:env-reference gap let a stale generated doc merge to main with green CI, then block an unrelated MCP npm release days later, since the release workflow (before being scoped down) was the only place that check ever actually ran. Also adds .loopover.yml to the `backend` path filter so an edit to just that file still re-triggers manifest:drift-check, which reads it directly.
1 parent 0a2484f commit 528b92b

1 file changed

Lines changed: 32 additions & 0 deletions

File tree

.github/workflows/ci.yml

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ jobs:
6666
- '.github/workflows/**'
6767
- 'wrangler.jsonc'
6868
- 'worker-configuration.d.ts'
69+
- '.loopover.yml'
6970
observability:
7071
- 'grafana/dashboards/**'
7172
- 'prometheus/rules/**'
@@ -269,6 +270,16 @@ jobs:
269270
- name: Selfhost env-reference drift check
270271
if: ${{ github.event_name == 'push' || needs.changes.outputs.backend == 'true' || needs.changes.outputs.ui == 'true' }}
271272
run: npm run selfhost:env-reference:check
273+
# Miner/AMS twin of the selfhost check above -- same generated-artifact-drift class, same
274+
# local-only-until-now gap (an `env.SOMETHING` read added under packages/loopover-miner/**
275+
# with no CI signal that packages/loopover-miner/docs/env-reference.md and
276+
# apps/loopover-ui/src/lib/ams-env-reference.ts had gone stale). Confirmed harmful live: this
277+
# exact gap let a stale env-reference block an unrelated MCP npm release, since the release
278+
# workflow was the only place this check ever ran. Gated on `ui` too, same reason as its sibling:
279+
# the generated UI-side file lives under apps/loopover-ui/**.
280+
- name: Miner env-reference drift check
281+
if: ${{ github.event_name == 'push' || needs.changes.outputs.miner == 'true' || needs.changes.outputs.ui == 'true' }}
282+
run: npm run miner:env-reference:check
272283
# Same generated-artifact-drift class, extracted from src/github/commands.ts's command catalogs (#3046).
273284
# Also local-only until now; same backend-or-ui gating rationale as the step above.
274285
- name: Command reference drift check
@@ -282,6 +293,27 @@ jobs:
282293
- name: Docs drift check
283294
if: ${{ github.event_name == 'push' || needs.changes.outputs.backend == 'true' || needs.changes.outputs.ui == 'true' }}
284295
run: npm run docs:drift-check
296+
# Cross-checks the bundled fallback YAML in src/config/loopover-repo-focus-manifest.ts against the
297+
# real root .loopover.yml -- see the script's own header comment. Same local-only-until-now gap as
298+
# the drift checks above: nothing in this workflow previously ran it, so the two could silently
299+
# diverge with zero CI signal. .loopover.yml itself is now part of the `backend` path filter above
300+
# specifically so an edit to ONLY that file still re-triggers this job.
301+
- name: Manifest drift check
302+
if: ${{ github.event_name == 'push' || needs.changes.outputs.backend == 'true' }}
303+
run: npm run manifest:drift-check
304+
# Mechanical drift tripwire for the hand-duplicated src/{review,settings,signals} <-> loopover-engine
305+
# twin files, plus a version-skew check on the installed @loopover/engine (#4260). Same
306+
# local-only-until-now gap as the drift checks above.
307+
- name: Engine-parity drift check
308+
if: ${{ github.event_name == 'push' || needs.changes.outputs.backend == 'true' || needs.changes.outputs.engine == 'true' }}
309+
run: npm run engine-parity:drift-check
310+
# Guards against the "gittensory" branding creeping back into runtime source after the LoopOver
311+
# rebrand -- see the script's own header comment (#6786 is the concrete incident this was written
312+
# for). Scoped broadly (src/** plus every workspace package's bin/lib/src/scripts dirs), so it's
313+
# gated broadly to match; same local-only-until-now gap as the drift checks above.
314+
- name: Branding drift check
315+
if: ${{ github.event_name == 'push' || needs.changes.outputs.backend == 'true' || needs.changes.outputs.mcp == 'true' || needs.changes.outputs.engine == 'true' || needs.changes.outputs.miner == 'true' || needs.changes.outputs.ui == 'true' }}
316+
run: npm run branding-drift:check
285317
- name: Validate observability configs
286318
if: ${{ github.event_name == 'push' || needs.changes.outputs.backend == 'true' || needs.changes.outputs.observability == 'true' }}
287319
env:

0 commit comments

Comments
 (0)