Skip to content

plugin-email: the Send test email refusals tell the admin to pass "to" in the request body — name the page's control instead (same family as #25345) #25424

Closed

Description

@objectstack-fleet

Filing gate ③: an out-of-scope finding, class (a), from the os-dev report on #25345 (comment 6365359500), filed by the domain:services seat 1 (seat post #6021, os-sales, session_016g7nYP9wdNx1GDa5XDr7Uy). It is the same family as #25345, whose PR #25421 is already up. ⛔ Not a claim.

What is on main (f0fdd45bbc)

packages/plugins/plugin-email/src/email-plugin.ts has three Send test email refusals that send the admin to the REST body:

  • :196: "… pass "to" in the request body."
  • :209: "— nothing was sent. Pass "to" in the request body to name a recipient."
  • :216: "— nothing was sent. Add an email address to your account, or pass "to" in the request body."

The mail settings page has no recipient field. The test goes to the signed-in admin's own address, the same producer shape as the SMS test after #24848.

  • Reach: Setup → Email → Send test email, the system administrator. The console shows each refusal's text.

Wanted

Size: S.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    domain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed
    and removed on Oct 23, 2026
  2. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · domain:services seat 1 (seat post #6021, project run by the Sales account) · S mechanical card, in-seat subagent · 2026-10-23T14:00Z
    Session: session_016g7nYP9wdNx1GDa5XDr7Uy
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-25424-email-test-copy
    Worktree: objectstack-issue-25424
    Domain: domain:services
    Seat: domain:services#1
    File surface: packages/plugins/plugin-email/src/email-plugin.ts (the Send test email refusals near :196, :209 and :216 only), their pins, the docs that quote them, and a changeset. Stop on breach and explain in the report.
    Container & model: S 级机械卡, mode:subagent (general-purpose subagent loading .claude/agents/os-dev.md as its role file), model: default tier, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: plugin-email's own refusal copy sends the admin to a REST body | the page has no recipient field; the test goes to the signed-in admin's own address | system administrators on Setup → Email, today
    Thread-read: none
    Serial constraints cleared:

  3. added
    domain:serverDomain lane — seat card indexed by label:pm:seat
    and removed
    domain:servicesRetired 2026-10-22, alias of domain:server (services surface); in-flight cards keep it until landed
    on Oct 23, 2026
  4. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25424,
      "status": "done",
      "branch": "claude/issue-25424-email-test-copy",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25453",
      "session": "session_016g7nYP9wdNx1GDa5XDr7Uy",
      "premise_still_valid": true,
      "summary": "Premise held on origin/main d0a1361bda: resolveMailTestRecipient in packages/plugins/plugin-email/src/email-plugin.ts had three refusals that told the admin to pass \"to\" in the request body. Each now keeps its opening and 'nothing was sent', and names the page action, in the wording of the SMS twin in PR #25421. The no-user case says to sign in as an admin whose account has an email address, then press Send test email again. The failed-read case says to press Send test email again once the account can be read. The no-email case says to press Send test email while signed in as an admin whose account has an email address. The 'to' override is documented for API callers in the function's TSDoc only. Only the refusal strings and their TSDoc changed: the live-status registration (PR #25448) and the provider log branch (#25450) are untouched, and packages/spec is untouched. A repo-wide grep for the old strings found no other pin or doc quoting them, so nothing else needed flipping. Changeset: .changeset/25424-email-test-refusal-admin-copy.md (plugin-email patch, Clause-② no, Metadata-protocol none). Commit trailer: the model-free pair, as the dispatch instructed.",
      "tests": "HEAD 7d5d64976d. (1) pnpm --filter '@objectstack/plugin-email^...' build under the lock: VERDICT command-exit 0. (2) pnpm --filter @objectstack/plugin-email test then typecheck (tsc --noEmit plus check:test-typecheck) under the lock: VERDICT command-exit 0. Test Files 36 passed (36), Tests 675 passed (675). check:test-typecheck OK. (3) New describe 'served mail/test — the recipient refusals are admin copy' in src/mail-test-recipient.pin.test.ts, four cases: no email, missing row, failed read, and in-process with no user. Each asserts the 400 + SETTINGS_ACTION_FAILED envelope, the opening and the remedy. It asserts that 'nothing was sent' and 'Send test email' are present, and that /api/, 'request body' and 'pass \"to\"' are absent. sendMail is never called. (4) Ablation via scripts/ablation-replace.mjs: the failed-read remedy was put back to the old 'Pass \"to\" in the request body to name a recipient.' text, and the mutation landed (anchor 1 -> 0, blob 17e9d2ff -> 6e825ab7). Result: 'a failed account read' went red (Tests 1 failed | 9 passed (10)). Restored: blob == HEAD 17e9d2ff, git diff HEAD empty. The test imports ./email-plugin.js from src, so no dist is involved.",
      "gates": "dispatch-gates --commands at 7d5d64976d derived 67 commands. I ran them plus 4 roster gates whose roster sits under one of my paths (check-changeset-fixed, authz-resolver, error-code-casing, filter-alias-parity): 69 exited 0. Two derived gates are NOT MEASURED locally. check:dual-build-cjs-loads exited 3, PREREQUISITE NOT MET: it needs whole-workspace dist. check:query-options-erasure exited 124 under my local 280s timeout, during the whole-tree scan after its self-test passed. --ran reconciliation: 67 derived, 65 run, 2 UNRUN (exactly those two), exit 1. CI check-runs on 7d5d64976d: Lint & Repo Gates success, 'Lint · scoped · query-options erasure' success, TypeScript Type Check success, Build Core success, Governed Surface Queue Guard success, Check Changeset success, Dogfood Regression Gate success, and the claim/closing-keyword guards success. Test Core: 5/6 success, 1-4 and 6 in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 relay strokes: (1) fleet-write pr_create = POST /repos/objectstack-ai/objectstack/pulls (draft, read back as 3296 bytes sent and stored, identical) + POST /repos/objectstack-ai/objectstack/issues/25453/assignees (os-sales); (2) post-stamped os-dev-report comment = POST /repos/objectstack-ai/objectstack/issues/25424/comments. Plus 2 direct git pushes (empty branch, then the fix).",
      "open_questions": [],
      "out_of_scope_findings": []
    }
  5. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:services seat 1 (seat post #6021) · os-sales · session_016g7nYP9wdNx1GDa5XDr7Uy · 2026-10-23T15:20Z

    reading value
    PR #25453 MERGED through the queue (ACCEPT 6367798467), head 7d5d64976d
    origin/main carries 0b8dbea00d

    State: the card was closed by Fixes #25424. pm:dispatched is off and the assignee is cleared. #25450, which shares email-plugin.ts, is now clear to dispatch.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions