Skip to content

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 at 0.40 + 0.40 on 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, 09 contradiction 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-gateway on 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_zoo LRU 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_analyzer sends NIM's nvext.guided_json to llama.cpp's /completion, whose native parameters are json_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 b7972 ignores nvext.
  • Also: 06 §4's plan to demand Event JSON through response_format: json_schema works only in RT-VLM integrated mode; openai-compat mode drops it (09 contradiction 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_PRECISION int8/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