Add CollectorUp and key the cache by source !14

merged merged by cmc on 2026-09-04 15:56 UTC · krz/ambient-companions:feat/schema-v5-health into main

cmc

Bottom of a five-MR stack for v1.0.

SignalName::CollectorUp at 11, SCHEMA_VERSION = 5 documented as the 1.0 contract. Appending is what the v4 freeze permits — the rule is append-only, prohibiting renumbering and removal, not addition.

The hub keyed its cache by (name, tag), so two signals differing only by source overwrote each other. CollectorUp is published once per Source, which turns that latent flaw load-bearing; the key is now (name, source, tag), and a new test asserts two sources sharing a name coexist. No existing name/source pair collided, so nothing observable regresses.

Closes #8