README: update to v0.1.5 live status, PPTX extraction, Gitea, ops notes

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jonathan Kirkwood
2026-07-30 09:14:24 -05:00
co-authored by Claude Fable 5
parent 91212322c1
commit 6bf0786993
+42 -10
View File
@@ -38,7 +38,7 @@ StartOS box (control plane, no GPU) DGX Spark(s)
┌────────────────────────────────────┐ ┌───────────────────────────────┐ ┌────────────────────────────────────┐ ┌───────────────────────────────┐
│ FastAPI dashboard + job runner │ SSH │ per-job Docker network │ │ FastAPI dashboard + job runner │ SSH │ per-job Docker network │
│ • inbox/<company-slug>/ (decks) │ ───────▶│ (──internal in airgapped) │ │ • inbox/<company-slug>/ (decks) │ ───────▶│ (──internal in airgapped) │
│ • extract text (PDF/DOCX/TXT/MD) │ rsync │ ┌─────────┐ ┌────────────┐ │ │ • extract text (PDF/PPTX/DOCX/…) │ rsync │ ┌─────────┐ ┌────────────┐ │
│ • plan model "waves" │ ───────▶│ │ vLLM(s) │◀─│ LiteLLM │ │ │ • plan model "waves" │ ───────▶│ │ vLLM(s) │◀─│ LiteLLM │ │
│ • extractor → graders → adjudicator│ │ └─────────┘ │ router │ │ │ • extractor → graders → adjudicator│ │ └─────────┘ │ router │ │
│ • deterministic composite scorer │◀─────── │ ┌──────────────┐ ▲ │ │ │ • deterministic composite scorer │◀─────── │ ┌──────────────┐ ▲ │ │
@@ -68,8 +68,18 @@ StartOS box (control plane, no GPU) DGX Spark(s)
Configure Sparks → Test Spark Connection → Configure Models → Configure Graders Configure Sparks → Test Spark Connection → Configure Models → Configure Graders
→ Configure Grading (rubric, air-gap, weights) → Configure Companies (slugs, → Configure Grading (rubric, air-gap, weights) → Configure Companies (slugs,
KPI aliases, pinned targets — especially profitability thresholds) → drop decks KPI aliases, pinned targets — especially profitability thresholds) → drop decks
into `inbox/<company-slug>/2026-Q2-deck.pdf`**Grade Decks** → watch the into `inbox/<company-slug>/`**Grade Decks** → watch the dashboard.
dashboard.
Two operational notes:
- **Deck filenames must contain the period with the year** — e.g.
`Board Deck - Q4 2025.pdf` parses; a bare `Q4` does not. Periods are
canonicalized (`2025-Q4`, `2026-H1`, `2026-05`, `FY2026`) and drive the
forecast-target chaining between consecutive decks.
- If a Spark already runs resident vLLM containers, list their names in
**Configure Grading → `preJobStopContainers`** — they are docker-stopped on
the head Spark at job start to free GPU memory (and deliberately *not*
restarted afterward; re-warm them from whatever job owns them).
## Repo layout ## Repo layout
@@ -82,7 +92,7 @@ orchestrator/ The control-plane app (Python)
serving.py vLLM + LiteLLM router on the Sparks, in waves serving.py vLLM + LiteLLM router on the Sparks, in waves
graders.py launch the grading panel graders.py launch the grading panel
adjudicator.py the local lead grader adjudicator.py the local lead grader
extraction.py PDF/DOCX/TXT/MD → text (on the StartOS box) extraction.py PDF/PPTX/DOCX/TXT/MD → text (on the StartOS box)
preflight.py probe models before launching graders preflight.py probe models before launching graders
spark_client.py SSH/rsync helpers spark_client.py SSH/rsync helpers
bdef.md the baked-in BDEF v1.1 rubric bdef.md the baked-in BDEF v1.1 rubric
@@ -93,17 +103,39 @@ sandbox/ grader image (built ON the Spark, not packed in the s9pk)
## Build ## Build
GitHub CI (`.github/workflows/build.yml`) or a local build with `start-cli` Local build with `start-cli` (on a Mac: colima + start-cli in a VM — see the
(see the s9pk-build-on-mac recipe). The vLLM and grader images are built **on s9pk-build-on-mac recipe). The vLLM and grader images are built **on the
the Sparks**, not packed into the `.s9pk`. Sparks**, not packed into the `.s9pk`:
- `boardroom-vllm:latest` — the vLLM serving image with `ENTRYPOINT []`
(serving.py passes the full `vllm serve …` command as the container CMD).
- `boardroom-grader:latest` — from `sandbox/build.sh`.
``` ```
npm ci && npm run check && npm run build # type-check + bundle npm ci && npm run check && npm run build # type-check + bundle
make # pack the .s9pk (needs start-cli) make # pack the .s9pk (needs start-cli)
``` ```
Canonical repo: `https://gitea.ten31.ai/Ten31AI/boardroom-map`.
## Status ## Status
v0.1 — source complete, `tsc`-clean and Python-syntax-clean. Not yet validated **v0.1.5live in production.** Deployed on a StartOS box driving a DGX Spark
against live Sparks. HF model pre-pull on the head Spark is required for in single-spark air-gapped mode (gemma-4-31B panel: munger-lens /
air-gapped runs. girdley-operator / buffett-owner). First full grading run completed
2026-07-29: a three-deck company history graded end-to-end into a running
ledger with quarter-over-quarter forecast chaining.
Version history: v0.1.1 fixed config persistence (absolute `/media/startos/…`
paths — relative paths resolved into an ephemeral cwd); v0.1.2 added
`preJobStopContainers`; v0.1.3 hardened preflight (authed model probes,
poll-until-loaded, crash fast-fail); v0.1.4 fixed air-gapped serving
(`HF_HUB_OFFLINE` — the `--internal` network has no DNS) and raised grader
timeouts for ~3.6 tok/s local generation; v0.1.5 fixed the dashboard viewer
(stays open across background refresh) and added report/JSON/scorecard
downloads.
Known optimization not yet done: the wave is torn down per deck, so the 31B
reloads from disk (~6 min) between decks even when the model set is unchanged.
HF model pre-pull on the head Spark is required for air-gapped runs.