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 }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
A combo chart silently has no drill-through: ComposedChart is the one cartesian branch that never receives the click props #4692
Measured while implementing #4672's ruled item-level series work, and deliberately not widened into it: different defect class (a whole family's wiring, not the series a click reports), and it would add a verification surface that card does not carry.
What is measured
AdvancedChartImpl builds cartesianClickProps once and applies it to exactly one element:
packages/plugin-charts/src/AdvancedChartImpl.tsx — cartesianClickProps is constructed near the other click props, and its only application is on the final cartesian ChartComponent (the bar / horizontal-bar / line / area branch).
The combo branch returns earlier, from its own ComposedChart element, which is rendered with data and no click props at all.
So a chart whose family resolves to combo fires onChartClick never — not on a mark, not on the axis. Its marks are the same Bar / Line / Area components the drillable branch renders.
Why it is worth a card rather than nothing
The prop's own doc comment says drill is "Wired for bar/horizontal-bar/line/area/pie/donut/funnel. Other chart types are no-ops in L1", so combo being a no-op is declared, and this is not a contract breach. Two things still make it worth recording:
The family is DERIVED, not only authored.effectiveChartFamily(baseChartType, series) resolves a chart to combo when its series declare different families (Vocabulary consolidation (#2901): what shipped, and why Track C items 1–3 are not planned #2945's fix). So adding type: 'line' to one series of a drillable bar chart silently turns that chart's drill-through off, with nothing in the authored spec saying drill was touched. The author changed a mark and lost an interaction.
The same doc line is already drifting. It lists scatter / treemap / sankey as no-ops, but those three each have a wired handler (scatterClickProps, treemapClickProps, sankeyClickProps). So the comment is not a reliable statement of what is wired, in either direction.
Not measured, deliberately
Whether combo should drill is a product question, not a defect reading — a combo plots several measures on one plot, so what a click there means (which series, which axis) needs the same kind of answer #4672's ruling gave the pivoted case. This card records the state and the derived-family trap; it does not presume the fix.
Related: #4672 (the cartesian click's series resolution, where this was measured), #2945 (derived combo family).
First-touch grading (seat repo:objectui; session session_01RnQd8iMMUwXQEV1crFmQiQ, 2026-08-15): pm:queue, split into two halves with different weights:
The doc drift is mechanical and dispatchable now (S): the cartesianClickProps doc line claims scatter / treemap / sankey are no-ops while all three have wired handlers, and says nothing that would warn about the derived-combo trap. Correct the comment to state what is actually wired, and name the Vocabulary consolidation (#2901): what shipped, and why Track C items 1–3 are not planned #2945 derived-family consequence explicitly (adding a differently-familied series turns drill off). A doc-only truth fix, no behavior.
The sharp edge worth the record: an author changing one series' type silently loses an interaction — that is the AI-author silent-mismatch class this repo treats as first-class, which is why half 1 (making the contract statement true and the trap named) is queued rather than shrugged. Age-ordered priority.
Scope of this dispatch: the doc-truth half only. The drill-wiring doc comment in AdvancedChartImpl.tsx is wrong in both directions (lists scatter/treemap/sankey as no-ops though each has a wired handler; combo is the actual no-op) — this dispatch corrects the comment to the measured truth and pins the combo branch's current no-click-props state. Whether combo should drill is a product question and stays open on this card — the PR will be Part of #4692, not Fixes, and must not wire any click props onto ComposedChart.
{
"issue": 4692,
"status": "done",
"branch": "claude/issue-4692-combo-drill-doc-truth",
"pr": "https://github.com/objectstack-ai/objectui/pull/4705",
"pr_number": 4705,
"head_sha": "5ecbc4d71aaa8bf6414396953642f19754694f94",
"premise_still_valid": true,
"summary": "Fixed the doc-truth half of #4692 only, per the PM's ruling. Corrected AdvancedChartImpl's onChartClick doc comment: it wrongly listed scatter/treemap/sankey as click no-ops (each has a wired handler) and never named combo as the actual no-op or the effectiveChartFamily derived-combo trap. Added a pinning test (AdvancedChartImpl.comboClickNoop.test.tsx) asserting onChartClick is never called for an explicitly-authored combo (bar mark, line mark, and axis-level surface click) nor for a chart derived into combo by mixed series families, with a positive control in the same file proving an identically-shaped click on a plain bar chart does fire. No click props were added to ComposedChart.",
"tests": "pnpm exec vitest run packages/plugin-charts/ --maxWorkers=2 -> 31 files / 225 tests passed (incl. the 3 new pinning tests, one of which is the positive control). pnpm --filter '@object-ui/plugin-charts' type-check -> clean. pnpm exec eslint on both changed files -> 0 errors, 43 pre-existing no-explicit-any warnings (same convention as rest of file). node scripts/check-changeset-presence.mjs -> passes, declares .changeset/combo-drill-doc-truth.md (empty frontmatter). node scripts/check-changeset-no-major.mjs -> passes. Manual control-byte scan (grep -naP) on changed files -> clean (no scripts/check-nul-bytes.mjs exists in this repo). All runs quoted at git HEAD 5ecbc4d71, matching the pushed/PR head sha. This repo has no skip-changeset label convention (per PM route, not applied). CI just started on the draft PR (in_progress at report time) -- not waited on per the standing contract.",
"changeset": ".changeset/combo-drill-doc-truth.md",
"changed_files": [
"packages/plugin-charts/src/AdvancedChartImpl.tsx",
"packages/plugin-charts/src/AdvancedChartImpl.comboClickNoop.test.tsx",
".changeset/combo-drill-doc-truth.md"
],
"open_questions": [],
"out_of_scope_findings": [],
"notes": "Mechanism assumptions all confirmed by direct read before editing: (1) cartesianClickProps is applied only at the final ChartComponent (line ~1185 in AdvancedChartImpl.tsx); combo's ComposedChart branch returns earlier (~line 1104-1159) with no click props of any kind, not even on the container itself, so even axis-level clicks on combo resolve to nothing (added a surface-click assertion to the pin for this). (2) The old doc comment (lines 247-252 pre-edit) read 'Wired for bar/horizontal-bar/line/area/pie/donut/funnel. Other chart types are no-ops in L1' -- scatterClickProps/treemapClickProps/sankeyClickProps (lines 557-559) are all real wired handlers, confirming the drift in both directions. Radar was also checked and confirmed unwired (no onClick anywhere in its branch), consistent with the old comment's claim (radar was never listed as wired) so it needed no comment fix beyond being named alongside combo as a no-op. (3) effectiveChartFamily (normalizeChartSchema.ts:378-387) derives 'combo' whenever series[].chartType values disagree after defaulting -- confirmed by reading the function body and the pre-existing AdvancedChartImpl.comboFromSeries.test.tsx (#2945's own test file), which I reused as the pattern for constructing a derived-combo chart in the new pin test. Positive control reading: clicks array has length 1 with category 'Jan' and series 'revenue' on the plain bar chart, vs length 0 in both combo cases -- confirms the harness itself is capable of registering clicks, so the zero counts are a real finding about the combo branch, not a broken test."
}
(supersedes the previous report comment above — its marker got mangled by the body sanitizer into literal <!--…--> entities instead of surviving as the real marker; this one uses the documented plain-text fallback)
{
"issue": 4692,
"status": "done",
"branch": "claude/issue-4692-combo-drill-doc-truth",
"pr": "https://github.com/objectstack-ai/objectui/pull/4705",
"pr_number": 4705,
"head_sha": "5ecbc4d71aaa8bf6414396953642f19754694f94",
"premise_still_valid": true,
"summary": "Fixed the doc-truth half of #4692 only, per the PM's ruling. Corrected AdvancedChartImpl's onChartClick doc comment: it wrongly listed scatter/treemap/sankey as click no-ops (each has a wired handler) and never named combo as the actual no-op or the effectiveChartFamily derived-combo trap. Added a pinning test (AdvancedChartImpl.comboClickNoop.test.tsx) asserting onChartClick is never called for an explicitly-authored combo (bar mark, line mark, and axis-level surface click) nor for a chart derived into combo by mixed series families, with a positive control in the same file proving an identically-shaped click on a plain bar chart does fire. No click props were added to ComposedChart.",
"tests": "pnpm exec vitest run packages/plugin-charts/ --maxWorkers=2 -> 31 files / 225 tests passed (incl. the 3 new pinning tests, one of which is the positive control). pnpm --filter '@object-ui/plugin-charts' type-check -> clean. pnpm exec eslint on both changed files -> 0 errors, 43 pre-existing no-explicit-any warnings (same convention as rest of file). node scripts/check-changeset-presence.mjs -> passes, declares .changeset/combo-drill-doc-truth.md (empty frontmatter). node scripts/check-changeset-no-major.mjs -> passes. Manual control-byte scan (grep -naP) on changed files -> clean (no scripts/check-nul-bytes.mjs exists in this repo). All runs quoted at git HEAD 5ecbc4d71, matching the pushed/PR head sha. This repo has no skip-changeset label convention (per PM route, not applied). CI just started on the draft PR (in_progress at report time) -- not waited on per the standing contract.",
"changeset": ".changeset/combo-drill-doc-truth.md",
"changed_files": [
"packages/plugin-charts/src/AdvancedChartImpl.tsx",
"packages/plugin-charts/src/AdvancedChartImpl.comboClickNoop.test.tsx",
".changeset/combo-drill-doc-truth.md"
],
"open_questions": [],
"out_of_scope_findings": [],
"notes": "Mechanism assumptions all confirmed by direct read before editing: (1) cartesianClickProps is applied only at the final ChartComponent (line ~1185 in AdvancedChartImpl.tsx); combo's ComposedChart branch returns earlier (~line 1104-1159) with no click props of any kind, not even on the container itself, so even axis-level clicks on combo resolve to nothing (added a surface-click assertion to the pin for this). (2) The old doc comment (lines 247-252 pre-edit) read 'Wired for bar/horizontal-bar/line/area/pie/donut/funnel. Other chart types are no-ops in L1' -- scatterClickProps/treemapClickProps/sankeyClickProps (lines 557-559) are all real wired handlers, confirming the drift in both directions. Radar was also checked and confirmed unwired (no onClick anywhere in its branch), consistent with the old comment's claim (radar was never listed as wired) so it needed no comment fix beyond being named alongside combo as a no-op. (3) effectiveChartFamily (normalizeChartSchema.ts:378-387) derives 'combo' whenever series[].chartType values disagree after defaulting -- confirmed by reading the function body and the pre-existing AdvancedChartImpl.comboFromSeries.test.tsx (#2945's own test file), which I reused as the pattern for constructing a derived-combo chart in the new pin test. Positive control reading: clicks array has length 1 with category 'Jan' and series 'revenue' on the plain bar chart, vs length 0 in both combo cases -- confirms the harness itself is capable of registering clicks, so the zero counts are a real finding about the combo branch, not a broken test."
}
The doc-truth half landed and merged as PR #4705: the onChartClick doc comment now states the measured wiring (scatter/treemap/sankey wired; radar and combo not), names the derived-family trap, and AdvancedChartImpl.comboClickNoop.test.tsx pins combo's current silence with a positive control. This card stays open for the remaining half, which is a product decision:
Should a combo chart drill, and what does a click there mean?
Option A — combo stays a no-op. Status quo, now honestly documented and pinned. Close this card as recorded; the derived-family trap (adding type: 'line' to one series silently turns drill off chart-wide) remains a documented sharp edge.
Option C — Option B plus a designer-side hint when a series-type edit derives combo (surfacing "this change turns the chart into a combo"), if the trap deserves an authoring-time signal beyond drill surviving.
Recommendation: B. The click machinery exists and is already series-correct at item level; the incremental surface is small and the semantics need no new invention. C's hint half can be its own follow-up card if wanted — it is designer territory, disjoint from the renderer.
Maintainer ruling — 2026-08-16: Option B. Verbatim: 「4692 B」
needs-user-decision → pm:queue. Recorded by the PM session; the remaining half of this card is now execution, not a question.
What is ruled
Wire mark-level clicks on the combo branch only.ComposedChart's Bar / Line / Area marks emit {category, categoryId, series, value} with the same semantics the plain cartesian branch already gives, reusing the item-level series-identity machinery from the #4672 / #4682 ruling.
Scope guards — all three are part of the ruling, not implementer discretion:
⛔ Axis and surface clicks stay silent. On a multi-measure plot a surface click has no single series answer. This is the same reasoning the pivoted case's ruling used; do not "improve" on it.
⛔ Option C is NOT ruled. The designer-side hint when a series-type edit derives combo is disjoint from the renderer and belongs to a separate card if it is ever wanted. Do not add authoring-time signals in this dispatch.
Measured business pull — deliberately not load-bearing here, and this is the lens most likely to be misread. The failure is silent: an author adds type: 'line' to one series, drill dies chart-wide, nothing errors and the authored spec never mentions combo. Silent failures do not generate pull signals — users do not report "my drill broke", they stop using drill. Absence of pull is not evidence of absence when the failure mode is invisible. (Contrast objectui#4662, where the failure is visible and silence therefore is evidence.)
AI-agent error-resistance — the decisive lens. A local, innocuous-looking spec edit silently removes an interaction from the whole chart: the silent-mismatch class this repo treats as first-class. docs(charts): correct onChartClick wiring doc, pin combo's no-click state #4705 made the trap documented, but documentation does not protect an author who never reads the source comment. B defuses it structurally — drill survives a mark-type change.
Startup scope discipline — mildly favours B, against the usual pull of this lens toward "do nothing". The maintained surface already exists (docs(charts): correct onChartClick wiring doc, pin combo's no-click state #4705's doc carve-out plus a pin asserting an inconsistency); B reduces it by deleting the carve-out, and its incremental code is small because the item-handler machinery is already built. C loses this lens outright: a new permanent designer surface with no demand signal.
Dispatch note
The repo:objectui seat owns dispatch here. Age-ordered against that seat's queue — nothing in this ruling asks for it to jump the line.
Activity
yinlianghui commentedon Aug 15, 2026
First-touch grading (seat
repo:objectui; sessionsession_01RnQd8iMMUwXQEV1crFmQiQ, 2026-08-15):pm:queue, split into two halves with different weights:cartesianClickPropsdoc line claims scatter / treemap / sankey are no-ops while all three have wired handlers, and says nothing that would warn about the derived-combo trap. Correct the comment to state what is actually wired, and name the Vocabulary consolidation (#2901): what shipped, and why Track C items 1–3 are not planned #2945 derived-family consequence explicitly (adding a differently-familied series turns drill off). A doc-only truth fix, no behavior.activePayload, which recharts 3 does not send — every cartesian drill loses its series and value, killing the pivoted drill outright #4672's ruling gave the pivoted case (which series, which axis). That half stays recorded on this card and goes to the decision box only if dashboard usage ever surfaces a real pull; ⛔ no speculative wiring.The sharp edge worth the record: an author changing one series'
typesilently loses an interaction — that is the AI-author silent-mismatch class this repo treats as first-class, which is why half 1 (making the contract statement true and the trap named) is queued rather than shrugged. Age-ordered priority.Generated by Claude Code
yinlianghui commentedon Aug 15, 2026
Claiming — PM dispatch. Session:
session_01RnQd8iMMUwXQEV1crFmQiQ(objectui whole-repo PM seat). Branch:claude/issue-4692-combo-drill-doc-truth.Scope of this dispatch: the doc-truth half only. The drill-wiring doc comment in
AdvancedChartImpl.tsxis wrong in both directions (lists scatter/treemap/sankey as no-ops though each has a wired handler; combo is the actual no-op) — this dispatch corrects the comment to the measured truth and pins the combo branch's current no-click-props state. Whether combo should drill is a product question and stays open on this card — the PR will bePart of #4692, notFixes, and must not wire any click props ontoComposedChart.Generated by Claude Code
yinlianghui commentedon Aug 15, 2026
<!-- os-dev-report -->
{ "issue": 4692, "status": "done", "branch": "claude/issue-4692-combo-drill-doc-truth", "pr": "https://github.com/objectstack-ai/objectui/pull/4705", "pr_number": 4705, "head_sha": "5ecbc4d71aaa8bf6414396953642f19754694f94", "premise_still_valid": true, "summary": "Fixed the doc-truth half of #4692 only, per the PM's ruling. Corrected AdvancedChartImpl's onChartClick doc comment: it wrongly listed scatter/treemap/sankey as click no-ops (each has a wired handler) and never named combo as the actual no-op or the effectiveChartFamily derived-combo trap. Added a pinning test (AdvancedChartImpl.comboClickNoop.test.tsx) asserting onChartClick is never called for an explicitly-authored combo (bar mark, line mark, and axis-level surface click) nor for a chart derived into combo by mixed series families, with a positive control in the same file proving an identically-shaped click on a plain bar chart does fire. No click props were added to ComposedChart.", "tests": "pnpm exec vitest run packages/plugin-charts/ --maxWorkers=2 -> 31 files / 225 tests passed (incl. the 3 new pinning tests, one of which is the positive control). pnpm --filter '@object-ui/plugin-charts' type-check -> clean. pnpm exec eslint on both changed files -> 0 errors, 43 pre-existing no-explicit-any warnings (same convention as rest of file). node scripts/check-changeset-presence.mjs -> passes, declares .changeset/combo-drill-doc-truth.md (empty frontmatter). node scripts/check-changeset-no-major.mjs -> passes. Manual control-byte scan (grep -naP) on changed files -> clean (no scripts/check-nul-bytes.mjs exists in this repo). All runs quoted at git HEAD 5ecbc4d71, matching the pushed/PR head sha. This repo has no skip-changeset label convention (per PM route, not applied). CI just started on the draft PR (in_progress at report time) -- not waited on per the standing contract.", "changeset": ".changeset/combo-drill-doc-truth.md", "changed_files": [ "packages/plugin-charts/src/AdvancedChartImpl.tsx", "packages/plugin-charts/src/AdvancedChartImpl.comboClickNoop.test.tsx", ".changeset/combo-drill-doc-truth.md" ], "open_questions": [], "out_of_scope_findings": [], "notes": "Mechanism assumptions all confirmed by direct read before editing: (1) cartesianClickProps is applied only at the final ChartComponent (line ~1185 in AdvancedChartImpl.tsx); combo's ComposedChart branch returns earlier (~line 1104-1159) with no click props of any kind, not even on the container itself, so even axis-level clicks on combo resolve to nothing (added a surface-click assertion to the pin for this). (2) The old doc comment (lines 247-252 pre-edit) read 'Wired for bar/horizontal-bar/line/area/pie/donut/funnel. Other chart types are no-ops in L1' -- scatterClickProps/treemapClickProps/sankeyClickProps (lines 557-559) are all real wired handlers, confirming the drift in both directions. Radar was also checked and confirmed unwired (no onClick anywhere in its branch), consistent with the old comment's claim (radar was never listed as wired) so it needed no comment fix beyond being named alongside combo as a no-op. (3) effectiveChartFamily (normalizeChartSchema.ts:378-387) derives 'combo' whenever series[].chartType values disagree after defaulting -- confirmed by reading the function body and the pre-existing AdvancedChartImpl.comboFromSeries.test.tsx (#2945's own test file), which I reused as the pattern for constructing a derived-combo chart in the new pin test. Positive control reading: clicks array has length 1 with category 'Jan' and series 'revenue' on the plain bar chart, vs length 0 in both combo cases -- confirms the harness itself is capable of registering clicks, so the zero counts are a real finding about the combo branch, not a broken test." }Generated by Claude Code
Generated by Claude Code
yinlianghui commentedon Aug 15, 2026
os-dev-report
(supersedes the previous report comment above — its marker got mangled by the body sanitizer into literal
<!--…-->entities instead of surviving as the real marker; this one uses the documented plain-text fallback){ "issue": 4692, "status": "done", "branch": "claude/issue-4692-combo-drill-doc-truth", "pr": "https://github.com/objectstack-ai/objectui/pull/4705", "pr_number": 4705, "head_sha": "5ecbc4d71aaa8bf6414396953642f19754694f94", "premise_still_valid": true, "summary": "Fixed the doc-truth half of #4692 only, per the PM's ruling. Corrected AdvancedChartImpl's onChartClick doc comment: it wrongly listed scatter/treemap/sankey as click no-ops (each has a wired handler) and never named combo as the actual no-op or the effectiveChartFamily derived-combo trap. Added a pinning test (AdvancedChartImpl.comboClickNoop.test.tsx) asserting onChartClick is never called for an explicitly-authored combo (bar mark, line mark, and axis-level surface click) nor for a chart derived into combo by mixed series families, with a positive control in the same file proving an identically-shaped click on a plain bar chart does fire. No click props were added to ComposedChart.", "tests": "pnpm exec vitest run packages/plugin-charts/ --maxWorkers=2 -> 31 files / 225 tests passed (incl. the 3 new pinning tests, one of which is the positive control). pnpm --filter '@object-ui/plugin-charts' type-check -> clean. pnpm exec eslint on both changed files -> 0 errors, 43 pre-existing no-explicit-any warnings (same convention as rest of file). node scripts/check-changeset-presence.mjs -> passes, declares .changeset/combo-drill-doc-truth.md (empty frontmatter). node scripts/check-changeset-no-major.mjs -> passes. Manual control-byte scan (grep -naP) on changed files -> clean (no scripts/check-nul-bytes.mjs exists in this repo). All runs quoted at git HEAD 5ecbc4d71, matching the pushed/PR head sha. This repo has no skip-changeset label convention (per PM route, not applied). CI just started on the draft PR (in_progress at report time) -- not waited on per the standing contract.", "changeset": ".changeset/combo-drill-doc-truth.md", "changed_files": [ "packages/plugin-charts/src/AdvancedChartImpl.tsx", "packages/plugin-charts/src/AdvancedChartImpl.comboClickNoop.test.tsx", ".changeset/combo-drill-doc-truth.md" ], "open_questions": [], "out_of_scope_findings": [], "notes": "Mechanism assumptions all confirmed by direct read before editing: (1) cartesianClickProps is applied only at the final ChartComponent (line ~1185 in AdvancedChartImpl.tsx); combo's ComposedChart branch returns earlier (~line 1104-1159) with no click props of any kind, not even on the container itself, so even axis-level clicks on combo resolve to nothing (added a surface-click assertion to the pin for this). (2) The old doc comment (lines 247-252 pre-edit) read 'Wired for bar/horizontal-bar/line/area/pie/donut/funnel. Other chart types are no-ops in L1' -- scatterClickProps/treemapClickProps/sankeyClickProps (lines 557-559) are all real wired handlers, confirming the drift in both directions. Radar was also checked and confirmed unwired (no onClick anywhere in its branch), consistent with the old comment's claim (radar was never listed as wired) so it needed no comment fix beyond being named alongside combo as a no-op. (3) effectiveChartFamily (normalizeChartSchema.ts:378-387) derives 'combo' whenever series[].chartType values disagree after defaulting -- confirmed by reading the function body and the pre-existing AdvancedChartImpl.comboFromSeries.test.tsx (#2945's own test file), which I reused as the pattern for constructing a derived-combo chart in the new pin test. Positive control reading: clicks array has length 1 with category 'Jan' and series 'revenue' on the plain bar chart, vs length 0 in both combo cases -- confirms the harness itself is capable of registering clicks, so the zero counts are a real finding about the combo branch, not a broken test." }Generated by Claude Code
Generated by Claude Code
yinlianghui commentedon Aug 15, 2026
Dispatch closeout + decision-box entry (PM session
session_01RnQd8iMMUwXQEV1crFmQiQ).The doc-truth half landed and merged as PR #4705: the
onChartClickdoc comment now states the measured wiring (scatter/treemap/sankey wired; radar and combo not), names the derived-family trap, andAdvancedChartImpl.comboClickNoop.test.tsxpins combo's current silence with a positive control. This card stays open for the remaining half, which is a product decision:Should a combo chart drill, and what does a click there mean?
type: 'line'to one series silently turns drill off chart-wide) remains a documented sharp edge.Bar/Line/Areacomponents the drillable cartesian branch renders, and the item-level record-and-compose machinery from the AdvancedChartImpl's cartesian click readsactivePayload, which recharts 3 does not send — every cartesian drill loses its series and value, killing the pivoted drill outright #4672/A pivoted chart's drill title shows the raw series key, so an identity-keyed group's drawer reads[null]instead of its label #4682 ruling already stamps each mark's own series identity at the item handler — a mark click on a combo can emit{category, categoryId, series, value}with exactly the same semantics as on a plain chart, which also defuses the derived-family trap (drill survives a series changing mark type). Axis/surface clicks stay silent: on a multi-measure plot a surface click has no single series answer — the same reasoning the pivoted case's ruling used. Implementing this deliberately flips docs(charts): correct onChartClick wiring doc, pin combo's no-click state #4705's pin, which is what the pin is for.combo(surfacing "this change turns the chart into a combo"), if the trap deserves an authoring-time signal beyond drill surviving.Recommendation: B. The click machinery exists and is already series-correct at item level; the incremental surface is small and the semantics need no new invention. C's hint half can be its own follow-up card if wanted — it is designer territory, disjoint from the renderer.
No dispatch until ruled —
needs-user-decision.Generated by Claude Code
claude commentedon Aug 16, 2026
Maintainer ruling — 2026-08-16: Option B. Verbatim: 「4692 B」
needs-user-decision→pm:queue. Recorded by the PM session; the remaining half of this card is now execution, not a question.What is ruled
Wire mark-level clicks on the combo branch only.
ComposedChart'sBar/Line/Areamarks emit{category, categoryId, series, value}with the same semantics the plain cartesian branch already gives, reusing the item-level series-identity machinery from the #4672 / #4682 ruling.Scope guards — all three are part of the ruling, not implementer discretion:
combois disjoint from the renderer and belongs to a separate card if it is ever wanted. Do not add authoring-time signals in this dispatch.AdvancedChartImpl.comboClickNoop.test.tsxasserts combo's current silence; this work deliberately inverts it. Replace the assertion, keep the positive control, and keep a negative pin for the axis/surface path so guard 1 stays enforced. Also update theonChartClickdoc comment docs(charts): correct onChartClick wiring doc, pin combo's no-click state #4705 corrected — it currently names combo as a no-op, which this change makes false.Four-lens analysis (#7498)
effectiveChartFamilyresolves tocombowhen series families differ, per Vocabulary consolidation (#2901): what shipped, and why Track C items 1–3 are not planned #2945). B also invents no semantics — it applies the series-identity answer AdvancedChartImpl's cartesian click readsactivePayload, which recharts 3 does not send — every cartesian drill loses its series and value, killing the pivoted drill outright #4672 already ruled to the rest of the family. Option A would make the derived special case permanent.type: 'line'to one series, drill dies chart-wide, nothing errors and the authored spec never mentionscombo. Silent failures do not generate pull signals — users do not report "my drill broke", they stop using drill. Absence of pull is not evidence of absence when the failure mode is invisible. (Contrast objectui#4662, where the failure is visible and silence therefore is evidence.)Dispatch note
The
repo:objectuiseat owns dispatch here. Age-ordered against that seat's queue — nothing in this ruling asks for it to jump the line.Authorization: maintainer directive (this session) —「先做 23 张 blocked 解锁 10 张 on-hold 按各自自述处理」· PM session
01JaVVMrSxt7Tgi1uwEuDtH7Generated by Claude Code
yinlianghui commentedon Aug 16, 2026
【认领】objectui 分片 PM(session_01GTRjn8xBqp75dk7kFupVRt)批次 13 派发,os-dev 实施(本卡余下的实施半;doc-truth 半已由 PR4705 落地)。分支:
claude/issue-4692-combo-mark-clicks。按 2026-08-16 维护者裁定(评论 5306033961,方案 B)执行:combo 分支的Bar/Line/Areamark 接{category, categoryId, series, value}点击,复用 #4672/#4682 的 item 级 series-identity 机制;三条 scope guards 全属裁定:⛔ axis/surface 点击保持静默、⛔ 不做 C 的 designer hint、✅ 翻AdvancedChartImpl.comboClickNoop.test.tsx的钉(保正控制 + 加 axis/surface 负钉)+ 更新 PR4705 改过的 doc comment。文件面:packages/plugin-charts/src/AdvancedChartImpl.tsx+ comboClickNoop 测试 + changeset。与在飞四单零交集。Generated by Claude Code
yinlianghui commentedon Aug 16, 2026
os-dev-report(实施半;doc-truth 半见 PR #4705)
{ "issue": 4692, "status": "done", "branch": "claude/issue-4692-combo-mark-clicks", "pr_number": 4870, "pr_url": "https://github.com/objectstack-ai/objectui/pull/4870", "head_sha": "4586939016a3be5ec1fd775345d0838d5059b707", "premise_still_valid": true, "summary": "按裁定评论 5306033961(方案 B)实施 combo mark 级点击。combo 分支的 Bar/Line/Area 现在发 {category, categoryId, series, value},复用 #4672/#4682 的 item 级 series-identity 机制(mark 记录 series、chart 级 handler 组装唯一事件)。平面分支与 combo 共用一个组装器 emitCartesianClick,只在 requireMark 一条规则上分岔。三条 scope guards 全部遵守:axis/surface 静默、无 Option C designer hint、PR4705 的钉就地翻转(保正控制 + 新增 axis/surface 负钉)并同步更新 onChartClick doc comment。", "files_changed": [ "packages/plugin-charts/src/AdvancedChartImpl.tsx", "packages/plugin-charts/src/AdvancedChartImpl.comboClickNoop.test.tsx -> AdvancedChartImpl.comboMarkClick.test.tsx (rename + 翻转)", ".changeset/combo-mark-drill.md" ], "click_readings": { "explicit_combo_bar_mark": "{ category: 'Jan', series: 'revenue', value: 120 },一次手势一个事件", "explicit_combo_line_mark": "series: 'margin';category 与 value 互洽(value 等于该 category 行的 margin 单元格)", "derived_combo_bar_mark": "chartType='bar' + series[1].chartType='line' 派生 combo(实测 1 个 .recharts-bar + 1 个 .recharts-line);点击 Done/High 段得 { category: 'Done', series: 'High', value: 7 },findChartSeriesRow 落到 PIVOT_RAW[2]", "derived_combo_line_mark": "series: 'Low'(作者改类型的那条 series 自身可下钻)", "axis_surface_silence": "显式与派生 combo 的 surface 点击均 0 事件;同形状 surface 点击在平面柱图上得 1 个事件({category:'Jan'}),证明负钉非空绿" }, "tests": "pnpm exec vitest run packages/plugin-charts --maxWorkers=2 -> 31 files / 231 tests passed(PR4705 基线 225,净增 6)。eslint 两个改动文件 -> 0 errors / 53 pre-existing no-explicit-any warnings。check-changeset-presence + check-changeset-no-major 均通过。", "reverse_verification": "双臂,方向先判后跑。A 臂(摘掉 combo 接线):预判 5 个发射钉红、2 个负钉绿(空绿——未接线的 combo 处处静默,该臂对 guard 1 不敏感)、控制绿;实测 5 failed | 4 passed,红文均为 'expected [] to have a length of 1 but got +0',显式与派生各有红。B 臂(把 comboClickProps 换成 cartesianClickProps,即 guard 1 禁止的过度接线):预判 2 个负钉红、发射钉绿;实测 2 failed | 7 passed,红文为 'expected [ { category: Jan, …(4) } ] to have a length of +0 but got 1' 与 'category: Open',是真事件而非空数组。A 臂证明 mark 接线是活的,B 臂才证明 guard 1 被守住。", "type_check": "仓根 pnpm exec turbo run type-check --concurrency=2 -> 81 successful, 81 total", "risks": "1) 测试文件改名(comboClickNoop -> comboMarkClick):文件名里的 Noop 已与断言相反,git 记录为 rename,仓内 grep 无任何引用。2) combo 刻意不带全图 pointer 光标(与其它已接线族不同),affordance 改挂在 mark 上(cursor='pointer'),因为全图光标会承诺一个 axis 上并不存在的下钻。3) 消费半径已扫:onChartClick 的消费者只有 ChartRenderer / ObjectChart / DatasetWidget,均只透传;plugin-charts 之外没有任何包渲染 combo 图或对 combo 点击有 fixture。", "new_findings": [] }Generated by Claude Code
docs(charts): correct onChartClick wiring doc, pin combo's no-click s…
feat(charts): combo charts drill from their marks (objectstack-ai#4692)…