PR 22971 — an unfiled charge is a status, never a to-do

Both copy changes render only in failure states, captured on the real components with those props.

27 Oct 2026 · branch supervised-card-staff-todo · captured against propflow-stage · at 3ced5298602+local

Data note. Every name and balance below comes from propflow-stage, which is anonymized by construction (ADR-0097/0110 — phones in the impossible +1000 NPA, emails @example.test). The identical capture against prod would carry real tenants' names and balances and is not safe to attach anywhere, which is why the generator refuses to run against one.

1 · The charge card: one line landed, two did not

Three approved move-out charges. The first reached the move-out draft; the other two did not (a transient error, and a draft that is already finished). The old copy under those two read "Couldn't add to AppFolio automatically — add it on the move-out draft directly", and the push behind it paged nobody, so the only person who knew the money had not landed was the one being asked to go and file it. The line now states who owns it.

It deliberately does NOT say an alert was sent: every turnover already carrying one of these outcomes reaches this same branch after the deploy, and no alert ever fired for those rows.

Asserted in the captured DOM — Added to the AppFolio move-out draft · Not on the move-out draft yet — this one is on PropFlow, not on you. · Carpet cleaning · Blind replacement · Wall patch and paint · $500.00. The success line and the two new status lines are present together, so the comparison is in the capture rather than in the caption. The total is unchanged by the failures.

The charge card: one line landed, two did not
Sections 2–4 and notes

2 · The same card at phone width

The new sentence is longer than one word and sits in a 12px muted line under a charge label, so the thing to look at is whether it wraps cleanly and still reads as a status rather than a warning.

Asserted in the captured DOM — Not on the move-out draft yet — this one is on PropFlow, not on you.. Same string asserted at 390px, so a wrap that hid or truncated it would abort this run.

The same card at phone width

3 · The held-write card, both failure shapes

Two approved held writes that failed. The first carries the line the domain recorded, which is true because the alert fires in the same call that records it. The second has no recorded reason — the one case where we cannot know an alert fired — so its fallback states ownership and nothing more. Before this change both read "Please make it there by hand."

Asserted in the captured DOM — would not accept these charges on the move-out any more · PropFlow has been alerted and is handling it · Finishing it is on PropFlow, not on you.. The recorded line and the no-reason fallback are asserted separately: they are produced by different code paths and only one of them may claim an alert.

The held-write card, both failure shapes

4 · Dark mode

Both new lines use existing tokens (--color-text-muted on the charge line, --color-danger on the held-write line) rather than new colours, so this section is here to show that and nothing more.

Asserted in the captured DOM — Not on the move-out draft yet — this one is on PropFlow, not on you.

Dark mode

Why this was captured on a temporary route

Both strings render only in failure states: a charge override whose delta push did not reach the move-out draft, and a held write recorded as failed. Rather than write such rows into a shared environment, an uncommitted route rendered the two real components with those props. Every id in it is synthetic (fixture-north style). The route is not part of the PR.

PropFlow Docs