Intent: once approval exists, the agent should see at a glance which listings are ready, and nothing unapproved should look final.
Done looks like:
[ ] Each listing on the home list shows "Ready to send" or "3 of 6 approved" next to its Fair Housing pill, and it updates live through /events.
[ ] The printed flyer and the email preview carry a visible "Draft — not approved" band while their asset is unapproved (also in @media print), and none once approved.
[ ] The listing JSON (/api/listings, MCP) includes per-asset approval.
[ ] Tests for the list label, the draft band present and absent.
Files: src/pages/home.ts, src/pages/listing.ts, src/live.ts, static/live.js, static/app.css, src/actions.ts.
Risks: no layout shift when the label changes.
Brief: builder.
Intent: once approval exists, the agent should see at a glance which listings are ready, and nothing unapproved should look final.
Done looks like:
/events.@media print), and none once approved./api/listings, MCP) includes per-asset approval.Files: src/pages/home.ts, src/pages/listing.ts, src/live.ts, static/live.js, static/app.css, src/actions.ts. Risks: no layout shift when the label changes. Brief: builder.