Repository navigation
Conversation
…#8968) The training agent does not list media_buy.installment_creative_assignment, so it refuses installment_refs on any assignment operation with UNSUPPORTED_FEATURE (field assignment_operations[i].installment_refs), as #8972 requires of a seller without the feature. Before this, the field was ignored: an assign or replace applied to every installment, and an unassign carrying it removed the creative from every installment. Committed with HUSKY=0 (approved by Release Planning for this commit): precommit:server-unit exceeds its 1500s budget at host load ~185. Run by hand instead: test:unit (one 10s load timeout in ipr-check-and-record, which passes alone), the dynamic-import, format-identity and callApi guards, typecheck, and the server unit files nearest the change (assignment-operations 22/22, served-release-fields, creative33-buyer, tenant-smoke; two tenant-smoke cases with a fixed 15s timeout pass once the timeout is raised locally, not committed). Refs #8968 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Approve
Approve.
Clean implementation of #8972's UNSUPPORTED_FEATURE refusal for installment_refs. The change adds one unconditional capability check at assignment-operations.ts:102, placed alongside the existing trackers/landing_page refusals and returning before locate() so the atomic request applies nothing — correct behavior with no kind guard since installment_refs can ride assign/replace/unassign. New test covers all three operation kinds plus unchanged-readback and capabilities-absent.
Non-protocol scope (static/schemas/source/** untouched), so no changeset is required — consistent with check-changeset-protocol-scope. No high-risk paths, no gated paths, no author-team gate, no prior decision. No medium-or-worse findings reported.
Decision table: rows 1-8 do not fire (no findings, gated_paths false, high_risk false, no team gate). Falls through to row 9 — approve. Note: review_decision is REVIEW_REQUIRED but gated_paths is false, so row 2 does not apply.
This is a follow-up to #8972 (#8968). The training agent doesn't list the experimental
media_buy.installment_creative_assignment. #8972 says a seller without the feature MUST rejectinstallment_refswithUNSUPPORTED_FEATURE, and this PR makes the training agent do that.Change
server/src/training-agent/assignment-operations.tsgets one check, beside the existingtrackersandlanding_page_urlcapability checks. It refusesinstallment_refson any assignment operation withUNSUPPORTED_FEATURE, andfieldisassignment_operations[i].installment_refs. Because the request is atomic, nothing is applied.Until now the training agent ignored the field:
assignorreplaceapplied to every installment;unassigncarrying the field got past the agent's request handling and removed the creative from every installment, even though the schema rejectsinstallment_refsonunassign.Test
A new case in
server/tests/unit/assignment-operations.test.tscoversassign,replaceandunassignwithinstallment_refs. Each must returnUNSUPPORTED_FEATUREon that field, the existing assignment must be unchanged afterwards with noinstallment_refsin readback, andget_adcp_capabilitiesmust not list the feature. The file passes 22/22.There's no changeset: this is training-agent code, and
check-changeset-protocol-scopefinds no protocol-scoped changes.Local hook notes (CI is the gate)
Release Planning approved both skips for this commit.
HUSKY=0. Stagingserver/srcruns the fullprecommit:server-unitsuite, which exceeds its 1500s budget at host load ~185. I ran these instead:test:unit: one 10s load timeout intests/ipr-check-and-record.test.mjs, which passes alone (23/23); its other steps pass, includingtest:auction-only-compliance(182/182).test:test-dynamic-imports,test:format-identity-boundariesandtest:callapi-state-changeguards, andtypecheck: all pass.assignment-operations(22/22; the only server unit test that touches assignment operations),training-agent-served-release-fields,training-agent-creative33-buyerandtenant-smoke. That's 102/104. The twotenant-smokecases with a fixed 15s timeout pass once the timeout is raised locally; that edit wasn't committed.ADCP_SKIP_STORYBOARD_MATRIX=1. The local matrix is advisory, andtraining-agent-storyboards.ymlis the gate.🤖 Generated with Claude Code