feat(mcp): add typed Bullet chart support - #43770
Conversation
|
The issue described is a logic error in the Bullet chart configuration mapping where range rectangles lack a category To resolve this, you need to ensure that the |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #43770 +/- ##
==========================================
+ Coverage 79.36% 79.40% +0.04%
==========================================
Files 2893 2896 +3
Lines 167614 171258 +3644
Branches 38816 39793 +977
==========================================
+ Hits 133026 135989 +2963
- Misses 32088 32432 +344
- Partials 2500 2837 +337
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
Code Review Agent Run #658aec
Actionable Suggestions - 1
-
superset/mcp_service/chart/chart_utils.py - 1
- Float precision loss · Line 1072-1072
Additional Suggestions - 7
-
superset/mcp_service/chart/preview_utils.py - 2
-
SQL metric label gap · Line 328-341`_form_metric_label` reimplements `superset.utils.core.get_metric_name` but drops its SQL branch (`expressionType == "SQL"` returns `sqlExpression`). For a SQL adhoc metric without a `label`, this returns `None`, so `_bullet_result_roles` falls back to the first numeric column — which may be a dimension or a different metric, producing a wrong Bullet preview. Consider reusing `get_metric_name` or adding the SQL branch.
-
Empty ranges band divergence · Line 620-620When `ranges` is empty, `_bullet_numeric_tokens` returns `[]` and no range band is drawn. The native Bullet plugin (`transformProps.ts`) falls back to `[0, measure * 1.1]` when ranges are empty, so the preview diverges from the real chart. Consider deriving a default band from the metric values to stay faithful.
-
-
superset/mcp_service/chart/tool/get_chart_preview.py - 1
-
Duplicated bullet spec logic · Line 704-822`_bullet_chart_spec` reimplements metric/dimension resolution (lines 729-745) and the full layer-building already provided by `_bullet_result_roles`/`_canonical_result_field` and `_generate_bullet_vega_lite_preview` in preview_utils.py. The metric fallback also diverges: existing code picks the first quantitative field from the data row, this picks the last from `reversed(fields)`. Reuse the shared helpers to avoid divergent bullet rendering.
-
-
superset/mcp_service/chart/chart_utils.py - 1
-
Unhandled KeyError · Line 1122-1122`dimension_targets[order.column.casefold()]` raises `KeyError` when an `order_by` column matches neither the metric nor any dimension. The schema's `_adapt_native_order_by` accepts arbitrary bare column-name strings, so this is reachable from user input and crashes the update/preview tool. Use `.get(...)` and surface a validation error.
-
-
superset/mcp_service/chart/schemas.py - 2
-
Incomplete operator mapping · Line 2231-2232`_adapt_native_filters` maps `operator` using `{"==": "=", "IS_NOT_NULL": "IS NOT NULL"}`, but saved `adhoc_filters` store the `Operators` enum value (e.g. `'EQUALS'`, `'LESS_THAN'`, `'GREATER_THAN'`, `'IN'`, `'IS_NULL'`). Only `IS_NOT_NULL` maps correctly; `'=='` never occurs, and all other operators pass through unmapped and fail `FilterConfig.op` Literal validation, so saved bullet charts with filters won't load. Map the full enum set.
-
order_by validation/mapper divergence · Line 2371-2379`valid_order_targets` adds a dimension's `label` even when the dimension has no `name`, but `map_bullet_config`'s `dimension_targets` dict only maps label→name when `dimension.name` is present (`if candidate and dimension.name`). A dimension `{"label": "Region"}` passes this validation yet crashes the mapper with `KeyError` on `dimension_targets[order.column.casefold()]`. Gate the label on `dimension.name` to match.
-
-
tests/unit_tests/mcp_service/chart/test_bullet_chart.py - 1
-
Vacuous compile test · Line 347-348Within the provided diff, `test_bullet_compile_path_uses_groupby_metric_orderby_and_empty_results` ends at line 348 with `query` assigned but never asserted; `result` (line 347) is also unused. If the function is complete, the test is vacuous and would pass even if compiled queries were wrong. Add assertions on `query`/`result`, or remove the dead assignments. (If assertions follow line 348 and the diff was truncated, please disregard.)
-
Review Details
-
Files reviewed - 14 · Commit Range:
6411173..6411173- superset/mcp_service/chart/chart_helpers.py
- superset/mcp_service/chart/chart_utils.py
- superset/mcp_service/chart/plugins/__init__.py
- superset/mcp_service/chart/plugins/bullet.py
- superset/mcp_service/chart/preview_utils.py
- superset/mcp_service/chart/resources/chart_configs.py
- superset/mcp_service/chart/schemas.py
- superset/mcp_service/chart/tool/generate_chart.py
- superset/mcp_service/chart/tool/get_chart_data.py
- superset/mcp_service/chart/tool/get_chart_preview.py
- superset/mcp_service/chart/tool/get_chart_type_schema.py
- superset/mcp_service/chart/tool/update_chart.py
- superset/mcp_service/chart/tool/update_chart_preview.py
- tests/unit_tests/mcp_service/chart/test_bullet_chart.py
-
Files skipped - 0
-
Tools
- MyPy (Static Code Analysis) - ✔︎ Successful
- Astral Ruff (Static Code Analysis) - ✔︎ Successful
- Whispers (Secret Scanner) - ✔︎ Successful
- Detect-secrets (Secret Scanner) - ✔︎ Successful
Bito Usage Guide
Commands
Type the following command in the pull request comment and save the comment.
-
/review- Manually triggers an incremental AI Review. -
/review full- Manually triggers a full AI Review. -
/pause- Pauses automatic reviews on this pull request. -
/resume- Resumes automatic reviews. -
/resolve- Marks all Bito-posted review comments as resolved. -
/abort- Cancels all in-progress reviews.
Refer to the documentation for additional commands.
Configuration
This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.
Documentation & Help
✅ Deploy Preview for superset-docs-preview ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Code Review Agent Run #d1f367Actionable Suggestions - 0Additional Suggestions - 6
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
Code Review Agent Run #76a9c8Actionable Suggestions - 0Additional Suggestions - 6
Filtered by Review RulesBito filtered these suggestions based on rules created automatically for your feedback. Manage rules.
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
Code Review Agent Run #0e799fActionable Suggestions - 0Additional Suggestions - 2
Filtered by Review RulesBito filtered these suggestions based on rules created automatically for your feedback. Manage rules.
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
Code Review Agent Run #400d68Actionable Suggestions - 0Additional Suggestions - 6
Filtered by Review RulesBito filtered these suggestions based on rules created automatically for your feedback. Manage rules.
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
There was a problem hiding this comment.
Code Review Agent Run #d53793
Actionable Suggestions - 2
-
tests/unit_tests/mcp_service/chart/test_bullet_chart.py - 1
- Test crashes on np.timedelta64 · Line 1189-1195
-
tests/unit_tests/mcp_service/chart/tool/test_get_chart_preview.py - 1
- Test crashes on np.timedelta64 · Line 663-670
Additional Suggestions - 7
-
superset/mcp_service/chart/tool/generate_chart.py - 1
-
Commit-before-gate inconsistency · Line 879-879The chart is committed at `command.run()` (line 486-501) before this gate runs. If the response exceeds `MAX_QUERY_RESULT_VALUE_BYTES` (16 MiB), `_bounded_generate_response` returns a `CHART_RESPONSE_TOO_LARGE` failure even though the chart was already persisted. The client sees a failed generation and may retry, creating duplicate charts. Consider gating before commit or surfacing the created `chart_id` in the error.
-
-
tests/unit_tests/mcp_service/chart/tool/test_get_chart_data.py - 1
-
np.timedelta64 reference raises · Line 4279-4279`expected` serializes each `row["Duration"]` with `json.dumps(..., default=json.json_int_dttm_ser)`. `base_json_conv` handles `datetime.timedelta` (line 97) but not `np.timedelta64`, so the `np.timedelta64(123456789, 'ns')` source value raises `TypeError` here, erroring the test before the tool is even called. Use the producer's `_chart_data_duration_text` normalizer for the reference, or drop that source value.
-
-
superset/mcp_service/chart/response_preflight.py - 1
-
Duplicate error payload · Line 47-61The error payloads in `preflight_generate_chart_response` (lines 47-61) and `preflight_update_preview_response` (lines 69-83) are near-identical: same `error_type`, `suggestions`, `error_code: CHART_RESPONSE_TOO_LARGE`, and `details: failure.error`, differing only in message text and version keys. Consider extracting a shared `_wire_size_error(failure, message)` helper so the error contract stays in one place and cannot diverge.
-
-
superset/mcp_service/chart/query_result.py - 1
-
Pandas negative duration spelling · Line 490-512`_chart_data_pandas_timedelta_text` claims to "Reproduce pandas Timedelta formatting", but for negative durations it emits a normalized spelling (e.g. `-0 days 00:00:01` for `pd.Timedelta(seconds=-1)`) that diverges from pandas' canonical `str()` (`-1 days +23:59:59`). The bullet test computes expected via this same function, so the divergence is unpinned. Align the docstring with the actual normalized output.
-
-
superset/mcp_service/chart/tool/get_chart_preview.py - 1
-
Dead always-false flag · Line 372-375Remove the `temporal_json_numbers` argument from `query_result_data(result)` in `TablePreviewStrategy.generate`, since `self.chart.viz_type == "bullet"` is already handled above, making the flag always False.
-
-
tests/unit_tests/sql_lab_test.py - 1
-
Tautological test assertion · Line 94-96This assertion is tautological: `_deserialize_results_payload` (views/utils.py:673) calls `json.loads` on the same `superset.utils.json` module as `superset_json.loads`, so both sides always produce identical output and the check can never fail. It verifies nothing about the round-trip. Assert the deserialized `data` rows directly (finite Decimal becomes float 0.1).
-
-
tests/unit_tests/dataframe_test.py - 1
-
Misleading precision assertion · Line 335-335`superset_json.dumps` routes Decimals through `base_json_conv` (`superset/utils/json.py`), which returns `float(obj)`, so `Decimal("0.10000000000000000001")` serializes to `0.1`. This assertion passes only because Python's float literal `0.10000000000000000001 == 0.1` is `True`. Assert `0.1` so the test verifies actual behavior and would catch a precision regression.
-
Review Details
-
Files reviewed - 33 · Commit Range:
9ba1f0b..6d0041f- superset/common/query_context_processor.py
- superset/dataframe.py
- superset/mcp_service/chart/query_result.py
- superset/mcp_service/chart/tool/get_chart_data.py
- tests/unit_tests/common/test_query_context_processor.py
- tests/unit_tests/dataframe_test.py
- tests/unit_tests/mcp_service/chart/query_result_test_utils.py
- tests/unit_tests/mcp_service/chart/test_compile.py
- tests/unit_tests/mcp_service/chart/test_query_result.py
- tests/unit_tests/mcp_service/chart/tool/test_get_chart_data.py
- tests/unit_tests/mcp_service/chart/tool/test_get_chart_preview.py
- tests/unit_tests/mcp_service/dataset/tool/test_query_dataset.py
- tests/unit_tests/mcp_service/semantic_layer/tool/test_get_table.py
- superset/mcp_service/utils/response_utils.py
- tests/unit_tests/mcp_service/utils/test_response_utils.py
- superset/mcp_service/semantic_layer/tool/get_table.py
- superset/mcp_service/chart/tool/get_chart_sql.py
- tests/unit_tests/mcp_service/chart/tool/test_get_chart_sql.py
- superset-frontend/plugins/plugin-chart-echarts/test/Bullet/transformProps.test.ts
- superset/mcp_service/chart/preview_utils.py
- superset/mcp_service/chart/response_preflight.py
- superset/mcp_service/chart/tool/generate_chart.py
- superset/mcp_service/chart/tool/get_chart_preview.py
- superset/mcp_service/chart/tool/update_chart.py
- superset/mcp_service/chart/tool/update_chart_preview.py
- tests/unit_tests/mcp_service/chart/test_bullet_chart.py
- tests/unit_tests/mcp_service/chart/test_response_preflight.py
- tests/unit_tests/mcp_service/chart/tool/test_generate_chart.py
- tests/unit_tests/mcp_service/chart/tool/test_update_chart.py
- tests/unit_tests/mcp_service/chart/tool/test_update_chart_preview.py
- superset/mcp_service/chart/compile.py
- tests/unit_tests/sql/execution/test_celery_task.py
- tests/unit_tests/sql_lab_test.py
-
Files skipped - 1
- .github/workflows/superset-python-unittest.yml - Reason: Filter setting
-
Tools
- MyPy (Static Code Analysis) - ✔︎ Successful
- Astral Ruff (Static Code Analysis) - ✔︎ Successful
- Whispers (Secret Scanner) - ✔︎ Successful
- Detect-secrets (Secret Scanner) - ✔︎ Successful
- Eslint (Linter) - ✔︎ Successful
Bito Usage Guide
Commands
Type the following command in the pull request comment and save the comment.
-
/review- Manually triggers an incremental AI Review. -
/review full- Manually triggers a full AI Review. -
/pause- Pauses automatic reviews on this pull request. -
/resume- Resumes automatic reviews. -
/resolve- Marks all Bito-posted review comments as resolved. -
/abort- Cancels all in-progress reviews.
Refer to the documentation for additional commands.
Configuration
This repository uses Superset You can customize the agent settings here or contact your Bito workspace admin at evan@preset.io.
Documentation & Help
Code Review Agent Run #550f70Actionable Suggestions - 0Additional Suggestions - 5
Filtered by Review RulesBito filtered these suggestions based on rules created automatically for your feedback. Manage rules.
Review Details
Bito Usage GuideCommands Type the following command in the pull request comment and save the comment.
Refer to the documentation for additional commands. Configuration This repository uses Documentation & Help |
| ("marker", marker_labels, markers), | ||
| ("marker line", marker_line_labels, marker_lines), | ||
| ): | ||
| if labels and len(labels) != len(values): |
There was a problem hiding this comment.
This rejects a saved Bullet chart when its label list is shorter than its ranges or markers, although Bullet/transformProps.ts intentionally renders missing labels as blank or as the formatted value. That makes MCP previews fail for charts that still render in Explore. Could the preview use the same per-index fallback instead of requiring one label per value?
| f"dimensions[{index}] must be a physical dimension, not a metric" | ||
| ) | ||
| name = dimension.name or "" | ||
| if name.casefold() in seen_names: |
There was a problem hiding this comment.
This treats Region and region as duplicate Bullet dimensions before dataset-aware resolution can preserve their exact physical names. Databases with quoted case-distinct columns can return both fields, and the frontend accesses each exact result key, so those charts are rejected even though they can be queried and rendered. Could role validation keep exact names distinct and reserve case-folding for ambiguous lookup only?
SUMMARY
Adds complete typed MCP support for the frontend ECharts Bullet plugin (
viz_type: bullet).chart_type: bulletdiscriminated-union member, plugin registry entry, schema discovery examples, tool guidance, and recommendation metadata.controlPanel/buildQuery/transformPropscontract, including SIMPLE, saved, and SQL metrics; grouped row hierarchies; filters/time controls; ordering/limits; and range, marker, label, legend, and number-format controls.dimensionsversus nativegroupbyaliases.orderbysemantics for compile/data paths.update_chartandupdate_chart_preview, including the exact native adhoc-filter sequence and in-place provenance binding replacement, while explicit empty/false/null values remain authoritative.generate_chart,update_chart,update_chart_preview, compile/query builders, registry/schema discovery, dataset normalization, get-data, and preview paths; includes non-Bullet regression guards.Round-4 fixes:
sum__numandsum__SP_POP_TOTL—as a predefined metric; adhoc SIMPLE metrics require their explicit object shape, while a strict bounded adapter retains the documented legacy label-only saved-metric object.Low,,Highindependently from numeric token parsing, while retaining cardinality and comma-safety validation.str/repr, and retains the iterative depth/width/item/output failure bounds.Round-5 fixes:
valueor string hooks; unsupported enum values and all scalar subclasses/unknown objects use a byte-bounded type descriptor read without instance or metaclass overrides.Round-14 fixes:
NaT/NA, timedeltas, periods, intervals, datetime/timedelta scalars, and finite numeric/boolean scalars. Timestamp normalization preserves the represented instant, timezone offset/name, fold, and nanosecond precision without allowing arbitrary subclass hooks.get_tablequery context beforeChartDataCommandconstruction, preserving virtual-dataseturl_param,filter_values, andget_filtersbehavior and completing the audit of every MCPChartDataCommandcall site.QueryContextProcessor/ChartDataCommandcoverage for Big Number, Waterfall, XY, Mixed, and cached results, plus adversarial exact/beyond-boundary regressions.Tracking: Shortcut SC-119157
Agor worktree: sc-119157-mcp-bullet
Deduplication/coordination: upstream
masterwas inspected at exact head45b903b19ad0217c8175fe451d742515ec62ac56; related PRs were re-inspected without modification at #43737 (6fd8ab5a13fa7481fd5b083544f74abf90e08ddc), #43679 (364f479c810f815bac51a8bee0a33a53c880bf54), and #43711 (e06be4f694a091bbc93af23fad69fd2e23c587e9). Work remains scoped to Amin'ssc-119157-mcp-bulletbranch; no contributor, community, or Sunburst branch was modified. The separate active #43771 fixer has semantic overlap in shared query-result/cache handling; Round 14 retains the existingMalformedQueryResultpublic error contract, exact-container/no-hook rules, and compatible cache metadata for later reconciliation. Prior BASE_AXIS, Deck.gl, Pivot, query-parity, explicit-clear/provenance/identity, and #43711 Jinja contracts remain covered. Round-14 implementation is delivered at1b6b88e81acd132e92eafbb7e86b491cbca7b9f8; exact-head CI is queued/running, a fresh independent round-15 review follows, and no clean-review claim is made here.BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF
N/A — this changes the MCP server contract/query/preview paths and does not modify the frontend Bullet plugin UI. A live Superset server was not available in this worktree, so no UI screenshot was captured.
TESTING INSTRUCTIONS
Validated with SQLAlchemy
2.0.52on exact commit1b6b88e81acd132e92eafbb7e86b491cbca7b9f8:Exact results:
126 passedtests/unit_tests/mcp_service/chart:1808 passedtests/unit_tests/mcp_service:4144 passed195 passed5 suites, 83 passed10.00/10), Python compilation, and diff checks: passedRound-14 coverage includes real DataFrames flowing through
QueryContextProcessor.get_dataand realChartDataCommand.runfor timestamped Big Number, Waterfall, XY, Mixed, and cache results; timezone/fold/null/timedelta/numeric/boolean normalization; one-megabyte strings/keys, 100,000 rows, 10,000-bit integers, Decimal and metadata limits at and beyond boundaries; saved/unsaved empty/non-empty coltype round trips; and virtual-dataset Jinja helpers seeded before command construction. The full suites retain prior BASE_AXIS, Deck.gl, Pivot, Bullet, explicit-clear/provenance/identity, strict exact-container/no-hook, cache metadata, query-parity, and #43711 integration guards.Environment caveats:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree; live/manual UI verification was unavailable. See the Working with LLMs setup guide.sqlglot.dialects.singlestoreand exited before linting. The same three production files passed direct repository-configured Pylint in the SQLAlchemy 2.0.52 environment at10.00/10.^24.16.0/npm^11.13.0, while the worktree provides Node22.22.2/npm10.9.7; focused frontend tests passed with the existing install.ROUND-15 TESTING AND COORDINATION
Round-15 fixes are delivered at exact commit
f8c142aacd4f0d653b3a04d6755dd6e31d51534b, based directly on requested head1b6b88e81acd132e92eafbb7e86b491cbca7b9f8. The original exact-head CI was reconciled: 72 checks succeeded and the three reported failures (unit-tests (current),unit-tests-required, and the aggregate Python result check) all traced to the singledateutil/US/Pacificpandas-timezone regression. The new exact-commit CI is queued/running; an independent round-16 review follows, and no clean-review claim is made.Round-15 coverage and contracts:
dateutil/US/Pacific, positive/negative fixed offsets, fold, DataFrame materialization, pandas Timestamp/Timedelta/NaT, NumPy temporal values, and actual QueryContextProcessor/ChartDataCommand producer paths; custom/hostile tzinfo remains rejected;get_tableand datasetquery_datasetnormalize exactly once immediately afterChartDataCommand.run, consume only normalized rows/validated metadata, and mapChartErrorto their public error schemas; hostile scalar, oversized, pandas/NumPy, and malformed-envelope tests prove formatting is not reached before validation;get_chart_sqlconsumes the distinct SQL-onlyChartDataResultType.QUERYenvelope. Final Jinja form-data seeding before command construction, coltypes, cache metadata, provenance/identity, scalar bounds, BASE_AXIS, Deck.gl, and Pivot guards remain covered.Validation used Python 3.11, SQLAlchemy
2.0.52, pandas2.3.3, NumPy2.4.6, and sqlglot30.17.0:512 passed; after final profiling-budget refinement, targeted affected files:395 passedand298 passed;tests/unit_tests/mcp_service/chart:1824 passed;tests/unit_tests/mcp_service:4165 passed;161 passed;1 suite, 17 passed;git diff --check, MyPy, Ruff format/check, and every other applicable staged pre-commit hook: passed;10.00/10with zero messages. The isolated pre-commit Pylint hook exits before linting because its hook environment cannot importsqlglot.dialects.singlestore; the direct SQLAlchemy 2.0.52 environment run passes.Coordination/reconciliation: upstream
masterwas inspected atcf77deb678a2421a347e44d4cd0647916dab5514; related PRs were read-only inspected at #43737 (6fd8ab5a13fa7481fd5b083544f74abf90e08ddc), #43679 (364f479c810f815bac51a8bee0a33a53c880bf54), and #43711 (e06be4f694a091bbc93af23fad69fd2e23c587e9). Agor review-zone/session inspection found no competing same-PR implementation. Active #43771 shared-result work was read-only compared throughfa5d90f99f51e4aaef5769add352ffe3ad6d8edb; task01a061a4-1a2c-74ec-bcef-b65f1c00d996carries the Bullet findings to that work. Both contracts align on 50,000 rows per query, 100,000 aggregate rows, 2.5-million aggregate values, pandas/NumPy normalization, and final Jinja seeding; Bullet additionally bounds downstream profiling work. No contributor/community or Sunburst branch was modified.Environment caveat:
curl -f http://localhost:8088/healthfails because this worktree has no live Superset server, so live/manual UI verification was unavailable. See the Working with LLMs setup guide.ROUND-16 TESTING AND COORDINATION
Round-16 fixes are delivered at exact commit
a0e9bd3624836d354dc8b7b7fdb305e34adb6d30, based directly on requested headf8c142aacd4f0d653b3a04d6755dd6e31d51534b.Round-16 coverage and contracts:
17,000 × 10**999reproduction fails in the shared result boundary before Pydantic/FastMCP serialization;DataColumn.sample_values, generated column/cache/performance metadata, and CSV/Excel export payloads. The compact2 × 50,000 × 20ordinary-value source envelope is accepted by source work/row limits but rejected when its actual aliasedChartDataresponse exceeds 16 MiB;get_table, datasetquery_dataset, and saved/unsaved chart get-data share one coltype-aware bounded metadata builder. It gathers up to three late non-null samples during the existing row×column pass, uses hook-free value-semantic identities (equal int/float/Decimal values collapse while string representations remain distinct), excludes null from uniqueness, preserves authoritative temporal/boolean/numeric/string coltypes on empty data, and exposesstatistics.sampled_rowsfor approximation;MalformedQueryResultcontract;dateutil/US/Pacificpackaged-zone tzfile regression. Exact known dateutil packaged tzfile types are canonicalized through bounded internal names without accepting arbitrary subclasses or timezone hooks; the reproducing compile/query-result tests pass locally.Validation used Python 3.11, SQLAlchemy
2.0.52, pandas2.3.3, NumPy2.4.6, and sqlglot30.17.0:tests/unit_tests/mcp_service:4192 passed;149 passed;268 passed;pre-commit run, including repository-configured MyPy, Ruff format/check, and custom Pylint: all applicable hooks passed;--follow-imports=skip) passed all six changed production modules; direct repository-configured Pylint over those modules passed at10.00/10; Python compilation and staged/unstaged diff checks passed.No frontend files changed, so frontend testing was not relevant to Round 16. The exact-commit CI is running; pre-commit, CodeQL, dependency/license, frontend build, validation, and several database/build jobs have passed, while unit/E2E/browser jobs remain pending. No clean-review claim is made; an independent round-17 review follows.
Coordination/reconciliation: upstream
masterwas read-only inspected atcf77deb678a2421a347e44d4cd0647916dab5514; #43737 (6fd8ab5a13fa7481fd5b083544f74abf90e08ddc), #43679 (364f479c810f815bac51a8bee0a33a53c880bf54), and #43711 (e06be4f694a091bbc93af23fad69fd2e23c587e9) were also re-inspected read-only. Active Sunburst shared-result work was compared through its remote/latestfa5d90f99f51e4aaef5769add352ffe3ad6d8edb; it retains the same raw-string-only byte-meter gap and divergent metadata identity/sample semantics, so no code was copied or branch modified. Task01a061da-67d0-71be-8810-4754496859cccarries the findings to that separate work. Agor context confirmed Amin'ssc-119157-mcp-bulletbranch in themcp chart typeszone with no competing same-PR session. No contributor, community, or Sunburst branch was changed.Environment caveat:
curl -f http://localhost:8088/healthand the recorded branch app URL both fail because no live Superset server is running in this worktree, so live/manual UI verification was unavailable. See the Working with LLMs setup guide.ROUND-17 TESTING AND COORDINATION
Round-17 fixes are delivered at exact commit
9ba1f0b7d10a540249bd8c3ac32b9d8abae0fb4c, based directly on requested heada0e9bd3624836d354dc8b7b7fdb305e34adb6d30.Round-17 coverage and contracts:
NA/NaTforms canonicalize toNonebefore accounting and profiling. Superset's producer converts infinities to NaN; a trusted infinity injected after that producer boundary remains rejected as malformed. RealQueryContextProcessor/ChartDataCommand, compile, preview, chart, semantic, and dataset paths cover nullable numeric output;statistics.sampled_rowswhenever null counts are sampled and addscompleteness_is_approximateplussampled_rowsto sampled quality output. All-null 10,000/50,000-row inputs report0.0, while mixed unsampled and empty inputs retain exact results; chart, semantic, and dataset response metadata are covered;datetime/timevalues support builtin/ZoneInfo plus packaged dateutil named/fixed/local/UTC and pytz named/fixed/UTC timezone implementations without invoking source timezone hooks. PandasTimestampsupports dateutiltzlocal; selected fold/offset and null semantics are preserved, while hostile custom timezone implementations remain rejected.Validation used Python 3.11, SQLAlchemy
2.0.52, pandas2.3.3, NumPy1.26.4, and sqlglot30.17.0:619 passed;tests/unit_tests/mcp_service:4213 passed(includes the full MCP chart, semantic, and dataset suites);211 passed;5 suites, 83 passed;10.00/10), Python compilation, and staged/unstaged diff checks: passed.Coordination/reconciliation: upstream
masterwas read-only inspected atcf77deb678a2421a347e44d4cd0647916dab5514; #43737 (6fd8ab5a13fa7481fd5b083544f74abf90e08ddc), #43679 (364f479c810f815bac51a8bee0a33a53c880bf54), and #43711 (e06be4f694a091bbc93af23fad69fd2e23c587e9) were re-inspected read-only. Sunburst shared work was fetched and compared read-only through63c6cdc2fa7dc608817ab3135b10576ff0bed134(fix(mcp): bound serialized results and metadata); Round 17 aligns its packaged dateutil-name validation and bounded serialized-result/metadata principles while retaining Bullet's establishedquery_result_data/MalformedQueryResult, separate source/final-response budgets, ancestry-based repeated-occurrence semantics, metadata accounting, and sampled unique-statistics contracts. Queue01a06220-c2cd-73f9-b0e6-1aff19539cafremains the cross-workstream handoff. No contributor/community or Sunburst branch was modified, and Agor context found no competing same-PR session.Exact-head CI completed with
75successful,3neutral, and3skipped checks. Frontend Jest shard 6 timed out/cancelled on its first 25-minute attempt; the failed-job rerun (attempt 2) passed in 4m33s. No clean-review claim is made; round 18 follows.Environment caveats:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual UI verification was unavailable. See the Working with LLMs setup guide.^24.16.0/npm^11.13.0, while the worktree provides Node22.22.2/npm10.9.7; the focused frontend suite passed with the existing install.ROUND-18 TESTING AND COORDINATION
Round-18 fixes are delivered at exact commit
bc2ce63e549d4368858b5d06981cdbcec742c950, based directly on requested head9ba1f0b7d10a540249bd8c3ac32b9d8abae0fb4c.Round-18 coverage and contracts:
query/sqlaliases, are normalized and charged by exact compact-JSON escaped UTF-8 bytes against both the 1 MiB metadata budget and the 16 MiB aggregate budget. RealChartDataCommandenvelopes with 65,537-byte and 70 KiB rendered SQL succeed through compile, chart preview/get-data, semanticget_table, and datasetquery_dataset; metadata and aggregate exact-boundary/+1 behavior, aliases, non-ASCII, and escaping are covered without double counting or bypass;Noneafter all postprocessing and before record materialization. Finite values, large integers, source DataFrames, dtypes, and coltypes remain intact, while infinity injected after ChartData materialization continues to be rejected by the untrusted-envelope validator;get_chart_data(format=excel)workbooks cover both engines, the missing-engine path retainsExportError, CSV/JSON UUID behavior is unchanged, and final response accounting still validates the serialized export.Validation used Python 3.11, SQLAlchemy
2.0.52, pandas2.3.3, NumPy1.26.4, and sqlglot30.17.0:tests/unit_tests/mcp_service:4232 passed;192 passed, plus exact boundary and final SQL/UUID targets (10 passedand5 passed);223 passed;5 suites, 83 passed;pre-commit run, repository-configured MyPy, Ruff format/check, custom Pylint, direct scoped Pylint (10.00/10), Python compilation, and staged/unstaged diff checks: passed.Coordination/reconciliation: upstream
masterwas initially inspected read-only atcf77deb678a2421a347e44d4cd0647916dab5514; #43737 (6fd8ab5a13fa7481fd5b083544f74abf90e08ddc), #43679 (364f479c810f815bac51a8bee0a33a53c880bf54), and #43711 (e06be4f694a091bbc93af23fad69fd2e23c587e9) were re-inspected read-only and retain those heads. Sunburst shared-result work was fetched and compared read-only through its latest923d925437f6317ba461154a102e8aa9eb902329; handoff task01a06288-c5c0-77c7-a662-7dddf49b3a36completed at Sunburstbab761b310517918290cd5dbf4a6199107a54d61, with subsequent shared metadata/source-boundary follow-ups included in the latest comparison. Agor confirms Amin's solesc-119157-mcp-bulletworktree/session in themcp chart typeszone. Only Amin's branch was normal-pushed; no contributor/community/Sunburst branch, GitHub comment, or review was modified. During exact-head CI, upstreammasteradvanced to9b2bb15ececb8c5af41713901d417e03c76922e7; GitHub therefore reports this exact head as conflicting in semanticget_tableand datasetquery_dataset. Those new-base conflicts were inspected with a read-only merge tree and deliberately not resolved so the delivered commit remains based directly on the requested head.Exact-head CI completed with
72successful and6skipped checks. The Python unit-test runner hit its fixed 30-minute limit on all three attempts, sounit-tests (current)is cancelled and its required aggregator reports failure. This was a timeout rather than a test assertion: attempt 2 completed the main suite (14,331 passed, 4 skipped, 3 xfailed) and both subsequent 100%-coverage groups (1,486 passed, 1 xfailed;402 passed) before cancellation during post-test coverage upload; attempt 3 again completed the main suite (14,331 passed, 4 skipped, 3 xfailed) before cancellation in the coverage phase. No clean-review claim is made; round 19 follows.Environment caveats:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual UI verification was unavailable. See the Working with LLMs setup guide.^24.16.0/npm^11.13.0, while the worktree provides Node22.22.2/npm10.9.7; the focused frontend suite passed with the existing install.ROUND-19 TESTING AND COORDINATION
Round-19 is delivered by merge commit
b8c5f79142533b1cbecbeb148ea86578d7797817(parents: requested headbc2ce63e549d4368858b5d06981cdbcec742c950and upstreammaster46c8c67a400f57031e3ec61298279470971071ce) plus implementation commit889208c24f5756191941b16f1ba94808b8077754and cleanup commit276f6511a6f4d0da7f4c620ee378053026c2be36. The integration was a normal merge and the branch was normal-pushed; no rebase or force-push was used.Round-19 coverage and contracts:
[True, 1, False, 0]hasunique_count=4; chart get-data, semanticget_table, datasetquery_dataset, and the shared builder each have consumer coverage;timedeltavalues canonicalize at trusted normalization to the same stable ISO text emitted by the existing Pydantic JSON contract; exact date and UUID values likewise canonicalize to their existing JSON strings. Accounting uses the canonical string's exact escaped UTF-8 compact-JSON size, with real result-envelope and exact-boundary/+1 tests, while CSV/JSON/Excel UUID and temporal export guards remain covered;None, never performs frame-wide replacement/object equality, preserves Enum values for the established consumer normalization, and retains rejection of infinity injected after materialization. Directdf_to_recordsand realQueryContextProcessorhostile-__eq__regressions cover the boundary;validate_query_names,build_query_dict, andexecute_tabular_querypaths, including dimension/metric/filter/order validation, ascending/descending inversion, temporal range/grain semantics, cache controls, execution, and final Jinja form-data seeding. This PR'squery_result_datanormalization/budgets, exact result extraction, coltype-aware metadata, response preflight, and structured public errors run immediately above that shared execution result. Both the shared tabular-query tests and the MCP semantic/dataset families pass.Validation used Python 3.11 and SQLAlchemy
2.0.52:206 passed;2030 passed;1374 passed;103 passed;1 suite, 17 passed;pre-commit run(including MyPy, Ruff format/check, custom Pylint, YAML and zizmor), separate scoped MyPy/Pylint, Python compilation, and staged/unstaged diff checks: passed.CI timing was inspected separately from functional failures. At old exact head
bc2ce63...,unit-tests (current)started the main pytest phase at16:15:36Z, completed14,331 passed, 4 skipped, 3 xfailedin26:42, entered the independent 100%-coverage phase, and was cancelled at the fixed 30-minute job deadline while the SQL gate was at 61%; no assertion failure was observed. Round-19 replaces two avoidable multi-gigabyte-equivalent test constructions with equivalent bounded/exact arithmetic or reduced-budget checks (without removing a test or relaxing a production limit), and raises the job timeout to 40 minutes so the full suite plus independent SQL/semantic 100% gates and upload can complete under runner variance. At exact head276f6511a6f4d0da7f4c620ee378053026c2be36, requiredunit-tests (current)run33667465444/ job100373127800passed in about 28m45s: the main phase reported14,428 passed, 4 skipped, 3 xfailedin 23m55s, the SQL 100% gate reported1,486 passed, 1 xfailedin 27.42s, the semantic 100% gate reported415 passedin 29.01s, and Codecov accepted the upload. Required aggregator job100382902161passed. The exact-head pre-commit check also passed. At the reporting snapshot, the rollup was 70 success, 4 neutral, 3 skipped, 2 failure, plus one pending docs-preview context; the only failures were CodeQL Python/JavaScript jobs, whose logs fail before analysis because the workflow initialized CodeQL action4.37.9but ran analyzer4.37.8. This upstream action-version mismatch is reported separately from the successful functional matrix and was not papered over. This is not a clean-review claim.Shared post-merge Sunburst follow-up (
8a053c8ff905f3ed6997f0fd1873c2863532352d): everyChartErrorconstruction inget_chart_sqlnow passes through one final complete-response preflight, including the error-onlyQueryGenerationFailedpath. A real exact-16MiB source error regression verifies that the duplicatedmessage/errorprojection is replaced by a bounded structured fallback rather than serializing at roughly 32MiB. A fixed-envelope test accepts the exact escaped-JSON limit and rejects the same envelope at limit-minus-one (one byte over), while asserting that the fallback itself remains within the configured bound. Focusedget_chart_sqlreported81 passed; combined query-result/get-SQL/get-data reported418 passed; the full MCP chart suite reported1,883 passed; staged pre-commit, MyPy, Ruff, Pylint, compilation, and diff checks passed. At exact head8a053c8ff905f3ed6997f0fd1873c2863532352d, Python-Unit run33671883797passed:unit-tests (current)job100387307158completed in 29m11s with14,430 passed, 4 skipped, 3 xfailedin the main phase,1,486 passed, 1 xfailedin the SQL 100% gate,415 passedin the semantic 100% gate, and an accepted Codecov upload; required aggregatorunit-tests-requiredjob100396942734passed. The exact-head rollup was 72 success, 4 neutral, 3 skipped, the same two upstream CodeQL action-version failures (4.37.9initialization versus4.37.8analyzer), and one pending docs-preview context.Coordination/reconciliation: Agor session/zone context was inspected before work and showed the completed Round-19 reviewer archived with no competing same-PR fixer. Upstream
masterwas fetched and merged at46c8c67a400f57031e3ec61298279470971071ce. #43737 (6fd8ab5a13fa7481fd5b083544f74abf90e08ddc), #43679 (364f479c810f815bac51a8bee0a33a53c880bf54), and #43711 (e06be4f694a091bbc93af23fad69fd2e23c587e9) were re-inspected read-only. Future reconciliation should preserve #43737's shared failure/query changes, #43679's saved-config update behavior, and #43711's compile/preview Jinja seed-shape assertions alongside Bullet's exact-container budgets, explicit-clear/provenance/update semantics, and structured errors. Sunburst #43771 was fetched and compared read-only at923d925437f6317ba461154a102e8aa9eb902329; it already separates boolean metadata identity and canonicalizes date/UUID/duration values but retains a distinct metadata builder/duration spelling and the producerDataFrame.replacepath, so future shared consolidation must retain this round's exact JSON contract and hook-free post-materialization cleanup. No contributor/community/Sunburst branch, GitHub comment, review, Shortcut item, or Agor object was modified.Environment caveats:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual UI verification was unavailable. See the Working with LLMs setup guide.^24.16.0/npm^11.13.0, while the worktree provides Node22.22.2/npm10.9.7; the focused frontend suite passed with the existing install.ROUND-20 TESTING AND COORDINATION
Round-20 starts from the requested clean head
8a053c8ff905f3ed6997f0fd1873c2863532352d. The implementation is commit8c17f7f6c78bad2c0d359d76a7ecdb509eceb908; final delivery is normal merge commitc3c07fda339dc58f21d9aaed4aeeb662995dd2f3(parents8c17f7f6c78bad2c0d359d76a7ecdb509eceb908and upstreammastere8540b7c49583a8ca89cfbcfd95a6a6e6a66a6ed). Upstream was integrated with normal merges and the branch was normal-pushed; no rebase or force-push was used.Round-20 coverage and contracts:
get_chart_previewstrategies,generate_chart, immediate and preview-firstupdate_chart,update_chart_preview, cache aliases, and shared form-data preview generation. Actual MCP entry-point tests accept the exact 16 MiB limit and return a bounded, schema-correct structured fallback at +1; they cover empty/non-empty envelopes, aliases/caches, and Bullet derived-category amplification;Zprojection and avoiding+00:00overcount. Complete outer models are metered once without serializing a second full response;String(value)semantics for null versus empty string, lowercase booleans, integral/non-integral floats, negative zero, finite Decimal values, temporal values, and UUIDs. Strings remain unchanged, Vega preserves normalized raw dimensions where possible, ASCII uses the same category spelling, and collision/budget guards remain enforced;Validation used Python 3.11 and SQLAlchemy
2.0.52:564 passed;4,329 passedin 5m40s;1,901 passed, 1 xfailed;1 suite, 12 passed;Environment caveats:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual verification was unavailable. See the Working with LLMs setup guide.TS6305) in the existing worktree install; the focused Jest suite and all runnable frontend formatting/lint hooks pass.pytest-cov, so the independent SQL/semantic coverage gates are verified by exact-head CI rather than claimed from the local run.Coordination/reconciliation: Agor session and zone context was inspected before work and showed the completed reviewer archived with no parallel same-PR reviewer/fixer. #43737, #43679, and #43711 were fetched and re-inspected read-only for shared failure/query, saved-update, and compile/preview overlaps. Sunburst was compared read-only at
781698ba7c660d561759aff6a22495cc55c3b89e; no contributor, community, or Sunburst branch, GitHub comment/review, Shortcut item, or Agor object was modified. Exact-head CI completed atc3c07fda339dc58f21d9aaed4aeeb662995dd2f3with 76 successful, 2 neutral, and 3 skipped check runs plus a successful docs-preview status. Requiredunit-tests (current)andunit-tests-required, pre-commit, and CodeQL Python/JavaScript all passed. The current-unit job completed in 30m55s within its 40-minute limit: the main phase reported14,452 passed, 4 skipped, 3 xfailedin 26m18s; the SQL gate reported1,486 passed, 1 xfailedat 100% coverage; the semantic gate reported415 passedat 100% coverage; and Codecov accepted the upload. GitHub reports the head mergeable with merge-stateBLOCKED. A fresh independent review follows, and no clean-review claim is made.ROUND-21 TESTING AND COORDINATION
Round-21 starts from the requested exact head
c3c07fda339dc58f21d9aaed4aeeb662995dd2f3and is delivered by implementation commit13adf37c12ca50a366f701173b2c9f6913894c44(parentc3c07fda339dc58f21d9aaed4aeeb662995dd2f3). The branch was normal-pushed; no rebase or force-push was used.Round-21 coverage and contracts:
String(Number)spelling. Coverage includes values beyond2**53, tie-to-even rounding, excess Decimal precision, the fixed/exponent boundaries at1e-6,1e-7,1e20, and1e21, maximum finite binary64, finite-source overflow to positive/negative infinity, negative zero, non-finite rejection/null normalization, and exact-type no-hook guards;get_chart_datapaths bypass the generic original-rowNoDatacheck and return the shared normalized result: one0.0metric row for ungrouped empty data and no fabricated rows/categories for grouped empty data. Actual FastMCP tests cover savedid/chart_idaliases, form-data-key-only queries, JSON, CSV, and Excel; the existing non-Bullet empty-result test retainsNoData;Zaccounting, SQL/tabular-query, result-budget, scalar/DataFrame, cache/Jinja, provenance/update/rebind, empty compile/preview, and cross-chart contracts remain covered.Validation used Python 3.11 and SQLAlchemy
2.0.52:411 passed;4,514 passedin 5m50s;1,901 passed, 1 xfailed;1 suite, 13 passed;Environment caveats:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual verification was unavailable. See the Working with LLMs setup guide.TS6305) in the existing worktree install; the focused Jest suite and all runnable frontend formatting/lint hooks pass.Coordination/reconciliation: Agor session/zone context was inspected first and showed the completed independent reviewer idle with no parallel same-PR fixer. Latest #43771/Sunburst was fetched and compared read-only at
be228ec3f7aeed11756be345124eaffd6c47839b, including its saved/cached get-data and shared result-validation changes; no Sunburst/community/contributor branch was touched or cherry-picked. No GitHub comment/review, Shortcut item, or Agor object was modified. Exact-head CI completed at13adf37c12ca50a366f701173b2c9f6913894c44;gh pr checks --requiredreports every required context passing, including frontend build, pre-commit, MySQL/SQLite/Presto/Hive, Cypress/Playwright aggregators, andunit-tests-required. The current-unit job passed in 30m35s within its 40-minute limit: the main phase reported14,488 passed, 4 skipped, 3 xfailedin 26m08s; SQL reported1,486 passed, 1 xfailedat 100% coverage; semantic layers reported415 passedat 100% coverage; and Codecov accepted the upload. CodeQL Python and JavaScript passed with action4.37.9. Initial duplicate workflow attempts at the same head were superseded/cancelled; the latest required contexts are green. GitHub reportsMERGEABLEwith merge-stateBLOCKED. A fresh independent round is requested, and no clean-review claim is made.ROUND-22 TESTING AND COORDINATION
Round-22 starts from the requested exact head
13adf37c12ca50a366f701173b2c9f6913894c44. Current upstreammaster52a4cb6314aea332f8061a7b3babd814cdebc33bwas fetched and integrated by normal merge commit5d11cc8aa0132ef0ba51f0969027b40c6d8a53fc(parents13adf37c12ca50a366f701173b2c9f6913894c44and52a4cb6314aea332f8061a7b3babd814cdebc33b). The Round-22 implementation and delivery head is50106d7b81b342271a60fe6df09f1be17b6a5abf(parent5d11cc8aa0132ef0ba51f0969027b40c6d8a53fc). Both commits were normal-pushed; no rebase or force-push was used.Round-22 coverage and contracts:
ChartPreviewmodels at the exact 16 MiB boundary and +1 byte cover both Python-repr mismatches:1e-5undercharging and1e-6overcharging, with the existing bounded structured fallbacks preserved;String(value). Backend, actual FastMCP ASCII/Vega, and frontend parity coverage includes dates, UTC datetimes,ZoneInfoambiguous folds, the two distinct instants, bounded raw epoch values, and hostile timezone no-hook rejection;NoDatabehavior remain unchanged;Z, SQL/tabular-query, result-budget, scalar/DataFrame, cache/Jinja, provenance/update/rebind, saved/unsaved/cached zero-row preview, and cross-chart contracts remain covered.Validation used Python 3.11 and SQLAlchemy
2.0.52:420 passed;4,496 passedin 5m24s;1,901 passed, 1 xfailed;1 suite, 13 passed;Environment caveats:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual verification was unavailable. See the Working with LLMs setup guide.TS6305) in the existing worktree install; the focused Jest suite and all runnable frontend formatting/lint hooks pass.sqlalchemy_bigquery,pyhive, andtrinoextras; the requested SQL/semantic suites and exact-head database CI contexts are reported separately.Coordination/reconciliation: Agor session and zone context was inspected first and showed the completed/archived reviewer with no parallel same-PR reviewer or fixer. The five upstream commits through
52a4cb6314aea332f8061a7b3babd814cdebc33bhad no direct Round-22 path overlap and merged without conflict; upstream #43711's Jinja request-body reuse and both test families are retained. Latest #43771/Sunburst was fetched and compared read-only at8b204b5cb5b0b7fca2db837eaec0a2cec4fe5aaf, including its separate pydantic-core final-float sizing helper; no Sunburst/community/contributor branch was modified or cherry-picked. No GitHub comment/review, Shortcut item, or Agor object was modified.Exact-head CI completed at
50106d7b81b342271a60fe6df09f1be17b6a5abfwith 74 successful, 3 neutral, and 3 skipped check runs.gh pr checks --requiredreports every required context passing, including frontend build, pre-commit, MySQL/SQLite/Postgres, Presto/Hive, Cypress/Playwright aggregators, andunit-tests-required; CodeQL Python and JavaScript also passed. Python-Unit run33695455382, job100463283994, completed in 30m57s within the 40-minute gate: the main phase reported14,514 passed, 4 skipped, 3 xfailedin 26m30s, SQL reported1,486 passed, 1 xfailedat 100% coverage, semantic layers reported415 passedat 100% coverage, and Codecov accepted the exact-head upload. GitHub reportsMERGEABLEwith merge-stateBLOCKED.A fresh independent round is requested, and no clean-review claim is made.
ROUND-23 TESTING AND COORDINATION
Round-23 starts from the requested exact head
50106d7b81b342271a60fe6df09f1be17b6a5abfand is delivered by implementation commit30bb2e29169a9465c2380326ba3fc10e5d3a9735(parent50106d7b81b342271a60fe6df09f1be17b6a5abf). The branch was normal-pushed; no rebase or force-push was used. The integrated upstream parent remains52a4cb6314aea332f8061a7b3babd814cdebc33bthrough Round-22 merge commit5d11cc8aa0132ef0ba51f0969027b40c6d8a53fc. Upstream was re-fetched throughd921131c5d95ccc3d442d4389d5e42acb234f017; its three subsequent frontend/chart-list commits have no direct changed-path overlap with Round-23, so no additional master merge was needed.Round-23 coverage and contracts:
pd.Timestamp, exactnp.datetime64, pandas/NumPy NaT, builtin datetime, and builtin date before generic ISO scalar normalization. Exact pandas timestamps are canonicalized to safe timezone implementations and then passed through Superset's productiondatetime_to_epoch, preserving its actual float behavior rather than approximating epoch milliseconds;json_int_dttm_serfor naive and aware timestamps, UTC and fixed-offset equivalent instants, ZoneInfo folds, pytz folds, date-only values, pre-epoch fractions, one-nanosecond/sub-millisecond values, and NaT-to-null behavior. Unsupported timestamp timezone implementations are rejected without invoking armed timezone hooks;df_to_records(pd.DataFrame(...))and carry them through actual FastMCP saved get-data and both ASCII/Vega preview entry points;np.datetime64receives Bullet epoch semantics only in the explicit temporal-number mode;Validation used Python 3.11 and SQLAlchemy
2.0.52:602 passed;4,504 passedin 5m19s;1,901 passed, 1 xfailed;1 suite, 13 passed;Environment caveat:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual UI verification was unavailable. See the Working with LLMs setup guide.Coordination/reconciliation: Agor session and board zones were inspected first; the completed Round-23 independent reviewer was idle and no parallel reviewer/fixer was started. Current upstream master was fetched through
d921131c5d95ccc3d442d4389d5e42acb234f017; its three newer commits were inspected and have no direct Round-23 path overlap, so no new merge was needed. Latest #43771/Sunburst was fetched and compared read-only at0ae605f5ce6df8a9bff0cee13aa0d42c4b7a70a5, including its trusted timestamp canonicalization and separate producer-side non-finite Decimal normalization; no Sunburst/community/contributor branch was modified or cherry-picked. No GitHub comment/review, Shortcut item, or Agor object was modified.Exact-head CI completed at
30bb2e29169a9465c2380326ba3fc10e5d3a9735; all code-head workflows and the subsequent body-only PR-lint completed successfully.gh pr checks --requiredreports every required context passing, including frontend build, pre-commit, MySQL/SQLite/Postgres, Presto/Hive, Cypress/Playwright aggregators, andunit-tests-required; CodeQL also passed. Python-Unit run33700932458, job100479917918, completed in 30m27s within the 40-minute gate: the main phase reported14,522 passed, 4 skipped, 3 xfailedin 26m04s, SQL reported1,486 passed, 1 xfailedat 100% coverage, semantic layers reported415 passedat 100% coverage, and Codecov accepted the exact-head upload. GitHub reportsMERGEABLEwith merge-stateBLOCKED.A fresh independent round is requested, and no clean-review claim is made.
ROUND-24 TESTING AND COORDINATION
Round-24 starts from the requested exact head
30bb2e29169a9465c2380326ba3fc10e5d3a9735and is delivered by implementation commita502ae46285ccbba6adc72d9a9be6a1932b367c2(parent30bb2e29169a9465c2380326ba3fc10e5d3a9735). The branch was normal-pushed; no rebase or force-push was used.Round-24 coverage and contracts:
df_to_recordsnow recognizes only exact builtinDecimalvalues and calls the non-dispatchingDecimal.is_finite(value)descriptor. Exact NaN, signaling NaN, positive infinity, and negative infinity become producer-boundaryNone; exact finite Decimal objects retain identity and precision until the intended JSON wire conversion. The record rewrite uses builtin dict operations and leaves Decimal subclasses untouched for the bounded consumer validator, without calling their equality, finite-check, or float hooks;QueryContextProcessor→ChartDataCommandcoverage verifies strict Chart Data JSON, finite-Decimal provenance, and hostile-subclass rejection. Sync SQL Lab, async SQL result serialization, view deserialization, and public form-data-key FastMCP get-data regressions verify that Decimal non-finite tokens cannot escape while a finite high-precision Decimal remains valid;ZoneInfo. The projection mirrors dateutil fold/gap/post-table selection without invoking timezone hooks and fails closed when the exact table cannot be trusted;df_to_records(pd.DataFrame(...))producers, compile, get-data, and public FastMCP ASCII/Vega Bullet paths. All compare directly withjson_int_dttm_ser/datetime_to_epochwire values;Validation used Python 3.11 and SQLAlchemy
2.0.52:625 passed;4,512 passedin 5m14s;283 passed;1,918 passed, 1 xfailed;7,200dateutil named-zone cases directly withdatetime_to_epoch;2 suites, 16 passed;Environment caveat:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual UI verification was unavailable. See the Working with LLMs setup guide.Coordination/reconciliation: Agor session and board zones were inspected first; the completed Round-24 independent reviewer was idle and no parallel reviewer/fixer was started. Current upstream master was fetched through
b457280b57ac79be13877fb6ab1132cad75d1118; its four commits after the already integrated master parent have no direct Round-24 changed-path overlap, so no additional merge was needed. Latest #43771/Sunburst was fetched and compared read-only at28bbacacd0421f79913761c922b0428a9be52f23, including its separate exact-Decimal producer normalization commit0ae605f5ce6df8a9bff0cee13aa0d42c4b7a70a5; no Sunburst/community/contributor branch was modified or cherry-picked. No GitHub comment/review, Shortcut item, or Agor object was modified.Exact-head code CI completed at
a502ae46285ccbba6adc72d9a9be6a1932b367c2with 74 successful, 3 neutral, and 3 skipped check runs.gh pr checks --requiredreports every required context passing, including frontend build, pre-commit, MySQL/SQLite/Postgres, Presto/Hive, Cypress/Playwright aggregators, andunit-tests-required; CodeQL also passed. Python-Unit run33706637574, job100497103354, completed in 31m29s within the 40-minute gate: the main phase reported14,543 passed, 4 skipped, 3 xfailedin 26m53s, SQL reported1,487 passed, 1 xfailedat 100% coverage, semantic layers reported415 passedat 100% coverage, and Codecov accepted the exact-head upload. GitHub reportsMERGEABLEwith merge-stateBLOCKED.A fresh independent round is requested, and no clean-review claim is made.
ROUND-25 TESTING AND COORDINATION
Round-25 starts from the requested exact head
a502ae46285ccbba6adc72d9a9be6a1932b367c2and is delivered by implementation commit4131a07494af7046c0dd53d8d5ba23293796c4bf(parenta502ae46285ccbba6adc72d9a9be6a1932b367c2). The branch was normal-pushed; no rebase or force-push was used.Round-25 coverage and contracts:
_ttinfo_before; they validate and use exact_ttinfo_std. Non-empty tables retain the exact before-record requirement, transition/container bounds, and fail-closed behavior. System and packaged dateutil UTC, GMT, Universal, Zulu, EST, HST, MST,Etc/GMT+1, andEtc/GMT-2values are compared directly withdatetime_to_epochwithout timezone hook dispatch;df_to_records(pd.DataFrame(...))→ChartDataCommandproducer results cover compile and public FastMCP get-data/Vega preview for all of those system and packaged transitionless zones. Source numbers, derived grouping/axis categories, and Vega tooltips retain the Chart Data JSON/browser coercion contract;_strict_bullet_result_data, saved aliases, and unsaved/form-data-key FastMCP get-data. Top-level and nested query data/counts remain zero. Saved CSV and openpyxl/xlsxwriter Excel exports emit known headers only, while the separate saved/unsaved preview contract still renders its private zero-valued fallback safely. Grouped empty and non-Bullet NoData behavior are unchanged;Local validation used Python 3.11 and SQLAlchemy
2.0.52:755 passed;4,330 passedin 5m04s;2,215 passed, 1 xfailed;2 suites, 16 passed;Environment caveat:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual UI verification was unavailable. See the Working with LLMs setup guide.Coordination/reconciliation: Agor session and board zones were inspected first; the completed independent reviewer was idle and no parallel reviewer/fixer was started. Upstream master was fetched through
b457280b57ac79be13877fb6ab1132cad75d1118; its four commits after the already integrated52a4cb6314aea332f8061a7b3babd814cdebc33bmaster parent have no changed-path overlap, so no additional merge was needed. Latest #43771/Sunburst was compared read-only at28bbacacd0421f79913761c922b0428a9be52f23; overlap PRs #43737, #43679, and #43711 were also checked read-only. No branch was modified or cherry-picked, and no GitHub comment/review, Shortcut item, or unrelated Agor object was modified.Exact-head code CI completed at
4131a07494af7046c0dd53d8d5ba23293796c4bfwith 75 successful, 3 neutral, and 3 skipped check runs. Every required context passes, including frontend build, pre-commit, MySQL/SQLite/Postgres, Presto/Hive, Cypress/Playwright aggregators, andunit-tests-required; both Python and JavaScript CodeQL analyses pass. Python-Unit run33711127353, job100510674235, completed in 31m21s within the 40-minute gate: the main phase reported14,568 passed, 4 skipped, 3 xfailedin 26m49s, SQL reported1,487 passed, 1 xfailedat 100% coverage, semantic layers reported415 passedat 100% coverage, and Codecov accepted the exact-head upload. GitHub reportsMERGEABLEwith merge-stateBLOCKEDbecause a fresh review is required.A fresh independent round is requested, and no clean-review claim is made.
ROUND-26 TESTING AND COORDINATION
Round-26 starts from the requested exact head
4131a07494af7046c0dd53d8d5ba23293796c4bfand is delivered by implementation commit6d0041f459aa319dad115d033fbf7b4b284ff338(parent4131a07494af7046c0dd53d8d5ba23293796c4bf). The branch was normal-pushed; no rebase or force-push was used.Round-26 coverage and contracts:
timedelta, exact trustedpandas.Timedelta, and exactnumpy.timedelta64. Builtin and pandas values reproduceformat_timedeltaspelling without comparison/string hooks; exact NumPy durations follow the real DataFrame producer boundary by promoting supported unambiguous units to pandas semantics, converting NaT to null, and failing closed for ambiguous units or overflow;json_int_dttm_seroutput for negative, zero, day, microsecond, nanosecond, maximum/minimum, and coarse-unit extremes. Hostile builtin/pandas subclasses are rejected without hook dispatch. Realdf_to_records(pd.DataFrame(...))→ChartDataCommandresults cover compile, saved cached get-data, form-data-key get-data, public FastMCP ASCII/Vega preview, CSV, and both openpyxl/xlsxwriter exports;Rangetooltip only where the frontend supplies a containing label. Selection matches the stable ascending-thresholdmeasure <= thresholdrule, blank-hit behavior, and> last-labelresult beyond the final threshold. Coverage includes exact boundaries, within/beyond ranges, negative and zero values, reordered thresholds, integer/float/Decimal measures, custom/default/blank labels, grouped/ungrouped and empty results, hostile source-key collisions, invalid presentation validation, and final-response amplification rejection;Local validation used Python 3.11 and SQLAlchemy
2.0.52:799 passed;4,374 passedin 5m10s;2,215 passed, 1 xfailed;25,004builtin/pandas cases plus56NumPy unit/extreme cases, zero mismatches;2 suites, 17 passed;Environment caveat:
curl -f http://localhost:8088/healthfails because no live Superset server is running in this worktree, so live/manual UI verification was unavailable. See the Working with LLMs setup guide.Coordination/reconciliation: Agor session and board zones were inspected first; the completed Round-26 independent reviewer was idle and no parallel reviewer/fixer was started. Upstream master remains
b457280b57ac79be13877fb6ab1132cad75d1118; its commits after the already integrated52a4cb6314aea332f8061a7b3babd814cdebc33bparent have no Round-26 changed-path overlap, so no merge was needed. #43771/Sunburst was compared read-only at28bbacacd0421f79913761c922b0428a9be52f23; #43737, #43679, and #43711 were also checked read-only. No related branch was modified or cherry-picked, and no GitHub comment/review, Shortcut item, or unrelated Agor object was modified.Exact-head CI at
6d0041f459aa319dad115d033fbf7b4b284ff338(GitHub merge ref862912e7fe9ea831d309fde5937ad42326bdb0b9) is complete: all required checks passed;75checks succeeded,3were neutral docs-preview checks, and3were intentionally skipped. CodeQL and both JavaScript/Python analyses passed. Python Unit run33716016893, job100525293147, completed successfully in 26m05s; its current-unit suite reported14,612 passed, 4 skipped, 3 xfailedin 21m54s, and the two 100%-coverage suites reported1,487 passed, 1 xfailedand415 passed, both at required100.00%coverage. Codecov project and patch checks passed. GitHub reports the PRMERGEABLE; itsBLOCKEDstate is the expectedREVIEW_REQUIREDpolicy state.A fresh independent round is requested, and no clean-review claim is made.
REVIEW-COMMENT RESOLUTION PASS (ROUND 27 FOLLOW-UP)
This finite pass starts from the verified clean local/tracking/fork/live PR head
6d0041f459aa319dad115d033fbf7b4b284ff338and is delivered by703bb6cd8c9a96c19e0e76c0b1e3ec968ec26489(parent6d0041f459aa319dad115d033fbf7b4b284ff338). The branch was normal-pushed; no rebase or force-push was used.Confirmed reviewer findings addressed:
yencoding as the measure bar. The dead saved-preview Bullet builder was removed so all public saved/unsaved/cache paths use the single strict shared renderer; grouped public FastMCP and direct saved-preview tests assert per-row range encodings;dimensionsand nativegroupbyaliases are rejected deterministically. Exact spelling remains required at schema-only adaptation because quoted physical identifiers may differ by case; dataset-aware canonicalization remains exact-first/casefold-unambiguous;sqlExpressionresult field, HAVING saved-metric fallback survives ambiguous physical-column casefold matches, supported native frontend operator names adapt to typed operators, malformed nested error objects no longer hide a valid top-level query message, XY log scale uses the frontendlogAxiskey, and final oversize failures after chart creation retain the persisted chart ID with an explicit do-not-retry instruction;df_to_recordspromotes exactnp.timedelta64values to exactpandas.Timedeltaand converts NumPy NaT toNone. Producer assertions were added to the compile, get-data, and preview tests before their directjson_int_dttm_serparity comparisons;Local validation used Python 3.11 and SQLAlchemy
2.0.52:1,451 passedin 1m10s;tests/unit_tests/mcp_service:4,386 passedin 5m45s;313 passed;1 suite, 14 passed;Coordination/reconciliation: Agor sessions and board zones were inspected before edits and showed this as the only active writer for
sc-119157-mcp-bullet. Upstreammasterwas fetched throughd2d965e0; its 12 commits after the previously inspectedb457280bhave no changed-path overlap with this PR, so no merge was needed. #43771/Sunburst was compared read-only at05c9abcaa8a91c636b309f85bd0db29f4a7a0188; no Sunburst, contributor, or community branch was modified or cherry-picked. All ten live unresolved/outdated threads and all six review summaries/nine issue comments were fetched directly from GitHub and triaged individually. Exact-head CI completed at703bb6cd8c9a96c19e0e76c0b1e3ec968ec26489: 75 check runs succeeded, the docs-preview status succeeded, 3 checks were neutral, and 3 were intentionally skipped. Every required context passed, including pre-commit, frontend build, MySQL/SQLite/Postgres, Presto/Hive, Cypress/Playwright aggregators, andunit-tests-required; Python and JavaScript CodeQL passed. Python-Unit run33786401386, job100752237100, completed in 21m10s within the 40-minute gate: the main suite reported14,649 passed, 4 skipped, 3 xfailedin 16m51s, SQL reported1,487 passed, 1 xfailedat 100% coverage, semantic layers reported415 passedat 100% coverage, and Codecov accepted the upload. GitHub reportsMERGEABLE;BLOCKEDreflectsREVIEW_REQUIRED. All ten review threads are individually resolved after evidence replies. This is the requested finite comment-resolution pass; it does not initiate another review loop.ADDITIONAL INFORMATION