Add seed extraction handover for incoming assistant
This commit is contained in:
215
docs/handover-seed-extraction.md
Normal file
215
docs/handover-seed-extraction.md
Normal file
@@ -0,0 +1,215 @@
|
|||||||
|
# Handover — TESSERA 4.0 Seed Extraction
|
||||||
|
### Date: 2026-04-26
|
||||||
|
### For: Incoming assistant (dataset development track)
|
||||||
|
### Read this completely before doing anything
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 0. Your role
|
||||||
|
|
||||||
|
You are the dataset assistant. Your immediate task is to create
|
||||||
|
`otivm.sqlite3` by extracting the five OTIVM launch waypoint hexes
|
||||||
|
from `tessera.db` on the Dell SSD. You do not touch game code.
|
||||||
|
You do not modify the roadmap. You do not run any pipeline stage
|
||||||
|
without explicit project owner instruction.
|
||||||
|
|
||||||
|
The game assistant works in parallel on `otium.civicus.us`.
|
||||||
|
You share the OTIVM Gitea repo but work on different files.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. The RFC — read it first
|
||||||
|
|
||||||
|
`docs/RFC-TESSERA-4.0-001.md` in this repo is the normative schema.
|
||||||
|
Read it completely before writing a single line of code. It defines:
|
||||||
|
- All table schemas with exact column names and types
|
||||||
|
- Row lifecycle states (1=draft, 2=current, 3=superseded, 4=retired)
|
||||||
|
- Per-field provenance as integer FKs
|
||||||
|
- H5 coverage completeness tracking
|
||||||
|
- The pipeline contract
|
||||||
|
- The staging protocol
|
||||||
|
|
||||||
|
The schema is approved. Do not deviate from it.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Infrastructure
|
||||||
|
|
||||||
|
### Dell (root@ai, 10.0.0.41)
|
||||||
|
- `tessera.db` at `/home/tessera/tessera.db` — 158GB SpatiaLite, the seed source
|
||||||
|
- tessera-pipeline LXC: scripts at `/opt/tessera-pipeline/`
|
||||||
|
- Python venv: `/opt/tessera-pipeline/venv/bin/python3`
|
||||||
|
- USB is READ-ONLY — no writes to `/mnt/tessera-*` without explicit permission
|
||||||
|
|
||||||
|
### OTIVM container (otium-dev, 10.0.0.23)
|
||||||
|
- App user: `otivm`
|
||||||
|
- Repo at `/home/otivm/OTIVM`
|
||||||
|
- Claude Code runs here as `otivm` user via `work` alias
|
||||||
|
- Python venv: `/home/otivm/venv`
|
||||||
|
- This is where `otivm.sqlite3` will live: `/home/otivm/OTIVM/data/otivm.sqlite3`
|
||||||
|
|
||||||
|
### proliant-dev (srv-a, 10.0.0.11)
|
||||||
|
- tessera-store CT (1102, 10.0.0.21): empty, infrastructure ready
|
||||||
|
- Not needed for seed extraction — that runs on the Dell
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. tessera.db schema — what you are extracting from
|
||||||
|
|
||||||
|
```sql
|
||||||
|
-- Source table in tessera.db (SpatiaLite)
|
||||||
|
tessera_cells:
|
||||||
|
h9_cell TEXT -- H3 res-9 cell ID (string format)
|
||||||
|
h7_cell TEXT -- H3 res-7 parent
|
||||||
|
lat REAL
|
||||||
|
lon REAL
|
||||||
|
elev_cm INTEGER
|
||||||
|
terrain INTEGER
|
||||||
|
hydro INTEGER
|
||||||
|
geo_dep INTEGER
|
||||||
|
geo_flag INTEGER
|
||||||
|
geom BLOB -- not needed, do not extract
|
||||||
|
|
||||||
|
tessera_h7:
|
||||||
|
h7_cell TEXT
|
||||||
|
fingerprint TEXT
|
||||||
|
generated_at INTEGER
|
||||||
|
n_cells INTEGER
|
||||||
|
```
|
||||||
|
|
||||||
|
`occ_flag` does not exist in tessera.db — stage 06 was never run.
|
||||||
|
Set `occ_flag = 0` and `occ_conf = 4` (no_data) for all seed rows.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. The five OTIVM launch waypoints
|
||||||
|
|
||||||
|
| City | H5 (TEXT) | Notes |
|
||||||
|
|---|---|---|
|
||||||
|
| Ostia | `851e805bfffffff` | Mediterranean coast, low terrain |
|
||||||
|
| Capua | `851e8333fffffff` | Campanian plain |
|
||||||
|
| Brundisium | `851e8ba3fffffff` | Adriatic coast |
|
||||||
|
| Carthago | `85386e23fffffff` | North Africa |
|
||||||
|
| Alexandria | `853f5ba7fffffff` | Nile delta |
|
||||||
|
|
||||||
|
Each H5 contains 343 H9 cells (7 H7 children × 49 H9 per H7).
|
||||||
|
Total minimum: 5 × 343 = 1,715 H9 rows.
|
||||||
|
|
||||||
|
All five are well within the completed portion of tessera.db —
|
||||||
|
the Mediterranean is fully populated. No missing data expected
|
||||||
|
except occ_flag (stage 06 not run) and some geo_dep/geo_flag
|
||||||
|
cells at the edge of MRDS/IGME5000 coverage.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Source registry seed values
|
||||||
|
|
||||||
|
Register these sources in `source_registry` before extraction:
|
||||||
|
|
||||||
|
| source_key | source_name | version | license |
|
||||||
|
|---|---|---|---|
|
||||||
|
| GEBCO_2025 | GEBCO 2025 Grid | 2025 | CC-BY 4.0 |
|
||||||
|
| ESA_WORLDCOVER_V200 | ESA WorldCover v200 | v2.0.0 | CC-BY 4.0 |
|
||||||
|
| HYDROSHEDS_V11 | HydroSHEDS v1.1 | 1.1 | CC-BY 4.0 |
|
||||||
|
| USGS_MRDS | USGS Mineral Resources Data System | 2022-08-23 | public domain |
|
||||||
|
| BGR_IGME5000 | BGR IGME5000 | 2007 | Geonutz 2013 |
|
||||||
|
| TESSERA3_SEED | TESSERA 3.0 seed extraction | 2026-04-26 | internal |
|
||||||
|
|
||||||
|
Confidence grades for seed rows:
|
||||||
|
- elev: source=GEBCO_2025, conf=2 (indicated)
|
||||||
|
- terrain: source=ESA_WORLDCOVER_V200, conf=2 (indicated)
|
||||||
|
- hydro: source=HYDROSHEDS_V11, conf=2 (indicated)
|
||||||
|
- geo_dep: source=USGS_MRDS, conf=2 if value != 255, else conf=4
|
||||||
|
- geo_flag: source=BGR_IGME5000, conf=2 if value != 0, else conf=4
|
||||||
|
- occ: source=TESSERA3_SEED, conf=4 (no_data), value=0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. H3 integer conversion
|
||||||
|
|
||||||
|
tessera.db stores H3 IDs as TEXT (e.g. `891e805b31bffff`).
|
||||||
|
otivm.sqlite3 stores H3 IDs as INTEGER (64-bit H3 index).
|
||||||
|
|
||||||
|
In Python using the `h3` library:
|
||||||
|
```python
|
||||||
|
import h3
|
||||||
|
h9_int = h3.str_to_int(h9_text) # TEXT → INTEGER
|
||||||
|
h9_text = h3.int_to_str(h9_int) # INTEGER → TEXT
|
||||||
|
```
|
||||||
|
|
||||||
|
The h5 INTEGER value for each waypoint:
|
||||||
|
```python
|
||||||
|
h5_int = h3.str_to_int('851e805bfffffff') # Ostia
|
||||||
|
# etc.
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Deployment workflow
|
||||||
|
|
||||||
|
Claude Code on otium-dev handles all file writes and git commits.
|
||||||
|
Claude chat produces files with instruction headers.
|
||||||
|
Claude Code writes them to disk, commits, pushes.
|
||||||
|
|
||||||
|
No manual tarball workflow. No direct server commands from Claude chat.
|
||||||
|
|
||||||
|
The extraction script runs on the Dell (tessera-pipeline CT),
|
||||||
|
not on otium-dev. The output `otivm.sqlite3` is then copied to
|
||||||
|
the OTIVM container.
|
||||||
|
|
||||||
|
Copy path (after extraction on Dell):
|
||||||
|
```
|
||||||
|
/tmp/otivm.sqlite3 on tessera-pipeline CT
|
||||||
|
→ lxc file pull to Dell host /tmp/
|
||||||
|
→ scp to otium-dev /home/otivm/OTIVM/data/otivm.sqlite3
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. What to produce — in order
|
||||||
|
|
||||||
|
1. **`data/create_otivm_db.sql`** — SQL to create the schema
|
||||||
|
(all tables per RFC-TESSERA-4.0-001, lookup table inserts)
|
||||||
|
Claude Code writes this. Human runs it on otium-dev to create
|
||||||
|
the empty `data/otivm.sqlite3`.
|
||||||
|
|
||||||
|
2. **`pipeline/seed_extract.py`** — extraction script
|
||||||
|
Reads from tessera.db on the Dell (via tessera-pipeline CT),
|
||||||
|
writes to `staging_otivm.sqlite3` in /tmp.
|
||||||
|
Follows the pipeline contract from the RFC.
|
||||||
|
Claude Code writes this. Human deploys to tessera-pipeline CT.
|
||||||
|
|
||||||
|
3. **`pipeline/seed_promote.py`** — promotion script
|
||||||
|
Promotes draft rows to current in staging_otivm.sqlite3,
|
||||||
|
verifies row counts, updates h5_coverage.
|
||||||
|
Claude Code writes this.
|
||||||
|
|
||||||
|
4. **Copy staging to production** — human runs the copy from
|
||||||
|
staging_otivm.sqlite3 to otivm.sqlite3 after verification.
|
||||||
|
|
||||||
|
5. **Verify** — query otivm.sqlite3 to confirm all five H5 hexes
|
||||||
|
have status=2 in h5_coverage and correct H9 counts.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Hard rules
|
||||||
|
|
||||||
|
- Do not write to USB (`/mnt/tessera-*`) without explicit permission
|
||||||
|
- Do not modify `tessera.db` — it is the immutable seed source
|
||||||
|
- Do not touch game code (src/, server/, App.jsx, etc.)
|
||||||
|
- Do not run any script without explicit project owner instruction
|
||||||
|
- Always read RFC-TESSERA-4.0-001.md before writing any schema code
|
||||||
|
- One file. One step. One confirmation. Never batch.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Gitea
|
||||||
|
|
||||||
|
Repo: `https://gitea.barternetwork.us/TheRON/OTIVM`
|
||||||
|
Branch: `main` (direct push, Claude Code handles this)
|
||||||
|
MCP: connected via `mcp.civicus.us` — read any file directly
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Handover 2026-04-26 — seed extraction track*
|
||||||
|
*RFC approved. Schema locked. Extract five waypoints. Verify. Done.*
|
||||||
Reference in New Issue
Block a user