Noticed while adding portal.judging.results.export to src/modules/judging/acl.ts (review finding
F4 on PR #153).
The inconsistency
judging/acl.ts declares no portal.judging.* features. Four of them —
portal.judging.score, portal.judging.results.view, portal.judging.demos.view,
portal.judging.view_assigned — are granted in defaultCustomerRoleFeatures in
src/modules/judging/setup.ts and checked in route handlers and page.meta.ts files, but never
declared anywhere.
src/modules/bounties/acl.ts does declare its portal features, so the repo has both conventions.
Why it matters
Per AGENTS.md, a feature id is meant to be declared in the module's acl.ts and granted in
setup.ts. Undeclared-but-granted features still work — the grant is what the runtime checks — but:
- They are invisible to anything that enumerates the feature catalogue (role editors, permission
UIs, docs).
- There is no single place to see what the module's portal permission surface is, which is how
finding F4 happened: a feature whose name suggested "organisers and judges" was quietly granted to
participant, and nothing made that contradiction visible.
Expected
Declare the four existing portal.judging.* features in judging/acl.ts alongside the newly added
portal.judging.results.export. Pure declaration — do not change any grant in setup.ts, since
the current grants are the live behaviour and changing them is a separate, reviewable decision.
This was deliberately left out of PR #153's remediation to keep that change scoped to the finding.
Noticed while adding
portal.judging.results.exporttosrc/modules/judging/acl.ts(review findingF4 on PR #153).
The inconsistency
judging/acl.tsdeclares noportal.judging.*features. Four of them —portal.judging.score,portal.judging.results.view,portal.judging.demos.view,portal.judging.view_assigned— are granted indefaultCustomerRoleFeaturesinsrc/modules/judging/setup.tsand checked in route handlers andpage.meta.tsfiles, but neverdeclared anywhere.
src/modules/bounties/acl.tsdoes declare its portal features, so the repo has both conventions.Why it matters
Per AGENTS.md, a feature id is meant to be declared in the module's
acl.tsand granted insetup.ts. Undeclared-but-granted features still work — the grant is what the runtime checks — but:UIs, docs).
finding F4 happened: a feature whose name suggested "organisers and judges" was quietly granted to
participant, and nothing made that contradiction visible.Expected
Declare the four existing
portal.judging.*features injudging/acl.tsalongside the newly addedportal.judging.results.export. Pure declaration — do not change any grant insetup.ts, sincethe current grants are the live behaviour and changing them is a separate, reviewable decision.
This was deliberately left out of PR #153's remediation to keep that change scoped to the finding.