🪄 Flint is a visualization language that lets AI agents reliably create expressive, good-looking charts from simple, human-editable chart specs.
This report summarizes scanner evidence for microsoft/flint-chart, a TypeScript project with 4,520 GitHub stars. SynthScan examined 2,410,604 lines of code across 3780 source files, recording 1055 pattern matches distributed across 16 syntactic categories. The legacy adjusted pattern signal is 0.9 (Low pattern signal); it is not an authorship estimate.
Use the findings to ask whether maintainers can explain intent, verify dependencies, simplify unnecessary scaffolding, and focus review effort. Risk Payload v1 adds ownership, supply-chain, over-engineering, and review-effort vectors when available. These are prompts for human verification, not probabilities, security findings, or measured maintenance costs.
Use each vector to guide manual verification of the underlying findings.
Payload schema: 1.0.0 · Engine: 2.0.0 · Scoring: heuristic-density-v1 · Scan date: 2026-10-31.
Can maintainers explain intent, assumptions, and trade-offs? 483 finding(s).
Are imports declared and package/API names verified? 91 finding(s).
Are wrappers, guards, and repeated structures necessary? 821 finding(s).
Which changes need focused human review? 1055 finding(s).
This chart tracks the legacy adjusted pattern score across scan runs. Changes can reflect source changes, scan coverage, or detector/scoring versions; they do not measure AI adoption or prove that a team refactored code. Compare runs only when their scoring versions are compatible. The dashed line tracks the raw pattern-hit count.
Groups findings by configured severity weight. Severity is not a confidence estimate, security rating, or proof that a package is missing. Verify imports against the project's manifests and inspect each finding in its local design context.
This horizontal bar chart shows where configured pattern scores accumulate across directories. Treat the bars as locations to inspect, not as evidence of authorship or code quality. Use the file-level findings to decide whether a directory needs a focused ownership, dependency, complexity, or review check.
The scanner identified 1055 distinct pattern matches across 16 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a detector match to inspect in context. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.
Reading the findings table: The Severity column indicates the configured finding weight (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — legacy comment-context matches receive a ×1.5 score weight. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier under the legacy scoring model.
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | packages/flint-py/tools/run_full_eval.py | 133 | # ─── Report ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/flint-py/tools/run_full_eval.py | 160 | # ─── Executive summary ──────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/flint-py/tools/run_full_eval.py | 191 | # ─── Methodology ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/flint-py/tools/run_full_eval.py | 225 | # ─── Breakdown tables ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/flint-py/tools/run_full_eval.py | 262 | # ─── Gap analysis ────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/flint-py/tools/run_full_eval.py | 284 | # ─── MISMATCH detail (should be empty now) ───────────────────────────── | COMMENT |
| MEDIUM | packages/flint-py/tools/run_full_eval.py | 298 | # ─── JS_ERROR detail ────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/flint-py/tools/run_full_eval.py | 312 | # ─── Notes on key compatibility fixes applied during this port ──────── | COMMENT |
| MEDIUM | …flint-py/tests/unit/test_chart_option_applicability.py | 19 | # ── stackMode ─────────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …flint-py/tests/unit/test_chart_option_applicability.py | 77 | # ── independentYAxis ──────────────────────────────────────────────────────── | COMMENT |
| MEDIUM | …flint-py/tests/unit/test_chart_option_applicability.py | 111 | # ── showPercent ───────────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | …flint-py/tests/unit/test_chart_option_applicability.py | 142 | # ── xAxisType / yAxisType ─────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/flint-py/tests/unit/test_sort_action.py | 12 | # ── get — derive control value from base encodings ───────────────────────── | COMMENT |
| MEDIUM⚡ | packages/flint-py/tests/unit/test_sort_action.py | 67 | # ── isApplicable — type-aware visibility gate ────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/flint-py/tests/unit/test_sort_action.py | 87 | # ── set — compose the override onto the category channel ────────────────── | COMMENT |
| MEDIUM⚡ | packages/flint-py/tests/unit/test_sort_action.py | 127 | # ── end-to-end: override composed by the compiler ───────────────────────── | COMMENT |
| MEDIUM⚡ | packages/flint-py/tests/unit/test_zero_baseline.py | 68 | # ── offer eligibility ─────────────────────────────────────────────────────── | COMMENT |
| MEDIUM⚡ | packages/flint-py/tests/unit/test_zero_baseline.py | 131 | # ── override propagation ──────────────────────────────────────────────────── | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 227 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 229 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 298 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 300 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 324 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 326 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 347 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 349 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 386 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/decisions.py | 388 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/decisions.py | 400 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/decisions.py | 402 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 208 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 210 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 222 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 224 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 235 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 237 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 268 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 270 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 403 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 405 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 413 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 415 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 495 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 497 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 533 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 535 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 543 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM⚡ | packages/flint-py/flint/core/field_semantics.py | 545 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 16 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 18 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 42 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 44 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 164 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 166 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 356 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 358 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 385 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 387 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 435 | # --------------------------------------------------------------------------- | COMMENT |
| MEDIUM | packages/flint-py/flint/core/field_semantics.py | 437 | # --------------------------------------------------------------------------- | COMMENT |
| 396 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | scripts/gen-chart-reference.ts | 536 | function renderInteractionSupportTable(locale: 'en' | 'zh-CN'): string { | CODE |
| LOW | packages/flint-py/tests/test_fixtures.py | 104 | def test_fixture_matches_js_reference(slug: str, path: Path, assemble_vegalite) -> None: | CODE |
| LOW | …flint-py/tests/unit/test_chart_option_applicability.py | 27 | def test_stack_mode_applicable_when_color_bound(): | CODE |
| LOW | …flint-py/tests/unit/test_chart_option_applicability.py | 40 | def test_stack_mode_not_applicable_without_color_channel(): | CODE |
| LOW⚡ | …flint-py/tests/unit/test_chart_option_applicability.py | 71 | def test_area_opacity_only_applicable_for_layered_multi_series(): | CODE |
| LOW⚡ | …flint-py/tests/unit/test_chart_option_applicability.py | 85 | def test_independent_y_axis_applicable_when_faceted(): | CODE |
| LOW | …flint-py/tests/unit/test_chart_option_applicability.py | 98 | def test_independent_y_axis_not_applicable_when_not_faceted(): | CODE |
| LOW⚡ | …flint-py/tests/unit/test_chart_option_applicability.py | 125 | def test_show_percent_applicable_for_additive_single_sign_measure(): | CODE |
| LOW⚡ | …flint-py/tests/unit/test_chart_option_applicability.py | 133 | def test_show_percent_not_applicable_for_mixed_sign_measure(): | CODE |
| LOW⚡ | …flint-py/tests/unit/test_chart_option_applicability.py | 166 | def test_x_axis_type_applicable_for_date_like_x_with_modest_distinct(): | CODE |
| LOW⚡ | …flint-py/tests/unit/test_chart_option_applicability.py | 171 | def test_x_axis_type_forces_discrete_nominal_when_user_picks_nominal(): | CODE |
| LOW⚡ | …flint-py/tests/unit/test_chart_option_applicability.py | 177 | def test_x_axis_type_not_applicable_for_plain_categorical_x(): | CODE |
| LOW | …flint-py/tests/unit/test_chart_option_applicability.py | 191 | def test_y_axis_type_offered_for_date_like_temporal_y(): | CODE |
| LOW | …flint-py/tests/unit/test_chart_option_applicability.py | 204 | def test_y_axis_type_forces_discrete_nominal_when_user_picks_nominal(): | CODE |
| LOW | packages/flint-py/tests/unit/test_bar_table_facet.py | 25 | def test_hoists_column_facets_around_hconcat_bar_table_and_wraps(): | CODE |
| LOW | packages/flint-py/tests/unit/test_bar_table_facet.py | 59 | def test_rolls_rows_up_within_each_facet_without_undefined_facet(): | CODE |
| LOW | packages/flint-py/tests/unit/test_bar_table_facet.py | 95 | def test_computes_percentage_totals_within_each_facet(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_encoding_shorthand.py | 19 | def test_coerce_expands_bare_string(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_encoding_shorthand.py | 23 | def test_coerce_expands_strings_in_list(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_encoding_shorthand.py | 30 | def test_coerce_passes_through_objects(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_encoding_shorthand.py | 37 | def test_normalize_mixes_shorthand_and_full(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_encoding_shorthand.py | 43 | def test_shorthand_spec_matches_explicit_spec(): | CODE |
| LOW | …ges/flint-py/tests/unit/test_closed_domain_stacking.py | 9 | def test_drops_intrinsic_clamp_when_color_series_stacks_past_bound(): | CODE |
| LOW | …ges/flint-py/tests/unit/test_closed_domain_stacking.py | 30 | def test_drops_intrinsic_clamp_when_repeated_categories_stack_without_color(): | CODE |
| LOW | …ges/flint-py/tests/unit/test_closed_domain_stacking.py | 50 | def test_detects_overflow_on_negative_side_even_when_signed_totals_cancel(): | CODE |
| LOW | …ges/flint-py/tests/unit/test_closed_domain_stacking.py | 71 | def test_keeps_intrinsic_domain_for_non_stacking_chart(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 14 | def test_get_returns_none_when_no_sort_is_set(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 19 | def test_get_reads_value_sort_referencing_measure_channel(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 27 | def test_get_treats_bare_label_sort_as_default(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 35 | def test_get_treats_unrepresentable_sorts_as_default(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 43 | def test_get_detects_horizontal_orientation(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 51 | def test_get_returns_none_when_category_axis_is_temporal(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 59 | def test_get_returns_none_when_both_axes_are_quantitative(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 69 | def test_is_applicable_when_discrete_category_and_measure_pair_exists(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 74 | def test_is_not_applicable_for_temporal_x_time_series(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 82 | def test_is_not_applicable_when_no_measure_axis_exists(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 92 | def test_set_value_desc_writes_sortby_measure_descending(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 98 | def test_set_default_clears_both_sort_fields(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 105 | def test_set_does_not_mutate_input_encodings(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 110 | def test_set_targets_category_channel_under_horizontal_orientation(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_sort_action.py | 118 | def test_set_is_noop_when_no_discrete_category_axis(): | CODE |
| LOW | packages/flint-py/tests/unit/test_sort_action.py | 138 | def test_value_desc_override_sorts_bar_x_axis_by_measure(): | CODE |
| LOW | packages/flint-py/tests/unit/test_sort_action.py | 152 | def test_no_override_leaves_template_default_ordering(): | CODE |
| LOW | packages/flint-py/tests/unit/test_sort_action.py | 165 | def test_value_desc_applies_when_measure_type_is_auto(): | CODE |
| LOW | packages/flint-py/tests/unit/test_sort_action.py | 179 | def test_value_desc_overrides_field_intrinsic_ordinal_ordering(): | CODE |
| LOW | packages/flint-py/tests/unit/test_log_scale.py | 36 | def test_offers_log_x_on_wide_range_axis(): | CODE |
| LOW | packages/flint-py/tests/unit/test_log_scale.py | 41 | def test_does_not_offer_log_on_narrow_axis(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_log_scale.py | 55 | def test_unset_follows_engine_recommendation_log(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_log_scale.py | 62 | def test_false_override_forces_linear_axis(): | CODE |
| LOW⚡ | packages/flint-py/tests/unit/test_log_scale.py | 68 | def test_true_forces_log_axis_when_not_recommended(): | CODE |
| LOW | packages/flint-py/tests/unit/test_log_scale.py | 94 | def test_symlog_for_true_toggle_with_zeros_in_data(): | CODE |
| LOW | packages/flint-py/tests/unit/test_log_scale.py | 109 | def test_never_offers_log_on_bar_chart(): | CODE |
| LOW | packages/flint-py/tests/unit/test_log_scale.py | 123 | def test_offers_log_only_on_value_axis_of_line_chart(): | CODE |
| LOW | packages/flint-py/tests/unit/test_log_scale.py | 142 | def test_get_chart_options_matches_rendered_spec_options(): | CODE |
| LOW | packages/flint-py/tests/unit/test_filter_overflow.py | 36 | def test_preserves_encounter_order_when_no_sort_is_selected(): | CODE |
| LOW | packages/flint-py/tests/unit/test_filter_overflow.py | 47 | def test_uses_canonical_semantic_order_when_available(): | CODE |
| LOW | packages/flint-py/tests/unit/test_filter_overflow.py | 62 | def test_uses_selected_value_sort(): | CODE |
| LOW | packages/flint-py/tests/unit/test_banded_label_angle.py | 9 | def test_rotates_many_wide_numeric_labels_on_banded_ordinal_x_axis(): | CODE |
| LOW | packages/flint-py/tests/unit/test_banded_label_angle.py | 23 | def test_keeps_few_short_numeric_labels_horizontal(): | CODE |
| LOW | packages/flint-py/tests/unit/test_banded_label_angle.py | 41 | def test_continuous_quantitative_x_axis_left_to_vl_overlap_handling(): | CODE |
| 280 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| CRITICAL | packages/flint-mcp/tests/board.test.ts | 127 | expect(again._meta.flint.board.charts.map((chart: any) => chart.id)).toEqual(['countries', 'by-country']); | CODE |
| CRITICAL | packages/flint-mcp/tests/board.test.ts | 200 | expect(shown._meta.flint.board.charts.map((chart: any) => chart.view)).toEqual([undefined, 'table']); | CODE |
| CRITICAL | packages/flint-js/tests/plan-honour.test.ts | 49 | if (node.encoding?.y?.axis?.values) node.encoding.y.axis.values = node.encoding.y.axis.values.slice(1); | CODE |
| CRITICAL | packages/flint-js/tests/smoke.test.ts | 956 | const expectedOrder = vegaLite.encoding.y.scale.domain.filter((value: string) => | CODE |
| CRITICAL | packages/flint-js/tests/theme-legend-rows.test.ts | 400 | expect(narrow.encoding.color.legend.title.join(' ')).toBe('Olympic delegations by country'); | CODE |
| CRITICAL | packages/flint-js/tests/theme-legend-rows.test.ts | 653 | expect(spec.encoding.color.legend.title.join(' ')).toBe(title); | CODE |
| CRITICAL | packages/flint-js/tests/temporal-parse.test.ts | 99 | const tick = cj.options.scales.x.ticks.callback(Date.UTC(2025, 0, 1)); | CODE |
| CRITICAL | packages/flint-js/tests/lane-tooltips.test.ts | 39 | const label = config.options.plugins.tooltip.callbacks.label({ dataset, dataIndex: index, formattedValue: '42', | CODE |
| CRITICAL | packages/flint-js/tests/vegalite-format.test.ts | 196 | expect(items.map(item => Number(item.datum.value))).toEqual(spec.encoding.x.axis.values.map((value: string) | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/flint-mcp/ui/src/ChartView.tsx | 641 | COMMENT | |
| LOW | packages/flint-mcp/ui/src/render.ts | 161 | // relies on them (e.g. the Bar Table's `datasets.__bt_displayTable` and | COMMENT |
| LOW | packages/flint-py/flint/vegalite/assemble.py | 121 | size_ceiling = chart_spec.get("canvasSize") | COMMENT |
| LOW | packages/flint-py/flint/vegalite/assemble.py | 521 | # agent, another renderer) reads to know which controls to surface and how | COMMENT |
| LOW | …kages/flint-py/flint/vegalite/templates/candlestick.py | 61 | "value": "#ae1325", | COMMENT |
| LOW | packages/flint-js/src/core/analyze.ts | 61 | // Detect array-valued encodings (static series), validate, and fold data. | COMMENT |
| LOW | packages/flint-js/src/core/analyze.ts | 81 | // that, e.g., a value-sort correctly suppresses the field's canonical | COMMENT |
| LOW | packages/flint-js/src/core/analyze.ts | 101 | if ((choice === 'temporal' || choice === 'nominal') && typedRawEncodings[axis]?.field) { | COMMENT |
| LOW | packages/flint-js/src/core/compute-layout.ts | 921 | } | COMMENT |
| LOW | packages/flint-js/src/core/compute-layout.ts | 1381 | // --- Square cells --- | COMMENT |
| LOW | packages/flint-js/src/core/compute-layout.ts | 1461 | } | COMMENT |
| LOW | packages/flint-js/src/core/compute-layout.ts | 1521 | COMMENT | |
| LOW | packages/flint-js/src/core/compute-layout.ts | 1981 | // For median |display_slope| = 1: H/W = 1/median(|s_norm|), | COMMENT |
| LOW | packages/flint-js/src/core/compute-layout.ts | 2081 | COMMENT | |
| LOW | packages/flint-js/src/core/semantic-types.ts | 221 | // The typeHierarchy map and its helper functions (getParentType, | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 241 | // An editorial house takes the value axis away — no spine, no ruler — so | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 661 | return true; | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 681 | // mark itself is the value; a lone number stamped on it would name one of four | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1101 | const orient = axisOrient(channel, spec?.placement, channel === indexChannel); | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1141 | // `whenAmbiguous` is a question about the field: `Jan Feb Mar` needs | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1281 | // Which placements grounding can offer at all. `inline` needs a label | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1381 | // colour is the reason the number is worth printing, not a reason to | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1421 | ? 'the mark carries several measures at once — there is no single value to print, and the measure ax | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1481 | ? measureValueLabels([1], { format: '.0%', text: valueLabel }) | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1501 | // — not the band. A single series keeps the whole band and can lean a | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1521 | const stacked = ctx.stacked || ctx.positional?.stacked; | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1821 | COMMENT | |
| LOW | packages/flint-js/src/core/theme/ground.ts | 1941 | // undeclared house gets the same quiet structural grey a declared | COMMENT |
| LOW | packages/flint-js/src/core/theme/ground.ts | 2041 | // the world, because there is no boundary to see. | COMMENT |
| LOW | packages/flint-js/src/core/theme/value-label-format.ts | 141 | // the house wrote it. | COMMENT |
| LOW | packages/flint-js/src/core/theme/value-label-format.ts | 181 | COMMENT | |
| LOW | …ages/flint-js/src/test-data/line-area-stretch-tests.ts | 381 | // ----------------------------------------------------------------------- | COMMENT |
| LOW | packages/flint-js/src/test-data/area-tests.ts | 1 | // Copyright (c) Microsoft Corporation. | COMMENT |
| LOW | packages/flint-js/src/test-data/area-tests.ts | 61 | COMMENT | |
| LOW | packages/flint-js/src/test-data/area-tests.ts | 81 | // Excluded: T×T, Q×T — date-pair data doesn't suit area charts. | COMMENT |
| LOW | packages/flint-js/src/test-data/scatter-tests.ts | 1 | // Copyright (c) Microsoft Corporation. | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 121 | // Semantic type: { semanticType: "Rating", intrinsicDomain: [1, 5] } | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 161 | rating: { semanticType: 'Score', intrinsicDomain: [1, 5] }, | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 221 | // AND the semantic type is in the allow-list (Population, GDP, etc.) | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 321 | }; | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 421 | // | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 501 | revenue: { semanticType: 'Amount', unit: 'USD' }, | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 641 | genPriceEurCurrencyTest(), | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 741 | COMMENT | |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 781 | }, | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 881 | y: makeEncodingItem('ytd_change'), | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 921 | }, | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1061 | }; | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1161 | }, | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1221 | // Semantic type: "Duration" + unit: "min" → "42 min" on axis | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1261 | x: makeEncodingItem('task'), | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1321 | } | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1361 | }, | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1461 | }, | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1561 | COMMENT | |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1601 | encodingMap: { | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1701 | }, | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1761 | // ============================================================================ | COMMENT |
| LOW | packages/flint-js/src/test-data/semantic-tests.ts | 1861 | } | COMMENT |
| LOW | packages/flint-js/src/test-data/bar-tests.ts | 1 | // Copyright (c) Microsoft Corporation. | COMMENT |
| 36 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/flint-py/tools/build_results_page.py | 19 | CODE | |
| LOW | packages/flint-py/tools/run_full_eval.py | 11 | CODE | |
| LOW | packages/flint-py/tools/run_full_eval.py | 15 | CODE | |
| LOW | packages/flint-py/tests/test_fixtures.py | 8 | CODE | |
| LOW | …flint-py/tests/unit/test_chart_option_applicability.py | 2 | CODE | |
| LOW | packages/flint-py/tests/unit/test_bar_table_facet.py | 6 | CODE | |
| LOW | packages/flint-py/tests/unit/test_encoding_shorthand.py | 2 | CODE | |
| LOW | …ges/flint-py/tests/unit/test_closed_domain_stacking.py | 2 | CODE | |
| LOW | packages/flint-py/tests/unit/test_sort_action.py | 2 | CODE | |
| LOW | packages/flint-py/tests/unit/test_log_scale.py | 2 | CODE | |
| LOW | packages/flint-py/tests/unit/test_filter_overflow.py | 1 | CODE | |
| LOW | packages/flint-py/tests/unit/test_banded_label_angle.py | 2 | CODE | |
| LOW | packages/flint-py/tests/unit/test_zero_baseline.py | 2 | CODE | |
| LOW | packages/flint-py/tests/unit/test_axis_format.py | 2 | CODE | |
| LOW | packages/flint-py/flint/core/filter_overflow.py | 3 | CODE | |
| LOW | packages/flint-py/flint/core/decisions.py | 3 | CODE | |
| LOW | packages/flint-py/flint/core/types.py | 7 | CODE | |
| LOW | packages/flint-py/flint/core/field_semantics.py | 3 | CODE | |
| LOW | packages/flint-py/flint/core/type_registry.py | 7 | CODE | |
| LOW | packages/flint-py/flint/core/encoding_overrides.py | 7 | CODE | |
| LOW | packages/flint-py/flint/core/semantic_types.py | 3 | CODE | |
| LOW | packages/flint-py/flint/core/semantic_types.py | 8 | CODE | |
| LOW | packages/flint-py/flint/core/compute_layout.py | 3 | CODE | |
| LOW | packages/flint-py/flint/core/compute_layout.py | 6 | CODE | |
| LOW | packages/flint-py/flint/core/compute_layout.py | 7 | CODE | |
| LOW | packages/flint-py/flint/core/compute_layout.py | 7 | CODE | |
| LOW | packages/flint-py/flint/core/encoding_actions.py | 9 | CODE | |
| LOW | packages/flint-py/flint/core/color_decisions.py | 3 | CODE | |
| LOW | packages/flint-py/flint/core/js_date.py | 33 | CODE | |
| LOW | packages/flint-py/flint/core/resolve_semantics.py | 3 | CODE | |
| LOW | packages/flint-py/flint/core/resolve_semantics.py | 12 | CODE | |
| LOW | packages/flint-py/flint/vegalite/__init__.py | 1 | CODE | |
| LOW | packages/flint-py/flint/vegalite/__init__.py | 1 | CODE | |
| LOW | packages/flint-py/flint/vegalite/assemble.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/instantiate_spec.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/bar_table.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/jitter.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/gantt.py | 5 | CODE | |
| LOW | …flint-py/flint/vegalite/templates/connected_scatter.py | 7 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/line.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/kpi_card.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/kpi_card.py | 5 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/slope.py | 6 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/lollipop.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/radar.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/radar.py | 5 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/radar.py | 6 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/radar.py | 6 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/__init__.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/pie.py | 2 | CODE | |
| LOW | …ckages/flint-py/flint/vegalite/templates/geo_lookup.py | 7 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/map.py | 7 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/waterfall.py | 2 | CODE | |
| LOW | …kages/flint-py/flint/vegalite/templates/candlestick.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/utils.py | 4 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/density.py | 2 | CODE | |
| LOW | …ckages/flint-py/flint/vegalite/templates/range_area.py | 6 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/bump.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/scatter.py | 2 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/bar.py | 2 | CODE | |
| 6 more matches not shown… | ||||
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/flint-py/tools/run_full_eval.py | 66 | except (TypeError, ValueError): | CODE |
| HIGH | packages/flint-py/tests/test_fixtures.py | 77 | except (TypeError, ValueError): | CODE |
| HIGH | packages/flint-py/flint/core/filter_overflow.py | 194 | except Exception: | CODE |
| HIGH | packages/flint-py/flint/core/decisions.py | 109 | except ValueError: | CODE |
| HIGH | packages/flint-py/flint/core/semantic_types.py | 149 | except Exception: | CODE |
| HIGH | packages/flint-py/flint/core/semantic_types.py | 156 | except Exception: | CODE |
| HIGH | packages/flint-py/flint/core/js_date.py | 136 | except Exception: | CODE |
| HIGH | packages/flint-py/flint/core/js_date.py | 173 | except Exception: | CODE |
| HIGH | packages/flint-py/flint/vegalite/assemble.py | 704 | except (TypeError, ValueError): | CODE |
| HIGH | packages/flint-py/flint/vegalite/assemble.py | 743 | except Exception: | CODE |
| HIGH | packages/flint-py/flint/vegalite/templates/radar.py | 59 | except (TypeError, ValueError): | CODE |
| HIGH | packages/flint-py/flint/vegalite/templates/bar.py | 336 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/flint-py/flint/__init__.py | 3 | The TypeScript reference serializes specs with ``JSON.stringify(spec, null, 2)``; | STRING |
| HIGH | packages/flint-py/flint/core/encoding_overrides.py | 31 | # JS: `if (override !== undefined)`. In Python `chart_properties.get(key) | COMMENT |
| HIGH | packages/flint-py/flint/core/resolve_semantics.py | 292 | # JS String(null) => "null"; but JSON null typically not in temporal fields; preserve | COMMENT |
| HIGH | packages/flint-py/flint/vegalite/assemble.py | 567 | # undefined). This also tidies up nested control option entries that | COMMENT |
| HIGH | packages/flint-py/flint/vegalite/assemble.py | 77 | nested control options like ``{value: undefined, label: "Default"}`` which | STRING |
| HIGH | packages/flint-py/flint/vegalite/templates/bar_table.py | 625 | "datum.__bt_others_num === 1 || datum.__bt_others === true" if can_trim else None | CODE |
| HIGH | packages/flint-py/flint/vegalite/templates/kpi_card.py | 24 | """Emulate JS Number.toLocaleString(undefined, {maximumFractionDigits: 2}). | STRING |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/flint-py/tools/run_full_eval.py | 44 | CODE | |
| LOW | packages/flint-py/tools/run_full_eval.py | 73 | CODE | |
| LOW | packages/flint-py/tests/unit/test_zero_baseline.py | 19 | CODE | |
| LOW | packages/flint-py/flint/core/filter_overflow.py | 12 | CODE | |
| LOW | packages/flint-py/flint/core/filter_overflow.py | 162 | CODE | |
| LOW | packages/flint-py/flint/core/decisions.py | 89 | CODE | |
| LOW | packages/flint-py/flint/core/compute_layout.py | 182 | CODE | |
| LOW | packages/flint-py/flint/core/compute_layout.py | 789 | CODE | |
| LOW | packages/flint-py/flint/core/compute_layout.py | 988 | CODE | |
| LOW | packages/flint-py/flint/core/resolve_semantics.py | 241 | CODE | |
| LOW | packages/flint-py/flint/core/resolve_semantics.py | 312 | CODE | |
| LOW | packages/flint-py/flint/vegalite/assemble.py | 109 | CODE | |
| LOW | packages/flint-py/flint/vegalite/assemble.py | 595 | CODE | |
| LOW | packages/flint-py/flint/vegalite/assemble.py | 688 | CODE | |
| LOW | packages/flint-py/flint/vegalite/instantiate_spec.py | 47 | CODE | |
| LOW | packages/flint-py/flint/vegalite/instantiate_spec.py | 523 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/bar_table.py | 85 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/bar_table.py | 139 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/jitter.py | 12 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/kpi_card.py | 53 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/radar.py | 10 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/radar.py | 28 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/radar.py | 261 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/__init__.py | 58 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/__init__.py | 59 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/map.py | 184 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/utils.py | 309 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/bump.py | 23 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/bar.py | 230 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/bar.py | 387 | CODE | |
| LOW | packages/flint-py/flint/vegalite/templates/area.py | 22 | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | docs/design-stretch-model.md | 1191 | ### Step 1: 1D Pressure | COMMENT |
| LOW | docs/design-stretch-model.md | 1197 | ### Step 2: Area stretch | COMMENT |
| LOW | docs/design-stretch-model.md | 1208 | ### Step 3: Biased split to X and Y | COMMENT |
| LOW | docs/design-stretch-model.md | 1225 | ### Step 4: Canvas sizing | COMMENT |
| LOW | docs/zh-CN/design-stretch-model.md | 986 | ### Step 1: 1D Pressure | COMMENT |
| LOW | docs/zh-CN/design-stretch-model.md | 992 | ### Step 2: Area stretch | COMMENT |
| LOW | docs/zh-CN/design-stretch-model.md | 1003 | ### Step 3: Biased split to X and Y | COMMENT |
| LOW | docs/zh-CN/design-stretch-model.md | 1020 | ### Step 4: Canvas sizing | COMMENT |
| LOW⚡ | packages/flint-js/src/docs/design-stretch-model.md | 930 | ### Step 1: 1D Pressure | COMMENT |
| LOW⚡ | packages/flint-js/src/docs/design-stretch-model.md | 936 | ### Step 2: Area stretch | COMMENT |
| LOW⚡ | packages/flint-js/src/docs/design-stretch-model.md | 945 | ### Step 3: Biased split to X and Y | COMMENT |
| LOW | packages/flint-js/src/docs/design-stretch-model.md | 962 | ### Step 4: Canvas sizing | COMMENT |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/flint-py/tools/build_results_page.py | 81 | except Exception as exc: | CODE |
| LOW | packages/flint-py/tools/build_results_page.py | 90 | except Exception as exc: | CODE |
| LOW | packages/flint-py/tools/run_full_eval.py | 110 | except Exception as e: | CODE |
| LOW | packages/flint-py/tests/test_fixtures.py | 94 | except Exception as e: # noqa: BLE001 | CODE |
| MEDIUM | packages/flint-py/tests/test_fixtures.py | 91 | def assemble_vegalite(): | CODE |
| LOW | packages/flint-py/flint/core/filter_overflow.py | 194 | except Exception: | CODE |
| LOW | packages/flint-py/flint/core/semantic_types.py | 149 | except Exception: | CODE |
| LOW | packages/flint-py/flint/core/semantic_types.py | 156 | except Exception: | CODE |
| LOW | packages/flint-py/flint/core/js_date.py | 136 | except Exception: | CODE |
| LOW | packages/flint-py/flint/core/js_date.py | 173 | except Exception: | CODE |
| LOW | packages/flint-py/flint/vegalite/assemble.py | 743 | except Exception: | CODE |
| LOW | packages/flint-py/flint/vegalite/templates/bar.py | 336 | except Exception: | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/flint-py/flint/core/filter_overflow.py | 119 | "placeholder": placeholder, | CODE |
| LOW⚡ | packages/flint-py/flint/vegalite/instantiate_spec.py | 382 | "test": f"datum.label == '{trunc['placeholder']}'", | CODE |
| LOW⚡ | packages/flint-py/flint/vegalite/instantiate_spec.py | 389 | enc["scale"]["domain"] = [*trunc["keptValues"], trunc["placeholder"]] | CODE |
| LOW⚡ | packages/flint-py/flint/vegalite/instantiate_spec.py | 393 | enc["legend"]["values"] = [*trunc["keptValues"], trunc["placeholder"]] | CODE |
| LOW | …rc/playground/new-theme-test/research/mayo-clinic.json | 63 | { "file": "/Users/chenwang/.copilot/session-state/86038611-3930-46cf-af6d-24a4a5cf3420/files/theme-refs/mayo-clinic/ | CODE |
| LOW | …rc/playground/new-theme-test/research/mayo-clinic.json | 63 | { "file": "/Users/chenwang/.copilot/session-state/86038611-3930-46cf-af6d-24a4a5cf3420/files/theme-refs/mayo-clinic/ | CODE |
| LOW | …/src/playground/new-theme-test/themes/human-managed.ts | 348 | proposal: '`ink.series.missing: "#ADADAD"` with `marks.missing: "placeholder" | "gap" | "omit"`.', | CODE |
| LOW | …/playground/new-theme-test/themes/pinterest-gestalt.ts | 339 | proposal: '`ink.series.patterns` (hatch angle, spacing, ink) and a missing-data policy `marks.missing: "gap" | "pl | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| HIGH | packages/flint-js/src/core/kpi-format.ts | 33 | print(value: unknown, said?: string): string; | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | .github/workflows/codeql.yml | 56 | # If you are analyzing a compiled language, you can modify the 'build-mode' for that language to customize how | COMMENT |
| LOW | …te/src/playground/new-theme-test/research/metlife.json | 88 | { "rule": "Assign series colours in the fixed extended order: #0090DA, #333333, #00ACA0, #DB0A5B, #F2F2F2, #007ABC, | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | package-lock.json | 8765 | "resolved": "https://ms-feed-2.pkgs.visualstudio.com/1es-public/_packaging/npm-public/npm/registry/robust-predicat | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| MEDIUM | …nd/theme-lab-assets/population-waterfall.mckinsey.json | 9 | "Connectors kept but thinned to a 0.8px #d3dce1 hairline. They are scaffolding for reading the steps, not data, and | CODE |
| Severity | File | Line | Snippet | Context |
|---|---|---|---|---|
| LOW | packages/flint-py/flint/vegalite/__init__.py | 3 | __all__ = ["assemble_vegalite", "get_chart_options"] | CODE |