feat(mcp): add typed Sunburst chart support - #43771
Conversation
Code Review Agent Run #eec59fActionable 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 |
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## master #43771 +/- ##
==========================================
+ Coverage 79.41% 79.54% +0.13%
==========================================
Files 2894 2898 +4
Lines 167820 171230 +3410
Branches 38863 39751 +888
==========================================
+ Hits 133269 136207 +2938
- Misses 32051 32240 +189
- Partials 2500 2783 +283
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:
|
✅ Deploy Preview for superset-docs-preview ready!
To edit notification comments on pull requests, go to your Netlify project configuration. |
Code Review Agent Run #d98b39Actionable Suggestions - 0Additional Suggestions - 9
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 #3f2309Actionable Suggestions - 0Additional Suggestions - 15
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 #07c451Actionable Suggestions - 0Additional Suggestions - 17
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 #82b6e5Actionable 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 |
There was a problem hiding this comment.
Code Review Agent Run #bb24a2
Actionable Suggestions - 1
-
superset/mcp_service/chart/tool/get_chart_data.py - 1
- Exact-type guard breaks parse fallback · Line 450-452
Additional Suggestions - 7
-
tests/unit_tests/mcp_service/dataset/tool/test_query_dataset.py - 3
-
fold=1 offset expectation wrong · Line 599-599`fold=1` on 2024-10-27 01:30 in `Europe/Dublin` denotes the second occurrence after clocks fall back, which is GMT (+00:00), not IST (+01:00). The expected `+01:00` is semantically inconsistent with Python/dateutil fold semantics. Verify `_dateutil_named_offset_without_hooks`'s `if not value.fold and is_ambiguous: index -= 1` branch; either the expectation should be `+00:00` or the source's fold handling is inverted.
-
Vacuous secret-leak assertion · Line 337-337`HostileRuntimeError.__str__`/`__repr__` return `"round21-hostile-runtime-secret"`, never the constructor arg `"stored-secret"`. So this assertion checks a literal that can never appear and would pass even if the secret leaked. Assert the real leakable string so the containment test actually verifies its claim.
-
Unmocked DB lookup in unit test · Line 298-313In the `context-exit` branch `resolve_dataset` is left unmocked, so the test performs a real `DatasetDAO.find_by_id(1)` DB lookup before the context `__exit__` raises. Every other test in this file mocks `resolve_dataset` (e.g. lines 570, 626). Mock it here too for a deterministic unit test.
-
-
tests/unit_tests/mcp_service/chart/tool/test_get_chart_data.py - 1
-
Duplicated test setup · Line 961-989Both new tests duplicate the same `_Command` stub, `form_data`, and five `monkeypatch.setattr` calls (lines 902-923 vs 961-989). If one setup block is later updated (e.g. a new mock) and the other is not, the two tests silently diverge. Consider a shared fixture/helper to keep the timezone assertions the only difference.
-
-
tests/unit_tests/mcp_service/chart/tool/test_get_chart_sql.py - 1
-
Test no longer near boundary · Line 428-428`test_extract_sql_accepts_multi_query_and_near_response_boundary` only patches `_get_chart_sql_mod.MAX_QUERY_RESULT_VALUE_BYTES`, but the boundary case flows through `response_json_failure`, which reads the constant from `query_result` (still 16 MiB). So `boundary_sql = test_limit - 512` (3584 B) is no longer near the response limit, and the test no longer verifies its stated purpose. Patch `query_result.MAX_QUERY_RESULT_VALUE_BYTES` too, as the sibling test does.
-
-
superset/mcp_service/chart/response_preflight.py - 1
-
Missing unit tests · Line 45-80This new helper is now used at 10+ call sites across `get_chart_data.py`, `query_dataset.py`, and `get_table.py`, yet has no unit tests. Its byte-budget truncation, multi-byte UTF-8 handling, and type-dispatch branches are non-trivial (C901-suppressed). Per BITO.md rules 11730/11731, add tests covering success paths, edge cases, and the 'request failed' fallback.
-
-
tests/unit_tests/mcp_service/chart/query_result_fixtures.py - 1
-
Nested ternary readability · Line 82-90The nested conditional expression for deriving `columns` is hard to read and error-prone. Consider refactoring to use explicit `if/elif/else` statements for clarity and easier maintenance.
-
Review Details
-
Files reviewed - 12 · Commit Range:
0ae605f..414c7a6- superset/mcp_service/chart/response_preflight.py
- superset/mcp_service/chart/tool/get_chart_data.py
- superset/mcp_service/dataset/tool/query_dataset.py
- superset/mcp_service/semantic_layer/tool/get_table.py
- tests/unit_tests/mcp_service/chart/test_query_result.py
- tests/unit_tests/mcp_service/chart/test_response_preflight.py
- tests/unit_tests/mcp_service/chart/tool/test_get_chart_data.py
- tests/unit_tests/mcp_service/chart/tool/test_get_chart_sql.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/chart/query_result.py
- tests/unit_tests/mcp_service/chart/query_result_fixtures.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
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 #4d92c9Actionable Suggestions - 0Review 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 #4d423dActionable Suggestions - 0Review 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 |
| *([roles.secondary_metric] if roles.secondary_metric else []), | ||
| ): | ||
| assert field is not None | ||
| if not _finite_number(row[field]): |
There was a problem hiding this comment.
A NULL aggregate value now rejects the entire Sunburst result even though the frontend treats a non-numeric metric as zero. A group whose SUM(revenue) is NULL can therefore make generate/preview fail (and compile sampling makes it intermittent); could this normalize missing metric values to the frontend behavior before validating?
| return _invalid_metadata(label) | ||
| if "cache_timeout" in payload: | ||
| timeout = dict.__getitem__(payload, "cache_timeout") | ||
| if timeout is not None and not ( |
There was a problem hiding this comment.
This rejects Superset's supported cache_timeout = -1 sentinel, which QueryContextProcessor includes whenever caching is disabled. Any MCP chart query using that valid setting now fails the new result-envelope check; could the validator allow CACHE_DISABLED_TIMEOUT?
Code Review Agent Run #686bfaActionable 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 |
SUMMARY
Adds complete typed MCP support for the frontend ECharts Sunburst plugin using the exact
sunburst_v2viz tag and the typedchart_type="sunburst"discriminator.filters/extra_filters, and nestedextra_form_datafilters while retaining unrelated predicates.g.form_datawithset_query_context_form_dataimmediately beforeChartDataCommand.run()for saved ASCII, table, and Vega-Lite previews, so virtual-dataseturl_param,filter_values, andget_filtersJinja macros receive the saved query fields.Coordination (read-only inspection; only Amin's Sunburst branch and this PR body were changed):
This post-coordination pass started from clean exact local/fork/PR head
923d925437f6317ba461154a102e8aa9eb902329after inspecting the Agor session/zone state. The completed reviewer was archived; no competing Sunburst reviewer/fixer was created.Upstream
masterwas integrated only through normal merge commits, never rebase/force-push:bcf11aed7381c02064aba68d0d44c13f02a90466has parents923d925437f6317ba461154a102e8aa9eb902329and46c8c67a400f57031e3ec61298279470971071ce; aftermasteradvanced during validation,ce32695a047c2635e604815b30cf39a0cb80158aintegrated3bd437869a68814af19408de349567702ebe740awith parents3a2b9ba2630a9e4ff22deefb0fc7fb2799cf2cb5and3bd437869a68814af19408de349567702ebe740a.The semantic
get_table.pyconflict was resolved in favor of upstream's sharedbuild_query_dict/validate_query_names/execute_tabular_queryflow, preserving datasource name validation, time filters/grain/order construction, cache/force handling, standard execution, access validation, and Jinja seeding. Sunburst's strict bounded normalized envelope, coltype-aware metadata, structured errors, and final-response projection preflight are layered after that shared execution.query_datasetwas re-inspected for the same semantic overlap and retains the shared upstream tabular-query path plus the same bounded response contract.feat(mcp): add typed Gantt chart support #43737 was re-inspected at
6fd8ab5a13fa7481fd5b083544f74abf90e08ddc: it overlaps registry/query-result/compile/preview/update surfaces but remains Gantt-specific. If it lands first, reconcile its registered-chart additions with Sunburst while preserving this branch's shared exact-container/result budgets.fix(mcp): preserve chart form data on update #43679 was re-inspected at
364f479c810f815bac51a8bee0a33a53c880bf54: it overlapsupdate_chartform-data preservation. If it lands first, retain its same-viz overlay behavior and Sunburst's complete target-owned query-role replacement, explicit clears, provenance, and rebind fail-closed rules.fix(mcp): render virtual-dataset Jinja by seeding g.form_data in chart compile + preview (#40570) #43711 was re-inspected at
e06be4f694a091bbc93af23fad69fd2e23c587e9: it overlaps compile/preview Jinja seeding. If it lands first, keep seeding before command construction/validation/run in every saved and unsaved compile/preview path without duplicating the upstream shared tabular-query seeding.feat(mcp): add typed Bullet chart support #43770/Bullet and its active ROUND-19 fixer were inspected read-only at
bc2ce63e549d4368858b5d06981cdbcec742c950; no Bullet file/ref/commit was touched or cherry-picked. Whichever shared-contract PR lands second must manually reconciledataframe.py,query_result.py, SQL/data consumers, response metadata, and tests, preserving exact-type/no-hook projection, Period/Interval support, source/metadata/response budgets, strict infinity semantics, real envelopes, Jinja/cache/rebind ordering, and each chart type's discriminator/plugin behavior.Fresh findings were implemented independently in
3a2b9ba2630a9e4ff22deefb0fc7fb2799cf2cb5: final dataset/semantic response projection bounds, exact trusted pandas Period/Interval normalization, hostile-producer-safe boundedget_chart_sql, and hook-free post-materialization nonfinite/missing projection indataframe.py.The branch was normal-pushed from
923d925437f6317ba461154a102e8aa9eb902329toce32695a047c2635e604815b30cf39a0cb80158a. No GitHub comments/reviews, Shortcut changes, Agor mutations, contributor/community branches, or other PR bodies were modified. A fresh independent review follows; this update does not claim review-clean status.The fresh post-merge fixes started from exact clean head
ce32695a047c2635e604815b30cf39a0cb80158aand were delivered in child commit781698ba7c660d561759aff6a22495cc55c3b89eby a normal fast-forward push. ExactDecimalvalues now retain trusted numeric identity through result validation and are serialized by Pydantic as precision-preserving JSON strings; Sunburst accepts only exact finiteint/float/Decimalvalues, so arbitrary numeric strings and nonfinite values remain rejected. Every publicget_chart_sqlsuccess/error result crosses the complete-response preflight; the error-only extractor also preflights itsQueryGenerationFailedresult.The active feat(mcp): add typed Bullet chart support #43770/Bullet Round-19 follow-up was compared read-only at
276f6511a6f4d0da7f4c620ee378053026c2be36. Agor branch01a05dad-4b31-7188-b2ac-217d4b294374remains inmcp chart types, with existing task01a06379-4cc1-7008-8f56-775d914c4fa9handling the same SQL-error final-preflight finding. Its shared result code independently retains exactDecimalvalues, and its SQL error-only branch still had the same direct return at the inspected head. No Bullet worktree, ref, file, commit, session, or PR body was changed.During exact-head CI, upstream
masteradvanced from the already-integrated3bd437869a68814af19408de349567702ebe740ato0ea234e9ae1bb8e0f8f93aafa3232de87085a5d3through chore(deps-dev): bump @typescript-eslint/parser from 8.67.0 to 8.68.0 in /superset-websocket #43789 and chore(deps): bump github/codeql-action/analyze from 4.37.8 to 4.37.9 #43791; final delivery verification observede7c42dd8ed8053a80b031fa8f6e84df8b4105b0dafter chore(deps-dev): bump fast-uri from 3.1.5 to 3.1.7 in /superset-embedded-sdk #43796. The branch was intentionally not merged again, preserving the requested upstream merge and its 13 green required checks. A read-onlygit merge-tree --write-tree 781698ba... e7c42dd8...completed without conflicts (4dc295e384993058d1341fd0574813ca5791d1e9). GitHub reportsMERGEABLE;BLOCKEDis onlyREVIEW_REQUIRED, while its cached base/merge ref still names the integrated3bd43786...base.Local, Amin-fork, and live PR heads all match
781698ba7c660d561759aff6a22495cc55c3b89e, and the worktree is clean. Only Amin's Sunburst branch plus this testing/coordination body text changed. No GitHub comments/reviews, Shortcut/Agor mutations, contributor/community branches, or other PR bodies were touched. A fresh independent review follows; this update does not claim review-clean status.Fresh strict get-data and exact-response follow-up started from the requested clean exact head
781698ba7c660d561759aff6a22495cc55c3b89eand was delivered by normal fast-forward pushes ineac84f7fb8331482ed1e3bac7df19130cdad7fa0andbe228ec3f7aeed11756be345124eaffd6c47839b. Saved, cached-update, and unsaved/form-data-key Sunburst data now resolve the form data used by the executed query, run strict Sunburst result validation exactly once immediately after generic envelope validation, and reject malformed hierarchy/aliases plus string/boolean metrics before profiling, metadata, exports, or response construction. Exact producerDecimalvalues remain numeric through validation and preserve their wire precision; finite builtin integers/floats retain the same contract.Complete-response preflight now walks Pydantic's JSON-mode projection rather than its Python projection. This accounts UTC
Z, naive and offset/fold timestamps, computedmessage/errorduplication, Decimal/date/time/timedelta/UUID/bool/int values, and pydantic-core's shortest float exponent exactly. A 16,777,216-byteChartErrorpasses and the one-byte-larger response fails, while source-cell and metadata budgets are unchanged and projection failures return a bounded fixed error.feat(mcp): add typed Bullet chart support #43770/Bullet was compared read-only at exact head
8a053c8ff905f3ed6997f0fd1873c2863532352d, including its completed independent review session01a063b5-4215-73dc-9229-63ba43e107d1. Its sharedresponse_json_failurestill used Python-mode datetime projection at that inspected head, so the UTC exact-boundary correction in this Sunburst follow-up must be retained when the shared branches are reconciled. No Bullet worktree, local branch, file, commit, session, ref, PR body, comment, or review was changed.Current upstream
masterwas inspected ate8540b7c49583a8ca89cfbcfd95a6a6e6a66a6ed;git merge-tree --write-tree be228ec3... e8540b7c...completed conflict-free with treece7024af07b9d3f94e09de97ccbf393bf5259732. GitHub reports the exact PR headMERGEABLE;BLOCKEDremains review policy only. Local, tracking, fork, and live PR heads match, the worktree is clean, and no GitHub comments/reviews, Shortcut/Agor mutations, contributor/community branches, or other PR bodies were touched. A fresh independent review follows; this update does not claim review-clean status.Round 18 started from the requested exact clean local/fork/PR head
84dbac6dbea4387bd49045279d01b2ba99c8a2aaafter read-only inspection of themcp chart typesAgor zone and confirmation that the independent review sessions were idle/completed, with no parallel same-branch fixer. Exact trustedDecimalNaN,sNaN,Infinity, and-Infinityare canonicalized toNoneimmediately after real DataFrame record materialization; finite exactDecimalidentity and precision are preserved. The exact-type check invokesDecimal.is_finiteonly fortype(value) is Decimal, so hostile subclasses remain opaque and are rejected later by the strict result-envelope boundary without executing their numeric or equality hooks.The fix and producer/consumer regressions were committed as
0ae605f5ce6df8a9bff0cee13aa0d42c4b7a70a5. Coverage spans real DataFrame andQueryContextProcessormaterialization, actual saved/unsaved/cached Sunburst Decimal entry paths, an unsaved FastMCPChartDatawire path for all four non-finite Decimal variants, strict hostile-subclass rejection, synchronous SQL Lab serialization, asynchronous result-backend serialization, and the SQL Lab view consumer.Upstream
masterd921131c5d95ccc3d442d4389d5e42acb234f017was merged normally and conflict-free as delivered head28bbacacd0421f79913761c922b0428a9be52f23, with parents0ae605f5ce6df8a9bff0cee13aa0d42c4b7a70a5andd921131c5d95ccc3d442d4389d5e42acb234f017; the final merge-tree is3677c1507113f0c141790d7c30a7035ff4a6d9bc. After exact-head validation began, upstream advanced to unrelated OpenAPI regenerationb457280b57ac79be13877fb6ab1132cad75d1118; read-only reconciliation remains conflict-free (1d3cd322135696c3bd544ccfc9a73a64d036a01e) and no further merge was needed for this finding. Bullet feat(mcp): add typed Bullet chart support #43770 was compared read-only at50106d7b81b342271a60fe6df09f1be17b6a5abf; no Bullet branch/ref/file/commit or PR body was changed or cherry-picked.The two commits were normal-pushed only to Amin's
sc-119162-mcp-sunburst. Only that branch and this PR's coordination/testing body sections were changed. No GitHub comments/reviews, Shortcut/Agor mutations, contributor/community branches, or other PR bodies were touched. A fresh independent review follows; this update does not claim review-clean status.Round 19 started from the requested exact clean local/fork/PR head
28bbacacd0421f79913761c922b0428a9be52f23after read-only inspection of themcp chart typeszone and confirmation that the Round 17–19 independent review sessions were idle, with no parallel same-branch fixer. The fix was committed asd8bff70c06616ffe44534c2f10bfb858ca1ab914.get_chart_data,query_dataset, and semanticget_tablenow each expose one public wrapper that finalizes the completeChartData | ChartError,QueryDatasetResponse | DatasetError, orGetTableResponse | SemanticLayerErrorresult exactly once. Saved, cached-unsaved, validation, query/command, OAuth, export, empty-data, and dynamic exception returns all cross the same exact Pydantic JSON-wire gate. Oversized or uninspectable results map directly to fixed schema-specific errors under 1 KiB; no dynamic failure text is copied into the fallback and the fallback is not recursively preflighted.The response-boundary matrix uses monkeypatched 4 KiB limits for route/schema/timestamp/fold/alias/amplification/exact/+1 cases while retaining one real 16,777,216-byte
ChartErrorwire-parity allocation. The Python-unit timeout was changed from 30 to 40 minutes using the exact independently inspected Bullet workflow diff so the main coverage run plus SQL and semantic 100% gates can finish under runner variance. Bullet feat(mcp): add typed Bullet chart support #43770 was compared read-only at6d0041f459aa319dad115d033fbf7b4b284ff338; feat(mcp): add typed Gantt chart support #43737, fix(mcp): preserve chart form data on update #43679, and fix(mcp): render virtual-dataset Jinja by seeding g.form_data in chart compile + preview (#40570) #43711 were rechecked read-only at6fd8ab5a...,364f479c..., ande06be4f6.... No related branch/ref/file/commit or PR body was modified or cherry-picked.Upstream
masterb457280b57ac79be13877fb6ab1132cad75d1118was merged normally and conflict-free as delivered heada84a870101d09e32117185803e9b004f20974fcb, with parentsd8bff70c06616ffe44534c2f10bfb858ca1ab914andb457280b57ac79be13877fb6ab1132cad75d1118. After merged-head validation, upstream advanced to unrelated report-screenshot fix4a18556fdc0badac4a82857c06c153623b776480; read-only reconciliation remains conflict-free (37236a5cac1923856c79c07e067097245eb7f827) and no additional merge was needed for these findings.The commits were normal-pushed only to Amin's
sc-119162-mcp-sunburst. Only that branch and this PR's coordination/testing body sections were changed. No GitHub comments/reviews, Shortcut/Agor mutations, contributor/community branches, or other PR bodies were touched. A fresh independent review follows; this update does not claim review-clean status.Round 20 started from the requested exact clean local/fork/PR head
a84a870101d09e32117185803e9b004f20974fcbafter read-only inspection of themcp chart typeszone and confirmation that the completed independent review was idle and no parallel same-branch fixer was running. The wrapper fix is commit615b784f5ca0669bb64f1d8951c7ffd466fbb4b9.Each public
get_chart_data,query_dataset, and semanticget_tablewrapper now catches exceptions raised while evaluating the producer call or during its await, records only a fixed server-sidelogger.exceptionmessage, constructs the declared union's fixedInternalError, and invokes the schema-specific finalizer exactly once. The fixed fallbacks remain below 1 KiB and do not contain, duplicate, or recursively amplify dynamic exception text. Real FastMCP tests exercise startup logging, cached-unsaved force/auth helpers, saved-chart selection, semantic metadata permission/selection, and synchronous-before-await producer failures.Current upstream
master4a18556fdc0badac4a82857c06c153623b776480was merged normally without conflict as delivered head7d28f3a1c342140716a57407b685e23d115f6813. feat(mcp): add typed Bullet chart support #43770/Bullet was compared read-only at6d0041f459aa319dad115d033fbf7b4b284ff338; overlapping feat(mcp): add typed Gantt chart support #43737, fix(mcp): preserve chart form data on update #43679, and fix(mcp): render virtual-dataset Jinja by seeding g.form_data in chart compile + preview (#40570) #43711 heads were compared read-only at6fd8ab5a13fa7481fd5b083544f74abf90e08ddc,364f479c810f815bac51a8bee0a33a53c880bf54, ande06be4f694a091bbc93af23fad69fd2e23c587e9. No code/ref was copied or modified on those branches.The commits were normal-pushed only to Amin's
sc-119162-mcp-sunburst. Only that branch and this PR's coordination/testing body sections were changed. No GitHub comments/reviews, Shortcut or Agor mutations, contributor/community branches, or other PR bodies were touched. A fresh independent review follows; this update does not claim review-clean status.Round 22 started from the requested exact clean local/fork/PR head
414c7a6e74832fde0e33ccd7972c99e3c9528afeafter read-only inspection of the Agor zones and confirmation that the completed reviewer was idle/archived and no same-branch fixer was running. The fix was committed ascc77c468e94940d8711bdb2d2650e2eb475da8dband normal-pushed only to Amin'ssc-119162-mcp-sunburstbranch.Native Sunburst SIMPLE metrics now treat the nested frontend
ColumnMetaas intentionally extensible: the complete object crosses exact-type, depth, container, key, per-string, aggregate-string, value-count, finite-number, and integer bounds without invoking arbitrary mapping/key/value hooks, then only required exactcolumn_name(includingcolumnName) and optional exacttypeare projected. Missing/malformed owned fields fail closed, while top-level metric typo rejection and the existing closed native XY contract remain unchanged. Public request, native round-trip, preview, save, update, and initialized FastMCP tests use the repositoryTestDatasetshape and bounded forward-compatible fields.Upstream
master18465bad51fae607d29b30f2c73d87fac14a920ewas merged normally and without conflict as5601e3f59714ba9ec9eb78b1b1cf2fd70e08d1fa, with parents414c7a6e...and18465bad.... During exact-head CI, upstream advanced to unrelated chart-list sortingbf12a21367ca10f6f29e553b3245f7d888d543f5; read-only reconciliation remains conflict-free with merge tree2242e04ac2d4a3782591b1a01d0a1af07eb5f239, so no additional merge was needed and the green exact-head CI was preserved. Clean Bullet feat(mcp): add typed Bullet chart support #43770 was compared read-only at6d0041f459aa319dad115d033fbf7b4b284ff338; feat(mcp): add typed Gantt chart support #43737, fix(mcp): preserve chart form data on update #43679, and fix(mcp): render virtual-dataset Jinja by seeding g.form_data in chart compile + preview (#40570) #43711 were rechecked read-only at6fd8ab5a...,364f479c..., ande06be4f6.... No related branch/ref/file/commit was modified or cherry-picked. No comments/reviews, Shortcut/Agor mutations, contributor/community branches, or other PR bodies were touched. A fresh independent review follows; this update does not claim review-clean status.BEFORE/AFTER SCREENSHOTS OR ANIMATED GIF
Not applicable; this is MCP backend/schema/query support with no frontend UI change.
TESTING INSTRUCTIONS
Validated with SQLAlchemy
2.0.52at exact delivered headce32695a047c2635e604815b30cf39a0cb80158a.Adversarial and boundary coverage includes actual FastMCP dataset/semantic entry points where a real DataFrame →
ChartDataCommandsource envelope fits under 16 MiB but duplicated column samples push the projected response above 16 MiB; both return structuredInvalidQueryResultbefore transport. Real producer envelopes normalize exact pandasPeriodandIntervalto bounded canonical strings across the shared chart consumer plus dataset and semantic tools. SQL tests cover exact dict/list/string access, hostile mapping/list/string/error/exception subclasses, malformed entries, the shared query-count limit, aggregate source bytes, >64 KiB real SQL, multi-query prefixes, and the near-16 MiB response boundary. DataFrame tests prove object-column hostile equality and Enum equality hooks are not invoked while trusted builtin/NumPy nonfinites and pandas missing values retain their null contract.The full shared suite re-covers the exact 65,537-byte source-cell failure; SQL/query metadata above 64 KiB with independent 1 MiB metadata and 16 MiB response budgets;
[True, 1, False, 0] -> unique_count=4; date/timedelta/UUID accounting and exports; cycles; completeness; Jinja/cache/rebind order; strictnone_as_empty=False; finite Sunburst metrics; real envelopes; and chart/query parity. No branch-owned frontend files differ frommaster, so frontend-specific local tests are not applicable. The development health endpoint was unavailable; this is an environment limitation.Exact-head GitHub CI completed on
ce32695a047c2635e604815b30cf39a0cb80158a: all 13 required checks passed, including frontend build, pre-commit, lint, current unit tests, MySQL/PostgreSQL/SQLite integration, Presto/Hive, Cypress, Playwright, dependency review, and migration-head enforcement. The complete rollup was 62 successful, 9 skipped, 3 neutral, 2 failed, 0 pending. The only failures were the non-required Python and JavaScript CodeQL analysis jobs; both failed before analysis with the upstream workflow/version mismatchLoaded a configuration file for version '4.37.9', but running version '4.37.8'because mergedmasterpinscodeql-action/init4.37.9 whileanalyzeremains 4.37.8. This is CI infrastructure/configuration, not a code/test failure in this PR.Fresh post-merge Decimal and SQL-error validation
Validated with Python 3.11 and SQLAlchemy
2.0.52at exact delivered head781698ba7c660d561759aff6a22495cc55c3b89e:The producer-to-consumer coverage uses real DataFrames through
QueryContextProcessor.get_data()and realChartDataCommand.run()envelopes. It covers saved, SIMPLE, and SQL metric aliases; primary and secondary metrics; compile; saved/unsaved ASCII and table previews; saved/unsaved get-data; exact precision-preserving JSON projection; Decimal digit and positive/negative exponent boundaries; nonfinite/oversized Decimals; and strict rejection of numeric strings. SQL coverage includes a 16 MiB error-only source that would otherwise duplicate to about 32 MiB, 16 MiB + 1, realistic bounded and hostile oversized errors, every public final response branch, boundedInvalidQueryResultfallback, and a one-pass/no-recursion assertion. The full suites retain the prior dataset/semantic final preflight, Period/Interval, hostile SQL extraction, hook-free DataFrame projection, upstream tabular-query reconciliation, source/metadata/final budgets, bool/int/timedelta/scalar/timezone/cycle/profile/UUID/Jinja/cache/rebind/query parity, and strict Sunburstnone_as_empty=Falsecoverage.No branch-owned frontend file differs from the integrated upstream base. A local Sunburst Jest invocation could not start because this worktree has no
node_modules/cross-env; the exact-head requiredfrontend-buildGitHub job passed. The localhost health endpoint was also unavailable, so live/manual UI validation was not possible.Exact-head GitHub CI is complete: all 13 required checks passed. The full rollup is 58 successful, 9 skipped, 4 neutral, 2 failed, 0 pending. The two failures are non-required CodeQL Python/JavaScript jobs that exited before analysis with
Loaded a configuration file for version '4.37.9', but running version '4.37.8'. Upstream #43791 aligned the analyze action to4.37.9after this exact-head run; these failures are CI workflow infrastructure, not code-analysis findings from this change.Fresh strict get-data and exact-response validation
Validated with Python 3.11 and SQLAlchemy
2.0.52at exact delivered headbe228ec3f7aeed11756be345124eaffd6c47839b:Actual FastMCP entry coverage spans saved JSON, unsaved JSON/CSV, and identifier-plus-cached-update CSV/Excel paths. It proves numeric strings, booleans, malformed hierarchy values, and ambiguous aliases fail before export, while producer
Decimalprimary/secondary metrics reach the strict validator once with identity and precision intact. Response tests exercise exact 16 MiB and +1ChartErrorwires for UTCZ, naive timestamps, and bothZoneInfofold offsets; timestampedChartData; supported scalar projections; computed error duplication; and bounded serialization fallback. The full suites retain SQL error preflight, dataset/semantic response bounds, Period/Interval, hostile extraction, hook-free DataFrame projection, tabular-query semantics, scalar/timezone/timedelta/date/UUID/bool-int/cycle/profile/export/cache/Jinja/update/rebind/query parity, and strict Sunburstnone_as_empty=False.The local frontend dependency install could not start tests because this environment has Node 22/npm 10 while the checkout requires Node 24/npm 11, and the checked-in lock is missing
@noble/hashes@2.4.0; no tracked frontend file was modified. The exact-headfrontend-buildCI job passed. The configured localhost health endpoint was unavailable, so live UI smoke testing was not possible.Exact-head GitHub CI completed with all 13 required checks passing. At final verification, every completed exact-head check run was successful, skipped, or neutral, with 0 failed and 0 pending; frontend build, pre-commit/lint, current unit tests, MySQL/PostgreSQL/SQLite, Presto/Hive, Cypress/Playwright, dependency review, migration enforcement, Codecov, and both Python/JavaScript CodeQL analyses passed. The prior exact-head CodeQL 4.37.9/4.37.8 mismatch was separately confirmed as workflow infrastructure; upstream #43791 aligned the actions, and CodeQL is green on this delivered head.
Round 17 response preflight and Decimal cardinality
Round 17 started from the requested exact clean local/live head
be228ec3f7aeed11756be345124eaffd6c47839b, after confirming the independent review session was idle/completed and no same-branch fixer was running. The fixes were committed as68d77b4d575b3933e409a288074d979e7c25d143. Upstreammastere8540b7c49583a8ca89cfbcfd95a6a6e6a66a6edwas merged normally without conflict as8feda98d4760af0e4cd7a7baea13165193c6e352; after upstream advanced during validation,mastera81c0f677393656e61e436f5bd51d675b757df58was also merged normally without conflict as8b204b5cb5b0b7fca2db837eaec0a2cec4fe5aaf. A final upstream advance to52a4cb6314aea332f8061a7b3babd814cdebc33bwas reconciled in the same way, producing delivered head84dbac6dbea4387bd49045279d01b2ba99c8a2aa.A shared schema-preserving response finalizer now applies the exact 16 MiB Pydantic JSON-wire gate to every public success and error return from
generate_chart,update_chart,get_chart_preview, andupdate_chart_preview.GenerateChartResponsefailures remain in that schema,ChartPreviewfailures become boundedChartErrorvalues, and the legacy dict-shaped update-preview result is measured through an explicit PydanticRootModel. Coverage includes exact-limit acceptance and +1 rejection through actual FastMCP entry calls, serialization aliases, saved/unsaved and cached preview routing, nested previews, completeform_data, repeated/amplified payloads, and bounded structured fallbacks. Bullet PR #43770 was inspected read-only atc3c07fda; itsresponse_preflight.pyapproach informed comparison only, with semantics independently reconciled and no Bullet code or refs modified.The shared metadata identity builder now reduces trusted finite exact
Decimalvalues to bounded canonical rational tokens. Repeated and scale-equivalent Decimals coalesce correctly; exact integer and exactly equal binary-float values intentionally share the same numeric identity, while unequal exact values such asDecimal("0.1")and binary float0.1remain distinct. Digit/exponent work is capped and hostile Decimal subclasses remain opaque without invoking their hooks. Actual chart-data, dataset-query, and semantic-table producer/consumer tests assert the same cardinality behavior.Merged-head validation:
Local, tracking, Amin fork, and live PR heads were verified at
84dbac6dbea4387bd49045279d01b2ba99c8a2aa; GitHub reports the PR mergeable, with the review/protection gate as the only blocked state. The worktree is clean. No PR comments/reviews or other branch, Shortcut, or Agor mutations were made. A fresh independent review follows; this section does not claim review-clean.Round 18 Decimal non-finite producer validation
Validated with Python 3.11 and SQLAlchemy
2.0.52at exact delivered head28bbacacd0421f79913761c922b0428a9be52f23:The real producer/consumer paths prove quiet/signaling NaN and positive/negative Infinity become JSON
nullbefore strict serialization; high-precision finite Decimal identity survives producer validation and reaches the Pydantic wire unchanged; and a hostile Decimal subclass is neither classified nor coerced by DataFrame projection and fails closed at the bounded result-envelope boundary without hooks. The full suites retain exact final-response gates, Decimal value-semantic cardinality, strict Sunburst result validation, Pydantic-wire budgets, source/metadata bounds, saved/unsaved/cache/update/export/query/Jinja contracts, QueryContext/QueryObject/tabular behavior, and SQL Lab synchronous/asynchronous/view serialization.Exact-head GitHub CI has 12 of 13 required checks passing. The sole non-passing required check is the current Python unit-test aggregate: its test job was canceled by the workflow hard 30-minute limit on six attempts at roughly 90–91% completion, without a reported test failure, so the aggregate reports failure from
RESULT: cancelled. The full local MCP service suite passed. Every other required check passed—frontend build, pre-commit/lint, MySQL/PostgreSQL/SQLite, Presto/Hive, Cypress/Playwright, dependency review, and migration enforcement—and both Python/JavaScript CodeQL analyses passed. This timeout is reported explicitly rather than represented as green.Round 19 complete-return preflight and runtime validation
Validated with Python 3.11 and SQLAlchemy
2.0.52at exact delivered heada84a870101d09e32117185803e9b004f20974fcb:Actual
FastMCP Client.call_tooltests cover exact-limit preservation, +1 rejection, and dynamically amplified exception errors for all three public tools, including duplicatedmessage/errorschemas and timestamp projection. Existing success, cached-unsaved, dataset/semantic source validation, export, strict Sunburst, Decimal normalization/cardinality, query-result/source/metadata budgets, Jinja/tabular/cache/update/rebind/profiling contracts, SQL Lab serialization, and cross-chart suites remain covered.Exact-head GitHub CI completed with all 13 required checks passing. The current Python unit job finished in 24m19s: the main suite completed with 14,639 passed, 4 skipped, and 3 xfailed in 19m44s; the SQL gate completed with 1,487 passed, 1 xfailed and 100% coverage; the semantic-layer gate completed with 415 passed and 100% coverage; Codecov upload succeeded; and the required aggregate passed. Frontend build, pre-commit/lint, MySQL/PostgreSQL/SQLite, Presto/Hive, Cypress/Playwright, dependency review, migration enforcement, Codecov project/patch, and both Python/JavaScript CodeQL analyses also passed, with no failed or pending exact-head checks.
Round 20 uncaught producer exception boundary
Validated with Python 3.11 and SQLAlchemy
2.0.52at exact delivered head7d28f3a1c342140716a57407b685e23d115f6813:The initialized
FastMCP Client.call_toolcases inject oversizedRuntimeErrortext both before an awaitable is returned and from real helpers during producer execution. They validateChartError,DatasetError, andSemanticLayerError, theirInternalErrordiscriminator, structured content and compatibility aliases, sub-1-KiB Pydantic wire size, absence of dynamic/secret text from both wire output and the fixed log record, and exactly one finalizer call. Existing exact-limit/+1, success, known-error, cached/unsaved/export, strict Sunburst, Decimal/provenance/cardinality, DataFrame/timezone, query-result/source/metadata budgets, preview/generate/update, SQL/Jinja/tabular, cache/update/rebind, profiling, and cross-chart paths remain covered by the focused and full suites.Exact-head GitHub CI completed with all 13 required checks passing. The current Python unit job completed in 29m58s under the coordinated 40-minute workflow budget: the main suite completed with 14,648 passed, 4 skipped, and 3 xfailed in 24m55s; the SQL gate completed with 1,487 passed, 1 xfailed and 100% coverage; the semantic-layer gate completed with 415 passed and 100% coverage; Codecov upload and the required aggregate passed. Frontend build, pre-commit/lint, MySQL/PostgreSQL/SQLite, Presto/Hive, Cypress/Playwright, dependency review, migration enforcement, Codecov, and both Python/JavaScript CodeQL analyses passed; the exact-head rollup has no failed checks.
The configured localhost health endpoint was unavailable, so live UI smoke testing was not possible; no branch-owned frontend file changed, and exact-head frontend CI passed. Local, tracking, Amin-fork, and live PR heads match
7d28f3a1c342140716a57407b685e23d115f6813; GitHub reportsMERGEABLE, withBLOCKEDreflecting review/protection policy. The worktree is clean. A fresh independent review follows; this section does not claim review-clean.Round 21 hostile failure containment and dateutil fidelity
Round 21 started from the requested exact clean local/live head
7d28f3a1c342140716a57407b685e23d115f6813, after inspecting the Agor zones and confirming the completed independent reviewer was idle/archived and no same-branch fixer was running. The fix was committed and normally pushed as414c7a6e74832fde0e33ccd7972c99e3c9528afe.get_chart_data,query_dataset, and semanticget_tablenow delegate to one schema-specific containment/finalization boundary. Inner handling is limited to known domain exceptions and uses bounded exact primitive arguments rather than exception formatting. UnexpectedExceptionvalues reach the outer boundary, which emits a fixed, non-dynamic, traceback-free best-effort log record and a declaredChartError,DatasetError, orSemanticLayerErrorwithInternalError. The finalizer is invoked exactly once inside its own guard; logger or finalizer failure returns the static sub-1-KiB declared fallback directly without recursive finalization.CancelledError,KeyboardInterrupt,SystemExit, and otherBaseExceptionvalues continue to propagate. Initialized real FastMCP tests cover hostileValueError/RuntimeError, context-manager enter/exit failures, logger/finalizer failures, cached/unsaved and resolution stages, structured aliases, fixed logs, absence of secret text, zero hostile__str__/__repr__calls, and unchanged success/known-error behavior.Exact dateutil
tzfilevalues are no longer reinterpreted through the hostZoneInfodatabase. A shared bounded, hook-free transition-state reader validates exact transition containers, transition-record identities and fields, standard/before selection, UTC-to-wall consistency, ordering, offsets, and table limits, then mirrors dateutil's own fold/gap/post-final-transition selection while replacing the source timezone only with its selected fixed offset. Coverage includes Dublin negative-DST fold, New York spring gap, the 2040 post-final-transition case, historical transition boundaries, equivalent instants with distinct source offsets, system and packaged transitionless zones, invalid/mutated tables, and hostile timezone methods through the shared helper and real chart/dataset/semantic FastMCP producers. Clean Bullet PR #43770 was compared read-only at6d0041f459aa319dad115d033fbf7b4b284ff338; overlap PRs #43737, #43679, and #43711 were also compared at their live heads. Nothing was cherry-picked or modified outside Amin's branch.Exact delivered-head validation used Python 3.11 and SQLAlchemy
2.0.52:Exact-head GitHub CI completed with all 13 required checks passing and no failed or pending checks. The current Python unit job completed in 24m25s under the coordinated 40-minute budget: the main suite completed with 14,695 passed, 4 skipped, and 3 xfailed in 19m52s; the SQL gate completed with 1,487 passed, 1 xfailed and 100% coverage; the semantic-layer gate completed with 415 passed and 100% coverage; Codecov upload and the required aggregate passed. Frontend build, pre-commit/lint, MySQL/PostgreSQL/SQLite, Presto/Hive, Cypress/Playwright, dependency review, migration enforcement, and Python/JavaScript CodeQL passed.
Current upstream
master4a18556fdc0badac4a82857c06c153623b776480is already an ancestor of the delivered head; the read-only merge-tree completed without conflict and GitHub reportsMERGEABLE(BLOCKEDonly by review/protection policy). Local, tracking, Amin-fork, and live PR heads match414c7a6e74832fde0e33ccd7972c99e3c9528afe, and the worktree is clean. No PR comments/reviews or other branch, Shortcut, or Agor mutations were made. A fresh independent review follows; this section does not claim review-clean.Round 22 frontend ColumnMeta compatibility
Validated with Python 3.11 and SQLAlchemy
2.0.52at exact delivered headcc77c468e94940d8711bdb2d2650e2eb475da8db:Coverage includes complete and reduced frontend metric shapes;
column_name/columnNameand optionaltype; unknown forward-compatible nested metadata; top-level and owned-field typos; oversized/deep mappings, lists, keys, strings, aggregate values, and integers; non-finite floats; hostile dict/string/value subclasses with zero hook calls; saved and SQL metric behavior; native round-trip; direct preview/save/update product paths; and a realFastMCP Client.call_toolExplore-link path. The full suites retain the Round-21 containment/finalizer/dateutil contract, strict Sunburst result and Decimal behavior, exact response/source/metadata budgets, DataFrame, SQL/Jinja/tabular, cache, provenance, rebind/update, and cross-chart behavior.No branch-owned frontend file changed. Local frontend dependencies are absent, and the checkout requires Node 24/npm 11 while the environment provides Node 22/npm 10, so frontend execution is an environment limitation; exact-head frontend CI is used for that validation. Exact-head GitHub CI completed with all 13 required checks passing and no failed or pending checks. The current Python unit job completed in 30m20s under the coordinated 40-minute budget: the main suite completed with 14,726 passed, 4 skipped, and 3 xfailed in 25m23s; the SQL gate completed with 1,487 passed, 1 xfailed and 100% coverage; the semantic-layer gate completed with 415 passed and 100% coverage; Codecov upload and the required aggregator passed. Frontend build, pre-commit/lint, MySQL/PostgreSQL/SQLite, Presto/Hive, Cypress/Playwright, dependency review, migration enforcement, and Codecov project/patch checks passed. Python and JavaScript CodeQL analyses passed separately.
Round 23 native metric wrapper hardening
Round 23 started from the requested exact clean local/tracking/fork/PR head
cc77c468e94940d8711bdb2d2650e2eb475da8db. Read-only Agor session/board/zone inspection confirmed the completed independent reviewer was idle/archived and no same-PR/head fixer or reviewer was modifying the branch. Delivery consists of normal-pushed commitsc14684d8ece58f110c22092cfc3188264788090c,4a6990264829e2e468eaf7d4a2ea9f3101b57887,f4635a6309f6de297a6fc2672d50ccdf9804beb6, and final head506c5cb2f1af779250a71ed002882d0a5c334c94.The Sunburst native-metric discriminator now inspects only exact built-in dictionaries through built-in operations, bounds the wrapper before scanning, requires exact bounded string keys, and requires an exact built-in
expressionTypebefore comparing it against the closedSIMPLE/SQLset. Closed top-level metric fields and bounded values remain strict, while canonical typedColumnRefinput remains accepted. Hostile dictionary/string subclasses are removed from both working and original Pydantic inputs before a validation error can render them, so registered FastMCP validation and version-specific error wrapping cannot execute__hash__,__eq__,__str__,__repr__, mapping, or iteration hooks.SunburstNativeMetricColumnstill accepts its bounded open-ended frontend metadata, but when both owned aliases are present it requires exact strings with identical values; either alias alone remains valid.Validated with Python 3.11, SQLAlchemy
2.0.52, and the CI-minimum FastMCP3.4.7at exact delivered head:Coverage includes direct models,
model_validate_json, Generate/Update/Explore-link schemas, native preview/save/update round-trips inherited from the focused matrix, and real registered FastMCP calls for complete frontend metadata, equal/conflicting/malformed dual aliases, missing/malformed expression types, valid SIMPLE/SQL forms, hostile keys and values, rendered validation errors, and zero hostile hook calls. The full MCP and broad producer/consumer suites retain the strict Sunburst hierarchy/finite/Decimal contracts, exact response finalization and budgets, DataFrame/pandas/NumPy/dateutil handling, saved/unsaved/cache/update-preview/export paths, SQL/Jinja/tabular semantics, provenance, rebind/update, and cross-chart behavior.Exact-head CI completed with all 13 required checks passing. The Python unit workflow completed successfully in 34m02s under the 40-minute budget: the main suite reported 14,765 passed, 4 skipped, 3 xfailed in 26m49s; the SQL gate reported 1,487 passed, 1 xfailed with 100% coverage; the semantic-layer gate reported 415 passed with 100% coverage; Codecov upload and the required aggregator passed. Frontend build, pre-commit/lint, MySQL/PostgreSQL/SQLite, Presto/Hive, Cypress/Playwright, dependency review, and migration enforcement passed. Python and JavaScript CodeQL analyses and Codecov project/patch checks passed separately. Two superseded intermediate heads exposed FastMCP 3.4.2/3.4.7 exception-wrapping and error-rendering differences; the delivered exact head includes the bounded, hook-free reconciliation and its CI is green.
Current
masterbf12a21367ca10f6f29e553b3245f7d888d543f5is one unrelated chart-list sorting commit ahead of the merge base; a read-only merge-tree is conflict-free, so no upstream merge was needed. #43770 at6d0041f459aa319dad115d033fbf7b4b284ff338, #43737 at6fd8ab5a13fa7481fd5b083544f74abf90e08ddc, #43679 at364f479c810f815bac51a8bee0a33a53c880bf54, and #43711 ate06be4f694a091bbc93af23fad69fd2e23c587e9were compared read-only; no ref, branch, file, commit, comment, review, or metadata for them was changed. GitHub reports PR #43771MERGEABLE(BLOCKEDonly by review/protection policy). Local, tracking, Amin-fork, and PR heads match506c5cb2f1af779250a71ed002882d0a5c334c94, and the worktree is clean. No Shortcut or Agor mutation was made. A fresh independent review follows; this section does not claim review-clean.Round 24 retained-input sanitization
Round 24 started from the requested exact clean local/tracking/fork/PR head
506c5cb2f1af779250a71ed002882d0a5c334c94. Read-only Agor session, branch, board, and zone inspection confirmed the completed independent reviewer was idle/archived and no same-PR/head fixer or reviewer was modifying the branch. Delivery consists of normal-pushed commits4bed954a5a14a2e66f69813090d24312d20a0973,003f18d5e634921cde5b3a875ec4e2c641c8b4ab, and final head05c9abcaa8a91c636b309f85bd0db29f4a7a0188.Rejected Sunburst native-metric subtrees are now recursively projected through exact built-in
dict/list/scalar operations before any schema error is raised. Hook-bearing keys, string/scalar subclasses, mapping/list/dict subclasses, malformed expression discriminators and boolean controls, and hostile nested open ColumnMeta values are replaced in both the working input and the original input Pydantic retains. The traversal is depth/count/container/string/key/integer bounded, cycle-safe, and never consumes or renders non-exact containers. Normal JSON objects, exact SIMPLE/SQL wrappers, typed/saved metrics, all metric aliases, full forward-compatible frontend ColumnMeta, and the exact accepted key/string boundaries remain unchanged.Validated with Python 3.11, SQLAlchemy
2.0.52, and the supported FastMCP validation variants at exact delivered head:Adversarial coverage exercises direct Pydantic
model_validate/model_validate_json, Generate/Update/Explore-link request schemas, every native metric alias/path, registered FastMCP dispatch, andstr,repr, anderrors()rendering where the validation implementation exposes that method. It covers hostile subclasses inlabel,aggregate,sqlExpression,optionName,expressionType, custom boolean fields, column wrappers, nested ColumnMeta containers/scalars/keys, arbitrary mappings/lists/dicts, cycles and bounds, with zero hostile hook calls and bounded rendered errors. The complete suites retain all earlier strict Sunburst hierarchy/finite/Decimal, response budget/finalizer, exception containment, DataFrame/pandas/NumPy/dateutil, cache/update-preview/export, SQL/Jinja/tabular, provenance/rebind/update, and cross-chart contracts.Exact-head GitHub CI completed with all 13 required checks passing and no failed or pending checks. The Python unit workflow completed successfully in 26m55s under the 40-minute budget: the main suite reported 14,778 passed, 4 skipped, and 3 xfailed in 22m21s; the SQL gate reported 1,487 passed, 1 xfailed with 100% coverage; the semantic-layer gate reported 415 passed with 100% coverage; Codecov upload and the required aggregator passed. Frontend build, pre-commit/lint, MySQL/PostgreSQL/SQLite, Presto/Hive, Cypress/Playwright, dependency review, and migration enforcement passed. Python and JavaScript CodeQL analyses and Codecov project/patch checks passed separately. A superseded intermediate head exposed a FastMCP-version difference where the wrapped validation exception lacks Pydantic's
errors()method; the final compatibility assertion preserves full Pydanticerrors()coverage and validates boundedstr/reprrendering for either registered FastMCP exception form.Current upstream
mastera95c40aa1e4d46d558c69160255350f4aa04578eis nine unrelated commits ahead of the merge base; the read-only merge-tree is conflict-free, so no upstream merge was needed. #43770 at6d0041f459aa319dad115d033fbf7b4b284ff338, #43737 at6fd8ab5a13fa7481fd5b083544f74abf90e08ddc, #43679 at364f479c810f815bac51a8bee0a33a53c880bf54, and #43711 ate06be4f694a091bbc93af23fad69fd2e23c587e9were inspected read-only; no ref, branch, file, commit, comment, review, or metadata for them was changed. GitHub reports PR #43771MERGEABLE(BLOCKEDonly by review/protection policy). Local, tracking, Amin-fork, and PR heads match05c9abcaa8a91c636b309f85bd0db29f4a7a0188, and the worktree is clean. No Shortcut or Agor mutation was made. A fresh independent review follows; this section does not claim review-clean.Finite reviewer-comment resolution pass
This pass started from the requested exact clean local/tracking/fork/PR head
05c9abcaa8a91c636b309f85bd0db29f4a7a0188. Read-only Agor session/branch/board/zone inspection found no other active same-branch writer. Delivery uses normal-pushed fix commits27f6a119and1990cb97plus conflict-free upstream merge commit5306ee42; currentmasterd2d965e0is incorporated. Bullet PR #43770 was inspected read-only at6d0041f459aa319dad115d033fbf7b4b284ff338; it was not modified or cherry-picked. Final head is1990cb976da6c1029645713f874184499f9be5c3.The human Sunburst feedback is implemented: a semantically identical primary/secondary metric pair is accepted for saved, SIMPLE, and SQL metrics, while hierarchy collisions and different metrics sharing an output alias remain rejected. Result-role validation collapses that repeated physical output to the frontend's categorical-color fallback without weakening strict finite numeric validation. The pass also fixes exact ordinary
simplejson.JSONDecodeErrorfallback without accepting hostile exception subclasses; canonical metadata identity for bool/int, reordered JSON objects, and bounded Decimal/int equivalence; genericdata: nullcompatibility while retaining Sunburstnone_as_empty=False; duplicate frontend column labels; stale malformed ordering, legacy WHERE normalization, Deck numeric fixed-radius handling, inherited Table offsets, preview/result depth parity, requested Sunburst ASCII dimensions, post-merge Sunburst filter validation, response-alias boundary test parity, and the SQL response-boundary test. Existing current-code regressions cover SQLhasCustomLabel=false, cross-viz cached role scrubbing, temporal-control/filter clearing, full open frontend ColumnMeta, and hook-free hostile input rendering.Exact-head local validation:
Focused registered FastMCP/model tests cover repeated-metric fallback and invalid cached JSON. The full matrix also covers exact response budgets/finalizers, fixed exception containment, hostile native-metric sanitization, strict Sunburst saved/unsaved/cache/preview/export data, Decimal/DataFrame/pandas/NumPy/dateutil behavior, SQL/Jinja/tabular semantics, provenance, rebind, and update flows. The repository's frontend dependencies are not materialized in this worktree (
cross-env: not found), so the local Sunburst Jest command could not start; exact-head CI frontend build, Cypress, and Playwright jobs passed.Every one of the seven live unresolved review threads received an individual evidence reply and was resolved; the older already-resolved ColumnMeta thread remains resolved. No blanket resolve, approval, review submission, or new reviewer loop was used. Exact-head CI completed with all 13 required checks passing, 0 failed named checks, and no pending named checks. The Python workflow completed in 25m07s: the main suite reported 14,801 passed, 4 skipped, 3 xfailed in 20m28s; SQL reported 1,487 passed, 1 xfailed with 100% coverage; semantic layers reported 415 passed with 100% coverage; Codecov upload and required aggregator passed. Frontend build, pre-commit/lint, MySQL/PostgreSQL/SQLite, Presto/Hive, Cypress/Playwright, dependency review, migration enforcement, CodeQL, and Codecov project/patch checks passed. GitHub reports
MERGEABLE(BLOCKEDonly by normal review/protection policy). Local, tracking, Amin-fork, and live PR heads match the final head, and the worktree is clean.ADDITIONAL INFORMATION