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
lint: os validate / os build refuse a report that reads a dataset its declared dependency holds (chart-dataset-unknown reads stack.datasets alone), while the runtime serves it — report half of #32967 #33128
Filing gate: ① a product defect with a named location. This is work that #32967 named and PR #33121 does not carry; it was carried to triage by epic:#31527#2 (6857990387) from review#1's boundary flag on PR #33121 (6857932402).
What happens
#32967 makes authoring resolve a dataset reader through the reader's declared closure, as the runtime does. Its summary names dashboards, reports and joined blocks. PR #33121 fixes dashboards only.
For reports, chart-dataset-unknown (packages/lint/src/validate-chart-bindings.ts) still reads stack.datasets alone. On the per-package pass, a report that reads a dataset held by a package it declares as a dependency is refused by os validate / os build, while the runtime serves that report. So authoring is stricter than the runtime, and a valid package will not build.
Disposed without a card, by the epic seat on review#1's measurement: card item 2 (an app action starting a module flow). Neither side refuses it there, so authoring and runtime agree for flows.
Why it matters
An app built from modules (the #32929 shape) cannot build a report on a sibling module's dataset, even though it would work at runtime. The refusal is wrong, so its remedy text cannot help.
Row: authoring wrongly refuses a valid package, so the author is stuck at build with no remedy (the refusal itself is false). That is wrong-running, p2.
Claim: PM loop round 1 · batch 1 of the maintainer's order 6866786021 · 2026-11-13T23:03Z
Session: session_01L9qibvtG32iBab1PR1fpR6 (card thread; seat session_01L9qibzECS2npZFku4956Um)
Account: os-tesla
Branch: claude/project-thread-nlni1h (the card thread's harness-pinned branch; the thread can push only this name)
Worktree: objectstack-issue-33128
Domain: domain:server
Seat: epic:#31527#3
File surface: packages/lint/src/validate-chart-bindings.ts, packages/lint/src/validate-report-runtime-filter.ts, packages/core/src/package-scoped-resolution.ts (export only, if needed), their tests, root .changeset/ (stop on breach; explain in the report)
Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: xhigh (epic child)
Clause-②: no
Metadata-protocol: none
Responsibility: platform code in objectstack (packages/lintchart-dataset-unknown reads stack.datasets alone); the platform path that already covers it is packages/core/src/package-scoped-resolution.ts (the dashboard half, PR #33121); reached by an app built from modules with a report on a declared dependency's dataset — no user seen yet
Thread-read: 6858113533
Premise: holds (main read at 47f6c939; the thread re-measures first, per the order)
Serial constraints cleared: none in flight on these files; PR #33121 (dashboard half) merged at 40c73a8f
Order: /mnt/project-files/epic-31527-3/r2026-11-13/dispatch-33128.md under that folder's FRAME.md (the coordinator pasted both into the thread's opening message). Contract review: this seat, at CONTRACT_REVIEW_TIER.
{
"issue": 33128,
"status": "done",
"branch": "claude/project-thread-nlni1h",
"pr": "https://github.com/objectstack-ai/objectstack/pull/33171",
"session": "session_01L9qibvtG32iBab1PR1fpR6",
"premise_still_valid": true,
"summary": "Measured at origin/main 47f6c939: on the per-package pass a report over a declared dependency's dataset was refused chart-dataset-unknown ('Declared datasets: (none).'). validate-chart-bindings.ts now resolves every chart binding through indexArtifactDatasetResolution (the dashboard rule's resolution, over packageResolutionClosure), imported, not copied, and takes the twin's refusal (error naming holders and the open fix) and unverified (warning) sentences for a name the runtime refuses the reader; two closure holders are refused naming both. validate-report-runtime-filter.ts re-judged: it already reads the same closure-aware index since PR 33121, so it does not share the defect; unchanged. The order names packages/core/src/package-scoped-resolution.ts as the resolver; the dashboard half actually resolves in packages/lint (indexArtifactDatasetResolution), which is what this PR reuses; core is not edited.",
"tests": "head 60edc5ee: pnpm --filter @objectstack/lint build + typecheck + test under os-verify-lock: VERDICT command-exit 0, Test Files 208/208, Tests 8836/8836. New describe '[#33128] chart-dataset-unknown resolves through the reading package’s declared closure' (11 cases) in validate-chart-bindings.test.ts. Ablations via ablation-replace (src import, no dist leg), each restored blob == HEAD and git diff HEAD empty: A1 BASE index back -> 6 failed/91; A2 refusal arm dropped -> 5 failed; A3 every refusal softened to warning -> 6 failed; A4 shared resolver picks first of two closure holders -> 2 failed (red line 2 pin). CLI leg: os validate on a composeStacks fixture: declared exit 0, undeclared exit 1 naming holder + fix; A1 in lint dist (preflight: marker present in 4 built files) -> declared exit 1 with the BASE sentence; restored, rebuilt, preflight --absent clean, tree clean. A first CLI leg with the marker in a line comment was stripped by the bundle (preflight ABSENT) and discarded.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 60edc5ee: 59 families, each run with stdin from /dev/null, exit codes captured before pipes; --ran: '59 run, 0 NOT-MEASURED (a DERIVED zero — all 59 recorded an exit code and none of them is 3)'. First-run prerequisite failures rerun green: check-plugin-teardown-shape --self-test exit 3 on shallow clone -> 0 after fetch --unshallow; check:dts-closure exit 1 and check:dual-build-cjs-loads exit 3 after an OS_SKIP_DTS CLI build -> 0 after full pnpm build. pnpm lint: exit 0. CI check-runs: in_progress at report time (draft just opened).",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"line_budget": "278 changed lines (+268/-10) over 3 files, under the 3000 threshold",
"files_changed": [
".changeset/33128-report-dataset-reader-closure.md",
"packages/lint/src/validate-chart-bindings.ts",
"packages/lint/src/validate-chart-bindings.test.ts"
],
"deviations": [
"Resolver pointer: the order names packages/core/src/package-scoped-resolution.ts; the dashboard half's resolver is indexArtifactDatasetResolution in packages/lint/src/validate-widget-bindings.ts (imported, file not edited; surface held).",
"Scope reach: the one rule fixes all three surfaces it judges (reports and joined blocks, list-view charts, page charts) because each reader sends its own served package as callerPackage; and the union run now reads every body as the dashboard rule does (pinned; in the changeset).",
"Ablation A4 mutated validate-widget-bindings.ts (outside the edit surface) for the red-line-2 proof only; restored, never committed."
],
"mcp_calls": "5 — mcp__github__issue_read x3 (get, get_comments x2); ToolSearch loads not counted; 0 write tools",
"api_writes": "3 — git push (not REST); relay pr_create (fleet-write run 43529529193, objectstack-ai/objectstack#33171, assignee os-tesla); post-stamped comment on #33128 (this report)",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"noted, not filed · validate-report-date-range.ts indexes stack.datasets alone, so on the per-package pass a report's dateRange over a declared dependency's dataset is not judged there; the union run judges it; no false refusal, no verdict lost · carrier: none",
"noted, not filed · per-package object graph holds the package's own objects, so a runtimeFilter / widget filter key on a dependency-held object is judged only on the union run (probe at 60edc5ee: no per-package finding for runtimeFilter { nope }) · carrier: none"
]
}
ACCEPT → PR #33171 comment 6868304242 · head 60edc5ee · readied and auto-merge armed 2026-11-14T00:17Z; Fixes #33128 closes this card on merge, and the seat strips pm:dispatched then.
Activity
objectstack-fleet commentedon Nov 13, 2026
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Path: none
Triage: grade ·
domain:server· p2 ·pm:queue· 2026-11-13T15:57Z⛔ Not a claim.
objectstack-fleet commentedon Nov 13, 2026
epic:#31527#3 · os-tesla · session_01L9qibzECS2npZFku4956Um
Claim: PM loop round 1 · batch 1 of the maintainer's order 6866786021 · 2026-11-13T23:03Z
Session:
session_01L9qibvtG32iBab1PR1fpR6(card thread; seatsession_01L9qibzECS2npZFku4956Um)Account:
os-teslaBranch:
claude/project-thread-nlni1h(the card thread's harness-pinned branch; the thread can push only this name)Worktree:
objectstack-issue-33128Domain:
domain:serverSeat:
epic:#31527#3File surface:
packages/lint/src/validate-chart-bindings.ts,packages/lint/src/validate-report-runtime-filter.ts,packages/core/src/package-scoped-resolution.ts(export only, if needed), their tests, root.changeset/(stop on breach; explain in the report)Container & model:
M,mode:thread,model: default(dispatch-gates --tier: no path-derived mandate),effort: xhigh(epic child)Clause-②: no
Metadata-protocol: none
Responsibility: platform code in objectstack (
packages/lintchart-dataset-unknownreadsstack.datasetsalone); the platform path that already covers it ispackages/core/src/package-scoped-resolution.ts(the dashboard half, PR #33121); reached by an app built from modules with a report on a declared dependency's dataset — no user seen yetThread-read: 6858113533
Premise: holds (main read at
47f6c939; the thread re-measures first, per the order)Serial constraints cleared: none in flight on these files; PR #33121 (dashboard half) merged at
40c73a8fOrder:
/mnt/project-files/epic-31527-3/r2026-11-13/dispatch-33128.mdunder that folder'sFRAME.md(the coordinator pasted both into the thread's opening message). Contract review: this seat, atCONTRACT_REVIEW_TIER.Generated by Claude Code
objectstack-fleet commentedon Nov 13, 2026
epic:#31527#3 · os-tesla · session_01L9qibvtG32iBab1PR1fpR6
os-dev-report
{ "issue": 33128, "status": "done", "branch": "claude/project-thread-nlni1h", "pr": "https://github.com/objectstack-ai/objectstack/pull/33171", "session": "session_01L9qibvtG32iBab1PR1fpR6", "premise_still_valid": true, "summary": "Measured at origin/main 47f6c939: on the per-package pass a report over a declared dependency's dataset was refused chart-dataset-unknown ('Declared datasets: (none).'). validate-chart-bindings.ts now resolves every chart binding through indexArtifactDatasetResolution (the dashboard rule's resolution, over packageResolutionClosure), imported, not copied, and takes the twin's refusal (error naming holders and the open fix) and unverified (warning) sentences for a name the runtime refuses the reader; two closure holders are refused naming both. validate-report-runtime-filter.ts re-judged: it already reads the same closure-aware index since PR 33121, so it does not share the defect; unchanged. The order names packages/core/src/package-scoped-resolution.ts as the resolver; the dashboard half actually resolves in packages/lint (indexArtifactDatasetResolution), which is what this PR reuses; core is not edited.", "tests": "head 60edc5ee: pnpm --filter @objectstack/lint build + typecheck + test under os-verify-lock: VERDICT command-exit 0, Test Files 208/208, Tests 8836/8836. New describe '[#33128] chart-dataset-unknown resolves through the reading package’s declared closure' (11 cases) in validate-chart-bindings.test.ts. Ablations via ablation-replace (src import, no dist leg), each restored blob == HEAD and git diff HEAD empty: A1 BASE index back -> 6 failed/91; A2 refusal arm dropped -> 5 failed; A3 every refusal softened to warning -> 6 failed; A4 shared resolver picks first of two closure holders -> 2 failed (red line 2 pin). CLI leg: os validate on a composeStacks fixture: declared exit 0, undeclared exit 1 naming holder + fix; A1 in lint dist (preflight: marker present in 4 built files) -> declared exit 1 with the BASE sentence; restored, rebuilt, preflight --absent clean, tree clean. A first CLI leg with the marker in a line comment was stripped by the bundle (preflight ABSENT) and discarded.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at 60edc5ee: 59 families, each run with stdin from /dev/null, exit codes captured before pipes; --ran: '59 run, 0 NOT-MEASURED (a DERIVED zero — all 59 recorded an exit code and none of them is 3)'. First-run prerequisite failures rerun green: check-plugin-teardown-shape --self-test exit 3 on shallow clone -> 0 after fetch --unshallow; check:dts-closure exit 1 and check:dual-build-cjs-loads exit 3 after an OS_SKIP_DTS CLI build -> 0 after full pnpm build. pnpm lint: exit 0. CI check-runs: in_progress at report time (draft just opened).", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "line_budget": "278 changed lines (+268/-10) over 3 files, under the 3000 threshold", "files_changed": [ ".changeset/33128-report-dataset-reader-closure.md", "packages/lint/src/validate-chart-bindings.ts", "packages/lint/src/validate-chart-bindings.test.ts" ], "deviations": [ "Resolver pointer: the order names packages/core/src/package-scoped-resolution.ts; the dashboard half's resolver is indexArtifactDatasetResolution in packages/lint/src/validate-widget-bindings.ts (imported, file not edited; surface held).", "Scope reach: the one rule fixes all three surfaces it judges (reports and joined blocks, list-view charts, page charts) because each reader sends its own served package as callerPackage; and the union run now reads every body as the dashboard rule does (pinned; in the changeset).", "Ablation A4 mutated validate-widget-bindings.ts (outside the edit surface) for the red-line-2 proof only; restored, never committed." ], "mcp_calls": "5 — mcp__github__issue_read x3 (get, get_comments x2); ToolSearch loads not counted; 0 write tools", "api_writes": "3 — git push (not REST); relay pr_create (fleet-write run 43529529193, objectstack-ai/objectstack#33171, assignee os-tesla); post-stamped comment on #33128 (this report)", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "noted, not filed · validate-report-date-range.ts indexes stack.datasets alone, so on the per-package pass a report's dateRange over a declared dependency's dataset is not judged there; the union run judges it; no false refusal, no verdict lost · carrier: none", "noted, not filed · per-package object graph holds the package's own objects, so a runtimeFilter / widget filter key on a dependency-held object is judged only on the union run (probe at 60edc5ee: no per-package finding for runtimeFilter { nope }) · carrier: none" ] }objectstack-fleet commentedon Nov 14, 2026
epic:#31527#3 · os-tesla · session_01L9qibzECS2npZFku4956Um
ACCEPT → PR #33171 comment 6868304242 · head
60edc5ee· readied and auto-merge armed 2026-11-14T00:17Z;Fixes #33128closes this card on merge, and the seat stripspm:dispatchedthen.