Repository navigation
fix: preserve targeting input and proposal snapshot contracts - #2919
Conversation
69a2d62 to
541a79e
Compare
|
Seam constraints for the overlap with #2907 (
|
commented
Sep 14, 2026
|
Independently reproduced against merged Those four fields are inlined in both schemas with the same
jsts names the type from the title, so one name has two meanings and whichever definition the compiler meets first in a compilation unit wins for both. That's why the breakage direction flips per unit: so in Worth noting these four are also the only Input dimensions that don't use the Seam: my cardinality pass provably cannot interfere
And yes: once your resolver gives the four device/browser aliases distinct correct names, my pass becomes a permanent no-op. That is the intended end state, not a fallback I want to preserve. If your resolver also covers the array-vs-item-type collapse ( If it doesn't cover that case, keep it — and please keep Starter — agreed, with one thing I'll pick upRejecting a supplied overlay in the starter is more defensible than what I did, and it's what DR-0020 actually asks for ("sellers reject a clear the product cannot execute rather than silently retaining the default"). A starter that supports no overlay dimensions shouldn't be projecting one. Removing the now-unused import is right. The cost is that it deletes the repo's only worked example of No action taken on this PR — content, draft state, and automation untouched. 🤖 Generated with Claude Code |
541a79e to
76b0445
Compare
76b0445 to
8ef76a6
Compare
left a comment
There was a problem hiding this comment.
Ladon verdict: Request changes
Request changes — 1 blocking finding.
The generator fix in scripts/generate-types.ts correctly splits the strict TargetingOverlay from the request-only TargetingOverlayInput, resolving real AdCP spec drift, and is well covered by new type-generator, proposal-contract, and persistence tests. Good work on the test coverage.
Blocking findings
.changeset/fix-targeting-input-aliases.md— Changeset is typedpatchbut the change narrows the publicTargetingOverlayexport and altersTargetingOverlayInputZod validation (a public shape/behavior change). Under the repo's mandatory changeset-vs-wire-impact rule, a changeset whose type understates a response/export-shape change is ahighfinding. Bump the changeset tominor.
Despite the change being a legitimate drift fix, the repo policy treats an understated changeset type as blocking. Re-run should pass once the changeset is corrected to minor.
Blocking findings
- .changeset/fix-targeting-input-aliases.md — changeset typed
patchunderstates a public export/shape + Zod-validation change; must beminor(changeset-vs-wire-impact rule = high)
Superseded by a later Ladon review that rechecked and resolved its blocking findings.
left a comment
There was a problem hiding this comment.
Ladon verdict: Approve
Approve — clean resolution pass; prior blocker resolved.
The prior request-changes was driven by a changeset typed patch that understated the public targeting-type narrowing and Zod-validation change. This has been fixed: .changeset/fix-targeting-input-aliases.md is now minor, correctly reflecting the wire/contract impact. The reviewer verified the generator naming transform is non-mutating/idempotent and fail-closed, the generated core/tools/schemas deltas match intent, the example's removed resolveTargetingInput is safe behind the existing UNSUPPORTED_FEATURE rejection, and the new type/persistence/proposal tests are load-bearing.
No Critical/High/Medium findings in this run. high_risk is false, gated_paths is false, and no no-auto-approve team match. None of decision rows 1–8 fire, so the outcome falls through to row 9 (approve).
4a62352 to
48ece6e
Compare
left a comment
There was a problem hiding this comment.
Ladon verdict: Approve
Approve — clean pass, no blocking or medium findings.
This PR splits nullable request-side targeting input aliases from strict snapshot state via an idempotent, fail-closed codegen naming transform (nameTargetingInputForCodegen/codegenRefResolvers), regenerates the committed deterministic-gated output with no wire-shape drift, removes an unreachable resolveTargetingInput call from the starter example (targeting_overlay already rejected upstream), and adds comprehensive type + runtime coverage.
Checks:
- Witness-not-translator: no fabrication or re-shaping at a seam; codegen-only naming transform with no wire-shape change.
- Changeset: present and correctly
minorfor a type-only correction to an unreleased rc contract. - Transport clients: no changes under protocols/client.
- gated_paths: false; review_decision: APPROVED; no high-risk flag; no no-auto-approve team match.
No decision-table trigger fired (rows 1–8), so this falls through to row 9 = approve. Consistent with the prior approve.
48ece6e to
264625c
Compare
left a comment
There was a problem hiding this comment.
Ladon verdict: Approve
Approve.
Subsequent pass on PR #2919 (targeting input/proposal snapshot contract). Reviewed the non-generated deltas: generate-types.ts (annotation-only input aliasing, fail-closed cache-only ref resolver), generate-zod-from-ts.ts (verified-cache dereferencing with HTTP/filesystem disabled, exact Zod projection mirroring the existing CanonicalProposal precedent), the seller starter, and the type/unit tests.
No mock/fallback injection, official-client usage intact, changeset present (.changeset/fix-targeting-input-aliases.md) with impact fully disclosed, coverage thorough. No new Critical/High/Medium findings; prior clean approve stands.
Decision: no findings at any tier (rows 1, 4–6, 8 do not fire). high_risk false (rows 3, 5 skip). gated_paths false (row 2 skips despite review_decision: REVIEW_REQUIRED). No no-auto-approve team match (row 7 skips). Falls through to row 9 → approve.
Fixes the downstream targeting migration contract on the current
3.2.0-rc.3pin. Request-side targeting accepts every schema-definednullclear command, while effective targeting and proposal snapshots remain strict.Candidate identity
origin/main, #2939)cccb3ea83cb07dc24584e07aa2626b55761564bf264625c4cfa5e0d64e19a452e819a850ea7f13436d6bf0ffa292cad8f5fb6cfd5a53e1ae5eaa16eceb40f40f608b18b9ab10660086f4ea531f739f01d1d50a993a157fd6beabb52214.0.0-rc.38/3.2.0-rc.31cd940f76516b43327cbfa6c17c0befd4c093ca85b53a81a4062d38bb522d831The rebase onto #2939 was conflict-free and has no path overlap with that change. This candidate inherits #2939's removal of obsolete preview artifacts and its exact publish-inventory guard. Package verification reports 6,107 files and permits only
3.2.0-rc.3plus stable legacy protocol bundles.Contract and migration
TargetingOverlayInputacceptsnullfor all 37 targeting dimensions; effectiveTargetingOverlayand canonical proposal snapshots reject clear commands.ProposalPurchase['targeting_overlay']. The rootTargetingOverlaytype was already strict and remains so.TargetingOverlayInput/BuyProductsRequest; persisted and echoed values must be resolved targeting state.pick,omit,extend, andshape) remain typed and available.Qualification
Local qualification on the exact generated candidate passed:
npm run generate-types, repeated idempotently with unchanged core/tools/Zod hashesnpm run check:package, including examples, publint, Are The Types Wrong, packed links, and published-protocol inventoryThree independent expert reviews (protocol/schema, compatibility/code, and DX/docs/tests) converged with no blockers on this head. Fresh protected CI and Ladon review are running.
bmilekicremains requested for the required normal human maintainer review; auto-merge should merge only after branch protection is satisfied.No protocol pin, package version, release, or tag is changed here.