2026-08-12 13:09:09 +02:00
|
|
|
# Stage 1 cutover — productive transfer set
|
|
|
|
|
|
|
|
|
|
| Field | Value |
|
|
|
|
|
|-------|--------|
|
|
|
|
|
| Decision | [`../decisions/2026-08-12-feature-cut-stage-1.md`](../decisions/2026-08-12-feature-cut-stage-1.md) |
|
|
|
|
|
| Model | [`model-v0.yaml`](model-v0.yaml) |
|
2026-10-06 09:54:33 +02:00
|
|
|
| Date | Decision: 2026-08-12; checkout status reviewed: 2026-10-06 |
|
2026-08-12 13:09:09 +02:00
|
|
|
| Stance | **Partial rebuild is enough** for transfer; extend with later use cases after Bubble is reference-only |
|
|
|
|
|
|
|
|
|
|
## Goal of stage 1
|
|
|
|
|
|
|
|
|
|
Move members to **`app.coulomb.social`** as the **productive** home and retire
|
|
|
|
|
Bubble on apex as a **productive** system. After transfer:
|
|
|
|
|
|
|
|
|
|
- Bubble may remain online only as an **implementation reference** (read-only /
|
|
|
|
|
archival / comparison), not as the place where new work happens.
|
|
|
|
|
- Additional capabilities (marketplace, social graph, monetization, …) ship
|
|
|
|
|
**later** on the rebuild without blocking transfer.
|
|
|
|
|
|
2026-10-06 09:54:33 +02:00
|
|
|
Implementation statuses below describe this checkout, not fresh live acceptance.
|
|
|
|
|
CSOC-IN-0004 still owns PageOps persistence/deployment smoke; WP-0008 owns
|
|
|
|
|
transfer and recovery acceptance. Public registration has historical 2026-08-14
|
|
|
|
|
Case B evidence (CSOC-IN-0001 closed).
|
|
|
|
|
|
2026-08-12 13:09:09 +02:00
|
|
|
## Must capabilities (stage 1)
|
|
|
|
|
|
|
|
|
|
### 1. User onboarding — `cap.member-onboarding`
|
|
|
|
|
|
|
|
|
|
Members can obtain and use an account on the rebuild without depending on
|
|
|
|
|
Bubble for day-to-day login.
|
|
|
|
|
|
|
|
|
|
| Feature | Status | Notes |
|
|
|
|
|
|---------|--------|--------|
|
|
|
|
|
| OIDC sign-in (existing LLDAP/KeyCape users) | shipped | Case A proven |
|
|
|
|
|
| JIT Member + user-engine link | shipped | |
|
|
|
|
|
| Session / account diagnostics | shipped | `/account/session/` |
|
2026-10-06 09:54:33 +02:00
|
|
|
| Public Create account + verified mail | historically evidenced | CSOC-IN-0001 closed; NK owns mail/registration, recheck at transfer |
|
2026-08-12 13:09:09 +02:00
|
|
|
| Guided first landing on app home | shipped | post-login → Spaces |
|
2026-10-06 09:54:33 +02:00
|
|
|
| Bulk / assisted member transfer from Bubble | partial | Manifest maps existing tenant+issuer+subject members; actual cohort rehearsal pending |
|
2026-08-12 13:09:09 +02:00
|
|
|
|
|
|
|
|
**Stage-1 acceptance:** known operators and community members can sign in;
|
|
|
|
|
new members can register once NK path is live **or** operator-provisioned
|
|
|
|
|
LLDAP accounts cover the transfer cohort. No Bubble password import.
|
|
|
|
|
|
|
|
|
|
### 2. Spaces with markdown content — `cap.space-content`
|
|
|
|
|
|
|
|
|
|
Members work in **spaces** whose durable content is **markdown** (ADR-0002).
|
|
|
|
|
|
|
|
|
|
| Feature | Status | Notes |
|
|
|
|
|
|---------|--------|--------|
|
|
|
|
|
| Space list (tenant-scoped) | shipped | |
|
|
|
|
|
| Space detail + render page from Forgejo | shipped | |
|
|
|
|
|
| Edit in Forgejo + refresh / webhook | shipped | git SoR |
|
2026-10-06 09:54:33 +02:00
|
|
|
| **Space CRUD** (create/read/update/delete or archive) | implemented | Member create/update/archive (WP-0006) |
|
|
|
|
|
| **Title** on space | implemented | Model and member forms |
|
|
|
|
|
| **Abstract** on space | implemented | `description`, product label Abstractor |
|
|
|
|
|
| **Visual** on space (cover/image) | metadata implemented | Relative path; upload/authenticated asset delivery not accepted |
|
|
|
|
|
| Page list within space | implemented | Local pages sidebar |
|
|
|
|
|
| **Page CRUD** (create/update/delete markdown pages) | implemented | In-app metadata/body forms; index deletion prohibited |
|
|
|
|
|
| **Title** on page | implemented | Frontmatter and form |
|
|
|
|
|
| **Abstract** on page | implemented | Frontmatter and form |
|
|
|
|
|
| **Visual** on page | metadata implemented | Relative Visual copied; broader asset pipeline incomplete |
|
2026-08-12 13:09:09 +02:00
|
|
|
| Fail-closed missing binding | shipped | |
|
|
|
|
|
|
|
|
|
|
**Stage-1 acceptance:** members can create and maintain spaces and pages with
|
|
|
|
|
**Title, Abstract, Visual** as first-class fields (not only raw git for metadata),
|
|
|
|
|
content body in markdown, readable on app host. Exact UX (in-app editor vs
|
|
|
|
|
structured form + Forgejo body) can vary; **utility** must not require Bubble.
|
|
|
|
|
|
|
|
|
|
### 3. Move page between spaces — `cap.page-transfer`
|
|
|
|
|
|
|
|
|
|
| Feature | Status | Notes |
|
|
|
|
|
|---------|--------|--------|
|
2026-10-06 09:54:33 +02:00
|
|
|
| Transfer page to another space | implemented with limits | Markdown + Visual asset; arbitrary links/assets are not rewritten |
|
|
|
|
|
| Authz (source + destination membership) | implemented with limits | Tenant/membership visibility; viewer write roles still unenforced |
|
2026-08-12 13:09:09 +02:00
|
|
|
|
|
|
|
|
**Stage-1 acceptance:** a page can leave space A and appear in space B without
|
|
|
|
|
Bubble, with clear ownership after the move.
|
|
|
|
|
|
|
|
|
|
### 4. Duplicate page — `cap.page-copy`
|
|
|
|
|
|
|
|
|
|
| Feature | Status | Notes |
|
|
|
|
|
|---------|--------|--------|
|
2026-10-06 09:54:33 +02:00
|
|
|
| Generate copy of page (same or other space) | implemented | New slug/title; independent thereafter |
|
|
|
|
|
| Copy assets referenced by page | partial | Relative Visual copied; body-linked assets deferred |
|
2026-08-12 13:09:09 +02:00
|
|
|
|
|
|
|
|
**Stage-1 acceptance:** member can produce an independent copy without manual
|
|
|
|
|
git surgery as the only path (operator git escape hatch may exist but is not
|
|
|
|
|
the product path).
|
|
|
|
|
|
|
|
|
|
## Explicitly later (not stage-1 blockers)
|
|
|
|
|
|
|
|
|
|
Examples — full list in `model-v0.yaml`:
|
|
|
|
|
|
|
|
|
|
- Favorites / social graph
|
|
|
|
|
- Marketplace (challenges, methods, solutions)
|
|
|
|
|
- Monetization / payments
|
|
|
|
|
- Full Bubble workflow automation parity
|
|
|
|
|
- Pixel-perfect Research chrome parity
|
|
|
|
|
- In-app collaborative real-time editing
|
|
|
|
|
|
|
|
|
|
## Platform dependencies (not product features)
|
|
|
|
|
|
|
|
|
|
| Dependency | Stage-1 role |
|
|
|
|
|
|------------|----------------|
|
|
|
|
|
| NetKingdom OIDC + (eventually) registration mail | Onboarding |
|
|
|
|
|
| apps-pg | Space/member metadata |
|
2026-10-06 09:54:33 +02:00
|
|
|
| CONTENT_ROOT + optional Forgejo | Local PageOps SoR; Forgejo fallback, no automatic local commit/push |
|
2026-08-12 13:09:09 +02:00
|
|
|
| Railiance deploy | Host app.coulomb.social |
|
|
|
|
|
|
2026-10-06 09:54:33 +02:00
|
|
|
## Current acceptance backlog
|
|
|
|
|
|
|
|
|
|
WP-0006 implemented the member CRUD/metadata/copy/transfer path. WP-0007 added
|
|
|
|
|
validated single/bulk import with explicit membership mapping. Remaining
|
|
|
|
|
acceptance is tracked in WP-0008: persistence/live smoke, paired recovery,
|
|
|
|
|
private cohort reconciliation, access roles/privacy, member portability and
|
|
|
|
|
explicit founder cutover. Later authoring features remain in the machine model.
|
|
|
|
|
|
|
|
|
|
## Resolved choices and remaining product questions
|
|
|
|
|
|
|
|
|
|
- Visual: path metadata and relative-file copying today; upload, serving and
|
|
|
|
|
full body-linked asset fidelity require acceptance work.
|
|
|
|
|
- Abstract: UI uses Abstractor; persisted Space field remains `description`.
|
|
|
|
|
- Body: markdown form implemented; no real-time editor or conflict protocol.
|
|
|
|
|
- Delete: Space archive; page delete except index.
|
|
|
|
|
- Cohort: explicit existing NetKingdom identity mappings; no password import.
|
|
|
|
|
Actual cohort and lossiness acceptance are still required.
|
|
|
|
|
- Content: ADR-0004 thin local directory, optional Forgejo fallback. Git
|
|
|
|
|
automation, authoring projections, live includes and outline operations remain
|
|
|
|
|
future work, not prerequisites silently added to the accepted cut.
|