You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
A1.1 Convert ProcessMiningDashboard to type: "dashboard": declare config.widgets (KPI tiles, dwell-time bar chart, weekly throughput line chart, bottleneck ranking) + config.layout.
A1.2 Move its header/subtitle and the period NcActions control out of the component and onto the page declaration.
A2.1 Convert TermijnDashboard to type: "dashboard" with KPI-card and report-table widgets.
A2.2 Move its case-type filter and refresh control onto the page declaration.
A3.1 Unnest /doorlooptijd: split DoorlooptijdDashboard.vue so the page supplies the <h2> and filters and the widgets supply only content.
A3.2 Replace its single 12x12 widget with the real widget/layout set.
A4.1 Check all three against ADR-062 grid discipline; delete the per-page <style scoped> rules the shared grid now supplies.
A4.2 hydra-gate-dashboard-antipattern — asserted in-repo across all four dashboard pages: no single 12x12 widget, >=2 layout entries each, every custom widget has a slot. Gate itself runs in CI.
B1.1 Delete the ProcestConfiguration page (route /settings) and its section-admin slot from src/manifest.json.
B1.2 Unregister AdminRootView from src/customComponents.js and src/registry.js.
B1.3 hydra-gate-admin-router — the in-app admin route is gone; asserted no manifest page mounts an admin component. Gate itself runs in CI.
B2.1 Remove both ProcestConfiguration menu entries (order 95 "Case types", order 99 "Configuration"); add one settings-foldout link per ADR-044.
B3.1 Render TenantOnboardingDashboard.vue as a section/tab inside AdminRoot.vue.
B3.2 Delete the /tenant-onboarding page and its menu entry (order 92).
B4.2 Mount SubstitutionSettings.vue there; confirm the self-scope filter is enforced server-side, not only in the query.
B4.3 Delete the /substitution page and its menu entry (order 93). Leave /substitution-admin intact.
B5.1 Confirm the /cases map view covers the locations use-case (design.md Decision 3). If it does not, stop and drop B5 with a reason.
B5.2 Delete the Locations page, the LocationDetail route and the menu entry (order 98). Leave the location schema and the case-detail linkage untouched.
C1.1 Diff procest's VerwerkingenOverview.vue against OpenRegister's /avg page; list what OR does not yet provide.
C1.2 Land the gaps in OpenRegister (openspec change in that repo). Merge before C1.3.
C1.3 Delete /verwerkingen, its menu entry and VerwerkingenOverview.vue from procest.
C2.1 Inventoried. OR registers 19 nodes and every one is control-flow or data — none acts outward, so the six procest actions are CONTRIBUTED as nodes (procest.<type>) via RegisterFlowNodesEvent, the seam FlowNodeRegistry exists for and hermiq already uses. No OpenRegister-side change needed.
C2.1b Port SideEffectDispatcher to run step actions through OR's flow runner (full port, per the 2026-08-22 decision) instead of the private ActionRegistry.
C2.2 Repair step rewriting every ActionRef in caseType.workflowSteps (automaticActions, config.autoActions, config.escalationRule) to its procest.<type> node id. Idempotent, non-fatal. 9 references in the shipped seed alone.
C2.3 Delete /settings/automatic-actions, /settings/automatic-actions/:id, their menu entry and the backing controller/service from procest.
D1.1 Wait for consume-decidesk-besluitvorming-leaf to merge — it deliberately keeps the two besluitvorming routes alive.
D1.2 Map procest's agenda-compiler and vergadering-detail onto decidesk's /agenda-items and /meetings; land the gaps in decidesk. Merge before D1.3.
D1.3 Delete /besluitvorming/agenda, /besluitvorming/vergaderingen/:id, AgendaCompilerView.vue, VergaderingDetailView.vue and src/manifest.d/50-besluitvorming.json.
D2.1 Map bezwaaradviescommissie onto decidesk's governance-body; land it in decidesk. Merge before D2.2.
D2.2 Delete /settings/bezwaar-committees, /settings/bezwaar-committees/:id and their menu entry.
D3.1 Map parafeerroute onto decidesk's routed-document/approval model; land it in decidesk. Merge before D3.2.
D3.2 Delete /settings/parafeerroutes, /settings/parafeerroutes/:id and their menu entry.
D4.1 Verify the case-detail leaf is render-and-read only (ADR-066): no verb, no command. Anything procest needs decidesk to do travels as a typed event (ADR-041).
E1.1 Diffed. Hermiq's Approval is a GATE (blocking, pre-action); procest's aiAuditEntry is retrospective evidence (what the model proposed, what the human did). AiFeature registers that human intervention exists (Art. 49); neither records the per-decision evidence (Art. 14). Real gap, not a duplicate.
E1.2 Landed in hermiq (PR Eliminate type:custom pages — push to Tier-4 / ADR-024 #514): Approval.sourceType gains advisory, status gains overridden, plus advisoryContext, a typed AiOversightRecordedEvent, its listener/service, and an /ai-oversight surface. Merge before E1.3.
E1.3 Deleted /settings/ai-oversight, /settings/ai-oversight/:id and the menu entry; added a deeplink to hermiq. AiAuditService now delegates each decision; MigrateAiOversightToHermiq replays the existing ones.
F1 Rewrite affected e2e specs to assert each retired page is absent, not deleted (the retire-status-history-page precedent).
F2 Add e2e coverage for the three dashboards asserting one page heading and a multi-widget grid.
F3 Add e2e coverage for substitution under personal settings and tenant-onboarding under admin settings.
F4 npm run test:e2e green.
G1 USE_LOCAL_LIB=false npm run build compiles.
G2 composer check:strict passes.
G3 ./scripts/run-hydra-gates.sh . — no new findings.
Artifacts
Specs
Tasks
ProcessMiningDashboardtotype: "dashboard": declareconfig.widgets(KPI tiles, dwell-time bar chart, weekly throughput line chart, bottleneck ranking) +config.layout.NcActionscontrol out of the component and onto the page declaration.TermijnDashboardtotype: "dashboard"with KPI-card and report-table widgets./doorlooptijd: splitDoorlooptijdDashboard.vueso the page supplies the<h2>and filters and the widgets supply only content.<style scoped>rules the shared grid now supplies.hydra-gate-dashboard-antipattern— asserted in-repo across all four dashboard pages: no single 12x12 widget, >=2 layout entries each, every custom widget has a slot. Gate itself runs in CI.ProcestConfigurationpage (route/settings) and itssection-adminslot fromsrc/manifest.json.AdminRootViewfromsrc/customComponents.jsandsrc/registry.js.hydra-gate-admin-router— the in-app admin route is gone; asserted no manifest page mounts an admin component. Gate itself runs in CI.ProcestConfigurationmenu entries (order 95 "Case types", order 99 "Configuration"); add one settings-foldout link per ADR-044.TenantOnboardingDashboard.vueas a section/tab insideAdminRoot.vue./tenant-onboardingpage and its menu entry (order 92).<personal>registration +lib/Settings/PersonalSettings.php+templates/settings/personal.php+ aprocest-personal-settingswebpack entry.SubstitutionSettings.vuethere; confirm the self-scope filter is enforced server-side, not only in the query./substitutionpage and its menu entry (order 93). Leave/substitution-adminintact./casesmap view covers the locations use-case (design.md Decision 3). If it does not, stop and drop B5 with a reason.Locationspage, theLocationDetailroute and the menu entry (order 98). Leave thelocationschema and the case-detail linkage untouched.VerwerkingenOverview.vueagainst OpenRegister's/avgpage; list what OR does not yet provide./verwerkingen, its menu entry andVerwerkingenOverview.vuefrom procest.procest.<type>) viaRegisterFlowNodesEvent, the seamFlowNodeRegistryexists for and hermiq already uses. No OpenRegister-side change needed.SideEffectDispatcherto run step actions through OR's flow runner (full port, per the 2026-08-22 decision) instead of the private ActionRegistry.ActionRefincaseType.workflowSteps(automaticActions,config.autoActions,config.escalationRule) to itsprocest.<type>node id. Idempotent, non-fatal. 9 references in the shipped seed alone./settings/automatic-actions,/settings/automatic-actions/:id, their menu entry and the backing controller/service from procest.consume-decidesk-besluitvorming-leafto merge — it deliberately keeps the two besluitvorming routes alive./agenda-itemsand/meetings; land the gaps in decidesk. Merge before D1.3./besluitvorming/agenda,/besluitvorming/vergaderingen/:id,AgendaCompilerView.vue,VergaderingDetailView.vueandsrc/manifest.d/50-besluitvorming.json.bezwaaradviescommissieonto decidesk'sgovernance-body; land it in decidesk. Merge before D2.2./settings/bezwaar-committees,/settings/bezwaar-committees/:idand their menu entry.parafeerrouteonto decidesk's routed-document/approval model; land it in decidesk. Merge before D3.2./settings/parafeerroutes,/settings/parafeerroutes/:idand their menu entry.Approvalis a GATE (blocking, pre-action); procest'saiAuditEntryis retrospective evidence (what the model proposed, what the human did).AiFeatureregisters that human intervention exists (Art. 49); neither records the per-decision evidence (Art. 14). Real gap, not a duplicate.Approval.sourceTypegainsadvisory,statusgainsoverridden, plusadvisoryContext, a typedAiOversightRecordedEvent, its listener/service, and an/ai-oversightsurface. Merge before E1.3./settings/ai-oversight,/settings/ai-oversight/:idand the menu entry; added a deeplink to hermiq.AiAuditServicenow delegates each decision;MigrateAiOversightToHermiqreplays the existing ones.retire-status-history-pageprecedent).npm run test:e2egreen.USE_LOCAL_LIB=false npm run buildcompiles.composer check:strictpasses../scripts/run-hydra-gates.sh .— no new findings.openspec validate page-topology-cleanuppasses.Design
See design.md for technical design details.
Synced from
openspec/changes/page-topology-cleanupby OpenSpec workflowApp:
dossiq