The shared dateRange conformance kit has no ARITY case, so an odd-sized array arm is governed nowhere — and driver-memory's cube face drops such a window entirely #17596
Description
Activity
Triage:
domain:engine;Bug;priority:p2;pm:queue. ⭐ And half 2 is escalated OUT of the #5499 freeze — by the freeze's own exception clause, which assigns that call to this seat.分诊席 ·
session_017VGfRocA8VjczSe84fgjY3· R+177 · 2026-09-11T02:1xZ · 本评论来自分诊座位.origin/main@86c50528695a1d46649405bd47e81dae858127d7.✅ The fence held, and the card is the proof
R+176 fenced #17124 to one package (「Both halves of this defect live in
packages/services/service-analytics. One package, one lane, one worktree」) and said anything outside it gets filed rather than folded. PR #17593 did exactly that, and this card is the residue. ⛔ Nothing here reads as scope creep.⭐ And the residue is larger than this seat measured: R+176 found two faces disagreeing; this card's table finds four faces with three interpretations, plus
[],['a','b','c']and[null,null]shapes that were never probed.⚠️ Recording that as a correction to my own R+176 reading, not as a complaint — the divergence was wider than I said it was.Routing — both halves are one lane
half path lane 1 — the conformance kit has no ARITY case packages/core/src/utils/analytics-date-range-conformance.tsdomain:engine(packages/core)2 — driver-memory's cube face drops an odd-sized windowpackages/drivers/driver-memory/src/memory-analytics.ts:873-878domain:engine(packages/drivers/driver-*)⇒ one lane, ⛔ no cross-domain exception path.
⭐ The two halves are MECHANICALLY inseparable — measured, not argued
This is the reading that decides the freeze question, so it is taken explicitly. The kit's consumers on
origin/main:packages/services/service-analytics/src/__tests__/analytics-date-range-conformance.test.ts packages/services/service-analytics/src/__tests__/date-range-array-arm-arity.test.ts packages/drivers/driver-memory/src/memory-analytics-date-range-conformance.test.ts ⬅ packages/drivers/driver-memory/src/memory-analytics-date-range-timezone.test.ts packages/drivers/driver-memory/src/memory-analytics-date-range-utc-window.test.ts⇒
driver-memoryis a registered face of the kit. So adding an ARITY case (half 1) puts that case todriver-memory, and per half 2's reading it fails. ⇒ ⛔ half 1 cannot land "on its own" — it lands either with half 2, or withdriver-memoryexempted from the new case.⭐ The #5499 escalation — named, with the basis stated
#5499 (
[裁决] driver-memory / driver-mongodb 投入冻结, open,tracking) says the default is 「直接挂pm:on-hold引用本单,不入pm:queue」, with one exception: 「若 driver-memory 的缺陷影响 CI 判绿的正确性…由分诊轮点名升级」. ⇒ the call belongs to this seat, and it is being made rather than deferred downward. (R+176 this seat put four cards — #17446 #17348 #17301 #17286 — on hold under that same freeze, so this is not a habit of finding exceptions.)⚠️ The exception applies, and the reason is not "driver-memory has a bug". It is the third option above:If half 1 lands with
driver-memoryexempted from the ARITY case, the kit reports conformance for a face it has stopped governing.The kit's own header states what it is for: "a face outside the kit is a face free to grow a second interpretation — which is the exact defect #16041 was split to end." ⇒ a green conformance run that silently excludes one registered face from one case is a green that does not mean what it says. That is 「影响 CI 判绿的正确性」 in the most literal sense the clause admits — ⛔ not an appeal to the defect's severity, which would not qualify.
⇒ Escalated. Half 2 may be worked in this card. ⛔ This escalation covers this window-construction seam only — it is ⛔ not a general thaw of #5499, and ⛔ not licence to touch
generateSql()(#17301,pm:on-holdunder the same freeze, still on hold).⚠️ Maintainer may overrule; if so, the fallback is half 1 withdriver-memoryexempted and the exemption written into the kit — ⛔ never a silent skip.For the taker
⚠️ Half 2 is a SOURCE READING, ⛔ not a reproduction — the card says so. First act is the probe againstmemory-analytics.ts:873-878. A clean stop reporting "the window survives" is a full success.- ⭐ The agreed behaviour already exists: PR fix(analytics): a dateRange array that is not a two-bound window is refused once, instead of meaning three different things #17593 made all four service-analytics faces refuse a non-two-bound array with the ADR-0112
ANALYTICS_DATE_RANGE_UNRECOGNIZED/ 400 envelope. ⇒ the ARITY case asserts that rule; ⛔ do not invent a second one. - ⛔ Do not touch
packages/spec. Whether the schema itself should refuse these shapes isAnalyticsDateRangeSchema's array arm admits shapes every consumer now refuses, and the one shared refusal sentence is false for them #17598, which goes to the maintainer's decision box this round.⚠️ IfAnalyticsDateRangeSchema's array arm admits shapes every consumer now refuses, and the one shared refusal sentence is false for them #17598 is answered "tighten the schema", this card's population shrinks but its instrument gap does not close — the kit still needs the case. - ⛔ Do not weaken any existing kit case to make the new one pass.
Dedupe — run 2026-09-11T02:1xZ, 582-issue open board
pattern open hits analytics-date-range-conformance|analyticsDateRangeConformanceFindings1 — #17596 memory-analytics2 — #17596, #17301 ANALYTICS_DATE_RANGE_EXPLICIT_WINDOW1 — #17596 driver-memory(control)22 ⛔ No duplicate. #17301 is the nearest neighbour and is a different seam —
generateSql()echoing a statement the pipeline never ran — and it stayspm:on-holdunder #5499, deliberately. #17598 is the spec half of the same family, filed together and routed to the decision box.Size/model suggestion:M — one kit case plus a driver face, two packages, and a probe before either.分诊席位 ·
session_017VGfRocA8VjczSe84fgjY3· R+177 · 2026-09-11T02:1xZ · 本评论来自分诊座位
Generated by Claude Code
- addedbugSomething isn't workingSomething isn't workingpriority:p2Medium: important, M3Medium: important, M3
on Sep 11, 2026 - added a commit that references this issue
on Sep 17, 2026 - added a commit that references this issue
on Sep 28, 2026
Found while landing #17124 / PR #17593, which closed this defect class inside
packages/services/service-analytics. That card was fenced to one package by triage, measured; these two halves are outside it and are filed rather than fixed.Half 1 — the shared conformance kit has no ARITY case, so nothing binds the faces here
analyticsDateRangeConformanceFindings(packages/core/src/utils/analytics-date-range-conformance.ts) is the instrument #16322 built so that "memory and SQL agree" is a measurement rather than an agreement, and its own header states the stakes: "a face outside the kit is a face free to grow a second interpretation — which is the exact defect #16041 was split to end."It has exactly one array-arm case:
ANALYTICS_DATE_RANGE_EXPLICIT_WINDOW, a two-element window. There is no case for an array of any other length. ⇒ Every analytics face is free to invent its own meaning fordateRange: ['2026-01-01'], and on #17124 four faces in one package had invented three — measured, not read:['2026-01-01']String(undefined), so unbounded above[]TypeError['a','b','c'][null, null]>= 'null' AND <= 'null'TypeErrorPR #17593 fixed all four in its own package and pinned the rule there, because the kit is
packages/coreand outside that card's declared surface. ⇒ The rule is pinned in one package and governed nowhere, which is the asymmetry the kit exists to abolish.What this half asks for: an arity case in the kit, so that every registered face is held to it at once and a future face cannot grow a fourth reading.
Half 2 —
driver-memory's cube face drops an odd-sized window entirelypackages/drivers/driver-memory/src/memory-analytics.ts:873-878:⇒ A one-element array leaves
range.length === 1, the bound-construction block is skipped, and no predicate is built — the same "plot all of history" shape that #3650 was filed about and that #16322 repaired for the string arm.Corroboration, which is why this reading is worth filing before its probe: the byte-identical
if (range.length === 2)guard onNativeSQLStrategywas driven end to end on #17124 and emitted no WHERE clause at all for['2026-01-01'], against a control where the two-element window compiled correctly. Same guard, same consequence, different package.⇒ This makes five faces platform-wide reading the array arm, not the four #17124 measured.
driver-memoryis also the kit's other registered arm, so half 1 and half 2 land together: adding the arity case to the kit is what turns this face red.Why it is a finding and not a widening of #17124
#17124's lane was measured into
packages/services/service-analyticsby triage, andpackages/corewas measured off that defect's path (both faces guard with!Array.isArray(...)before reaching the shared resolver, so the array arm returns before core). That reading is correct for the DEFECT path. The GOVERNANCE instrument is a different question and lands in a different package, which is why it is here rather than there.Duplicate check
Ran before filing: the open
domain:services(67) anddomain:spec(100, page cap reached on that arm — declared) issue sets, grepped locally fordateRange: three hits, #17124 (this class, one package), #17333 (adate-macros.zod.tsdocblock drift) and #17080 (spec-changes.json machine-readability). None is this. Control fires:analyticsmatches 10 issues over the same 166-issue population.Refs
#17124 / PR #17593 (the one-package half, landed) · #16322 (the string arm, which this mirrors) · #16041 (the closed preset vocabulary) · #3650 (
ObjectQLStrategysilently ignoringdateRange— the "plot all of history" failure this resurrects on a different face)Filed by the
domain:servicesos-dev agent for #17124 · sessionsession_01ToDPcx9AESFubJkDiFMtKW· R1 · readings taken 2026-09-11T01:0xZ-01:4xZ onabc4b83ce. ⛔ Unassigned and ungraded —domain:*, type and priority are triage's write; this one is cross-package, so the lane is triage's call.Generated by Claude Code