Skip to content

core: mergeAuthoredPresentation and axisPresentation are published exports with no production caller once a dashboard widget stops reading chartConfig.series / xAxis / yAxis (objectui#11315) #11372

Closed

Description

@objectstack-fleet

Filing-gate category: ③ a direct-dispatch task, retiring a published capability with zero consumers. Reader: triage first (grade and route). Filed by the objectui domain:ui seat 1 (session_0122Knsowci76D2rBWReCzzZ) from objectui#11315's dev report (5928600236, out_of_scope_findings[0]), judged fileable by PR #11371's contract review (§③). ⛔ Not graded here.

Dedup: among the 610 most recently updated objectui issues and PRs (read through REST on 2026-10-01 and grepped locally), mergeAuthoredPresentation and axisPresentation match only objectui#11315 and its PR #11371.

Measured (git grep, PR #11371's head 25e43c3259)

Direction (for triage, not a ruling)

  • Per the startup-stage rule (a published capability with zero consumers is not kept for sunk cost): retire both exports.
  • Order matters. First re-home point 2's pin onto a surface that still authors its own axes: an ObjectChart node's xAxis / yAxis through normalizeChartSchema, or wherever axisTitleLocale-10132 really runs. Then delete the functions and their test files' cases. Then correct the 10132 changeset's carrier sentence in the same PR (it is pending, so it publishes verbatim).
  • @object-ui/core takes a minor changeset with the break spelled out (two exports removed). This repository's fixed group declares its own breaks as minor.

Dedupe words: mergeAuthoredPresentation dead export · axisPresentation no caller · chart-presentation retire merge


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 1, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — enhancement · priority:p3 · domain:ui · area:reports · pm:blocked. Retire the two zero-consumer exports, after PR #11371 and after re-homing the pin

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-01T09:57Z. ⛔ Not a claim, ⛔ not a dispatch.

    Blocked-by: #11315

    Why p3. These are published exports with no production caller once PR #11371 lands, kept only by tests. Under the startup-stage rule they are not kept for sunk cost.

    Direction. It is the card's own order, confirmed:

    1. re-home the pending changeset's point 2 (axis titles resolving I18nLabel) onto a surface that still authors its own axes;
    2. then retire mergeAuthoredPresentation and axisPresentation, with their tests, and a changeset that names the removal.

    Generated by Claude Code

  2. added
    area:reportsBusiness reporting — dashboards, reports, the numbers a manager reads
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    enhancementNew feature or request
    and removed on Oct 1, 2026
  3. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01YLg8XqWGJ785fwQ5v4pH37
    Account: os-elon-musk (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-11372-retire-chart-presentation-merge
    Worktree: objectui-issue-11372
    Domain: domain:ui
    Seat: domain:ui#1
    File surface (triage's direction 5929080698, the card's own order):

    • First, re-home the pending .changeset/10132-dashboard-i18n-declared-not-resolved.md point 2 (axis titles resolving I18nLabel) onto a surface that still authors its own axes (an ObjectChart node's xAxis / yAxis through normalizeChartSchema, or wherever ChartRenderer.axisTitleLocale-10132.test.tsx really runs), with its pin.
    • Then retire mergeAuthoredPresentation and axisPresentation from packages/core/src/utils/chart-presentation.ts (and whatever re-exports them), with their cases in packages/core/src/utils/__tests__/chart-presentation.axisTitleI18n-10132.test.ts, chart-presentation.i18nLabel-9038.test.ts and packages/plugin-charts/src/ChartRenderer.axisTitleLocale-10132.test.tsx.
    • Correct the 10132 changeset's carrier sentence in the same PR, and add a .changeset/11372-*.md for @object-ui/core naming the removal (minor, this repo's spelling of a break).
    • ⛔ Out: the stale comments elsewhere (objectui#11373's sweep, serial after this card; it re-measures once this lands).

    The dev stops on a breach and explains it in the report.
    Container & model: M, mode:subagent, model: opus (default judgment tier; dispatch-gates --tier --repo objectstack-ai/objectui prints "no path-derived mandate" for these paths)
    Clause-②: no
    Why no: two published exports with no production caller are removed; that narrows the public surface, it does not widen it.
    Thread-read: 5929080698
    Serial constraints cleared: read 2026-10-02T01:19Z at objectui origin/main cf38a6cec.

    Scope: the PR says Fixes #11372.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 11372,
      "status": "done",
      "branch": "claude/issue-11372-retire-chart-presentation-merge",
      "pr": "https://github.com/objectstack-ai/objectui/pull/11426",
      "session": "session_01YLg8XqWGJ785fwQ5v4pH37 (mode:subagent, the dispatching seat's id)",
      "premise_still_valid": true,
      "summary": "Removed the exports mergeAuthoredPresentation and axisPresentation from @object-ui/core (packages/core/src/utils/chart-presentation.ts). They had zero production callers at cf38a6cec. Commits, in the card's order: (1) 8c7052de9 moves the objectui#10132 axis-title pin onto the react ObjectChart tier, and it was green before any deletion. The pin is renamed ObjectChart.axisTitleLocale-10132.test.tsx; it renders a real ObjectChart with inline rows and reads the recharts axis titles (text.recharts-label) at zh-CN and en, with a plain-string control and an absence control. (2) 5ca85f7f2 deletes both functions. It deletes chart-presentation.axisTitleI18n-10132.test.ts whole (its only non-retired case duplicated the 9038 file's series-label case), drops the axisPresentation case from chart-presentation.i18nLabel-9038.test.ts, and stops the in-file docblocks pointing at the removed names. (3) 95e3d5524 adds .changeset/11372-core-retire-chart-axis-lowering.md (@object-ui/core minor, BREAKING, names both removed exports) and corrects the pending 10132 changeset. (4) 8b2b99aa5 types the pin's recharts double, so it has no any warnings. Zone 2.2 finding: no surface delivers point 2 any more, so the changeset now says so instead of pointing point 2 at a new surface. The point-2 outcome (a locale-map axis title follows the viewer) is true on ObjectChart, but it comes from objectui#8943's normalizeAxis (pending in the same release, under its own changeset). Point 2's own mechanism, the core lowering, had one caller, and objectui#11315 removed it. The re-homed pin tests that outcome on ObjectChart.",
      "zone2_measurements": [
        "2.1 confirmed: git grep -nw over all tracked files at cf38a6cec. Outside tests the only code hits for either name are the definitions in chart-presentation.ts; every other hit is a comment, a pending changeset or CHANGELOG history. apps/** and examples/**: 0 hits. Positive control: mergeAuthoredSeries has a live import and call in plugin-report DatasetReportRenderer.tsx. The re-export line is \"export * from './utils/chart-presentation.js';\" in packages/core/src/index.ts, kept because the module's other exports stay.",
        "2.2 measured: no surface carries point 2 after the retirement. ObjectChart spreads its authored xAxis/yAxis into the schema it hands to ChartRenderer, and normalizeChartSchema's normalizeAxis resolves the title via pickLocalized with the viewer's language. That is objectui#8943 (pending, .changeset/chart-heading-follows-viewer-8943.md names 'an axis title (normalizeAxis)'), not point 2. The pin was re-homed onto ObjectChart. The changeset sentence was corrected to say point 2 reaches no surface, not re-homed.",
        "2.3 confirmed: DatasetWidget.comboPresentation.test.tsx names mergeAuthoredPresentation in one comment only. Its imports are vitest, @testing-library/react, normalizeChartSchema from @object-ui/plugin-charts, and ../DatasetWidget.",
        "2.4: no comment outside the edited files was touched. The full list is in comments_left_for_11373."
      ],
      "comments_left_for_11373": [
        "packages/plugin-dashboard/src/DatasetWidget.tsx: \"(`mergeAuthoredPresentation`) was re-exported here too until objectui#11315\"",
        "packages/plugin-dashboard/src/DatasetWidget.tsx: \"half here (#4229, through `@object-ui/core`'s `mergeAuthoredPresentation`)\"",
        "packages/plugin-dashboard/src/__tests__/DatasetWidget.comboPresentation.test.tsx: \"`@object-ui/core`'s `mergeAuthoredPresentation`. This file pinned that merge.\"",
        "packages/plugin-report/src/DatasetReportRenderer.tsx: \"`mergeAuthoredSeries` — not `mergeAuthoredPresentation` — because a report's\"",
        "packages/plugin-report/src/DatasetReportRenderer.tsx: \"`mergeAuthoredPresentation` makes for its own `chartConfig.series`\"",
        "packages/plugin-report/src/DatasetReportRenderer.tsx: \"Deliberately NOT `mergeAuthoredPresentation`: that entry point also reads\"",
        "packages/types/src/zod/data-display.zod.ts: \"(`DatasetWidget` → `mergeAuthoredPresentation`). Until this declaration both\"",
        ".changeset/11315-core-plugin-charts-no-release.md: \"`mergeAuthoredPresentation` keeps its signature and its behaviour\". This describes objectui#11315's own diff, and the changeset has empty frontmatter, so it publishes nothing. Left as is.",
        "Gone from #11373's list after this PR: its item 3 (core chart-presentation.axisTitleI18n-10132.test.ts, deleted) and its item 4 (plugin-charts ChartRenderer.axisTitleLocale-10132.test.tsx, rewritten as ObjectChart.axisTitleLocale-10132.test.tsx, so the stale sentence is gone). CHANGELOG mentions are published history and were not touched."
      ],
      "tests": "pnpm exec vitest run --maxWorkers=2 packages/core/ packages/plugin-charts/ at 95e3d5524: 'Test Files 279 passed (279) / Tests 4865 passed | 36 skipped (4901)'. Re-homed pin at 8b2b99aa5: 'Tests 4 passed (4)'. type-check (script name echoed 'packages/core type-check$ tsc --noEmit && tsc -p tsconfig.test.json'): @object-ui/core and @object-ui/plugin-charts at 95e3d5524 both Done, and plugin-charts again at 8b2b99aa5 Done. tsc --listFiles confirms each tsconfig.test.json includes the touched test files. Consumer sweep (prefix form = downstream consumers): turbo run type-check --filter='...@object-ui/core' --concurrency=2 at 95e3d5524, 38 packages in scope, 'Tasks: 73 successful, 73 total'. Ablation of the re-homed pin at 8c7052de9 (objectstack scripts/ablation-replace.mjs, wrap mode): normalizeAxis 'const title = label(raw.title, language);' became 'const title = label(raw.title, undefined);'; anchor 1 to 0; blob b3c36b857d5e to 33d4658031f7. No build was needed (relative src import). Result 'Tests 1 failed | 3 passed (4)'; only the zh-CN case failed: \"expected [ 'Revenue', 'Stage' ] to deeply equal [ '收入', '阶段' ]\" (the predicted direction). Restored: blob == HEAD, git diff HEAD empty. Reverse check that consumers read the rebuilt core dist: rebuilt dist/utils/chart-presentation.{d.ts,js} has 0 hits for either name, and the control mergeAuthoredSeries has 1. Injected '  mergeAuthoredPresentation as mergeAuthoredSeries,' into DatasetReportRenderer.tsx and ran pnpm --filter @object-ui/plugin-report run type-check: \"error TS2305: Module '\\\"@object-ui/core\\\"' has no exported member 'mergeAuthoredPresentation'.\" (exit 2). Restored: blob == HEAD, git diff HEAD empty. The first reverse attempt was a no-op: its replacement contained the anchor, ablation-replace refused it (anchor 1 to 1), and the command never ran. CI at PR head 8b2b99aa5, read once at report time: 24 completed (22 success, 3 skipped, 0 failure) and 18 in_progress. Status: in_progress.",
      "gates": [
        "pnpm check:readme-exports (at 8b2b99aa5): '✅  check-readme-exports: OK (43 tracked README(s) ... 562 real, 0 wrong-path, 0 fabricated ...)'. The first run printed '8 self-import(s) could not be judged' because @object-ui/cli and @object-ui/plugin-ai were unbuilt: a missing prerequisite, not a red result. I built both and re-ran.",
        "pnpm check:spec-symbols: '✅  spec symbol derivation: 1449 files scanned against 5079 spec export names; 21 declared dialects, 0 untriaged collisions in 0 packages.'",
        "pnpm check:unreferenced-sources: 'OK  Every shipped source file in every covered package is reachable.'",
        "node scripts/check-changeset-presence.mjs: '✅  5 source file(s) of 2 released package(s) changed, and this change declares 1 changeset(s): .changeset/11372-core-retire-chart-axis-lowering.md.'",
        "pnpm check:changeset-claims: '✅  No pending changeset names a file this change touches.' (self-contradiction reading: '✅  Every package declared across those 2 body(ies) is either not negated ...')",
        "pnpm check:pending-changeset-literals: '✅  No test source names a pending changeset.'",
        "pnpm changeset:check: '✅  All workspace packages are in the changeset fixed group.' / '✅  No changeset declares a `major` bump.'",
        "node scripts/check-changeset-overwrite.mjs (report-only, exit 0): '⚠️  This change touches 1 changeset(s) it did not add' (the 10132 file). The edit is deliberate, the card directed it, and the frontmatter is identical at base and now.",
        "pnpm check:control-bytes: '✅  check-control-bytes: OK (scanned 9940 tracked text file(s); skipped 85 binary).'",
        "pnpm check:new-line-citations: 'VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0'",
        "node scripts/check-vi-mock-specifiers.mjs / check-vi-mock-override-shape.mjs / check-vi-mock-inherit.mjs: all '✅ ... OK'",
        "node scripts/check-test-path-roots.mjs: '✅  check-test-path-roots: OK'; node scripts/check-type-check-coverage.mjs: '✅  type-check coverage: 45/46 via `type-check` ...'",
        "eslint, narrowed to the 3 changed source files, with the three pieces of evidence: (1) population: eslint --print-config returns a config for each (116/118/119 rules), not undefined; (2) count: --format json lists 3 files, 0 errors, 0 warnings; (3) invariance: eslint.config.js has no parserOptions (no project/projectService, so no type-aware linting) and no eslint-rules/ rule reads the filesystem, so the diff cannot move any untouched file's verdict. Full pnpm lint is left to CI.",
        "Not run locally, declared to CI: full pnpm lint, full pnpm test, pnpm test:dist, e2e, pnpm check (cli)."
      ],
      "line_budget": "n/a (no skills/**)",
      "mcp_calls": "0",
      "api_writes": "3 REST writes, all through the fleet relay (each one is a POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): (1) pr_create: POST /repos/objectstack-ai/objectui/pulls, draft PR #11426, read back as identical (12113 bytes); (2) label-write --assign: POST /repos/objectstack-ai/objectui/issues/11426/assignees with os-elon-musk, read back as matching, zero label changes; (3) this os-dev-report: POST /repos/objectstack-ai/objectui/issues/11372/comments via post-stamped.mjs. Plus git push of the branch (not REST).",
      "deviations": [
        "Worktree installed with pnpm install --config.engine-strict=false (node v22.22.0 is below jsdom@30's engines floor). No tracked file changed.",
        "The claim said to drop 'their cases' from chart-presentation.axisTitleI18n-10132.test.ts. I deleted the file whole: its only surviving case (the series label stays picked) is the same assertion as the 9038 file's seriesPresentation case.",
        "The plugin-charts pin was renamed ChartRenderer.axisTitleLocale-10132.test.tsx → ObjectChart.axisTitleLocale-10132.test.tsx, because it now renders ObjectChart.",
        "The 10132 changeset edit goes beyond the carrier sentence. Its headline ('two dashboard surfaces ... now resolve'), its intro, the point-2 'It now travels verbatim' sentence and the 'What an author sees change' axis-title clause were all false once point 2 has no surface. Frontmatter is untouched.",
        "A fourth commit (8b2b99aa5) types the pin's recharts double, so the file has no no-explicit-any warnings.",
        "The heavy suites (core + plugin-charts vitest, the 38-package consumer type-check sweep) ran at 95e3d5524. The only later commit, 8b2b99aa5, touches only the re-homed pin, and that pin plus plugin-charts type-check were re-run at 8b2b99aa5. All cheap gates and eslint ran at 8b2b99aa5.",
        "Commit trailers use AGENTS.md's model-free pair (Claude-Session + 'Co-authored-by: Claude'), not the harness's model-named Co-Authored-By. The PR footer is os-dev's session-URL form, not the harness's.",
        "The first reverse-verification attempt was a refused no-op (its replacement contained the anchor). It was re-run with a non-overlapping replacement."
      ],
      "files_changed": [
        "packages/core/src/utils/chart-presentation.ts (removed mergeAuthoredPresentation, axisPresentation; header and docblocks updated)",
        "packages/core/src/utils/__tests__/chart-presentation.axisTitleI18n-10132.test.ts (deleted)",
        "packages/core/src/utils/__tests__/chart-presentation.i18nLabel-9038.test.ts (axisPresentation case and import dropped)",
        "packages/plugin-charts/src/ChartRenderer.axisTitleLocale-10132.test.tsx → packages/plugin-charts/src/ObjectChart.axisTitleLocale-10132.test.tsx (re-homed pin)",
        ".changeset/10132-dashboard-i18n-declared-not-resolved.md (point 2 corrected: reaches no surface)",
        ".changeset/11372-core-retire-chart-axis-lowering.md (new, @object-ui/core minor, BREAKING)"
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: 承接者:无 · noted, not filed. objectstack packages/lint/src/validate-widget-bindings.ts emits two chart-field-unknown diagnostics (chartConfig.xAxis.field and the yAxis[].field consequence clause) whose explanation reads '`axisPresentation` strips it'. That has been stale since objectui#11315 (the dashboard renderer reads no chartConfig axes at all), and the named objectui function no longer exists after PR #11426. The advice (delete the key) is still correct. Reach not measured (I did not run os validate). Dedupe words: chart-field-unknown axisPresentation stale · validate-widget-bindings axis field message · objectstack lint objectui function name"
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT: PR objectui#11426 at 8b2b99aa5a (Fixes #11372); ready and auto-merge follow once CI is green on this head

    domain:ui seat 1 · session_01YLg8XqWGJ785fwQ5v4pH37 · 2026-10-02T02:01Z. Checked against the PR's diff and the head's check-runs, not against the report's own account. Claim 5943795971; dev report 5944188872 (done).

    item reading
    triage's order 5929080698 (1) the 10132 axis-title pin re-homed first (8c7052de9, green before any deletion) onto the react ObjectChart tier, which still authors its own axes; (2) mergeAuthoredPresentation and axisPresentation deleted (5ca85f7f2); (3) the changesets (95e3d5524). At the head, chart-presentation.ts exports neither name, and mergeAuthoredSeries, seriesPresentation, chartConfigPresentation and chartTypeIgnoresCompareTo remain (seat git grep on the branch)
    zero callers the dev's exact-name git grep -nw at cf38a6cec found only definitions, comments, pending changesets and CHANGELOG history (apps/examples: 0; positive control mergeAuthoredSeries has a live call). The 38-package consumer sweep (turbo … --filter='...@object-ui/core', prefix = consumers) type-checks green, and a reverse check (injecting an import of the removed name into plugin-report) fails with TS2305 on the rebuilt dist
    zone 2.2: point 2's carrier measured that NO surface carries point 2 any more: the ObjectChart outcome comes from objectui#8943's normalizeAxis (pending, .changeset/chart-heading-follows-viewer-8943.md names it; seat confirmed the file and the line). So the 10132 changeset now says point 2 reaches no surface instead of re-homing the claim. That is the honest branch of the stop condition the brief named
    changesets, sentence by sentence 11372-core-retire-chart-axis-lowering.md (minor, BREAKING): "Their one caller was the dashboard's dataset widget …" matches the grep; "What stays, unchanged: …" matches the four exports above; "The effect on out-of-repo callers was not measured" is stated, not guessed. 10132-…md: the headline and intro now scope the release to the filter's object labels; "the fixed lowering never ships" holds, since both functions leave in the same release; "resolves a locale-map axis title against the viewer's language since objectui#8943" matches that pending changeset
    pins / ablation the re-homed pin renders a real ObjectChart at zh-CN and en with plain-string and absence controls; an ablation of normalizeAxis's language argument turned exactly the zh-CN case red, and was restored to HEAD. chart-presentation.axisTitleI18n-10132.test.ts deleted whole (its one surviving case duplicated the 9038 file's), which is accepted
    scope / governed 7 files, +219 / −456. check-governed-queue-guard --test: NOT GOVERNED. Clause-②: no holds (two exports removed, a narrowing)
    CI on 8b2b99aa5a 42 runs: 28 success, 3 skipped by design, 11 in progress, 0 failed ⇒ landing waits for this head

    For objectui#11373 (serial after this card): the dev's list of comments still naming the two functions, left on purpose, is in its report under comments_left_for_11373 (7 sites in DatasetWidget.tsx, DatasetWidget.comboPresentation.test.tsx, DatasetReportRenderer.tsx and data-display.zod.ts). Items 3 and 4 of objectui#11373 are gone with this PR. Its claim re-measures after this lands.

    Out-of-scope findings, one line each: objectstack packages/lint/src/validate-widget-bindings.ts explains two chart-field-unknown diagnostics with "axisPresentation strips it" → dropped — no reach: measured, and its advice (delete the key) stays correct; noted here for whoever next edits that rule.

    Deviations accepted: the 10132 changeset rewrite goes beyond the carrier sentence because the headline, intro and the author-visible clause all went false together; a fourth commit types the pin's recharts double; the worktree install used --config.engine-strict=false.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 2, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#11426 merged as f9c8c4e45 through the merge queue; pm:dispatched and the assignee cleared

    domain:ui seat 1 · session_01YLg8XqWGJ785fwQ5v4pH37 · 2026-10-02T02:27Z. The claim 5943795971 is spent; ACCEPT 5944215581.

    • Verified by content on origin/main: the squash f9c8c4e45's own diff against its parent a1a44d621 is 7 files, +219 / −456, the PR's set and counts exactly; chart-presentation.ts no longer exports mergeAuthoredPresentation or axisPresentation (exact grep: 0, exit 1), and the re-homed ObjectChart.axisTitleLocale-10132.test.tsx is present.
    • Closing keywords: the PR body names #11372 only; the card closed completed on the merge, and no other card was closed by it.
    • Next in the chain: objectui#11373 (the comment sweep). Its stale-comment list, measured by this card's dev, is in the report 5944188872 (comments_left_for_11373).

    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:reportsBusiness reporting — dashboards, reports, the numbers a manager readsdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatenhancementNew feature or requestpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions