Nothing brings an organizer back to a draft they haven't published
メンテナーはふだん 1 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 45/100
- issue の種類
- 機能追加
- 明瞭さ
- 明確に書かれている
- 活発さ
- 活発
- 技術スタック
- postgresql, typescript
- 領域
- backend, database, documentation
調査の方向性
Start with src/lib/draft-nudge.ts and src/jobs/due-rules.ts, then inspect the referenced #532 diff and its database tests on claude/issue-506-draft-email. Check the migration numbering against main and follow the listed job, email, unsubscribe, privacy, telemetry, help, and CLAUDE.md entry points. Done when the eligibility cases, one-send behavior, template rendering, legal wording, and listed checks all pass.
索引モデルが issue の本文から書いたものです。
説明
Why
Nothing brings an organizer back to a draft they didn't finish. #532 built an email for this, but it sat on top of the review-page stack, which is closed while the draft → publish → share flow is redesigned (#498). The automatic email doesn't depend on that design, so it can ship on its own.
What to do
Rebuild #532's email as a new PR from main. The code is on the branch claude/issue-506-draft-email, and #532's diff shows only the email.
Bring over:
- The scheduled email. It goes out 3 hours after a draft is started (
DRAFT_NUDGE_DELAY_HOURSinsrc/lib/draft-nudge.ts), and only while the signup is still an undeleted draft, has a slot filled in, and its organizer can still edit it. Drafts started more than 48 hours ago get none, so the first deploy doesn't email every old draft. - Not for drafts an AI connector created. The assistant already gives the organizer the links.
- Jobs.
draft-nudges.dispatch(a scan every 10 minutes) anddraft-nudges.send(one job per due draft, which checks every rule again first). Adraft.nudge_sentactivity row stops a second send. The shared "which rules failed" SQL issrc/jobs/due-rules.ts. - The template and subject ("Ready to publish: {title}"), in
src/email/subjects.ts. - Turning it off. Each email has a link and
List-Unsubscribeheaders. The link opens/unsubscribe/drafts, which asks first and can turn the emails back on. One-click unsubscribe posts toPOST /api/public/draft-email-optout. Both are token-checked and rate-limited per IP. The setting is one column,organizers.draft_emails_opted_out_at. Its migration needs a new number after main's latest. - Docs. The privacy page (bump "Last updated"),
docs/telemetry.md, the help page line, and the jobs section of CLAUDE.md. pnpm drafts:due, likepnpm reminders:due.
Leave for the redesign (#498, #506):
- "Not yet. Email me a link to finish later". It was a button on the review page.
Changes from #532:
- The main button. "Check it and publish" opened the review page. On main,
/app/signups/[id]opens the Build tab, so the button should say something that fits, such as "Finish and publish". - The "So far" line. "12 slots · 3 days · 3 people each" used the review page's headline helper (
signupHeadline, from #528). Either bring that small pure function over with its tests, or drop the line.
Decisions (defaults from #532)
- Delay: 3 hours, and only for drafts started in the last 48 hours.
- Off switch: per organizer, through the link in the email. There's no settings page for it.
- AI connector drafts: they don't get the email.
- New: keep the "So far" line, or drop it?
Watch for
- One worker. As with reminders, the check that stops a second email holds only with one worker process.
- Trust docs change in the same PR.
Done when
- A due draft gets exactly one email. A published, deleted, empty, opted-out, connector-made or too-old draft gets none. #532 has a DB test for each case.
- The template renders in the worker test.
- The legal pages say organizers may get one email about an unpublished draft.
pnpm lint && pnpm typecheck && pnpm knip && pnpm testandpnpm test:dbpass.
- 主要言語
- TypeScript
- スター
- 19
- フォーク
- 4
- 平均マージ
- 23時間 28分
- マージ済み PR(30日)
- 173
環境構築
- Dockerfile または Docker Compose ファイルあり
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
richshaw/OpenSignup のほかの issue
-
bug pipeline:ready pipeline:ux
難易度 2/5 1〜3時間 初心者へのやさしさ 90/100
richshaw/OpenSignup#723 ·
メンテナーはふだん 1 日以内に返信
-
bug pipeline:ready pipeline:ux
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
richshaw/OpenSignup#722 ·
メンテナーはふだん 1 日以内に返信
-
bug pipeline:ready pipeline:ux
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
richshaw/OpenSignup#719 ·
メンテナーはふだん 1 日以内に返信
-
enhancement pipeline:ready pipeline:ux
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100
richshaw/OpenSignup#715 ·
メンテナーはふだん 1 日以内に返信
-
bug pipeline:ready pipeline:ux
難易度 2/5 1〜3時間 初心者へのやさしさ 75/100
richshaw/OpenSignup#711 ·
メンテナーはふだん 1 日以内に返信
richshaw/OpenSignup の issue をすべて見る
似ている issue
-
area:cli bug P4
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信
-
bug from-studio
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
esengine/DeepSeek-Reasonix#14868 ·
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 68/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
linxiv-dev/linXiv#384 · コメント 1 件 ·
メンテナーはふだん 1 日以内に返信
-
factory-active task-identify-harness-labels-done task-identify-issue-type-done
難易度 2/5 1〜3時間 初心者へのやさしさ 82/100
メンテナーはふだん 1 日以内に返信