Repository navigation
Closed
Labels
bugSomething isn't workingSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3Medium: important, M3
Description
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.
- Who acts:
domain:server(plugin-email). - Dedupe: none found. Searched the open issues for
send test+email provider log. The hits are Setup → Email shows provider SMTP with an empty host while mail goes to the development log sink and "Invitation sent" toasts appear — say on the page which transport is live (hotcrm#2194 T2-U12) #25335 (the live-transport statement) and plugin-email: saving mail provider "None (log only — no real delivery)" keeps the previous SMTP transport, so mail is still delivered while the page and the log say it is not #25450 (a savedlogkeeps SMTP; fixed by fix(plugin-email): saving mail provider "None (log only)" stops delivery instead of keeping the live SMTP transport #25497). Neither covers an unsaved form choice in the test action. The dev's dedupe words:send test log provider unsaved,mail/test None delivers,test email form provider log live smtp.
What happens on main (4c8f40a196)
- Setup → Email's "Send test email" action builds its target from the form's merged values. In
plugin-email/src/email-plugin.ts(themail/testhandler, near:683):smtpbuilds a temporarySmtpTransport.- Resend and Postmark build a temporary service.
provider === 'log'matches neither branch, sotargetstays the live servicesvc.
- So if SMTP is live and the admin picks "None (log only — no real delivery)" on the form without saving and presses Send test, a real mail is delivered over SMTP. The answer is
ok: true"Sent test email to …". - Reach: measured by the plugin-email: saving mail provider "None (log only — no real delivery)" keeps the previous SMTP transport, so mail is still delivered while the page and the log say it is not #25450 dev with a throwaway probe at
fa561813a8, not committed: nodemailersendMailwas called once, answeringok:true. - This is the same mismatch plugin-email: saving mail provider "None (log only — no real delivery)" keeps the previous SMTP transport, so mail is still delivered while the page and the log say it is not #25450 fixed for the save door, on the test door. The label promises no delivery, and a mail leaves the machine.
Wanted
- With
logpicked on the form, the test sends through a temporaryLogTransport, assmtp/ Resend / Postmark test the form's choice and not the live one. It answers in words that nothing left the machine. That matches theok:falsewarning fix(plugin-email): saving mail provider "None (log only)" stops delivery instead of keeping the live SMTP transport #25497 gives oncelogis saved. - No change for the other providers.
Acceptance
- Pinned: with SMTP live, a test with the form's provider
log(unsaved) calls nosendMail, and its answer says nothing was delivered. A CONTROL covers the form's providersmtpwith a host, which still sends. - Declare
Clause-②andMetadata-protocolper AGENTS.md.
Size: S.
Generated by Claude Code
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3Medium: important, M3
Activity
objectstack-fleet commentedon Oct 23, 2026
Claim: PM loop round 1 ·
domain:servicesseat 1 (seat post #6021, project run by the Sales account) · S mechanical card, in-seat subagent · 2026-10-23T17:18ZSession:
session_016g7nYP9wdNx1GDa5XDr7UyAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-25509-mail-test-logWorktree:
objectstack-issue-25509Domain:
domain:serverSeat:
domain:services#1File surface:
packages/plugins/plugin-email/src/email-plugin.ts, themail/testhandler's provider branch where the form'slogcurrently leavestargetas the live service, plus its tests and a changeset. ⛔packages/specis 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.mdas its role file),model: default tier,effort: mediumClause-②: no
Metadata-protocol: none
Responsibility:
plugin-email's own Send-test action tests the live transport when the form sayslog| a real mail is delivered while the form label promises none | the system administrator who presses Send test with "None" picked, todayThread-read: none
Serial constraints cleared: #25450 (PR #25497, merged 2026-10-23T17:16:00Z) was the open PR on
email-plugin.ts. It is onmainnow (6755432b1b).Resume-from: none
objectstack-fleet commentedon Oct 23, 2026
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
objectstack-fleet commentedon Oct 23, 2026
Landed ·
domain:servicesseat 1 (seat post #6021) ·os-sales·session_016g7nYP9wdNx1GDa5XDr7Uy· 2026-10-23T18:41Z6371755926), head79a4642ce8origin/mainaa2dbab7b6State:
Fixes #25509closed the card.pm:dispatchedis now off and the assignee is cleared.Generated by Claude Code