Add import_content_tree management command and import_tree helper for ADR-0004 sample trees. Document reichelag rehearsal lossiness; mark T02/T04 and the bubble exit workplan finished.
78 lines
3.3 KiB
Markdown
78 lines
3.3 KiB
Markdown
# Migration rehearsal — reichelag sample (2026-08-13)
|
|
|
|
| Field | Value |
|
|
|-------|--------|
|
|
| Workplan | CSOC-WP-0001-T04 |
|
|
| Depends on | CSOC-WP-0006 PageOps landing pad |
|
|
| Source (local only) | `~/.config/coulomb-social/auth/exports/corpus-202608131015057/trees/reichelag/` |
|
|
| Destination | `CONTENT_ROOT/spaces/reichelag/` (local; not committed) |
|
|
| Command | `manage.py import_content_tree` |
|
|
|
|
**Do not commit** source trees or imported content — private business notes.
|
|
|
|
## Command
|
|
|
|
```bash
|
|
export CONTENT_ROOT="$PWD/var/content-rehearsal" # or default var/content
|
|
uv run python manage.py migrate
|
|
# sign-in once or ensure a Member exists for --member-subject
|
|
uv run python manage.py import_content_tree \
|
|
~/.config/coulomb-social/auth/exports/corpus-202608131015057/trees/reichelag \
|
|
--tenant tenant:coulomb \
|
|
--member-subject <your-oidc-subject> \
|
|
--replace
|
|
```
|
|
|
|
Dry-run:
|
|
|
|
```bash
|
|
uv run python manage.py import_content_tree PATH/TO/tree --dry-run
|
|
```
|
|
|
|
## Result (this run)
|
|
|
|
| Metric | Value |
|
|
|--------|------:|
|
|
| Pages copied | 30 (1 index + 29 articles) |
|
|
| Assets copied | 29 (logo/visual images) |
|
|
| Space row | Created `reichelag` title **ReichelAG** |
|
|
| Render path | `load_space_page` → `source=content-plane` |
|
|
| Index title | ReichelAG |
|
|
| Sample page | frontmatter title + markdown body render OK |
|
|
| Visual files | Present under `assets/` for pages that declare them |
|
|
|
|
## Lossiness and residuals
|
|
|
|
| Gap | Severity | Note |
|
|
|-----|----------|------|
|
|
| Bubble `Slug` vs export slug | low | Bubble space slug was `new-space-36`; export/tree uses friendly `reichelag` |
|
|
| Space display title | medium | Not first-class on `custom.space`; taken from index frontmatter / guess |
|
|
| Membership list | medium | Only local owner from `--member-subject`; Bubble `members_list_user` not mapped to NetKingdom |
|
|
| Parent/article graph | medium | Frontmatter `parent` kept as opaque bubble id; no outline/include graph yet |
|
|
| Full corpus coverage | high | Only **one** dense sample tree; 70 other spaces not imported; many spaces have incomplete article dumps |
|
|
| Chunk / Research UI | deferred | Bubble `pg_chunk` / Research surfaces not in tree |
|
|
| Workflows / privacy flags | deferred | `isprivate_boolean` not enforced in rebuild authz beyond tenant membership |
|
|
| Identity | blocked elsewhere | Member transfer assist / public registration (CSOC-IN-0001) |
|
|
| Production path | deferred | Rehearsal is local `CONTENT_ROOT`; cluster import needs operator CONTENT_ROOT volume + tenant choice |
|
|
|
|
## What worked losslessly (for this tree)
|
|
|
|
- Page **Title / Abstractor / Visual** frontmatter → PageOps + Space index fields
|
|
- Markdown **body** → content-plane render (bleach markdown pipeline)
|
|
- Relative **visual** assets under `assets/`
|
|
- **Page list** via `list_pages`
|
|
- Idempotent re-import with `--replace`
|
|
|
|
## Acceptance against CSOC-WP-0001
|
|
|
|
- [x] At least one migration rehearsal run
|
|
- [x] Residual gaps listed (above)
|
|
- [ ] Bulk multi-space import + NK membership map — residual
|
|
- [ ] Apex cutover — still gated on product parity + self-registration
|
|
|
|
## Related
|
|
|
|
- Export progress: `docs/migration/export-progress-2026-08-13.md`
|
|
- Field map: `docs/migration/field-map-from-session-2026-08-13.md`
|
|
- PageOps: `coulomb_social/apps/spaces/pageops.py`, `import_tree.py`
|
|
- Stage-1 cut: `docs/decisions/2026-08-12-feature-cut-stage-1.md`
|