feat(reporting): vendor-scope metric qualifier symmetry - #6620
Conversation
The vendor-branch qualifier on delivery-metric-aggregate was a closed
object with no properties, so only {} could validate. Give it the same
closed 5-key set as the standard branch, and add the optional qualifier
to the vendor branches of committed-metric and missing-metric — matching
what canonical-reporting-commitment already allows — so vendor metrics
measured under different attribution windows or methodologies are
distinguishable on the contract and reconciliation surfaces. A parity
contract test now enforces an identical closed key set across every
hand-maintained qualifier copy.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
MDX cannot parse HTML <!-- --> comments; the Mintlify parser fails on
docs/building/by-layer/L1/security.mdx and blocks any docs push. Use
the {/* */} form the contributing guidance already prescribes.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated paths touched without an APPROVED review.
This PR modifies three published protocol schema files under static/schemas/source/** (committed-metric.json, delivery-metric-aggregate.json, missing-metric.json), which are under a hard, deterministic approval gate (gated_paths: true). The required review_decision is not APPROVED (unknown/none), so the gate is not satisfied and the PR cannot be auto-approved (decision table row 2).
The change itself looks clean and additive: it restores vendor-scope qualifier parity so delivery-metric-aggregate's vendor qualifier carries the same closed 5-key set as the standard branch, and adds the optional (non-required, additive) qualifier to the committed-metric and missing-metric vendor branches. The changeset is present and correctly scoped (minor), schema↔docs coherence holds against the already-documented qualifier vocabulary, and a new parity test ratchets all 7 hand-maintained copies to one key set. Only one low finding (undocumented symmetry note on the delivery reference page).
No critical/high findings and no medium findings — but the gated-path rule requires human/CODEOWNERS review before merge.
Escalation reasons
- Modifies gated protocol schema files under
static/schemas/source/**(committed-metric.json, delivery-metric-aggregate.json, missing-metric.json);review_decisionis notAPPROVED, so human/CODEOWNERS review is required.
Why human review
- Modifies gated schema files under static/schemas/source/** (committed-metric.json, delivery-metric-aggregate.json, missing-metric.json) while review_decision is not APPROVED — human/CODEOWNERS approval required.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/committed-metric.json (modified) matches
static/schemas/source/**; static/schemas/source/core/delivery-metric-aggregate.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/missing-metric.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'unknown', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
Panel review found the qualifier symmetry stopped one schema short of the value carrier: vendor_metric_values rows had no qualifier and a one-row-per-(vendor, metric_id) uniqueness MUST, so a vendor metric committed under two attribution windows was expressible in the contract but structurally unrepresentable in the delivery report. vendor-metric- value gains the optional closed qualifier and uniqueness re-keys to (vendor, metric_id, qualifier). The remaining vendor branches (package-request committed_metrics, performance-feedback surfaces) gain the same qualifier so canonical payloads are expressible everywhere, and the parity test now covers every vendor copy. Also: container tokens are barred as value-bearing aggregate metric_ids, and the vendor-branch qualifier descriptions no longer borrow standard-branch requirements that reference metrics outside the vendor vocabulary. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated schema paths modified without an APPROVED review decision.
This PR modifies eight files under static/schemas/source/**, which is a hard, deterministic approval gate (gated_paths: true). The current review_decision is unknown/none, not APPROVED, so decision-table row 2 fires and the outcome must be escalate — human/CODEOWNERS review is required before merge.
The reviewer delta is clean: no critical, high, or medium findings. The change is an additive refinement of the reporting-metric work — optional 5-key qualifier objects added to vendor branches (parity-tested closed key set matching the standard branch), consistent container-subsumption prose, a new conditional MUST tying committed viewability_standard to reported viewability.standard, and a dedup-tuple loosening that is additive-compatible. Covered by a minor changeset and an expanded parity contract test. No spec drift, schema↔docs incoherence, oneOf regression, or immutable-artifact violation surfaced.
Because the diff is clean, this is the only thing standing between the PR and merge: a recorded human/CODEOWNERS approval on the gated schema files. Once review_decision becomes APPROVED, this same clean diff can fall through to approve.
Escalation reasons
- Modifies gated schema files under
static/schemas/source/**(committed-metric.json, delivery-metric-aggregate.json, delivery-metrics.json, missing-metric.json, performance-feedback-metric.json, performance-feedback.json, vendor-metric-value.json, package-request.json) whilereview_decisionis not APPROVED — human/CODEOWNERS approval required.
Why human review
- Modifies gated schema files under static/schemas/source/** (committed-metric.json, delivery-metric-aggregate.json, delivery-metrics.json, missing-metric.json, performance-feedback-metric.json, performance-feedback.json, vendor-metric-value.json, package-request.json) while review_decision is not APPROVED — human/CODEOWNERS approval required.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/committed-metric.json (modified) matches
static/schemas/source/**; static/schemas/source/core/delivery-metric-aggregate.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/delivery-metrics.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/missing-metric.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/performance-feedback-metric.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/performance-feedback.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-metric-value.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/package-request.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'unknown', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
…r rows Verification review: the vendor_metric_accountability storyboard still stated the pre-qualifier uniqueness MUST — one row per (vendor, metric_id) — which the schema re-keyed to include the qualifier. Align the narrative and expand the changeset to name the wire-visible parts of the fix (delivery-carrier qualifier, uniqueness re-key, container token bar). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated schema files require human/CODEOWNERS approval.
This PR modifies 8 files under static/schemas/source/**, which are under a hard, non-overridable approval gate (gated_paths: true). The current review_decision is not APPROVED (unknown/none), so per decision rule row 2 the outcome must be escalate. Ladon cannot auto-approve gated schema paths until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
The reviewer's delta pass is clean: the changeset accurately stays minor (new optional closed-key qualifier plus a MUST-NOT relaxation, no breaking wire change), and the vendor_metric_accountability scenario edit is phase-narrative prose matching delivery-metrics.json. No Critical/High/Medium findings surfaced in this run. The schema↔docs coherence and changeset scope checks pass.
Escalation reasons:
- Modifies gated schema files under
static/schemas/source/**(committed-metric.json, delivery-metric-aggregate.json, delivery-metrics.json, missing-metric.json, performance-feedback-metric.json, performance-feedback.json, vendor-metric-value.json, package-request.json) whilereview_decisionis not APPROVED — human/CODEOWNERS approval required.
Once a human/CODEOWNERS approval is recorded, this clean diff would fall through to approve.
Why human review
- Modifies gated schema files under static/schemas/source/** (committed-metric.json, delivery-metric-aggregate.json, delivery-metrics.json, missing-metric.json, performance-feedback-metric.json, performance-feedback.json, vendor-metric-value.json, package-request.json) while review_decision is not APPROVED — human/CODEOWNERS approval required.
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/committed-metric.json (modified) matches
static/schemas/source/**; static/schemas/source/core/delivery-metric-aggregate.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/delivery-metrics.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/missing-metric.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/performance-feedback-metric.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/performance-feedback.json (modified) matchesstatic/schemas/source/**; static/schemas/source/core/vendor-metric-value.json (modified) matchesstatic/schemas/source/**; static/schemas/source/media-buy/package-request.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'unknown', not APPROVED. This is a hard gate enforced in code — Ladon cannot auto-approve until a human/CODEOWNERS approval is recorded, regardless of how clean the diff is.
Summary
Stacked on #6618 (base retargets to
mainautomatically when it merges).Fixes a broken schema shape and closes a vendor/standard asymmetry in the metric qualifier system:
delivery-metric-aggregate's vendor-branchqualifierwasadditionalProperties: falsewith no properties — only{}could ever validate. It now carries the same closed 5-key set as the standard branch (viewability_standard,completion_source,attribution_methodology,attribution_window,lift_dimension).canonical-reporting-commitmentalready allows a full qualifier on vendor-scope entries, but the source schemas (committed-metric,missing-metric) did not — a canonical payload with a qualified vendor commitment was inexpressible in source shape. Vendor branches now accept the optional qualifier, so the same vendor metric can be committed under (and reconciled against) different attribution windows or methodologies.tests/metric-qualifier-parity.test.cjsasserts an identical closed key set across all of them, so the next drift fails CI instead of shipping.No behavior change for existing payloads: all qualifier keys remain optional and the shipped
"qualifier": {}vendor example stays valid.Also carries a one-commit docs fix: two HTML
<!-- -->comments converted to MDX{/* */}(the HTML form fails the Mintlify parser and blocks docs tooling; the contributing guidance already prescribes the MDX form).Out of scope
performance-feedback-metric/performance-feedbackvendor branches (feedback surface, no reconciliation join) and thecommitted_at/effective_atnaming asymmetry with the canonical twin — noted for a future pass if it bites.🤖 Generated with Claude Code