Summary
The platform requires a verified email before a user can post a message or attach media. The macOS app decodes the flag, renders it once in Settings, and gates nothing on it — so an unverified user writes a whole message (or picks images) and only finds out at publish time, from a server error.
The documented rule
/help/settings: "You must verify your email before posting messages or attaching media. If you did not receive the verification email, click Resend verification email in the Security section. You can resend once every 10 minutes."
/help/messages: "You must have verified your email before you can post images or video." and "You must verify your email address before posting messages."
/help/direct-messages: "You'll need a verified email address to send images" in a DM.
What we ship today
CurrentUser.isEmailVerified (CurrentUser.swift:57) is modelled and mapped (Mappers.swift:39).
- Its only consumer is
AccountSettingsView.swift:114, which displays it.
- Nothing in the composer, the media picker, or the DM image path consults it.
Backend constraint to resolve first
POST /api/auth/send-verification-email is declared x-auth-type: session in the live OpenAPI spec — a Bearer-only client cannot call it. Verify this against the live API before building the resend button:
POST https://interlinedlist.com/api/auth/send-verification-email (Bearer)
If it genuinely rejects Bearer, the resend action must deep-link to the web Settings ▸ Security page instead of calling the route, and the backend ask should be filed with the other session-only-route asks. Do not ship a button that silently 401s.
Division of labor
Kit
Domain
App
Tests
Acceptance criteria
- An unverified account is told before composing, not after publishing.
- The resend action either works over Bearer or opens the web page — never fails silently.
- Full E2E gate green.
Notes
work-consolidation.md tracks this as G38. Size S. Related: the account-status gate issue covers the other reason a new account cannot post (rate limits on "new" accounts), which is a different mechanism with a different message.
Summary
The platform requires a verified email before a user can post a message or attach media. The macOS app decodes the flag, renders it once in Settings, and gates nothing on it — so an unverified user writes a whole message (or picks images) and only finds out at publish time, from a server error.
The documented rule
/help/settings: "You must verify your email before posting messages or attaching media. If you did not receive the verification email, click Resend verification email in the Security section. You can resend once every 10 minutes."/help/messages: "You must have verified your email before you can post images or video." and "You must verify your email address before posting messages."/help/direct-messages: "You'll need a verified email address to send images" in a DM.What we ship today
CurrentUser.isEmailVerified(CurrentUser.swift:57) is modelled and mapped (Mappers.swift:39).AccountSettingsView.swift:114, which displays it.Backend constraint to resolve first
POST /api/auth/send-verification-emailis declaredx-auth-type: sessionin the live OpenAPI spec — a Bearer-only client cannot call it. Verify this against the live API before building the resend button:If it genuinely rejects Bearer, the resend action must deep-link to the web Settings ▸ Security page instead of calling the route, and the backend ask should be filed with the other session-only-route asks. Do not ship a button that silently 401s.
Division of labor
Kit
Domain
PostingEligibility(or equivalent) projection that answers "can this account post / attach media right now, and if not, why" fromCurrentUser. Keep it separate fromEntitlementsService— verification is not a subscription tier — but make the composer consult both.App
Tests
Acceptance criteria
Notes
work-consolidation.mdtracks this as G38. Size S. Related: the account-status gate issue covers the other reason a new account cannot post (rate limits on "new" accounts), which is a different mechanism with a different message.