# Data model (operational): 001-development-environment This is **not** an application domain model. It records host/Git/service entities for planning clarity. No ORM, no API schemas. ## Entities ### Host (`rom-dev01`) | Field | Notes | |-------|-------| | OS | Ubuntu 24.04 LTS (precondition) | | Capacity | ~6 vCPU / 52 GB / 2 TB / 32 GB swap | | Network | Public IPv4 NIC; no required internal NIC | | Management | External Salt `saltenv=base` + project config | ### Account `android-build` | Field | Notes | |-------|-------| | Type | Unprivileged login user | | Owns | `/srv/rom/{src,references,tooling,ccache,artifacts,logs}` (as documented) | | Must not | Need root to compile; own Gitea/Semaphore system dirs | ### Meta working tree | Path | Purpose | |------|---------| | `/home/android-build/sunfish-a16-rom` | Spec Kit + specs + docs (Cursor Remote SSH) | ### Path root `/srv/rom` | Child | Purpose | Populated in 001? | |-------|---------|-------------------| | `src/` | Future Android trees | Empty (no sync) | | `references/` | Future AXP/reference | Empty | | `tooling/` | Project tooling helpers (not Spec Kit checkout) | Partial OK | | `ccache/` | CCACHE_DIR | Yes (dir + env) | | `artifacts/` | Laptop handoff | Dummy file for smoke | | `logs/` | Bootstrap/preflight logs | Yes | | `secrets/` | Restricted placeholder | Empty; no keygen | ### GiteaInstance | Field | Notes | |-------|-------| | Bind | Loopback / non-public | | Repos | `sunfish-a16-rom`, `sunfish-rom-manifest`, `sunfish-rom-build`, `sunfish-rom-patches` | | Canonical | Yes after first successful push of meta repo | ### GitMirror (off-VM) | Field | Notes | |-------|-------| | Location | Laptop bare mirrors (initial) | | Direction | Laptop pulls (`clone --mirror` / `remote update`); no VM→laptop SSH | | Scope | All four project repos | | Success | At least one verified mirror cycle | ### AnsibleController / SemaphoreInstance | Field | Notes | |-------|-------| | Host | `rom-dev01` | | First job | Environment smoke playbook | | Exposure | Same private access model as Gitea | ## Relationships ```text AdminSSH ──manages──► Host packages/systemd/firewall android-build ──writes──► /srv/rom (build-related trees) GiteaInstance ──hosts──► four Repositories Laptop ──mirrors──► Repositories (bare) SemaphoreInstance ──runs──► Ansible smoke playbook on Host Laptop Cursor ──RemoteSSH──► Host workspace Laptop ──rsync──► /srv/rom/artifacts (pull) ``` ## State transitions (meta Git) 1. `laptop-staging-only` 2. `copied-to-host` (pre-Gitea) 3. `gitea-canonical` (push complete) 4. `mirrored-off-vm` (SC-007) Do not destroy state (1) until (3) and (4) succeed.