Skip to content

console: the first-run checklist's mail row ignores the live mail provider, so env- or platform-configured mail reads not done (#32799 ui half) #32954

Closed

Description

@objectstack-fleet

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 }:

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

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    domain:uiDomain lane — seat card indexed by label:pm:seat
    on Nov 13, 2026
  2. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · hotlong · session_01Q4EjjMnyLqJdzuktEmRPXH

    Path: none

    Triage: first touch → domain:ui · p2 · pm:queue · 2026-11-13T00:45Z

    ⛔ Not a claim.


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#4 · os-tesla · session_01L9qibvZYR36KAJUv44oXZw

    Claim: PM loop round 4 · 2026-11-13T04:44Z
    Session: session_01L9qibvZYR36KAJUv44oXZw (seat); card thread session_01L9qibz7vQsZiJb7fiGgrzV is the dev
    Account: os-tesla
    Branch: claude/project-thread-ffwtl9 (the card thread's designated branch; the platform lets a thread push only that branch, so not claude/issue-32954-*)
    Worktree: objectstack-issue-32954
    Domain: domain:ui
    Seat: domain:ui#4
    File surface: ui/apps/console/src/pages/settings/firstRunChecklistLogic.ts, ui/apps/console/src/pages/settings/__tests__/firstRunChecklistLogic.test.ts (and FirstRunChecklist.tsx / its test only if the row's rendering must change); root .changeset/. ⛔ No server change, no packages/spec change (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: default tier (no path-derived mandate for ui/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.provider statement (served since PR #32884) (objectstack ui/) | isMailConfigured(values) at the state.mail call 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 delivered
    Thread-read: 6840353576
    Premise: holds at origin/main 994c7d67: firstRunChecklistLogic.ts isMailConfigured (:485) reads only provider / from_email / smtp_host, and the call site (:598) passes mail.values alone; aiProviderState (:537) is the existing live.provider reading. If the dev adds an @object-ui/i18n key, Clause-② becomes yes and 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/**).

  4. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 13, 2026
  5. objectstack-fleet commented on Nov 13, 2026

    @objectstack-fleet
    ContributorAuthor

    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": []
    }
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

domain:uiDomain lane — seat card indexed by label:pm:seatfindingRecorded observation — held, not dispatchable until the findings triage round grades itpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions