Repository navigation
fix(schema): available_installment_statuses moves to the canonical reporting capabilities (#8501) - #8957
Conversation
…porting capabilities (#8501) The experimental available_installment_statuses (media_buy.installment_lifecycle, #8116) was defined only on core/reporting-capabilities.json, which only the deprecated get_products product uses, and 3.3 adds no field that exists only on a deprecated task. It moves unchanged to core/canonical-reporting-capabilities.json, beside supports_installment_breakdown, on the canonical product that list_products, request_proposals and refine_proposals return. #8866 opened that block (DR-0036), so the move can land in 3.3. Same items, uniqueItems, description, x-status: experimental and x-added-in: 3.3.0. The installment lifecycle docs, the get_media_buy_delivery reference and the experimental status row say where it lives, the docs example validates against the canonical schema, and the test checks the declaration there and its absence from the legacy schema. Minor changeset. Konstantin Mirin handed this move over on #8501. Refs #8501 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
There was a problem hiding this comment.
Ladon verdict: Escalate to human review
Escalate — gated path requires human/CODEOWNERS approval.
This PR modifies published protocol source under static/schemas/source/** (canonical-reporting-capabilities.json, reporting-capabilities.json), which is a deterministic hard approval gate (gated_paths: true). The current review_decision is REVIEW_REQUIRED, not APPROVED, so per decision rule row 2 the gate is not satisfied and the outcome must be escalate.
Escalation reasons
static/schemas/source/core/canonical-reporting-capabilities.json— gated schema-source path modified; requires human/CODEOWNERS approval.static/schemas/source/core/reporting-capabilities.json— gated schema-source path modified; requires human/CODEOWNERS approval.
No blocking findings on the merits: the reviewer found the change to be a clean, tightly-scoped relocation of the experimental available_installment_statuses field from the deprecated get_products surface to the canonical surface, with schema↔docs coherence verified, both schemas open (additionalProperties: true), tests updated, dist/** untouched, and a defensible minor changeset present. Once a human/CODEOWNERS approval lands (review_decision: APPROVED), this would fall through to the normal decision table and approve.
Why human review
- static/schemas/source/core/canonical-reporting-capabilities.json modified — gated schema-source path requires human/CODEOWNERS approval (review_decision is REVIEW_REQUIRED, not APPROVED)
- static/schemas/source/core/reporting-capabilities.json modified — gated schema-source path requires human/CODEOWNERS approval (review_decision is REVIEW_REQUIRED, not APPROVED)
- This PR touches a path under a hard, non-overridable approval gate (static/schemas/source/core/canonical-reporting-capabilities.json (modified) matches
static/schemas/source/**; static/schemas/source/core/reporting-capabilities.json (modified) matchesstatic/schemas/source/**) and the current GitHub review decision is 'REVIEW_REQUIRED', 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.
…8957 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…8957 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…8957 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…se docs #8762 (sla-window back to its 3.2 shape, business time on the creative review SLA) and #8957 (available_installment_statuses on the canonical reporting capabilities) merged; #8762's own release-doc lines arrive with the rebase. Drop both from the dependency markers, name the canonical product's reporting_capabilities in the release-notes media_buy.installment_lifecycle row, and refresh the #8501 row of the in-review table. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #8501. This PR is the "
available_installment_statuses(experimental) |get_products| Move tocore/canonical-reporting-capabilities.json" row of the deprecated-task table.This merges only after the consent window closes on Fri 2026-11-13, before the 3.3 RC.
static/schemas/source/**is Ladon-gated, so a human merges it.Summary
The experimental
available_installment_statuses(media_buy.installment_lifecycle, #8116) was defined only oncore/reporting-capabilities.json. Onmainthe only schema that uses that file is the legacycore/product.json, so the field existed only on the deprecatedget_productssurface, and 3.3 adds no field that exists only on a deprecated task. This PR moves it tocore/canonical-reporting-capabilities.json. That's the canonical product's reporting capabilities, returned bylist_products,request_proposalsandrefine_proposals, which already carrysupports_installment_breakdown. The move waited for the canonical block to open, and #8866 opened it (DR-0036).Thanks to Konstantin Mirin for the plan, and for "yes please, it's yours" on #8501, which handed this move to us.
enums/installment-status.json),uniqueItems, description,x-status: experimentalandx-added-in: 3.3.0. It sits right aftersupports_installment_breakdown, which it qualifies. Nothing else changes in either file.optimization-reporting.mdx(the "not reported versus not delivered" rule, and the example now validates againstcanonical-reporting-capabilities.json), theget_media_buy_deliveryreference and the experimental status row say where the field lives. The 3.3 release pages are docs(reference): bring the 3.3 release docs to 3.3.0-rc.0 #8883's.tests/installment-lifecycle-reporting.test.cjsvalidates the declaration against the canonical schema, checks the property's metadata there, and checks that the legacy schema no longer declares it.minor.Wire effect. A 3.3 seller declares
available_installment_statuseson the canonical product'sreporting_capabilities. On aget_productsproduct it is no longer defined. That schema is open, so a validator ignores it there rather than rejecting it. Nothing in the training agent, storyboards or scripts reads the field.Beta impact. The field shipped in
3.3.0-beta.0throughbeta.5on the legacy schema. The betas are immutable, and this is a beta-to-beta change.Testing
On
mainc951012f5e+cbbe356c00, run sequentially:npm run build:schemas: pass.npm run test:schemas: 1206 tests, 0 failures.tests/installment-lifecycle-reporting.test.cjspasses 15/15, including the new "declares available_installment_statuses on canonical reporting capabilities only".npm run test:mcp-schema-projection42/42,npm run test:examples, andnpm run test:contracts517/517: pass.product-discovery-schema-parity4/4, so the compact-discoverytools/listbudget holds with the property on the canonical product.npm run lint:additive-minor(4 recorded, 0 new),test:additive-minor,npm run build:compliance -- --check, JSON-schema validation ofoptimization-reporting.mdx, and the changeset scope check: pass.Local hook
Committed with
HUSKY=0, with the release coordinator's approval. The hook's server-unit stage times out at this host's load, so it was skipped. This PR touches no server file. CI is the gate. I ran the other hook steps by hand:npm run typecheckand the image check pass.npm run test:unitpassed 1283/1284. The one miss was a 10s load timeout inbilling/stripe-client.test.ts, and that file passes 57/57 on its own.🤖 Generated with Claude Code