Skip to content

feat(reporting): vendor-scope metric qualifier symmetry - #6620

Open
bokelley wants to merge 5 commits into
reporting-metric-leaf-identitiesfrom
reporting-qualifier-symmetry
Open

feat(reporting): vendor-scope metric qualifier symmetry#6620
bokelley wants to merge 5 commits into
reporting-metric-leaf-identitiesfrom
reporting-qualifier-symmetry

Conversation

@bokelley

Copy link
Copy Markdown
Contributor

Summary

Stacked on #6618 (base retargets to main automatically when it merges).

Fixes a broken schema shape and closes a vendor/standard asymmetry in the metric qualifier system:

  • Bug: delivery-metric-aggregate's vendor-branch qualifier was additionalProperties: false with 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).
  • Asymmetry: canonical-reporting-commitment already 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.
  • Enforcement: the qualifier object exists in seven hand-maintained copies (committed-metric, missing-metric, delivery-metric-aggregate, performance-feedback-metric, an inline copy in performance-feedback, package-request, canonical-metric-qualifier). tests/metric-qualifier-parity.test.cjs asserts 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-feedback vendor branches (feedback surface, no reconciliation join) and the committed_at/effective_at naming asymmetry with the canonical twin — noted for a future pass if it bites.

🤖 Generated with Claude Code

bokelley and others added 2 commits August 17, 2026 01:26
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>

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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_decision is not APPROVED, 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) matches static/schemas/source/**; static/schemas/source/core/missing-metric.json (modified) matches static/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.

@aao-secretariat aao-secretariat Bot added the ladon/needs-human-review Ladon has escalated this PR for human review. label Aug 17, 2026
bokelley and others added 2 commits August 17, 2026 09:20
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>

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) while review_decision is 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) matches static/schemas/source/**; static/schemas/source/core/delivery-metrics.json (modified) matches static/schemas/source/**; static/schemas/source/core/missing-metric.json (modified) matches static/schemas/source/**; static/schemas/source/core/performance-feedback-metric.json (modified) matches static/schemas/source/**; static/schemas/source/core/performance-feedback.json (modified) matches static/schemas/source/**; static/schemas/source/core/vendor-metric-value.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/package-request.json (modified) matches static/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>

@aao-secretariat aao-secretariat Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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) while review_decision is 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) matches static/schemas/source/**; static/schemas/source/core/delivery-metrics.json (modified) matches static/schemas/source/**; static/schemas/source/core/missing-metric.json (modified) matches static/schemas/source/**; static/schemas/source/core/performance-feedback-metric.json (modified) matches static/schemas/source/**; static/schemas/source/core/performance-feedback.json (modified) matches static/schemas/source/**; static/schemas/source/core/vendor-metric-value.json (modified) matches static/schemas/source/**; static/schemas/source/media-buy/package-request.json (modified) matches static/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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ladon/needs-human-review Ladon has escalated this PR for human review.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant