ARCHIVED 2026-03-24 — All tasks completed. See .claude-plans/deep-plan-baserow-post-migration-cleanup-2026-03-24.md in solanasis-scripts for the execution plan.

Baserow Post-Migration Cleanup & Verification Continuation Prompt

Purpose: Copy-paste this into a new Claude Code session to complete the remaining tasks after the Baserow Cloud-to-Self-Hosted migration.

Created: 2026-03-24 Context: Migration of 6 tables (2,817 rows) from Baserow Cloud (api.baserow.io, DB 387807) to self-hosted (baserow.solanasis.com, DB 54) was completed. All data imported, all script URLs updated, all link_row relationships verified. Two repos have unpushed commits.


The Prompt

We just completed a Baserow Cloud -> Self-Hosted migration. The data migration and script updates are done and committed locally, but there are several remaining tasks to finish.

## Context

### What was done (previous session, 2026-03-24):
1. Exported 6 tables from Baserow Cloud (api.baserow.io, database 387807) to JSON files
2. Imported all 6 tables to self-hosted Baserow (baserow.solanasis.com, database 54, "Solanasis CRM")
3. Verified all row counts match and link_row relationships are intact
4. Updated 8 Python + 2 TypeScript files to read BASEROW_BASE_URL from env (was hardcoded api.baserow.io)
5. Updated FOUNDATION_TABLE_ID from 890586 to 271 in foundation-pipeline/config.py
6. Updated 3 database ID fallbacks from 387807 to 54
7. Added localhost Host header auto-detection for reverse proxy
8. Deleted placeholder table, renamed workspace to "Solanasis", database to "Solanasis CRM"
9. Archived the old migration continuation prompt
10. Prefixed old Baserow Cloud credentials in solanasis-docs/.env with HOLD_DONT_USE_

### Table inventory on self-hosted:
| Table | Rows | Self-Hosted ID |
|-------|------|----------------|
| Tag | 50 | 264 |
| Location | 32 | 265 |
| Organization | 72 | 266 |
| People | 179 | 267 |
| Meeting Notes | 38 | 272 |
| Foundation Prospects | 2446 | 271 |

### Key files:
- Migration script: `_solanasis/solanasis-scripts/scripts/migrate_cloud_to_selfhosted.py`
- Migration data (JSON exports + maps): `_solanasis/solanasis-scripts/scripts/migration-data/`
- Plan: `.claude-plans/deep-plan-baserow-migration-2026-03-24.md`
- Infrastructure docs: `_solanasis/solanasis-docs/operations/infrastructure-setup-plan.md`
- Service inventory: `_solanasis/solanasis-docs/operations/service-inventory.md`

### Credential locations:
- Self-hosted creds: `_solanasis/solanasis-scripts/.env` (BASEROW_DB_TOKEN, BASEROW_EMAIL=ds@solanasis.com)
- Old cloud creds (deprecated): `_solanasis/solanasis-docs/.env` (prefixed HOLD_DONT_USE_BASEROW_CLOUD_*)

## Remaining Tasks

### Task 1: Push both repos to remote
Both repos have unpushed commits on main:

**solanasis-scripts** (2 commits):
- `feat: migrate Baserow from cloud to self-hosted` — 12 files changed
- `fix: update migration script to read HOLD_DONT_USE_ prefixed cloud creds` — 1 file changed

**solanasis-docs** (1 commit):
- `docs: update infrastructure docs for Baserow self-hosted migration` — 3 files changed

Push both to origin/main.

### Task 2: Convert Meeting Notes "Name" field to formula
The "Name" primary field in the Meeting Notes table (ID 272) was imported as a text field with the person's name. In the original cloud Baserow, this was a formula field: `field('Person')`.

**Action:** Try to convert it via the Baserow API:
1. First check if the self-hosted Baserow API supports changing a primary field's type to formula
2. If supported: PATCH the field to type "formula" with formula "field('Person')"
3. If not supported via API: Note that it needs to be done manually in the Baserow UI (click Name column header > Edit field > change type to Formula > enter `field('Person')`)

The field currently works fine as text — this is a nice-to-have for keeping it in sync with Person changes.

### Task 3: Verify self-hosted Baserow is the active instance
Run a quick sanity check to make sure everything is pointed at self-hosted:

1. **Scripts .env check:** Verify `_solanasis/solanasis-scripts/.env` has:
   - `BASEROW_BASE_URL=https://baserow.solanasis.com`
   - `BASEROW_DB_TOKEN=uJOd16uiYIIMXaSOqrWlk62oVjE4Abd1`
   - `BASEROW_EMAIL=ds@solanasis.com`
   - `BASEROW_DATABASE_ID=54`

2. **Docs .env check:** Verify `_solanasis/solanasis-docs/.env` has:
   - Old Baserow Cloud keys prefixed with `HOLD_DONT_USE_BASEROW_CLOUD_*`
   - No active `BASEROW_API_KEY`, `BASEROW_EMAIL`, or `BASEROW_PASSWORD` pointing at cloud

3. **Script grep:** Run `grep -r "api\.baserow\.io" _solanasis/solanasis-scripts/ --include="*.py" --include="*.ts"` to confirm no script code still points at cloud (exceptions: the migration script itself which intentionally talks to cloud, and test fixtures)

4. **API health check:** Hit the self-hosted API to verify it's alive:

curl -s -H “Host: baserow.solanasis.com” -H “Authorization: Token uJOd16uiYIIMXaSOqrWlk62oVjE4Abd1” “http://localhost:8880/api/database/rows/table/264/?size=1&user_field_names=true

Should return Tag table with count=50.

### Task 4: Clean up migration artifacts
The `_solanasis/solanasis-scripts/scripts/migration-data/` directory contains:
- 6 JSON export files (Tag.json, Location.json, Organization.json, People.json, Meeting_Notes.json, Foundation_Prospects.json)
- progress.json, table_id_map.json
- *_maps.json files (ID mapping files)

**Decision needed:** Ask Dmitri whether to:
- (A) Keep as backup for 1-2 weeks then delete (recommended)
- (B) Delete now — the data is all on self-hosted
- (C) Move to solanasis-data/ as a permanent archive

Either way, add `scripts/migration-data/` to `.gitignore` since these files contain raw CRM data and shouldn't be committed.

### Task 5: Baserow Cloud read-only / decommissioning plan
The Baserow Cloud instance (api.baserow.io, database 387807) still exists with the original data. Plan says to keep it as read-only backup until self-hosted is verified stable.

**Action items:**
1. Check if the cloud instance has any active integrations or webhooks that should be disabled
2. Note: The cloud DB token (HOLD_DONT_USE_BASEROW_CLOUD_API_KEY) still works — if Baserow Cloud has a concept of "read-only" mode or we want to revoke write access, do that
3. Set a reminder to decommission the cloud instance in 2-4 weeks (by 2026-04-14) if self-hosted is stable
4. When decommissioning: revoke/delete the cloud API token, delete the cloud database, and close the cloud account if it was a separate account

### Task 6: Verify README references
Check if any README.md files in solanasis-scripts or solanasis-docs reference `api.baserow.io` and update them to `baserow.solanasis.com`.

Also check the RESUME-PROMPT.md files in the pipeline directories — they may reference the old cloud database ID (387807) or URL:
- `_solanasis/solanasis-scripts/foundation-pipeline/RESUME-PROMPT.md`
- `_solanasis/solanasis-scripts/fcto-pipeline/RESUME-PROMPT.md` (if exists)
- `_solanasis/solanasis-scripts/msp-pipeline/RESUME-PROMPT.md` (if exists)

Update any stale references.

## Priority Order
1. Task 1 (push) — unblocks everything
2. Task 3 (verify) — confirm nothing is broken
3. Task 6 (README/RESUME-PROMPT) — catch stale references
4. Task 2 (formula field) — nice-to-have
5. Task 4 (cleanup) — ask Dmitri
6. Task 5 (cloud decommission) — future task, just note it

CheckCloudSelf-HostedStatus
Tag rows5050Match
Location rows3232Match
Organization rows7272Match
People rows179179Match
Meeting Notes rows3838Match
Foundation Prospects rows24462446Match
OrgTags links1515Match
OrgLocation links3030Match
PeopleTags links102102Match
PeopleLocation links7070Match
PeopleOrg links1616Match
People>Meeting Notes3535Match
Meeting NotesPerson37/3837/38Match (1 has no person)
Pina bidirectional linkYesYesMatch
Foundation single_selectYesYesMatch