- Deterministic scoring.py (quant 60 / qual 40 / flags -15, profitability heaviest) - Per-company JSON ledger with forecast-target chaining deck N-1 -> N - Single-shot sandbox agent with guided-JSON fallback ladder (no tool loop) - Portfolio dashboard with sparklines, KPI hit rates, BDEF category bars - 48 unit tests green; endpoints smoke-tested; npm check+build green Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Boardroom Map reviewer sandbox
This directory is the build context for the reviewer image, which runs on the
DGX Spark — it is not packed into the .s9pk. The orchestrator rsyncs this
folder to the head Spark and runs build.sh there (the Sparks are aarch64), or
you can build it by hand.
grader_agent.py— a one-shot, read-only agent. It reads the documents mounted at/docs, runs one local model (through the on-Spark proxy) under its persona (/persona/PERSONA.md) and the shared rubric (/RUBRIC.md), and writes a single report to/out. WithBM_ROLE=synthesizerit instead reads the panel's reports from/reportsand writesCONSOLIDATED_REPORT.md.reviewer.Dockerfile— lean pure-Python image (stdlib only).build.sh—IMAGE=boardroom-grader:latest bash build.sh.
How it is launched (by the orchestrator)
Hardened and, in air-gapped mode, network-isolated:
docker run -d --name bm-grader-<id> \
--network boardroom-net \ # --internal in air-gapped mode
--user 1000:1000 --security-opt no-new-privileges --cap-drop ALL \
--read-only --tmpfs /tmp --tmpfs /home/rev --pids-limit 256 --memory 6g --cpus 4 \
-e BM_MODEL=<alias> -e BM_LLM_BASE=http://boardroom-proxy:4000/v1 ... \
-v <job>/docs:/docs:ro -v <job>/out:/out \
-v <job>/personas/<id>.md:/persona/PERSONA.md:ro -v <job>/RUBRIC.md:/RUBRIC.md:ro \
boardroom-grader:latest
The container can reach only the model proxy in air-gapped mode; it holds no credentials beyond a dummy proxy key and cannot touch the host or the documents' originals.