ggaction 0.0.8 → 0.0.10

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.
Files changed (35) hide show
  1. package/CHANGELOG.md +40 -0
  2. package/README.md +34 -6
  3. package/knowledge/action-cards.json +10941 -0
  4. package/knowledge/extension-authoring.md +248 -0
  5. package/knowledge/intent-taxonomy.json +183 -0
  6. package/knowledge/mcp-resources.json +95 -0
  7. package/knowledge/task-packet.schema.json +159 -0
  8. package/knowledge/task-resolver.js +1230 -0
  9. package/package.json +11 -1
  10. package/src/actions/basic.js +3 -3
  11. package/src/actions/coordinates/actions.js +4 -0
  12. package/src/actions/encodings/position/policies/line.js +5 -1
  13. package/src/actions/guides/legends/categorical/index.js +85 -2
  14. package/src/actions/guides/legends/categorical/symbols.js +2 -76
  15. package/src/actions/index.js +1 -1
  16. package/src/actions/primitives/index.js +27 -0
  17. package/src/actions/primitives/semantic.js +22 -185
  18. package/src/actions/primitives/semanticAction.js +188 -0
  19. package/src/actions/primitives/semanticValidation/dataset.js +7 -3
  20. package/src/actions/primitives/semanticValidation/index.js +28 -15
  21. package/src/actions/primitives/semanticValidation/layer.js +20 -16
  22. package/src/core/action.js +20 -5
  23. package/src/core/extensionRegistry.js +104 -0
  24. package/src/extension.js +8 -1
  25. package/src/grammar/transformTopology.js +18 -0
  26. package/src/grammar/transforms.js +21 -20
  27. package/src/materialization/dataProvenance.js +2 -2
  28. package/src/materialization/marks/pathOrder.js +2 -2
  29. package/src/mcp/adapter.js +206 -0
  30. package/src/mcp/cli.js +11 -0
  31. package/src/mcp/server.js +101 -0
  32. package/types/extension.d.ts +19 -0
  33. package/types/program.d.ts +4 -0
  34. package/src/actions/coordinates/index.js +0 -5
  35. package/src/actions/primitives/semanticValue.js +0 -1
@@ -0,0 +1,248 @@
1
+ # Extension Authoring Knowledge
2
+
3
+ ## Purpose and authority
4
+
5
+ This is the compact, installed guide for LLM agents that build extension
6
+ packages against this copy of ggaction. It is ordinary package knowledge, not
7
+ an `AGENTS.md` file, so an extension repository must explicitly tell its agent
8
+ to read it.
9
+
10
+ Use the version in [`package.json`](../package.json) as the compatibility
11
+ baseline. For exact current behavior, the installed runtime and declarations
12
+ take precedence over this guide. Do not substitute behavior from the mutable
13
+ GitHub default branch, a roadmap, or a different installed version.
14
+
15
+ ## Minimum intake
16
+
17
+ Before proposing or implementing an extension action:
18
+
19
+ 1. Read [`types/extension.d.ts`](../types/extension.d.ts) and
20
+ [`src/extension.js`](../src/extension.js) to confirm the installed public
21
+ extension entry point.
22
+ 2. Search [`action-cards.json`](./action-cards.json) for actions whose names,
23
+ intents, owned resources, or prerequisites overlap the requested feature.
24
+ Read only relevant cards instead of loading the complete catalog into the
25
+ working context.
26
+ 3. Inspect the installed declaration and source for each reuse candidate when
27
+ the action card does not settle a signature, default, error, ownership, or
28
+ interaction question.
29
+ 4. Record in the extension specification which ggaction actions are reused,
30
+ which domain behavior remains new, and the installed ggaction version used
31
+ for that decision.
32
+
33
+ [`task-resolver.js`](./task-resolver.js) may help decompose a concrete chart
34
+ request into current built-in actions. Its result is chart-authoring guidance,
35
+ not authority for extension APIs or unsupported core behavior.
36
+
37
+ ## Design from the feature, then the actions
38
+
39
+ Start with the visualization the extension must make possible and its accepted
40
+ data. Derive action boundaries only after that feature contract is clear.
41
+
42
+ - Reuse a current public action when it already owns the required behavior.
43
+ - Compose public domain actions for existing chart resources instead of
44
+ recreating their scale, guide, layout, mark, transform, or renderer logic.
45
+ - Add an extension action only for domain behavior that current actions cannot
46
+ express coherently.
47
+ - Use extension primitives only inside a domain action that owns the resulting
48
+ semantic and graphical lifecycle. Primitives are not a replacement chart
49
+ authoring surface.
50
+ - Never call private helpers or internal wrapped actions from an extension.
51
+ - Require an explicit resource ID when existing state does not identify one
52
+ unique dataset, mark, scale, coordinate, guide, or graphic.
53
+
54
+ ## Freeze the executable design before code
55
+
56
+ Before implementation, record one complete vertical slice in the extension
57
+ specification:
58
+
59
+ - the accepted input forms, canonical domain representation, and deterministic
60
+ conversions between them;
61
+ - the shortest complete public program that demonstrates the feature;
62
+ - an ordered action hierarchy that distinguishes reused public actions from new
63
+ extension actions and records conditional children;
64
+ - the canonical owner of every semantic value, derived resource, and graphic;
65
+ and
66
+ - the expected create, repeat, edit, remove, data-change, and relevant
67
+ Canvas/scale lifecycle.
68
+
69
+ Do not begin dependent implementation while the slice still requires an
70
+ unresolved core primitive, renderer capability, semantic path, ownership rule,
71
+ or composition mechanism. Keep that requirement as an explicit upstream
72
+ decision instead of inventing a local substitute.
73
+
74
+ ## Composition and ownership
75
+
76
+ A high-level extension action must call a reusable public action when that
77
+ action owns the required validation, inference, state, or materialization. Do
78
+ not flatten an action hierarchy into copied validators, name matching, or
79
+ parallel state updates. The parent should remain thin and its meaningful child
80
+ calls should appear in deterministic trace order.
81
+
82
+ Give each capability one canonical resolver and one canonical state owner.
83
+ Store requested, inferred, and default values where downstream consumers can
84
+ trace them; do not duplicate the same semantic fact in several resources.
85
+ Omitted targets may resolve only from an explicit current owner or one unique
86
+ compatible owner. Missing and ambiguous ownership are different errors, and
87
+ neither permits selecting the first candidate.
88
+
89
+ Type-checking an action hierarchy is not runtime closure. Exercise the complete
90
+ program with representative data so that every prerequisite, target, derived
91
+ resource, guide, and renderer route is real and connected.
92
+
93
+ ## Core model
94
+
95
+ - `ChartProgram` is immutable. Return a new program and preserve earlier
96
+ programs and caller-owned input.
97
+ - `semanticSpec` records chart meaning. Fully materialized, backend-neutral
98
+ `graphicSpec` records concrete output.
99
+ - A semantic edit does not compile into graphics automatically. The owning
100
+ domain action must invoke every graphical operation required by its semantic
101
+ change.
102
+ - Renderers consume `graphicSpec`; extension state must not contain
103
+ renderer-specific objects or commands.
104
+ - A user-visible extension action should form one meaningful trace subtree.
105
+ Lower-level wrapped calls belong beneath it.
106
+
107
+ ## Lifecycle and atomic failure
108
+
109
+ Validate a normalized complete candidate and every affected downstream
110
+ consumer before returning the first changed program. A rejected action must
111
+ preserve the earlier program, trace, semantic and graphic state, caller-owned
112
+ options, and source rows.
113
+
114
+ When a supported semantic revision changes graphical output, the owning action
115
+ must rebind every affected consumer, rematerialize each required resource once,
116
+ and remove only resources that are truly orphaned. Repeated calls must not
117
+ accumulate geometry, duplicate resources, or revive state removed by an earlier
118
+ action. Removal must clear owned semantic, graphic, guide, selection, highlight,
119
+ and convenience context that would otherwise become stale.
120
+
121
+ If the public extension boundary cannot express a required rebind,
122
+ rematerialization, or safe release, stop at the upstream decision boundary.
123
+ Do not reproduce private lifecycle machinery inside the extension.
124
+
125
+ ## Primitive oracle and visual acceptance
126
+
127
+ For new visual behavior, first build one readable primitive baseline. Reuse
128
+ existing public data, mark, encoding, scale, guide, layout, and renderer actions;
129
+ use extension primitives only for the behavior that is genuinely missing.
130
+ Keep pure geometry or statistical expectations in an independent literal
131
+ oracle rather than copying the production implementation.
132
+
133
+ The final public extension program and its primitive baseline must converge on
134
+ the same semantic result, concrete `graphicSpec`, drawing order, and applicable
135
+ renderer calls. For one representative contract, compare decoded pixels when
136
+ the renderer permits deterministic raster evidence. A renderer completing
137
+ without throwing is not sufficient: also assert item cardinality, finite
138
+ geometry, topology, bounds, clipping, and value-to-geometry invariants.
139
+
140
+ When a feature introduces a new appearance or layout, treat representative
141
+ visual review as a separate acceptance gate. Structural tests cannot decide
142
+ whether spacing, alignment, hierarchy, or readability matches the intended
143
+ visual contract.
144
+
145
+ ## Current action-authoring boundary
146
+
147
+ Import `action` and `registerExtension` from `ggaction/extension`. An installable
148
+ extension package defines all methods with `action()` and calls
149
+ `registerExtension({ name, actions })` once when its entry module is imported.
150
+ The package must mark that entry as a side effect so bundlers preserve the
151
+ registration import.
152
+
153
+ Registration adds actions only to the complete `chart()` program from
154
+ `ggaction`; it never changes `ggaction/basic`. Each action key must equal the
155
+ wrapped action's `op`. Extension names, built-in and internal program names, and
156
+ previously registered action names cannot collide. The complete action map is
157
+ validated before any method is installed, and non-conflicting extension
158
+ packages must work in either import order.
159
+
160
+ Every wrapped action:
161
+
162
+ - has a stable, non-empty `op` and `description`;
163
+ - accepts one plain options object;
164
+ - runs with the entered immutable program as `this`;
165
+ - returns an instance of the same `ChartProgram` subclass; and
166
+ - leaves a successful result with an empty action stack.
167
+
168
+ For strict TypeScript, augment `RegisteredExtensionActions` in the
169
+ `ggaction/extension` module with each property typed as its exact wrapped action.
170
+ Confirm the exact generic and return types in the installed
171
+ [`types/extension.d.ts`](../types/extension.d.ts) instead of copying a signature
172
+ from another version.
173
+
174
+ `ChartProgram` remains available for deliberately isolated local subclasses.
175
+ Do not mutate its shared prototype directly; installable packages use
176
+ `registerExtension()` so registration is checked and composable.
177
+
178
+ The low-level primitives available through `ChartProgram` are:
179
+
180
+ - `editSemantic` for a supported semantic path;
181
+ - `createGraphics` for backend-neutral graphic identity and hierarchy; and
182
+ - `editGraphics` for concrete graphic values or removal.
183
+
184
+ Use the installed declarations and validation behavior to determine supported
185
+ paths, graphic types, properties, and values. Do not invent opaque semantic
186
+ branches, graphic properties, renderer instructions, or automatic
187
+ materialization.
188
+
189
+ ## Upstream decision boundary
190
+
191
+ Stop extension implementation and propose a ggaction core change when the
192
+ feature requires any of the following:
193
+
194
+ - a semantic path or persisted value the installed core rejects;
195
+ - a new shared graphic primitive or renderer capability;
196
+ - access to a private or internal action;
197
+ - a change to immutable state, trace, materialization, or renderer boundaries;
198
+ - a change to the public extension registration or composition mechanism; or
199
+ - behavior that would be duplicated inconsistently across extensions.
200
+
201
+ Keep that core proposal separate from the extension implementation. Do not hide
202
+ the missing core contract behind monkey-patching, source-relative imports,
203
+ renderer-specific state, or copied internal code.
204
+
205
+ ## LLM working discipline
206
+
207
+ - Read the installed compact knowledge needed for the current feature; do not
208
+ preload complete documentation or copy rules from historical roadmaps.
209
+ - When using the task resolver, submit only the exact user request. Do not add
210
+ dataset contents or code scaffolding to the query.
211
+ - Make specifications and examples executable without guesswork: include exact
212
+ public imports, program construction, data and Canvas prerequisites,
213
+ immutable chaining or reassignment, and the requested renderer call.
214
+ - Treat a known unsupported capability as terminal. Keep a decision that needs
215
+ user input or a bounded reference read explicitly unresolved; never hide
216
+ either case behind a nearby action or silent partial output.
217
+ - Keep failure feedback bounded and actionable. Preserve the original failure
218
+ category while reporting the smallest public correction path.
219
+
220
+ ## Required evidence
221
+
222
+ For each new public extension action, verify at least:
223
+
224
+ - the public package entry works from an installed-package consumer;
225
+ - importing the package registers every declared action on `chart()` but not
226
+ `ggaction/basic`;
227
+ - registration rejects collisions and invalid batches without partial changes,
228
+ and non-conflicting packages work in either import order;
229
+ - strict TypeScript sees the exact registered action methods through
230
+ `RegisteredExtensionActions`;
231
+ - earlier programs and caller-owned input remain unchanged;
232
+ - semantic and graphic state match the feature specification;
233
+ - the trace has the intended root action and wrapped children;
234
+ - the shortest valid call, boundary values, empty or missing input, invalid
235
+ input, ambiguity, repeated calls, supported lifecycle changes, and recovery
236
+ after failure behave explicitly;
237
+ - semantic revisions leave no stale binding, graphic, guide, context, or
238
+ duplicate resource;
239
+ - a primitive baseline and public extension program satisfy their declared
240
+ semantic, graphic, order, renderer-call, and representative visual parity;
241
+ - failures are deterministic and explain how to correct invalid or ambiguous
242
+ input; and
243
+ - representative rendering succeeds in every renderer the extension claims to
244
+ support.
245
+
246
+ Keep the extension specification, implementation, declarations, package
247
+ exports, tests, examples, and user documentation synchronized as one
248
+ user-facing change.
@@ -0,0 +1,183 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "constraints": [
4
+ { "id": "program.canvas", "phrases": ["chart canvas", "create canvas", "plot bounds"] },
5
+ { "id": "program.data", "phrases": ["create dataset", "load rows", "inline data"] },
6
+
7
+ { "id": "chart.scatter", "phrases": ["scatter plot", "scatter chart", "point chart"] },
8
+ { "id": "chart.line", "phrases": ["line chart", "line plot", "time series chart"] },
9
+ { "id": "chart.bar", "phrases": ["bar chart", "bar plot", "column chart"] },
10
+ { "id": "chart.histogram", "phrases": ["histogram", "binned distribution", "frequency distribution", "frequency histogram"] },
11
+ { "id": "chart.heatmap", "phrases": ["heatmap", "heat map", "two dimensional distribution"] },
12
+ { "id": "chart.parallel", "phrases": ["parallel coordinates", "parallel coordinate plot"] },
13
+ { "id": "chart.box", "phrases": ["box plot", "boxplot", "quartile plot"] },
14
+ { "id": "chart.violin", "phrases": ["violin plot", "violin chart"] },
15
+ { "id": "chart.gradient", "phrases": ["gradient plot", "density gradient"] },
16
+ { "id": "chart.density", "phrases": ["density plot", "density curve", "kernel density plot"] },
17
+
18
+ { "id": "mark.point", "phrases": ["point mark", "circle marks"] },
19
+ { "id": "mark.tick", "phrases": ["tick mark", "tick plot", "strip plot"] },
20
+ { "id": "mark.text", "phrases": ["text mark", "data labels"] },
21
+ { "id": "mark.line", "phrases": ["line mark", "path mark"] },
22
+ { "id": "mark.bar", "phrases": ["bar mark", "rectangle bars"] },
23
+ { "id": "mark.area", "phrases": ["area mark", "filled area"] },
24
+ { "id": "mark.rule", "phrases": ["rule mark", "reference line mark"], "shadows": ["mark.line"] },
25
+ { "id": "mark.arc", "phrases": ["arc mark", "polar sectors"] },
26
+ { "id": "mark.rect", "phrases": ["rect mark", "rectangle cells"] },
27
+
28
+ { "id": "transform.filter", "phrases": ["filter data", "filtered dataset", "filter rows"] },
29
+ { "id": "transform.density", "phrases": ["density data", "kde data", "kernel density data"] },
30
+ { "id": "transform.regression", "phrases": ["regression data", "fitted rows", "loess data"] },
31
+ { "id": "transform.window", "phrases": ["moving average", "moving mean", "window transform", "rank rows", "lag values"] },
32
+ { "id": "transform.timeUnit", "phrases": ["time unit", "date bucket", "month bucket", "year bucket"] },
33
+ { "id": "transform.bin1d", "phrases": ["bin one field", "one dimensional bins", "histogram bins"] },
34
+ { "id": "transform.bin2d", "phrases": ["bin two fields", "two dimensional bins", "rectangular bins", "binned heatmap"] },
35
+ { "id": "transform.interval", "phrases": ["interval data", "confidence interval data", "summary interval"] },
36
+
37
+ { "id": "statistics.regression", "phrases": ["regression line", "trend line", "fitted line", "regression fit", "best fit line", "fitted trend"] },
38
+ { "id": "statistics.errorBar", "phrases": ["error bars", "error bar"] },
39
+ { "id": "statistics.errorBand", "phrases": ["error band", "uncertainty ribbon", "confidence band"] },
40
+
41
+ { "id": "scale.create", "phrases": ["create scale", "named scale", "custom scale"] },
42
+ { "id": "scale.log", "phrases": ["log scale", "logarithmic scale"] },
43
+ { "id": "scale.time", "phrases": ["time scale", "temporal scale"] },
44
+ { "id": "scale.color", "phrases": ["color scale", "colour scale", "palette scale"] },
45
+
46
+ { "id": "encoding.x", "phrases": ["x encoding", "encode x", "map to x"] },
47
+ { "id": "encoding.y", "phrases": ["y encoding", "encode y", "map to y"] },
48
+ { "id": "encoding.color", "phrases": ["color encoding", "encode color", "map to color", "color legend", "colour legend"] },
49
+ { "id": "encoding.size", "phrases": ["size encoding", "encode size", "map to size"] },
50
+ { "id": "encoding.shape", "phrases": ["shape encoding", "encode shape", "map to shape"] },
51
+ { "id": "encoding.angle", "phrases": ["angle encoding", "encode angle", "rotate ticks", "rotate points"] },
52
+ { "id": "encoding.opacity", "phrases": ["opacity encoding", "encode opacity", "map to opacity"] },
53
+ { "id": "encoding.strokeDash", "phrases": ["stroke dash encoding", "dash encoding", "line style encoding"] },
54
+ { "id": "encoding.strokeWidth", "phrases": ["stroke width encoding", "encode stroke width", "line width encoding"] },
55
+ { "id": "encoding.text", "phrases": ["text encoding", "encode text", "label field"] },
56
+ { "id": "encoding.group", "phrases": ["group encoding", "group series", "series grouping"] },
57
+ { "id": "encoding.theta", "phrases": ["theta encoding", "angular encoding", "encode theta"] },
58
+ { "id": "encoding.radius", "phrases": ["radius encoding", "radial encoding", "encode radius"] },
59
+ { "id": "encoding.parallel", "phrases": ["parallel dimensions", "dimension axes"] },
60
+
61
+ { "id": "guide.all", "phrases": ["create guides", "automatic guides", "all guides"] },
62
+ { "id": "guide.axes", "phrases": ["axes", "axis guides", "x and y axes"] },
63
+ { "id": "guide.xAxis", "phrases": ["x axis", "horizontal axis"] },
64
+ { "id": "guide.yAxis", "phrases": ["y axis", "vertical axis"] },
65
+ { "id": "guide.legend", "phrases": ["legend", "encoding key"] },
66
+ { "id": "guide.grid", "phrases": ["grid lines", "chart grid", "reference grid"] },
67
+ { "id": "guide.title", "phrases": ["chart title", "add title", "title and subtitle"] },
68
+ { "id": "guide.subtitle", "phrases": ["subtitle", "title and subtitle"] },
69
+
70
+ { "id": "layout.legend.bottom", "phrases": ["legend at bottom", "bottom legend"], "exclusiveGroup": "legend.position" },
71
+ { "id": "layout.legend.top", "phrases": ["legend at top", "top legend"], "exclusiveGroup": "legend.position" },
72
+ { "id": "layout.legend.left", "phrases": ["legend at left", "left legend"], "exclusiveGroup": "legend.position" },
73
+ { "id": "layout.legend.right", "phrases": ["legend at right", "right legend"], "exclusiveGroup": "legend.position" },
74
+ { "id": "layout.labels", "phrases": ["avoid label overlap", "label collision", "layout labels"] },
75
+ { "id": "layout.jitter", "phrases": ["jitter points", "point jitter", "reduce overplotting"] },
76
+ { "id": "layout.categoryOrder", "phrases": ["order categories", "sort categories", "category order"] },
77
+ { "id": "layout.facet", "phrases": ["facet chart", "small multiples", "repeat chart by field"] },
78
+
79
+ { "id": "selection.store", "phrases": ["store selection", "reusable selection", "select marks"] },
80
+ { "id": "selection.highlight", "phrases": ["highlight marks", "highlight selected", "conditional highlight"] },
81
+ { "id": "selection.filter", "phrases": ["filter marks", "retain matching marks"] },
82
+
83
+ { "id": "composition.horizontal", "phrases": ["horizontal concat", "horizontally concatenate", "charts side by side"] },
84
+ { "id": "composition.vertical", "phrases": ["vertical concat", "vertically concatenate", "stack charts vertically"] },
85
+
86
+ { "id": "renderer.canvas", "phrases": ["render to canvas", "browser canvas", "canvas renderer", "on canvas", "on the chart canvas"] },
87
+ { "id": "renderer.svg", "phrases": ["render svg", "export svg", "svg output", "as svg", "vector svg", "svg document"] },
88
+ { "id": "renderer.png", "phrases": ["render png", "export png", "png output", "as png"] },
89
+ { "id": "renderer.pdf", "phrases": ["render pdf", "export pdf", "pdf output", "as pdf", "vector pdf", "pdf document"] },
90
+
91
+ { "id": "unsupported.geo", "phrases": ["map chart", "geographic chart", "geo projection", "choropleth"], "unsupported": "Geographic projections and map marks are outside the current ggaction contract." },
92
+ { "id": "unsupported.animation", "phrases": ["animate chart", "chart animation", "animated transition"], "unsupported": "Animation is outside the current static-chart contract." },
93
+ { "id": "unsupported.interaction", "phrases": ["interactive tooltip", "zoom interaction", "pan interaction", "brush interaction"], "unsupported": "Interactive runtime behaviors are outside the current static-chart contract." },
94
+ { "id": "unsupported.3d", "phrases": ["3d chart", "three dimensional chart", "three dimensional plot"], "unsupported": "Three-dimensional charts are not supported." },
95
+ { "id": "unsupported.jpg", "phrases": ["export jpg", "render jpeg", "jpeg output", "jpeg image", "jpg image"], "unsupported": "JPEG is not a current renderer; use SVG, PNG, PDF, or Browser Canvas." }
96
+ ],
97
+ "providers": [
98
+ { "id": "action.createCanvas", "kind": "action", "name": "createCanvas", "order": 10, "anchors": ["program.canvas"], "covers": ["program.canvas"], "baseOptions": {} },
99
+ { "id": "action.createData", "kind": "action", "name": "createData", "order": 20, "anchors": ["program.data"], "covers": ["program.data"], "baseOptions": { "values": "[{ category: \"A\", x: 1, y: 2, value: 3 }]" } },
100
+
101
+ { "id": "action.createScatterPlot", "kind": "action", "name": "createScatterPlot", "order": 40, "anchors": ["chart.scatter"], "covers": ["chart.scatter", "encoding.x", "encoding.y", "encoding.color", "encoding.size", "encoding.shape", "guide.axes", "guide.legend"], "baseOptions": { "x": "\"x\"", "y": "\"y\"" }, "optionsByConstraint": { "encoding.color": { "color": "\"category\"" }, "encoding.size": { "size": "\"value\"" }, "encoding.shape": { "shape": "\"category\"" }, "guide.axes": { "guides": "{}" }, "guide.legend": { "guides": "{ legend: {} }" } } },
102
+ { "id": "action.createLinePlot", "kind": "action", "name": "createLinePlot", "order": 40, "anchors": ["chart.line"], "covers": ["chart.line", "encoding.x", "encoding.y", "encoding.color", "encoding.group", "encoding.strokeDash", "guide.axes", "guide.legend"], "baseOptions": { "x": "\"x\"", "y": "\"y\"" }, "optionsByConstraint": { "encoding.color": { "color": "\"category\"" }, "encoding.group": { "groupBy": "\"category\"" }, "encoding.strokeDash": { "strokeDash": "{ field: \"category\" }" }, "guide.axes": { "guides": "{}" }, "guide.legend": { "guides": "{ legend: {} }" } } },
103
+ { "id": "action.createBarPlot", "kind": "action", "name": "createBarPlot", "order": 40, "anchors": ["chart.bar"], "covers": ["chart.bar", "encoding.x", "encoding.y", "encoding.color", "guide.axes", "guide.legend"], "baseOptions": { "x": "\"category\"", "y": "\"value\"" }, "optionsByConstraint": { "encoding.color": { "color": "\"category\"" }, "guide.axes": { "guides": "{}" }, "guide.legend": { "guides": "{ legend: {} }" } } },
104
+ { "id": "action.createHistogram", "kind": "action", "name": "createHistogram", "order": 40, "anchors": ["chart.histogram"], "covers": ["chart.histogram", "transform.bin1d", "encoding.color", "guide.axes", "guide.legend"], "baseOptions": { "field": "\"value\"" }, "optionsByConstraint": { "encoding.color": { "color": "\"category\"" }, "guide.axes": { "guides": "{}" }, "guide.legend": { "guides": "{ legend: {} }" } } },
105
+ { "id": "action.createHeatmap", "kind": "action", "name": "createHeatmap", "order": 40, "anchors": ["chart.heatmap"], "covers": ["chart.heatmap", "transform.bin2d", "encoding.x", "encoding.y", "encoding.color", "guide.axes", "guide.legend"], "baseOptions": { "x": "\"x\"", "y": "\"y\"", "bin": "{}" }, "optionsByConstraint": { "encoding.color": { "color": "{}" }, "guide.axes": { "guides": "{}" }, "guide.legend": { "guides": "{ legend: {} }" } } },
106
+ { "id": "action.createParallelCoordinates", "kind": "action", "name": "createParallelCoordinates", "order": 40, "anchors": ["chart.parallel"], "covers": ["chart.parallel", "encoding.parallel", "encoding.color", "encoding.strokeDash", "guide.axes", "guide.legend"], "baseOptions": { "dimensions": "[\"a\", \"b\"]" }, "optionsByConstraint": { "encoding.color": { "color": "\"category\"" }, "encoding.strokeDash": { "strokeDash": "{ field: \"category\" }" }, "guide.axes": { "guides": "{}" }, "guide.legend": { "guides": "{ legend: {} }" } } },
107
+ { "id": "action.createBoxPlot", "kind": "action", "name": "createBoxPlot", "order": 40, "anchors": ["chart.box"], "covers": ["chart.box", "guide.axes"], "baseOptions": {}, "optionsByConstraint": { "guide.axes": { "guides": "{}" } } },
108
+ { "id": "action.createViolinPlot", "kind": "action", "name": "createViolinPlot", "order": 40, "anchors": ["chart.violin"], "covers": ["chart.violin", "encoding.color", "guide.axes", "guide.legend"], "baseOptions": { "x": "\"category\"", "y": "\"value\"" }, "optionsByConstraint": { "encoding.color": { "color": "\"category\"" }, "guide.axes": { "guides": "{}" }, "guide.legend": { "guides": "{ legend: {} }" } } },
109
+ { "id": "action.createGradientPlot", "kind": "action", "name": "createGradientPlot", "order": 40, "anchors": ["chart.gradient"], "covers": ["chart.gradient", "guide.axes"], "baseOptions": {}, "optionsByConstraint": { "guide.axes": { "guides": "{}" } } },
110
+ { "id": "action.encodeDensity", "kind": "action", "name": "encodeDensity", "order": 50, "anchors": ["chart.density"], "covers": ["chart.density"], "baseOptions": { "field": "\"value\"" } },
111
+
112
+ { "id": "action.createPointMark", "kind": "action", "name": "createPointMark", "order": 40, "anchors": ["mark.point"], "covers": ["mark.point"], "baseOptions": {} },
113
+ { "id": "action.createTickMark", "kind": "action", "name": "createTickMark", "order": 40, "anchors": ["mark.tick"], "covers": ["mark.tick"], "baseOptions": {} },
114
+ { "id": "action.createTextMark", "kind": "action", "name": "createTextMark", "order": 40, "anchors": ["mark.text"], "covers": ["mark.text"], "baseOptions": {} },
115
+ { "id": "action.createLineMark", "kind": "action", "name": "createLineMark", "order": 40, "anchors": ["mark.line"], "covers": ["mark.line"], "baseOptions": {} },
116
+ { "id": "action.createBarMark", "kind": "action", "name": "createBarMark", "order": 40, "anchors": ["mark.bar"], "covers": ["mark.bar"], "baseOptions": {} },
117
+ { "id": "action.createAreaMark", "kind": "action", "name": "createAreaMark", "order": 40, "anchors": ["mark.area"], "covers": ["mark.area"], "baseOptions": {} },
118
+ { "id": "action.createRuleMark", "kind": "action", "name": "createRuleMark", "order": 40, "anchors": ["mark.rule"], "covers": ["mark.rule"], "baseOptions": {} },
119
+ { "id": "action.createArcMark", "kind": "action", "name": "createArcMark", "order": 40, "anchors": ["mark.arc"], "covers": ["mark.arc"], "baseOptions": {} },
120
+ { "id": "action.createRectMark", "kind": "action", "name": "createRectMark", "order": 40, "anchors": ["mark.rect"], "covers": ["mark.rect"], "baseOptions": {} },
121
+
122
+ { "id": "action.filterData", "kind": "action", "name": "filterData", "order": 30, "anchors": ["transform.filter"], "covers": ["transform.filter"], "baseOptions": { "id": "\"filtered\"", "field": "\"value\"", "predicate": "{ op: \"gt\", value: 0 }" } },
123
+ { "id": "action.createDensityData", "kind": "action", "name": "createDensityData", "order": 30, "anchors": ["transform.density"], "covers": ["transform.density"], "baseOptions": { "id": "\"density\"", "field": "\"value\"" } },
124
+ { "id": "action.createRegressionData", "kind": "action", "name": "createRegressionData", "order": 30, "anchors": ["transform.regression"], "covers": ["transform.regression"], "baseOptions": { "id": "\"regression\"", "x": "\"x\"", "y": "\"y\"" } },
125
+ { "id": "action.createWindowData", "kind": "action", "name": "createWindowData", "order": 30, "anchors": ["transform.window"], "covers": ["transform.window"], "baseOptions": { "id": "\"windowed\"", "operations": "[{ op: \"movingMean\", field: \"value\", as: \"movingMean\", frame: { preceding: 2 } }]" } },
126
+ { "id": "action.createTimeUnitData", "kind": "action", "name": "createTimeUnitData", "order": 30, "anchors": ["transform.timeUnit"], "covers": ["transform.timeUnit"], "baseOptions": { "id": "\"monthly\"", "field": "\"date\"", "unit": "\"month\"", "as": "\"month\"" } },
127
+ { "id": "action.encodeHistogram", "kind": "action", "name": "encodeHistogram", "order": 50, "anchors": ["transform.bin1d"], "covers": ["transform.bin1d"], "baseOptions": { "field": "\"value\"" } },
128
+ { "id": "action.createBin2DData", "kind": "action", "name": "createBin2DData", "order": 30, "anchors": ["transform.bin2d"], "covers": ["transform.bin2d"], "baseOptions": { "id": "\"bins\"", "x": "\"x\"", "y": "\"y\"" } },
129
+ { "id": "action.createIntervalData", "kind": "action", "name": "createIntervalData", "order": 30, "anchors": ["transform.interval"], "covers": ["transform.interval"], "baseOptions": { "id": "\"interval\"", "field": "\"value\"" } },
130
+
131
+ { "id": "action.createRegression", "kind": "action", "name": "createRegression", "order": 60, "anchors": ["statistics.regression"], "covers": ["mark.line", "transform.regression", "statistics.regression", "statistics.errorBand"], "baseOptions": {} },
132
+ { "id": "action.createErrorBar", "kind": "action", "name": "createErrorBar", "order": 60, "anchors": ["statistics.errorBar"], "covers": ["statistics.errorBar"], "baseOptions": {} },
133
+ { "id": "action.createErrorBand", "kind": "action", "name": "createErrorBand", "order": 61, "anchors": ["statistics.errorBand"], "covers": ["statistics.errorBand"], "baseOptions": {} },
134
+
135
+ { "id": "action.createScale", "kind": "action", "name": "createScale", "order": 35, "anchors": ["scale.create"], "covers": ["scale.create"], "baseOptions": { "id": "\"scale-1\"" } },
136
+ { "id": "action.createLogScale", "kind": "action", "name": "createScale", "order": 35, "anchors": ["scale.log"], "covers": ["scale.log"], "baseOptions": { "id": "\"scale-1\"", "type": "\"log\"" } },
137
+ { "id": "action.createTimeScale", "kind": "action", "name": "createScale", "order": 35, "anchors": ["scale.time"], "covers": ["scale.time"], "baseOptions": { "id": "\"scale-1\"", "type": "\"time\"" } },
138
+ { "id": "action.createColorScale", "kind": "action", "name": "createScale", "order": 35, "anchors": ["scale.color"], "covers": ["scale.color"], "baseOptions": { "id": "\"color-scale\"", "type": "\"ordinal\"", "range": "{ palette: \"tableau10\" }" } },
139
+
140
+ { "id": "action.encodeX", "kind": "action", "name": "encodeX", "order": 50, "anchors": ["encoding.x"], "covers": ["encoding.x"], "baseOptions": { "field": "\"x\"" } },
141
+ { "id": "action.encodeY", "kind": "action", "name": "encodeY", "order": 50, "anchors": ["encoding.y"], "covers": ["encoding.y"], "baseOptions": { "field": "\"y\"" } },
142
+ { "id": "action.encodeColor", "kind": "action", "name": "encodeColor", "order": 55, "anchors": ["encoding.color"], "covers": ["encoding.color"], "baseOptions": { "field": "\"category\"" } },
143
+ { "id": "action.encodeSize", "kind": "action", "name": "encodeSize", "order": 55, "anchors": ["encoding.size"], "covers": ["encoding.size"], "baseOptions": { "field": "\"value\"" } },
144
+ { "id": "action.encodeShape", "kind": "action", "name": "encodeShape", "order": 55, "anchors": ["encoding.shape"], "covers": ["encoding.shape"], "baseOptions": { "field": "\"category\"" } },
145
+ { "id": "action.encodeAngle", "kind": "action", "name": "encodeAngle", "order": 55, "anchors": ["encoding.angle"], "covers": ["encoding.angle"], "baseOptions": { "value": "45" } },
146
+ { "id": "action.encodeOpacity", "kind": "action", "name": "encodeOpacity", "order": 55, "anchors": ["encoding.opacity"], "covers": ["encoding.opacity"], "baseOptions": { "field": "\"value\"" } },
147
+ { "id": "action.encodeStrokeDash", "kind": "action", "name": "encodeStrokeDash", "order": 55, "anchors": ["encoding.strokeDash"], "covers": ["encoding.strokeDash"], "baseOptions": { "field": "\"category\"" } },
148
+ { "id": "action.encodeStrokeWidth", "kind": "action", "name": "encodeStrokeWidth", "order": 55, "anchors": ["encoding.strokeWidth"], "covers": ["encoding.strokeWidth"], "baseOptions": { "value": "2" } },
149
+ { "id": "action.encodeText", "kind": "action", "name": "encodeText", "order": 55, "anchors": ["encoding.text"], "covers": ["encoding.text"], "baseOptions": { "field": "\"label\"" } },
150
+ { "id": "action.encodeGroup", "kind": "action", "name": "encodeGroup", "order": 52, "anchors": ["encoding.group"], "covers": ["encoding.group"], "baseOptions": { "field": "\"category\"" } },
151
+ { "id": "action.encodeTheta", "kind": "action", "name": "encodeTheta", "order": 50, "anchors": ["encoding.theta"], "covers": ["encoding.theta"], "baseOptions": { "field": "\"angle\"" } },
152
+ { "id": "action.encodeR", "kind": "action", "name": "encodeR", "order": 50, "anchors": ["encoding.radius"], "covers": ["encoding.radius"], "baseOptions": { "field": "\"value\"" } },
153
+ { "id": "action.encodeParallelCoordinates", "kind": "action", "name": "encodeParallelCoordinates", "order": 50, "anchors": ["encoding.parallel"], "covers": ["encoding.parallel"], "baseOptions": { "dimensions": "[\"a\", \"b\"]" } },
154
+
155
+ { "id": "action.createGuides", "kind": "action", "name": "createGuides", "order": 70, "anchors": ["guide.all"], "covers": ["guide.all", "guide.axes", "guide.legend", "guide.grid"], "baseOptions": {} },
156
+ { "id": "action.createAxes", "kind": "action", "name": "createAxes", "order": 70, "anchors": ["guide.axes"], "covers": ["guide.axes"], "baseOptions": {} },
157
+ { "id": "action.createXAxis", "kind": "action", "name": "createXAxis", "order": 70, "anchors": ["guide.xAxis"], "covers": ["guide.xAxis"], "baseOptions": {} },
158
+ { "id": "action.createYAxis", "kind": "action", "name": "createYAxis", "order": 70, "anchors": ["guide.yAxis"], "covers": ["guide.yAxis"], "baseOptions": {} },
159
+ { "id": "action.createLegend", "kind": "action", "name": "createLegend", "order": 70, "anchors": ["guide.legend"], "covers": ["guide.legend"], "baseOptions": {} },
160
+ { "id": "action.createGrid", "kind": "action", "name": "createGrid", "order": 70, "anchors": ["guide.grid"], "covers": ["guide.grid"], "baseOptions": {} },
161
+ { "id": "action.createTitle", "kind": "action", "name": "createTitle", "order": 70, "anchors": ["guide.title", "guide.subtitle"], "covers": ["guide.title", "guide.subtitle"], "baseOptions": { "text": "\"Chart title\"" }, "optionsByConstraint": { "guide.subtitle": { "subtitle": "\"Chart subtitle\"" } } },
162
+
163
+ { "id": "action.legendBottom", "kind": "action", "name": "editLegendLayout", "order": 80, "anchors": ["layout.legend.bottom"], "covers": ["layout.legend.bottom"], "baseOptions": { "position": "\"bottom\"" } },
164
+ { "id": "action.legendTop", "kind": "action", "name": "editLegendLayout", "order": 80, "anchors": ["layout.legend.top"], "covers": ["layout.legend.top"], "baseOptions": { "position": "\"top\"" } },
165
+ { "id": "action.legendLeft", "kind": "action", "name": "editLegendLayout", "order": 80, "anchors": ["layout.legend.left"], "covers": ["layout.legend.left"], "baseOptions": { "position": "\"left\"" } },
166
+ { "id": "action.legendRight", "kind": "action", "name": "editLegendLayout", "order": 80, "anchors": ["layout.legend.right"], "covers": ["layout.legend.right"], "baseOptions": { "position": "\"right\"" } },
167
+ { "id": "action.layoutLabels", "kind": "action", "name": "layoutLabels", "order": 80, "anchors": ["layout.labels"], "covers": ["layout.labels"], "baseOptions": { "axis": "\"y\"" } },
168
+ { "id": "action.jitterPoints", "kind": "action", "name": "jitterPoints", "order": 80, "anchors": ["layout.jitter"], "covers": ["layout.jitter"], "baseOptions": { "channel": "\"x\"", "maxOffset": "{ pixels: 4 }" } },
169
+ { "id": "action.orderCategories", "kind": "action", "name": "orderCategories", "order": 80, "anchors": ["layout.categoryOrder"], "covers": ["layout.categoryOrder"], "baseOptions": { "channel": "\"x\"", "by": "\"category\"" } },
170
+ { "id": "action.facet", "kind": "action", "name": "facet", "order": 80, "anchors": ["layout.facet"], "covers": ["layout.facet", "guide.axes", "guide.legend"], "baseOptions": { "field": "\"category\"" }, "optionsByConstraint": { "guide.axes": { "guides": "{ axes: \"outer\", legend: \"shared\" }" }, "guide.legend": { "guides": "{ axes: \"outer\", legend: \"shared\" }" } } },
171
+
172
+ { "id": "action.selectMarks", "kind": "action", "name": "selectMarks", "order": 75, "anchors": ["selection.store"], "covers": ["selection.store"], "baseOptions": { "id": "\"selection-1\"", "field": "\"category\"", "op": "\"eq\"", "value": "\"A\"" } },
173
+ { "id": "action.highlightMarks", "kind": "action", "name": "highlightMarks", "order": 76, "anchors": ["selection.highlight"], "covers": ["selection.highlight"], "baseOptions": { "select": "{ field: \"category\", op: \"eq\", value: \"A\" }", "color": "\"#f28e2b\"" } },
174
+ { "id": "action.filterMarks", "kind": "action", "name": "filterMarks", "order": 75, "anchors": ["selection.filter"], "covers": ["selection.filter"], "baseOptions": { "field": "\"value\"", "op": "\"gt\"", "value": "0" } },
175
+
176
+ { "id": "runtime.hconcat", "kind": "runtime", "name": "hconcat", "order": 90, "anchors": ["composition.horizontal"], "covers": ["composition.horizontal"], "signature": "hconcat(options: CompositionOptions): ChartProgram;", "call": "hconcat({ programs: [program, program] })", "route": "/reference/runtime/#ggaction" },
177
+ { "id": "runtime.vconcat", "kind": "runtime", "name": "vconcat", "order": 90, "anchors": ["composition.vertical"], "covers": ["composition.vertical"], "signature": "vconcat(options: CompositionOptions): ChartProgram;", "call": "vconcat({ programs: [program, program] })", "route": "/reference/runtime/#ggaction" },
178
+ { "id": "runtime.render", "kind": "runtime", "name": "render", "order": 100, "anchors": ["renderer.canvas"], "covers": ["renderer.canvas"], "signature": "render(program: Pick<ChartProgram, \"graphicSpec\">, context: CanvasRenderingContext2D, options?: { pixelRatio?: number }): void;", "call": "render(program, context)", "route": "/reference/runtime/#ggaction" },
179
+ { "id": "runtime.renderToSVG", "kind": "runtime", "name": "renderToSVG", "order": 100, "anchors": ["renderer.svg"], "covers": ["renderer.svg"], "signature": "renderToSVG(program: Pick<ChartProgram, \"graphicSpec\">, options?: SVGRenderOptions): string;", "call": "renderToSVG(program)", "route": "/reference/runtime/#ggactionsvg" },
180
+ { "id": "runtime.renderToPNG", "kind": "runtime", "name": "renderToPNG", "order": 100, "anchors": ["renderer.png"], "covers": ["renderer.png"], "signature": "renderToPNG(program: Pick<ChartProgram, \"graphicSpec\">, options: { output: string; pixelRatio?: number }): Promise<PNGRenderResult>;", "call": "await renderToPNG(program, { output: \"chart.png\" })", "route": "/reference/runtime/#ggactionpng" },
181
+ { "id": "runtime.renderToPDF", "kind": "runtime", "name": "renderToPDF", "order": 100, "anchors": ["renderer.pdf"], "covers": ["renderer.pdf"], "signature": "renderToPDF(program: Pick<ChartProgram, \"graphicSpec\">, options: PDFRenderOptions): Promise<PDFRenderResult>;", "call": "await renderToPDF(program, { output: \"chart.pdf\" })", "route": "/reference/runtime/#ggactionpdf" }
182
+ ]
183
+ }
@@ -0,0 +1,95 @@
1
+ {
2
+ "schemaVersion": 2,
3
+ "overview": {
4
+ "title": "ggaction compact authoring overview",
5
+ "text": "Use search_ggaction once with only the exact user chart request; do not append dataset contents or code scaffolding. The result contains exact authoring imports, chart() initialization, non-duplicated createCanvas and createData prerequisites, immutable executable steps with deterministic runtime dependencies closed, ordered actionPlan entries, exactCalls, required option names, canonical routes, terminal unsupported constraints, and open unresolved decisions. Do not preload the full documentation. Read an action card when one exact action needs more detail. Read only the resource URIs attached to unresolved entries; unsupported entries are terminal and require no documentation read. The server is read-only and never executes chart code."
6
+ },
7
+ "recipes": [
8
+ {
9
+ "id": "scatter-svg",
10
+ "title": "Scatterplot with a bottom color legend and SVG output",
11
+ "summary": "Selects the chart facade, legend layout action, and browser-safe SVG renderer in execution order.",
12
+ "query": "scatter plot with a color legend at bottom as svg"
13
+ },
14
+ {
15
+ "id": "moving-average-line-png",
16
+ "title": "Moving-average line chart as PNG",
17
+ "summary": "Combines a window transform, line facade, guides, and the Node PNG renderer.",
18
+ "query": "moving average line chart with axes and export png"
19
+ },
20
+ {
21
+ "id": "binned-heatmap",
22
+ "title": "Binned heatmap with guides",
23
+ "summary": "Uses the heatmap facade to own 2D binning, position, color, axes, and legend requirements.",
24
+ "query": "binned heatmap with color legend and axes"
25
+ },
26
+ {
27
+ "id": "regression-scatterplot",
28
+ "title": "Scatterplot with a regression layer",
29
+ "summary": "Builds the scatterplot before adding the statistical regression layer.",
30
+ "query": "scatter plot with a regression line"
31
+ },
32
+ {
33
+ "id": "selection-highlight",
34
+ "title": "Stored selection and highlight",
35
+ "summary": "Stores a named mark selection before applying a graphical highlight to that selection.",
36
+ "query": "store selection then highlight marks"
37
+ },
38
+ {
39
+ "id": "parallel-svg",
40
+ "title": "Styled parallel coordinates as SVG",
41
+ "summary": "Combines parallel coordinates, color and dash encodings, guides, and SVG output.",
42
+ "query": "parallel coordinates with color encoding, stroke dash encoding, axes, and legend as svg"
43
+ },
44
+ {
45
+ "id": "facet-shared-guides",
46
+ "title": "Small multiples with shared guides",
47
+ "summary": "Uses the facet action as the owner of the small-multiple layout and shared guides.",
48
+ "query": "small multiples with shared legend and axes"
49
+ },
50
+ {
51
+ "id": "horizontal-composition-svg",
52
+ "title": "Horizontal chart composition as SVG",
53
+ "summary": "Composes complete programs horizontally before serializing the parent program to SVG.",
54
+ "query": "put charts side by side and export svg"
55
+ }
56
+ ],
57
+ "docs": [
58
+ {
59
+ "id": "choose-chart-type",
60
+ "title": "Choose a chart or mark type",
61
+ "route": "/api/basic-charts/",
62
+ "text": "# Choose a chart or mark type\n\nName the intended chart or mark. Common complete chart facades are `createScatterPlot`, `createLinePlot`, `createBarPlot`, `createHistogram`, and `createHeatmap`. For lower-level authoring, choose a mark such as point, line, area, bar, rect, rule, tick, text, or arc, then add its required position encodings. Run `search_ggaction` again with the chosen chart type."
63
+ },
64
+ {
65
+ "id": "choose-renderer",
66
+ "title": "Choose an output renderer",
67
+ "route": "/api/rendering/",
68
+ "text": "# Choose an output renderer\n\nUse `render(program, context)` for Browser Canvas, `renderToSVG(program)` for a browser-safe SVG string, `renderToPNG(program, output)` for Node PNG output, or `renderToPDF(program, output)` for a single-page vector PDF. Run `search_ggaction` again with one explicit format. JPEG output is not currently supported."
69
+ },
70
+ {
71
+ "id": "legend-layout",
72
+ "title": "Resolve legend layout requirements",
73
+ "route": "/api/legends/",
74
+ "text": "# Resolve legend layout requirements\n\nA single legend resource can occupy one position at a time. Choose `top`, `bottom`, `left`, or `right`, or give distinct legends explicit IDs and edit each target separately. Run `search_ggaction` again with one position per legend."
75
+ },
76
+ {
77
+ "id": "unsupported-capabilities",
78
+ "title": "Current static-chart limitations",
79
+ "route": "/supported-features/",
80
+ "text": "# Current static-chart limitations\n\nThe current authoring contract does not provide geographic maps, animation, interactive event handling, 3D charts, or JPEG rendering. The compact resolver reports these requirements explicitly instead of substituting a different chart. Consult the supported-features route before redesigning the task with current static actions."
81
+ },
82
+ {
83
+ "id": "getting-started",
84
+ "title": "Clarify an unrecognized authoring request",
85
+ "route": "/getting-started/",
86
+ "text": "# Clarify an authoring request\n\nDescribe the chart or mark, its data/transform needs, position and appearance encodings, guides or layout, and output format in one request. Exact action names are also accepted. Example: `scatter plot with x and y, a bottom color legend, and SVG output`."
87
+ },
88
+ {
89
+ "id": "action-reference",
90
+ "title": "Resolve a current action gap",
91
+ "route": "/reference/actions/",
92
+ "text": "# Resolve a current action gap\n\nUse the complete action reference only for a constraint that the compact resolver recognized but could not cover. Confirm the exact action signature, required resource ID, and supported options, then rerun `search_ggaction` with the exact action name and complete task request."
93
+ }
94
+ ]
95
+ }