11 — Errata (2026-09-23)¶
Three independent audits against VSS 1e94133b4 (08, 09, 10) and in-session verification of this repository corrected claims in docs 00-07. This file is the single place those corrections live. Docs 00-07 keep their original text and carry a banner pointing here, so their evidence history stays readable.
Check here before relying on any claim in docs 00-07. Line-number moves with no change in substance are not repeated here. See the stale-citation tables in 08 §8 and 09 (final section).
Index by document¶
| Doc | Corrected by |
|---|---|
README.md (pre-2026-09-23 summary) | E1, E2, E3 |
00-context.md | E2, E3 |
01-vss-architecture.md | E11, E12, E18, E19, E28 |
02-model-inventory.md | E2, E8, E9, E10 |
03-open-questions.md | E8, E9, E19 |
04-fp4-and-deployment.md | E1, E8, E9, E13, E14, E15, E16, E17, E27 |
05-hardware-profiles.md | E1, E3, E4, E6, E9, E10, E17, E18 |
06-repo-a-readiness.md | E5, E7, E25, E26 |
07-lean-backend.md | E1, E19, E20, E21, E22, E23, E24 |
Corrections that change conclusions¶
E1. "Two vLLM engines cannot share one GPU" is not a VSS-wide rule. [V]
- Claimed in: 04 §3, 05 "structural advantage", 07 recommendation 4, and the old README summary.
- What's true: the quote is a comment in the search-on-edge block, measured on AGX Thor unified memory (
deploy/docker/scripts/dev-profile.sh:1211-1216, moved from:1161-1165). VSS documents LLM + RT-VLM sharing one GPU at0.40 + 0.40on H100 and RTX PRO 6000 (skills/vss-build-vision-ai/references/sizing.md:98-100,106,109), and at 0.3 + 0.2 on GB300 (:136-142). The only enforced same-GPU ban is L40S, a capacity rule (dev-profile.sh:1376-1387). - What actually blocks consumer cards is capacity:
- the LLM NIM's INT4 profile requires ≥32 GB/GPU (
nim/nemotron-3.5-lightning-30b-a3b/hw-OTHER.env:25-27); - RT-VLM reserves 0.7 of VRAM by default (
start_rtvi_vlm.sh:119-124). - What changes: our contribution is no longer "a topology VSS can't do". It is no ≥32 GB floor, idle unload, still-image ingest, graded risk plus verification.
- Sources:
08§2.2,09contradiction 1,10§9.1.1, re-verified in-session.
E2. VSS's smallest "tier" is not a single 32 GB card. [V]
- Claimed in: 00, 02, the old README.
- What's true: the RTX PRO 4500 tier requires alerts only, a remote LLM, at least 2 GPUs, and driver ≥ 595.58.03 (
dev-profile.sh:1037-1051,1161-1179). The smallest validated configurations are 2×32 GB with a remote LLM, or 1×48 GB L40S with one model remote (docs/prerequisites.mdx:370-395). The consumer gap is larger than first stated. - Source:
08§0.
E3. This repo's ai/ tier describes the shape of a single-card system, not a shipped configuration. [V]
- Claimed in: 00 ("designed to fit a 24 GB budget"), 05, the old README.
- What's true:
- Production is dual-GPU: the LLM on the A5500 (24 GB) and the Triton
ai-gatewayon an A400 (4 GB) (docker-compose.prod.yml:139,153,159,322-323,351). - The 30B-A3B Q4_K_M GGUF alone is 24.57 GB (
08§2.5), so a single 24 GB card works today only through partial CPU offload. - On 2026-09-23 the owner retired the A400. The design targets a single A5500.
E4. Production has no duty cycling for perception models. [V]
- Claimed in: 05 ("duty-cycle gap":
model_zooLRU as our advantage). - What's true:
- The production gateway starts Triton with
--model-control-mode=none(ai/gateway/entrypoint.sh:131), which loads every model at boot and never unloads. - The LRU manager lives in the standalone enrichment server, which isn't a production service.
- llama.cpp idle sleep is unused.
- What stays true: VSS model services have no unload path either (
09§1f, §4f). The differentiator is real once it is built, which the design does in Phase 1.4.
E5. This repo's structured risk output is probably not enforced. [V code / ? runtime]
- What's true:
nemotron_analyzersends NIM'snvext.guided_jsonto llama.cpp's/completion, whose native parameters arejson_schema/grammar.- Its capability probe counts any 2xx as "supported" (
backend/services/nemotron_analyzer.py:462-483,:593). - Unparseable output falls back to score 50 →
medium(:4392,:2884-2885), which is the empty-porch failure. - One request on the A5500 settles whether
b7972ignoresnvext. - Also: 06 §4's plan to demand Event JSON through
response_format: json_schemaworks only in RT-VLM integrated mode; openai-compat mode drops it (09contradiction 9).
E6. VSS's "always-on" alert route is not model residency. [V]
- Claimed in: 05, as [A].
- What's true: it is a disabled-by-default VIOS webhook that auto-attaches rules to new streams (
docs/release-notes.mdx:161,170-172). The residency point stands on other evidence (docs/real-time-vlm.mdx:1535-1536;09§1f).
E7. VSS's uppercase AlertSeverity is dead code. [V]
- Claimed in: 06 §4, as [A].
- What's true: the live wire is a lowercase binary verdict,
confirmed/rejected/verification-failed(09§5, §9). There is no severity scale to align with.
Sizing figures that were not measurements¶
E8. RT-Embed's "fixed 10 GB, no knob" is a planning reserve. [V]
- What's true: "Reserve about 10 GB" is a Search starting value (
sizing.md:290-291). - There are knobs:
COSMOS_EMBED1_TRT_PRECISIONint8/fp8 (docs/real-time-embedding.mdx:351), and the batch size auto-drops on small cards. - The weights are 2.39 GB [E].
E9. RT-CV's "≈3.0 GB (1.7-4.5)" and "95-96% SM at 2-3 streams" are not consumer-GPU measurements.
- 1.7 GB comes from an illustrative render box in a skill template (
skills/deployment/vss-deploy-detection-tracking-2d/references/next-steps.md:217-218). - 95% is DGX Spark max-stream data (
docs/performance-rt-cv.mdx:66-67); L40S runs 15 streams at 87% (:57). - 3.0 GB has no in-repo source. Treat both figures as [?].
E10. Nano-9B FP8's "13.39 GB actual [V]" is really [C].
- It is the 10.30 GB blob × 1.3. VSS itself says 11.7 GB (
sizing.md:77).
Smaller corrections¶
| # | Claim (doc) | What's true | Source |
|---|---|---|---|
| E11 | CLIP maps to RT-Embed (01) | The analogue is RT-CV's vision encoder. nemotron-embed-vl-1b-v2 is a vss_core knowledge embedder. | 09 c.2 |
| E12 | BYOM is RT-Embed-only (01) | RT-VLM has the same custom loader | 09 c.3 |
| E13 | Allowlist variable RTVI_VLM_MODEL_PATH_ALLOWLIST (04 §2, §6) | Standalone/podman run reads RTVI_MODEL_PATH_ALLOWLIST (services/rtvi/rt-vlm/docker/compose.yaml:43); the _VLM_ name works only through the dev-profile compose (rtvi-vlm-docker-compose.yml:77). The README recipe still fails at boot. | 09 c.4, 10 §9.1.10 |
| E14 | "CR1 unsupported in VSS 3.3" (04 §4) | The line is gone; CR1 7B fp8 is listed (docs/real-time-vlm.mdx:85) | 08 §8, 10 §9.1.9 |
| E15 | "Cosmos3 Edge: zero VSS coverage" (04 §4) | It now has engine tests and two doc rows (real-time-vlm.mdx:1464,1486; commit a8f3549c8). Still absent from the supported-models table and from sizing. | 10 §9.1.8 |
| E16 | RTX PRO 4500 has "exactly one row" (04 §3) | Two rows, both 2-GPU (prerequisites.mdx:370-380) | 08 §8 |
| E17 | Empty RTX4090_TESTS is "declared intent" (04, 05) | PR #1339 filled it with base/LVS/alerts 24 GB tests on 2026-07-20; #1406 emptied it on 2026-07-24. NVIDIA runs three idle 1×RTX 4090 self-hosted runners (open PR #1466; test_run_leg.py:1932-1940). | 08 §0.7 |
| E18 | Foundations include warehouse, public safety, smart city (01, 05) | The Foundations are base, alerts, lvs and search. Only two industry profiles are in-repo: smartcities and warehouse-operations. | 08 §1.1, 10 §9.1.12 |
| E19 | "Redis Streams already first-class" (03 Q5, 07, 01) | Producer-only; no in-tree consumer end to end. Alerts dropped Redis in 3.3.0 (release-notes.mdx:32-36). Alert Bridge is fenced to Kafka + ES (event_bridge_factory.py:48-52). Redis 7.4 is enough; VSS uses no Redis 8 features. | 09 §6, 10 §9.1.6 |
| E20 | /aggregate_live_stream (07) | The endpoint does not exist (via_server.py:1706-1709) | 09 c.10 |
| E21 | ":505 injects Milvus; :1861 no-op" (07) | Milvus is injected only when Milvus env vars are set; :1861 is off by default even on ES (LVS_DROP_EMPTY_EVENT_FIELDS) | 09 c.11 |
| E22 | VSS Redis has "no persistence" (07) | appendonly no, but RDB save 60 1 is on | 09 c.12 |
| E23 | license-diff.yaml; a docker-less unit-tests job (07) | Renamed to osrb-scan.yml (.github/osrb/MIGRATION.md:99). There is no unit-tests job; the nearest is test (ci.yml:416). | 08 §8 |
| E24 | "Swapping the bus does not remove ES" (07) | True for alerts, lvs and search. The warehouse Redis *_MINIMAL variant has no ELK. | 10 §9.1.7 |
| E25 | Ingest is FTP stills, with no RTSP (06 §4) | FTP is the default (backend/models/camera.py:126,170), and it also accepts video files (backend/services/file_watcher.py:70). go2rtc runs RTSP live view (docker-compose.prod.yml:729-745), and a dormant RTSP/ONVIF path exists (backend/models/enums.py:100-102). | 09 c.17, in-session |
| E26 | Documented features are wired (our docs) | Not wired: alert-rule evaluation (alert_engine is imported only by the API layer); the MQTT / Home Assistant / Frigate chain (no non-test caller, no broker in compose); email/push; feedback learning; scheduled reports | 10 §9.2.4, in-session |
| E27 | "5 lines across 2 files" for nemotron-nano-12b (04 §2) | 3 lines across the same 2 files | 08 §8 |
| E28 | Kafka is RT-VLM's Compose default (01) | True, but RT-VLM runs with an empty bus and degrades gracefully when Kafka is unreachable | 09 c.16 |
(09 c.N = 09 "Contradictions with the existing docs", item N.)
Dated additions (2026-09-24) — corrections to the design spec itself¶
From Phase G0 execution; evidence lives in docs/plans/2026-09-23-vss-gaming-gpu-ledger.md (row refs in parentheses).
| # | Claim (spec rev 4) | What's true now | Evidence |
|---|---|---|---|
| N1 | §8 step 0.25: "61 [risk_score] sites at 4eab98e5" | Not reproducible by any scope; working set is 54 live-path comparisons (tests excluded), recipe in the ledger's counting-erratum section. Triage per site (live/dead/comment) belongs to the 0.25 plan. | ledger, 2026-09-24 recount |
| N2 | GB300 checklist G0.1: "the unit tier already collects on 64 KiB pages" | The agent partition runs 4 KiB pages (getconf PAGE_SIZE = 4096); the claim describes the owner's plain-shell GB300. Unit tier green here regardless (27,942 passed). | ledger E4 |
| N3 | GB300 checklist / probes: agent-gpu run … -- nvidia-smi | agent-gpu run requires --image; the working recipe carries --image docker.io/vllm/vllm-openai@sha256:c2b7c4… (or any CUDA image). Also: --wait must precede -- (argparse REMAINDER otherwise swallows it). | ledger E2, E10 |
| N4 | G0.1: "test Postgres and Redis on rootless podman" | In the agent partition: docker compose -f docker-compose.test.yml up -d (ports 5433/6380) + persisted TEST_DATABASE_URL/TEST_REDIS_URL. The CI-profile compose fails on sandbox seccomp. | ledger E11 |
| N5 | G0.2: build via the ai/vlm Dockerfile through the runner | The runner's build path currently panics (buildah: mkdir /run/user, admin-repair — owner decision F1); the run-path workaround (compile job on the pulled devel base, artifacts in out/) produced a working sm_103 build. The Dockerfile stays ready for a one-command retry. | ledger E13 |
| N6 | §5 / bake-off: "17 scenarios" | 13 scenarios + 15 modifier/scenario JSONs; no 17-item artifact exists in any history of scripts/synthetic. Plan against 13. | G0.4 research cluster, scenarios/__init__.py:70-88 |
| N7 | §5: Nemotron-12B-VL GGUF sizes (7.5 GB + mmproj) | Confirmed exactly: Vastined/NVIDIA-Nemotron-Nano-12B-v2-VL-BF16-GGUF Q4_K_M = 7,501,771,584 B, mmproj = 1,689,151,968 B [V]. Community quant — NVIDIA ships no official GGUF. models.yml separately misstates the 30B-A3B Q4_K_M as 15,073 MB (real: 24,574 MB). | ledger S-5, HF API |