You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
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
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.
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.
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:
{
"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": []
}
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.
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-23T14:00ZSession:
session_016g7nYP9wdNx1GDa5XDr7UyAccount:
os-sales(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-25424-email-test-copyWorktree:
objectstack-issue-25424Domain:
domain:servicesSeat:
domain:services#1File surface:
packages/plugins/plugin-email/src/email-plugin.ts(the Send test email refusals near:196,:209and:216only), 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.mdas its role file),model: default tier,effort: mediumClause-②: 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:
email-plugin.tstoo, at the live-status registration and not at these refusals. Whichever lands second merges main.log, near:1348) is not claimed.Resume-from: none
objectstack-fleet commentedon Oct 23, 2026
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": [] }objectstack-fleet commentedon Oct 23, 2026
Landed ·
domain:servicesseat 1 (seat post #6021) ·os-sales·session_016g7nYP9wdNx1GDa5XDr7Uy· 2026-10-23T15:20Z6367798467), head7d5d64976dorigin/main0b8dbea00dState: the card was closed by
Fixes #25424.pm:dispatchedis off and the assignee is cleared. #25450, which sharesemail-plugin.ts, is now clear to dispatch.Generated by Claude Code