Skip to content

feat: apply declarative cores of 20 market-gap changes (register fragments + manifest pages + seed)#348

Merged
rubenvdlinde merged 8 commits into
developmentfrom
feat/apply-toezeggingen-ingekomen-stukken
Jul 18, 2026
Merged

feat: apply declarative cores of 20 market-gap changes (register fragments + manifest pages + seed)#348
rubenvdlinde merged 8 commits into
developmentfrom
feat/apply-toezeggingen-ingekomen-stukken

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Summary

Applies the declarative cores (register schemas + seed data + manifest-v2 pages) of 20 of the 25 market-gap changes from the 2026-07-16/17 Decidesk deep-dive, plus the register fixes they surfaced. All fragments are openspec validate-clean and Ajv-clean; 13 were live-imported and UI-validated on 8080 (schemas + seed data render, ~20 new menu entries, 0 console errors).

This is the declarative core only — the imperative Tasks 5–8 (PHP services, controllers, routes, e2e) of each change remain follow-ups, as do 5 changes not yet applied (inspreekrecht-plenair, which depends on the unlanded commissievergaderingen change, and the 4 external-dependency changes: records-management/openregister, meeting-pack/docudesk, document-annotations/pdfjs, document-accessibility/PDF-parser).

What's included

Register fixes (real bugs / OR-import compatibility):

  • Decision union types → OR-supported nullable (the schema failed every import; also landed standalone as fix(register): Decision schema union types → OR-supported nullable (Decision couldn't re-import) #347).
  • allOf/anyOf removed from delegatie — OR treats a schema's allOf as parent inheritance → TypeError that aborts the whole import.
  • _note removed from authorization blocks (3 schemas) — OR's authorization accepts only create/read/update/delete.
  • x-openregister-relations/-aggregations/-calculations removed from 3 batch-3 fragments — these are the imperative-materialised tail, not declarative-core, and abort the import.
  • GovernanceBody.bodyType gains advisory-body / works-council / shared-body.

Applied cores (register.d fragments 45–65 + src/manifest.d/ + seed):*

  • Live + validated (13): toezeggingen-ingekomen-stukken, constituency-consultation, termijnagenda, raadsinformatiebrieven, delegatie-mandaatregister, appointments-and-terms, interests-and-integrity, works-council-consultation, vragenuur-interpellatie, pc-cyclus, verordeningenregister, governing-documents-register (+additive Decision.citesGoverningDocuments), advisory-opinion-workflow.
  • Written + validated (7), import currently blocked by an unrelated OpenRegister runtime breakage from a concurrent session: urgent-decision-procedure (additive Decision/Meeting/ProcessTemplate deltas), shared-governance-bodies (+Membership.namens), vve-alv-pack, woo-diwoo-publication, member-onboarding, member-proxy-authorization (+Vote/ProcessTemplate deltas), embargo-geheimhouding. Fragments are on disk and will import on the first successful run once OR recovers.

Additive deltas to existing schemas are add-only + version-bumped (deep-merge unions them; verified the merged Decision keeps all 43 original properties + the new ones).

Known follow-ups (tracked)

  • openregister#2027 — dashboard stat-widget count ignores multi-value filters (KPI D6 fallback in place).
  • Imperative Tasks 5–8 for every change; 5 changes not yet applied (above).
  • Menu-order collisions in the 55/71–75 band (cosmetic; entries render).
  • Detail-page relation refs stored as slugs don't resolve (pre-existing app-wide; adopt @ref: seed tokens as a follow-up).

🤖 Generated with Claude Code

…s, KPI

Pilot of the toezeggingen-ingekomen-stukken change: register fragment (both
schemas + canonical lifecycle/notification dialects + publication predicate +
7 seed objects), manifest.d fragment (4 pages + menu), and Dashboard KPI
widget. Live-validated on 8080: both index pages render seed data, detail
page renders, menu + KPI widget present.

Known findings (for finish-work, Tasks 5-8 not yet implemented):
- Detail relation refs stored as slugs/nil-UUID 404 on resolution (seed refs
  need resolved UUIDs or relation config adjustment).
- Dashboard KPI count shows raw schema total (3), not the filtered overdue
  count (2) — the declarative stat-widget does not apply the @now relative
  token / multi-value lifecycle filter (design D6 open question, confirmed
  live). The D6 fallback must be implemented, not assumed.
…lti-value aggregation limitation

Live network trace: the stat-widget count endpoint honors only scalar-equality
filters. Bare-array lifecycle is ignored (raw count 3); the documented in
operator returns 0. Root cause is OpenRegister's AggregationRunner filter→SQL
path (under active change by a parallel session). Kept the correct-intent
in-operator form (will read 2 once OR handles multi-value); note documents the
limitation + interim options accurately (no false 'verified' claim).
Declarative core (register fragment + manifest.d pages + seed) for:
constituency-consultation(48,2), termijnagenda(50,1), raadsinformatiebrieven(51,2),
delegatie-mandaatregister(54,1), appointments-and-terms(61,4), interests-and-integrity(62,3).
No base-manifest KPI (OR agg multi-value limitation, or#2027), no imperative
Tasks 5-8. All fragments openspec-valid + manifest-valid. Conditional-required/
anyOf and per-body notification routing flagged in-file for save-time enforcement.
…chema inheritance

The Bevoegdheidstoedeling schema used allOf:[{anyOf:...},{anyOf:...}] for a
JSON-Schema at-least-one-of validation rule. OpenRegister interprets a schema's
allOf as PARENT-SCHEMA INHERITANCE (SchemaMapper::extractAllOfDelta →
loadSchema(parentRef)), so it passed the anyOf array to loadSchema(string|int)
→ TypeError. Because a TypeError is a \Error (not \Exception), it escaped the
importer's per-schema catch(\Exception) and ABORTED the whole register import
(fragments 48/50/51 landed; 54/61/62 never processed). Removed the composition;
the at-least-one-of rule is save-time enforcement (as the toezeggingen pilot
does). Import now succeeds; all 13 batch-1 schemas land.
…ype enum

works-council-consultation(47,1), vragenuur-interpellatie(49,3), pc-cyclus(52,3),
verordeningenregister(53,3), governing-documents-register(55,2 + Decision additive
citesGoverningDocuments), advisory-opinion-workflow(60,2). All grep-verified zero
allOf/anyOf/oneOf + zero union types. Base GovernanceBody.bodyType gains
advisory-body/works-council/shared-body (used by advisory + works-council seeds).
OpenRegister's schema authorization block accepts ONLY action keys
(create/read/update/delete). Regeling/RegelingVersie/GoverningDocument had a
descriptive _note inside authorization → 'Invalid authorization action _note'
→ those 3 schemas skipped on import (siblings landed). Moved the rationale out;
all 14 batch-2 schemas now import. (_note IS allowed in lifecycle/notifications
blocks, just not in authorization.)
urgent-decision-procedure(46: Decision/Meeting/ProcessTemplate additive deltas),
shared-governance-bodies(56: 3 new + Membership.namens delta), vve-alv-pack(57: 4),
woo-diwoo-publication(58: 2), member-onboarding(59: 2),
member-proxy-authorization(63: ProxyAuthorization + Vote/ProcessTemplate deltas),
embargo-geheimhouding(65: 2). All grep-verified zero allOf/anyOf/oneOf, zero
_note-in-authorization, zero union types; additive deltas are add-only + version-
bumped. inspreekrecht-plenair deferred (depends on unlanded commissievergaderingen).
…alculations dialects

These dialects appear in NO landed decidesk fragment and are the imperative-
materialised behaviours the designs place OUTSIDE the declarative core. Removed
from urgency-policy (Decision aggregations+calculations), shared-governance-bodies
(3 relations blocks), embargo-geheimhouding (aggregations) to match the proven
lifecycle+notifications+authorization+$ref pattern. (NOTE: the batch-3 import is
separately blocked by an OpenRegister runtime breakage — SystemEntityObjectAdapter
constructor — from a concurrent session; verified by the identical batch1+2 config
also failing now though it imported cleanly earlier.)
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.

2 participants