# Ten31Portal — v1 Issue Specs Internal system of record for Ten31 entities, holdings, positions, and quarterly valuation sign-off. Replaces Carta for internal use. Self-hosted on StartOS. ## Stack (baked in, override if you disagree) - Backend: FastAPI, SQLModel, SQLite, Alembic migrations - Frontend: React, Vite, Tailwind - Auth: session cookies, server-side sessions, bcrypt or argon2 password hashing - Money: stored as integer cents. Never float in the DB. Format to dollars only at the view layer. - Dates: `investment_date` is a date. Valuation quarter is stored as a quarter-end date (e.g. 2026-06-30). - Packaging: StartOS 0.4.0 service, single data volume, platform backups cover the DB. ## Conventions (every issue) - One concern per commit. YAGNI. No speculative abstraction. - Type hints everywhere. Pydantic/SQLModel for all shapes crossing a boundary. - No PRs. Build directly. - House style in any user-facing copy: short sentences, no hype, no em-dashes. ## Scope guard for all of v1 In: entities, holdings, positions, valuation rounds, sign-off workflow, audit log, four roles, CSV import, three read views, one workflow view, StartOS packaging. Out (phase 2, do not build): LP access and per-LP isolation, the partner / capital-account side (capital calls, allocations, K-1s), IRR / TVPI / DPI / RVPI computation, BTC or sats denomination, charts.