feat(schema): HubPermissionRule model + enums (approval-rules-sync) #50

Merged
janpeter merged 2 commits from feat/hub-permission-rule into main 2026-08-15 07:58:53 +02:00
Owner

Task 3a of the approval-rules-sync feature (Scrum4Me docs/superpowers/plans/2026-08-14-approval-rules-sync.md, dubbel-GO na review).

Voegt een nieuw HubPermissionRule-model + 4 enums toe aan de canonieke shared-schema, zodat de hub de bron kan worden van gedeelde Claude Code permission-regels (beslissing blijft lokaal).

Wat

  • model HubPermissionRule → tabel hub_permission_rules (@@unique([scope, repo_key, rule, list])).
  • enums HubPermissionRuleScope (GLOBAL/PRODUCT), HubPermissionRuleList (ALLOW/DENY/ASK), HubPermissionRuleOrigin (IMPORT/APPROVE_ALWAYS/SYNC_UPLOAD/MANUAL), HubPermissionRuleStatus (PENDING_CONFIRM/ACTIVE/DISABLED).

Waarom veilig voor lockstep-consumers

Puur additief: geen bestaand model of enum wordt gewijzigd, geen bestaande enum krijgt een nieuwe waarde. Scrum4Me, workers en mcp blijven bouwen; elke consumer bumpt de submodule wanneer die het model adopteert (Scrum4Me doet dat in Task 3b: submodule-bump + gen-schema.sh + migratie).

Validatie

De canonieke schema is een template zonder datasource (CONSUMER-PLACEHOLDER); standalone prisma validate defaultet daarom de connector. Via gen-consumer-schema.sh (postgresql-datasource geinjecteerd) valideert de gegenereerde consumer-schema zonder enige fout op dit model/deze enums — de enige resterende meldingen zijn de bekende Prisma-7 url/directUrl-in-schema die de consumer-gen-schema.sh sowieso stript. De definitieve end-to-end-validatie (prisma validate + npm run verify + migratie) draait in de consumer bij Task 3b.

Graag mergen; daarna bump ik de submodule in Scrum4Me (Task 3b).

Task 3a of the **approval-rules-sync** feature (Scrum4Me `docs/superpowers/plans/2026-08-14-approval-rules-sync.md`, dubbel-GO na review). Voegt een nieuw `HubPermissionRule`-model + 4 enums toe aan de canonieke shared-schema, zodat de hub de bron kan worden van gedeelde Claude Code permission-regels (beslissing blijft lokaal). ## Wat - `model HubPermissionRule` → tabel `hub_permission_rules` (`@@unique([scope, repo_key, rule, list])`). - enums `HubPermissionRuleScope` (GLOBAL/PRODUCT), `HubPermissionRuleList` (ALLOW/DENY/ASK), `HubPermissionRuleOrigin` (IMPORT/APPROVE_ALWAYS/SYNC_UPLOAD/MANUAL), `HubPermissionRuleStatus` (PENDING_CONFIRM/ACTIVE/DISABLED). ## Waarom veilig voor lockstep-consumers **Puur additief**: geen bestaand model of enum wordt gewijzigd, geen bestaande enum krijgt een nieuwe waarde. Scrum4Me, workers en mcp blijven bouwen; elke consumer bumpt de submodule wanneer die het model adopteert (Scrum4Me doet dat in Task 3b: submodule-bump + `gen-schema.sh` + migratie). ## Validatie De canonieke schema is een template zonder datasource (`CONSUMER-PLACEHOLDER`); standalone `prisma validate` defaultet daarom de connector. Via `gen-consumer-schema.sh` (postgresql-datasource geinjecteerd) valideert de gegenereerde consumer-schema zonder enige fout op dit model/deze enums — de enige resterende meldingen zijn de bekende Prisma-7 `url`/`directUrl`-in-schema die de consumer-`gen-schema.sh` sowieso stript. De definitieve end-to-end-validatie (`prisma validate` + `npm run verify` + migratie) draait in de consumer bij Task 3b. Graag mergen; daarna bump ik de submodule in Scrum4Me (Task 3b).
feat(schema): HubPermissionRule model + enums
All checks were successful
CI / Verify (pull_request) Successful in 19s
f1a292e854
Additive: new hub_permission_rules table + 4 enums (Scope/List/Origin/Status)
for the approval-rules-sync feature. No existing model or enum is changed, so
lockstep consumers (Scrum4Me, workers, mcp) keep building; each bumps the
submodule when it adopts the model.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
s4m-codex-reviewer requested changes 2026-08-15 01:00:46 +02:00
Dismissed
s4m-codex-reviewer left a comment

Verdict: REQUEST_CHANGES

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • errorprisma/schema.prisma:1519@@unique([scope, repo_key, rule, list]) gebruikt repo_key, maar die kolom is nullable. In PostgreSQL zijn NULL-waarden in een unique constraint niet gelijk aan elkaar, waardoor meerdere identieke globale regels met scope = GLOBAL, repo_key = NULL, dezelfde rule en dezelfde list kunnen bestaan. Voor een canonieke permission-rule tabel breekt dit de deduplicatie/invariant die de constraint lijkt te willen afdwingen. Maak de key niet-null met een sentinel/expliciete scope-key, splits de uniqueness per scope, of gebruik een DB-specifieke oplossing die NULLS NOT DISTINCT/expression uniqueness correct modelleert in de migrator.

Review Log

Schema-eigenaarschap is conform de productdoc: de wijziging zit in scrum4me-shared/prisma/schema.prisma, zonder consumer-migratie in deze repo. Door het nullable-unique probleem is de diff nog niet akkoord.

# Verdict: REQUEST_CHANGES Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - **error** — `prisma/schema.prisma:1519` — `@@unique([scope, repo_key, rule, list])` gebruikt `repo_key`, maar die kolom is nullable. In PostgreSQL zijn `NULL`-waarden in een unique constraint niet gelijk aan elkaar, waardoor meerdere identieke globale regels met `scope = GLOBAL`, `repo_key = NULL`, dezelfde `rule` en dezelfde `list` kunnen bestaan. Voor een canonieke permission-rule tabel breekt dit de deduplicatie/invariant die de constraint lijkt te willen afdwingen. Maak de key niet-null met een sentinel/expliciete scope-key, splits de uniqueness per scope, of gebruik een DB-specifieke oplossing die `NULLS NOT DISTINCT`/expression uniqueness correct modelleert in de migrator. ## Review Log Schema-eigenaarschap is conform de productdoc: de wijziging zit in `scrum4me-shared/prisma/schema.prisma`, zonder consumer-migratie in deze repo. Door het nullable-unique probleem is de diff nog niet akkoord.
docs(schema): clarify HubPermissionRule GLOBAL-uniqueness enforcement
All checks were successful
CI / Verify (pull_request) Successful in 18s
ed23d221d9
The composite @@unique cannot dedup GLOBAL rows (repo_key IS NULL) because
Postgres treats NULLs as distinct and Prisma's schema DSL can express neither
a partial unique index nor a CHECK. Document that GLOBAL dedup + the
scope<->repo_key CHECK live in each consumer's migration (addresses the
s4m-codex-reviewer finding on PR #50).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
s4m-codex-reviewer left a comment

Verdict: APPROVED

Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden.

Findings

  • Geen blokkerende findings.

De wijziging voegt alleen canonieke Prisma schema-definities toe in scrum4me-shared, wat overeenkomt met de productdocs: dit repo is de single source of truth voor schema en consumers verzorgen migraties. De nullable repo_key/global-scope randvoorwaarde is expliciet gedocumenteerd bij het model, inclusief de benodigde consumer-migratie voor partial unique index en CHECK constraint die Prisma DSL niet kan uitdrukken.

# Verdict: APPROVED Geen gekoppeld plan gevonden — beoordeeld op codekwaliteit + product-standaarden. ## Findings - Geen blokkerende findings. De wijziging voegt alleen canonieke Prisma schema-definities toe in `scrum4me-shared`, wat overeenkomt met de productdocs: dit repo is de single source of truth voor schema en consumers verzorgen migraties. De nullable `repo_key`/global-scope randvoorwaarde is expliciet gedocumenteerd bij het model, inclusief de benodigde consumer-migratie voor partial unique index en CHECK constraint die Prisma DSL niet kan uitdrukken.
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
janpeter/scrum4me-shared!50
No description provided.