Adopt stage-1 capability cut and product capability model

Persist capability/feature vocabulary, v0 model, and founder stage-1 must set
(onboarding, spaces/pages with Title/Abstract/Visual, page copy and transfer).
Mark CSOC-WP-0001-T03 done; add CSOC-WP-0006 for implementation.
This commit is contained in:
tegwick 2026-08-12 13:09:09 +02:00
parent 2dfb5a0bf2
commit bc78cd27fc
13 changed files with 622 additions and 11 deletions

View file

@ -80,6 +80,8 @@ The rebuild is deliberately **product-faithful first**: UI and content parity ma
- `workplans/CSOC-WP-0001-bubble-io-exit-assessment.md` — Bubble inventory/migration **after** product foundation
- `workplans/CSOC-WP-0005-resource-demand-and-cost-evidence.md`**finished**: demand/SLO/labor evidence for resource-control
- `docs/resource-evidence/` — workload demand forecasts, observations, labor
- `docs/capability/` — product capability/feature model; stage-1 cutover must set
- `docs/decisions/2026-08-12-feature-cut-stage-1.md` — partial rebuild for productive transfer
- `the-custodian/docs/coulomb-social-rebuild-seed.md` — original workplan seed (CUST-WP-0058-T08)
- `the-custodian/canon/standards/business-app-service-contract_v0.1.md`
- NetKingdom: IAM Profile, user-engine boundary, KeyCape/Keycloak modes

View file

@ -7,9 +7,9 @@ exiting the stalled bubble.io product.
apex [`coulomb.social`](https://coulomb.social) remains Bubble until cutover.
**Current state:** identity + app shell + Forgejo-backed spaces on
`app.coulomb.social` (`CSOC-WP-0002``0004` finished). Operator runbook:
`docs/deploy.md`. Bulk Bubble migration deferred (`CSOC-WP-0001`); public
registration Case B waits on NetKingdom (`docs/intakes/csoc-residuals.md`).
`app.coulomb.social`. **Stage-1 cut** (productive transfer): onboarding +
spaces/pages with Title/Abstract/Visual + page copy/transfer —
`docs/capability/`. Operator runbook: `docs/deploy.md`.
## Quick start

View file

@ -73,7 +73,8 @@ coulomb.social connects people around shared projects and complementary capabili
- Content ADR: `docs/adr/ADR-0002-space-content-forgejo-markdown.md`
- Operator: `docs/deploy.md` runbook; residuals `docs/intakes/csoc-residuals.md`
- Finished resource evidence: **`CSOC-WP-0005`** → `docs/resource-evidence/`
- Bubble exit: **`CSOC-WP-0001`** — surface inventory done; export/mapping needs Bubble editor; feature cut is human gate
- Bubble exit: **`CSOC-WP-0001`** — inventory done; stage-1 feature cut accepted (partial rebuild); export still needs Bubble editor
- Capability model: `docs/capability/` — stage 1 must = onboarding + spaces/pages (Title/Abstract/Visual) + page copy/transfer
- Open residuals: public registration (`CSOC-IN-0001`/`0002`, NK-WP-0025)
---

View file

@ -13,9 +13,10 @@
| workplan | CSOC-WP-0003 | finished | — | workplans/CSOC-WP-0003-self-registration-and-assurance.md |
| workplan | CSOC-WP-0004 | finished | — | workplans/CSOC-WP-0004-app-shell-and-space-content.md |
| workplan | CSOC-WP-0005 | finished | — | workplans/CSOC-WP-0005-resource-demand-and-cost-evidence.md |
| workplan | CSOC-WP-0006 | ready | — | workplans/CSOC-WP-0006-stage-1-space-page-capabilities.md |
| task | CSOC-WP-0001-T01 | done | — | workplans/CSOC-WP-0001-bubble-io-exit-assessment.md |
| task | CSOC-WP-0001-T02 | progress | — | workplans/CSOC-WP-0001-bubble-io-exit-assessment.md |
| task | CSOC-WP-0001-T03 | wait | — | workplans/CSOC-WP-0001-bubble-io-exit-assessment.md |
| task | CSOC-WP-0001-T03 | done | — | workplans/CSOC-WP-0001-bubble-io-exit-assessment.md |
| task | CSOC-WP-0001-T04 | wait | — | workplans/CSOC-WP-0001-bubble-io-exit-assessment.md |
| task | CSOC-WP-0002-T01 | done | — | workplans/CSOC-WP-0002-netkingdom-user-management-reestablish.md |
| task | CSOC-WP-0002-T02 | done | — | workplans/CSOC-WP-0002-netkingdom-user-management-reestablish.md |
@ -39,5 +40,11 @@
| task | CSOC-WP-0005-T01 | done | — | workplans/CSOC-WP-0005-resource-demand-and-cost-evidence.md |
| task | CSOC-WP-0005-T02 | done | — | workplans/CSOC-WP-0005-resource-demand-and-cost-evidence.md |
| task | CSOC-WP-0005-T03 | done | — | workplans/CSOC-WP-0005-resource-demand-and-cost-evidence.md |
| task | CSOC-WP-0006-T01 | todo | — | workplans/CSOC-WP-0006-stage-1-space-page-capabilities.md |
| task | CSOC-WP-0006-T02 | todo | — | workplans/CSOC-WP-0006-stage-1-space-page-capabilities.md |
| task | CSOC-WP-0006-T03 | todo | — | workplans/CSOC-WP-0006-stage-1-space-page-capabilities.md |
| task | CSOC-WP-0006-T04 | todo | — | workplans/CSOC-WP-0006-stage-1-space-page-capabilities.md |
| task | CSOC-WP-0006-T05 | todo | — | workplans/CSOC-WP-0006-stage-1-space-page-capabilities.md |
| task | CSOC-WP-0006-T06 | todo | — | workplans/CSOC-WP-0006-stage-1-space-page-capabilities.md |
| intake | CSOC-IN-0001 | open | blue | docs/intakes/csoc-residuals.md |
| intake | CSOC-IN-0002 | open | green | docs/intakes/csoc-residuals.md |

View file

@ -168,11 +168,14 @@ Public meta returned **no** `types`. Expected classes (to confirm on export):
## 10. Priority order for migration (recommended)
1. **Spaces + page bodies** → Forgejo markdown (ADR-0002) — highest product value
2. **Members** → already re-platformed via NetKingdom JIT (no Bubble password import)
3. **Memberships / favorites** → after schema exists
4. **Marketplace / monetization** → human feature cut (T03)
5. **Historical workflow automation** → rewrite in code only if still needed
Aligned with **stage-1 cut** (`docs/capability/stage-1-cutover.md`):
1. **Members** → NetKingdom JIT / assisted transfer (no Bubble passwords)
2. **Spaces + pages** (Title, Abstract, Visual + markdown body) → app metadata + Forgejo
3. **Page copy / transfer** support data as needed
4. **Memberships** beyond tenant-wide defaults
5. **Favorites / marketplace / monetization** → later (not stage 1)
6. **Bubble workflows** → rewrite only if product need returns (`out` for parity)
## Related

13
docs/capability/README.md Normal file
View file

@ -0,0 +1,13 @@
# Capability and feature model — coulomb-social
Product utility and implementation hierarchy for the Bubble exit and rebuild.
**Local first**; extract durable patterns to HelixForge / reuse-surface later.
| Doc | Role |
|-----|------|
| [`vocabulary.md`](vocabulary.md) | Capability vs feature vs toggle rules |
| [`model-v0.yaml`](model-v0.yaml) | Machine-readable capability map |
| [`stage-1-cutover.md`](stage-1-cutover.md) | First productive-transfer stage (must set) |
| [`../decisions/2026-08-12-feature-cut-stage-1.md`](../decisions/2026-08-12-feature-cut-stage-1.md) | Recorded cut decision |
Related: Bubble inventory, ADR-0002, CSOC-WP-0001-T03.

View file

@ -0,0 +1,194 @@
# coulomb-social product capability model v0
# Vocabulary: docs/capability/vocabulary.md
# Stage-1 narrative: docs/capability/stage-1-cutover.md
schema_version: "0.1"
product: coulomb-social
resource_id: "resource:tenant:coulomb:coulomb-social"
updated: "2026-08-12"
stance: |
Partial rebuild is intentional. Stage 1 enables user transfer and retires
Bubble as productive system; Bubble may remain reference-only. Later stages
add use cases on the rebuild.
stages:
stage_1:
id: stage_1_productive_transfer
title: "Productive transfer / Bubble reference-only"
goal: >
Members use app.coulomb.social for onboarding and space/page work with
Title, Abstract, Visual; page copy and transfer. Apex productive use leaves Bubble.
decision_ref: docs/decisions/2026-08-12-feature-cut-stage-1.md
capabilities:
- id: cap.member-onboarding
title: User onboarding
utility: >
A person becomes and remains a signed-in member of the rebuild without
Bubble for day-to-day authentication.
priority: must_stage_1
depends_on_platform:
- netkingdom-oidc
- user-engine
features:
- id: feat.oidc-sign-in
title: OIDC sign-in (existing users)
status: shipped
- id: feat.jit-member
title: First-login JIT Member + user-engine link
status: shipped
- id: feat.session-diagnostics
title: Session / principal diagnostics
status: shipped
- id: feat.public-registration
title: Public Create account + verified mail
status: blocked
blocked_on: "NK-WP-0025 / CSOC-IN-0001"
toggle: NETKINGDOM_REGISTRATION_URL
- id: feat.post-login-app-home
title: Post-login app home (Spaces)
status: shipped
- id: feat.member-transfer-assist
title: Assisted transfer of Bubble members (no password import)
status: todo
- id: cap.space-content
title: Spaces with markdown content
utility: >
Members organize work in spaces and maintain page content as markdown,
with first-class Title, Abstract, and Visual metadata and CRUD.
priority: must_stage_1
depends_on_platform:
- forgejo
- apps-pg
related:
- docs/adr/ADR-0002-space-content-forgejo-markdown.md
features:
- id: feat.space-list
title: List spaces (tenant-scoped)
status: shipped
- id: feat.space-md-render
title: Render space page from Forgejo markdown
status: shipped
- id: feat.space-edit-forgejo
title: Edit body in Forgejo + refresh/webhook
status: shipped
- id: feat.space-crud
title: Space create / read / update / delete-or-archive (member UI)
status: partial
notes: "Model + admin/seed; member-facing CRUD todo"
- id: feat.space-title
title: Space Title field
status: partial
notes: "DB title exists; member edit UI todo"
- id: feat.space-abstract
title: Space Abstract field
status: partial
notes: "Maps to Space.description until product rename"
- id: feat.space-visual
title: Space Visual (cover/image)
status: todo
- id: feat.page-list
title: List pages in a space
status: partial
- id: feat.page-crud
title: Page create / update / delete (product path)
status: partial
notes: "Git/Forgejo only today; product path todo"
- id: feat.page-title
title: Page Title (structured)
status: partial
notes: "Inferred from H1/filename; frontmatter/UI todo"
- id: feat.page-abstract
title: Page Abstract
status: todo
- id: feat.page-visual
title: Page Visual
status: todo
- id: feat.content-fail-closed
title: Fail closed on missing binding/fetch
status: shipped
- id: cap.page-transfer
title: Transfer page to another space
utility: >
A page (and agreed assets) can be moved from one space to another with
correct membership checks and stable identity after the move.
priority: must_stage_1
features:
- id: feat.page-move
title: Move page between spaces
status: todo
- id: feat.page-move-authz
title: Authz for source and destination spaces
status: todo
- id: cap.page-copy
title: Generate copy of page
utility: >
A member can create an independent copy of a page (optionally into
another space) without manual git-only workflow as the sole path.
priority: must_stage_1
features:
- id: feat.page-duplicate
title: Duplicate page (new slug/title)
status: todo
- id: feat.page-duplicate-assets
title: Copy or re-link page assets
status: todo
# --- later stage (not transfer blockers) ---
- id: cap.social-engagement
title: Social engagement (favorites, follows)
utility: Members favorite and follow people or content.
priority: later
features:
- id: feat.favorites
title: Favorites
status: later
- id: cap.marketplace
title: Marketplace matching
utility: Challenges, methods, and solutions discovery/matching.
priority: later
features:
- id: feat.challenges-methods-solutions
title: Challenge / method / solution surfaces
status: later
- id: cap.monetization
title: Monetize curiosity / payments
utility: Paid offerings or monetization flows.
priority: later
features:
- id: feat.payments
title: Payments integration
status: later
- id: cap.realtime-collab
title: Real-time collaborative editing
utility: Multiple members edit the same page concurrently in-app.
priority: later
features:
- id: feat.collab-editor
title: Collaborative in-app editor
status: later
- id: cap.bubble-workflow-parity
title: Bubble workflow automation parity
utility: Like-for-like Bubble backend workflows.
priority: out
notes: >
Rebuild workflows in code only when product need returns; not a parity goal.
platform_dependencies:
- id: netkingdom-oidc
title: NetKingdom OIDC (KeyCape / Authelia)
- id: user-engine
title: user-engine identity link
- id: forgejo
title: Forgejo git hosting for space content
- id: apps-pg
title: Shared application PostgreSQL
- id: railiance-runtime
title: Railiance deploy of coulomb-social

View file

@ -0,0 +1,126 @@
# 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) |
| Date | 2026-08-12 |
| 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.
## 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/` |
| Public Create account + verified mail | partial / blocked | App entry ready; NK mailbox (`CSOC-IN-0001`) |
| Guided first landing on app home | shipped | post-login → Spaces |
| Bulk / assisted member transfer from Bubble | todo | Process + optional import; no password migration |
**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 |
| **Space CRUD** (create/read/update/delete or archive) | partial | Admin/seed today; **member UI CRUD todo** |
| **Title** on space | partial | Model field exists; member edit UI todo |
| **Abstract** on space | partial | Use `description` as abstract until renamed |
| **Visual** on space (cover/image) | todo | Not in model yet |
| Page list within space | partial | path-based pages; richer list todo |
| **Page CRUD** (create/update/delete markdown pages) | partial | Via Forgejo only; in-app or first-class API todo |
| **Title** on page | partial | From H1 / filename; structured frontmatter todo |
| **Abstract** on page | todo | Frontmatter or metadata |
| **Visual** on page | todo | Frontmatter image / assets |
| 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 |
|---------|--------|--------|
| Transfer page to another space | todo | Move markdown (+ assets) + rewrite links; metadata follows |
| Authz (source + destination membership) | todo | |
**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 |
|---------|--------|--------|
| Generate copy of page (same or other space) | todo | New slug/title; independent thereafter |
| Copy assets referenced by page | todo | Or document “copy body only” if scoped |
**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 |
| Forgejo | Markdown SoR |
| Railiance deploy | Host app.coulomb.social |
## Implementation backlog (derived)
Priority order suggested for build work after this decision:
1. Space member CRUD + Title / Abstract edit
2. Visual field (space, then page) + asset storage convention
3. Page metadata (title/abstract/visual) + create/update/delete path
4. Page copy
5. Page transfer
6. Onboarding: transfer cohort process + unstick public registration residual
Bubble export/mapping (CSOC-WP-0001-T02) feeds **content migration** into these
capabilities but does not redefine the must set.
## Open product questions
1. **Visual** — cover image only, or gallery? Max size? Forgejo `assets/` vs object store?
2. **Abstract** — rename `Space.description` → abstract in UI only, or schema rename?
3. **Page body editing** — stage 1 keeps edit-in-Forgejo for body, app forms for Title/Abstract/Visual only? Or in-app markdown editor?
4. **Delete** — hard delete vs archive (`is_active`)?
5. **Transfer cohort** — require public self-registration, or LLDAP bulk invite for stage 1?

View file

@ -0,0 +1,73 @@
# Capability / feature vocabulary (coulomb-social)
Status: **adopted for product work** (2026-08-12)
Promote to fleet canon after one full cutover cycle.
Cites: orthogonal architecture Capability (C1C3, `realizes`); reuse-surface
for *cross-product* reuse only — not product feature flags.
## The coin
| Side | Name | Question |
|------|------|----------|
| **Utility** | **Capability** | What can a person *do* or *get*? Stable job-to-be-done. |
| **Implementation** | **Feature** | Which concrete product slice delivers (part of) that utility? |
Capabilities change slowly. Features appear, split, toggle, and retire under them.
## Hierarchy (depth capped)
```text
Capability
└── Feature+ (implementation slices)
└── Realization (code, config, deploy) — optional detail
└── Toggle? (runtime/config switch on a feature or stage)
```
Rules:
1. **Capabilities: few.** Target ~1030 for all of coulomb.social, not hundreds.
2. **No unlimited trees.** At most capability → optional sub-capability → feature.
3. **One feature, one primary capability.** Cross-links allowed as `supports`, not multi-parent ownership.
4. **Toggles attach to features (or release stages), never to capabilities.**
“Turn off identity” is a product decision, not a flag.
5. **Feature cut = prioritize capabilities**, then name which features are enough to call a capability *realized for that stage*.
6. **Partial rebuild is valid.** Stage N can retire Bubble as *productive* home while Bubble remains *reference-only* for later capabilities.
## Status labels
### Capability priority (cut / roadmap)
| Label | Meaning |
|-------|---------|
| `must_stage_1` | Required before user transfer + Bubble productive retirement |
| `later` | Rebuild after stage 1; not a transfer blocker |
| `out` | Explicitly not rebuilding (or only if strategy changes) |
| `platform` | Delivered by platform dependency (NetKingdom, Forgejo, …) |
### Feature implementation status
| Label | Meaning |
|-------|---------|
| `shipped` | On app.coulomb.social (or ready to enable) |
| `partial` | Exists but missing stage-1 acceptance bits |
| `todo` | Not built; required for its capability stage |
| `later` | Intentionally after stage 1 |
| `blocked` | Waiting on external dependency |
## What not to conflate
| Concept | Home |
|---------|------|
| Product capability (user utility) | This model |
| Fleet reusable capability | reuse-surface registry |
| Platform service (OIDC, Forgejo, apps-pg) | Platform deps; product *depends_on* |
| Feature toggle | Env/settings/flag on a **feature** |
| Workplan task | Execution unit; may implement many features |
## Naming
- Capabilities: `cap.<kebab>` — noun phrase of utility
e.g. `cap.space-content`
- Features: `feat.<kebab>` — verb/noun of implementation
e.g. `feat.space-md-render`
- Prefer stable ids; titles may change.

View file

@ -0,0 +1,65 @@
# Decision: Stage-1 feature cut (productive transfer)
| Field | Value |
|-------|--------|
| Id | CSOC-DEC-2026-001 |
| Date | 2026-08-12 |
| Status | **accepted** (founder direction; refine fields as product details firm up) |
| Owner | bernd |
| Workplan | CSOC-WP-0001-T03 |
| Model | `docs/capability/model-v0.yaml` |
| Narrative | `docs/capability/stage-1-cutover.md` |
## Context
coulomb.social rebuild runs on `app.coulomb.social` in parallel with Bubble on
apex. Full Bubble parity is not required before transfer. We need an explicit
**must** set so implementation and migration do not stall on marketplace-class
scope, and so reductions are intentional.
Discussion baseline: capability = utility, feature = implementation; practice
capability model on coulomb first; HelixForge extraction later.
## Decision
1. **Partial rebuild is the strategy for stage 1.** Transfer users and retire
Bubble as the **productive** system when stage-1 capabilities work. Bubble
may remain as **implementation reference only** (not productive use).
2. **Stage-1 must capabilities:**
- **User onboarding** (`cap.member-onboarding`)
- **Spaces with markdown content and CRUD**, including **Visual, Title,
Abstract** on space/page as product fields (`cap.space-content`)
- **Transfer of pages to other spaces** (`cap.page-transfer`)
- **Generate copy of page** (`cap.page-copy`)
3. **Later use cases** (social, marketplace, monetization, full chrome parity,
etc.) extend the rebuild **after** stage 1; they do not block productive
transfer.
4. **Capability/feature vocabulary and map** live in `docs/capability/` and
guide backlog and toggles. Feature toggles attach to features, not to
capability ids.
## Consequences
- Implementation backlog prioritizes space/page CRUD metadata + copy/move over
marketplace and social graph.
- CSOC-WP-0001 migration/export targets stage-1 content and members first.
- Public registration may complete via NetKingdom residual; transfer cohort may
use provisioned accounts if registration is late (open question in stage-1 doc).
- ADR-0002 remains: page **bodies** markdown in Forgejo; Title/Abstract/Visual
may live in app DB and/or frontmatter — detail in implementation WPs.
## Non-goals (stage 1)
- Rebuild-as-is of all Bubble workflows
- Pixel-perfect Research UI
- In-app real-time collab editor (unless later promoted)
- HelixForge capability-management platform (extract later)
## Open questions
See `docs/capability/stage-1-cutover.md` § Open product questions (Visual
storage, Abstract field naming, body editor UX, delete vs archive, transfer
cohort auth).

View file

@ -82,8 +82,15 @@ checksums only** here when available.
4. `Space` row bind + membership for tegwick.
5. Open on `app.coulomb.social` — record lossiness.
## Stage-1 scope filter
Only map/migrate what **stage-1 capabilities** need first
(`docs/capability/stage-1-cutover.md`): members, spaces, pages (title/abstract/visual
+ body), not marketplace/social unless later promoted.
## Related
- Inventory: `docs/bubble-inventory/2026-08-12-surface-inventory.md`
- Capability cut: `docs/decisions/2026-08-12-feature-cut-stage-1.md`
- ADR-0002: `docs/adr/ADR-0002-space-content-forgejo-markdown.md`
- Spaces models: `coulomb_social/apps/spaces/models.py`

View file

@ -81,7 +81,7 @@ editor/export access for actual type fields and content corpus.
```task
id: CSOC-WP-0001-T03
status: wait
status: done
priority: high
state_hub_task_id: "35a0af87-2f22-4fae-8c82-e3cc4f77f074"
```
@ -90,6 +90,14 @@ Decide rebuild-as-is vs reduced v1 scope. **Human gate — Bernd.** Capture unde
`docs/decisions/`. Gate **apex cutover / bulk migration**, not day-to-day
rebuild work on `app.coulomb.social`.
2026-08-12: **Stage-1 cut accepted** — partial rebuild for productive transfer.
Must: onboarding; spaces/pages markdown CRUD with Visual, Title, Abstract;
page transfer; page copy. Later capabilities after Bubble is reference-only.
Record: `docs/decisions/2026-08-12-feature-cut-stage-1.md`
Model: `docs/capability/` (vocabulary + `model-v0.yaml` + stage-1 narrative).
Open product details (visual storage, editor UX, …) refine without reopening
the must-set unless founder revises the decision.
## Migration rehearsal
```task

View file

@ -0,0 +1,112 @@
---
id: CSOC-WP-0006
type: workplan
title: "Stage-1 space and page capabilities (CRUD, copy, transfer)"
domain: communication
repo: coulomb-social
status: ready
owner: bernd
topic_slug: coulomb-social
created: "2026-08-12"
updated: "2026-08-12"
depends_on:
- CSOC-WP-0004
related:
- CSOC-WP-0001
- CSOC-WP-0003
origin: residual
origin_ref: docs/decisions/2026-08-12-feature-cut-stage-1.md
state_hub_workstream_id: "e92fe627-7ff4-42f6-a294-23b5a723edab"
---
# CSOC-WP-0006 — Stage-1 space and page capabilities
Implement product features required by the **stage-1 productive transfer** cut
(`docs/capability/stage-1-cutover.md`, `docs/capability/model-v0.yaml`).
**Out of scope here:** marketplace, social graph, monetization; Bubble export
(CSOC-WP-0001-T02); public registration platform path (CSOC-IN-0001 / NK).
## T01 — Space member CRUD + Title / Abstract
```task
id: CSOC-WP-0006-T01
status: todo
priority: high
state_hub_task_id: "337baa68-0459-4985-9981-30a6d37f5bf5"
```
Member-facing create / update / archive (or delete) for `Space`. Expose
**Title** and **Abstract** (current `description` field or rename). List and
detail stay tenant-scoped. Tests for authz and isolation.
## T02 — Space and page Visual
```task
id: CSOC-WP-0006-T02
status: todo
priority: high
state_hub_task_id: "1ee74b60-a87d-4aff-91f1-3f97026774a5"
```
Add **Visual** (cover/image) for space and page. Decide storage (Forgejo
`assets/` vs app media) in implementation notes; no secrets in git. Show
visual on list/detail.
## T03 — Page metadata + product CRUD path
```task
id: CSOC-WP-0006-T03
status: todo
priority: high
state_hub_task_id: "fe95438c-2ed1-4efd-b6ea-84966636dbc3"
```
Structured **Title**, **Abstract**, **Visual** for pages; create/update/delete
product path (app UI and/or API) while keeping markdown body SoR per ADR-0002
(Forgejo commit or equivalent). Page list in space.
## T04 — Generate copy of page
```task
id: CSOC-WP-0006-T04
status: todo
priority: high
state_hub_task_id: "98d7428c-1b2f-45f1-b080-a833a4790b69"
```
`feat.page-duplicate`: independent copy with new slug/title; optional target
space; asset handling per stage-1 acceptance.
## T05 — Transfer page to another space
```task
id: CSOC-WP-0006-T05
status: todo
priority: high
state_hub_task_id: "5ec81ff4-1d6f-4c86-8c93-b68b1570cc32"
```
`feat.page-move`: move page (+ agreed assets) with source and destination
authz; no Bubble dependency.
## T06 — Stage-1 smoke and capability model update
```task
id: CSOC-WP-0006-T06
status: todo
priority: medium
state_hub_task_id: "752f52a8-8c18-402c-8f00-bce6c76a1db7"
```
Update `docs/capability/model-v0.yaml` feature statuses as work lands; extend
`docs/identity/smoke.md` / deploy runbook with space CRUD, copy, transfer
checks on app.coulomb.social.
## Acceptance
- [ ] Members can CRUD spaces with Title, Abstract, Visual without Django admin
- [ ] Members can CRUD pages with Title, Abstract, Visual + markdown body path
- [ ] Page copy and page transfer work with membership checks
- [ ] Capability model statuses match reality
- [ ] Stage-1 cut doc open questions resolved or explicitly deferred with owner