the-custodian/docs/business-platform-decision-records.md
codex b26ffc10ef
Some checks failed
CI Smoke / host-smoke (push) Successful in 1s
CI Smoke / container-smoke (push) Has been cancelled
CUST-WP-0058: DR-1/2/3 resolved — consistency refinement, plan activated
DR-1: C (instance-per-client, early cost-optimization move)
DR-2: B (coulomb.social standalone app; Binky Hedgehog as client #1)
DR-3: A (app-local accounts; demand-gated NK-WP-0011 triggers)

Refinements: consolidation-ready data model required by the service
contract; coulomb.social auto-trigger for Keycloak retired in favor of
three demand triggers. T01-T03 done (NetKingdom notified), T04/T05
unblocked, workplan active.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-10 01:11:04 +02:00

191 lines
9.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Business Platform Decision Records
**Created:** 2026-07-10
**Workplan:** `CUST-WP-0058`
**Status:** All three decisions **resolved** by Bernd on 2026-07-10 (hub
decision records `d85cd185…`, `1f8b109e…`, `ebcf0573…`). See *Resolutions and
consistency refinement* at the end; the option tables below are kept as
decision history.
## Context
Binky Hedgehog GmbH intends to build commercial business applications on the
coulomb/HelixForge platform (Forgejo → railiance-forge → railiance-apps →
Core Hub ecosystem):
1. **vergabe-teilnahme** — tender-participation web app as the first
commercial offering for business clients.
2. **coulomb.social rebuild** — replace the current bubble.io implementation
as the second business project.
The hub-ecosystem review (2026-07-09, see `hub-ecosystem-architecture.md`)
concluded the architecture is sound but three decisions gate the business
lane. Each is recorded here with options and a recommendation; resolution
happens via State Hub decision records (`resolve_decision`).
---
## DR-1 — Tenancy model for vergabe-teilnahme
**Status:** resolved 2026-07-10 — **Option C** (hybrid)
### Question
How are business clients isolated: one deployed instance per client, or one
multi-tenant instance?
### Options
| Option | Description | Consequences |
| --- | --- | --- |
| **A. Instance-per-client** | Each client gets a dedicated deployment (own DB, own release values in `railiance-apps`) | Strong isolation; simpler compliance story; per-client backup/restore; matches vergabe-teilnahme SCOPE ("no multi-tenancy"); ops-hub must model *client instances*; fin-hub needs per-instance cost attribution; N instances = N upgrade operations |
| **B. Multi-tenant single instance** | One deployment, tenant column / row-level isolation | Cheaper to operate at scale; contradicts current SCOPE; requires tenancy rework in the app; single blast radius for incidents and data-protection failures |
| **C. Hybrid (A now, B later)** | Start instance-per-client; revisit at a client-count threshold | Defers rework until demand proves it; risk of never consolidating |
### Recommendation
**Option A (instance-per-client) for v1**, with an explicit revisit trigger
(e.g. >5 paying clients or upgrade toil exceeding one operator-day/month).
It matches the app's current SCOPE, the railiance-apps per-app values
pattern, and gives the cleanest early compliance/data-protection story for
German business clients.
### Downstream effects once resolved
- ops-hub: add client-instance entity (environment × client mapping)
- fin-hub: per-instance cost attribution keys
- Business-app service contract (CUST-WP-0058-T04): codify instance
provisioning/backup/upgrade obligations
---
## DR-2 — coulomb.social rebuild architecture
**Status:** resolved 2026-07-10 — **Option B** (standalone application)
### Question
Is the coulomb.social rebuild a **Core Hub extension** (hubs/widgets/
manifests, ops-hub pattern) or a **standalone application** (vergabe-
teilnahme pattern)?
### Options
| Option | Description | Consequences |
| --- | --- | --- |
| **A. Core Hub extension** | Built on `/api/v2` framework: hubs, widgets, manifests, interaction events | Reuses production framework already at `hub.coulomb.social`; interaction-platform semantics fit; couples product evolution to core-hub framework maturity; framework gaps become product blockers |
| **B. Standalone app** | Own service repo, own DB, deployed via forge→apps lane like vergabe-teilnahme | Full product freedom; no framework coupling; duplicates interaction/identity plumbing core-hub already has; two social-ish surfaces to keep coherent |
| **C. Defer until after the vergabe-teilnahme pilot** | Run the delivery-lane pilot first; decide with evidence | Costs calendar time; decision made with real platform evidence instead of speculation |
### Recommendation
**Option C, with a leaning toward A.** The delivery-lane pilot
(CUST-WP-0058-T07) will expose whether the forge→apps path and Core Hub
framework are mature enough to host a client-facing interaction product.
Deciding now would be speculation; the bubble.io exit additionally needs a
separately-scoped **data migration** assessment regardless of which shape
wins.
### Downstream effects once resolved
- A → core-hub gains its first external-product extension; widget/manifest
contract hardening becomes product-critical
- B → second entry in the business-app service contract; shared identity
becomes the only coupling point
- Either → bubble.io data-export/migration workplan in the owning repo
---
## DR-3 — External identity path for business clients
**Status:** resolved 2026-07-10 — **Option A** (app-local accounts), demand-gated follow-up
### Question
What identity stack serves *external* users (client employees, later
coulomb.social members): the current lightweight internal stack
(KeyCape/Authelia/LLDAP) or the proposed expanded-mode Keycloak lane
(`NK-WP-0011`)?
### Options
| Option | Description | Consequences |
| --- | --- | --- |
| **A. Lightweight stack, app-local accounts for v1** | vergabe-teilnahme manages its own user accounts per instance; platform identity stays internal | Fastest to ship; consistent with instance-per-client isolation; no SSO story; identity debt accrues per app |
| **B. Activate NK-WP-0011 (Keycloak expanded mode) now** | Platform-level OIDC for external users before first client onboarding | One identity story from day one; enterprise federation ready; heavyweight — delays first client; NK-WP-0011 is only *proposed* |
| **C. Trigger-based: A for vergabe-teilnahme v1, B gated on defined triggers** | Define explicit conditions that activate the Keycloak lane (e.g. coulomb.social greenlight, first client requesting SSO/AD federation, >2 apps with local accounts) | Ships v1 fast without pretending identity debt doesn't exist; triggers make the debt visible and bounded |
### Recommendation
**Option C.** Vergabe-teilnahme v1 explicitly excludes external partner
accounts and is instance-per-client, so app-local auth is defensible *for
that app*. coulomb.social is the forcing function: any resolution of DR-2
that greenlights the rebuild should automatically activate the NK-WP-0011
lane, because a social platform on app-local accounts is not viable.
### Downstream effects once resolved
- NetKingdom: NK-WP-0011 gets concrete activation triggers instead of
indefinite "proposed" status
- Business-app service contract: identity section states which mode each
app class must use
---
## Resolutions and consistency refinement (2026-07-10)
All three decisions were resolved by Bernd in the State Hub on 2026-07-10.
The resolved set was then reviewed for internal consistency; two refinements
follow from reading the three choices together.
### Resolved set
| DR | Choice | Bernd's rationale (hub record) |
| --- | --- | --- |
| DR-1 | **C — hybrid** | Instance-per-client to serve early customers easily, but "move on to resource cost optimization early" |
| DR-2 | **B — standalone app** | coulomb.social is its own application, distinct in purpose and operations model; an application *of* Binky Hedgehog GmbH just as other apps are provided to clients; the fact that Binky Hedgehog provides the ecosystem (coulomb domain, Forgejo repos) is not relevant to the app itself |
| DR-3 | **A — app-local accounts** | Lightweight version now; follow up with Keycloak (NK-WP-0011) only on actual demand |
### Unifying model
**Binky Hedgehog GmbH is client #1 of its own platform.** coulomb.social is
delivered through the same standalone-app lane, service contract, and tenancy
rules as apps sold to external clients. There is exactly one app shape
(standalone service, forge→apps delivery) and one tenancy default
(instance-per-client) — no special cases.
### Refinement 1 — consolidation-readiness (DR-1 C ↔ DR-3 A)
DR-1's early cost-optimization move implies consolidating instances later,
which app-local accounts per instance would turn into an account-migration
problem. Therefore:
- The business-app service contract (CUST-WP-0058-T04) **must require
consolidation-ready design**: tenant-clean data model (all client data
keyed by a tenant identifier) even when deployed single-tenant.
- **Instance consolidation is itself a DR-3 demand trigger**: when the
cost-optimization move consolidates instances, the platform-identity
follow-up (NK-WP-0011) activates as part of that move.
### Refinement 2 — identity triggers corrected (DR-2 B ↔ DR-3 A)
The original DR-3 framing made a coulomb.social greenlight an automatic
Keycloak trigger. DR-2 B + DR-3 A overrule this: a standalone social app
owning its own user accounts is a normal, viable shape. The corrected,
purely demand-based triggers for activating NK-WP-0011 are:
1. A client requests SSO / AD federation.
2. Instance consolidation under DR-1's cost-optimization move (Refinement 1).
3. Operational toil from local account administration across >2 apps.
### Downstream actions
- T04 service contract: encode instance-per-client provisioning,
consolidation-ready data model, app-local identity baseline.
- T05 client-hub scoping: client↔instance mapping assumes 1..n instances per
client, consolidation-aware.
- NetKingdom lane notified: NK-WP-0011 stays proposed with the three triggers
above (no auto-activation).
- coulomb.social rebuild + bubble.io migration assessment: seeded as
standalone-app workplan skeletons (T08), consuming the same delivery lane
as vergabe-teilnahme.