@praxisui/charts 10.0.0-rc.37 → 10.0.0-rc.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-10-21T22:13:30.176Z",
3
+ "generatedAt": "2026-10-26T17:40:14.409Z",
4
4
  "packageName": "@praxisui/charts",
5
- "packageVersion": "10.0.0-rc.37",
5
+ "packageVersion": "10.0.0-rc.39",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
8
  "componentCount": 4,
@@ -1490,6 +1490,36 @@
1490
1490
  }
1491
1491
  }
1492
1492
  },
1493
+ {
1494
+ "if": {
1495
+ "properties": {
1496
+ "kind": {
1497
+ "const": "heatmap"
1498
+ }
1499
+ },
1500
+ "required": [
1501
+ "kind"
1502
+ ]
1503
+ },
1504
+ "then": {
1505
+ "required": [
1506
+ "dimensions",
1507
+ "metrics"
1508
+ ],
1509
+ "properties": {
1510
+ "dimensions": {
1511
+ "type": "array",
1512
+ "minItems": 2,
1513
+ "maxItems": 2
1514
+ },
1515
+ "metrics": {
1516
+ "type": "array",
1517
+ "minItems": 1,
1518
+ "maxItems": 1
1519
+ }
1520
+ }
1521
+ }
1522
+ },
1493
1523
  {
1494
1524
  "if": {
1495
1525
  "properties": {
@@ -1612,7 +1642,8 @@
1612
1642
  "funnel",
1613
1643
  "pyramid",
1614
1644
  "treemap",
1615
- "gauge"
1645
+ "gauge",
1646
+ "heatmap"
1616
1647
  ]
1617
1648
  },
1618
1649
  "chartId": {
@@ -1664,6 +1695,27 @@
1664
1695
  "options": {
1665
1696
  "type": "object",
1666
1697
  "properties": {
1698
+ "timezone": {
1699
+ "type": "string"
1700
+ },
1701
+ "periodField": {
1702
+ "type": "string"
1703
+ },
1704
+ "periodPreset": {
1705
+ "enum": [
1706
+ "TODAY",
1707
+ "YESTERDAY",
1708
+ "LAST_7_DAYS",
1709
+ "LAST_30_DAYS",
1710
+ "THIS_MONTH",
1711
+ "LAST_MONTH",
1712
+ "THIS_QUARTER",
1713
+ "THIS_YEAR"
1714
+ ]
1715
+ },
1716
+ "fillGaps": {
1717
+ "type": "boolean"
1718
+ },
1667
1719
  "comparisonPeriod": {
1668
1720
  "type": "object",
1669
1721
  "required": [
@@ -1833,7 +1885,8 @@
1833
1885
  "funnel",
1834
1886
  "pyramid",
1835
1887
  "treemap",
1836
- "gauge"
1888
+ "gauge",
1889
+ "heatmap"
1837
1890
  ]
1838
1891
  },
1839
1892
  "orientation": {
@@ -1916,6 +1969,9 @@
1916
1969
  "field": {
1917
1970
  "type": "string"
1918
1971
  },
1972
+ "sourceField": {
1973
+ "type": "string"
1974
+ },
1919
1975
  "label": {
1920
1976
  "oneOf": [
1921
1977
  {
@@ -1933,7 +1989,8 @@
1933
1989
  "min",
1934
1990
  "max",
1935
1991
  "count",
1936
- "distinct-count"
1992
+ "distinct-count",
1993
+ "avg-per-cycle-occurrence"
1937
1994
  ]
1938
1995
  },
1939
1996
  "seriesKind": {
@@ -1985,6 +2042,9 @@
1985
2042
  "field": {
1986
2043
  "type": "string"
1987
2044
  },
2045
+ "sourceField": {
2046
+ "type": "string"
2047
+ },
1988
2048
  "label": {
1989
2049
  "oneOf": [
1990
2050
  {
@@ -2002,7 +2062,8 @@
2002
2062
  "min",
2003
2063
  "max",
2004
2064
  "count",
2005
- "distinct-count"
2065
+ "distinct-count",
2066
+ "avg-per-cycle-occurrence"
2006
2067
  ]
2007
2068
  },
2008
2069
  "seriesKind": {
@@ -2317,6 +2378,12 @@
2317
2378
  },
2318
2379
  "role": {
2319
2380
  "type": "string"
2381
+ },
2382
+ "extraction": {
2383
+ "type": "string"
2384
+ },
2385
+ "alias": {
2386
+ "type": "string"
2320
2387
  }
2321
2388
  }
2322
2389
  }
@@ -2332,6 +2399,9 @@
2332
2399
  "field": {
2333
2400
  "type": "string"
2334
2401
  },
2402
+ "sourceField": {
2403
+ "type": "string"
2404
+ },
2335
2405
  "label": {
2336
2406
  "oneOf": [
2337
2407
  {
@@ -2349,7 +2419,8 @@
2349
2419
  "min",
2350
2420
  "max",
2351
2421
  "count",
2352
- "distinct-count"
2422
+ "distinct-count",
2423
+ "avg-per-cycle-occurrence"
2353
2424
  ]
2354
2425
  },
2355
2426
  "seriesKind": {
@@ -3594,9 +3665,9 @@
3594
3665
  {
3595
3666
  "chunkIndex": 1,
3596
3667
  "chunkKind": "authoring_manifest",
3597
- "content": "{\"operationId\":\"chart.document.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set chart document Effects: set-value. Save this chart in the editor and reopen it without changing the runtime chart document.\",\"scope\":\"global\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-document-root\",\"required\":false},\"inputContract\":{\"required\":[\"version\",\"kind\",\"source\"],\"properties\":[\"version\",\"kind\",\"chartId\",\"title\",\"subtitle\",\"source\",\"dimensions\",\"metrics\",\"gauge\",\"events\",\"motion\"],\"semanticTerms\":[\"version\",\"kind\",\"chartId\",\"title\",\"subtitle\",\"source\",\"dimensions\",\"metrics\",\"gauge\",\"events\",\"motion\",\"0.1.0\",\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"treemap\",\"source.kind\",\"source.resource\",\"source.operation\",\"source.options\",\"gauge.scale\",\"motion.enabled\",\"motion.preset\",\"praxis.stats\",\"derived\",\"group-by\",\"timeseries\",\"distribution\",\"comparison\",\"source.options.comparisonPeriod\",\"gauge.scale.min\",\"gauge.scale.max\",\"subtle\",\"standard\",\"expressive\",\"source.options.comparisonPeriod.field\",\"source.options.comparisonPeriod.timezone\",\"source.options.comparisonPeriod.preset\",\"source.options.comparisonPeriod.mode\",\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\",\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\",\"source.options.limit\",\"1\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"chartDocument\"],\"validators\":[{\"validatorId\":\"chart-document-shape\",\"level\":\"error\",\"code\":\"CHART_DOCUMENT_SHAPE\",\"description\":\"Document must conform to PraxisXUiChartContract.\"},{\"validatorId\":\"chart-version-supported\",\"level\":\"error\",\"code\":\"CHART_VERSION_SUPPORTED\"},{\"validatorId\":\"chart-type-series-axis-compatible\",\"level\":\"error\",\"code\":\"CHART_TYPE_SERIES_AXIS_COMPATIBLE\",\"description\":\"Chart kind, dimensions, metrics and axes must be compatible.\"},{\"validatorId\":\"gauge-scalar-contract\",\"level\":\"error\",\"code\":\"GAUGE_SCALAR_CONTRACT\",\"description\":\"Gauge charts require one dimension, exactly one metric and, for praxis.stats, one group-by bucket selected with source.options.limit=1.\"},{\"validatorId\":\"gauge-scale-valid\",\"level\":\"error\",\"code\":\"GAUGE_SCALE_VALID\",\"description\":\"Gauge scale requires finite min and max values with max greater than min; runtime rejects values outside the declared scale without clamping.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"round-trip-editor-runtime\",\"request\":\"Save this chart in the editor and reopen it without changing the runtime chart document.\",\"operationId\":\"chart.document.set\",\"params\":{\"version\":\"0.1.0\",\"kind\":\"bar\",\"source\":{\"kind\":\"derived\"},\"dimensions\":[{\"field\":\"department\"}],\"metrics\":[{\"field\":\"total\",\"aggregation\":\"count\"}]},\"isPositive\":true}],\"negativeExamples\":[]}",
3668
+ "content": "{\"operationId\":\"chart.document.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set chart document Effects: set-value. Save this chart in the editor and reopen it without changing the runtime chart document.\",\"scope\":\"global\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-document-root\",\"required\":false},\"inputContract\":{\"required\":[\"version\",\"kind\",\"source\"],\"properties\":[\"version\",\"kind\",\"chartId\",\"title\",\"subtitle\",\"source\",\"dimensions\",\"metrics\",\"gauge\",\"events\",\"motion\"],\"semanticTerms\":[\"version\",\"kind\",\"chartId\",\"title\",\"subtitle\",\"source\",\"dimensions\",\"metrics\",\"gauge\",\"events\",\"motion\",\"0.1.0\",\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"treemap\",\"heatmap\",\"source.kind\",\"source.resource\",\"source.operation\",\"source.options\",\"gauge.scale\",\"motion.enabled\",\"motion.preset\",\"praxis.stats\",\"derived\",\"group-by\",\"timeseries\",\"distribution\",\"comparison\",\"source.options.timezone\",\"source.options.periodField\",\"source.options.periodPreset\",\"source.options.fillGaps\",\"source.options.comparisonPeriod\",\"gauge.scale.min\",\"gauge.scale.max\",\"subtle\",\"standard\",\"expressive\",\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\",\"source.options.comparisonPeriod.field\",\"source.options.comparisonPeriod.timezone\",\"source.options.comparisonPeriod.preset\",\"source.options.comparisonPeriod.mode\",\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\",\"source.options.limit\",\"1\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"chartDocument\"],\"validators\":[{\"validatorId\":\"chart-document-shape\",\"level\":\"error\",\"code\":\"CHART_DOCUMENT_SHAPE\",\"description\":\"Document must conform to PraxisXUiChartContract.\"},{\"validatorId\":\"chart-version-supported\",\"level\":\"error\",\"code\":\"CHART_VERSION_SUPPORTED\"},{\"validatorId\":\"chart-type-series-axis-compatible\",\"level\":\"error\",\"code\":\"CHART_TYPE_SERIES_AXIS_COMPATIBLE\",\"description\":\"Chart kind, dimensions, metrics and axes must be compatible.\"},{\"validatorId\":\"gauge-scalar-contract\",\"level\":\"error\",\"code\":\"GAUGE_SCALAR_CONTRACT\",\"description\":\"Gauge charts require one dimension, exactly one metric and, for praxis.stats, one group-by bucket selected with source.options.limit=1.\"},{\"validatorId\":\"gauge-scale-valid\",\"level\":\"error\",\"code\":\"GAUGE_SCALE_VALID\",\"description\":\"Gauge scale requires finite min and max values with max greater than min; runtime rejects values outside the declared scale without clamping.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"round-trip-editor-runtime\",\"request\":\"Save this chart in the editor and reopen it without changing the runtime chart document.\",\"operationId\":\"chart.document.set\",\"params\":{\"version\":\"0.1.0\",\"kind\":\"bar\",\"source\":{\"kind\":\"derived\"},\"dimensions\":[{\"field\":\"department\"}],\"metrics\":[{\"field\":\"total\",\"aggregation\":\"count\"}]},\"isPositive\":true}],\"negativeExamples\":[]}",
3598
3669
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
3599
- "contentHash": "2e9f04cb09eb75daf83f527cb4a5080fdff64d531bc91094078450450f44538a",
3670
+ "contentHash": "9610ecefcd4b791c2952dafe52470303f73f17cc4530c326cd8dc7c99e2df80d",
3600
3671
  "sourceKind": "component_definition",
3601
3672
  "sourceId": "praxis-chart",
3602
3673
  "corpusVersion": "1.0.0"
@@ -3604,9 +3675,9 @@
3604
3675
  {
3605
3676
  "chunkIndex": 2,
3606
3677
  "chunkKind": "authoring_manifest",
3607
- "content": "{\"operationId\":\"chart.type.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set chart type Effects: merge-object. Use a bar chart for employees by department.\",\"scope\":\"global\",\"target\":{\"kind\":\"chartType\",\"resolver\":\"x-ui-chart-kind\",\"required\":false},\"inputContract\":{\"required\":[\"kind\"],\"properties\":[\"kind\",\"orientation\",\"gauge\"],\"semanticTerms\":[\"kind\",\"orientation\",\"gauge\",\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"treemap\",\"vertical\",\"horizontal\",\"gauge.scale\",\"gauge.scale.min\",\"gauge.scale.max\"]},\"effects\":[\"merge-object\"],\"affectedPaths\":[\"chartDocument.kind\",\"chartDocument.orientation\",\"chartDocument.metrics[]\",\"chartDocument.dimensions[]\",\"chartDocument.gauge.scale\"],\"validators\":[{\"validatorId\":\"chart-type-supported\",\"level\":\"error\",\"code\":\"CHART_TYPE_SUPPORTED\",\"description\":\"Chart kind must be supported by @praxisui/charts.\"},{\"validatorId\":\"chart-type-series-axis-compatible\",\"level\":\"error\",\"code\":\"CHART_TYPE_SERIES_AXIS_COMPATIBLE\",\"description\":\"Chart kind, dimensions, metrics and axes must be compatible.\"},{\"validatorId\":\"category-slice-single-metric\",\"level\":\"error\",\"code\":\"CATEGORY_SLICE_SINGLE_METRIC\",\"description\":\"Pie, donut, funnel, pyramid and treemap charts require exactly one metric.\"},{\"validatorId\":\"combo-minimum-series\",\"level\":\"error\",\"code\":\"COMBO_MINIMUM_SERIES\",\"description\":\"Combo charts require at least two metrics.\"},{\"validatorId\":\"gauge-scalar-contract\",\"level\":\"error\",\"code\":\"GAUGE_SCALAR_CONTRACT\",\"description\":\"Gauge charts require one dimension, exactly one metric and, for praxis.stats, one group-by bucket selected with source.options.limit=1.\"},{\"validatorId\":\"gauge-scale-valid\",\"level\":\"error\",\"code\":\"GAUGE_SCALE_VALID\",\"description\":\"Gauge scale requires finite min and max values with max greater than min; runtime rejects values outside the declared scale without clamping.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-bar-chart\",\"request\":\"Use a bar chart for employees by department.\",\"operationId\":\"chart.type.set\",\"params\":{\"kind\":\"bar\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3678
+ "content": "{\"operationId\":\"chart.type.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set chart type Effects: merge-object. Use a bar chart for employees by department.\",\"scope\":\"global\",\"target\":{\"kind\":\"chartType\",\"resolver\":\"x-ui-chart-kind\",\"required\":false},\"inputContract\":{\"required\":[\"kind\"],\"properties\":[\"kind\",\"orientation\",\"gauge\"],\"semanticTerms\":[\"kind\",\"orientation\",\"gauge\",\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"treemap\",\"heatmap\",\"vertical\",\"horizontal\",\"gauge.scale\",\"gauge.scale.min\",\"gauge.scale.max\"]},\"effects\":[\"merge-object\"],\"affectedPaths\":[\"chartDocument.kind\",\"chartDocument.orientation\",\"chartDocument.metrics[]\",\"chartDocument.dimensions[]\",\"chartDocument.gauge.scale\"],\"validators\":[{\"validatorId\":\"chart-type-supported\",\"level\":\"error\",\"code\":\"CHART_TYPE_SUPPORTED\",\"description\":\"Chart kind must be supported by @praxisui/charts.\"},{\"validatorId\":\"chart-type-series-axis-compatible\",\"level\":\"error\",\"code\":\"CHART_TYPE_SERIES_AXIS_COMPATIBLE\",\"description\":\"Chart kind, dimensions, metrics and axes must be compatible.\"},{\"validatorId\":\"category-slice-single-metric\",\"level\":\"error\",\"code\":\"CATEGORY_SLICE_SINGLE_METRIC\",\"description\":\"Pie, donut, funnel, pyramid and treemap charts require exactly one metric.\"},{\"validatorId\":\"combo-minimum-series\",\"level\":\"error\",\"code\":\"COMBO_MINIMUM_SERIES\",\"description\":\"Combo charts require at least two metrics.\"},{\"validatorId\":\"gauge-scalar-contract\",\"level\":\"error\",\"code\":\"GAUGE_SCALAR_CONTRACT\",\"description\":\"Gauge charts require one dimension, exactly one metric and, for praxis.stats, one group-by bucket selected with source.options.limit=1.\"},{\"validatorId\":\"gauge-scale-valid\",\"level\":\"error\",\"code\":\"GAUGE_SCALE_VALID\",\"description\":\"Gauge scale requires finite min and max values with max greater than min; runtime rejects values outside the declared scale without clamping.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-bar-chart\",\"request\":\"Use a bar chart for employees by department.\",\"operationId\":\"chart.type.set\",\"params\":{\"kind\":\"bar\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3608
3679
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
3609
- "contentHash": "29dc0f93641ce56d216bba6e9ba78b3d28fcae012ea50a68d55678eae221bcbf",
3680
+ "contentHash": "6a3834b20fa5af83634c2fab689c5e031a4dce1711e6382a9bcffed803beaf8f",
3610
3681
  "sourceKind": "component_definition",
3611
3682
  "sourceId": "praxis-chart",
3612
3683
  "corpusVersion": "1.0.0"
@@ -3614,9 +3685,9 @@
3614
3685
  {
3615
3686
  "chunkIndex": 3,
3616
3687
  "chunkKind": "authoring_manifest",
3617
- "content": "{\"operationId\":\"series.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add chart series Effects: compile-domain-patch. Add salary as a summed metric.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"required\":false},\"inputContract\":{\"required\":[\"field\"],\"properties\":[\"field\",\"label\",\"aggregation\",\"seriesKind\",\"axis\",\"color\",\"format\",\"afterField\"],\"semanticTerms\":[\"field\",\"label\",\"aggregation\",\"seriesKind\",\"axis\",\"color\",\"format\",\"afterField\",\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\",\"bar\",\"line\",\"area\",\"primary\",\"secondary\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"validators\":[{\"validatorId\":\"series-field-exists\",\"level\":\"error\",\"code\":\"SERIES_FIELD_EXISTS\",\"description\":\"Series field must exist in availableFields or schema context.\"},{\"validatorId\":\"series-field-aggregable\",\"level\":\"error\",\"code\":\"SERIES_FIELD_AGGREGABLE\",\"description\":\"Metric fields must support the requested aggregation.\"},{\"validatorId\":\"series-id-unique\",\"level\":\"error\",\"code\":\"SERIES_ID_UNIQUE\",\"description\":\"Metric/series identity must be stable and unique by field.\"},{\"validatorId\":\"chart-type-series-axis-compatible\",\"level\":\"error\",\"code\":\"CHART_TYPE_SERIES_AXIS_COMPATIBLE\",\"description\":\"Chart kind, dimensions, metrics and axes must be compatible.\"},{\"validatorId\":\"gauge-scalar-contract\",\"level\":\"error\",\"code\":\"GAUGE_SCALAR_CONTRACT\",\"description\":\"Gauge charts require one dimension, exactly one metric and, for praxis.stats, one group-by bucket selected with source.options.limit=1.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-salary-series\",\"request\":\"Add salary as a summed metric.\",\"operationId\":\"series.add\",\"params\":{\"field\":\"salary\",\"aggregation\":\"sum\",\"label\":\"Salary\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3688
+ "content": "{\"operationId\":\"series.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Add chart series Effects: compile-domain-patch. Add salary as a summed metric.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"required\":false},\"inputContract\":{\"required\":[\"field\"],\"properties\":[\"field\",\"sourceField\",\"label\",\"aggregation\",\"seriesKind\",\"axis\",\"color\",\"format\",\"afterField\"],\"semanticTerms\":[\"field\",\"sourceField\",\"label\",\"aggregation\",\"seriesKind\",\"axis\",\"color\",\"format\",\"afterField\",\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\",\"avg-per-cycle-occurrence\",\"bar\",\"line\",\"area\",\"primary\",\"secondary\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"validators\":[{\"validatorId\":\"series-field-exists\",\"level\":\"error\",\"code\":\"SERIES_FIELD_EXISTS\",\"description\":\"Series field must exist in availableFields or schema context.\"},{\"validatorId\":\"series-field-aggregable\",\"level\":\"error\",\"code\":\"SERIES_FIELD_AGGREGABLE\",\"description\":\"Metric fields must support the requested aggregation.\"},{\"validatorId\":\"series-id-unique\",\"level\":\"error\",\"code\":\"SERIES_ID_UNIQUE\",\"description\":\"Metric/series identity must be stable and unique by field.\"},{\"validatorId\":\"chart-type-series-axis-compatible\",\"level\":\"error\",\"code\":\"CHART_TYPE_SERIES_AXIS_COMPATIBLE\",\"description\":\"Chart kind, dimensions, metrics and axes must be compatible.\"},{\"validatorId\":\"gauge-scalar-contract\",\"level\":\"error\",\"code\":\"GAUGE_SCALAR_CONTRACT\",\"description\":\"Gauge charts require one dimension, exactly one metric and, for praxis.stats, one group-by bucket selected with source.options.limit=1.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"add-salary-series\",\"request\":\"Add salary as a summed metric.\",\"operationId\":\"series.add\",\"params\":{\"field\":\"salary\",\"aggregation\":\"sum\",\"label\":\"Salary\"},\"isPositive\":true}],\"negativeExamples\":[]}",
3618
3689
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
3619
- "contentHash": "b7e160adb1ffe43130d408e4d68804ad1ee840c0b70a8b0321b2c70f42b49476",
3690
+ "contentHash": "5d4522879cae25b2f5d8c4e25b897c89b81d284cb1de2be376b87006c77a41c3",
3620
3691
  "sourceKind": "component_definition",
3621
3692
  "sourceId": "praxis-chart",
3622
3693
  "corpusVersion": "1.0.0"
@@ -3644,9 +3715,9 @@
3644
3715
  {
3645
3716
  "chunkIndex": 6,
3646
3717
  "chunkKind": "authoring_manifest",
3647
- "content": "{\"operationId\":\"data.resource.bind\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Bind chart data resource Effects: compile-domain-patch. Bind this chart to payroll stats grouped by department. Compare active employees by department with the previous aligned 30-day period. Use the prompt example text to decide which backend endpoint to call.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-source-and-field-catalog\",\"required\":false},\"inputContract\":{\"required\":[\"sourceKind\"],\"properties\":[\"sourceKind\",\"resource\",\"operation\",\"limit\",\"comparisonPeriod\",\"dimensions\",\"metrics\"],\"semanticTerms\":[\"sourceKind\",\"resource\",\"operation\",\"limit\",\"comparisonPeriod\",\"dimensions\",\"metrics\",\"praxis.stats\",\"derived\",\"group-by\",\"timeseries\",\"distribution\",\"comparison\",\"comparisonPeriod.field\",\"comparisonPeriod.timezone\",\"comparisonPeriod.preset\",\"comparisonPeriod.mode\",\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\",\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\",\"dimensions.field\",\"dimensions.role\",\"metrics.field\",\"metrics.label\",\"metrics.aggregation\",\"metrics.seriesKind\",\"metrics.axis\",\"metrics.color\",\"metrics.format\",\"metrics.afterField\",\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\",\"bar\",\"line\",\"area\",\"primary\",\"secondary\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.source\",\"chartDocument.source.options.limit\",\"chartDocument.source.options.comparisonPeriod\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"validators\":[{\"validatorId\":\"remote-resource-in-api-metadata\",\"level\":\"error\",\"code\":\"REMOTE_RESOURCE_IN_API_METADATA\",\"description\":\"Remote praxis.stats resource must equal a governed root-relative availableResources[].path beginning with exactly one slash; a discovery id is not an executable resource path.\"},{\"validatorId\":\"bound-fields-exist\",\"level\":\"error\",\"code\":\"BOUND_FIELDS_EXIST\",\"description\":\"Bound dimensions and metrics must exist in the capability-backed field context and satisfy its operation, aggregation and distribution-mode eligibility.\"},{\"validatorId\":\"stats-operation-supported\",\"level\":\"error\",\"code\":\"STATS_OPERATION_SUPPORTED\",\"description\":\"Remote datasource operation must be supported by the stats backend.\"},{\"validatorId\":\"chart-type-series-axis-compatible\",\"level\":\"error\",\"code\":\"CHART_TYPE_SERIES_AXIS_COMPATIBLE\",\"description\":\"Chart kind, dimensions, metrics and axes must be compatible.\"},{\"validatorId\":\"comparison-period-complete\",\"level\":\"error\",\"code\":\"COMPARISON_PERIOD_COMPLETE\",\"description\":\"Comparison requires a time-series eligible period field, timezone, preset and mode grounded in the governed resource capabilities.\"},{\"validatorId\":\"comparison-metrics-supported\",\"level\":\"error\",\"code\":\"COMPARISON_METRICS_SUPPORTED\",\"description\":\"Comparison requires unique metrics[] aliases using only COUNT, DISTINCT_COUNT or SUM capabilities; singular metric payloads are not authorable.\"},{\"validatorId\":\"gauge-scalar-contract\",\"level\":\"error\",\"code\":\"GAUGE_SCALAR_CONTRACT\",\"description\":\"Gauge charts require one dimension, exactly one metric and, for praxis.stats, one group-by bucket selected with source.options.limit=1.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-remote-binding\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"bind-stats-resource\",\"request\":\"Bind this chart to payroll stats grouped by department.\",\"operationId\":\"data.resource.bind\",\"params\":{\"sourceKind\":\"praxis.stats\",\"resource\":\"/api/stats/payroll\",\"operation\":\"group-by\"},\"isPositive\":true},{\"id\":\"bind-comparison-resource\",\"request\":\"Compare active employees by department with the previous aligned 30-day period.\",\"operationId\":\"data.resource.bind\",\"params\":{\"sourceKind\":\"praxis.stats\",\"resource\":\"/api/human-resources/employees\",\"operation\":\"comparison\",\"comparisonPeriod\":{\"field\":\"admissionDate\",\"timezone\":\"America/Sao_Paulo\",\"preset\":\"LAST_30_DAYS\",\"mode\":\"PREVIOUS_ALIGNED\"},\"dimensions\":[{\"field\":\"department\"}],\"metrics\":[{\"field\":\"employeeId\",\"aggregation\":\"distinct-count\"}]},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-prompt-routing\",\"request\":\"Use the prompt example text to decide which backend endpoint to call.\",\"operationId\":\"data.resource.bind\",\"params\":{\"sourceKind\":\"praxis.stats\",\"resource\":\"from prompt example\"},\"isPositive\":false}]}",
3718
+ "content": "{\"operationId\":\"data.resource.bind\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Bind chart data resource Effects: compile-domain-patch. Bind this chart to payroll stats grouped by department. Compare active employees by department with the previous aligned 30-day period. Use the prompt example text to decide which backend endpoint to call.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-source-and-field-catalog\",\"required\":false},\"inputContract\":{\"required\":[\"sourceKind\"],\"properties\":[\"sourceKind\",\"resource\",\"operation\",\"limit\",\"comparisonPeriod\",\"dimensions\",\"metrics\"],\"semanticTerms\":[\"sourceKind\",\"resource\",\"operation\",\"limit\",\"comparisonPeriod\",\"dimensions\",\"metrics\",\"praxis.stats\",\"derived\",\"group-by\",\"timeseries\",\"distribution\",\"comparison\",\"comparisonPeriod.field\",\"comparisonPeriod.timezone\",\"comparisonPeriod.preset\",\"comparisonPeriod.mode\",\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\",\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\",\"dimensions.field\",\"dimensions.role\",\"dimensions.extraction\",\"dimensions.alias\",\"metrics.field\",\"metrics.sourceField\",\"metrics.label\",\"metrics.aggregation\",\"metrics.seriesKind\",\"metrics.axis\",\"metrics.color\",\"metrics.format\",\"metrics.afterField\",\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\",\"avg-per-cycle-occurrence\",\"bar\",\"line\",\"area\",\"primary\",\"secondary\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.source\",\"chartDocument.source.options.limit\",\"chartDocument.source.options.comparisonPeriod\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"validators\":[{\"validatorId\":\"remote-resource-in-api-metadata\",\"level\":\"error\",\"code\":\"REMOTE_RESOURCE_IN_API_METADATA\",\"description\":\"Remote praxis.stats resource must equal a governed root-relative availableResources[].path beginning with exactly one slash; a discovery id is not an executable resource path.\"},{\"validatorId\":\"bound-fields-exist\",\"level\":\"error\",\"code\":\"BOUND_FIELDS_EXIST\",\"description\":\"Bound dimensions and metrics must exist in the capability-backed field context and satisfy its operation, aggregation and distribution-mode eligibility.\"},{\"validatorId\":\"stats-operation-supported\",\"level\":\"error\",\"code\":\"STATS_OPERATION_SUPPORTED\",\"description\":\"Remote datasource operation must be supported by the stats backend.\"},{\"validatorId\":\"chart-type-series-axis-compatible\",\"level\":\"error\",\"code\":\"CHART_TYPE_SERIES_AXIS_COMPATIBLE\",\"description\":\"Chart kind, dimensions, metrics and axes must be compatible.\"},{\"validatorId\":\"comparison-period-complete\",\"level\":\"error\",\"code\":\"COMPARISON_PERIOD_COMPLETE\",\"description\":\"Comparison requires a time-series eligible period field, timezone, preset and mode grounded in the governed resource capabilities.\"},{\"validatorId\":\"comparison-metrics-supported\",\"level\":\"error\",\"code\":\"COMPARISON_METRICS_SUPPORTED\",\"description\":\"Comparison requires unique metrics[] aliases using only COUNT, DISTINCT_COUNT or SUM capabilities; singular metric payloads are not authorable.\"},{\"validatorId\":\"gauge-scalar-contract\",\"level\":\"error\",\"code\":\"GAUGE_SCALAR_CONTRACT\",\"description\":\"Gauge charts require one dimension, exactly one metric and, for praxis.stats, one group-by bucket selected with source.options.limit=1.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}],\"preconditions\":[\"config-initialized\"],\"submissionImpact\":\"affects-remote-binding\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"bind-stats-resource\",\"request\":\"Bind this chart to payroll stats grouped by department.\",\"operationId\":\"data.resource.bind\",\"params\":{\"sourceKind\":\"praxis.stats\",\"resource\":\"/api/stats/payroll\",\"operation\":\"group-by\"},\"isPositive\":true},{\"id\":\"bind-comparison-resource\",\"request\":\"Compare active employees by department with the previous aligned 30-day period.\",\"operationId\":\"data.resource.bind\",\"params\":{\"sourceKind\":\"praxis.stats\",\"resource\":\"/api/human-resources/employees\",\"operation\":\"comparison\",\"comparisonPeriod\":{\"field\":\"admissionDate\",\"timezone\":\"America/Sao_Paulo\",\"preset\":\"LAST_30_DAYS\",\"mode\":\"PREVIOUS_ALIGNED\"},\"dimensions\":[{\"field\":\"department\"}],\"metrics\":[{\"field\":\"employeeId\",\"aggregation\":\"distinct-count\"}]},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-prompt-routing\",\"request\":\"Use the prompt example text to decide which backend endpoint to call.\",\"operationId\":\"data.resource.bind\",\"params\":{\"sourceKind\":\"praxis.stats\",\"resource\":\"from prompt example\"},\"isPositive\":false}]}",
3648
3719
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
3649
- "contentHash": "b1e6b29f787d87defa10adab9c6c24e87b77e9511bc40cb1696f32ae1f933ede",
3720
+ "contentHash": "723cc1f4f301cde4755214eec4af86e73b3085850ed81402608fbc6c7e1aae06",
3650
3721
  "sourceKind": "component_definition",
3651
3722
  "sourceId": "praxis-chart",
3652
3723
  "corpusVersion": "1.0.0"
@@ -3764,9 +3835,9 @@
3764
3835
  {
3765
3836
  "chunkIndex": 18,
3766
3837
  "chunkKind": "authoring_manifest",
3767
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"chart.document.set\",\"title\":\"Set chart document\",\"scope\":\"global\",\"targetKind\":\"dataBinding\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-document-root\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"version\",\"kind\",\"source\"],\"allOf\":[{\"if\":{\"properties\":{\"kind\":{\"const\":\"scatter\"}},\"required\":[\"kind\"]},\"then\":{\"required\":[\"dimensions\",\"metrics\"],\"properties\":{\"dimensions\":{\"type\":\"array\",\"minItems\":1},\"metrics\":{\"type\":\"array\",\"minItems\":1,\"maxItems\":2}}}},{\"if\":{\"properties\":{\"kind\":{\"const\":\"gauge\"}},\"required\":[\"kind\"]},\"then\":{\"required\":[\"dimensions\",\"metrics\",\"gauge\"],\"properties\":{\"dimensions\":{\"type\":\"array\",\"minItems\":1},\"metrics\":{\"type\":\"array\",\"minItems\":1,\"maxItems\":1},\"gauge\":{\"type\":\"object\",\"required\":[\"scale\"],\"properties\":{\"scale\":{\"type\":\"object\",\"required\":[\"min\",\"max\"],\"properties\":{\"min\":{\"type\":\"number\"},\"max\":{\"type\":\"number\"}}}}}}}},{\"if\":{\"properties\":{\"kind\":{\"const\":\"gauge\"},\"source\":{\"properties\":{\"kind\":{\"const\":\"praxis.stats\"}},\"required\":[\"kind\"]}},\"required\":[\"kind\",\"source\"]},\"then\":{\"properties\":{\"source\":{\"required\":[\"operation\",\"options\"],\"properties\":{\"operation\":{\"const\":\"group-by\"},\"options\":{\"type\":\"object\",\"required\":[\"limit\"],\"properties\":{\"limit\":{\"const\":1}}}}}}}}],\"properties\":{\"version\":{\"const\":\"0.1.0\"},\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"treemap\",\"gauge\"]},\"chartId\":{\"type\":\"string\"},\"title\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"subtitle\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"source\":{\"type\":\"object\",\"required\":[\"kind\"],\"properties\":{\"kind\":{\"enum\":[\"praxis.stats\",\"derived\"]},\"resource\":{\"type\":\"string\"},\"operation\":{\"enum\":[\"group-by\",\"timeseries\",\"distribution\",\"comparison\"]},\"options\":{\"type\":\"object\",\"properties\":{\"comparisonPeriod\":{\"type\":\"object\",\"required\":[\"field\",\"timezone\",\"preset\",\"mode\"],\"properties\":{\"field\":{\"type\":\"string\"},\"timezone\":{\"type\":\"string\"},\"preset\":{\"enum\":[\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\"]},\"mode\":{\"enum\":[\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\"]}}}}}}},\"dimensions\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"metrics\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"gauge\":{\"type\":\"object\",\"required\":[\"scale\"],\"properties\":{\"scale\":{\"type\":\"object\",\"required\":[\"min\",\"max\"],\"properties\":{\"min\":{\"type\":\"number\"},\"max\":{\"type\":\"number\"}}}}},\"events\":{\"type\":\"object\"},\"motion\":{\"type\":\"object\",\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"preset\":{\"enum\":[\"subtle\",\"standard\",\"expressive\"]}}}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"chart-document-shape\",\"chart-version-supported\",\"chart-type-series-axis-compatible\",\"gauge-scalar-contract\",\"gauge-scale-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"chart.type.set\",\"title\":\"Set chart type\",\"scope\":\"global\",\"targetKind\":\"chartType\",\"target\":{\"kind\":\"chartType\",\"resolver\":\"x-ui-chart-kind\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"kind\"],\"allOf\":[{\"if\":{\"properties\":{\"kind\":{\"const\":\"gauge\"}},\"required\":[\"kind\"]},\"then\":{\"required\":[\"gauge\"]}}],\"properties\":{\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"treemap\",\"gauge\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]},\"gauge\":{\"type\":\"object\",\"required\":[\"scale\"],\"properties\":{\"scale\":{\"type\":\"object\",\"required\":[\"min\",\"max\"],\"properties\":{\"min\":{\"type\":\"number\"},\"max\":{\"type\":\"number\"}}}}}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"chartDocument\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"chart-type-supported\",\"chart-type-series-axis-compatible\",\"category-slice-single-metric\",\"combo-minimum-series\",\"gauge-scalar-contract\",\"gauge-scale-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.kind\",\"chartDocument.orientation\",\"chartDocument.metrics[]\",\"chartDocument.dimensions[]\",\"chartDocument.gauge.scale\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"series.add\",\"title\":\"Add chart series\",\"scope\":\"dataBinding\",\"targetKind\":\"series\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"label\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"aggregation\":{\"enum\":[\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\"]},\"seriesKind\":{\"enum\":[\"bar\",\"line\",\"area\"]},\"axis\":{\"enum\":[\"primary\",\"secondary\"]},\"color\":{\"type\":\"string\"},\"format\":{\"type\":\"string\"},\"afterField\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-series-add\",\"handlerContract\":{\"reads\":[\"chartDocument.kind\",\"chartDocument.metrics[]\",\"availableFields[]\"],\"writes\":[\"chartDocument.metrics[]\"],\"identityKeys\":[\"chartDocument.metrics[].field\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"label\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"aggregation\":{\"enum\":[\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\"]},\"seriesKind\":{\"enum\":[\"bar\",\"line\",\"area\"]},\"axis\":{\"enum\":[\"primary\",\"secondary\"]},\"color\":{\"type\":\"string\"},\"format\":{\"type\":\"string\"},\"afterField\":{\"type\":\"string\"}}},\"failureModes\":[\"field-not-in-catalog\",\"duplicate-series-field\",\"aggregation-not-supported\",\"chart-type-series-incompatible\"],\"description\":\"Adds a metric-backed series by semantic field, validating it against availableFields and chart kind compatibility before patching metrics[]. Scatter accepts at most two ordered metrics, mapped to X and Y in the dual-measure mode.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"series-field-exists\",\"series-field-aggregable\",\"series-id-unique\",\"chart-type-series-axis-compatible\",\"gauge-scalar-contract\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"series.remove\",\"title\":\"Remove chart series\",\"scope\":\"dataBinding\",\"targetKind\":\"series\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"replacementField\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"remove-by-key\",\"path\":\"chartDocument.metrics[]\",\"key\":\"field\"}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"series-exists\",\"destructive-series-removal-confirmed\",\"chart-keeps-required-metric\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-series-exists\",\"confirmation-collected\"]}]}",
3838
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"chart.document.set\",\"title\":\"Set chart document\",\"scope\":\"global\",\"targetKind\":\"dataBinding\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-document-root\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"version\",\"kind\",\"source\"],\"allOf\":[{\"if\":{\"properties\":{\"kind\":{\"const\":\"scatter\"}},\"required\":[\"kind\"]},\"then\":{\"required\":[\"dimensions\",\"metrics\"],\"properties\":{\"dimensions\":{\"type\":\"array\",\"minItems\":1},\"metrics\":{\"type\":\"array\",\"minItems\":1,\"maxItems\":2}}}},{\"if\":{\"properties\":{\"kind\":{\"const\":\"heatmap\"}},\"required\":[\"kind\"]},\"then\":{\"required\":[\"dimensions\",\"metrics\"],\"properties\":{\"dimensions\":{\"type\":\"array\",\"minItems\":2,\"maxItems\":2},\"metrics\":{\"type\":\"array\",\"minItems\":1,\"maxItems\":1}}}},{\"if\":{\"properties\":{\"kind\":{\"const\":\"gauge\"}},\"required\":[\"kind\"]},\"then\":{\"required\":[\"dimensions\",\"metrics\",\"gauge\"],\"properties\":{\"dimensions\":{\"type\":\"array\",\"minItems\":1},\"metrics\":{\"type\":\"array\",\"minItems\":1,\"maxItems\":1},\"gauge\":{\"type\":\"object\",\"required\":[\"scale\"],\"properties\":{\"scale\":{\"type\":\"object\",\"required\":[\"min\",\"max\"],\"properties\":{\"min\":{\"type\":\"number\"},\"max\":{\"type\":\"number\"}}}}}}}},{\"if\":{\"properties\":{\"kind\":{\"const\":\"gauge\"},\"source\":{\"properties\":{\"kind\":{\"const\":\"praxis.stats\"}},\"required\":[\"kind\"]}},\"required\":[\"kind\",\"source\"]},\"then\":{\"properties\":{\"source\":{\"required\":[\"operation\",\"options\"],\"properties\":{\"operation\":{\"const\":\"group-by\"},\"options\":{\"type\":\"object\",\"required\":[\"limit\"],\"properties\":{\"limit\":{\"const\":1}}}}}}}}],\"properties\":{\"version\":{\"const\":\"0.1.0\"},\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"treemap\",\"gauge\",\"heatmap\"]},\"chartId\":{\"type\":\"string\"},\"title\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"subtitle\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"source\":{\"type\":\"object\",\"required\":[\"kind\"],\"properties\":{\"kind\":{\"enum\":[\"praxis.stats\",\"derived\"]},\"resource\":{\"type\":\"string\"},\"operation\":{\"enum\":[\"group-by\",\"timeseries\",\"distribution\",\"comparison\"]},\"options\":{\"type\":\"object\",\"properties\":{\"timezone\":{\"type\":\"string\"},\"periodField\":{\"type\":\"string\"},\"periodPreset\":{\"enum\":[\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\"]},\"fillGaps\":{\"type\":\"boolean\"},\"comparisonPeriod\":{\"type\":\"object\",\"required\":[\"field\",\"timezone\",\"preset\",\"mode\"],\"properties\":{\"field\":{\"type\":\"string\"},\"timezone\":{\"type\":\"string\"},\"preset\":{\"enum\":[\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\"]},\"mode\":{\"enum\":[\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\"]}}}}}}},\"dimensions\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"metrics\":{\"type\":\"array\",\"items\":{\"type\":\"object\"}},\"gauge\":{\"type\":\"object\",\"required\":[\"scale\"],\"properties\":{\"scale\":{\"type\":\"object\",\"required\":[\"min\",\"max\"],\"properties\":{\"min\":{\"type\":\"number\"},\"max\":{\"type\":\"number\"}}}}},\"events\":{\"type\":\"object\"},\"motion\":{\"type\":\"object\",\"properties\":{\"enabled\":{\"type\":\"boolean\"},\"preset\":{\"enum\":[\"subtle\",\"standard\",\"expressive\"]}}}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"chart-document-shape\",\"chart-version-supported\",\"chart-type-series-axis-compatible\",\"gauge-scalar-contract\",\"gauge-scale-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"chart.type.set\",\"title\":\"Set chart type\",\"scope\":\"global\",\"targetKind\":\"chartType\",\"target\":{\"kind\":\"chartType\",\"resolver\":\"x-ui-chart-kind\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"kind\"],\"allOf\":[{\"if\":{\"properties\":{\"kind\":{\"const\":\"gauge\"}},\"required\":[\"kind\"]},\"then\":{\"required\":[\"gauge\"]}}],\"properties\":{\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"treemap\",\"gauge\",\"heatmap\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]},\"gauge\":{\"type\":\"object\",\"required\":[\"scale\"],\"properties\":{\"scale\":{\"type\":\"object\",\"required\":[\"min\",\"max\"],\"properties\":{\"min\":{\"type\":\"number\"},\"max\":{\"type\":\"number\"}}}}}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"chartDocument\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"chart-type-supported\",\"chart-type-series-axis-compatible\",\"category-slice-single-metric\",\"combo-minimum-series\",\"gauge-scalar-contract\",\"gauge-scale-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.kind\",\"chartDocument.orientation\",\"chartDocument.metrics[]\",\"chartDocument.dimensions[]\",\"chartDocument.gauge.scale\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"series.add\",\"title\":\"Add chart series\",\"scope\":\"dataBinding\",\"targetKind\":\"series\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"sourceField\":{\"type\":\"string\"},\"label\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"aggregation\":{\"enum\":[\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\",\"avg-per-cycle-occurrence\"]},\"seriesKind\":{\"enum\":[\"bar\",\"line\",\"area\"]},\"axis\":{\"enum\":[\"primary\",\"secondary\"]},\"color\":{\"type\":\"string\"},\"format\":{\"type\":\"string\"},\"afterField\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-series-add\",\"handlerContract\":{\"reads\":[\"chartDocument.kind\",\"chartDocument.metrics[]\",\"availableFields[]\"],\"writes\":[\"chartDocument.metrics[]\"],\"identityKeys\":[\"chartDocument.metrics[].field\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"sourceField\":{\"type\":\"string\"},\"label\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"aggregation\":{\"enum\":[\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\",\"avg-per-cycle-occurrence\"]},\"seriesKind\":{\"enum\":[\"bar\",\"line\",\"area\"]},\"axis\":{\"enum\":[\"primary\",\"secondary\"]},\"color\":{\"type\":\"string\"},\"format\":{\"type\":\"string\"},\"afterField\":{\"type\":\"string\"}}},\"failureModes\":[\"field-not-in-catalog\",\"duplicate-series-field\",\"aggregation-not-supported\",\"chart-type-series-incompatible\"],\"description\":\"Adds a metric-backed series by semantic field, validating it against availableFields and chart kind compatibility before patching metrics[]. Scatter accepts at most two ordered metrics, mapped to X and Y in the dual-measure mode.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"series-field-exists\",\"series-field-aggregable\",\"series-id-unique\",\"chart-type-series-axis-compatible\",\"gauge-scalar-contract\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"series.remove\",\"title\":\"Remove chart series\",\"scope\":\"dataBinding\",\"targetKind\":\"series\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"replacementField\":{\"type\":\"string\"}}},\"effects\":[{\"kind\":\"remove-by-key\",\"path\":\"chartDocument.metrics[]\",\"key\":\"field\"}],\"destructive\":true,\"requiresConfirmation\":true,\"validators\":[\"series-exists\",\"destructive-series-removal-confirmed\",\"chart-keeps-required-metric\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"target-series-exists\",\"confirmation-collected\"]}]}",
3768
3839
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
3769
- "contentHash": "592f5da7d0cba24aa486b6530c95f7150de2e95e7f9888190586184f97012194",
3840
+ "contentHash": "c18ed137f27bba4773182fa8638fde248d7104e05d57859746db4b64bb55b976",
3770
3841
  "sourceKind": "component_definition",
3771
3842
  "sourceId": "praxis-chart",
3772
3843
  "corpusVersion": "1.0.0"
@@ -3774,9 +3845,9 @@
3774
3845
  {
3775
3846
  "chunkIndex": 19,
3776
3847
  "chunkKind": "authoring_manifest",
3777
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"axis.configure\",\"title\":\"Configure chart axis\",\"scope\":\"dataBinding\",\"targetKind\":\"axis\",\"target\":{\"kind\":\"axis\",\"resolver\":\"x-ui-chart-dimension-or-metric-axis\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"dimensionField\":{\"type\":\"string\"},\"dimensionRole\":{\"enum\":[\"category\",\"series\",\"segment\",\"time\",\"value\"]},\"metricField\":{\"type\":\"string\"},\"metricAxis\":{\"enum\":[\"primary\",\"secondary\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-axis-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.kind\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\",\"availableFields[]\"],\"writes\":[\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\",\"chartDocument.orientation\"],\"identityKeys\":[\"chartDocument.dimensions[].field\",\"chartDocument.metrics[].field\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"dimensionField\":{\"type\":\"string\"},\"dimensionRole\":{\"enum\":[\"category\",\"series\",\"segment\",\"time\",\"value\"]},\"metricField\":{\"type\":\"string\"},\"metricAxis\":{\"enum\":[\"primary\",\"secondary\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]}}},\"failureModes\":[\"field-not-in-catalog\",\"secondary-axis-non-combo\",\"missing-required-dimension\",\"axis-role-incompatible\"],\"description\":\"Configures dimensions and metric axes using semantic fields, preserving combo-only secondary axis constraints.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"axis-field-exists\",\"secondary-axis-combo-only\",\"cartesian-dimension-required\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.dimensions[]\",\"chartDocument.metrics[].axis\",\"chartDocument.orientation\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"data.resource.bind\",\"title\":\"Bind chart data resource\",\"scope\":\"dataBinding\",\"targetKind\":\"dataBinding\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-source-and-field-catalog\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"sourceKind\"],\"properties\":{\"sourceKind\":{\"enum\":[\"praxis.stats\",\"derived\"]},\"resource\":{\"type\":\"string\",\"pattern\":\"^/(?!/)\"},\"operation\":{\"enum\":[\"group-by\",\"timeseries\",\"distribution\",\"comparison\"]},\"limit\":{\"type\":\"integer\",\"minimum\":1},\"comparisonPeriod\":{\"type\":\"object\",\"required\":[\"field\",\"timezone\",\"preset\",\"mode\"],\"properties\":{\"field\":{\"type\":\"string\"},\"timezone\":{\"type\":\"string\"},\"preset\":{\"enum\":[\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\"]},\"mode\":{\"enum\":[\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\"]}}},\"dimensions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"role\":{\"type\":\"string\"}}}},\"metrics\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"label\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"aggregation\":{\"enum\":[\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\"]},\"seriesKind\":{\"enum\":[\"bar\",\"line\",\"area\"]},\"axis\":{\"enum\":[\"primary\",\"secondary\"]},\"color\":{\"type\":\"string\"},\"format\":{\"type\":\"string\"},\"afterField\":{\"type\":\"string\"}}}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-data-resource-bind\",\"handlerContract\":{\"reads\":[\"availableResources[]\",\"availableFields[]\",\"chartDocument.source\",\"chartDocument.source.options.limit\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"writes\":[\"chartDocument.source\",\"chartDocument.source.options.limit\",\"chartDocument.source.options.comparisonPeriod\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"identityKeys\":[\"availableResources[].path\",\"availableFields[].field\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"sourceKind\"],\"properties\":{\"sourceKind\":{\"enum\":[\"praxis.stats\",\"derived\"]},\"resource\":{\"type\":\"string\",\"pattern\":\"^/(?!/)\"},\"operation\":{\"enum\":[\"group-by\",\"timeseries\",\"distribution\",\"comparison\"]},\"limit\":{\"type\":\"integer\",\"minimum\":1},\"comparisonPeriod\":{\"type\":\"object\",\"required\":[\"field\",\"timezone\",\"preset\",\"mode\"],\"properties\":{\"field\":{\"type\":\"string\"},\"timezone\":{\"type\":\"string\"},\"preset\":{\"enum\":[\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\"]},\"mode\":{\"enum\":[\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\"]}}},\"dimensions\":{\"type\":\"array\"},\"metrics\":{\"type\":\"array\"}}},\"failureModes\":[\"resource-not-in-api-metadata\",\"field-not-in-schema\",\"stats-operation-not-supported\",\"gauge-limit-required\",\"comparison-period-incomplete\",\"comparison-metric-unsupported\",\"remote-binding-incomplete\"],\"description\":\"Binds a derived or praxis.stats source using governed resource, capability and field catalogs. For praxis.stats, availableResources[].id is discovery-only: validation requires the matching availableResources[].path and compilation persists that path. Gauge bindings preserve the canonical scalar limit; comparison requires one canonical operation, metrics[] and an eligible period field.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"remote-resource-in-api-metadata\",\"bound-fields-exist\",\"stats-operation-supported\",\"chart-type-series-axis-compatible\",\"comparison-period-complete\",\"comparison-metrics-supported\",\"gauge-scalar-contract\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.source\",\"chartDocument.source.options.limit\",\"chartDocument.source.options.comparisonPeriod\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"submissionImpact\":\"affects-remote-binding\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"queryContext.set\",\"title\":\"Set chart query context\",\"scope\":\"dataBinding\",\"targetKind\":\"queryContext\",\"target\":{\"kind\":\"queryContext\",\"resolver\":\"praxis-chart-query-context\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"filters\":{\"type\":\"object\"},\"filterExpression\":{\"type\":\"object\"},\"sort\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"limit\":{\"type\":\"number\"},\"page\":{\"type\":\"object\"},\"meta\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"queryContext\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"query-context-structured\",\"query-context-filter-expression-stats-unsupported\",\"query-context-fields-exist\",\"query-context-safe-values\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"queryContext\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"gauge.scale.configure\",\"title\":\"Configure gauge scale\",\"scope\":\"layout\",\"targetKind\":\"gaugeScale\",\"target\":{\"kind\":\"gaugeScale\",\"resolver\":\"x-ui-chart-gauge-scale\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"min\",\"max\"],\"properties\":{\"min\":{\"type\":\"number\"},\"max\":{\"type\":\"number\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument.gauge.scale\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"gauge-scale-valid\",\"gauge-scalar-contract\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.gauge.scale\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"chart-kind-gauge\"]}]}",
3848
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.4.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"axis.configure\",\"title\":\"Configure chart axis\",\"scope\":\"dataBinding\",\"targetKind\":\"axis\",\"target\":{\"kind\":\"axis\",\"resolver\":\"x-ui-chart-dimension-or-metric-axis\",\"ambiguityPolicy\":\"fail\",\"required\":true},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"dimensionField\":{\"type\":\"string\"},\"dimensionRole\":{\"enum\":[\"category\",\"series\",\"segment\",\"time\",\"value\"]},\"metricField\":{\"type\":\"string\"},\"metricAxis\":{\"enum\":[\"primary\",\"secondary\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-axis-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.kind\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\",\"availableFields[]\"],\"writes\":[\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\",\"chartDocument.orientation\"],\"identityKeys\":[\"chartDocument.dimensions[].field\",\"chartDocument.metrics[].field\"],\"inputSchema\":{\"type\":\"object\",\"properties\":{\"dimensionField\":{\"type\":\"string\"},\"dimensionRole\":{\"enum\":[\"category\",\"series\",\"segment\",\"time\",\"value\"]},\"metricField\":{\"type\":\"string\"},\"metricAxis\":{\"enum\":[\"primary\",\"secondary\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]}}},\"failureModes\":[\"field-not-in-catalog\",\"secondary-axis-non-combo\",\"missing-required-dimension\",\"axis-role-incompatible\"],\"description\":\"Configures dimensions and metric axes using semantic fields, preserving combo-only secondary axis constraints.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"axis-field-exists\",\"secondary-axis-combo-only\",\"cartesian-dimension-required\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.dimensions[]\",\"chartDocument.metrics[].axis\",\"chartDocument.orientation\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"data.resource.bind\",\"title\":\"Bind chart data resource\",\"scope\":\"dataBinding\",\"targetKind\":\"dataBinding\",\"target\":{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-source-and-field-catalog\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"sourceKind\"],\"properties\":{\"sourceKind\":{\"enum\":[\"praxis.stats\",\"derived\"]},\"resource\":{\"type\":\"string\",\"pattern\":\"^/(?!/)\"},\"operation\":{\"enum\":[\"group-by\",\"timeseries\",\"distribution\",\"comparison\"]},\"limit\":{\"type\":\"integer\",\"minimum\":1},\"comparisonPeriod\":{\"type\":\"object\",\"required\":[\"field\",\"timezone\",\"preset\",\"mode\"],\"properties\":{\"field\":{\"type\":\"string\"},\"timezone\":{\"type\":\"string\"},\"preset\":{\"enum\":[\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\"]},\"mode\":{\"enum\":[\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\"]}}},\"dimensions\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"role\":{\"type\":\"string\"},\"extraction\":{\"type\":\"string\"},\"alias\":{\"type\":\"string\"}}}},\"metrics\":{\"type\":\"array\",\"items\":{\"type\":\"object\",\"required\":[\"field\"],\"properties\":{\"field\":{\"type\":\"string\"},\"sourceField\":{\"type\":\"string\"},\"label\":{\"oneOf\":[{\"type\":\"string\"},{\"type\":\"object\"}]},\"aggregation\":{\"enum\":[\"sum\",\"avg\",\"min\",\"max\",\"count\",\"distinct-count\",\"avg-per-cycle-occurrence\"]},\"seriesKind\":{\"enum\":[\"bar\",\"line\",\"area\"]},\"axis\":{\"enum\":[\"primary\",\"secondary\"]},\"color\":{\"type\":\"string\"},\"format\":{\"type\":\"string\"},\"afterField\":{\"type\":\"string\"}}}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-data-resource-bind\",\"handlerContract\":{\"reads\":[\"availableResources[]\",\"availableFields[]\",\"chartDocument.source\",\"chartDocument.source.options.limit\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"writes\":[\"chartDocument.source\",\"chartDocument.source.options.limit\",\"chartDocument.source.options.comparisonPeriod\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"identityKeys\":[\"availableResources[].path\",\"availableFields[].field\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"sourceKind\"],\"properties\":{\"sourceKind\":{\"enum\":[\"praxis.stats\",\"derived\"]},\"resource\":{\"type\":\"string\",\"pattern\":\"^/(?!/)\"},\"operation\":{\"enum\":[\"group-by\",\"timeseries\",\"distribution\",\"comparison\"]},\"limit\":{\"type\":\"integer\",\"minimum\":1},\"comparisonPeriod\":{\"type\":\"object\",\"required\":[\"field\",\"timezone\",\"preset\",\"mode\"],\"properties\":{\"field\":{\"type\":\"string\"},\"timezone\":{\"type\":\"string\"},\"preset\":{\"enum\":[\"TODAY\",\"YESTERDAY\",\"LAST_7_DAYS\",\"LAST_30_DAYS\",\"THIS_MONTH\",\"LAST_MONTH\",\"THIS_QUARTER\",\"THIS_YEAR\"]},\"mode\":{\"enum\":[\"PREVIOUS_ALIGNED\",\"PREVIOUS_CALENDAR_PERIOD\"]}}},\"dimensions\":{\"type\":\"array\"},\"metrics\":{\"type\":\"array\"}}},\"failureModes\":[\"resource-not-in-api-metadata\",\"field-not-in-schema\",\"stats-operation-not-supported\",\"gauge-limit-required\",\"comparison-period-incomplete\",\"comparison-metric-unsupported\",\"remote-binding-incomplete\"],\"description\":\"Binds a derived or praxis.stats source using governed resource, capability and field catalogs. For praxis.stats, availableResources[].id is discovery-only: validation requires the matching availableResources[].path and compilation persists that path. Gauge bindings preserve the canonical scalar limit; comparison requires one canonical operation, metrics[] and an eligible period field.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"remote-resource-in-api-metadata\",\"bound-fields-exist\",\"stats-operation-supported\",\"chart-type-series-axis-compatible\",\"comparison-period-complete\",\"comparison-metrics-supported\",\"gauge-scalar-contract\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.source\",\"chartDocument.source.options.limit\",\"chartDocument.source.options.comparisonPeriod\",\"chartDocument.dimensions[]\",\"chartDocument.metrics[]\"],\"submissionImpact\":\"affects-remote-binding\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"queryContext.set\",\"title\":\"Set chart query context\",\"scope\":\"dataBinding\",\"targetKind\":\"queryContext\",\"target\":{\"kind\":\"queryContext\",\"resolver\":\"praxis-chart-query-context\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"properties\":{\"filters\":{\"type\":\"object\"},\"filterExpression\":{\"type\":\"object\"},\"sort\":{\"type\":\"array\",\"items\":{\"type\":\"string\"}},\"limit\":{\"type\":\"number\"},\"page\":{\"type\":\"object\"},\"meta\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"queryContext\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"query-context-structured\",\"query-context-filter-expression-stats-unsupported\",\"query-context-fields-exist\",\"query-context-safe-values\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"queryContext\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"gauge.scale.configure\",\"title\":\"Configure gauge scale\",\"scope\":\"layout\",\"targetKind\":\"gaugeScale\",\"target\":{\"kind\":\"gaugeScale\",\"resolver\":\"x-ui-chart-gauge-scale\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"min\",\"max\"],\"properties\":{\"min\":{\"type\":\"number\"},\"max\":{\"type\":\"number\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument.gauge.scale\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"gauge-scale-valid\",\"gauge-scalar-contract\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.gauge.scale\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\",\"chart-kind-gauge\"]}]}",
3778
3849
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
3779
- "contentHash": "f8d754acb8de75e8f2ee643d176b3a02d502f9e488c6192ea7f714d321c21fdc",
3850
+ "contentHash": "9cc0776cd4269e64849aa677a1958d32cf8c5999014427e1f7b9ad9bbc4c1059",
3780
3851
  "sourceKind": "component_definition",
3781
3852
  "sourceId": "praxis-chart",
3782
3853
  "corpusVersion": "1.0.0"