#32 shipped /:chain/market/near-intents with figures, a live feed and a history, but no picture of price over time. #32 deferred it because it needs a series route and has to be read against the dataviz skill and the site's single-hue rule.
Form (from the dataviz procedure)
Job: trend over time for one quantity, the asset's price in one counter token. That calls for a single-series line in the data hue with no legend; the panel title names it.
One counter at a time, chosen in a control above the chart, never one line per counter. Seventy counters as seventy hues is exactly the categorical blow-up the skill and CLAUDE.md forbid, and prices in different units share no axis anyway.
Gaps are gaps. The line breaks across buckets with no trade, and each bucket with trades gets a dot. Joining two trades hours apart with a line draws a price path nobody traded at. On a thin market that would be most of the chart.
The window is a count, not a duration: the latest N trades against that counter (default 500), bucketed into up to 48 time buckets over whatever span they cover. This is the same rule as the mining windows and the price figures. The time axis is derived from the trades, so it cannot claim a month over a week of data.
The y-axis floats (min/max with headroom), unlike the share chart's zero baseline. A price's level carries no zero-relative meaning, and a zero-based axis flattens every move into the top pixel. The tooltip and table carry exact values.
Hover: a crosshair snapping to the nearest bucket. The tooltip gives the bucket's time range, VWAP, low–high, trade count (and how many were users') and volume.
Table view under the chart, for the a11y requirement and for readers who want the numbers.
No new colour. It uses the existing validated --data, --data-bright and --grid tokens, both themes.
Placeholder
Until a QTC trade settles, the chart's frame keeps its height, so the page doesn't jump when data arrives. No axes are drawn, because axes over no data invent a scale and a range. It shows only the baseline hairline and the reason, e.g. "The chart starts with the first settled QTC trade. None has: no QTC is bridged to NEAR." No fake or illustrative line.
API
GET /v1/chains/{chain}/intents/series?counter=<token>&trades=<N>&points=<M> returns the buckets with trades in them, plus the bucket width, the counter's symbol and decimals, and indexed_from/indexed_to.
The bucketing is blackbeard_core::intents::bucket_prices, a pure function with tests: the volume-weighted average per bucket, low/high, empty buckets omitted, and a floor on bucket width so a burst does not collapse to one-second buckets.
## Why
#32 shipped `/:chain/market/near-intents` with figures, a live feed and a history, but no picture of price over time. #32 deferred it because it needs a series route and has to be read against the `dataviz` skill and the site's single-hue rule.
## Form (from the `dataviz` procedure)
- **Job:** trend over time for one quantity, the asset's price in one counter token. That calls for **a single-series line in the data hue** with no legend; the panel title names it.
- **One counter at a time**, chosen in a control above the chart, never one line per counter. Seventy counters as seventy hues is exactly the categorical blow-up the skill and CLAUDE.md forbid, and prices in different units share no axis anyway.
- **Gaps are gaps.** The line breaks across buckets with no trade, and each bucket with trades gets a dot. Joining two trades hours apart with a line draws a price path nobody traded at. On a thin market that would be most of the chart.
- **The window is a count, not a duration:** the latest N trades against that counter (default 500), bucketed into up to 48 time buckets over whatever span they cover. This is the same rule as the mining windows and the price figures. The time axis is derived from the trades, so it cannot claim a month over a week of data.
- **The y-axis floats** (min/max with headroom), unlike the share chart's zero baseline. A price's level carries no zero-relative meaning, and a zero-based axis flattens every move into the top pixel. The tooltip and table carry exact values.
- **Hover:** a crosshair snapping to the nearest bucket. The tooltip gives the bucket's time range, VWAP, low–high, trade count (and how many were users') and volume.
- **Table view** under the chart, for the a11y requirement and for readers who want the numbers.
- **No new colour.** It uses the existing validated `--data`, `--data-bright` and `--grid` tokens, both themes.
## Placeholder
Until a QTC trade settles, the chart's frame keeps its height, so the page doesn't jump when data arrives. **No axes are drawn**, because axes over no data invent a scale and a range. It shows only the baseline hairline and the reason, e.g. "The chart starts with the first settled QTC trade. None has: no QTC is bridged to NEAR." No fake or illustrative line.
## API
- `GET /v1/chains/{chain}/intents/series?counter=<token>&trades=<N>&points=<M>` returns the buckets with trades in them, plus the bucket width, the counter's symbol and decimals, and `indexed_from`/`indexed_to`.
- The bucketing is `blackbeard_core::intents::bucket_prices`, a pure function with tests: the volume-weighted average per bucket, low/high, empty buckets omitted, and a floor on bucket width so a burst does not collapse to one-second buckets.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Why
#32 shipped
/:chain/market/near-intentswith figures, a live feed and a history, but no picture of price over time. #32 deferred it because it needs a series route and has to be read against thedatavizskill and the site's single-hue rule.Form (from the
datavizprocedure)--data,--data-brightand--gridtokens, both themes.Placeholder
Until a QTC trade settles, the chart's frame keeps its height, so the page doesn't jump when data arrives. No axes are drawn, because axes over no data invent a scale and a range. It shows only the baseline hairline and the reason, e.g. "The chart starts with the first settled QTC trade. None has: no QTC is bridged to NEAR." No fake or illustrative line.
API
GET /v1/chains/{chain}/intents/series?counter=<token>&trades=<N>&points=<M>returns the buckets with trades in them, plus the bucket width, the counter's symbol and decimals, andindexed_from/indexed_to.blackbeard_core::intents::bucket_prices, a pure function with tests: the volume-weighted average per bucket, low/high, empty buckets omitted, and a floor on bucket width so a burst does not collapse to one-second buckets.