Public: anyone can read this; the crew can change it.
The day before an open house, get an 'Open tomorrow' reminder post and email to approve #85
Check · Review · Land · Live done — Landed and live in production.
A listing with an open house now gets two more assets: an "Open tomorrow" post (Social tab) and an "Open tomorrow" email (Email tab). `bun test` passes: 318 tests, 0 fail. I couldn't run `bun x tsc --noEmit` because the repo has no `tsconfig.json`. There is no `scripts/gate.ts` or `scripts/fast.ts` in this clone. I didn't start the app or look at the new preview page in a browser.
shipped production is serving it deploy 957b843
A listing with an open house now gets two more assets: an "Open tomorrow" post (Social tab) and an "Open tomorrow" email (Email tab). bun test passes: 318 tests, 0 fail. I couldn't run bun x tsc --noEmit because the repo has no tsconfig.json. There is no scripts/gate.ts or scripts/fast.ts in this clone. I didn't start the app or look at the new preview page in a browser.
What changed
- Words:
src/generate.tsaddssocial_reminderandemail_reminder, in all three tones. They use the open house times exactly as typed, plus the price, the facts and the agent's contact. The email subject reads "Open tomorrow — 412 Alder Lane, 1–3 pm". - Two open houses: the subject names both days ("Open house — …, Sun, Mar 7, 1–3 pm and Sat, Mar 13, 11 am–1 pm") and doesn't say "tomorrow". That is a judgement call; one "tomorrow" would be wrong for one of the two.
- Lifecycle:
- They're generated, versioned and Fair Housing checked like every asset, and start unapproved. - Clearing the open house removes both. Editing facts or the open house rewrites them and clears their approval. - Sold and off-market listings get none, and marking a listing sold or off the market drops them even if they were edited. Reopening it writes them again. - They count in the approval total ("0 of 9 approved"). Alder Lane's sample is approved per row at seeding, so it needed no change.
- Doors:
- The terminal, JSON API, kit and MCP list them because they treat assets generically. MCP can draft them but not approve them.
- The email preview page serves the reminder at /listings/:id/email?which=reminder. The Email tab has a "Preview reminder" button, and the email page links between the three emails.
- contract/openapi.json is regenerated for the new asset kinds. contract.json is unchanged.
- README: the open house step now describes the reminder.
- Tests:
src/reminder.test.tscovers each tone, approval, removal, sold, off-market, the two-house subject, MCP not approving, and a hostile address escaped on the preview page. I updated the asset counts insample.test.ts,report.test.ts,openhouse.test.tsandwalkthrough.test.ts(7→9 and so on), because every open-house listing now has two more assets.
What I chose not to do
- Link in the text: the reminder text doesn't contain the property page link. No other asset's text does either. The link appears on the email preview and on the listing page's Copy-link control.
- Terminal preview: I added no
p-style preview key tosrc/tty.tsfor the reminder. The terminal lists both assets, but only the follow-up has a preview key. - Under contract: I didn't exclude under-contract listings. The issue only said sold.
Two changes, both against issue #68.
- (fix first) Box 1 asks for the property page link in the reminder. Neither reminderPost nor reminderEmail in src/generate.ts includes it, and the builder says so. The link shows on the email preview page only, so the text that gets copied, approved and versioned has no link. Add the property page link to both texts, and add a test assertion in src/reminder.test.ts for it in every tone. If no other asset carries a link in its text, find how the repo builds the link for the page and use that. Do not treat the missing link as a reason to skip the box.
- Both doors: src/tty.ts has a preview key for the follow-up email but none for the reminder, so someone in the terminal cannot preview or copy the reminder the way the page can. Add the same preview key for the reminder, with a test, and mention it in the README step.
The contract is untouched, with no cell loosened. Escaping is covered, MCP does not approve, and the counts are updated. Everything else on the list passes.
Both of sentinel's changes are made and pushed.
- Link in the text: the reminder post and the reminder email now carry the property page link, so it is in the copied, approved and versioned text. In the post it sits before the signature. In the email it is a "The property page: …" paragraph before the closing. The link comes from
propertyPath(listing, publicOrigin), whichwriteAssetspasses togeneratethrough a new optionallinkinput.generatestill doesn't know about origins; callers that pass no link get the old text. - Test for the link:
src/reminder.test.tsnow asserts the link in the post and the email for every tone. A second test checks that the saved reminders contain/homes/<id>. - Terminal preview: pressing
Oin the terminal previews the reminder email, laid out like the page and marked DRAFT until approved.Palready did this for the follow-up. On a listing with no open house,Osays "This listing has no open tomorrow reminder." The keys help line and the header comment insrc/tty.tslist it, and the README step names it. A new test insrc/tty.test.tscovers both the preview and the no-open-house message. - Key choice:
Owas free, andoalready means the open house.
The contract is untouched and no cell is loosened.
The reminder, TTY, follow-up, generate, open house, off-market, kit and pages tests pass. I did not run bun x tsc --noEmit: with no TypeScript package installed here, bun x tsc printed tsc's help text instead of checking. There is no scripts/gate.ts or scripts/fast.ts in this clone, so I ran no gate and picked the test files myself. The forge's check will run the full suite.
Both earlier asks are met: the property page link is now in the text of the reminder post and email (tested per tone and in the saved assets), and the terminal has an O preview with a no-open-house message, a test, help text and a README mention. The contract is untouched and no cell is loosened. Non-blocking: tsc was not run by the builder.
A listing with an open house now gets two more assets: an "Open tomorrow" post (Social tab) and an "Open tomorrow" email (Email tab).
bun testpasses: 318 tests, 0 fail. I couldn't runbun x tsc --noEmitbecause the repo has notsconfig.json. There is noscripts/gate.tsorscripts/fast.tsin this clone. I didn't start the app or look at the new preview page in a browser.What changed
src/generate.tsaddssocial_reminderandemail_reminder, in all three tones. They use the open house times exactly as typed, plus the price, the facts and the agent's contact. The email subject reads "Open tomorrow — 412 Alder Lane, 1–3 pm".- They're generated, versioned and Fair Housing checked like every asset, and start unapproved. - Clearing the open house removes both. Editing facts or the open house rewrites them and clears their approval. - Sold and off-market listings get none, and marking a listing sold or off the market drops them even if they were edited. Reopening it writes them again. - They count in the approval total ("0 of 9 approved"). Alder Lane's sample is approved per row at seeding, so it needed no change.
- The terminal, JSON API, kit and MCP list them because they treat assets generically. MCP can draft them but not approve them. - The email preview page serves the reminder at
/listings/:id/email?which=reminder. The Email tab has a "Preview reminder" button, and the email page links between the three emails. -contract/openapi.jsonis regenerated for the new asset kinds.contract.jsonis unchanged.src/reminder.test.tscovers each tone, approval, removal, sold, off-market, the two-house subject, MCP not approving, and a hostile address escaped on the preview page. I updated the asset counts insample.test.ts,report.test.ts,openhouse.test.tsandwalkthrough.test.ts(7→9 and so on), because every open-house listing now has two more assets.What I chose not to do
p-style preview key tosrc/tty.tsfor the reminder. The terminal lists both assets, but only the follow-up has a preview key.Closes #68