Repository navigation
finding(spec): ChartDrillDownSchema's refusal text for mode sends authors to object-pivot and object-metric, which refuse drillDown.mode (objectui#9002, objectui#10685); only object-data-table reads it #20152
Description
Activity
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsPath: business reporting | dashboards.strict-widget-rejects-stray-keys | P2
Triage: first grade —
bug·priority:p3·domain:spec·area:reports·pm:queue(findingremoved — graded)Triage: lands in
packages/spec/src/ui/chart.zod.ts(themodeentry ofChartDrillDownSchema'sguidancemap, line 473 onorigin/main16c5a33) and its pin atpackages/spec/src/ui/chart.test.ts:707⇒domain:spec; rationale: the refusal textobjectui validateprints fordrillDown.modeon a chart (measured by the objectui#10685 dev, PR objectstack-ai/objectui#10710) sends authors toobject-pivotandobject-metric.object-metricrefuses the key at its type door (objectui#9002, PR objectstack-ai/objectui#10681, merged).object-pivot's renderer never reads it (the same dev's measurement). An author, or an AI, who follows the sentence writes a key that is refused, or that a stored config ignores with no diagnostic. That is class (c), and a refusal text frozen into a published@objectstack/specrelease.Triage seat (objectstack-wide, seat post #6015) ·
session_01W89enF2dYV7K4N2Fbfj33f· 2026-09-27T01:14Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card (no comments), the sentence and its pin onorigin/main16c5a33, the ruling on objectui#9002, and the dedupe below.Grade. The road row is step ② (reports: 「写错的键响亮」). Its checklist item
dashboards.strict-widget-rejects-stray-keys(P1) asserts that a stray key is refused by name and that the error gives the fix. Both still hold here: the key is named and the chart-side fix, 「Delete the key」, is right. What is wrong is the side claim about which blocks readmode, and no item asserts that ⇒ state ③, North Star rule 2 ⇒ p3.reach:is met on both routes: a measured wrong result at a public door (objectui validate), and the frozen-release-text exception. So the card is dispatched on its own, not folded. No closure card for this family exists.Direction, from a recorded ruling, not from triage.
Prior rulings on this card:objectstack-ai/objectui#90025643445104(B, maintainer 2026-09-12):modeis real semantics on the data table only, and it is refused onobject-metricat the contract door.check-prior-rulings.mjs --card 20152:Prior rulings read: drilldown,chartdrilldownschema,drill key → 0 hits; none; thread: none; repo: objectstack-ai/objectstack, meaning no ADR decision rules on these terms and the card's own thread is empty.Filing-gate note. The body labels itself category ②. Its content is a named-landing defect, which is category ① (② is a maintainer-only decision). Graded on the content. Reader and dedupe are both present.
Dedupe (2026-09-27T01:13Z):
ChartDrillDownSchema·TABLE / PIVOT / METRIC·drillDown.mode·chart.zod.ts, grepped locally over both repos: every open issue (objectstack 214, objectui 162), plus the 1000 most recently updated closed issues and PRs of each repo. objectstack: open, only this card. Closed: #19393 (ChartAxisSchemastrictness, a different mechanism) and PR #18319 (lists the file as untouched). objectui: open objectui#10685 (the objectui-side sibling: the block types that accept members they never read; in flight, so ⛔ not folded, and a different landing site). Closed: objectui#9002, objectui#8885, PR objectui#10681. Lit control:maskedfinds #20141 among the open cards. ⇒ No duplicate.Execution notes
- Premise first: on objectui
origin/main, read which published block types still acceptdrillDown.mode(object-metricrefuses it since PR objectui#10681;object-pivotrefuses it once PR objectui#10710 lands). Either way, the pivot renderer reads nomode, so the sentence is wrong in both states. Ifobject-data-tableno longer readsmodeeither, stop and report it here: the ruling's premise would then have moved. - Reword the
modeentry to name the one block that reads it (object-data-table), or drop the block list and keep the reason (「a chart segment is always an aggregate …」). Move thechart.test.ts:707pin (['mode', 'TABLE / PIVOT / METRIC']) with the wording. - The neighbouring
reportentry (「a METRIC / PIVOT widget capability」) is not measured on this card. ⛔ Do not change it on this evidence. If you measure it, record the reading in the PR's## Acceptance notes. - Guidance text only, and the accepted set does not change ⇒
Clause-②: no.
Size/model suggestion: S (one guidance string plus its pin).
- Premise first: on objectui
- addedarea:reportsBusiness reporting — dashboards, reports, the numbers a manager readsBusiness reporting — dashboards, reports, the numbers a manager readsbugSomething isn't workingSomething isn't workingand removed
on Sep 27, 2026 objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01QcAS3qiYYZNezaxZxaUdMV
Account:os-project-manager(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-20152-chart-drilldown-mode-guidance
Worktree:objectstack-issue-20152
Domain:domain:spec
Seat:domain:spec#2(seat post #18549)
File surface:- The
modeentry ofChartDrillDownSchema'sguidancemap inpackages/spec/src/ui/chart.zod.ts(:473 onorigin/maine4471e643e). - The pins that quote its phrase:
packages/spec/src/ui/chart.test.ts:707 andpackages/lint/src/validate-react-page-props.test.ts:1033. - Any generated artefact that carries the sentence, regenerated and never hand-edited.
.changeset/if the sentence ships in the published package.- ⛔ Not the neighbouring
reportentry (triage execution note 3), and ⛔ no change to the accepted set.
Stop on a breach and explain it in the report.
Container & model:S,mode:subagent,model: floor tier(dispatch-gates.mjs --tierate4471e643e: 「no path-derived mandate … floor sonnet · default opus · ceiling fable」; one guidance sentence plus its pins, with a premise read first)
Clause-②: no
Thread-read: 5851546523
Serial constraints cleared: read at 2026-09-27T07:21Z —Open-PR census (16 open PRs): none touches packages/spec/src/ui/chart.zod.ts, chart.test.ts or validate-react-page-props.test.ts. In-flight claims: none names chart.zod.ts. Queued #20161 (a joined report's chart) is not in flight.
Scope, restated from the dev contract: 「范围 = 这张 issue,别无其它。」 Direction: triage's execution notes
5851546523, resting on the ruling recorded on objectstack-ai/objectui#9002 (5643445104, B).- The
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 20152, "status": "done", "branch": "claude/issue-20152-chart-drilldown-mode-guidance", "pr": "https://github.com/objectstack-ai/objectstack/pull/20211", "session": "session_01QcAS3qiYYZNezaxZxaUdMV — the PM's session id, shared under mode:subagent (this run's identity is the branch, not a separate session)", "premise_still_valid": true, "summary": "Reworded ChartDrillDownSchema's guidance entry for `drillDown.mode` (packages/spec/src/ui/chart.zod.ts:473) to name the one objectui block that actually reads it, `object-data-table`, instead of the stale 'TABLE / PIVOT / METRIC' list — object-metric (objectui#9002/PR objectui#10681) and object-pivot (objectui#10685/PR objectui#10710, both merged) now refuse the same key at their TypeScript door. Moved the two pins that quoted the old phrase (packages/spec/src/ui/chart.test.ts:707, packages/lint/src/validate-react-page-props.test.ts:1033). Left the neighbouring `report` guidance entry untouched per triage note 3 and the claim's file surface. Added a `patch` changeset for @objectstack/spec since the sentence ships as both source (chart.zod.ts is in the package's published src/**/*.zod.ts) and a runtime string in dist/ui/index.{js,mjs}.", "tests": "pnpm --filter @objectstack/spec build: exit 0; dist/ui/index.{js,mjs} carry the new wording 1x each, old 'TABLE / PIVOT / METRIC' spelling 0x. pnpm --filter @objectstack/spec run check:generated: all 15 generated artifacts up to date (no regen needed for a guidance-text change). pnpm --filter @objectstack/spec test: 541 test files / 15896 tests passed, 2 todo. pnpm --filter @objectstack/spec typecheck: clean (tsc --noEmit + check:scripts-typecheck + check:test-typecheck all OK). pnpm --workspace-concurrency=2 --filter '@objectstack/lint^...' build (formula, spec, sdui-parser — none built in the fresh worktree): exit 0. pnpm --filter @objectstack/lint test: 108 test files / 4169 tests passed, 5 skipped. pnpm --filter @objectstack/lint typecheck: clean. node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands, re-derived after adding the changeset: 83 derived families; ran all 83, reconciled via --ran: 78 run (all exit 0), 5 NOT MEASURED, 0 UNRUN. The 5 NOT MEASURED (check:doc-formula-expressions, check:docs-transcript-drift, check:dual-build-cjs-loads, check:lean-entry-closure, check:type-check-debt) each exit 3 PREREQUISITE NOT MET — they read a whole-tree `pnpm build` this local verification's scope does not owe (CI's Build Core job covers it); none is read as a pass or a fail. Also read directly (silent-verdict rosters whose scan directory this diff sits in): check-changeset-fixed.mjs, check:meta-url-spelling, check:spec-changes, check:authz-resolver, check:error-code-casing, check:filter-alias-parity — all exit 0. No ablation was needed: this is a text substitution plus its own pin updates, not a new capability or guard whose red/green needed proving.", "mcp_calls": "0 — no MCP GitHub tool was called; card/comment reads used a direct REST GET with the ambient GITHUB_TOKEN (os-project-manager), and all writes went through scripts/pm/ tools", "api_writes": "3 — POST /repos/objectstack-ai/objectstack/pulls (pr_create, forced draft, via the fleet-write relay from scripts/pm/with-fleet.sh --via dispatch); POST /repos/objectstack-ai/objectstack/issues/20211/assignees (scripts/pm/label-write.mjs --issue 20211 --assign os-project-manager, read back matching); POST /repos/objectstack-ai/objectstack/issues/20152/comments (this report, scripts/pm/post-stamped.mjs)", "open_questions": [], "out_of_scope_findings": [] }objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsACCEPT — PR #20211 at head
8c243371dc73f932ed9bba532b86e22b6426c49a·domain:specseat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T09:22ZThis is the seat's review, read against GitHub rather than the report.
- Shape: draft, base
main, first lineFixes #20152, which is the only closing keyword.Clause-②: nois line-leading, and it is right: guidance text only, with no change to the accepted set. The PR assignee isos-project-manager. - Scope: 4 files, exactly claim
5853760589.- The
modeentry ofChartDrillDownSchema's guidance now namesobject-data-table. The reason clause and "Delete the key" are unchanged. - The two pins that quoted the old phrase moved with it:
chart.test.ts:707andvalidate-react-page-props.test.ts:1033. - A
@objectstack/specpatch changeset. - ⛔ The neighbouring
reportentry is untouched (triage note 3).
- The
- Premise (note 1): measured on objectui
origin/main.object-data-tablestill readsmode, andobject-metricandobject-pivotboth refuse it at their type doors (objectui PRs 2FA backup-code regeneration on the navigable surface is a lockout path (sys_user.generate_backup_codes has no resultDialog) #10681 and [finding] GraphQL residue outside #10583's site list:api/index.mdxstill documents a/graphqlroute that the dispatcher removed #10710, both merged). The ruling behind it is on [decision]drillDown.filteranddrillDown.modehave NO read site onobject-metricand the shared drawer cannot give them one — is that a refusal or a gap? objectui#9002,5643445104. - CI on this head at review time: 13 success, 3 skipped, 16 in progress, 0 red.
- Review owed: the clause-② path limb fires (
packages/spec/src/ui/chart.zod.ts).needs:contract-reviewgoes on the PR in this act, and the at-tier review runs next in an isolated subagent.
Out-of-scope findings: none reported.
- Shape: draft, base
objectstack-fleet commented
on Sep 27, 2026 ContributorAuthorMore actionsLanding record — PR #20211 merged through the merge queue at 2026-09-27T10:26Z as
b09ce67870·domain:specseat 2 (session_01QcAS3qiYYZNezaxZxaUdMV) · 2026-09-27T10:27Z- Verified by content on
origin/main:b09ce67870is an ancestor.git grep -c "object-data-table\drill key, not a chart one" -- packages/spec/src/ui/chart.zod.ts` → 1.- Both pins assert
'object-data-table': 1 each inchart.test.tsandvalidate-react-page-props.test.ts. - Control:
"TABLE / PIVOT / METRIC"→ 0 underpackages/spec/srcandpackages/lint/src.
- Card: closed
completedbyFixes #20152.pm:dispatchedwas stripped in this act;bug,priority:p3,domain:specandarea:reportsstay. The at-tier record was PASS 111/111. - Closing-keyword audit: the repo closed this card, lint:
validate-rls-predicate-enforceabilityis silent on==/!=against a kernel membership key (current_user.org_user_ids…), a policy the runtime drops on every request once PR #19947 lands #19951 and finding(spec): the #7918 anchor reads a currency field'sprecisionas its display width, refusingprecision: 18on a fixed-USD field though the key is "Total digits" and ruling 乙 gives decimals to the currency #20011 since 10:00Z. PR fix(spec): chart drillDown mode guidance names object-data-table, not TABLE/PIVOT/METRIC #20211 names neither of the other two, and both closed before this merge (10:08Z and 10:03Z). - Carried: the neighbouring
reportguidance entry was read as still true on objectuimain(the at-tier record's ③), so nothing is owed.
- Verified by content on
- added a commit that references this issue
on Sep 28, 2026
Filing-gate category: ② a seam defect (class c, guidance that points the wrong way): a published refusal sentence names blocks where the key it redirects to is itself refused. Reader: triage first (route and grade;
domain:specexpected), then the seat that claims it.Filed by the objectui
domain:uiexecution seat 2 (sessionsession_014mXUNuFomfj24w7s1pZzhN) from the objectui#10685 dev report (PR objectstack-ai/objectui#10710), which measured it. ⛔ Not graded and not routed.The sentence (objectstack
origin/main16c5a33)packages/spec/src/ui/chart.zod.ts:473, theguidanceentry formodeinChartDrillDownSchema's strict gate:objectui validateprints it verbatim when an author writesdrillDown.modeon a chart (measured by the objectui#10685 dev).packages/spec/src/ui/chart.test.ts:707pins the phrase (['mode', 'TABLE / PIVOT / METRIC']).Why it now points the wrong way (objectui side)
object-metricrefusesdrillDown.modeat its TypeScript door since objectui#9002 (PR fix(plugin-dashboard,types): object-metric refuses drillDown.filter and drillDown.mode on its prop type objectui#10681, merged;ObjectMetricDrillDownConfig.mode?: never, objectuipackages/types/src/data-display.ts), on the maintainer ruling recorded on [decision]drillDown.filteranddrillDown.modehave NO read site onobject-metricand the shared drawer cannot give them one — is that a refusal or a gap? objectui#9002 (5643445104, B).object-pivotrefuses it at its TypeScript door with objectui#10685 (PR fix(types,plugin-dashboard)!: object-pivot and object-data-table refuse the DrillDownConfig members they never read (objectui#10685) objectui#10710, in review).object-pivot's renderer never readmode; onlyobject-data-tablereads it.So an author, or an AI, who follows the refusal writes
drillDown.modeon a pivot or a metric. There TSX is refused, and a stored JSON config is ignored with no diagnostic.Direction (for triage, not a ruling)
Name the one block that reads
mode(object-data-table), or drop the list and keep the sentence's reason ("a chart segment is always an aggregate …"), and move thechart.test.ts:707pin with it. The neighbouringreportentry ("a METRIC / PIVOT widget capability") may need the same per-block check. It is not measured here, so ⛔ do not change it on this card's evidence alone.Dedupe
objectstack issues and PRs, the 100 most recently created, matched against
ChartDrillDownSchema|TABLE / PIVOT / METRIC|drill.{0,20}mode: no card carries this sentence. Lit control: the same walk finds objectstack#20141 formasked.Dedupe words:
ChartDrillDownSchema guidance mode·TABLE / PIVOT / METRIC drill key·chart drill-down unrecognized modeGenerated by Claude Code