Repository navigation
Open
Description
Tracks the build of CALM Hub extensions (finos#3396) on feat/3396-extensions in this fork.
Basis
The design is ADRs 0009–0016 (finos#3579, finos#3580, finos#3581), plus the review comments on finos#3580 and finos#3581. This plan assumes that the ADRs take those changes:
- No operator-
trustedsame-originmount.mountis for Hub's own code only. - Deployments is a decorator view, not a bundled
mountextension (CALM Hub UI: show all decorators with one generic view, not type-specific implementations finos/architecture-as-code#3620). - Hub-drawn decorator views are a tier under blocks, declared in a
decorator-viewscontribution. A contribution can have no route (amends ADR 0012). - Reserved decorator types, a
$schemacheck on write, and append-only history for reserved types. designer-tabis for views that a service computes on request.
Way of working
- Each iteration is a small branch from
feat/3396-extensions. It is reviewed, then merged into the feature branch. - Upstream PRs come later, one iteration at a time, in the order below.
- Each iteration includes its tests and docs.
Iterations
| # | Iteration | Area | Needs |
|---|---|---|---|
| I0 | Spike: JWT signing and vertx-json-schema in native, ToolManager with SecurityIdentity, CDI @Decorator on producers, streaming on RESTEasy Classic. Findings, no feature code |
calm-hub | – |
| I1 | Tab registry in DiagramSection. Generic Decorators tab and drawer section (finos#3620) |
calm-hub-ui | – |
| I2 | Manifest schema (with decorator-views and route-less contributions), loader, config, classpath manifests, GET /api/calm/extensions |
calm-hub | – |
| I3 | Reserved decorator types, $schema check on write, append-only history for reserved types (REST and MCP) |
calm-hub | – |
| I4 | Overlay engine. control-evaluation and deployment on it. Remove DeploymentPanel; ?tab=deployments opens the Decorators tab |
calm-hub-ui | I1 |
| I5 | Proxy, identity assertion, JWKS, read-only rule, audit, limits, fixture backend | calm-hub | I2 |
| I6 | Decorator views from the registry. Built-in manifests for the deployment and control-evaluation Standards |
calm-hub, calm-hub-ui | I2, I4 |
| I7 | UI Tier 1: blocks, screen, landing-card, action, block designer-tab, detail-panel |
calm-hub-ui | I1, I2 |
| I8 | CLI: calm hub extensions list, describe, calm hub ext |
cli | I2 |
| I9 | MCP tools from extension commands | calm-hub | I0, I5 |
| I10 | Extension UI layout and scaling: home Extensions section, menu group, one Extensions tab, per-extension panels and overlay toggles | calm-hub-ui | I4, I7 |
| I11 | Reject encoded slashes in extension paths again (ADR 0011); resourceType/resourceId path context |
calm-hub, calm-hub-ui, cli | I5, I7 |
| I12 | Hub-owned creationDateTime/updateDateTime on decorators |
calm-hub, calm-hub-ui | I1, I3 |
| I13 | Docs: tutorial to build and install an extension; reference for every extension point, blocks and decorator views | docs | I11, I12 |
Later, not yet planned in detail: search-provider and chat, the store write seam and outbox (ADR 0016), validation (finos#3399), the iframe tier and a UI CSP, event-subscriber, and the extension author guide.
Progress
- I0 spike (findings recorded; native image not yet run)
- I1 Decorators tab (merged 7831ffe; optional creationDateTime/updateDateTime shown when present, Hub-owned timestamps remain a backend follow-up)
- I2 manifest and registry (merged 1ae0df5)
- I3 decorator trust and history (merged 45ab0da; follow-ups: Mongo supersede integration test, nested $ref startup check, admin delete of reserved history)
- I4 overlay engine (merged 63be057; follow-ups: one failed overlay request stalls the others, legend on narrow screens)
- I5 proxy and identity (merged 506c1b9; encoded slashes in path values permitted; owner decided 2026-11-06 to reject them again per ADR 0011, done in I11; follow-ups: HTTP-level assertion rejection tests across auth profiles, pre-upstream failures not audited, author guidance on strict routing)
- I6 decorator views from the registry (merged 08cc2ea, integrated with I7: one ExtensionService off the shared apiClient; follow-ups: view ids not checked unique across manifests, registry 401 shows a per-slot error rather than the sign-in prompt)
- I7 UI blocks tier (merged 814860a; follow-ups: action feedback, registry loading state)
- I8 CLI (merged 03424e7)
- I9 MCP tools (merged dd8e498; owner decision: extension manifests are trusted operator config, so Hub bounds only caller-controlled cost: 1 MiB arguments, depth, linear-time input patterns via RE2J, scope first; follow-ups: cap validation error size, a few test names describe history, legend collapsible on phones)
- I10 extension UI layout and scaling (merged 388abbc; reviews architecture-as-code-43, -44; follow-ups: collapsible overlay legend on phones, markdown heading styling in screens, focus after 'View all', viewKey tests for edges and groups, details below 304 px wide, very long card labels; plus the owner's STRIDE threat-model demo extension beside release-tracker, merged 1c4958a, reviews -51, -53)
- I11 reject encoded slashes again (merged 5827c79; review architecture-as-code-48; the upstream PR title must release the CLI, e.g. feat(cli), since upstream squash-merges; follow-ups: docs say 400 where a read-only write gets 405, Unicode slash look-alikes pass through, tabs with an unfillable placeholder show an error instead of hiding, matrix params dropped silently)
- I12 Hub-owned decorator timestamps (merged 67aaeeb; review architecture-as-code-49; follow-ups: the UI JSON view shows the times so a copy-paste into a PUT fails, legacy decorators updated in place get only updateDateTime, no real-Mongo test, OpenAPI does not list the 400s)
- I13 extension docs: tutorial and extension point reference (merged fb55bd3; reviews architecture-as-code-52, -54; follow-ups: precision notes in reports -52 and -54, the calm-cli/hub.md 502 note, Docker steps not run in the sandbox)
Metadata
Metadata
Assignees
Labels
No labels
Activity
Merge I3: reserved decorator types, schema check and history (#33)
Merge I1: diagram tab registry and generic Decorators view (#33)
Merge I2: extension manifest, registry and list endpoint (#33)
Merge I8: CLI extension commands (#33)
Merge I4: decorator overlay engine; Deployments as a decorator view (#33
Merge I7: extension UI Tier 1 blocks (#33)
chore(calm-hub): merge I5 extension proxy, identity assertion and JWKS (
chore(calm-hub-ui): merge I6 decorator views from the extension regis…
chore(calm-hub): merge I9 MCP tools from extension commands (#33)
chore(calm-hub-ui): merge I10 extension UI layout and scaling (#33)
chore(calm-hub): merge I12 Hub-owned decorator timestamps (#33)
chore(calm-hub): merge I11 encoded slashes rejected in extension paths (
chore(calm-hub): merge the STRIDE demo extension into the I10 line (#33)
chore(docs): merge I13 extension docs: tutorial and extension point r…