Contract-half card created by the triage seat executing the maintainer's #10413 ruling. Provenance: maintainer, live PM chat 2026-08-21, verbatim 「其他接受」 accepting the triage recommendation for #10413 — option A: "给引擎聚合契约加逐聚合过滤,一次修对所有驱动" (widen the aggregate contract with a per-aggregation filter; correct once, for every driver).
Scope
Consumer
ObjectQLStrategy in packages/services/service-analytics lowers each measure's filter into the new field — that half stays on #10413 (its phase 2, comment-channel Blocked-by: pointing here). The dataset-level filter merge (#10413 phase 1) does NOT wait on this card.
Discipline
Clause-②: yes — this widens a public contract surface. Dispatch at the contract-review tier per the model-tiering rules; needs:contract-review applies on the PR. Acceptance evidence should include the #10413 reproduction (per-measure stage: 'closed_won' filters reaching engine.aggregate and changing the numbers) plus a refusal/lowering test for a driver without native conditional aggregation.
Refs: #10413 (the decision card and measurements) · #10298 / PR #10411 (the native-SQL half, merged).
Contract-half card created by the triage seat executing the maintainer's #10413 ruling. Provenance: maintainer, live PM chat 2026-08-21, verbatim 「其他接受」 accepting the triage recommendation for #10413 — option A: "给引擎聚合契约加逐聚合过滤,一次修对所有驱动" (widen the aggregate contract with a per-aggregation filter; correct once, for every driver).
Scope
@objectstack/objectql: the aggregation entry ({ field, method, alias }) gains an optional per-aggregationfilterpredicate, honoured by the aggregate execution path.packages/spec: theexecuteAggregatebridge onStrategyContext(named by/api/v1/analytics/querystill drops per-measure and dataset-levelfilteron the ObjectQL path —engine.aggregatereceives no filter at all #10413 as the spec-owned seam) widened to carry it.Consumer
ObjectQLStrategyinpackages/services/service-analyticslowers each measure'sfilterinto the new field — that half stays on #10413 (its phase 2, comment-channelBlocked-by:pointing here). The dataset-level filter merge (#10413 phase 1) does NOT wait on this card.Discipline
Clause-②: yes — this widens a public contract surface. Dispatch at the contract-review tier per the model-tiering rules;
needs:contract-reviewapplies on the PR. Acceptance evidence should include the #10413 reproduction (per-measurestage: 'closed_won'filters reachingengine.aggregateand changing the numbers) plus a refusal/lowering test for a driver without native conditional aggregation.Refs: #10413 (the decision card and measurements) · #10298 / PR #10411 (the native-SQL half, merged).