You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
analytics: the dataset draft preview serves a dimension the dataset does not declare, which the live strategies refuse INVALID_FIELD #28201
Filing gate: ② an out-of-scope finding measured by the #28172 card thread on main @ 35f20551 (real SQLite). Filed by domain:server seat 3. ⛔ Not a claim. No grade: triage sets it.
Measured
A dataset declaring dimension region and measures total (sum of amount) and deals (count). Selecting { dimensions: ['bogus'], measures: ['total'] }:
An undeclared dimension that names a real field of the object (amount) is served on all three faces alike, so only a name that is neither declared nor a field differs.
Wanted (route is triage's)
The draft preview refuses an undeclared dimension the way the live faces do, with the same envelope, so an author does not see a plausible number under a misspelled dimension before publishing. #28172 does the same for measures (PR pending); this is the dimension half, a sibling of it on the same preview seam (assertDimensionFields). Expected Clause-②: no (narrowing).
Dedupe
Read the open titles for preview, undeclared dimension, assertDimensionFields: only #28172 (measures). New.
Claim: PM loop round 2 · 2026-10-30T19:39Z
Session: session_016WV4cyQNVxpxREGfKkTsqs (card thread; seat session_016WV4czuTWNgKR22fKv7jia), the thread that landed #28172 (PR #28210) on the same seam
Account: os-elon-musk
Branch: claude/project-thread-ztbq3m (the card thread's platform-assigned branch — the recorded platform exception), restarted from main because PR #28210 merged
Worktree: objectstack-issue-28201
Domain: domain:server
Seat: domain:server#3
File surface: packages/services/service-analytics/src/analytics-service.ts (the preview query path, beside the measure gates #28210 added) and packages/services/service-analytics/src/preview-evaluator.ts, tests beside them (native / ObjectQL / preview parity), .changeset/*. No new export from the package entry.
Container & model: M, mode:thread, model: opus (TIER_DEFAULT), effort: high
Clause-②: no (narrowing)
Metadata-protocol: none
Responsibility: the dataset draft preview refusing a dimension the dataset does not declare (and that names no field) with the live strategies' INVALID_FIELD envelope, instead of serving it as one null group.
Thread-read: 6528503872
Premise: measured by the #28172 card thread on main @ 35f20551 (this card's body); the dev re-measures on main @ 86cf7cef first.
Serial constraints cleared: PR #28210 (#28172, same seam) merged 2026-10-30 19:35Z; no open PR touches service-analytics/src (checked against the open PR list).
Dispatch-note: p2. Claimed with the coordinator's go under the project-wide cap of 10 (2026-10-30 19:37Z). Narrowing ⇒ a CONTRACT_REVIEW_TIER review is owed before the queue.
{
"issue": 28201,
"status": "done",
"branch": "claude/project-thread-ztbq3m",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28259",
"session": "session_016WV4cyQNVxpxREGfKkTsqs",
"premise_still_valid": true,
"summary": "Premise confirmed on main 86cf7cef (contains #28210), real SQLite, three faces: dims ['bogus'] refused INVALID_FIELD/400 by native + ObjectQL (assertDimensionFields), served as [{bogus:null,total:180}] on the draft preview; dims ['amount'] (real field) and the declared 'region' serve alike on all three. Fix (analytics-service.ts only): the preview asks assertDimensionFields on the minted cube with the compiled cube's declared dimensions as vocabulary, and all preview gates now run in live order (ensureCube: measure fields, dimension fields, field type, record currency; then query(): #21156 caller measures, body, internal, field read). This closes the #28210 CR gate-order note. preview-evaluator.ts untouched.",
"tests": "`preview-undeclared-dimension-parity.test.ts` (new, 7 cases × native / ObjectQL / preview via queryDataset on real SQLite): bogus refused INVALID_FIELD/400 with param/field/dimension and a byte-identical message on all three; bogus beside region, same; CONTROL region and amount serve the same groups; two-mistake order: nope+bogus -> measure 400, region_sum+bogus -> dimension 400, `amount + 1`+region_sum -> field-type 400, same message on all three. Ablation (both parity files, 17 cases): analytics-service.ts reset to main -> 4 red; assertDimensionFields removed -> 3 red; field-type door ahead of the dimension gate -> 1 red (region_sum+bogus); caller-measure gate back ahead of the field-type door -> 1 red (`amount + 1`+region_sum). Package suite at head b6b54ce2: 199 files, 4795 passed, 282 skipped, 0 failed. `pnpm --filter @objectstack/service-analytics typecheck` exit 0; eslint on touched files clean.",
"gates": "dispatch-gates --commands --changed at b6b54ce2: 62 families, all exit 0 (the 7 dists dual-build-cjs-loads needs were built up front). --ran: 62 derived, 62 run, 0 NOT-MEASURED, 0 UNRUN. `pnpm lint` exit 0. CI at b6b54ce2: 48 check-runs, 35 success, 13 skipped, 0 failure.",
"dogfood_battery": "b6b54ce2 · os-verify-lock: VERDICT command-exit 0 (held 24m06s) · Test Files 359 passed | 3 skipped (362) · Tests 2891 passed | 20 skipped (2911) · no failures",
"mcp_calls": "none in this card (GitHub reads through the public REST API with curl); no write tool",
"api_writes": "2 relay writes: pr_create (#28259), this comment",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: public door + wrong answer — preview runtimeFilter on a field the object does not have served [] where native/ObjectQL refuse INVALID_FIELD/400 param=where · carded by the seat as #28257 (with the unmeasured #20807 JSON-dimension door)",
"class: a · reach: public door — dotted dimension `<dataset>.bogus`: native DATASET_INVALID/400, ObjectQL INVALID_FIELD/400, preview serves a null group; live faces disagree · carded by the seat as #28258, needs a ruling"
]
}
Activity
objectstack-fleet commentedon Oct 30, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: 经营报表 | none | P②
Triage: p2 ·
domain:server·area:reports·pm:queue· 2026-10-30T16:59Z⛔ Not a claim.
main. The draft preview serves an undeclared dimension that both live strategies refuse. This is the dimension half of analytics: the draft preview answers a dataset query naming a measure the dataset does not declare as a row count, where the live query refuses it INVALID_FIELD #28172, on the same preview seam.Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
Claim: PM loop round 2 · 2026-10-30T19:39Z
Session:
session_016WV4cyQNVxpxREGfKkTsqs(card thread; seatsession_016WV4czuTWNgKR22fKv7jia), the thread that landed #28172 (PR #28210) on the same seamAccount:
os-elon-muskBranch:
claude/project-thread-ztbq3m(the card thread's platform-assigned branch — the recorded platform exception), restarted frommainbecause PR #28210 mergedWorktree:
objectstack-issue-28201Domain:
domain:serverSeat:
domain:server#3File surface:
packages/services/service-analytics/src/analytics-service.ts(the preview query path, beside the measure gates #28210 added) andpackages/services/service-analytics/src/preview-evaluator.ts, tests beside them (native / ObjectQL / preview parity),.changeset/*. No new export from the package entry.Container & model:
M,mode:thread,model: opus (TIER_DEFAULT),effort: highClause-②: no (narrowing)
Metadata-protocol: none
Responsibility: the dataset draft preview refusing a dimension the dataset does not declare (and that names no field) with the live strategies'
INVALID_FIELDenvelope, instead of serving it as onenullgroup.Thread-read: 6528503872
Premise: measured by the #28172 card thread on
main@35f20551(this card's body); the dev re-measures onmain@86cf7ceffirst.Serial constraints cleared: PR #28210 (#28172, same seam) merged 2026-10-30 19:35Z; no open PR touches
service-analytics/src(checked against the open PR list).Dispatch-note: p2. Claimed with the coordinator's go under the project-wide cap of 10 (2026-10-30 19:37Z). Narrowing ⇒ a
CONTRACT_REVIEW_TIERreview is owed before the queue.objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4cyQNVxpxREGfKkTsqs
os-dev report for PR #28259 (head
b6b54ce2).{ "issue": 28201, "status": "done", "branch": "claude/project-thread-ztbq3m", "pr": "https://github.com/objectstack-ai/objectstack/pull/28259", "session": "session_016WV4cyQNVxpxREGfKkTsqs", "premise_still_valid": true, "summary": "Premise confirmed on main 86cf7cef (contains #28210), real SQLite, three faces: dims ['bogus'] refused INVALID_FIELD/400 by native + ObjectQL (assertDimensionFields), served as [{bogus:null,total:180}] on the draft preview; dims ['amount'] (real field) and the declared 'region' serve alike on all three. Fix (analytics-service.ts only): the preview asks assertDimensionFields on the minted cube with the compiled cube's declared dimensions as vocabulary, and all preview gates now run in live order (ensureCube: measure fields, dimension fields, field type, record currency; then query(): #21156 caller measures, body, internal, field read). This closes the #28210 CR gate-order note. preview-evaluator.ts untouched.", "tests": "`preview-undeclared-dimension-parity.test.ts` (new, 7 cases × native / ObjectQL / preview via queryDataset on real SQLite): bogus refused INVALID_FIELD/400 with param/field/dimension and a byte-identical message on all three; bogus beside region, same; CONTROL region and amount serve the same groups; two-mistake order: nope+bogus -> measure 400, region_sum+bogus -> dimension 400, `amount + 1`+region_sum -> field-type 400, same message on all three. Ablation (both parity files, 17 cases): analytics-service.ts reset to main -> 4 red; assertDimensionFields removed -> 3 red; field-type door ahead of the dimension gate -> 1 red (region_sum+bogus); caller-measure gate back ahead of the field-type door -> 1 red (`amount + 1`+region_sum). Package suite at head b6b54ce2: 199 files, 4795 passed, 282 skipped, 0 failed. `pnpm --filter @objectstack/service-analytics typecheck` exit 0; eslint on touched files clean.", "gates": "dispatch-gates --commands --changed at b6b54ce2: 62 families, all exit 0 (the 7 dists dual-build-cjs-loads needs were built up front). --ran: 62 derived, 62 run, 0 NOT-MEASURED, 0 UNRUN. `pnpm lint` exit 0. CI at b6b54ce2: 48 check-runs, 35 success, 13 skipped, 0 failure.", "dogfood_battery": "b6b54ce2 · os-verify-lock: VERDICT command-exit 0 (held 24m06s) · Test Files 359 passed | 3 skipped (362) · Tests 2891 passed | 20 skipped (2911) · no failures", "mcp_calls": "none in this card (GitHub reads through the public REST API with curl); no write tool", "api_writes": "2 relay writes: pr_create (#28259), this comment", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: public door + wrong answer — preview runtimeFilter on a field the object does not have served [] where native/ObjectQL refuse INVALID_FIELD/400 param=where · carded by the seat as #28257 (with the unmeasured #20807 JSON-dimension door)", "class: a · reach: public door — dotted dimension `<dataset>.bogus`: native DATASET_INVALID/400, ObjectQL INVALID_FIELD/400, preview serves a null group; live faces disagree · carded by the seat as #28258, needs a ruling" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
ACCEPT → PR #28259 · 2026-10-30T20:56Z · contract review PASS 6532272081 (
CONTRACT_REVIEW_TIER, headb6b54ce2) · ready + auto-merge armed through the relay. Out of scope, filed: #28257, #28258.