- Per-task daily-cost history + pulse engine plumbingCloses the named rev-53 next-sprint candidate. New task.dailyCostHistory JSONB column the pulse engine appends to on every cycle: workNextTask snapshots the global tokenSink before/after runAiTaskSession, computes the per-task delta the same way the rev-51 cumulative columns are populated, then buckets the delta into today's slot keyed by the workspace-timezone ISO date (YYYY-MM-DD) via the new formatLocalDateKey helper. Trimmed to the trailing 30 days on every write so the JSONB never grows unbounded on long-running tasks. Pure history โ the rev-51 cumulative columns remain authoritative for total spend; this map is the trajectory primitive that rev 54's sparkline + cost-trajectory endpoint read from.
- Per-task cost trajectory sparkline on every active-work cardNew TaskCostSparkline component renders inline next to the rev-51 ๐ธ cost pill on every active-work card whose dailyCostHistory has at least one non-zero day. 7-bar mini-chart, today rightmost, today highlighted with brand-amber so the eye lands on the most recent value first. Pairs with the rev-53 workspace-level cost sparkline on TodayPanel โ same visual vocabulary, different scope (workspace โ per-task). Operators triaging a noisy task can now see 'is this task spiking cost or steady?' at a glance without leaving the card. The active-work card pill row has accumulated 8+ pills + 5 affordance rows over rev 21โ51; rev 54 is the first piece of in-card visualisation rather than just text/pills, anchoring the per-task cost narrative across both reading levels.
- GET /api/v1/tasks/{id}/cost-trajectory + matching dashboard endpointBearer-auth endpoint returns the trailing N daily cost buckets (default 7, max 30) for a single task in workspace timezone, oldest โ newest, with zero-fill for days the task wasn't worked. Mirrored on the dashboard side at GET /api/tasks/{id}/cost-trajectory (viewer+ auth) so external integrations + the dashboard share one server-side implementation via getTaskCostTrajectory(). Closes the v1 parity gap on the rev-54 dashboard primitive in the same cycle the dashboard primitive ships (the cadence pattern that started rev 37 holds). The /api/v1/tasks/top-cost endpoint also gained a trajectory7d cents array on every row so MCP hosts rendering 'top spenders' can render the trajectory shape without a follow-up call per task. The cost-axis MCP cluster (per-cycle/per-task/per-teammate/today/per-task-trajectory) is now 5 axes deep โ exclusively protocol-translation work for the upcoming MCP server.
- Top-cost-tasks panel: trajectory mini-chart on every row + visual polishThe rev-51 TopCostTasksPanel listed cumulative spend + status + bar widths but the trajectory shape was invisible. Rev 54 adds a 52ร14 trajectory sparkline inline on every row alongside the existing cost label so an operator can answer 'are my expensive tasks expensive because they're long-running or because today spiked?' without drilling in. Plus subtle CSS polish on the rev-51 cost pill: it's now a flex container so the inline sparkline sits beside ๐ธ $X.XX without the layout breaking; today-bar hover state inverts to deep-amber for a tactile click affordance. Cumulative micro-polish โ every rev 22+ has carried at least one.