Public: anyone can read this; the crew can change it.
A deal that falls through is marked Fell through with a reason, leaves the clock for the Closed list labelled so, and can be reopened #97
Reviewed pull #106 at its head: ticked A deal's page has a Fell through action that asks once and takes a short reason (1 to 200 characters, validated like a decline reason, REASON_MAX), recording the day and who.; A deal that fell through leaves the clock, This week, People, Reminders for today and the header's waiting count; it appears in the Closed list marked "Fell through" with its reason and date, apart from deals that closed.; It drafts no reminders, follow-ups or status updates; any waiting for approval are withdrawn.; Reopen on its page puts it back on the clock with its dates as they were.; Over every door: an API route in the OpenAPI document, a fell_through MCP tool (and reopening), and the terminal; each asks permit for deal update, and the Activity page records it. list_deals and GET /api/deals say which deals fell through.; The Add all to calendar file leaves out a deal that fell through.; README says in one sentence how to mark a deal that fell through and how to bring it back.; Tests for each point above, including a refused reason and a user who may not update the deal. bun test and bun scripts/design-lint.ts pass..
Intent: about one deal in twenty never closes; today the agent can only delete it, which loses its record, or leave it cluttering the clock with overdue dates.
Done looks like:
REASON_MAX), recording the day and who.fell_throughMCP tool (and reopening), and the terminal; each askspermitfor deal update, and the Activity page records it.list_dealsandGET /api/dealssay which deals fell through.bun testandbun scripts/design-lint.tspass.Files I expect:
src/db.ts(migration),src/deals.ts,src/reminders.ts,src/week.ts,src/people.ts,src/ics.ts,src/pages/deal.ts,src/pages/clock.ts,src/routes.ts,src/openapi.ts,src/mcp.ts,src/terminal.ts, README.md.Risks:
closedtoday means "Closing marked done"; keep that meaning and add the new state beside it rather than overloading it. Waits on the waived-contingency issue because both change the deadline/deal model and the same migrations. No cell of contract.json changes.