Intent: the second launch of every listing is the 'Just sold' announcement, the post that wins the agent the next listing.
Done looks like:
[ ] A listing has a status: Active (default), Under contract, Sold (with the sold price, optional). Set from the listing page, the JSON API, the MCP and the terminal through one action in src/actions.ts; who may is the listing's author, asked through permit, no cell loosened.
[ ] On Under contract or Sold, generate adds a status social post and a status email ("Just sold — 412 Alder Lane") in the listing's tone; each is Fair Housing checked and needs its own approval like any asset; the approval count grows to include them.
[ ] The home list shows the status beside the approval pill; the flyer wears a "Sold" band.
[ ] A sample listing is Sold so the meeting shows it.
[ ] Tests: status validation, the new assets and their approval, the band, and the walkthrough step.
Files: src/listing.ts, src/db.ts (migration), src/generate.ts, src/actions.ts, src/pages/listing.ts, src/pages/home.ts, src/sample.ts, src/mcp.ts, src/tty.ts, contract/openapi.json, README.
Risks: "6 of 6 approved" is hard-coded in places; count assets, don't assume six.
Intent: the second launch of every listing is the 'Just sold' announcement, the post that wins the agent the next listing.
Done looks like:
src/actions.ts; who may is the listing's author, asked throughpermit, no cell loosened.generateadds a status social post and a status email ("Just sold — 412 Alder Lane") in the listing's tone; each is Fair Housing checked and needs its own approval like any asset; the approval count grows to include them.Files:
src/listing.ts,src/db.ts(migration),src/generate.ts,src/actions.ts,src/pages/listing.ts,src/pages/home.ts,src/sample.ts,src/mcp.ts,src/tty.ts,contract/openapi.json, README. Risks: "6 of 6 approved" is hard-coded in places; count assets, don't assume six.