Description
Views labelling_findings (deliberately not a FindingSpec), labelling_stack_summary, labelling_cross_signal (counts and set sizes only, reusing signal_inventory service and cluster sets) and a bounded or top-N labelling_label_register, each stamped with catalogue_version. Metrics per doc-0008 Part 1: gcinsight_labelling_findings{stack,severity}, gcinsight_labelling_score{stack,signal}, gcinsight_labelling_rules_evaluated{stack,signal}, gcinsight_labelling_rules_passed{stack,signal} over the four data signals, plus estate-level gcinsight_labelling_catalogue_version; per-severity counts emitted only where that severity reached the coverage floor.
Acceptance Criteria
- #1 budget.check_shape accepts every new metric and BUDGET.md is regenerated
- #2 VIEW_INPUTS is re-derived by the test, never hand-edited
- #3 A test proves no label name from label_inventory appears in Loki events
- #4 Gaps are absent series, empty-view schemas exist, and carry-forward drops departed stacks
Definition of Done
- #1 just test
- #2 just tf-validate
- #3 just check-identifiers and just no-em-dashes both return clean
Implementation Plan
Freeze producer schemas/metric contracts, implement views and derivation, then same union-owned writer implements required dashboard consumer before full coverage gate. No temporary exemption or source/evaluator seam reopening.
Implementation Notes
loop14:one producer/dashboard writer froze four-view schema then built consumer;17 exact file hashes, independent guardedPASS, CodeRabbitcomplete0findings, actual offline composer/CLI shapes and strictcoverage proved. Root source-stage test expectations corrected for allowed PRIVATE S3 register only; ordinary names required there/forbidden allother views/logs/diagnostics, all raw/PII tests unchanged; nonempty writer observation mutationfails. No source07 ceiling reset or runtime repair. Stable ae10a3a justcheck and CI37584017497 allrequiredleaves green.