Conversation
There was a problem hiding this comment.
Ladon verdict: Approve
Approve — additive per-metric source availability evidence.
Checked:
- Change confined to
src/adcp/reporting/inline_source.pywith correctfeat:semver signal. - Appended dataclass field preserves positional compatibility (no public-API break, no required→optional flip).
- Fail-closed validation runs before staging.
- Comprehensive conformance (
tests/conformance/reporting/test_inline_cell_availability.py) and type-check coverage added. - No type-system layering, generated-code, forward-compat, or credential concerns touched.
Decision path: no critical/high/medium findings; gated_paths false; high_risk false; no no-auto-approve team match; review_decision: REVIEW_REQUIRED does not gate absent gated_paths. Falls through to row 9 → approve.
Per-cell evidence withdrew a metric's control total whenever *any* cell for it was unavailable, and dropped every total whenever a staged row matched no requested constituent. Both conditions are reachable with no `cell_availability` at all, so five documented legacy shapes -- a `None` not-ready answer, `covered_constituent_ids`, `unavailable_constituents`, a non-default `unavailable_status`, and bare rows with one unmatched row -- silently changed their sealed bytes, `content_fingerprint`, ledger `control_totals`, and `revision_content_sha256` for adopters who never opted in. A full-coverage manifest whose every cell was `present` lost its totals entirely because one extra row was staged. A control total is a checksum over the staged rows: `reporting_inspection` and `_reconcile` verify it by recomputing from the revision's rows, so unmatched rows belong in it and a derived constituent status says nothing about it. Withdraw a column only when the adapter explicitly declared a cell of that metric unavailable -- the case where row values exist but the adapter has said they are not a measurement. Also stop the zero-row mixing guard from naming `cell_availability`: a derived result reaches it too, and an adopter who never set that field should not be sent looking for it. Verified all twelve representative legacy shapes now seal byte-identical to origin/main, and re-ran 10,800 randomized override/fallback combinations through the execution conformance validator. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Approve
Approve
Subsequent pass to a previously-approved PR (prior head 2037b40, no findings). The delta narrows control-total withdrawal to explicitly declared incomplete cells so the total is a checksum over staged rows, restoring legacy sealed-bytes/fingerprint behavior for adopters supplying no cell_availability and closing a latent replay-fingerprint regression. Reviewer verified the Collection import, freshness-gate interaction, None-fetch path, and that no test was disabled — no public-surface or semver break.
No blocking (critical/high) findings and no medium findings.
Gate checks:
- No no-auto-approve team match (row 7 n/a).
- gated_paths: false → row 2 n/a (review_decision REVIEW_REQUIRED does not gate because paths are not gated).
- high_risk: false → rows 3/5 n/a.
- Prior decision was approve → row 6 n/a.
- Zero medium findings → row 8 n/a.
Falls through to row 9: approve.
Inline reporting fetches can now report different availability for each requested constituent/metric cell. A single constituent can retain impressions, explicitly report zero clicks, mark viewability delayed, and explain unsupported completed views in one sealed manifest.
Closes #1170
MetricEvidence, optional nestedInlineFetchResult.cell_availability, and helpers for complete data, an unsupported metric everywhere, and a delayed metric through a watermark.Compatibility
Bare rows,
None, existing positionalInlineFetchResultarguments, and omitted/empty evidence maps retain their input behavior and constituent defaults. An independent review compared 12 representative legacy sealed shapes byte-for-byte withorigin/main; all remain identical. Legacy-derived incomplete cells and unmatched staged rows continue to participate in their existing control-total behavior. A metric total is withheld only when the adapter explicitly declares a cell of that metric unavailable.Validation
origin/main, a 1,920-case exhaustive sweep, and a 10,800-case randomized validation fuzz, with no crashes or validation failures.Residual risks and limits
execute()rather than becoming typed source failures. This widens a pre-existing class and should be handled separately at the worker boundary.Open workspace in Conductor