Skip to content

Commit 47e7c23

Browse files
committed
restore snapshot settings
1 parent 32870d1 commit 47e7c23

3 files changed

Lines changed: 46 additions & 45 deletions

File tree

docs/src/blog/entries/charts-that-know-what-theyre-for.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -914,7 +914,7 @@ export default {
914914
subtitle:
915915
"A heuristic-first chart recommendation engine with per-audience calibration, a literacy-growth surface, and ready-to-render props.",
916916
author: "Elijah Meeks",
917-
date: "2026-05-24",
917+
date: "2026-05-25",
918918
tags: ["case-study"],
919919
excerpt:
920920
"Semiotic 3.6.0 ships a chart recommendation engine that's heuristic-first, LLM-optional, and audience-aware. Charts now carry descriptors that declare what data shapes they serve and which questions they answer; an AudienceProfile layers per-org familiarity and adoption targets on top; a separate 'stretch' surface grows literacy without forcing it.",

docs/src/blog/entries/release-3-6-0.js

Lines changed: 39 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -51,52 +51,48 @@ function Body() {
5151
Every chart in the library now ships a capability descriptor: what data shapes it serves,
5252
what intents (`trend`, `correlation`, `distribution`, `part-to-whole`, eleven more) it
5353
answers well, what settings change those answers, and what `buildProps` would look like
54-
against a given profile. <code>suggestCharts(data, options?)</code> returns a ranked list
55-
of suggestions with runnable props, an audit trail of reasons, and caveats. Pair it with an{" "}
56-
<code>AudienceProfile</code> — a serializable per-organization config of familiarity
57-
numbers and adoption targets — and the ranking calibrates to who is actually reading.
54+
against a given profile. <code>suggestCharts(data, options?)</code> returns a ranked list of
55+
suggestions with runnable props, an audit trail of reasons, and caveats. Pair it with an{" "}
56+
<code>AudienceProfile</code> — a serializable per-organization config of familiarity numbers
57+
and adoption targets — and the ranking calibrates to who is actually reading.
5858
</p>
5959
<p>
6060
The deeper architectural move is that <em>the same descriptors</em> feed{" "}
6161
<code>suggestDashboard</code> (composite multi-intent views with honest{" "}
62-
<code>intentsMissing</code> reporting),{" "}
63-
<code>suggestStretchCharts</code> (a literacy-growth surface that shows charts the audience
64-
is unfamiliar with but the data actually supports), <code>scoreChart</code> (single-chart
65-
introspection), <code>useChartSuggestions</code> (the React hook), and the MCP server's{" "}
66-
<code>suggestCharts</code> tool. One catalog, many surfaces. The post on{" "}
67-
<Link to="/blog/charts-that-know-what-theyre-for">
68-
Charts that know what they're for
69-
</Link>{" "}
62+
<code>intentsMissing</code> reporting), <code>suggestStretchCharts</code> (a literacy-growth
63+
surface that shows charts the audience is unfamiliar with but the data actually supports),{" "}
64+
<code>scoreChart</code> (single-chart introspection), <code>useChartSuggestions</code> (the
65+
React hook), and the MCP server's <code>suggestCharts</code> tool. One catalog, many
66+
surfaces. The post on{" "}
67+
<Link to="/blog/charts-that-know-what-theyre-for">Charts that know what they're for</Link>{" "}
7068
walks through the design, the audience layer, and the stretch surface in detail.
7169
</p>
7270

7371
<h2 id="interrogation">Anchored conversation — focus + interrogation + annotation</h2>
7472
<p>
7573
The other half of "AI on a chart" is what happens when the user wants to ask about{" "}
76-
<em>this</em> point. Two new hooks compose into that pattern:{" "}
77-
<code>useChartFocus</code> subscribes to the chart's observation store and returns the
78-
latest hover/click as <code>{`{ datum, x, y, source }`}</code>;{" "}
79-
<code>useChartInterrogation</code> gives consumers a{" "}
80-
<code>{`{ ask, history, summary, annotations, loading, error, reset }`}</code> surface
74+
<em>this</em> point. Two new hooks compose into that pattern: <code>useChartFocus</code>{" "}
75+
subscribes to the chart's observation store and returns the latest hover/click as{" "}
76+
<code>{`{ datum, x, y, source }`}</code>; <code>useChartInterrogation</code> gives consumers
77+
a <code>{`{ ask, history, summary, annotations, loading, error, reset }`}</code> surface
8178
where the consumer brings their own LLM via <code>onQuery</code>. The hook supplies the
8279
model with the profiled data summary, the suggestion list, and the current focus datum as
8380
structured context; the model returns annotations the chart natively renders.
8481
</p>
8582
<p>
86-
The detail post —{" "}
87-
<Link to="/blog/anchored-conversations">Anchored conversations</Link> — works through the
88-
bidirectional loop: the user points at a data point, the AI answers about that specific
89-
point, and the answer lives on the chart as a clickable note. Pronouns work. Comparisons
90-
get cheap. Answers persist where they're useful. The chart accumulates institutional
91-
knowledge about itself.
83+
The detail post — <Link to="/blog/anchored-conversations">Anchored conversations</Link>
84+
works through the bidirectional loop: the user points at a data point, the AI answers about
85+
that specific point, and the answer lives on the chart as a clickable note. Pronouns work.
86+
Comparisons get cheap. Answers persist where they're useful. The chart accumulates
87+
institutional knowledge about itself.
9288
</p>
9389
<p>
9490
Compose that with the realtime runtime and the chat surface flips from passive observer to
9591
active narrator:{" "}
9692
<Link to="/blog/live-conversational-dashboard">Live conversational dashboards</Link>{" "}
9793
sketches the product shape — streaming data + an AI watching alongside you + anchored
98-
annotations + a conversational follow-up surface — and walks through the pieces that
99-
compose it.
94+
annotations + a conversational follow-up surface — and walks through the pieces that compose
95+
it.
10096
</p>
10197

10298
<h2 id="capability-refinements">Capability descriptor refinements</h2>
@@ -129,21 +125,21 @@ function Body() {
129125
<code>Scatterplot</code> and <code>ConnectedScatterplot</code> prefer the canonical
130126
2-numeric form when a sequence axis is present.
131127
</strong>{" "}
132-
On <code>{`{quarter, revenue, profit}`}</code> data both charts now plot revenue ×
133-
profit (the canonical correlation form) instead of recapitulating a line chart on
134-
quarter. ConnectedScatterplot threads the sequence as <code>orderAccessor</code> so the
135-
path encodes temporal progression — Hans Rosling's "income vs life expectancy over
136-
years" shape, served automatically when the data supports it.
128+
On <code>{`{quarter, revenue, profit}`}</code> data both charts now plot revenue × profit
129+
(the canonical correlation form) instead of recapitulating a line chart on quarter.
130+
ConnectedScatterplot threads the sequence as <code>orderAccessor</code> so the path
131+
encodes temporal progression — Hans Rosling's "income vs life expectancy over years"
132+
shape, served automatically when the data supports it.
137133
</li>
138134
<li>
139135
<strong>
140136
<code>X_FIELD_HINT</code> recognizes calendar-segment field names.
141137
</strong>{" "}
142138
The profiler's x-axis name regex now matches <code>quarter</code>, <code>qtr</code>,{" "}
143139
<code>fiscal</code>, and <code>week</code>. Without this,{" "}
144-
<code>{`{quarter, revenue, region}`}</code> data fell into scatter-fallback provenance
145-
and series detection never fired — <code>lineBy</code> / <code>areaBy</code> were
146-
silently dropped and multi-series time-series charts zigzagged across regions.
140+
<code>{`{quarter, revenue, region}`}</code> data fell into scatter-fallback provenance and
141+
series detection never fired — <code>lineBy</code> / <code>areaBy</code> were silently
142+
dropped and multi-series time-series charts zigzagged across regions.
147143
</li>
148144
</ul>
149145

@@ -161,25 +157,24 @@ function Body() {
161157

162158
<h2 id="upgrade-notes">Upgrade notes</h2>
163159
<p>
164-
Most of 3.6.0 is additive. The capability-descriptor refinements above are the one
165-
behavior change worth flagging:
160+
Most of 3.6.0 is additive. The capability-descriptor refinements above are the one behavior
161+
change worth flagging:
166162
</p>
167163
<ul>
168164
<li>
169-
<strong>AreaChart on multi-series data.</strong> If you were passing
170-
multi-series data to <code>AreaChart</code> directly (not via <code>suggestCharts</code>)
171-
and relying on the chart to render overlapping multi-area output, that path still works
172-
at the chart level — the capability change affects what the recommender suggests, not the
173-
chart's prop surface. The chart's <code>areaBy</code> prop is untouched. The change is
174-
about{" "}
165+
<strong>AreaChart on multi-series data.</strong> If you were passing multi-series data to{" "}
166+
<code>AreaChart</code> directly (not via <code>suggestCharts</code>) and relying on the
167+
chart to render overlapping multi-area output, that path still works at the chart level —
168+
the capability change affects what the recommender suggests, not the chart's prop surface.
169+
The chart's <code>areaBy</code> prop is untouched. The change is about{" "}
175170
<code>suggestCharts</code> output: AreaChart suggestions now subselect their data.
176171
</li>
177172
<li>
178173
<strong>Scatterplot's x/y on sequence-shaped data.</strong> Same caveat — the chart still
179174
plots whatever you pass it; the recommender's <code>buildProps</code> output changes. Any
180175
code reading <code>suggestion.props.xAccessor</code> / <code>yAccessor</code> for charts
181-
with <code>{`{sequence, num1, num2}`}</code> shape will now see the two numerics in
182-
place of the sequence.
176+
with <code>{`{sequence, num1, num2}`}</code> shape will now see the two numerics in place
177+
of the sequence.
183178
</li>
184179
<li>
185180
<strong>
@@ -200,7 +195,7 @@ export default {
200195
subtitle:
201196
"The AI release. A heuristic chart recommender, audience-aware ranking, focus + interrogation hooks for two-way anchored conversation, an MCP server, and a per-chart capability layer that makes the library itself a structured catalog.",
202197
author: "AI-Generated",
203-
date: "2026-05-31",
198+
date: "2026-05-26",
204199
tags: ["release"],
205200
excerpt:
206201
"3.6.0 turns Semiotic's observation hooks, native annotations, and streaming runtime into an explicit AI-facing surface. Charts declare what they're for; datasets get profiled and ranked; audiences get calibrated; conversations anchor back to the chart instead of stopping at a chat bubble. Three case-study posts published alongside the release walk through what the new shape makes possible.",

integration-tests/xy-examples/index.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -483,6 +483,7 @@ const examples = [
483483
lineBy: "series",
484484
yExtent: [0, 50],
485485
showLegend: false,
486+
stroke: "#007bff",
486487
width: 400, height: 280, colorScheme: colors,
487488
})
488489
}),
@@ -497,6 +498,7 @@ const examples = [
497498
// Anchor min to 0; max stays data-derived (~20).
498499
yExtent: [0, undefined],
499500
showLegend: false,
501+
stroke: "#007bff",
500502
width: 400, height: 280, colorScheme: colors,
501503
})
502504
}),
@@ -510,6 +512,7 @@ const examples = [
510512
lineBy: "series",
511513
yExtent: [undefined, 50],
512514
showLegend: false,
515+
stroke: "#007bff",
513516
width: 400, height: 280, colorScheme: colors,
514517
})
515518
}),
@@ -523,6 +526,7 @@ const examples = [
523526
lineBy: "series",
524527
xExtent: [-2, 8],
525528
showLegend: false,
529+
stroke: "#007bff",
526530
width: 400, height: 280, colorScheme: colors,
527531
})
528532
}),
@@ -536,6 +540,7 @@ const examples = [
536540
lineBy: "series",
537541
xExtent: [-2, undefined],
538542
showLegend: false,
543+
stroke: "#007bff",
539544
width: 400, height: 280, colorScheme: colors,
540545
})
541546
}),
@@ -549,6 +554,7 @@ const examples = [
549554
lineBy: "series",
550555
xExtent: [undefined, 8],
551556
showLegend: false,
557+
stroke: "#007bff",
552558
width: 400, height: 280, colorScheme: colors,
553559
})
554560
}),

0 commit comments

Comments
 (0)