Conversation
| class CreativeAsset(CanonicalBoundaryModel): | ||
| creative_id: str | ||
| format_kind: CanonicalFormatKind | ||
| format_kind: CanonicalFormatKind | str |
There was a problem hiding this comment.
Medium: Public read-type of format_kind widens from CanonicalFormatKind to CanonicalFormatKind | str on CreativeAsset, Creative, DeliveryCreative, and CreativeManifest — all adcp.* public exports. Runtime is backward-compatible (known values still coerce to the enum arm; the wire gets more permissive, not less). But typed adopters who annotated a read as kind: CanonicalFormatKind = creative.format_kind now fail mypy. This ships under fix(types): — release-please cuts a patch — with no migration note. The repo's semver rule lists "changes the type signature of a public export" as requiring the fix!:/BREAKING CHANGE: signal plus a migration note. Non-blocking, but either add a migration note (CHANGELOG/PR body) documenting the read-type widening, or carry the breaking signal.
There was a problem hiding this comment.
Ladon verdict: Approve
Approve — forward-compat fix on canonical creative models.
What I checked:
_forward_compat.pyis flagged high-risk (modified), but the reviewer found no medium-or-higher concern on it. The change opensformat_kindtoCanonicalFormatKind | str(a left-to-right widening / open-union escape hatch) — this preserves rather than breaks forward-compat deserialization, consistent with the discriminated-union governance rule.- Type-system import layering intact; no hand-edits to generated code.
- New branches (format_schema enforcement for custom Format declarations) are covered by new tests (test_canonical_formats_v2_to_v1, test_creative_asset_regression, test_forward_compat_format_kind, type-check binding).
- No credentials-in-metadata concerns.
Medium finding (non-blocking): the public read-type widening ships under a fix: prefix with no migration note, which the repo semver rule flags. This is a single medium finding — it does not meet the ≥3 threshold for comment (row 8), no critical/high findings (row 1), gated_paths is false, no (deleted) reason, the high-risk (modified) file carries no medium finding (row 5 requires a medium finding to fire — none exist), no team gate, no prior escalation. Falls through to row 9.
Recommend the author consider whether the read-type widening warrants a migration note, but it is not blocking.
There was a problem hiding this comment.
Ladon verdict: Approve
Approve.
Clean subsequent pass on PR #1142. This delta opens the consumer-boundary format_kind enum (CanonicalFormatKind | str | None, union_mode='left_to_right') — the mandated forward-compat direction — via a new fail-closed, idempotent post_generate_fixes.py patcher whose output matches the committed generated file, plus a synced .pyi stub and a py3.10 UTC fix in tests.
No blocking findings. No medium findings. _forward_compat.py is flagged high-risk (modified), but the change widens the union in the forward-compat direction rather than removing a fallback arm or narrowing a published variant, and the reviewer surfaced no medium-or-higher concerns — presumed safe per the modified-file rule. Prior decision was approve with no findings; this run carries none forward and adds none.
No gated paths, no no-auto-approve team match. Rows 1–8 do not fire → row 9 approve.
Summary
Closes #1140
Closes #1141
Validation
Open workspace in Conductor