Skip to content

feat(playbooks): document reminders at 1:1 with workflows - #336

Merged
leoncheng57 merged 2 commits into
mainfrom
feat/playbooks-parity
Aug 30, 2026
Merged

feat(playbooks): document reminders at 1:1 with workflows#336
leoncheng57 merged 2 commits into
mainfrom
feat/playbooks-parity

Conversation

@leoncheng57

Copy link
Copy Markdown
Owner

Closes the parity gap the command retirement left behind.

The problem

Playbooks listed workflows only. Reminders sit right beside them in the composer, and had no page at all. Worse, the composer's per-reminder "details" link pointed at a workflow that merely shared its subject — so once the command catalogue was cut, ten of twelve reminders had no link anywhere.

What changed

  • Every reminder gets a card and a detail route. /playbooks/reminders and /playbooks/reminders/:id, added to isKnownAppRoute.
  • One filter searches both catalogues. A reader should not have to know which category their subject lives in before they can search for it.
  • GET /api/reminders now serves body. Withholding it never protected anything: a send carries the reminder ID only and the server resolves the body again at submit time, exactly as decision 21 established for workflow injectors. Hiding it bought nothing and denied the reader the same read-before-send guarantee the injector already gave.
  • client/lib/reminderWorkflows.ts is deleted. The composer now links a reminder to its own page.
  • Grouping extracted to client/lib/reminderCatalogue.ts, shared by the picker and the page so the two cannot disagree. Deliberately not named reminders.ts — that is the dual-copy-tested sentinel splitter.

Two judgement calls worth reviewing

An unrecognized reminder still gets a link. A test previously asserted the opposite. The detail page resolves from the live catalogue, so a newer server's reminder groups under Other and its page renders — being the one undocumented thing on the page is the exact failure this removes. I inverted the assertion rather than preserving it.

A missing reminder is reported as scope, not as invalid. A scope_repository reminder is genuinely absent for another project, so the not-found copy says that instead of claiming the id is wrong.

Verification

npm run typecheck · 1128 unit · 424 e2e · 2 preview-simulator — all green locally on merged main. Five new e2e specs cover the reminder catalogue, cross-catalogue search, the detail page, the scope-honest not-found state, and close-to-catalogue.

Playbooks listed workflows only, so a category that is right beside them in
the composer had no page at all. Every reminder now has a card and a detail
route, and one filter searches both catalogues - a reader should not have to
know which category their subject lives in before they can search for it.

Serves the reminder body. Withholding it never protected anything: a send
carries the reminder ID ONLY and the server resolves the body again at submit
time, exactly as decision 21 established for injectors. Hiding it bought
nothing and denied the reader the read-before-send guarantee the workflow
injector already gave them.

Deletes the reminder-to-workflow join. It pointed a reminder at a workflow
merely sharing its subject, so once the command catalogue was cut ten of
twelve reminders had no link. The composer now links a reminder to its own
page - including one this build has never heard of, which groups under Other
and still resolves from the live catalogue, because a newer server's reminder
being the only undocumented thing on the page is the failure this removes.

Extracts the reminder grouping into client/lib/reminderCatalogue.ts so the
picker and the page cannot disagree about where a reminder belongs. Named to
stay clear of client/lib/reminders.ts, the dual-copy-tested sentinel splitter.

A missing reminder may be scope_repository-scoped and genuinely absent for the
selected project, so the not-found state says so rather than calling the id
invalid.
agent-skills/ is now a retirement notice, a LICENSE and a CREDITS file. The
comment still claimed the allowlist existed because Playbooks.tsx compiled
that content into the SPA, which stopped being true when client/lib/playbooks.ts
was deleted. The files stay allowlisted so attribution travels with a snapshot
of the tree, which is a different reason and worth saying.
@github-actions
github-actions Bot temporarily deployed to pr-preview-336 August 30, 2026 05:09 Destroyed
@leoncheng57 leoncheng57 changed the title Document reminders on Playbooks at 1:1 with workflows feat(playbooks): document reminders at 1:1 with workflows Aug 30, 2026
@leoncheng57
leoncheng57 merged commit 095398f into main Aug 30, 2026
9 checks passed
github-actions Bot added a commit that referenced this pull request Aug 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

PR screenshots

No screenshots requested. Add this to the PR description:

```screenshots
/?directory=/tmp/mock-project
full:/sessions/ses_mock_done?directory=/tmp/mock-project

_Captured from the production app against deterministic mock OpenCode fixtures only._

@leoncheng57

Copy link
Copy Markdown
Owner Author

Wrap-up — command retirement + Playbooks parity

Merged and deployed. This closes the arc that began with #327.

PR State Commit
#327 publisher retirement MERGED 5ad4d7e
#330 command catalogue eliminated MERGED 1d56afb
#336 Playbooks 1:1 parity MERGED 095398f
#338 changelog entry for #330 MERGED 699f928
#328 preview screenshots CLOSED, superseded

Verification

Check Result
npm run typecheck green on 699f928
npm test green — 1128 passed, 2 skipped, 81 files
npx playwright test green — 424 passed, 1 skipped
npm run test:preview green — 2 passed
CI on #336 and #338 green — all 8 checks each (build, check, e2e-docker, host-contract-macos, secrets, capture, deploy)
Deployment 699f928 green — healthy, runs = 1, never exited

Nothing red. Nothing skipped that I chose to skip.

Live state after redeploy

  • 14 workflows, 12 reminders, every reminder body served
  • Upstream pin 1.18.23+dca.2 matches EXPECTED_SERVER_VERSION — the fork binary carrying the Allow Build Task children after a parent previously used Plan #75 deny fix is still in place, not a stock fallback
  • 83 sessions intact, same head session as the pre-restart baseline
  • /playbooks/reminders and /playbooks/reminders/:id serve 200
  • None of the 8 deleted workflow ids are still served

Two things a reviewer should know

agent-skills/commands/ is empty — all 23 are gone, and 4 left the app entirely. manager-children, red-team, worktree-up and review-learning have neither a workflow nor a reminder. That was confirmed as intended, but it is a real capability reduction, not an accounting artifact.

The 5 former agent: plan commands lost their read-only guarantee. A workflow has no declarative mode, so these now send in the session's current mode. The dialog and the detail page both say so rather than letting the old guarantee be assumed. If that matters for one of them, it needs a Plan session — not a workflow change.

Open decisions

None blocking. One deliberate follow-up: release-please will cut the version bump on its next run; 699f928 exists so #330 appears in that changelog rather than being silently omitted.

SAFE TO MERGE — already merged; main is at 699f928, all required checks green, deployment verified against it.

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