feat: waterfall charts — financial bridges with running totals - #196
Merged
Conversation
The flow-shaped gap from the chart-type audit: "where did it go"
answers (revenue bridges, token budgets, headcount changes) as a
native ```chart type.
- {"type": "waterfall"}: one series of signed deltas in point order;
{"x": "Gross profit", "total": true} marks running-total checkpoints
(y optional on totals). ChartWaterfall.segments computes the levels
client-side — the model never emits running sums.
- Floating BarMarks: rises Theme.success, falls red (financial
convention, same OK/Error language as the cron chart), totals as
neutral zero-anchored bars; dashed hairline connectors carry the
level between adjacent bars.
- Hover readout: gain/loss delta + running level; totals show the
total. Categorical selection, no zoom (owns its axis), no legend
(identity is the rise/fall color).
- Duplicate step labels disambiguate instead of colliding on the
categorical axis.
- Prompt documents the contract; segment math + parsing + label
disambiguation covered by tests.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Jul 22, 2026
ethenotethan
added a commit
that referenced
this pull request
Jul 23, 2026
The recurring CI test-job crash (NSInternalInconsistencyException, 'bundleProxyForCurrentProcess is nil') was NotificationService.shared being initialized from a real code path during tests — the crash-run stack shows ChatViewModel.applySessionEvent → notifyTurnComplete → UNUserNotificationCenter.current(), which throws in bundle-less test runners. Two suites set isTestEnvironment manually, so whether CI crashed depended on suite ordering (why it was flaky: also hit #196). isTestEnvironment now defaults to auto-detection via a shared ProcessInfo.isTestProcess (XCTest/swift-testing/xctest-bundle/SwiftPM runner checks); ArtifactStore's duplicate detection now uses the same helper. 4/4 consecutive full-suite runs clean (previously ~2 of 3 crashed locally). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
ethenotethan
added a commit
that referenced
this pull request
Jul 23, 2026
* feat: composite map artifacts — map + status table as one surface In artifact hosts, a map artifact now renders BOTH views of its one content body: the spatial map on top and a sortable entry table below — label, group, and the union of data fields riding on markers (status, reached_out, rent…), with the declared action controls inline per row. Fields named by declared actions always get a column, even before the first mark. Selection is shared: click a row → the pin highlights and the camera recenters; tap a pin → the row highlights (note revealed on the selected row, since notes don't fit a column). Sort is numeric-aware with string fallback. Chat transcript blocks keep the compact entry list (snapshots, not work surfaces). The expanded/fullscreen sidebar widens to fit the table. entryRow's inline action controls moved into the table — one owner for controls. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * fix: UNUserNotificationCenter crash under the SwiftPM test runner The recurring CI test-job crash (NSInternalInconsistencyException, 'bundleProxyForCurrentProcess is nil') was NotificationService.shared being initialized from a real code path during tests — the crash-run stack shows ChatViewModel.applySessionEvent → notifyTurnComplete → UNUserNotificationCenter.current(), which throws in bundle-less test runners. Two suites set isTestEnvironment manually, so whether CI crashed depended on suite ordering (why it was flaky: also hit #196). isTestEnvironment now defaults to auto-detection via a shared ProcessInfo.isTestProcess (XCTest/swift-testing/xctest-bundle/SwiftPM runner checks); ArtifactStore's duplicate detection now uses the same helper. 4/4 consecutive full-suite runs clean (previously ~2 of 3 crashed locally). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
The flow-shaped gap from the chart-type audit: "where did it go" answers — revenue bridges, token budgets, headcount changes — as a native
```charttype.{"total": true}marks checkpoint bars (y optional).ChartWaterfall.segmentscomputes the levels, so the model never emits running sums (same raw-data discipline as histogram/boxplot).Theme.success, falls red (financial convention, matching the cron chart's OK/Error language), totals as neutral zero-anchored bars, dashed hairline connectors carrying the level between adjacent bars.Testing
3 new tests: parsing with total markers (optional y), segment math (rise/fall/total spans), duplicate-label disambiguation. Chart + PDF regression suites green; both mac & iOS targets build;
swiftlint --strictclean.Built in an isolated worktree off current main — no entanglement with in-flight branches.
🤖 Generated with Claude Code