Skip to content

feat(hydra-gates): spec-screens gate - #836

Open
rubenvdlinde wants to merge 3 commits into
mainfrom
feat/gate-118-spec-screens
Open

rubenvdlinde wants to merge 3 commits into
mainfrom
feat/gate-118-spec-screens

Conversation

@rubenvdlinde

@rubenvdlinde rubenvdlinde commented Oct 10, 2026 •

Copy link
Copy Markdown
Contributor

Do not merge yet

Do not merge until every app's screens.md PR has landed. This gate blocks from day one (decision 151). Merged early, it fails every PR that touches a change or spec directory whose generated screens.md has not landed yet.

App PRs, for the coordinator to fill in:

App screens.md PR State
openregister pending
opencatalogi pending
integriq pending
filinq pending
thematiq pending
launchpad pending
stackiq pending
larpinq pending
dossiq pending
pipelinq pending
shillinq pending
learniq pending
portaliq pending
decidiq pending
buildiq pending
keepiq pending
hermiq pending
humaniq pending
versioniq pending
planninq pending

Rule it enforces: hydra ADR-116 screens first (ConductionNL/hydra#747).

What gate-118 spec-screens checks

For every openspec/changes/<c>/, openspec/changes/archive/<c>/ and openspec/specs/<s>/ directory the PR touches:

  • screens.md exists and has at least one - line;
  • every - <Board> line names a board on design-system main;
  • a - No screen: <reason> reason is real: at least ten characters, and not one of design-system's own PLACEHOLDER_REASON shapes ("not designed yet", "no board", "design session" and the rest, copied verbatim from scripts/screens/capabilities.py);
  • no - No board found yet line is left.

- Design backlog: <proposed board> (decision 157) passes: real UI whose board is not drawn yet, naming the board it proposes. Only a backlog line that names nothing fails. Board names are validated, not the URL text after them (https://identity.conduction.nl/screens/board?id=<app>/<Board>).

Verdicts follow the package's protocol. No delta base: NOT APPLICABLE. A change touching no openspec directory: NOT APPLICABLE. Design-system unreachable: SKIPPED (wiring), never PASS, unless a finding that needs no network already fails it. A crash without the checker's summary line: SKIPPED (wiring), not a finding. There is no _BLOCKING opt-in, because there is no warning period.

When the runner audits against the empty tree (a push whose previous tip is unknown), the gate judges every live change and spec and leaves archive/ alone, since an archived change from before screens.md existed is history.

One deliberate difference from the brief

The brief said a board must be present in design-system's apps/<app>.json. That file is one of several registration sources build.py merges, so on its own it misses real boards. Run read-only over the generator's current output for ten apps, the apps/<app>.json-only check reported 185 false findings on dossiq (DqZaak among them), 208 on pipelinq and 83 on opencatalogi, all boards that exist and are published.

So the gate asks the published index, preview/screens/screens.json (what identity.conduction.nl/screens serves), plus the app's own apps/<app>.json for a board registered but not yet built. Any app's board may be named: shared boards sit under other ids, such as launchpad's werkplek/LpStart. The app file is found by HYDRA_GATE_SCREENS_APP, the <id> in appinfo/info.xml, the repo name, the origin remote, then the directory name.

Two more shapes came from running it over the generated screens.md of all 20 apps (the chore/openspec-screens worktrees, read-only, --full-tree): the school sets key a board as <set>-<Board> in screens.json with id <set>/<Board>, so the id counts as a name too; and a board merged on main before the index was rebuilt (portaliq ZaakWooVerzoek) is found by its screens-src/zuiddrecht/<Board>.dc.html file.

With that, the run over 3,482 change and spec directories reports one finding: PqBrpMonitor in pipelinq openspec/specs/brp-lookup/screens.md, which is not on design-system main. That needs a board or a different line before pipelinq's next PR touches that spec.

Files

  • hydra-gates/scripts/lib/check_spec_screens.py: the checker
  • hydra-gates/scripts/run-hydra-gates.sh: the gate-118 block, after gate-116
  • hydra-gates/scripts/lib/test_check_spec_screens.py: 23 rule-by-rule arms, offline, including the backlog marker beside the four failures it does not excuse
  • hydra-gates/scripts/lib/test_gate118_spec_screens_scope.sh: 7 arms through the real runner, ARM 7 being the backlog marker, over a real git history
  • hydra-gates/scripts/test-fixtures/gate-acceptance/COVERED-ELSEWHERE.md: the gate-118 row

Gate number 118: 117 is claimed by the open #782.

Verified

  • test_check_spec_screens.py: 23 passed
  • test_gate118_spec_screens_scope.sh: all 7 arms passed
  • check_gate_numbers_unique.sh: every number claimed once
  • tests/test-hydra-gates-bin.sh: 70 passed, 0 failed
  • tests/run-helper-suites.sh: 128 passed, 1 quarantined (pre-existing), 0 failed. This ran on the first commit; the gate-118 suites were rerun on the head commit, and the later commits touch only the gate-118 checker, its tests and comments.

Every openspec change and spec directory a PR touches must carry a
screens.md that names boards on design-system main, or a real no-screen
reason. A leftover 'No board found yet' line fails. Blocking from day
one (decision 151); NOT APPLICABLE without a delta base; SKIPPED (wiring)
when design-system is unreachable. Rule: hydra ADR-116 screens first.
…cision 157)

'- Design backlog: <proposed board> (decision 157)' passes; a missing
screens.md, an unknown board, a placeholder reason and 'No board found
yet' still fail. Board names are validated, not the URL text.
…ds merged before the index rebuild

Measured on the generated screens.md of all 20 apps: the school sets key a
board as <set>-<Board> in screens.json, and one portaliq board was merged
on main before the index was rebuilt. Both read as unknown boards.

This branch has not been deployed

No deployments
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.

1 participant