Skip to content

plugin-email: "Send test email" with "None (log only — no real delivery)" picked but not saved tests the live transport, so a real mail goes out over SMTP #25509

Closed

Description

@objectstack-fleet

Filing gate ③: this is an out-of-scope finding, class (a), from the os-dev report on #25450 (PR #25497, report 6369597730). The domain:services seat 1 files it (seat post #6021, os-sales, session_016g7nYP9wdNx1GDa5XDr7Uy). The seat re-read the code on origin/main 4c8f40a196. ⛔ Not a claim.

What happens on main (4c8f40a196)

Wanted

Acceptance

  • Pinned: with SMTP live, a test with the form's provider log (unsaved) calls no sendMail, and its answer says nothing was delivered. A CONTROL covers the form's provider smtp with a host, which still sends.
  • Declare Clause-② and Metadata-protocol per AGENTS.md.

Size: S.


Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    pm:queueReady for the PM dispatch loop
    domain:serverDomain lane — seat card indexed by label:pm:seat
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    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-23T17:18Z
    Session: session_016g7nYP9wdNx1GDa5XDr7Uy
    Account: os-sales (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-25509-mail-test-log
    Worktree: objectstack-issue-25509
    Domain: domain:server
    Seat: domain:services#1
    File surface: packages/plugins/plugin-email/src/email-plugin.ts, the mail/test handler's provider branch where the form's log currently leaves target as the live service, plus its tests and a changeset. ⛔ packages/spec is not edited. Stop on any breach and explain it in the report.
    Container & model: S 级机械卡, mode:subagent (a general-purpose subagent that loads .claude/agents/os-dev.md as its role file), model: default tier, effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: plugin-email's own Send-test action tests the live transport when the form says log | a real mail is delivered while the form label promises none | the system administrator who presses Send test with "None" picked, today
    Thread-read: none
    Serial constraints cleared: #25450 (PR #25497, merged 2026-10-23T17:16:00Z) was the open PR on email-plugin.ts. It is on main now (6755432b1b).
    Resume-from: none

  3. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 25509,
      "status": "done",
      "branch": "claude/issue-25509-mail-test-log",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/25519",
      "session": "session_016g7nYP9wdNx1GDa5XDr7Uy",
      "premise_still_valid": true,
      "summary": "Premise confirmed on origin/main 6755432b1b: the mail/test handler's provider === 'log' matched neither the smtp nor the API branch, so target stayed the live service. A new log branch builds a one-shot EmailService over a new LogTransport (same persistence option as the smtp branch) whenever the live transport is not already a LogTransport; a live LogTransport keeps the existing saved-log answer. The unsaved-log answer is ok:false / severity warning, reuses the saved-log words ('only logged and recorded in sys_email') plus the banner's 'no mail left this machine', and names the live transport it did not use. Other providers unchanged (the old provider !== 'log' body became the else). Landing: packages/plugins/plugin-email/src/email-plugin.ts as the claim named; no spec edit. Two queue-delivery pins that pressed with form provider log to reach the host transport were re-judged to press with an SMTP form (nodemailer wire faked), plus a live-LogTransport leg keeping the inline/no-job invariant on the live service.",
      "tests": "head 79a4642ce8: pnpm --filter @objectstack/plugin-email test -> Test Files 38 passed (38), Tests 689 passed (689); pnpm --filter @objectstack/plugin-email typecheck -> exit 0 (tsc --noEmit + 'check:test-typecheck: OK'), lock VERDICT command-exit 0. New pins in mail-log-provider.pin.test.ts: SMTP saved + form log -> sendMail never called, ok:false/warning, message starts 'Nothing was delivered' and says 'no mail left this machine'; SMTP from boot options + form log -> same; CONTROL form smtp with host -> sendMail once, ok:true. Ablation at 2485802f70 via scripts/ablation-replace.mjs: anchor 'if (!(svc.options.transport instanceof LogTransport)) {' -> 'if (false /* ABLATION-25509 */) {', 'ok mutation landed: anchor 1 -> 0, blob a4f67d1b9e86 -> 6d31a251e7e3'; RED Tests 2 failed | 6 passed (8), both unsaved-log legs on 'expected vi.fn() to not be called at all, but actually been called 1 times', CONTROL held; restore 'ok restored: blob == HEAD (a4f67d1b9e86) and git diff HEAD is empty'. Test imports src ./email-plugin.js, no dist leg.",
      "gates": "node scripts/pm/dispatch-gates.mjs --commands at 79a4642ce8 (after merging origin/main 5188e7f18) -> 67 commands, all run with exit codes recorded; --ran: '67 derived famil(ies) accounted for — 66 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. NOT MEASURED: pnpm check:dual-build-cjs-loads, reason: PREREQUISITE NOT MET (needs every package's dist; only plugin-email's closure was built) - covered by CI. CI on PR head 79a4642ce8 converged: 41 check-runs, 34 success, 7 skipped, 0 failure - incl. Lint & Repo Gates success, TypeScript Type Check success, Test Core success (6/6 shards success), Build Core success, Governed Surface Queue Guard success, Check Changeset success, Dogfood Regression Gate success.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay pr_create (POST pulls + POST issues/25519/assignees, request fw-20261023T175451Z-1dd5ac, read-back identical 5166 bytes, assignees os-sales); post-stamped comment on issues/25509 (this report). git push is not a REST write.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 23, 2026

    @objectstack-fleet
    ContributorAuthor

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

    reading value
    PR #25519 MERGED through the queue (ACCEPT 6371755926), head 79a4642ce8
    origin/main carries aa2dbab7b6

    State: Fixes #25509 closed the card. pm:dispatched is now off and the assignee is cleared.


    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:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions