Description
domain:server#6 · os-elon-musk · session_016WV4cz8zK9vJDPeeVKJ4XP
Filing gate: ① a coordinator-ruled card's remaining half, split out after measurement. Card #32799 (coordinator item 1 on #32643, comment 6819876581: "When the platform channel is present … mail counts as configured. The checklist's mail row reads done with no administrator action"). The framework half is merged as PR #32884; this is the console half the os-dev report (out_of_scope_findings, class b) hands to domain:ui. ⛔ Not a claim; triage sets the grade and the lane.
What
Since PR #32884, GET /api/settings/mail serves live.provider as { value, source }:
{ value: null, source: 'none' }when the live transport is the development log (nothing delivers);{ value: 'smtp' | 'resend' | 'postmark', source: 'settings' }when it was built from themailnamespace;{ value: 'smtp' | 'resend' | 'postmark', source: 'environment' }when the boot built it (stackemailblock,OS_EMAIL_*) or the host handed over a stock transport. This is how the hosted platform channel reads (lane reading A on plugin-email: GET /api/settings/mail serves no live.provider, so the hosted platform mail channel cannot read as configured (#32643 item 1, cloud#4386) #32799, comment 6838162755);- no
livekey when the provider cannot be stated.
The console's first-run checklist ignores it: ui/apps/console/src/pages/settings/firstRunChecklistLogic.ts isMailConfigured (:485) reads only the saved provider / from_email / smtp_host, and state.mail = { done: isMailConfigured(mail.values) } (:598). A hosted tenant with no saved mail settings, or a self-hosted install that configures mail through OS_EMAIL_*, keeps the mail row not done although mail is delivered.
Expected
The mail row reads done when the payload's live.provider states a provider in use (value not null, source settings or environment), the way aiProviderState (:537) reads the ai namespace's live. source: 'none' keeps it not done. With no live key (older server, or provider not stated), fall back to today's saved-values judgment. Copy that names the source, if any, must not say "platform": the server cannot tell a platform channel from a deployment's own environment.
Reader
The domain:ui seat. No server change is needed; the shape is the spec's existing SettingsNamespacePayload.live entry.
Duplicate check
is:issue is:open isMailConfigured live.provider and is:issue is:open mail checklist live provider: only #32799 itself (the server half).
Activity
objectstack-fleet commentedon Nov 13, 2026
triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH
Path: none
Triage: first touch →
domain:ui· p2 ·pm:queue· 2026-11-13T00:45Z⛔ Not a claim.
domain:ui, the console half of plugin-email: GET /api/settings/mail serves no live.provider, so the hosted platform mail channel cannot read as configured (#32643 item 1, cloud#4386) #32799. The framework half, PR feat(plugin-email): GET /api/settings/mail states the provider in use as live.provider #32884, has merged and serveslive.providerwith itssource.Generated by Claude Code
objectstack-fleet commentedon Nov 13, 2026
domain:ui#4 · os-tesla · session_01L9qibvZYR36KAJUv44oXZw
Claim: PM loop round 4 · 2026-11-13T04:44Z
Session:
session_01L9qibvZYR36KAJUv44oXZw(seat); card threadsession_01L9qibz7vQsZiJb7fiGgrzVis the devAccount:
os-teslaBranch:
claude/project-thread-ffwtl9(the card thread's designated branch; the platform lets a thread push only that branch, so notclaude/issue-32954-*)Worktree:
objectstack-issue-32954Domain:
domain:uiSeat:
domain:ui#4File surface:
ui/apps/console/src/pages/settings/firstRunChecklistLogic.ts,ui/apps/console/src/pages/settings/__tests__/firstRunChecklistLogic.test.ts(andFirstRunChecklist.tsx/ its test only if the row's rendering must change); root.changeset/. ⛔ No server change, nopackages/specchange (stop on breach; explain in the report)Container & model: S,
mode:thread,model: default tier(no path-derived mandate forui/apps/console/**),effort: medium(S card: one judgment function, one call site, pins; fleet token rule 2, maintainer 2026-11-12)Clause-②: no
Metadata-protocol: none
Responsibility: the first-run checklist judges mail from saved settings only and ignores the server's
live.providerstatement (served since PR #32884) (objectstackui/) |isMailConfigured(values)at thestate.mailcall site | every administrator whose mail is configured through the environment or a host-handed transport, who sees the mail row not done although mail is deliveredThread-read: 6840353576
Premise: holds at
origin/main994c7d67:firstRunChecklistLogic.tsisMailConfigured(:485) reads onlyprovider/from_email/smtp_host, and the call site (:598) passesmail.valuesalone;aiProviderState(:537) is the existinglive.providerreading. If the dev adds an@object-ui/i18nkey,Clause-②becomesyesand the seat owes the TIER_DEFAULT declaration review.Serial constraints cleared: no open PR touches
firstRunChecklist*. This seat's in-flight work is file-disjoint: #32833 (PR #32931,plugin-form/fields), #31542 (PR #33017,console/marketplace/**, in the merge queue), #32943 (PR #33022,metadata-admin/inspectors/**).objectstack-fleet commentedon Nov 13, 2026
domain:ui#4 · os-tesla · session_01L9qibz7vQsZiJb7fiGgrzV
os-dev-report
{ "issue": 32954, "status": "done", "branch": "claude/project-thread-ffwtl9", "pr": "https://github.com/objectstack-ai/objectstack/pull/33038", "session": "session_01L9qibz7vQsZiJb7fiGgrzV", "premise_still_valid": true, "summary": "New isMailDelivering(payload) in ui/apps/console/src/pages/settings/firstRunChecklistLogic.ts reads live.provider first: source settings or environment with a non-empty value is done, source none is not done, and a missing live key, missing provider entry or unrecognised source falls back to isMailConfigured(values). readChecklistSettings calls it for the mail row. No copy, no server or spec change. Changeset .changeset/32954-checklist-mail-live-provider.md, @object-ui/console patch (in the root fixed group).", "tests": "head 633a21db (9cf8040d + merge of origin/main 83bd36de, no overlap): pnpm --dir ui exec vitest run firstRunChecklistLogic.test.ts FirstRunChecklist.test.tsx -> Test Files 2 passed, Tests 55 passed. pnpm --filter @object-ui/console run type-check -> exit 0 (on 9cf8040d). Ablation via scripts/ablation-replace.mjs on 9cf8040d: anchor 'const stated = payload.live?.[MAIL_PROVIDER_KEY];' 1->0, marker 0->1, blob 1e2b63096b8e->29ffb28a78a7; the new mail case went red at the environment pin (expected false to be true), Tests 1 failed / 15 passed; restored, git diff HEAD empty. Subject imported from source, no dist.", "gates": "dispatch-gates --commands on 9cf8040d derived 35 families; all 35 exit 0; --ran reconciliation: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN. check:query-options-erasure and check:type-check-debt first hit a self-imposed 240 s cap (exit 124), re-run uncapped: exit 0. pnpm --dir ui exec vitest run scripts/: Test Files 171 passed / 2 skipped, Tests 5062 passed / 2 skipped. node scripts/check-sdui-manifest.mjs: exit 0. PR check-runs: in_progress at report time.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "2 — mcp__github__issue_read (get, get_comments); 0 writes", "api_writes": "2 — relay pr_create (POST /repos/objectstack-ai/objectstack/pulls, run 43373677106) and this os-dev-report comment (POST /repos/objectstack-ai/objectstack/issues/32954/comments); plus git push of the branch", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [] }