Repository navigation
QA run · integration-system.email-template-render (1/1) · 55a806a7 · 2026-10-17 · 1 PASS / 0 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #24101
Description
Run record for the re-run #24036 (half B) asks for after revising this item. Runner: an os-dev subagent dispatched by the domain:devx seat 2 PM (session session_016PVjjuVPte5XEJvaQx1E4t). Protocol: .claude/skills/checklist-test/SKILL.md + docs/qa/platform-checklist/RUNNER.md. Executed sequentially (no subagent tool in this runner).
Environment fingerprint
- framework:
55a806a78c0442243a8ac22e7dbc6f7b2c4b3bb0on branchclaude/issue-24036-ledger-b, the commit the app was built from. Its product tree isorigin/main8a83cebc1; the branch addsdocs/qa/platform-checklist/areas/*.jsononly, and its later commits touch those files alone. Built withpnpm install --frozen-lockfileandturbo run build(75/75 tasks). .objectui-sha:f8267df93aba8fb09cc1cc0692eadc0c8c5a5e56(no browser leg in this item).- boot: a writable scratch copy of
examples/app-showcase(beside it in the worktree, never committed; fixtures.requires[3]) adding a zh-CN twin of showcase_task_done_email, anactive:falsetemplate, a fromOverride + replyTo template with no bodyText, and a reload probe template; bootedOS_PORT=41925 objectstack dev --ui --seed-admin --no-restart -p 41925 -d file:(run dir)/email/data.db, then rebooted once on the same DB for the overlay leg; stopped by its process-group id. The rejection probes ranobjectstack buildon the same copy. - persona(s): the seeded admin (
admin@objectos.ai), identity proven withGET /api/v1/auth/get-sessionbefore the first cell; three members minted through invite + sign-up: no locale,zh-CN,zh(sys_user.locale set by adminPATCH /api/v1/data/sys_user/IDand read back;POST /auth/update-user {locale}answered 400 "No fields to update") - timestamps: 2026-10-17, 00:34Z to 00:37Z
Scope
Selector integration-system.email-template-render resolves to 1 runnable item: integration-system.email-template-render at revision 7, P2, surface mixed. No planned or blocked-hidden item.
Per-clause verdicts
| # | clause (short) | verdict | evidence |
|---|---|---|---|
| 0 | authored template renders every hole | pass | GET /api/v1/meta/email_template/showcase_task_done_email serves the registry item (subject "✅ Task done: {{title}}", vars title required / project optional, active); sys_email_template holds 0 rows. Scratch notify flow (POST /api/v1/automation, channels email, template, templateData CEL literals, fired by /trigger) landed sys_email subject "✅ Task done: QA Title One", text "The task QA Title One on project QA Proj was marked done.", html with the same values; no {{ residue |
| 1 | missing required var fails fast; optional absent renders | pass | no title → the email delivery row goes dead, error "MISSING_VARIABLES: title", no sys_email row; no project → sys_email "✅ Task done: NoProj", text "… on project was marked done." |
| 2 | active:false → TEMPLATE_INACTIVE |
pass | qa_inactive_tpl → delivery dead, error "TEMPLATE_INACTIVE: qa_inactive_tpl"; no sys_email row |
| 3 | exact (name, locale), en-US fallback, no subtag folding | pass | one send to three recipients: zh-CN member "ZH-CN 完成: LocProbe"; zh member "✅ Task done: LocProbe" (the en-US row, not zh-CN); no-locale member "✅ Task done: LocProbe" |
| 4 | fromOverride / replyTo honored; text derived | pass | qa_from_tpl → sys_email from_address carries the display name "QA Sender" and the address qa-sender@qa.test, reply_to qa-reply@qa.test, body_text "Hello FromVal derived" derived from the html; the served item carries no bodyText |
| 5 | admin overlay survives reboot; declared-source edit served on reload | pass | admin PUT /meta/email_template/showcase_task_done_email (subject "ADMIN-EDIT done: {{title}}") 200 "Saved customization overlay"; after the reboot on the same DB the GET serves "ADMIN-EDIT done: {{title}}". On the writable copy (--no-restart), editing qa_reload_tpl's declared subject to "RELOADED-SOURCE {{title}}" was served by GET within 15 s, with the server process unrestarted |
| 6 | authoring rejections loud | pass | build with a body key: exit 2 "Unrecognized key(s) on this email template: body"; build with name BadName and content: exit 2 "name must be dotted snake_case" and "Unrecognized key(s) … content. Did you mean content → bodyHtml?" |
| 7 | raw send door authenticates and validates | pass | authed {to, subject, html} 200 {status: sent}, a sys_email row status sent; anonymous 401 UNAUTHENTICATED; string body 400 INVALID_REQUEST; {to: 42} 400 VALIDATION_FAILED; wrong vocabulary {to, subject, bodyHtml} 400 VALIDATION_FAILED "at least one of text or html is required" (negative[2]: not a FAIL). 501 no-provider not driven (the always-on email service is composed) |
Automated pins run (RUNNER rule 6)
packages/qa/dogfood/test/email-template-materialization.dogfood.test.ts(automated.ref): 4 passed, under the shared verify lock.
Reproduction rules
No clause scored fail, so none is owed. No authentication or authorization hole was found; nothing here is withheld under the RUNNER rule-2 carve-out.
Derived item verdict
integration-system.email-template-render r7: pass (8 pass of 8 clauses).
- The revision this run validates holds: every send went through the HTTP door knownGaps[1] and steps[1] now name (a scratch notify flow), and every render was read off sys_email.
Checklist-accuracy findings and fixture gaps from this run close out on #24036.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 17, 2026
Close-out (
domain:devxseat 2): every clause PASS; nothing to extract. Ruling C on #24127 (maintainer): a verification re-run of a ledger edit no longer carries aqa-runrecord, and the existing ones close out now. The revised itemintegration-system.email-template-renderlanded with #24141 (9ffe8af094), Part of #24036; itshistoryrow names #24036.Generated by Claude Code