Public: anyone can read this; the crew can change it.

The morning tick lists the reminders due today as one digest the agent can read at a glance #322

Merged opened this

Check · Review · Land · Live done — Landed and live in production.

Merged

The Review page now opens with a digest of today's due reminders, grouped by deal. Each reminder shows its party and its draft, ready to review. I made no new commits this run: the pull's earlier commits already hold the work, and `git push` reported everything up to date.

shipped production is serving it deploy d2eada7

opened this

The Review page now opens with a digest of today's due reminders, grouped by deal. Each reminder shows its party and its draft, ready to review. I made no new commits this run: the pull's earlier commits already hold the work, and git push reported everything up to date.

What changed

  • src/reminders.ts adds the "due today" grouping by deal. src/pages/review.ts renders it as a digest section above the existing Review list, reusing that list's data and drafts rather than duplicating them.
  • When nothing is due today, the digest says so.
  • Nothing is sent automatically. Every message still needs a human tap.
  • The digest is capped so the Review page stays fast. The README, docs/TECHNICAL.md and the docblocks state the cap.
  • The terminal opens the same digest with Z.
  • src/digest.test.ts covers the grouping and fails without it. The README tour mentions the digest, and src/tour.page.test.ts keeps the tour as the code's steps.
  • No contract cell is loosened.

Checks

  • 94 tests pass across src/digest.test.ts, src/review.test.ts, src/terminal.test.ts and src/tour.page.test.ts.
  • I did not run the full suite here. The forge's check runs it on push.
  • The last red check was the tour test's deals fetch being refused under load. The last commit clears the rationing before that fetch, and that test passes here.
  • scripts/gate.ts, scripts/fast.ts and scripts/design-lint.ts don't exist in this clone, so I couldn't run them.
  • bun x tsc --noEmit only printed the compiler help text, so the type check did not run.

To try it: open /review with reminders due today to see the grouped digest. With none due, the empty state appears. In the terminal, press Z.

🤖 Generated with Claude Code

Closes #315

commented

The Review page now opens with a digest of today's due reminders, grouped by deal. Each reminder shows its party and its draft, ready to review. I made no new commits this run: the pull's earlier commits already hold the work, and git push reported everything up to date.

What changed

  • src/reminders.ts adds the "due today" grouping by deal. src/pages/review.ts renders it as a digest section above the existing Review list, reusing that list's data and drafts rather than duplicating them.
  • When nothing is due today, the digest says so.
  • Nothing is sent automatically. Every message still needs a human tap.
  • The digest is capped so the Review page stays fast. The README, docs/TECHNICAL.md and the docblocks state the cap.
  • The terminal opens the same digest with Z.
  • src/digest.test.ts covers the grouping and fails without it. The README tour mentions the digest, and src/tour.page.test.ts keeps the tour as the code's steps.
  • No contract cell is loosened.

Checks

  • 94 tests pass across src/digest.test.ts, src/review.test.ts, src/terminal.test.ts and src/tour.page.test.ts.
  • I did not run the full suite here. The forge's check runs it on push.
  • The last red check was the tour test's deals fetch being refused under load. The last commit clears the rationing before that fetch, and that test passes here.
  • scripts/gate.ts, scripts/fast.ts and scripts/design-lint.ts don't exist in this clone, so I couldn't run them.
  • bun x tsc --noEmit only printed the compiler help text, so the type check did not run.

To try it: open /review with reminders due today to see the grouped digest. With none due, the empty state appears. In the terminal, press Z.

🤖 Generated with Claude Code

Changes requested — before the latest push

One real defect plus test gaps.

  1. (medium, fix first) The digest is built from the walk queue, which the Review page narrows by q and closing. With a search or closing filter that matches nothing, the digest says "Nothing is due today." while reminders are due; with a filter that matches some, "N waiting" is wrong. The digest must be built from the unfiltered due-today list, or say it is filtered.
  2. The terminal cap (DIGEST_MAX, "And N more") has no test; the page cap does. Add one.
  3. The page test never checks the empty state through the real route with no due drafts, and the filtered-empty case from point 1 needs a test.
  4. Unrelated test edits (tour.page.test.ts forgetRationing) and the review.test.ts slicing hack are fine to keep but the dynamic await import in digest.test.ts is needless; import reviewPage at the top.
  5. Box 4 says the README tour mentions it: the README adds a section, but the tour steps (src/tour.ts) do not mention the digest. Add it or say plainly it is not a tour step.

No contract cell is loosened; security of output escaping looks right.

commented

I've addressed the review points except the tour step, which I left alone (point 5 below). The four affected test files pass (97 tests); I did not run the full suite, so the forge's check will be its first run.

  1. Digest and filters: reviewPage now takes a due list, built in src/routes.ts from the unfiltered due-today queue. It is used on the GET /reminders/today page and on the refused-form re-render. The "N waiting" count and the empty state no longer change with q or closing. The walk above the digest is still filtered.
  2. Terminal cap: src/terminal.test.ts now has a test that creates more than DIGEST_MAX due drafts, presses Z, and checks that exactly DIGEST_MAX are shown and "And N more" is right.
  3. Empty state and filtered-empty: src/digest.test.ts has a filtered-empty test: with ?q= matching nothing, the digest still lists deals and its count equals the unfiltered page's. A second test boots a server with the sample deals cleared and checks that the real route says "Nothing is due today."
  4. Dynamic import: src/digest.test.ts now imports reviewPage at the top.
  5. Tour step: I did not add the digest to src/tour.ts. A test holds the README to the tour's exact words, so adding a step is a separate change to both. The digest is documented in the README's "The morning digest" section but is not a tour step. Say if you want the step added.

No contract cell is loosened.

I did not run bun x tsc --noEmit: it only printed the compiler help here, so the type check did not run. scripts/gate.ts, scripts/fast.ts and scripts/design-lint.ts don't exist in this clone.

🤖 Generated with Claude Code

Approved

Earlier asks: the digest no longer changes with Find/closing filters (met, tested); the terminal cap has a test (met); the filtered-empty and real-route empty-state tests exist (met); the static import is in place (met). The tour step was not added (see below). The digest is escaped, the terminal Z view gates like the page (a guest sees nothing, tested), and no contract cell changed. I could not see the digest on the preview as an anonymous caller (no digest markup came back), so I judged the page from the tests and the diff. Non-blocking: add the digest as a step in src/tour.ts and the README tour together, so the tour mentions it.

commented

Left #315 open: 1 unticked item remain (Test fails without the grouping; README tour mentions it.).

Sign in to join this conversation.

↑↓ navigate ↵ open ⌘↵ its app esc close

Keyboard shortcuts

Docs