Skip to content

feat(hydra-gates): gate 120 fails a register version change without an app version change - #851

Merged
rubenvdlinde merged 1 commit into
mainfrom
feat/gate-120-register-version-needs-app-version
Oct 14, 2026
Merged

rubenvdlinde merged 1 commit into
mainfrom
feat/gate-120-register-version-needs-app-version

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

What

Gate 120, register-version-needs-app-version. A PR fails when it moves a register version and leaves appinfo/info.xml <version> alone.

Why

A register change reaches a running instance only through the app's InitializeSettings repair step. occ upgrade runs that step only when <version> changes. This week two PRs closed a register to a staff group and kept the app version:

  • portaliq #1549: portaliq_register.json 0.96.0 to 0.97.0.
  • pipelinq #2471: a new register.d fragment raised pipelinq, pipelinq-portal and sla from 1.0.0 to 1.1.0. That fragment has no info.version.

Both stayed open on every running instance until a follow-up release PR.

The rule

The gate reads lib/Settings/*_register.json and lib/Settings/register.d/*.json at the base and in the change. It flags two kinds of move:

  • a document's info.version;
  • a register's effective version: components.registers.<slug>.version after the loaders' merge (base documents, then register.d in sorted order, the last declaration winning).

A move with an unchanged <version> fails, one finding per move. Mocks (x-openregister.type: mock) do not count, because a repair step never imports them. Without a delta base the gate reports NOT APPLICABLE, never PASS. If a register document is not valid JSON, the gate reports SKIPPED (wiring), not a finding.

Verified

  • python3 scripts/lib/test_check_register_version_bump.py: 14 tests OK.
  • bash scripts/lib/test_gate120_register_version_scope.sh: all 6 arms pass through the real runner (FAIL, PASS, mock PASS, no base NOT APPLICABLE, no lib/Settings NOT APPLICABLE, broken JSON SKIPPED). Exit 0.
  • Against the real incidents, in ref mode: portaliq #1549 exit 1 (2 findings), pipelinq #2471 exit 1 (3 findings).
  • check_gate_numbers_unique.sh: exit 0, every number claimed once. feat(hydra-gates): spec-screens gate #836 claims 118 and feat(hydra-gates): gate 117 reads PHP and schema strings as missing, not only as unused #782 claims 117, so this takes 120.
  • test_gate_acceptance_matrix.sh: gate 120 counted as covered. Exit 1 on 2 inherited failures, both gate 96 (manifest-copy-style): its planted fixture run aborts and it has no coverage row. This PR does not touch gate 96. Not rerun on main.

Not verified

  • A run over all 21 fleet apps. Each app's next PR that moves a register version without <version> will now fail.

🤖 Generated with Claude Code

…n app version change

A register change reaches an existing instance only through the app's
InitializeSettings repair step, and occ upgrade runs it only when
appinfo/info.xml <version> changes. portaliq #1549 and pipelinq #2471
raised the register version and left the app version, so no running
instance imported the closed registers.

The gate compares each register document's info.version and each
register's effective version after the register.d merge against the
base. A move without a <version> change fails. Mocks do not count.
Without a delta base the gate is not applicable, never a pass.
@rubenvdlinde
rubenvdlinde merged commit 551ced6 into main Oct 14, 2026
48 checks passed
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