diff --git a/README.md b/README.md
index 5e058db..31787a2 100755
--- a/README.md
+++ b/README.md
@@ -72,8 +72,10 @@ no purchases. Decimal places are one setting for the whole budget.
Import and reset clear session undo history after they succeed.
The month page shows Actual available beside Spent: entered income minus actual
-spending for that month. Show chart and Expected's Expand/Collapse controls
-remember their state in this browser. Add purchase can create a new recurring
+spending for that month. Tick posts in Monthly breakdown to filter spending;
+select one post to see its purchases. Monthly breakdown, Expected, Budget, and
+Purchases have Expand/Collapse controls that remember their state in this
+browser. Add purchase can create a new recurring
cost; enable choosing existing bills under Settings → Recurring costs.
## Known limitations
diff --git a/docs/DECISIONS.md b/docs/DECISIONS.md
index 00eeab1..9911a93 100644
--- a/docs/DECISIONS.md
+++ b/docs/DECISIONS.md
@@ -164,11 +164,18 @@ record.
## Design system
-- **Chart visibility and Expected's expanded state persist per browser.**
+- **Monthly breakdown, Expected, Budget, and Purchases expand independently
+ and persist per browser.**
Chosen over resetting on every visit or moving display choices with a JSON
budget export, following the theme's storage boundary.
→ [`specs/2026-10-03-month-and-purchase-refinements.md`](specs/2026-10-03-month-and-purchase-refinements.md)
+- **Spending chart selection changes the chart's denominator only.** Each
+ post remains available to check again; selecting one shows its purchase
+ shares, using the existing monthly charge calculation. Refunds are separate
+ from positive slices. Budget figures never change when a post is unchecked.
+ → [`specs/2026-10-03-month-and-purchase-refinements.md`](specs/2026-10-03-month-and-purchase-refinements.md)
+
- **Two token layers.** `--budget-*` is the app's own vocabulary; shadcn's
entire variable set points at it, so every primitive inherits both themes.
→ [`specs/2026-09-02-design-foundation-design.md`](specs/2026-09-02-design-foundation-design.md)
diff --git a/docs/TODO.md b/docs/TODO.md
index 05d3645..24db4c1 100755
--- a/docs/TODO.md
+++ b/docs/TODO.md
@@ -10,7 +10,9 @@ task moved to `AGENTS.md`.
**Current state:** the month and purchase refinements landed in `c250bbe`,
building on the merged anchored model, budget folders and session backups.
-911 tests pass across 66 files;
+The spending chart now supports post selection and purchase detail, and Monthly
+breakdown, Expected, Budget, and Purchases have remembered collapse controls.
+915 tests pass across 67 files;
`bunx tsc --noEmit` is clean, and `SKIP_FX_FETCH=1 bun run build` succeeds
using the committed seed rates.
diff --git a/docs/specs/2026-10-03-month-and-purchase-refinements.md b/docs/specs/2026-10-03-month-and-purchase-refinements.md
index f42af13..2285f69 100644
--- a/docs/specs/2026-10-03-month-and-purchase-refinements.md
+++ b/docs/specs/2026-10-03-month-and-purchase-refinements.md
@@ -94,3 +94,30 @@ Desktop and mobile captures cover light and dark themes. Screenshots establish
layout and console behavior; visual feel still requires the owner.
The complete suite passes 911 tests across 66 files, TypeScript is clean, and
production builds succeed at both root and subpath base URLs with seed rates.
+
+## Follow-up: post selection and section collapse
+
+The owner clarified that chart visibility should also operate on individual
+posts, so a large post can be excluded to inspect smaller spending. Every post
+with actual charge activity, including Unassigned and a zero net total made
+from purchases and refunds, starts selected. Unchecked posts remain available;
+Select all and Clear recover from any selection. Net spent and percentages
+reflect the selected posts, leaving all budget figures unchanged. With exactly
+one selected post, the chart shows that post's individual purchase shares for
+the month. The existing charge and slice functions provide split amounts,
+instalments, FX conversion, and dataset precision. Refunds remain separate from
+positive slices.
+
+The Show chart checkbox is replaced by Expected's Expand/Collapse button style.
+Budget and Purchases also receive independent remembered controls. All four
+sections start expanded, retaining the previous chart visibility preference.
+The post selection lasts for the current month-page visit and does not enter
+the exported dataset. Budget and Purchases hide mounted content to preserve
+editing drafts; Add purchase remains reachable while Purchases is collapsed.
+
+Regression checks cover filtering, single-post purchase details, instalment
+shares, FX at zero decimals, refunds cancelling to zero, no selection, restoring
+all posts, independent collapse state, mounted drafts and reachable actions.
+The complete suite now passes 915 tests across 67 files, TypeScript and the
+production build pass, and Chrome verifies filtering, drilldown and collapse
+controls on mobile without horizontal overflow or uncaught exceptions.
diff --git a/src/ui/components/ExpectedBand.tsx b/src/ui/components/ExpectedBand.tsx
index 490498b..79e45e6 100644
--- a/src/ui/components/ExpectedBand.tsx
+++ b/src/ui/components/ExpectedBand.tsx
@@ -1,5 +1,4 @@
import { useId, useMemo, useState } from "react";
-import { ChevronDown } from "lucide-react";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { useDataset } from "../hooks/useDataset.ts";
@@ -10,7 +9,7 @@ import { confirmOccurrence } from "../../store/actions.ts";
import { occurrencesByMonth, type Occurrence } from "../../domain/occurrences.ts";
import { addMonths, compareMonths } from "../../domain/months.ts";
import { parseMoneyInput, type CurrencyOption, type ParsedMoney } from "../moneyInput.ts";
-import { Section } from "./Section.tsx";
+import { Section, SectionToggle } from "./Section.tsx";
import { useDisplayPreference } from "../hooks/useDisplayPreference.ts";
import type { Currency, Dataset, IsoDate, MonthId } from "../../domain/types.ts";
@@ -328,10 +327,7 @@ export function ExpectedBand({ monthId }: { monthId: MonthId }) {
hint={expanded
? "Committed but not yet spent. These do not touch a post's balance until you confirm one, which records it as an ordinary purchase you can edit or delete afterwards."
: `${pending.length} expected · ${comingUp.length} coming up · ${overdue} overdue`}
- action={}
+ action={ setExpanded(!expanded)} />}
>
{error &&
- {mode === "spending" ? "No positive spending to chart." : "No positive allocations to chart."}
+ {mode === "spending" ? spending.posts.length > 0 && spending.selectedCount === 0 ? "No posts selected. Tick a post or select all to show spending." : "No positive spending to chart." : "No positive allocations to chart."}