Land CSOC-WP-0006 PageOps: member space/page CRUD, copy, transfer

Thin CONTENT_ROOT content plane (ADR-0003/0004) with space visual field,
product UI for Title/Abstract/Visual, page list sidebar, and tests. Update
capability model and smoke checklist; mark WP-0006 finished.
This commit is contained in:
tegwick 2026-08-13 12:46:39 +02:00
parent 00dbb86c93
commit affed64839
24 changed files with 1812 additions and 151 deletions

View file

@ -4,7 +4,7 @@
schema_version: "0.1"
product: coulomb-social
resource_id: "resource:tenant:coulomb:coulomb-social"
updated: "2026-08-12"
updated: "2026-08-13"
stance: |
Partial rebuild is intentional. Stage 1 enables user transfer and retires
Bubble as productive system; Bubble may remain reference-only. Later stages
@ -74,36 +74,38 @@ capabilities:
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"
status: shipped
notes: "Member UI create/edit/archive; DB index + CONTENT_ROOT tree"
- id: feat.space-title
title: Space Title field
status: partial
notes: "DB title exists; member edit UI todo"
status: shipped
- id: feat.space-abstract
title: Space Abstract field
status: partial
notes: "Maps to Space.description until product rename"
status: shipped
notes: "Maps to Space.description (product label Abstract / Abstractor)"
- id: feat.space-visual
title: Space Visual (cover/image)
status: todo
status: shipped
notes: "Path relative to space tree (e.g. assets/cover.jpg); not app media yet"
- id: feat.page-list
title: List pages in a space
status: partial
status: shipped
notes: "Sidebar from CONTENT_ROOT pages/*.md"
- id: feat.page-crud
title: Page create / update / delete (product path)
status: partial
notes: "Git/Forgejo only today; product path todo"
status: shipped
notes: "PageOps on CONTENT_ROOT; Forgejo optional fallback"
- id: feat.page-title
title: Page Title (structured)
status: partial
notes: "Inferred from H1/filename; frontmatter/UI todo"
status: shipped
notes: "Frontmatter title + form; H1 fallback on render"
- id: feat.page-abstract
title: Page Abstractor
status: todo
status: shipped
- id: feat.page-visual
title: Page Visual
status: todo
status: shipped
notes: "Frontmatter path; relative assets copied on page copy"
- id: feat.authoring-top-down
title: Top-down authoring (title → abstractor → outline → body)
status: todo
@ -133,8 +135,8 @@ capabilities:
notes: "markitect explode/implode; ArchitectureBlueprint D4"
- id: feat.content-plane-thin-git
title: Content SoR as directory + markdown files in git
status: todo
notes: "Upgrades to shard-wiki then kontextual supported later"
status: partial
notes: "CONTENT_ROOT PageOps landed (CSOC-WP-0006); git commit/push operator path next"
- id: feat.content-fail-closed
title: Fail closed on missing binding/fetch
status: shipped
@ -148,10 +150,12 @@ capabilities:
features:
- id: feat.page-move
title: Move page between spaces
status: todo
status: shipped
notes: "PageOps transfer; index page cannot move"
- id: feat.page-move-authz
title: Authz for source and destination spaces
status: todo
status: shipped
notes: "spaces_for_member on both ends"
- id: cap.page-copy
title: Generate copy of page
@ -162,10 +166,11 @@ capabilities:
features:
- id: feat.page-duplicate
title: Duplicate page (new slug/title)
status: todo
status: shipped
- id: feat.page-duplicate-assets
title: Copy or re-link page assets
status: todo
status: partial
notes: "Relative visual files under assets/ copied; full asset scan deferred"
# --- later stage (not transfer blockers) ---

View file

@ -64,6 +64,24 @@ kubectl -n coulomb-social exec deploy/coulomb-social -- \
| Session details | profile menu diagnostics (no secrets) |
| Refresh content | re-fetch after git edit (or webhook) |
### Stage-1 PageOps smoke (CSOC-WP-0006) — local / after deploy
Content plane: `CONTENT_ROOT` (default `var/content/`) with
`spaces/<slug>/pages/*.md`. Forgejo binding remains optional fallback.
| Step | Expected |
|------|----------|
| `/app/`**New space** | create with Title, Abstract, Visual → detail |
| Space **Edit** | update Title/Abstract/Visual; index frontmatter stays in sync |
| **New page** | Title/Abstract/Visual + markdown body on content plane |
| Page list sidebar | lists index + pages; switch with `?page=` |
| **Copy** | independent slug/title; optional other destination space |
| **Transfer** | page leaves source space, appears in destination |
| **Delete** (non-index) | page removed; index cannot be deleted |
| **Archive space** | hidden from list; soft-archive tree under `.archived-*` |
| Tenant isolation | other tenant 404 on detail / page mutations |
| `make test` | includes `tests/test_pageops.py`, `tests/test_space_crud.py` |
## Case matrix (CSOC-WP-0003-T04)
| Case | Status |