@praxisui/charts 9.0.25 → 9.0.27

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,12 +1,387 @@
1
1
  {
2
2
  "schemaVersion": "1.0.0",
3
- "generatedAt": "2026-08-26T20:18:42.419Z",
3
+ "generatedAt": "2026-08-28T01:18:20.814Z",
4
4
  "packageName": "@praxisui/charts",
5
- "packageVersion": "9.0.25",
5
+ "packageVersion": "9.0.27",
6
6
  "sourceRegistry": "praxis-component-registry-ingestion",
7
7
  "sourceRegistryVersion": "1.0.0",
8
- "componentCount": 2,
8
+ "componentCount": 3,
9
9
  "components": {
10
+ "praxis-analytics-presentation": {
11
+ "id": "praxis-analytics-presentation",
12
+ "description": "Alterna renderers elegíveis para uma projection x-ui.analytics selecionada por id, preservando o query context.",
13
+ "category": "table",
14
+ "inputs": [
15
+ {
16
+ "name": "analytics",
17
+ "type": "PraxisXUiAnalytics",
18
+ "required": false,
19
+ "description": "Contrato x-ui.analytics que contém a projection canônica.",
20
+ "default": {
21
+ "projections": [
22
+ {
23
+ "id": "analytics-presentation-sample",
24
+ "intent": "ranking",
25
+ "source": {
26
+ "kind": "praxis.stats",
27
+ "resource": "/api/sample",
28
+ "operation": "group-by"
29
+ },
30
+ "bindings": {
31
+ "primaryDimension": {
32
+ "field": "category",
33
+ "role": "category",
34
+ "label": "Categoria"
35
+ },
36
+ "primaryMetrics": [
37
+ {
38
+ "field": "value",
39
+ "aggregation": "sum",
40
+ "label": "Valor"
41
+ }
42
+ ]
43
+ },
44
+ "presentationHints": {
45
+ "preferredFamilies": [
46
+ "chart",
47
+ "analytic-table",
48
+ "kpi"
49
+ ]
50
+ }
51
+ }
52
+ ]
53
+ }
54
+ },
55
+ {
56
+ "name": "projectionId",
57
+ "type": "string",
58
+ "required": false,
59
+ "description": "Identidade exata da projection; labels não são usados para seleção.",
60
+ "default": "analytics-presentation-sample"
61
+ },
62
+ {
63
+ "name": "availableFamilies",
64
+ "type": "AnalyticsPresentationFamily[]",
65
+ "required": false,
66
+ "description": "Famílias autorizadas após capabilities e renderers instalados.",
67
+ "default": [
68
+ "chart",
69
+ "analytic-table",
70
+ "kpi"
71
+ ]
72
+ },
73
+ {
74
+ "name": "preferredFamily",
75
+ "type": "AnalyticsPresentationFamily | null",
76
+ "required": false,
77
+ "description": "Preferência persistida pelo host; a escolha temporária do usuário tem precedência.",
78
+ "default": null
79
+ },
80
+ {
81
+ "name": "queryContext",
82
+ "type": "PraxisDataQueryContext | null",
83
+ "required": false,
84
+ "description": "Contexto governado compartilhado por chart, analytic-table e KPI.",
85
+ "default": null
86
+ },
87
+ {
88
+ "name": "title",
89
+ "type": "PraxisTextValue",
90
+ "required": false,
91
+ "description": "Título compartilhado pelos renderers."
92
+ },
93
+ {
94
+ "name": "subtitle",
95
+ "type": "PraxisTextValue",
96
+ "required": false,
97
+ "description": "Subtítulo compartilhado pelos renderers."
98
+ },
99
+ {
100
+ "name": "enableCustomization",
101
+ "type": "boolean",
102
+ "required": false,
103
+ "description": "Habilita authoring interno do chart quando aplicável.",
104
+ "default": false
105
+ }
106
+ ],
107
+ "outputs": [
108
+ {
109
+ "name": "presentationChange",
110
+ "type": "PraxisAnalyticsPresentationChange",
111
+ "required": false,
112
+ "description": "Escolha temporária do usuário; o host decide se persiste."
113
+ },
114
+ {
115
+ "name": "pointClick",
116
+ "type": "PraxisChartPointEvent",
117
+ "required": false,
118
+ "description": "Evidência de ponto/linha preservada entre renderers."
119
+ },
120
+ {
121
+ "name": "pointAction",
122
+ "type": "PraxisChartPointActionEvent",
123
+ "required": false,
124
+ "description": "Ação configurada emitida pelo chart."
125
+ },
126
+ {
127
+ "name": "selectionChange",
128
+ "type": "PraxisChartSelectionEvent",
129
+ "required": false,
130
+ "description": "Seleção semântica emitida pelo chart."
131
+ },
132
+ {
133
+ "name": "drillDown",
134
+ "type": "PraxisChartDrillDownEvent",
135
+ "required": false,
136
+ "description": "Drill-down emitido pelo chart."
137
+ },
138
+ {
139
+ "name": "crossFilter",
140
+ "type": "PraxisChartCrossFilterEvent",
141
+ "required": false,
142
+ "description": "Cross-filter emitido pelo chart."
143
+ },
144
+ {
145
+ "name": "queryRequest",
146
+ "type": "PraxisChartQueryRequestEvent",
147
+ "required": false,
148
+ "description": "Observação da consulta remota do chart."
149
+ },
150
+ {
151
+ "name": "loadStateChange",
152
+ "type": "PraxisChartLoadState",
153
+ "required": false,
154
+ "description": "Estado de carga do chart."
155
+ }
156
+ ],
157
+ "configSchemaId": null,
158
+ "selector": "praxis-analytics-presentation",
159
+ "friendlyName": "Apresentação analítica governada",
160
+ "icon": "monitoring",
161
+ "tags": [
162
+ "analytics",
163
+ "chart",
164
+ "table",
165
+ "kpi",
166
+ "projection",
167
+ "dashboard"
168
+ ],
169
+ "lib": "@praxisui/charts",
170
+ "authoringManifestRef": {
171
+ "componentId": "praxis-analytics-presentation",
172
+ "version": "1.0.0",
173
+ "source": "PRAXIS_ANALYTICS_PRESENTATION_AUTHORING_MANIFEST"
174
+ },
175
+ "source": "projects/praxis-charts/src/lib/praxis-analytics-presentation.metadata.ts",
176
+ "exportName": "PRAXIS_ANALYTICS_PRESENTATION_COMPONENT_METADATA",
177
+ "authoringManifest": {
178
+ "schemaVersion": "1.0.0",
179
+ "componentId": "praxis-analytics-presentation",
180
+ "ownerPackage": "@praxisui/charts",
181
+ "configSchemaId": "PraxisAnalyticsPresentationInputs",
182
+ "manifestVersion": "1.0.0",
183
+ "runtimeInputs": [
184
+ {
185
+ "name": "analytics",
186
+ "type": "PraxisXUiAnalytics",
187
+ "description": "Canonical x-ui.analytics projections."
188
+ },
189
+ {
190
+ "name": "projectionId",
191
+ "type": "string",
192
+ "description": "Stable projection identity; labels never select projections."
193
+ },
194
+ {
195
+ "name": "availableFamilies",
196
+ "type": "AnalyticsPresentationFamily[]",
197
+ "description": "Capability- and host-authorized renderer families."
198
+ },
199
+ {
200
+ "name": "preferredFamily",
201
+ "type": "AnalyticsPresentationFamily | null",
202
+ "allowedValues": [
203
+ "chart",
204
+ "analytic-table",
205
+ "kpi"
206
+ ],
207
+ "description": "Persisted host preference. Temporary user choice remains runtime-only."
208
+ },
209
+ {
210
+ "name": "queryContext",
211
+ "type": "PraxisDataQueryContext | null",
212
+ "description": "Shared governed query context forwarded to the selected renderer."
213
+ }
214
+ ],
215
+ "editableTargets": [
216
+ {
217
+ "kind": "analyticsPresentationPreference",
218
+ "resolver": "component-config",
219
+ "description": "Persisted preferredFamily for the projection selected by exact projectionId."
220
+ }
221
+ ],
222
+ "operations": [
223
+ {
224
+ "operationId": "analytics.presentation.prefer-family",
225
+ "title": "Prefer analytics presentation family",
226
+ "description": "Persists a renderer-family preference without changing the canonical projection, bindings or query context.",
227
+ "scope": "global",
228
+ "targetKind": "analyticsPresentationPreference",
229
+ "target": {
230
+ "kind": "analyticsPresentationPreference",
231
+ "resolver": "component-config",
232
+ "ambiguityPolicy": "fail",
233
+ "required": false
234
+ },
235
+ "inputSchema": {
236
+ "type": "object",
237
+ "additionalProperties": false,
238
+ "required": [
239
+ "family"
240
+ ],
241
+ "properties": {
242
+ "family": {
243
+ "enum": [
244
+ "chart",
245
+ "analytic-table",
246
+ "kpi"
247
+ ]
248
+ }
249
+ }
250
+ },
251
+ "effects": [
252
+ {
253
+ "kind": "set-value",
254
+ "path": "preferredFamily",
255
+ "inputPath": "family"
256
+ }
257
+ ],
258
+ "destructive": false,
259
+ "requiresConfirmation": false,
260
+ "validators": [
261
+ "diagnostics-before-patch",
262
+ "renderer-supported",
263
+ "runtime-component-resolves"
264
+ ],
265
+ "affectedPaths": [
266
+ "preferredFamily"
267
+ ],
268
+ "submissionImpact": "visual-only",
269
+ "preconditions": [
270
+ "analytics-projection-resolved"
271
+ ]
272
+ }
273
+ ],
274
+ "validators": [
275
+ {
276
+ "validatorId": "diagnostics-before-patch",
277
+ "level": "error",
278
+ "code": "ANALYTICS_DIAGNOSTICS_BEFORE_PATCH",
279
+ "description": "Projection resolution and family eligibility diagnostics must be clear before changing the preference."
280
+ },
281
+ {
282
+ "validatorId": "renderer-supported",
283
+ "level": "error",
284
+ "code": "ANALYTICS_RENDERER_SUPPORTED",
285
+ "description": "The requested family must be a renderer supported by the component manifest."
286
+ },
287
+ {
288
+ "validatorId": "runtime-component-resolves",
289
+ "level": "error",
290
+ "code": "ANALYTICS_RUNTIME_COMPONENT_RESOLVES",
291
+ "description": "The analytics presentation runtime must be registered before persisting its preference."
292
+ }
293
+ ],
294
+ "roundTripRequirements": [
295
+ "Save and reopen must preserve preferredFamily without copying remote analytics results into the page document.",
296
+ "Changing preferredFamily must preserve analytics, projectionId and queryContext byte-for-byte.",
297
+ "Temporary user choice emitted by presentationChange must not mutate preferredFamily unless the host explicitly persists it."
298
+ ],
299
+ "presentationAffordances": {
300
+ "version": "1.0.0",
301
+ "componentId": "praxis-analytics-presentation",
302
+ "defaultTargetKind": "analyticsPresentationPreference",
303
+ "sourceRef": "AnalyticsPresentationResolver",
304
+ "affordances": [
305
+ {
306
+ "id": "analytics-presentation-family",
307
+ "targetKind": "analyticsPresentationPreference",
308
+ "category": "analytics-renderer",
309
+ "description": "Compatible presentation families resolved from the canonical projection and installed renderers.",
310
+ "options": [
311
+ "chart",
312
+ "analytic-table",
313
+ "kpi"
314
+ ],
315
+ "appliesToTypes": [
316
+ "PraxisXUiAnalytics"
317
+ ],
318
+ "unknownCompatible": false
319
+ }
320
+ ]
321
+ },
322
+ "examples": [
323
+ {
324
+ "id": "prefer-analytic-table",
325
+ "request": "Use the table presentation for projection supplier-procurement-funnel.",
326
+ "operationId": "analytics.presentation.prefer-family",
327
+ "params": {
328
+ "family": "analytic-table"
329
+ },
330
+ "isPositive": true
331
+ },
332
+ {
333
+ "id": "prefer-kpi",
334
+ "request": "Use the KPI presentation for projection supplier-procurement-funnel.",
335
+ "operationId": "analytics.presentation.prefer-family",
336
+ "params": {
337
+ "family": "kpi"
338
+ },
339
+ "isPositive": true
340
+ },
341
+ {
342
+ "id": "reject-summary-list-without-renderer",
343
+ "request": "Use summary-list even though no summary-list renderer is installed.",
344
+ "operationId": "analytics.presentation.prefer-family",
345
+ "params": {
346
+ "family": "summary-list"
347
+ },
348
+ "isPositive": false
349
+ }
350
+ ]
351
+ },
352
+ "chunks": [
353
+ {
354
+ "chunkIndex": 0,
355
+ "chunkKind": "summary",
356
+ "content": "Component ID: praxis-analytics-presentation\nSelector: praxis-analytics-presentation\nFriendly Name: Apresentação analítica governada\nDescription: Alterna renderers elegíveis para uma projection x-ui.analytics selecionada por id, preservando o query context.\nCategory: table\nLib/Package: @praxisui/charts\nTags: analytics, chart, table, kpi, projection, dashboard\nInputs:\n - analytics (PraxisXUiAnalytics)\n - projectionId (string)\n - availableFamilies (AnalyticsPresentationFamily[])\n - preferredFamily (AnalyticsPresentationFamily | null)\n - queryContext (PraxisDataQueryContext | null)\n - title (PraxisTextValue)\n - subtitle (PraxisTextValue)\n - enableCustomization (boolean)\nOutputs:\n - presentationChange (PraxisAnalyticsPresentationChange)\n - pointClick (PraxisChartPointEvent)\n - pointAction (PraxisChartPointActionEvent)\n - selectionChange (PraxisChartSelectionEvent)\n - drillDown (PraxisChartDrillDownEvent)\n - crossFilter (PraxisChartCrossFilterEvent)\n - queryRequest (PraxisChartQueryRequestEvent)\n - loadStateChange (PraxisChartLoadState)\n",
357
+ "sourcePointer": "projects/praxis-charts/src/lib/praxis-analytics-presentation.metadata.ts",
358
+ "contentHash": "75fc0184341d0922352d1587189cd3687a83c5ce258bb24d6cd6478f4bb5abb3",
359
+ "sourceKind": "component_definition",
360
+ "sourceId": "praxis-analytics-presentation",
361
+ "corpusVersion": "1.0.0"
362
+ },
363
+ {
364
+ "chunkIndex": 1,
365
+ "chunkKind": "authoring_manifest",
366
+ "content": "{\"operationId\":\"analytics.presentation.prefer-family\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.0.0\",\"componentId\":\"praxis-analytics-presentation\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisAnalyticsPresentationInputs\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Prefer analytics presentation family Persists a renderer-family preference without changing the canonical projection, bindings or query context. Effects: set-value. Use the table presentation for projection supplier-procurement-funnel. Use the KPI presentation for projection supplier-procurement-funnel. Use summary-list even though no summary-list renderer is installed.\",\"scope\":\"global\",\"target\":{\"kind\":\"analyticsPresentationPreference\",\"resolver\":\"component-config\",\"required\":false},\"inputContract\":{\"required\":[\"family\"],\"properties\":[\"family\"],\"semanticTerms\":[\"family\",\"chart\",\"analytic-table\",\"kpi\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"preferredFamily\"],\"validators\":[{\"validatorId\":\"diagnostics-before-patch\",\"level\":\"error\",\"code\":\"ANALYTICS_DIAGNOSTICS_BEFORE_PATCH\",\"description\":\"Projection resolution and family eligibility diagnostics must be clear before changing the preference.\"},{\"validatorId\":\"renderer-supported\",\"level\":\"error\",\"code\":\"ANALYTICS_RENDERER_SUPPORTED\",\"description\":\"The requested family must be a renderer supported by the component manifest.\"},{\"validatorId\":\"runtime-component-resolves\",\"level\":\"error\",\"code\":\"ANALYTICS_RUNTIME_COMPONENT_RESOLVES\",\"description\":\"The analytics presentation runtime must be registered before persisting its preference.\"}],\"preconditions\":[\"analytics-projection-resolved\"],\"submissionImpact\":\"visual-only\",\"presentationAffordances\":[{\"id\":\"analytics-presentation-family\",\"targetKind\":\"analyticsPresentationPreference\",\"category\":\"analytics-renderer\",\"description\":\"Compatible presentation families resolved from the canonical projection and installed renderers.\",\"options\":[\"chart\",\"analytic-table\",\"kpi\"],\"appliesToTypes\":[\"PraxisXUiAnalytics\"],\"unknownCompatible\":false}],\"positiveExamples\":[{\"id\":\"prefer-analytic-table\",\"request\":\"Use the table presentation for projection supplier-procurement-funnel.\",\"operationId\":\"analytics.presentation.prefer-family\",\"params\":{\"family\":\"analytic-table\"},\"isPositive\":true},{\"id\":\"prefer-kpi\",\"request\":\"Use the KPI presentation for projection supplier-procurement-funnel.\",\"operationId\":\"analytics.presentation.prefer-family\",\"params\":{\"family\":\"kpi\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-summary-list-without-renderer\",\"request\":\"Use summary-list even though no summary-list renderer is installed.\",\"operationId\":\"analytics.presentation.prefer-family\",\"params\":{\"family\":\"summary-list\"},\"isPositive\":false}]}",
367
+ "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-analytics-presentation-authoring-manifest.ts",
368
+ "contentHash": "d208ed086c8ce6161e022a3e06b8a6182d4f8dc508c9775cb3189a36c37d1215",
369
+ "sourceKind": "component_definition",
370
+ "sourceId": "praxis-analytics-presentation",
371
+ "corpusVersion": "1.0.0"
372
+ },
373
+ {
374
+ "chunkIndex": 2,
375
+ "chunkKind": "authoring_manifest",
376
+ "content": "{\"schemaVersion\":\"1.0.0\",\"componentId\":\"praxis-analytics-presentation\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisAnalyticsPresentationInputs\",\"manifestVersion\":\"1.0.0\",\"runtimeInputs\":[{\"name\":\"analytics\",\"type\":\"PraxisXUiAnalytics\",\"description\":\"Canonical x-ui.analytics projections.\"},{\"name\":\"projectionId\",\"type\":\"string\",\"description\":\"Stable projection identity; labels never select projections.\"},{\"name\":\"availableFamilies\",\"type\":\"AnalyticsPresentationFamily[]\",\"description\":\"Capability- and host-authorized renderer families.\"},{\"name\":\"preferredFamily\",\"type\":\"AnalyticsPresentationFamily | null\",\"allowedValues\":[\"chart\",\"analytic-table\",\"kpi\"],\"description\":\"Persisted host preference. Temporary user choice remains runtime-only.\"},{\"name\":\"queryContext\",\"type\":\"PraxisDataQueryContext | null\",\"description\":\"Shared governed query context forwarded to the selected renderer.\"}],\"editableTargets\":[{\"kind\":\"analyticsPresentationPreference\",\"resolver\":\"component-config\",\"description\":\"Persisted preferredFamily for the projection selected by exact projectionId.\"}],\"operations\":[{\"operationId\":\"analytics.presentation.prefer-family\",\"title\":\"Prefer analytics presentation family\",\"description\":\"Persists a renderer-family preference without changing the canonical projection, bindings or query context.\",\"scope\":\"global\",\"targetKind\":\"analyticsPresentationPreference\",\"target\":{\"kind\":\"analyticsPresentationPreference\",\"resolver\":\"component-config\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"additionalProperties\":false,\"required\":[\"family\"],\"properties\":{\"family\":{\"enum\":[\"chart\",\"analytic-table\",\"kpi\"]}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"preferredFamily\",\"inputPath\":\"family\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"diagnostics-before-patch\",\"renderer-supported\",\"runtime-component-resolves\"],\"affectedPaths\":[\"preferredFamily\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"analytics-projection-resolved\"]}],\"validators\":[{\"validatorId\":\"diagnostics-before-patch\",\"level\":\"error\",\"code\":\"ANALYTICS_DIAGNOSTICS_BEFORE_PATCH\",\"description\":\"Projection resolution and family eligibility diagnostics must be clear before changing the preference.\"},{\"validatorId\":\"renderer-supported\",\"level\":\"error\",\"code\":\"ANALYTICS_RENDERER_SUPPORTED\",\"description\":\"The requested family must be a renderer supported by the component manifest.\"},{\"validatorId\":\"runtime-component-resolves\",\"level\":\"error\",\"code\":\"ANALYTICS_RUNTIME_COMPONENT_RESOLVES\",\"description\":\"The analytics presentation runtime must be registered before persisting its preference.\"}],\"roundTripRequirements\":[\"Save and reopen must preserve preferredFamily without copying remote analytics results into the page document.\",\"Changing preferredFamily must preserve analytics, projectionId and queryContext byte-for-byte.\",\"Temporary user choice emitted by presentationChange must not mutate preferredFamily unless the host explicitly persists it.\"],\"presentationAffordances\":{\"version\":\"1.0.0\",\"componentId\":\"praxis-analytics-presentation\",\"defaultTargetKind\":\"analyticsPresentationPreference\",\"sourceRef\":\"AnalyticsPresentationResolver\",\"affordances\":[{\"id\":\"analytics-presentation-family\",\"targetKind\":\"analyticsPresentationPreference\",\"category\":\"analytics-renderer\",\"description\":\"Compatible presentation families resolved from the canonical projection and installed renderers.\",\"options\":[\"chart\",\"analytic-table\",\"kpi\"],\"appliesToTypes\":[\"PraxisXUiAnalytics\"],\"unknownCompatible\":false}]},\"examples\":[{\"id\":\"prefer-analytic-table\",\"request\":\"Use the table presentation for projection supplier-procurement-funnel.\",\"operationId\":\"analytics.presentation.prefer-family\",\"params\":{\"family\":\"analytic-table\"},\"isPositive\":true},{\"id\":\"prefer-kpi\",\"request\":\"Use the KPI presentation for projection supplier-procurement-funnel.\",\"operationId\":\"analytics.presentation.prefer-family\",\"params\":{\"family\":\"kpi\"},\"isPositive\":true},{\"id\":\"reject-summary-list-without-renderer\",\"request\":\"Use summary-list even though no summary-list renderer is installed.\",\"operationId\":\"analytics.presentation.prefer-family\",\"params\":{\"family\":\"summary-list\"},\"isPositive\":false}]}",
377
+ "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-analytics-presentation-authoring-manifest.ts",
378
+ "contentHash": "964309b73beced7bff1fbf223a3cc5b0d529be35dbcdd2670afdf9c7ea5bf56d",
379
+ "sourceKind": "component_definition",
380
+ "sourceId": "praxis-analytics-presentation",
381
+ "corpusVersion": "1.0.0"
382
+ }
383
+ ]
384
+ },
10
385
  "praxis-chart": {
11
386
  "id": "praxis-chart",
12
387
  "description": "Chart component for analytics and metadata-driven visualizations in Praxis UI.",
@@ -502,7 +877,7 @@
502
877
  "componentId": "praxis-chart",
503
878
  "ownerPackage": "@praxisui/charts",
504
879
  "configSchemaId": "PraxisXUiChartContract",
505
- "manifestVersion": "1.1.0",
880
+ "manifestVersion": "1.2.0",
506
881
  "runtimeInputs": [
507
882
  {
508
883
  "name": "chartDocument",
@@ -631,7 +1006,9 @@
631
1006
  "area",
632
1007
  "stacked-bar",
633
1008
  "stacked-area",
634
- "scatter"
1009
+ "scatter",
1010
+ "funnel",
1011
+ "pyramid"
635
1012
  ]
636
1013
  },
637
1014
  "chartId": {
@@ -789,7 +1166,9 @@
789
1166
  "area",
790
1167
  "stacked-bar",
791
1168
  "stacked-area",
792
- "scatter"
1169
+ "scatter",
1170
+ "funnel",
1171
+ "pyramid"
793
1172
  ]
794
1173
  },
795
1174
  "orientation": {
@@ -811,7 +1190,7 @@
811
1190
  "validators": [
812
1191
  "chart-type-supported",
813
1192
  "chart-type-series-axis-compatible",
814
- "pie-single-metric",
1193
+ "category-slice-single-metric",
815
1194
  "combo-minimum-series",
816
1195
  "editor-runtime-round-trip"
817
1196
  ],
@@ -2018,10 +2397,10 @@
2018
2397
  "description": "Chart kind, dimensions, metrics and axes must be compatible."
2019
2398
  },
2020
2399
  {
2021
- "validatorId": "pie-single-metric",
2400
+ "validatorId": "category-slice-single-metric",
2022
2401
  "level": "error",
2023
- "code": "PIE_SINGLE_METRIC",
2024
- "description": "Pie and donut charts support a single metric."
2402
+ "code": "CATEGORY_SLICE_SINGLE_METRIC",
2403
+ "description": "Pie, donut, funnel and pyramid charts require exactly one metric."
2025
2404
  },
2026
2405
  {
2027
2406
  "validatorId": "combo-minimum-series",
@@ -2437,9 +2816,9 @@
2437
2816
  {
2438
2817
  "chunkIndex": 1,
2439
2818
  "chunkKind": "authoring_manifest",
2440
- "content": "{\"operationId\":\"chart.document.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\",\"events\"],\"semanticTerms\":[\"version\",\"kind\",\"chartId\",\"title\",\"subtitle\",\"source\",\"dimensions\",\"metrics\",\"events\",\"0.1.0\",\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"source.kind\",\"source.resource\",\"source.operation\",\"source.options\",\"praxis.stats\",\"derived\",\"group-by\",\"timeseries\",\"distribution\",\"comparison\",\"source.options.comparisonPeriod\",\"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\"]},\"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\":\"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\":[]}",
2819
+ "content": "{\"operationId\":\"chart.document.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.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\",\"events\"],\"semanticTerms\":[\"version\",\"kind\",\"chartId\",\"title\",\"subtitle\",\"source\",\"dimensions\",\"metrics\",\"events\",\"0.1.0\",\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"source.kind\",\"source.resource\",\"source.operation\",\"source.options\",\"praxis.stats\",\"derived\",\"group-by\",\"timeseries\",\"distribution\",\"comparison\",\"source.options.comparisonPeriod\",\"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\"]},\"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\":\"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\":[]}",
2441
2820
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2442
- "contentHash": "a895ab1d26033523020a3ec5feafd87b93af43774fcb21e9fb39753486e882f5",
2821
+ "contentHash": "6faac5ef0b408dd65aa12b686b5eed32eaa4aa3b8601140749ddeb46e75949d3",
2443
2822
  "sourceKind": "component_definition",
2444
2823
  "sourceId": "praxis-chart",
2445
2824
  "corpusVersion": "1.0.0"
@@ -2447,9 +2826,9 @@
2447
2826
  {
2448
2827
  "chunkIndex": 2,
2449
2828
  "chunkKind": "authoring_manifest",
2450
- "content": "{\"operationId\":\"chart.type.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\"],\"semanticTerms\":[\"kind\",\"orientation\",\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"vertical\",\"horizontal\"]},\"effects\":[\"merge-object\"],\"affectedPaths\":[\"chartDocument.kind\",\"chartDocument.orientation\",\"chartDocument.metrics[]\",\"chartDocument.dimensions[]\"],\"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\":\"pie-single-metric\",\"level\":\"error\",\"code\":\"PIE_SINGLE_METRIC\",\"description\":\"Pie and donut charts support a single metric.\"},{\"validatorId\":\"combo-minimum-series\",\"level\":\"error\",\"code\":\"COMBO_MINIMUM_SERIES\",\"description\":\"Combo charts require at least two metrics.\"},{\"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\":[]}",
2829
+ "content": "{\"operationId\":\"chart.type.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.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\"],\"semanticTerms\":[\"kind\",\"orientation\",\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\",\"vertical\",\"horizontal\"]},\"effects\":[\"merge-object\"],\"affectedPaths\":[\"chartDocument.kind\",\"chartDocument.orientation\",\"chartDocument.metrics[]\",\"chartDocument.dimensions[]\"],\"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 and pyramid charts require exactly one metric.\"},{\"validatorId\":\"combo-minimum-series\",\"level\":\"error\",\"code\":\"COMBO_MINIMUM_SERIES\",\"description\":\"Combo charts require at least two metrics.\"},{\"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\":[]}",
2451
2830
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2452
- "contentHash": "5b29a91d73804fc724e5a67e97c4fa7c5e084d0515e840eca9d8c233a971387d",
2831
+ "contentHash": "1c83fe5a705156a8cdfebb931996ad82a5d3ba174e017237e282bec2f6532b17",
2453
2832
  "sourceKind": "component_definition",
2454
2833
  "sourceId": "praxis-chart",
2455
2834
  "corpusVersion": "1.0.0"
@@ -2457,9 +2836,9 @@
2457
2836
  {
2458
2837
  "chunkIndex": 3,
2459
2838
  "chunkKind": "authoring_manifest",
2460
- "content": "{\"operationId\":\"series.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\":\"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\":[]}",
2839
+ "content": "{\"operationId\":\"series.add\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.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\":\"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\":[]}",
2461
2840
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2462
- "contentHash": "e51af6df1bfa5436394cfb5b9271de9d1093e15bdf6ccace9dc1226b12df6cf2",
2841
+ "contentHash": "4a2ff273eebab60ee31a3467a5be1125aab688c64cc97086e9ca3ab3ae751a6e",
2463
2842
  "sourceKind": "component_definition",
2464
2843
  "sourceId": "praxis-chart",
2465
2844
  "corpusVersion": "1.0.0"
@@ -2467,9 +2846,9 @@
2467
2846
  {
2468
2847
  "chunkIndex": 4,
2469
2848
  "chunkKind": "authoring_manifest",
2470
- "content": "{\"operationId\":\"series.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove chart series Effects: remove-by-key. Remove the old cost series. Remove total when more than one chart series resolves to total.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"required\":true},\"inputContract\":{\"required\":[\"field\"],\"properties\":[\"field\",\"replacementField\"],\"semanticTerms\":[\"field\",\"replacementField\"]},\"effects\":[\"remove-by-key\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"validators\":[{\"validatorId\":\"series-exists\",\"level\":\"error\",\"code\":\"SERIES_EXISTS\",\"description\":\"Series removal target must exist.\"},{\"validatorId\":\"destructive-series-removal-confirmed\",\"level\":\"error\",\"code\":\"DESTRUCTIVE_SERIES_REMOVAL_CONFIRMED\",\"description\":\"Removing a series requires explicit confirmation.\"},{\"validatorId\":\"chart-keeps-required-metric\",\"level\":\"error\",\"code\":\"CHART_KEEPS_REQUIRED_METRIC\",\"description\":\"A chart cannot be left without required metrics.\"},{\"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\",\"target-series-exists\",\"confirmation-collected\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"remove-old-series\",\"request\":\"Remove the old cost series.\",\"operationId\":\"series.remove\",\"target\":\"cost\",\"params\":{\"field\":\"cost\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-ambiguous-series-target\",\"request\":\"Remove total when more than one chart series resolves to total.\",\"operationId\":\"series.remove\",\"target\":\"total\",\"params\":{\"field\":\"total\"},\"isPositive\":false}]}",
2849
+ "content": "{\"operationId\":\"series.remove\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Remove chart series Effects: remove-by-key. Remove the old cost series. Remove total when more than one chart series resolves to total.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"required\":true},\"inputContract\":{\"required\":[\"field\"],\"properties\":[\"field\",\"replacementField\"],\"semanticTerms\":[\"field\",\"replacementField\"]},\"effects\":[\"remove-by-key\"],\"affectedPaths\":[\"chartDocument.metrics[]\"],\"validators\":[{\"validatorId\":\"series-exists\",\"level\":\"error\",\"code\":\"SERIES_EXISTS\",\"description\":\"Series removal target must exist.\"},{\"validatorId\":\"destructive-series-removal-confirmed\",\"level\":\"error\",\"code\":\"DESTRUCTIVE_SERIES_REMOVAL_CONFIRMED\",\"description\":\"Removing a series requires explicit confirmation.\"},{\"validatorId\":\"chart-keeps-required-metric\",\"level\":\"error\",\"code\":\"CHART_KEEPS_REQUIRED_METRIC\",\"description\":\"A chart cannot be left without required metrics.\"},{\"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\",\"target-series-exists\",\"confirmation-collected\"],\"submissionImpact\":\"config-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"remove-old-series\",\"request\":\"Remove the old cost series.\",\"operationId\":\"series.remove\",\"target\":\"cost\",\"params\":{\"field\":\"cost\"},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-ambiguous-series-target\",\"request\":\"Remove total when more than one chart series resolves to total.\",\"operationId\":\"series.remove\",\"target\":\"total\",\"params\":{\"field\":\"total\"},\"isPositive\":false}]}",
2471
2850
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2472
- "contentHash": "0351fc6af80d7fc17f890e2a86c7fa8f8e12309666880fde93785eb9f355d3f7",
2851
+ "contentHash": "803d7eecc411e29fe9f916253bf1e5f970232416d590130acb558f1c4791a562",
2473
2852
  "sourceKind": "component_definition",
2474
2853
  "sourceId": "praxis-chart",
2475
2854
  "corpusVersion": "1.0.0"
@@ -2477,9 +2856,9 @@
2477
2856
  {
2478
2857
  "chunkIndex": 5,
2479
2858
  "chunkKind": "authoring_manifest",
2480
- "content": "{\"operationId\":\"axis.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart axis Effects: compile-domain-patch. Put margin on a secondary axis for the combo chart.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"axis\",\"resolver\":\"x-ui-chart-dimension-or-metric-axis\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"dimensionField\",\"dimensionRole\",\"metricField\",\"metricAxis\",\"orientation\"],\"semanticTerms\":[\"dimensionField\",\"dimensionRole\",\"metricField\",\"metricAxis\",\"orientation\",\"category\",\"series\",\"segment\",\"time\",\"value\",\"primary\",\"secondary\",\"vertical\",\"horizontal\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.dimensions[]\",\"chartDocument.metrics[].axis\",\"chartDocument.orientation\"],\"validators\":[{\"validatorId\":\"axis-field-exists\",\"level\":\"error\",\"code\":\"AXIS_FIELD_EXISTS\",\"description\":\"Axis/dimension fields must exist in availableFields or schema context.\"},{\"validatorId\":\"secondary-axis-combo-only\",\"level\":\"error\",\"code\":\"SECONDARY_AXIS_COMBO_ONLY\",\"description\":\"Secondary axis is supported only for combo charts.\"},{\"validatorId\":\"cartesian-dimension-required\",\"level\":\"error\",\"code\":\"CARTESIAN_DIMENSION_REQUIRED\",\"description\":\"Cartesian charts require at least one dimension.\"},{\"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\":\"configure-secondary-axis\",\"request\":\"Put margin on a secondary axis for the combo chart.\",\"operationId\":\"axis.configure\",\"params\":{\"metricField\":\"margin\",\"metricAxis\":\"secondary\"},\"isPositive\":true}],\"negativeExamples\":[]}",
2859
+ "content": "{\"operationId\":\"axis.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart axis Effects: compile-domain-patch. Put margin on a secondary axis for the combo chart.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"axis\",\"resolver\":\"x-ui-chart-dimension-or-metric-axis\",\"required\":true},\"inputContract\":{\"required\":[],\"properties\":[\"dimensionField\",\"dimensionRole\",\"metricField\",\"metricAxis\",\"orientation\"],\"semanticTerms\":[\"dimensionField\",\"dimensionRole\",\"metricField\",\"metricAxis\",\"orientation\",\"category\",\"series\",\"segment\",\"time\",\"value\",\"primary\",\"secondary\",\"vertical\",\"horizontal\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.dimensions[]\",\"chartDocument.metrics[].axis\",\"chartDocument.orientation\"],\"validators\":[{\"validatorId\":\"axis-field-exists\",\"level\":\"error\",\"code\":\"AXIS_FIELD_EXISTS\",\"description\":\"Axis/dimension fields must exist in availableFields or schema context.\"},{\"validatorId\":\"secondary-axis-combo-only\",\"level\":\"error\",\"code\":\"SECONDARY_AXIS_COMBO_ONLY\",\"description\":\"Secondary axis is supported only for combo charts.\"},{\"validatorId\":\"cartesian-dimension-required\",\"level\":\"error\",\"code\":\"CARTESIAN_DIMENSION_REQUIRED\",\"description\":\"Cartesian charts require at least one dimension.\"},{\"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\":\"configure-secondary-axis\",\"request\":\"Put margin on a secondary axis for the combo chart.\",\"operationId\":\"axis.configure\",\"params\":{\"metricField\":\"margin\",\"metricAxis\":\"secondary\"},\"isPositive\":true}],\"negativeExamples\":[]}",
2481
2860
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2482
- "contentHash": "8b9ae691f0a3fe1147519e4d47c161a49a85a760b74d04fd5d62ec5b3dd94255",
2861
+ "contentHash": "398bd117f73087b29a90fdbac91a43e0af51947b52a38c176c104ba1ab64a6f3",
2483
2862
  "sourceKind": "component_definition",
2484
2863
  "sourceId": "praxis-chart",
2485
2864
  "corpusVersion": "1.0.0"
@@ -2487,9 +2866,9 @@
2487
2866
  {
2488
2867
  "chunkIndex": 6,
2489
2868
  "chunkKind": "authoring_manifest",
2490
- "content": "{\"operationId\":\"data.resource.bind\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\",\"comparisonPeriod\",\"dimensions\",\"metrics\"],\"semanticTerms\":[\"sourceKind\",\"resource\",\"operation\",\"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.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\":\"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\":\"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}]}",
2869
+ "content": "{\"operationId\":\"data.resource.bind\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.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\",\"comparisonPeriod\",\"dimensions\",\"metrics\"],\"semanticTerms\":[\"sourceKind\",\"resource\",\"operation\",\"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.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\":\"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\":\"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}]}",
2491
2870
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2492
- "contentHash": "b1b985542c4a36a148674cc5cf41007e2b093e96b99ffcfe1550c24392160a5e",
2871
+ "contentHash": "cf71b7f0b53d85de9e86e39991d3b8e9484fdc69eacc8dd7e069f87a7629194e",
2493
2872
  "sourceKind": "component_definition",
2494
2873
  "sourceId": "praxis-chart",
2495
2874
  "corpusVersion": "1.0.0"
@@ -2497,9 +2876,9 @@
2497
2876
  {
2498
2877
  "chunkIndex": 7,
2499
2878
  "chunkKind": "authoring_manifest",
2500
- "content": "{\"operationId\":\"queryContext.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set chart query context Effects: set-value. Limit the chart to active employees and sort by total descending.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"queryContext\",\"resolver\":\"praxis-chart-query-context\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"filters\",\"filterExpression\",\"sort\",\"limit\",\"page\",\"meta\"],\"semanticTerms\":[\"filters\",\"filterExpression\",\"sort\",\"limit\",\"page\",\"meta\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"queryContext\"],\"validators\":[{\"validatorId\":\"query-context-structured\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_STRUCTURED\",\"description\":\"queryContext must use the canonical @praxisui/core structure for filters, filterExpression, sort, limit, page and meta.\"},{\"validatorId\":\"query-context-filter-expression-stats-unsupported\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_FILTER_EXPRESSION_STATS_UNSUPPORTED\",\"description\":\"praxis.stats currently executes only flat queryContext.filters; governed filterExpression must be preserved for diagnostics and rejected until backend expression support is declared.\"},{\"validatorId\":\"query-context-fields-exist\",\"level\":\"warning\",\"code\":\"QUERY_CONTEXT_FIELDS_EXIST\",\"description\":\"queryContext filter fields should exist in the schema/data context.\"},{\"validatorId\":\"query-context-safe-values\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_SAFE_VALUES\",\"description\":\"queryContext values must be serializable safe data.\"},{\"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-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-query-context\",\"request\":\"Limit the chart to active employees and sort by total descending.\",\"operationId\":\"queryContext.set\",\"params\":{\"filters\":{\"status\":\"ACTIVE\"},\"sort\":[\"total,desc\"],\"limit\":10},\"isPositive\":true}],\"negativeExamples\":[]}",
2879
+ "content": "{\"operationId\":\"queryContext.set\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Set chart query context Effects: set-value. Limit the chart to active employees and sort by total descending.\",\"scope\":\"dataBinding\",\"target\":{\"kind\":\"queryContext\",\"resolver\":\"praxis-chart-query-context\",\"required\":false},\"inputContract\":{\"required\":[],\"properties\":[\"filters\",\"filterExpression\",\"sort\",\"limit\",\"page\",\"meta\"],\"semanticTerms\":[\"filters\",\"filterExpression\",\"sort\",\"limit\",\"page\",\"meta\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"queryContext\"],\"validators\":[{\"validatorId\":\"query-context-structured\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_STRUCTURED\",\"description\":\"queryContext must use the canonical @praxisui/core structure for filters, filterExpression, sort, limit, page and meta.\"},{\"validatorId\":\"query-context-filter-expression-stats-unsupported\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_FILTER_EXPRESSION_STATS_UNSUPPORTED\",\"description\":\"praxis.stats currently executes only flat queryContext.filters; governed filterExpression must be preserved for diagnostics and rejected until backend expression support is declared.\"},{\"validatorId\":\"query-context-fields-exist\",\"level\":\"warning\",\"code\":\"QUERY_CONTEXT_FIELDS_EXIST\",\"description\":\"queryContext filter fields should exist in the schema/data context.\"},{\"validatorId\":\"query-context-safe-values\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_SAFE_VALUES\",\"description\":\"queryContext values must be serializable safe data.\"},{\"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-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"set-query-context\",\"request\":\"Limit the chart to active employees and sort by total descending.\",\"operationId\":\"queryContext.set\",\"params\":{\"filters\":{\"status\":\"ACTIVE\"},\"sort\":[\"total,desc\"],\"limit\":10},\"isPositive\":true}],\"negativeExamples\":[]}",
2501
2880
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2502
- "contentHash": "20e8b3f6814614eb6fc695045e044d82d7deddfe3d972198a2997e23f2e99d17",
2881
+ "contentHash": "137ab3c245e031cb8af075b3b87e6f338d1a469deb99eecf50e8a3bf839525b8",
2503
2882
  "sourceKind": "component_definition",
2504
2883
  "sourceId": "praxis-chart",
2505
2884
  "corpusVersion": "1.0.0"
@@ -2507,9 +2886,9 @@
2507
2886
  {
2508
2887
  "chunkIndex": 8,
2509
2888
  "chunkKind": "authoring_manifest",
2510
- "content": "{\"operationId\":\"pointClick.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart point click Effects: compile-domain-patch.\",\"scope\":\"eventMapping\",\"target\":{\"kind\":\"pointClick\",\"resolver\":\"x-ui-chart-events-point-click\",\"required\":false},\"inputContract\":{\"required\":[\"action\"],\"properties\":[\"action\",\"target\",\"mapping\"],\"semanticTerms\":[\"action\",\"target\",\"mapping\",\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.events.pointClick\"],\"validators\":[{\"validatorId\":\"point-click-action-structured\",\"level\":\"error\",\"code\":\"POINT_CLICK_ACTION_STRUCTURED\",\"description\":\"Configured pointClick actions must be emitted through pointAction while pointClick remains raw point evidence.\"},{\"validatorId\":\"event-target-governed\",\"level\":\"error\",\"code\":\"EVENT_TARGET_GOVERNED\",\"description\":\"Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"validatorId\":\"event-action-supported\",\"level\":\"error\",\"code\":\"EVENT_ACTION_SUPPORTED\",\"description\":\"Event action must be one of the supported structured action kinds.\"},{\"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-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
2889
+ "content": "{\"operationId\":\"pointClick.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart point click Effects: compile-domain-patch.\",\"scope\":\"eventMapping\",\"target\":{\"kind\":\"pointClick\",\"resolver\":\"x-ui-chart-events-point-click\",\"required\":false},\"inputContract\":{\"required\":[\"action\"],\"properties\":[\"action\",\"target\",\"mapping\"],\"semanticTerms\":[\"action\",\"target\",\"mapping\",\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.events.pointClick\"],\"validators\":[{\"validatorId\":\"point-click-action-structured\",\"level\":\"error\",\"code\":\"POINT_CLICK_ACTION_STRUCTURED\",\"description\":\"Configured pointClick actions must be emitted through pointAction while pointClick remains raw point evidence.\"},{\"validatorId\":\"event-target-governed\",\"level\":\"error\",\"code\":\"EVENT_TARGET_GOVERNED\",\"description\":\"Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"validatorId\":\"event-action-supported\",\"level\":\"error\",\"code\":\"EVENT_ACTION_SUPPORTED\",\"description\":\"Event action must be one of the supported structured action kinds.\"},{\"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-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[],\"negativeExamples\":[]}",
2511
2890
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2512
- "contentHash": "eed9b338749b7d2488a93c6615dd25bba7f9c54b7f6692235503a31bb27b5f6a",
2891
+ "contentHash": "5e728512774882f35caddcca3f6b399454df20c6cb8de0ecc41473099986e0da",
2513
2892
  "sourceKind": "component_definition",
2514
2893
  "sourceId": "praxis-chart",
2515
2894
  "corpusVersion": "1.0.0"
@@ -2517,9 +2896,9 @@
2517
2896
  {
2518
2897
  "chunkIndex": 9,
2519
2898
  "chunkKind": "authoring_manifest",
2520
- "content": "{\"operationId\":\"crossFilter.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart cross-filter Effects: compile-domain-patch. Use selected department to filter the employee table. Use the governed department bucket identity to filter the employee table.\",\"scope\":\"eventMapping\",\"target\":{\"kind\":\"crossFilter\",\"resolver\":\"x-ui-chart-events-cross-filter\",\"required\":false},\"inputContract\":{\"required\":[\"action\"],\"properties\":[\"action\",\"target\",\"mapping\"],\"semanticTerms\":[\"action\",\"target\",\"mapping\",\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.events.crossFilter\"],\"validators\":[{\"validatorId\":\"cross-filter-output-structured\",\"level\":\"error\",\"code\":\"CROSS_FILTER_OUTPUT_STRUCTURED\",\"description\":\"Cross-filter output must be structured as query-context filters.\"},{\"validatorId\":\"event-target-governed\",\"level\":\"error\",\"code\":\"EVENT_TARGET_GOVERNED\",\"description\":\"Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"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-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-cross-filter\",\"request\":\"Use selected department to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true},{\"id\":\"configure-stats-key-cross-filter\",\"request\":\"Use the governed department bucket identity to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"key\":\"departmentIdsIn\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
2899
+ "content": "{\"operationId\":\"crossFilter.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart cross-filter Effects: compile-domain-patch. Use selected department to filter the employee table. Use the governed department bucket identity to filter the employee table.\",\"scope\":\"eventMapping\",\"target\":{\"kind\":\"crossFilter\",\"resolver\":\"x-ui-chart-events-cross-filter\",\"required\":false},\"inputContract\":{\"required\":[\"action\"],\"properties\":[\"action\",\"target\",\"mapping\"],\"semanticTerms\":[\"action\",\"target\",\"mapping\",\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.events.crossFilter\"],\"validators\":[{\"validatorId\":\"cross-filter-output-structured\",\"level\":\"error\",\"code\":\"CROSS_FILTER_OUTPUT_STRUCTURED\",\"description\":\"Cross-filter output must be structured as query-context filters.\"},{\"validatorId\":\"event-target-governed\",\"level\":\"error\",\"code\":\"EVENT_TARGET_GOVERNED\",\"description\":\"Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"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-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-cross-filter\",\"request\":\"Use selected department to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true},{\"id\":\"configure-stats-key-cross-filter\",\"request\":\"Use the governed department bucket identity to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"key\":\"departmentIdsIn\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
2521
2900
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2522
- "contentHash": "45b2594fb67b35ce5c73771ddae7a8a8410b9b73132f07537f6e22d47b39ef7a",
2901
+ "contentHash": "b4bd782c24e28724ddb6b4e12fa8a2eb7ed55d73743f000e0599b25249febef6",
2523
2902
  "sourceKind": "component_definition",
2524
2903
  "sourceId": "praxis-chart",
2525
2904
  "corpusVersion": "1.0.0"
@@ -2527,9 +2906,9 @@
2527
2906
  {
2528
2907
  "chunkIndex": 10,
2529
2908
  "chunkKind": "authoring_manifest",
2530
- "content": "{\"operationId\":\"drilldown.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart drilldown Effects: compile-domain-patch. Open the department detail when a point is clicked. Navigate to javascript:alert(1) on drilldown.\",\"scope\":\"eventMapping\",\"target\":{\"kind\":\"drilldown\",\"resolver\":\"x-ui-chart-events-drill-down\",\"required\":false},\"inputContract\":{\"required\":[\"action\"],\"properties\":[\"action\",\"target\",\"mapping\"],\"semanticTerms\":[\"action\",\"target\",\"mapping\",\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.events.drillDown\"],\"validators\":[{\"validatorId\":\"drilldown-target-governed\",\"level\":\"error\",\"code\":\"DRILLDOWN_TARGET_GOVERNED\",\"description\":\"Drilldown target must be a governed route or widget target.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"validatorId\":\"event-action-supported\",\"level\":\"error\",\"code\":\"EVENT_ACTION_SUPPORTED\",\"description\":\"Event action must be one of the supported structured action kinds.\"},{\"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\":\"configure-drilldown\",\"request\":\"Open the department detail when a point is clicked.\",\"operationId\":\"drilldown.configure\",\"params\":{\"action\":\"navigate\",\"target\":\"/departments/detail\",\"mapping\":{\"department\":\"departmentId\"}},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-unsafe-target\",\"request\":\"Navigate to javascript:alert(1) on drilldown.\",\"operationId\":\"drilldown.configure\",\"params\":{\"event\":\"drillDown\",\"action\":\"navigate\",\"target\":\"javascript:alert(1)\"},\"isPositive\":false}]}",
2909
+ "content": "{\"operationId\":\"drilldown.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart drilldown Effects: compile-domain-patch. Open the department detail when a point is clicked. Navigate to javascript:alert(1) on drilldown.\",\"scope\":\"eventMapping\",\"target\":{\"kind\":\"drilldown\",\"resolver\":\"x-ui-chart-events-drill-down\",\"required\":false},\"inputContract\":{\"required\":[\"action\"],\"properties\":[\"action\",\"target\",\"mapping\"],\"semanticTerms\":[\"action\",\"target\",\"mapping\",\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.events.drillDown\"],\"validators\":[{\"validatorId\":\"drilldown-target-governed\",\"level\":\"error\",\"code\":\"DRILLDOWN_TARGET_GOVERNED\",\"description\":\"Drilldown target must be a governed route or widget target.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"validatorId\":\"event-action-supported\",\"level\":\"error\",\"code\":\"EVENT_ACTION_SUPPORTED\",\"description\":\"Event action must be one of the supported structured action kinds.\"},{\"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\":\"configure-drilldown\",\"request\":\"Open the department detail when a point is clicked.\",\"operationId\":\"drilldown.configure\",\"params\":{\"action\":\"navigate\",\"target\":\"/departments/detail\",\"mapping\":{\"department\":\"departmentId\"}},\"isPositive\":true}],\"negativeExamples\":[{\"id\":\"reject-unsafe-target\",\"request\":\"Navigate to javascript:alert(1) on drilldown.\",\"operationId\":\"drilldown.configure\",\"params\":{\"event\":\"drillDown\",\"action\":\"navigate\",\"target\":\"javascript:alert(1)\"},\"isPositive\":false}]}",
2531
2910
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2532
- "contentHash": "8097ba4243dad7bfa8e18833167bef7acc13f5b346e2a8e7740beda45a0b7667",
2911
+ "contentHash": "e4fa18ba6088734b26409b34f0cf9ac04decf7be4605366e48951ce6caf5c2f9",
2533
2912
  "sourceKind": "component_definition",
2534
2913
  "sourceId": "praxis-chart",
2535
2914
  "corpusVersion": "1.0.0"
@@ -2537,9 +2916,9 @@
2537
2916
  {
2538
2917
  "chunkIndex": 11,
2539
2918
  "chunkKind": "authoring_manifest",
2540
- "content": "{\"operationId\":\"selection.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart selection Effects: compile-domain-patch. Emit selected department as a structured selection event.\",\"scope\":\"selection\",\"target\":{\"kind\":\"selection\",\"resolver\":\"x-ui-chart-events-selection-change\",\"required\":false},\"inputContract\":{\"required\":[\"action\"],\"properties\":[\"action\",\"target\",\"mapping\"],\"semanticTerms\":[\"action\",\"target\",\"mapping\",\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.events.selectionChange\"],\"validators\":[{\"validatorId\":\"selection-output-structured\",\"level\":\"error\",\"code\":\"SELECTION_OUTPUT_STRUCTURED\",\"description\":\"Selection output must resolve selected point filters deterministically.\"},{\"validatorId\":\"event-target-governed\",\"level\":\"error\",\"code\":\"EVENT_TARGET_GOVERNED\",\"description\":\"Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"validatorId\":\"event-action-supported\",\"level\":\"error\",\"code\":\"EVENT_ACTION_SUPPORTED\",\"description\":\"Event action must be one of the supported structured action kinds.\"},{\"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-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-selection\",\"request\":\"Emit selected department as a structured selection event.\",\"operationId\":\"selection.configure\",\"params\":{\"action\":\"emit\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
2919
+ "content": "{\"operationId\":\"selection.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart selection Effects: compile-domain-patch. Emit selected department as a structured selection event.\",\"scope\":\"selection\",\"target\":{\"kind\":\"selection\",\"resolver\":\"x-ui-chart-events-selection-change\",\"required\":false},\"inputContract\":{\"required\":[\"action\"],\"properties\":[\"action\",\"target\",\"mapping\"],\"semanticTerms\":[\"action\",\"target\",\"mapping\",\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"effects\":[\"compile-domain-patch\"],\"affectedPaths\":[\"chartDocument.events.selectionChange\"],\"validators\":[{\"validatorId\":\"selection-output-structured\",\"level\":\"error\",\"code\":\"SELECTION_OUTPUT_STRUCTURED\",\"description\":\"Selection output must resolve selected point filters deterministically.\"},{\"validatorId\":\"event-target-governed\",\"level\":\"error\",\"code\":\"EVENT_TARGET_GOVERNED\",\"description\":\"Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"validatorId\":\"event-action-supported\",\"level\":\"error\",\"code\":\"EVENT_ACTION_SUPPORTED\",\"description\":\"Event action must be one of the supported structured action kinds.\"},{\"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-schema-backed-data\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"configure-selection\",\"request\":\"Emit selected department as a structured selection event.\",\"operationId\":\"selection.configure\",\"params\":{\"action\":\"emit\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true}],\"negativeExamples\":[]}",
2541
2920
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2542
- "contentHash": "ce5040ad78883394cfd77e9217b3ed48a7a313629bda29fdce83059e82d54402",
2921
+ "contentHash": "e5bc5749765c25d4099601dfbe1311f78d54ab80510fe7eaf4a705e7094a4a81",
2543
2922
  "sourceKind": "component_definition",
2544
2923
  "sourceId": "praxis-chart",
2545
2924
  "corpusVersion": "1.0.0"
@@ -2547,9 +2926,9 @@
2547
2926
  {
2548
2927
  "chunkIndex": 12,
2549
2928
  "chunkKind": "authoring_manifest",
2550
- "content": "{\"operationId\":\"legend.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart legend Effects: set-value. Show the legend.\",\"scope\":\"skin\",\"target\":{\"kind\":\"legend\",\"resolver\":\"x-ui-chart-legend-feature\",\"required\":false},\"inputContract\":{\"required\":[\"enabled\"],\"properties\":[\"enabled\"],\"semanticTerms\":[\"enabled\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"chartDocument.legend\"],\"validators\":[{\"validatorId\":\"feature-toggle-valid\",\"level\":\"error\",\"code\":\"FEATURE_TOGGLE_VALID\",\"description\":\"Legend and tooltip feature values must be boolean or toggleable feature objects.\"},{\"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\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"toggle-legend\",\"request\":\"Show the legend.\",\"operationId\":\"legend.configure\",\"params\":{\"enabled\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
2929
+ "content": "{\"operationId\":\"legend.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart legend Effects: set-value. Show the legend.\",\"scope\":\"skin\",\"target\":{\"kind\":\"legend\",\"resolver\":\"x-ui-chart-legend-feature\",\"required\":false},\"inputContract\":{\"required\":[\"enabled\"],\"properties\":[\"enabled\"],\"semanticTerms\":[\"enabled\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"chartDocument.legend\"],\"validators\":[{\"validatorId\":\"feature-toggle-valid\",\"level\":\"error\",\"code\":\"FEATURE_TOGGLE_VALID\",\"description\":\"Legend and tooltip feature values must be boolean or toggleable feature objects.\"},{\"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\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"toggle-legend\",\"request\":\"Show the legend.\",\"operationId\":\"legend.configure\",\"params\":{\"enabled\":true},\"isPositive\":true}],\"negativeExamples\":[]}",
2551
2930
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2552
- "contentHash": "3ee7bd2ac4dceda1f40df5c2781b8c14444ddfa10ee7e68d0cb8986e1fa52e9c",
2931
+ "contentHash": "a7fa2928962ed3573eef43f63c35bfef7de21245a0d378cf599beaad799bcfb0",
2553
2932
  "sourceKind": "component_definition",
2554
2933
  "sourceId": "praxis-chart",
2555
2934
  "corpusVersion": "1.0.0"
@@ -2557,9 +2936,9 @@
2557
2936
  {
2558
2937
  "chunkIndex": 13,
2559
2938
  "chunkKind": "authoring_manifest",
2560
- "content": "{\"operationId\":\"tooltip.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart tooltip Effects: set-value. Disable tooltips.\",\"scope\":\"skin\",\"target\":{\"kind\":\"tooltip\",\"resolver\":\"x-ui-chart-tooltip-feature\",\"required\":false},\"inputContract\":{\"required\":[\"enabled\"],\"properties\":[\"enabled\"],\"semanticTerms\":[\"enabled\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"chartDocument.tooltip\"],\"validators\":[{\"validatorId\":\"feature-toggle-valid\",\"level\":\"error\",\"code\":\"FEATURE_TOGGLE_VALID\",\"description\":\"Legend and tooltip feature values must be boolean or toggleable feature objects.\"},{\"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\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"toggle-tooltip\",\"request\":\"Disable tooltips.\",\"operationId\":\"tooltip.configure\",\"params\":{\"enabled\":false},\"isPositive\":true}],\"negativeExamples\":[]}",
2939
+ "content": "{\"operationId\":\"tooltip.configure\",\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operation_card\",\"semanticSummary\":\"Configure chart tooltip Effects: set-value. Disable tooltips.\",\"scope\":\"skin\",\"target\":{\"kind\":\"tooltip\",\"resolver\":\"x-ui-chart-tooltip-feature\",\"required\":false},\"inputContract\":{\"required\":[\"enabled\"],\"properties\":[\"enabled\"],\"semanticTerms\":[\"enabled\"]},\"effects\":[\"set-value\"],\"affectedPaths\":[\"chartDocument.tooltip\"],\"validators\":[{\"validatorId\":\"feature-toggle-valid\",\"level\":\"error\",\"code\":\"FEATURE_TOGGLE_VALID\",\"description\":\"Legend and tooltip feature values must be boolean or toggleable feature objects.\"},{\"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\":\"visual-only\",\"presentationAffordances\":[],\"positiveExamples\":[{\"id\":\"toggle-tooltip\",\"request\":\"Disable tooltips.\",\"operationId\":\"tooltip.configure\",\"params\":{\"enabled\":false},\"isPositive\":true}],\"negativeExamples\":[]}",
2561
2940
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2562
- "contentHash": "2daea33f3dd8ff521d400edf0ff7b8659fca5696a4c6babad9613e8a9abd9561",
2941
+ "contentHash": "59715858e03aca14b1644e483d1024fa4d3cfa9d67d48e9beca4cb99567ac4df",
2563
2942
  "sourceKind": "component_definition",
2564
2943
  "sourceId": "praxis-chart",
2565
2944
  "corpusVersion": "1.0.0"
@@ -2567,9 +2946,9 @@
2567
2946
  {
2568
2947
  "chunkIndex": 14,
2569
2948
  "chunkKind": "authoring_manifest",
2570
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"identity\"}",
2949
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"identity\"}",
2571
2950
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2572
- "contentHash": "d481e91e447ae5f92b0d3ffb171cf993e3b16409be95ce237464248c9e5c953b",
2951
+ "contentHash": "94b86e959840ad7bc8583a6ea469af8da3fa026a6c2a26dfb63704a32647ee53",
2573
2952
  "sourceKind": "component_definition",
2574
2953
  "sourceId": "praxis-chart",
2575
2954
  "corpusVersion": "1.0.0"
@@ -2577,9 +2956,9 @@
2577
2956
  {
2578
2957
  "chunkIndex": 15,
2579
2958
  "chunkKind": "authoring_manifest",
2580
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"chartDocument\",\"type\":\"PraxisXUiChartContract | null\",\"description\":\"Canonical x-ui.chart document used as the authoring source of truth.\"},{\"name\":\"config\",\"type\":\"PraxisChartConfig\",\"description\":\"Runtime chart configuration mapped from or supplied beside the canonical chart document.\"},{\"name\":\"queryContext\",\"type\":\"PraxisChartQueryContext | null\",\"description\":\"Canonical @praxisui/core query context observed by remote datasource requests; flat filters execute in praxis.stats and governed filterExpression is preserved but rejected until stats expression support is proven.\"},{\"name\":\"remoteDataResolver\",\"type\":\"PraxisChartRemoteDataResolver | null\",\"description\":\"Host-governed remote row resolver for integrations outside the default praxis.stats client.\"},{\"name\":\"availableResources\",\"type\":\"ChartEditorResourceOption[]\",\"description\":\"Transient authoring catalog: id is the stable /schemas/catalog discovery identity, while path is the governed root-relative operational value persisted to chartDocument.source.resource.\"},{\"name\":\"availableFields\",\"type\":\"ChartEditorFieldOption[]\",\"description\":\"Transient capability-backed field catalog. operations, aggregations and distributionModes declare exact group-by, timeseries, distribution/terms and distribution/histogram eligibility.\"},{\"name\":\"availableTargets\",\"type\":\"ChartEditorTargetOption[]\",\"description\":\"Transient visual-authoring targets derived from existing top-level composition links to public, non-deprecated widget ports or explicitly writable declared page state; id is the unique authoring identity and events[] declares the exact structured Chart events authorized by compatible links. Raw pointClick evidence never authorizes events.pointClick, which is emitted through pointAction. Local transform.output semantic-kind inspection does not replace a Core-validated transform-output projection (P2), and the visual catalog does not yet publish the target input-schema/port projection required for end-to-end mapping validation.\"}]}",
2959
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"runtimeInputs\",\"runtimeInputs\":[{\"name\":\"chartDocument\",\"type\":\"PraxisXUiChartContract | null\",\"description\":\"Canonical x-ui.chart document used as the authoring source of truth.\"},{\"name\":\"config\",\"type\":\"PraxisChartConfig\",\"description\":\"Runtime chart configuration mapped from or supplied beside the canonical chart document.\"},{\"name\":\"queryContext\",\"type\":\"PraxisChartQueryContext | null\",\"description\":\"Canonical @praxisui/core query context observed by remote datasource requests; flat filters execute in praxis.stats and governed filterExpression is preserved but rejected until stats expression support is proven.\"},{\"name\":\"remoteDataResolver\",\"type\":\"PraxisChartRemoteDataResolver | null\",\"description\":\"Host-governed remote row resolver for integrations outside the default praxis.stats client.\"},{\"name\":\"availableResources\",\"type\":\"ChartEditorResourceOption[]\",\"description\":\"Transient authoring catalog: id is the stable /schemas/catalog discovery identity, while path is the governed root-relative operational value persisted to chartDocument.source.resource.\"},{\"name\":\"availableFields\",\"type\":\"ChartEditorFieldOption[]\",\"description\":\"Transient capability-backed field catalog. operations, aggregations and distributionModes declare exact group-by, timeseries, distribution/terms and distribution/histogram eligibility.\"},{\"name\":\"availableTargets\",\"type\":\"ChartEditorTargetOption[]\",\"description\":\"Transient visual-authoring targets derived from existing top-level composition links to public, non-deprecated widget ports or explicitly writable declared page state; id is the unique authoring identity and events[] declares the exact structured Chart events authorized by compatible links. Raw pointClick evidence never authorizes events.pointClick, which is emitted through pointAction. Local transform.output semantic-kind inspection does not replace a Core-validated transform-output projection (P2), and the visual catalog does not yet publish the target input-schema/port projection required for end-to-end mapping validation.\"}]}",
2581
2960
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2582
- "contentHash": "3d13300daa87e565205df31a140235364b51576f9d829d93c6f794df7089b059",
2961
+ "contentHash": "86eb867274349362d768b23c28d58d1f2a2600f79d27108c11bbf6297b235c67",
2583
2962
  "sourceKind": "component_definition",
2584
2963
  "sourceId": "praxis-chart",
2585
2964
  "corpusVersion": "1.0.0"
@@ -2587,9 +2966,9 @@
2587
2966
  {
2588
2967
  "chunkIndex": 16,
2589
2968
  "chunkKind": "authoring_manifest",
2590
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"chartType\",\"resolver\":\"x-ui-chart-kind\",\"description\":\"Canonical `kind` field in PraxisXUiChartContract.\"},{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"description\":\"Metric-backed series definition in `metrics[]`, keyed by field.\"},{\"kind\":\"axis\",\"resolver\":\"x-ui-chart-dimension-or-metric-axis\",\"description\":\"Dimension role, metric axis and chart orientation semantics.\"},{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-source-and-field-catalog\",\"description\":\"Source, dimensions, metrics and resource/field bindings.\"},{\"kind\":\"queryContext\",\"resolver\":\"praxis-chart-query-context\",\"description\":\"Runtime @praxisui/core queryContext contract for filters, filterExpression, sort, limit, page and governance metadata.\"},{\"kind\":\"pointClick\",\"resolver\":\"x-ui-chart-events-point-click\",\"description\":\"Raw pointClick evidence plus a separate pointAction output for configured pointClick actions.\"},{\"kind\":\"crossFilter\",\"resolver\":\"x-ui-chart-events-cross-filter\",\"description\":\"Cross-filter event mapping emitted as structured query-context filters.\"},{\"kind\":\"drilldown\",\"resolver\":\"x-ui-chart-events-drill-down\",\"description\":\"Drilldown event mapping and governed target.\"},{\"kind\":\"selection\",\"resolver\":\"x-ui-chart-events-selection-change\",\"description\":\"Single-point selection event enablement and mapping semantics; toggle and multi-select are intentionally not advertised.\"},{\"kind\":\"legend\",\"resolver\":\"x-ui-chart-legend-feature\",\"description\":\"Legend visibility through boolean or toggleable feature object.\"},{\"kind\":\"tooltip\",\"resolver\":\"x-ui-chart-tooltip-feature\",\"description\":\"Tooltip visibility through boolean or toggleable feature object.\"}]}",
2969
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"editableTargets\",\"editableTargets\":[{\"kind\":\"chartType\",\"resolver\":\"x-ui-chart-kind\",\"description\":\"Canonical `kind` field in PraxisXUiChartContract.\"},{\"kind\":\"series\",\"resolver\":\"x-ui-chart-metric-by-field\",\"description\":\"Metric-backed series definition in `metrics[]`, keyed by field.\"},{\"kind\":\"axis\",\"resolver\":\"x-ui-chart-dimension-or-metric-axis\",\"description\":\"Dimension role, metric axis and chart orientation semantics.\"},{\"kind\":\"dataBinding\",\"resolver\":\"x-ui-chart-source-and-field-catalog\",\"description\":\"Source, dimensions, metrics and resource/field bindings.\"},{\"kind\":\"queryContext\",\"resolver\":\"praxis-chart-query-context\",\"description\":\"Runtime @praxisui/core queryContext contract for filters, filterExpression, sort, limit, page and governance metadata.\"},{\"kind\":\"pointClick\",\"resolver\":\"x-ui-chart-events-point-click\",\"description\":\"Raw pointClick evidence plus a separate pointAction output for configured pointClick actions.\"},{\"kind\":\"crossFilter\",\"resolver\":\"x-ui-chart-events-cross-filter\",\"description\":\"Cross-filter event mapping emitted as structured query-context filters.\"},{\"kind\":\"drilldown\",\"resolver\":\"x-ui-chart-events-drill-down\",\"description\":\"Drilldown event mapping and governed target.\"},{\"kind\":\"selection\",\"resolver\":\"x-ui-chart-events-selection-change\",\"description\":\"Single-point selection event enablement and mapping semantics; toggle and multi-select are intentionally not advertised.\"},{\"kind\":\"legend\",\"resolver\":\"x-ui-chart-legend-feature\",\"description\":\"Legend visibility through boolean or toggleable feature object.\"},{\"kind\":\"tooltip\",\"resolver\":\"x-ui-chart-tooltip-feature\",\"description\":\"Tooltip visibility through boolean or toggleable feature object.\"}]}",
2591
2970
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2592
- "contentHash": "a2cb7eff9493cbcb20abc67ed96e1f2326cec3196cda8f656b21843ff607d219",
2971
+ "contentHash": "6c6868847223be78ca3090e70de72156951bec8fc24d67c5f05714c5c6636d65",
2593
2972
  "sourceKind": "component_definition",
2594
2973
  "sourceId": "praxis-chart",
2595
2974
  "corpusVersion": "1.0.0"
@@ -2597,9 +2976,9 @@
2597
2976
  {
2598
2977
  "chunkIndex": 17,
2599
2978
  "chunkKind": "authoring_manifest",
2600
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.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\"],\"properties\":{\"version\":{\"const\":\"0.1.0\"},\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\"]},\"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\"}},\"events\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"chart-document-shape\",\"chart-version-supported\",\"chart-type-series-axis-compatible\",\"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\"],\"properties\":{\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]}}},\"effects\":[{\"kind\":\"merge-object\",\"path\":\"chartDocument\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"chart-type-supported\",\"chart-type-series-axis-compatible\",\"pie-single-metric\",\"combo-minimum-series\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.kind\",\"chartDocument.orientation\",\"chartDocument.metrics[]\",\"chartDocument.dimensions[]\"],\"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[].\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"series-field-exists\",\"series-field-aggregable\",\"series-id-unique\",\"chart-type-series-axis-compatible\",\"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\"]},{\"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\"]}]}",
2979
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.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\"],\"properties\":{\"version\":{\"const\":\"0.1.0\"},\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\"]},\"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\"}},\"events\":{\"type\":\"object\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"chart-document-shape\",\"chart-version-supported\",\"chart-type-series-axis-compatible\",\"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\"],\"properties\":{\"kind\":{\"enum\":[\"bar\",\"combo\",\"horizontal-bar\",\"line\",\"pie\",\"donut\",\"area\",\"stacked-bar\",\"stacked-area\",\"scatter\",\"funnel\",\"pyramid\"]},\"orientation\":{\"enum\":[\"vertical\",\"horizontal\"]}}},\"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\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.kind\",\"chartDocument.orientation\",\"chartDocument.metrics[]\",\"chartDocument.dimensions[]\"],\"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[].\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"series-field-exists\",\"series-field-aggregable\",\"series-id-unique\",\"chart-type-series-axis-compatible\",\"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\"]},{\"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\"]}]}",
2601
2980
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2602
- "contentHash": "2a01115cb91a19ed923ddd556903b33ef3844bc51211d486f03142a439277aca",
2981
+ "contentHash": "4d50b2a992d61972b9ecc54d9d65eb0773910d8a948d6b5f41ff429b50db4acc",
2603
2982
  "sourceKind": "component_definition",
2604
2983
  "sourceId": "praxis-chart",
2605
2984
  "corpusVersion": "1.0.0"
@@ -2607,9 +2986,9 @@
2607
2986
  {
2608
2987
  "chunkIndex": 18,
2609
2988
  "chunkKind": "authoring_manifest",
2610
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"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\"]},\"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.dimensions[]\",\"chartDocument.metrics[]\"],\"writes\":[\"chartDocument.source\",\"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\"]},\"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\",\"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. 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\",\"comparison-period-complete\",\"comparison-metrics-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.source\",\"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\":\"pointClick.configure\",\"title\":\"Configure chart point click\",\"scope\":\"eventMapping\",\"targetKind\":\"pointClick\",\"target\":{\"kind\":\"pointClick\",\"resolver\":\"x-ui-chart-events-point-click\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-point-click-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.pointClick\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.pointClick\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"mapping-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures pointClick through the pointAction output while keeping pointClick as raw point evidence.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"point-click-action-structured\",\"event-target-governed\",\"event-mapping-fields-exist\",\"event-action-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.pointClick\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"crossFilter.configure\",\"title\":\"Configure chart cross-filter\",\"scope\":\"eventMapping\",\"targetKind\":\"crossFilter\",\"target\":{\"kind\":\"crossFilter\",\"resolver\":\"x-ui-chart-events-cross-filter\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-cross-filter-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.crossFilter\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.crossFilter\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"mapping-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures crossFilter as a structured event action emitted through the crossFilter output with safe query-context filters to a governed target. For praxis.stats rows, key is governed bucket identity and label is presentation evidence; mappings may use key when the target schema accepts that identity.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"cross-filter-output-structured\",\"event-target-governed\",\"event-mapping-fields-exist\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.crossFilter\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]}]}",
2989
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"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\"]},\"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.dimensions[]\",\"chartDocument.metrics[]\"],\"writes\":[\"chartDocument.source\",\"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\"]},\"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\",\"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. 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\",\"comparison-period-complete\",\"comparison-metrics-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.source\",\"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\":\"pointClick.configure\",\"title\":\"Configure chart point click\",\"scope\":\"eventMapping\",\"targetKind\":\"pointClick\",\"target\":{\"kind\":\"pointClick\",\"resolver\":\"x-ui-chart-events-point-click\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-point-click-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.pointClick\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.pointClick\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"mapping-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures pointClick through the pointAction output while keeping pointClick as raw point evidence.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"point-click-action-structured\",\"event-target-governed\",\"event-mapping-fields-exist\",\"event-action-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.pointClick\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"crossFilter.configure\",\"title\":\"Configure chart cross-filter\",\"scope\":\"eventMapping\",\"targetKind\":\"crossFilter\",\"target\":{\"kind\":\"crossFilter\",\"resolver\":\"x-ui-chart-events-cross-filter\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-cross-filter-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.crossFilter\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.crossFilter\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"mapping-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures crossFilter as a structured event action emitted through the crossFilter output with safe query-context filters to a governed target. For praxis.stats rows, key is governed bucket identity and label is presentation evidence; mappings may use key when the target schema accepts that identity.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"cross-filter-output-structured\",\"event-target-governed\",\"event-mapping-fields-exist\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.crossFilter\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]}]}",
2611
2990
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2612
- "contentHash": "c9f56ab0807b6aa3980f1e20ed30d34e0863dcf1761e9be82bf7c9c2e2e6dc29",
2991
+ "contentHash": "7d3ef41e5490d34e75d9a7d15826e68a2c21678e74b58445d11a5cff79efbfea",
2613
2992
  "sourceKind": "component_definition",
2614
2993
  "sourceId": "praxis-chart",
2615
2994
  "corpusVersion": "1.0.0"
@@ -2617,9 +2996,9 @@
2617
2996
  {
2618
2997
  "chunkIndex": 19,
2619
2998
  "chunkKind": "authoring_manifest",
2620
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"drilldown.configure\",\"title\":\"Configure chart drilldown\",\"scope\":\"eventMapping\",\"targetKind\":\"drilldown\",\"target\":{\"kind\":\"drilldown\",\"resolver\":\"x-ui-chart-events-drill-down\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-drilldown-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.drillDown\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.drillDown\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"drilldown-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures drillDown through the dedicated drillDown output with governed route/widget targets and structured field mappings.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"drilldown-target-governed\",\"event-mapping-fields-exist\",\"event-action-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.drillDown\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"selection.configure\",\"title\":\"Configure chart selection\",\"scope\":\"selection\",\"targetKind\":\"selection\",\"target\":{\"kind\":\"selection\",\"resolver\":\"x-ui-chart-events-selection-change\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-selection-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.selectionChange\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.selectionChange\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"mapping-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures selectionChange as single-point selection evidence whose event key is governed by the operation.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"selection-output-structured\",\"event-target-governed\",\"event-mapping-fields-exist\",\"event-action-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.selectionChange\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"legend.configure\",\"title\":\"Configure chart legend\",\"scope\":\"skin\",\"targetKind\":\"legend\",\"target\":{\"kind\":\"legend\",\"resolver\":\"x-ui-chart-legend-feature\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument.legend\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"feature-toggle-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.legend\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"tooltip.configure\",\"title\":\"Configure chart tooltip\",\"scope\":\"skin\",\"targetKind\":\"tooltip\",\"target\":{\"kind\":\"tooltip\",\"resolver\":\"x-ui-chart-tooltip-feature\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument.tooltip\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"feature-toggle-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.tooltip\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]}]}",
2999
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"operations\",\"operations\":[{\"operationId\":\"drilldown.configure\",\"title\":\"Configure chart drilldown\",\"scope\":\"eventMapping\",\"targetKind\":\"drilldown\",\"target\":{\"kind\":\"drilldown\",\"resolver\":\"x-ui-chart-events-drill-down\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-drilldown-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.drillDown\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.drillDown\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"drilldown-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures drillDown through the dedicated drillDown output with governed route/widget targets and structured field mappings.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"drilldown-target-governed\",\"event-mapping-fields-exist\",\"event-action-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.drillDown\"],\"submissionImpact\":\"config-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"selection.configure\",\"title\":\"Configure chart selection\",\"scope\":\"selection\",\"targetKind\":\"selection\",\"target\":{\"kind\":\"selection\",\"resolver\":\"x-ui-chart-events-selection-change\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"effects\":[{\"kind\":\"compile-domain-patch\",\"handler\":\"chart-event-selection-configure\",\"handlerContract\":{\"reads\":[\"chartDocument.events.selectionChange\",\"chartDocument.dimensions[]\",\"availableTargets[]\"],\"writes\":[\"chartDocument.events.selectionChange\"],\"identityKeys\":[\"availableTargets[].id\"],\"inputSchema\":{\"type\":\"object\",\"required\":[\"action\"],\"properties\":{\"action\":{\"enum\":[\"filter-widget\",\"open-detail\",\"navigate\",\"update-context\",\"emit\"]},\"target\":{\"type\":\"string\"},\"mapping\":{\"type\":\"object\",\"additionalProperties\":{\"type\":\"string\"}}}},\"failureModes\":[\"target-not-in-catalog\",\"mapping-source-field-missing\",\"mapping-target-invalid\",\"unsafe-event-action\"],\"description\":\"Configures selectionChange as single-point selection evidence whose event key is governed by the operation.\"}}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"selection-output-structured\",\"event-target-governed\",\"event-mapping-fields-exist\",\"event-action-supported\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.events.selectionChange\"],\"submissionImpact\":\"affects-schema-backed-data\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"legend.configure\",\"title\":\"Configure chart legend\",\"scope\":\"skin\",\"targetKind\":\"legend\",\"target\":{\"kind\":\"legend\",\"resolver\":\"x-ui-chart-legend-feature\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument.legend\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"feature-toggle-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.legend\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]},{\"operationId\":\"tooltip.configure\",\"title\":\"Configure chart tooltip\",\"scope\":\"skin\",\"targetKind\":\"tooltip\",\"target\":{\"kind\":\"tooltip\",\"resolver\":\"x-ui-chart-tooltip-feature\",\"ambiguityPolicy\":\"fail\",\"required\":false},\"inputSchema\":{\"type\":\"object\",\"required\":[\"enabled\"],\"properties\":{\"enabled\":{\"type\":\"boolean\"}}},\"effects\":[{\"kind\":\"set-value\",\"path\":\"chartDocument.tooltip\"}],\"destructive\":false,\"requiresConfirmation\":false,\"validators\":[\"feature-toggle-valid\",\"editor-runtime-round-trip\"],\"affectedPaths\":[\"chartDocument.tooltip\"],\"submissionImpact\":\"visual-only\",\"preconditions\":[\"config-initialized\"]}]}",
2621
3000
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2622
- "contentHash": "4712dff8e82caa90ee25b043770f0bfc4b4040652a887fcc05588c361268c94b",
3001
+ "contentHash": "6910dad230ac5e580e85ccaa5cbd12f1abd250aa480d7ba1b5d2ee7f0ee014ce",
2623
3002
  "sourceKind": "component_definition",
2624
3003
  "sourceId": "praxis-chart",
2625
3004
  "corpusVersion": "1.0.0"
@@ -2627,9 +3006,9 @@
2627
3006
  {
2628
3007
  "chunkIndex": 20,
2629
3008
  "chunkKind": "authoring_manifest",
2630
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"validators\",\"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-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\":\"pie-single-metric\",\"level\":\"error\",\"code\":\"PIE_SINGLE_METRIC\",\"description\":\"Pie and donut charts support a single metric.\"},{\"validatorId\":\"combo-minimum-series\",\"level\":\"error\",\"code\":\"COMBO_MINIMUM_SERIES\",\"description\":\"Combo charts require at least two metrics.\"},{\"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\":\"series-exists\",\"level\":\"error\",\"code\":\"SERIES_EXISTS\",\"description\":\"Series removal target must exist.\"},{\"validatorId\":\"destructive-series-removal-confirmed\",\"level\":\"error\",\"code\":\"DESTRUCTIVE_SERIES_REMOVAL_CONFIRMED\",\"description\":\"Removing a series requires explicit confirmation.\"},{\"validatorId\":\"chart-keeps-required-metric\",\"level\":\"error\",\"code\":\"CHART_KEEPS_REQUIRED_METRIC\",\"description\":\"A chart cannot be left without required metrics.\"},{\"validatorId\":\"axis-field-exists\",\"level\":\"error\",\"code\":\"AXIS_FIELD_EXISTS\",\"description\":\"Axis/dimension fields must exist in availableFields or schema context.\"},{\"validatorId\":\"secondary-axis-combo-only\",\"level\":\"error\",\"code\":\"SECONDARY_AXIS_COMBO_ONLY\",\"description\":\"Secondary axis is supported only for combo charts.\"},{\"validatorId\":\"cartesian-dimension-required\",\"level\":\"error\",\"code\":\"CARTESIAN_DIMENSION_REQUIRED\",\"description\":\"Cartesian charts require at least one dimension.\"},{\"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\":\"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\":\"query-context-structured\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_STRUCTURED\",\"description\":\"queryContext must use the canonical @praxisui/core structure for filters, filterExpression, sort, limit, page and meta.\"},{\"validatorId\":\"query-context-filter-expression-stats-unsupported\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_FILTER_EXPRESSION_STATS_UNSUPPORTED\",\"description\":\"praxis.stats currently executes only flat queryContext.filters; governed filterExpression must be preserved for diagnostics and rejected until backend expression support is declared.\"},{\"validatorId\":\"query-context-fields-exist\",\"level\":\"warning\",\"code\":\"QUERY_CONTEXT_FIELDS_EXIST\",\"description\":\"queryContext filter fields should exist in the schema/data context.\"},{\"validatorId\":\"query-context-safe-values\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_SAFE_VALUES\",\"description\":\"queryContext values must be serializable safe data.\"},{\"validatorId\":\"point-click-action-structured\",\"level\":\"error\",\"code\":\"POINT_CLICK_ACTION_STRUCTURED\",\"description\":\"Configured pointClick actions must be emitted through pointAction while pointClick remains raw point evidence.\"},{\"validatorId\":\"cross-filter-output-structured\",\"level\":\"error\",\"code\":\"CROSS_FILTER_OUTPUT_STRUCTURED\",\"description\":\"Cross-filter output must be structured as query-context filters.\"},{\"validatorId\":\"event-target-governed\",\"level\":\"error\",\"code\":\"EVENT_TARGET_GOVERNED\",\"description\":\"Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"validatorId\":\"event-action-supported\",\"level\":\"error\",\"code\":\"EVENT_ACTION_SUPPORTED\",\"description\":\"Event action must be one of the supported structured action kinds.\"},{\"validatorId\":\"drilldown-target-governed\",\"level\":\"error\",\"code\":\"DRILLDOWN_TARGET_GOVERNED\",\"description\":\"Drilldown target must be a governed route or widget target.\"},{\"validatorId\":\"selection-output-structured\",\"level\":\"error\",\"code\":\"SELECTION_OUTPUT_STRUCTURED\",\"description\":\"Selection output must resolve selected point filters deterministically.\"},{\"validatorId\":\"feature-toggle-valid\",\"level\":\"error\",\"code\":\"FEATURE_TOGGLE_VALID\",\"description\":\"Legend and tooltip feature values must be boolean or toggleable feature objects.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}]}",
3009
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"validators\",\"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-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 and pyramid charts require exactly one metric.\"},{\"validatorId\":\"combo-minimum-series\",\"level\":\"error\",\"code\":\"COMBO_MINIMUM_SERIES\",\"description\":\"Combo charts require at least two metrics.\"},{\"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\":\"series-exists\",\"level\":\"error\",\"code\":\"SERIES_EXISTS\",\"description\":\"Series removal target must exist.\"},{\"validatorId\":\"destructive-series-removal-confirmed\",\"level\":\"error\",\"code\":\"DESTRUCTIVE_SERIES_REMOVAL_CONFIRMED\",\"description\":\"Removing a series requires explicit confirmation.\"},{\"validatorId\":\"chart-keeps-required-metric\",\"level\":\"error\",\"code\":\"CHART_KEEPS_REQUIRED_METRIC\",\"description\":\"A chart cannot be left without required metrics.\"},{\"validatorId\":\"axis-field-exists\",\"level\":\"error\",\"code\":\"AXIS_FIELD_EXISTS\",\"description\":\"Axis/dimension fields must exist in availableFields or schema context.\"},{\"validatorId\":\"secondary-axis-combo-only\",\"level\":\"error\",\"code\":\"SECONDARY_AXIS_COMBO_ONLY\",\"description\":\"Secondary axis is supported only for combo charts.\"},{\"validatorId\":\"cartesian-dimension-required\",\"level\":\"error\",\"code\":\"CARTESIAN_DIMENSION_REQUIRED\",\"description\":\"Cartesian charts require at least one dimension.\"},{\"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\":\"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\":\"query-context-structured\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_STRUCTURED\",\"description\":\"queryContext must use the canonical @praxisui/core structure for filters, filterExpression, sort, limit, page and meta.\"},{\"validatorId\":\"query-context-filter-expression-stats-unsupported\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_FILTER_EXPRESSION_STATS_UNSUPPORTED\",\"description\":\"praxis.stats currently executes only flat queryContext.filters; governed filterExpression must be preserved for diagnostics and rejected until backend expression support is declared.\"},{\"validatorId\":\"query-context-fields-exist\",\"level\":\"warning\",\"code\":\"QUERY_CONTEXT_FIELDS_EXIST\",\"description\":\"queryContext filter fields should exist in the schema/data context.\"},{\"validatorId\":\"query-context-safe-values\",\"level\":\"error\",\"code\":\"QUERY_CONTEXT_SAFE_VALUES\",\"description\":\"queryContext values must be serializable safe data.\"},{\"validatorId\":\"point-click-action-structured\",\"level\":\"error\",\"code\":\"POINT_CLICK_ACTION_STRUCTURED\",\"description\":\"Configured pointClick actions must be emitted through pointAction while pointClick remains raw point evidence.\"},{\"validatorId\":\"cross-filter-output-structured\",\"level\":\"error\",\"code\":\"CROSS_FILTER_OUTPUT_STRUCTURED\",\"description\":\"Cross-filter output must be structured as query-context filters.\"},{\"validatorId\":\"event-target-governed\",\"level\":\"error\",\"code\":\"EVENT_TARGET_GOVERNED\",\"description\":\"Event targets must resolve to exactly one availableTargets[].id and declare the authored event plus action; missing, duplicate or cross-event identities fail closed.\"},{\"validatorId\":\"event-mapping-fields-exist\",\"level\":\"error\",\"code\":\"EVENT_MAPPING_FIELDS_EXIST\",\"description\":\"Event mapping source fields must exist in chart data context; praxis.stats reserves key for bucket identity and label for presentation.\"},{\"validatorId\":\"event-action-supported\",\"level\":\"error\",\"code\":\"EVENT_ACTION_SUPPORTED\",\"description\":\"Event action must be one of the supported structured action kinds.\"},{\"validatorId\":\"drilldown-target-governed\",\"level\":\"error\",\"code\":\"DRILLDOWN_TARGET_GOVERNED\",\"description\":\"Drilldown target must be a governed route or widget target.\"},{\"validatorId\":\"selection-output-structured\",\"level\":\"error\",\"code\":\"SELECTION_OUTPUT_STRUCTURED\",\"description\":\"Selection output must resolve selected point filters deterministically.\"},{\"validatorId\":\"feature-toggle-valid\",\"level\":\"error\",\"code\":\"FEATURE_TOGGLE_VALID\",\"description\":\"Legend and tooltip feature values must be boolean or toggleable feature objects.\"},{\"validatorId\":\"editor-runtime-round-trip\",\"level\":\"error\",\"code\":\"EDITOR_RUNTIME_ROUND_TRIP\",\"description\":\"PraxisChartConfigEditor must save/reopen the same canonical document that runtime consumes.\"}]}",
2631
3010
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2632
- "contentHash": "7bc4f81c9e14852418976e82c51e3f433b4982b67bdeb592db5dcf10575e9b6b",
3011
+ "contentHash": "f11f9ce90b2cd022a5e16d0af27e46398fa6f117db2a2c847493dfd512a7ca88",
2633
3012
  "sourceKind": "component_definition",
2634
3013
  "sourceId": "praxis-chart",
2635
3014
  "corpusVersion": "1.0.0"
@@ -2637,9 +3016,9 @@
2637
3016
  {
2638
3017
  "chunkIndex": 21,
2639
3018
  "chunkKind": "authoring_manifest",
2640
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"The canonical saved shape is PraxisXUiChartContract, not raw ECharts options.\",\"PraxisChartConfigEditor must preserve chart kind, source, dimensions, metrics, events, legend and tooltip across apply/save/reset/reopen.\",\"Remote bindings persist availableResources[].path; availableResources[].id remains discovery identity, and transient resource/field/target catalogs and diagnostics are never persisted in widget inputs.\",\"Comparison must preserve one canonical /stats/comparison request with metrics[] and a complete comparisonPeriod; it must not downgrade into independent group-by calls.\",\"Cross-filter, drilldown and selection authoring must persist structured event actions, not prompt examples or command strings.\",\"[P1] Backend handler, resolver and validators now execute directly; end-to-end Page Builder parity remains open until assistant requests project the transient availableTargets[].events catalog through validationContext and expose its fail-closed diagnostics.\",\"[P2] Transform-output semantics and target input-schema/port fields must be materialized and validated by Core; local transform.output inspection and backend-enriched inputFields are not substitutes for those canonical projections.\",\"Enrichment of capability-backed availableFields with /schemas/filtered property metadata remains a later schema-flow gate.\"]}",
3019
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"roundTripRequirements\",\"roundTripRequirements\":[\"The canonical saved shape is PraxisXUiChartContract, not raw ECharts options.\",\"PraxisChartConfigEditor must preserve chart kind, source, dimensions, metrics, events, legend and tooltip across apply/save/reset/reopen.\",\"Remote bindings persist availableResources[].path; availableResources[].id remains discovery identity, and transient resource/field/target catalogs and diagnostics are never persisted in widget inputs.\",\"Comparison must preserve one canonical /stats/comparison request with metrics[] and a complete comparisonPeriod; it must not downgrade into independent group-by calls.\",\"Cross-filter, drilldown and selection authoring must persist structured event actions, not prompt examples or command strings.\",\"[P1] Backend handler, resolver and validators now execute directly; end-to-end Page Builder parity remains open until assistant requests project the transient availableTargets[].events catalog through validationContext and expose its fail-closed diagnostics.\",\"[P2] Transform-output semantics and target input-schema/port fields must be materialized and validated by Core; local transform.output inspection and backend-enriched inputFields are not substitutes for those canonical projections.\",\"Enrichment of capability-backed availableFields with /schemas/filtered property metadata remains a later schema-flow gate.\"]}",
2641
3020
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2642
- "contentHash": "da88b13f0e19ae4a4a2a23166477f39f4b4815b41683f6e9315d4f84f0dd836c",
3021
+ "contentHash": "e4761a318bc8b7911559355ea213403838979475124d1fcfc49859b883415b9c",
2643
3022
  "sourceKind": "component_definition",
2644
3023
  "sourceId": "praxis-chart",
2645
3024
  "corpusVersion": "1.0.0"
@@ -2647,9 +3026,9 @@
2647
3026
  {
2648
3027
  "chunkIndex": 22,
2649
3028
  "chunkKind": "authoring_manifest",
2650
- "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.1.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"set-bar-chart\",\"request\":\"Use a bar chart for employees by department.\",\"operationId\":\"chart.type.set\",\"params\":{\"kind\":\"bar\"},\"isPositive\":true},{\"id\":\"add-salary-series\",\"request\":\"Add salary as a summed metric.\",\"operationId\":\"series.add\",\"params\":{\"field\":\"salary\",\"aggregation\":\"sum\",\"label\":\"Salary\"},\"isPositive\":true},{\"id\":\"remove-old-series\",\"request\":\"Remove the old cost series.\",\"operationId\":\"series.remove\",\"target\":\"cost\",\"params\":{\"field\":\"cost\"},\"isPositive\":true},{\"id\":\"configure-secondary-axis\",\"request\":\"Put margin on a secondary axis for the combo chart.\",\"operationId\":\"axis.configure\",\"params\":{\"metricField\":\"margin\",\"metricAxis\":\"secondary\"},\"isPositive\":true},{\"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},{\"id\":\"set-query-context\",\"request\":\"Limit the chart to active employees and sort by total descending.\",\"operationId\":\"queryContext.set\",\"params\":{\"filters\":{\"status\":\"ACTIVE\"},\"sort\":[\"total,desc\"],\"limit\":10},\"isPositive\":true},{\"id\":\"configure-cross-filter\",\"request\":\"Use selected department to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true},{\"id\":\"configure-stats-key-cross-filter\",\"request\":\"Use the governed department bucket identity to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"key\":\"departmentIdsIn\"}},\"isPositive\":true},{\"id\":\"configure-drilldown\",\"request\":\"Open the department detail when a point is clicked.\",\"operationId\":\"drilldown.configure\",\"params\":{\"action\":\"navigate\",\"target\":\"/departments/detail\",\"mapping\":{\"department\":\"departmentId\"}},\"isPositive\":true},{\"id\":\"configure-selection\",\"request\":\"Emit selected department as a structured selection event.\",\"operationId\":\"selection.configure\",\"params\":{\"action\":\"emit\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true},{\"id\":\"toggle-legend\",\"request\":\"Show the legend.\",\"operationId\":\"legend.configure\",\"params\":{\"enabled\":true},\"isPositive\":true},{\"id\":\"toggle-tooltip\",\"request\":\"Disable tooltips.\",\"operationId\":\"tooltip.configure\",\"params\":{\"enabled\":false},\"isPositive\":true},{\"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},{\"id\":\"reject-ambiguous-series-target\",\"request\":\"Remove total when more than one chart series resolves to total.\",\"operationId\":\"series.remove\",\"target\":\"total\",\"params\":{\"field\":\"total\"},\"isPositive\":false},{\"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},{\"id\":\"reject-unsafe-target\",\"request\":\"Navigate to javascript:alert(1) on drilldown.\",\"operationId\":\"drilldown.configure\",\"params\":{\"event\":\"drillDown\",\"action\":\"navigate\",\"target\":\"javascript:alert(1)\"},\"isPositive\":false}]}",
3029
+ "content": "{\"schemaVersion\":\"1.0.0\",\"manifestVersion\":\"1.2.0\",\"componentId\":\"praxis-chart\",\"ownerPackage\":\"@praxisui/charts\",\"configSchemaId\":\"PraxisXUiChartContract\",\"chunkSection\":\"examples\",\"examples\":[{\"id\":\"set-bar-chart\",\"request\":\"Use a bar chart for employees by department.\",\"operationId\":\"chart.type.set\",\"params\":{\"kind\":\"bar\"},\"isPositive\":true},{\"id\":\"add-salary-series\",\"request\":\"Add salary as a summed metric.\",\"operationId\":\"series.add\",\"params\":{\"field\":\"salary\",\"aggregation\":\"sum\",\"label\":\"Salary\"},\"isPositive\":true},{\"id\":\"remove-old-series\",\"request\":\"Remove the old cost series.\",\"operationId\":\"series.remove\",\"target\":\"cost\",\"params\":{\"field\":\"cost\"},\"isPositive\":true},{\"id\":\"configure-secondary-axis\",\"request\":\"Put margin on a secondary axis for the combo chart.\",\"operationId\":\"axis.configure\",\"params\":{\"metricField\":\"margin\",\"metricAxis\":\"secondary\"},\"isPositive\":true},{\"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},{\"id\":\"set-query-context\",\"request\":\"Limit the chart to active employees and sort by total descending.\",\"operationId\":\"queryContext.set\",\"params\":{\"filters\":{\"status\":\"ACTIVE\"},\"sort\":[\"total,desc\"],\"limit\":10},\"isPositive\":true},{\"id\":\"configure-cross-filter\",\"request\":\"Use selected department to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true},{\"id\":\"configure-stats-key-cross-filter\",\"request\":\"Use the governed department bucket identity to filter the employee table.\",\"operationId\":\"crossFilter.configure\",\"params\":{\"action\":\"filter-widget\",\"target\":\"employeesTable\",\"mapping\":{\"key\":\"departmentIdsIn\"}},\"isPositive\":true},{\"id\":\"configure-drilldown\",\"request\":\"Open the department detail when a point is clicked.\",\"operationId\":\"drilldown.configure\",\"params\":{\"action\":\"navigate\",\"target\":\"/departments/detail\",\"mapping\":{\"department\":\"departmentId\"}},\"isPositive\":true},{\"id\":\"configure-selection\",\"request\":\"Emit selected department as a structured selection event.\",\"operationId\":\"selection.configure\",\"params\":{\"action\":\"emit\",\"mapping\":{\"department\":\"department\"}},\"isPositive\":true},{\"id\":\"toggle-legend\",\"request\":\"Show the legend.\",\"operationId\":\"legend.configure\",\"params\":{\"enabled\":true},\"isPositive\":true},{\"id\":\"toggle-tooltip\",\"request\":\"Disable tooltips.\",\"operationId\":\"tooltip.configure\",\"params\":{\"enabled\":false},\"isPositive\":true},{\"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},{\"id\":\"reject-ambiguous-series-target\",\"request\":\"Remove total when more than one chart series resolves to total.\",\"operationId\":\"series.remove\",\"target\":\"total\",\"params\":{\"field\":\"total\"},\"isPositive\":false},{\"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},{\"id\":\"reject-unsafe-target\",\"request\":\"Navigate to javascript:alert(1) on drilldown.\",\"operationId\":\"drilldown.configure\",\"params\":{\"event\":\"drillDown\",\"action\":\"navigate\",\"target\":\"javascript:alert(1)\"},\"isPositive\":false}]}",
2651
3030
  "sourcePointer": "projects/praxis-charts/src/lib/ai/praxis-charts-authoring-manifest.ts",
2652
- "contentHash": "afbff71974255aa301bda6746460ef1bd6e57cb562650cdd84fb1a7ae4c26b84",
3031
+ "contentHash": "a469707a1a812c493eb7d32f2375a5af0190519d031cffcbae380e71b60211e2",
2653
3032
  "sourceKind": "component_definition",
2654
3033
  "sourceId": "praxis-chart",
2655
3034
  "corpusVersion": "1.0.0"