Skip to content

Redesign the App Home PR queue: stats, Overdue, tabs - #2

Merged
scosman merged 2 commits into
mainfrom
claude/vibrant-ramanujan-w4nybl
Oct 2, 2026
Merged

scosman merged 2 commits into
mainfrom
claude/vibrant-ramanujan-w4nybl

Conversation

@scosman

@scosman scosman commented Oct 2, 2026 •

Copy link
Copy Markdown
Contributor

The App Home was one long list of links. This PR rebuilds it in plain Block Kit (no images). Preview as built: https://claude.ai/artifact/BzdkQoGRCUaLdmhTshTr1w

What it looks like

  • Request PR with a secondary ↻ Refresh beside it. Refresh re-renders the App Home and keeps the current tab. Below them, "Updated Today at 2:41 PM" is a Slack date token, so each viewer sees it in their own time zone.
  • Stats: each is a header block with the number first, then a grey breakdown line:
    • ⏰ N Overdue: "5 waiting on you · 2 of your PRs, waiting on others · oldest 5d"
    • 📥 N Waiting on You: counted by your next action, e.g. "19 reviews requested · 3 CI failing"
    • 🚀 N Open PRs: counted by state, e.g. "⚠️ 2 merge conflict · ✅ 2 approved"
  • Tabs: All · ⏰ Overdue · 📥 Waiting on You · 🚀 Your Open PRs. They're all secondary buttons, with a ✓ on the current one. Overdue is a filter over both sections, not a section of its own.
  • Lists: a context label per group ("Review · 19 · 4 overdue"), then a rich_text bullet list. Rows read Kiln - #1709, then the title, the author as a user pill, and the wait. Overdue rows show the wait in bold with ⏰. Your PRs name whoever else they're waiting on. Each group shows at most 30 rows, then "…and N more".
  • /nathan prs replies with the All view, without tabs.

Data

  • Overdue uses the same threshold rule as reminders and the daily report's Needs attention section: working hours in the current state, weekends excluded, in the owner's time zone, at or past thresholdHours.
    • overdueOwners moves from report.ts into reminders.ts, so both use one implementation.
    • The report's behavior doesn't change.
    • Needs attention still leaves Dependabot PRs to their own section, while the triager's queue counts them.
  • Each PR counts once: you're an owner and past the threshold, or you wrote it and another owner is past it.

Platform

  • New SlackRegistry.homeButton(actionId). Clicking one re-renders the App Home with the button's value as the feature's state (HomeRequest.state). State is per feature, so every section a feature registers receives it.
  • States are kept in the home view's private_metadata, so one feature's click keeps other features' state. app_home_opened starts from no state.
  • Action IDs are shared between action and homeButton, so a clash in either direction fails at startup.
  • richText / richTextList builders in src/slack/blocks.ts. Dry run can't defuse the user element, so its doc comment limits it to the App Home and ephemeral replies, where it never notifies.

Known and accepted

  • Two very fast tab clicks can publish out of order. The view always stays consistent (the ✓ matches the content), and the next click corrects it.

Tests

npm run check passes: lint, typecheck, config, import boundaries, and 769 tests.

  • The personal queue tests are rewritten, with a new golden file.
  • A direct test of overdueOwners covers the threshold, weekends, urgent, drafts and the merge queue.
  • An App Home test moves the clock past the threshold.
  • New tests cover home states in the gateway, composeHome and the registry, and the Refresh button.

Spec §4.9 and the architecture note on App Home composition are updated.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GtVPu9KaARmEtb3ws8wSiK

scosman and others added 2 commits October 2, 2026 16:06
The App Home now leads with three big-number stats (Overdue, Waiting on
You, Open PRs), each with a breakdown line, then a row of tabs (All,
Overdue, Waiting on You, Your Open PRs) and rich-text lists grouped by
next step or state. Rows link as "<repo> - #<number>" and flag overdue
PRs with the wait in bold.

- Overdue uses the daily report's rule; overdueOwners moves to
  reminders.ts so the report and the queue share it.
- New SlackRegistry.homeButton: clicking re-renders the App Home with
  the button's value as the section's state, kept per feature in the
  view's private_metadata. Opening the tab starts from no state.
- rich_text list builders in src/slack/blocks.ts.
- /nathan prs replies with the All tab, without tabs.
- Spec §4.9 and the architecture note updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GtVPu9KaARmEtb3ws8wSiK
- Refresh: a secondary button beside Request PR re-renders the App Home,
  keeping the queue's tab, with "Updated <date> at <time>" in each
  viewer's time zone. The Request PR section becomes section + actions +
  context.
- Tests: overdueOwners directly (threshold, weekends, urgent, drafts and
  merge queue), and an App Home test past the reminder threshold.
  prContext moves to test/helpers/pr.ts.
- Docs: home state is per feature, not per section; Overdue shares the
  Needs attention rule but counts Dependabot PRs for the triager; the
  30-row group cap is in the spec; the truncation notice and dry-run
  comment are corrected.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GtVPu9KaARmEtb3ws8wSiK
@scosman
scosman merged commit 24249c6 into main Oct 2, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant