Skip to content

docs(config): federated configuration sharing — one fleet standard (design)#2132

Closed
rubenvdlinde wants to merge 1 commit into
developmentfrom
design/federated-config-sharing
Closed

docs(config): federated configuration sharing — one fleet standard (design)#2132
rubenvdlinde wants to merge 1 commit into
developmentfrom
design/federated-config-sharing

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

Design-only OpenSpec change (no code) — for review before implementation, like the per-item-routing design.

One OpenRegister-owned standard for any app to publish / discover / install its configuration over GitHub — flows, registers & schemas, OpenBuild apps, procest case types, payroll packs, agents & skills, NL Design themes. Full write-up + fleet inventory + architecture: the design artifact shared with the team.

Why this shape (from a fleet scan)

  • OpenRegister's ConfigurationService is already a generic multi-entity, GitHub-bidirectional bundle (publish + install, version tracking, preview-diff).
  • OpenBuild already built the object→GitHub sync (broker-routed tokens, topic discovery, git-data-API push); hermiq copied it. 10/11 apps store shareable config as OR objects.
  • So this is unify + generalise + democratise, not greenfield — and no openconnector dependency (engine = OR's ConfigurationService + the credential broker).

Decisions captured (from review)

  • Engine: a FederatedConfigService in OpenRegister + an IShareableConfigType registration event (same idiom as flow nodes). Storage-agnostic — app-specific storage works too, so NL Design themes wrap ConfigBundleService with no migration onto OR objects.
  • GitHub credentials in Doriath — custodied by the credential broker's Doriath vault leaf (encrypted, audited, rotatable) per user/org; no shared app token; NC-vault fallback where Doriath is absent.
  • Trust v1 = org allowlist + version pinning + secret exclusion; signing deferred. Sharing is user/org-scoped, not admin-only.
  • Shareable integration network — GitHub-distributed flow integrations, like skills #2065 collapses into one flow-shaped consumer of this.

Contents

proposal.md (problem, solution, consumer table, out-of-scope) · spec.md (5 requirements + scenarios) · tasks.md (6 phases with per-app adoption).

Left open for review — no code until the design is agreed.

🤖 Generated with Claude Code

…esign)

Design-only OpenSpec change (no code). One OpenRegister-owned way for any app to
publish/discover/install its configuration over GitHub — flows, registers &
schemas, OpenBuild apps, procest case types, payroll packs, agents & skills, NL
Design themes.

Grounded in a fleet scan: OpenRegister's ConfigurationService is already a
generic multi-entity, GitHub-bidirectional bundle; OpenBuild already ships the
object->GitHub sync (broker-routed tokens, topic discovery, git-data-API push)
and hermiq copied it. 10/11 apps store shareable config as OR objects. So this
unifies + generalises + democratises what exists rather than building anew — and
needs no openconnector dependency.

Decisions captured (from review):
- Engine = a FederatedConfigService in OpenRegister + an IShareableConfigType
  registration event (same idiom as flow nodes); storage-agnostic so app-specific
  storage works too (NL Design themes wrap ConfigBundleService, no OR-object
  migration).
- GitHub credentials custodied in Doriath (the credential broker's vault leaf,
  encrypted/audited/rotatable) per user/org — no shared app token; NC-vault
  fallback where Doriath is absent.
- Trust v1 = org source allowlist + version pinning + secret exclusion; signing
  deferred. Sharing is user/org-scoped, not admin-only.
- #2065's flow "integration network" becomes one flow-shaped consumer of this.

Contains proposal, spec (5 requirements + scenarios), tasks (6 phases with the
per-app adoption plan). Left open for review before any implementation.
@github-actions

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/openregister @ e3e723a

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
composer ✅ 174/174
npm ✅ 555/555
PHPUnit ⏭️
Newman ⏭️
Playwright ⏭️

Quality workflow — 2026-07-26 07:39 UTC

Download the full PDF report from the workflow artifacts.

@rubenvdlinde

Copy link
Copy Markdown
Contributor Author

Superseded by #2134, which implements the foundation (type registry + engine + Flows consumer + org-allowlist trust + Doriath-broker publish) with unit + Playwright e2e, live-verified. The openspec change is carried in #2134.

@rubenvdlinde
rubenvdlinde deleted the design/federated-config-sharing branch July 26, 2026 08:05
rubenvdlinde added a commit that referenced this pull request Jul 26, 2026
…y + Flows (+ e2e) (#2134)

Builds the foundation of the fleet-wide federated-config standard (design in the
carried openspec change; supersedes the design-only #2132). One OpenRegister-
owned way for any app to share configuration over GitHub; Flows is the first
consumer (the reframed #2065).

- IShareableConfigType + RegisterShareableConfigTypesEvent + registry — the
  contribution seam, same idiom as flow nodes. Storage-agnostic: a type owns
  (de)serialisation, so app-specific storage (e.g. NL Design themes in IConfig)
  works too, not only OR objects.
- FederatedConfigService — the engine: types(), bundle() (serialise a selection),
  install() (deserialise, gated by the org source allowlist), publish() (push to
  GitHub with the token supplied by the credential broker — Doriath's vault where
  installed, NC vault otherwise; the token never enters the service). Trust v1 =
  org allowlist (empty = not-yet-enforced) + version pinning + secret exclusion.
- FlowShareableConfigType — flows as a type: serialise to a portable shape (no
  id/uuid/owner/organisation), install back into the flow store.
- FederatedConfigController + routes (/api/federated-config/types|bundle|install),
  all #[NoCSRFRequired] so API/MCP clients can call them.

Tests: 13 unit (registry event-once, service allowlist enforcement + prefix
match, Flow type round-trip strips instance fields). Playwright e2e
tests/e2e/api-direct/federated-config.spec.ts (4): types include Flows; a flow
bundles → installs as a fresh flow → the installed flow RUNS to completion;
unknown type = 404; the org allowlist refuses a non-allowlisted source (403) and
allows an allowlisted one. phpcs clean. Live-verified on 8080: full round-trip
(bundle a flow → install a fresh one → run it → {shared:true}).

Follow-ups (per the design's phases 4-6): fold hermiq's duplicated GitHub sync
onto this; roll out declared types per app (procest case types, shillinq payroll
packs, opencatalogi publication types, docudesk, softwarecatalog, pipelinq,
larpingapp, NL Design themes); the publish/discover UI; per-org RBAC beyond
admin; signing.
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.

1 participant