From 6bf0786993b8eb520f8e9db286fc1e44e2d2230c Mon Sep 17 00:00:00 2001 From: Jonathan Kirkwood Date: Thu, 30 Jul 2026 09:14:24 -0500 Subject: [PATCH] README: update to v0.1.5 live status, PPTX extraction, Gitea, ops notes Co-Authored-By: Claude Fable 5 --- README.md | 52 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index afdf3cd..fcf0187 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ StartOS box (control plane, no GPU) DGX Spark(s) ┌────────────────────────────────────┐ ┌───────────────────────────────┐ │ FastAPI dashboard + job runner │ SSH │ per-job Docker network │ │ • inbox// (decks) │ ───────▶│ (──internal in airgapped) │ -│ • extract text (PDF/DOCX/TXT/MD) │ rsync │ ┌─────────┐ ┌────────────┐ │ +│ • extract text (PDF/PPTX/DOCX/…) │ rsync │ ┌─────────┐ ┌────────────┐ │ │ • plan model "waves" │ ───────▶│ │ vLLM(s) │◀─│ LiteLLM │ │ │ • extractor → graders → adjudicator│ │ └─────────┘ │ router │ │ │ • 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 Grading (rubric, air-gap, weights) → Configure Companies (slugs, KPI aliases, pinned targets — especially profitability thresholds) → drop decks -into `inbox//2026-Q2-deck.pdf` → **Grade Decks** → watch the -dashboard. +into `inbox//` → **Grade Decks** → watch the 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 @@ -82,7 +92,7 @@ orchestrator/ The control-plane app (Python) serving.py vLLM + LiteLLM router on the Sparks, in waves graders.py launch the grading panel 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 spark_client.py SSH/rsync helpers 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 -GitHub CI (`.github/workflows/build.yml`) or a local build with `start-cli` -(see the s9pk-build-on-mac recipe). The vLLM and grader images are built **on -the Sparks**, not packed into the `.s9pk`. +Local build with `start-cli` (on a Mac: colima + start-cli in a VM — see the +s9pk-build-on-mac recipe). The vLLM and grader images are built **on the +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 make # pack the .s9pk (needs start-cli) ``` +Canonical repo: `https://gitea.ten31.ai/Ten31AI/boardroom-map`. + ## Status -v0.1 — source complete, `tsc`-clean and Python-syntax-clean. Not yet validated -against live Sparks. HF model pre-pull on the head Spark is required for -air-gapped runs. +**v0.1.5 — live in production.** Deployed on a StartOS box driving a DGX Spark +in single-spark air-gapped mode (gemma-4-31B panel: munger-lens / +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.