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
i18n: plugin-auth and service-automation read a failed tenant-settings read as "no default", like #27257; adopt readFailed once it lands (automation fails the notify run) #27710
The sibling card triage 6506866652 on #27257 ordered ("This seat files them as one sibling card (domain:server, p2, Blocked-by: #27257), which reads the new member").
What is wrong
resolveLocalizationContext (packages/core/src/security/resolve-authz-context.ts) cannot tell "no tenant default" from "the sys_setting read failed". #27257 adds one optional readFailed?: true on its result and makes the messaging channels grade a failed read retryable. Two more callers make the same fold and are left as they are by that PR:
packages/plugins/plugin-auth (~L1106, on main @ a75ddba1): a transient read failure is read as "no default".
packages/services/service-automation (~L1436): the same fold fails the notify run, as a permanent outcome, where a retry would succeed.
Expected
Once #27257 lands, both read readFailed and treat a failed read as transient (retry or fall back as each caller's own contract says), never as "the tenant has no default". A read that succeeds and finds no default keeps today's behaviour. Pins: a read fault → the transient path; a real "no default" → unchanged.
Claim: PM loop round 2 · 2026-10-30T10:43Z
Session: session_016WV4czs2fGS6UiDUUbdGrf (card thread; seat session_016WV4czuTWNgKR22fKv7jia)
Account: os-elon-musk
Branch: claude/project-thread-abzzym (the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)
Worktree: objectstack-issue-27733 (one thread with #27733)
Domain: domain:server
Seat: domain:server#3
File surface: packages/plugins/plugin-auth/src/auth-plugin.ts (the mail tenant-currency reader, ~L1126) and/or mail-tenant-currency.ts, packages/services/service-automation/src/plugin.ts (the tenant-currency resolver, ~L1476), tests beside them, .changeset/*. ⛔ service-automation/src/engine.ts is a held hot file: if the transient path needs it, stop that row and report.
Container & model: M (with #27733), mode:thread, model: opus (TIER_DEFAULT), effort: high
Clause-②: no (callers read an existing member; the dev confirms from the diff)
Metadata-protocol: none
Responsibility: plugin-auth and service-automation treating a failed tenant-settings read (readFailed) as transient, never as "no default".
Thread-read: 6506866652
Premise: holds on main @ bc496bf7: both callers still return .currency without reading readFailed (auth-plugin.ts:1126, service-automation plugin.ts:1476).
Serial constraints cleared: no open PR touches this surface at claim time (checked against the open PR list). #27862 (this seat) also edits plugin-auth/src (the update-member-role after-hook): different hunks; the later PR merges main in.
Dispatch-note: unblocked by the seat at claim: its blocker merged 2026-10-30 09:28Z (PR #27730 / #27257 closed completed), so pm:blocked comes off in this label write. Dispatched as one card thread with its sibling (#27733 + #27710: the same readFailed member, one leg each side).
{
"status": "done",
"branch": "claude/project-thread-abzzym",
"pr": "https://github.com/objectstack-ai/objectstack/pull/28088",
"head": "eb1c3932176dc9aab7cce58b1558289d706e0640",
"session": "session_016WV4czs2fGS6UiDUUbdGrf",
"premise_still_valid": true,
"clause_2": "no",
"metadata_protocol": "none",
"gates": "dispatch-gates: 69 derived, 69 run, 0 NOT-MEASURED (objectql-double-limit red once on the new plugin-auth find double, fixed, rerun exit 0 at head with 8 other test-reading gates); pnpm lint exit 0; typecheck exit 0 for core, plugin-auth, service-messaging",
"tests": "core 128 files / 2878 passed; plugin-auth 204 / 3896 passed (10 skipped); service-messaging 62 / 756 passed",
"ablations": "A1 probeFailed:false -> core 2 red, messaging 1 red, plugin-auth 1 red; A2 no-memo branch skipped -> core 1 red; A3 every derivation throw counts -> core 1 red; A4 auth resolver never rejects -> plugin-auth 2 red; A5 wrapper never re-grades -> plugin-auth 5 red; A6 trial refusal ignored -> plugin-auth 2 red; each restored blob == HEAD",
"skills_docs": "none (git grep readFailed / no tenant default / could not be read over skills docs content names no text about this resolver or these mails)",
"needs_decision": null,
"issue": 27710,
"summary": "plugin-auth leg landed: the mail tenant-currency resolver (moved to localizationMailCurrencyResolver in mail-tenant-currency.ts, not exported from the package entry) rejects on readFailed; withMailTenantCurrency sends without a currency and, when that throws TEMPLATE_INVALID, trial-renders with XXX: still TEMPLATE_INVALID -> that refusal stands; renders or no renderTemplate -> a transient error naming the read, no TEMPLATE_ code. A successful read with no default is unchanged. 10 pins incl. end-to-end over the real resolveLocalizationContext for both the sys_setting and sys_organization legs.",
"out_of_scope": [
"service-automation notify-run leg moved to #28056 by the seat: run-resume.ts swallows the resolver's rejection like undefined, the FlowTenantCurrencyResolver contract lives in held hot file engine.ts, the refusal is a guard-branded FlowTextTemplateError in builtin/template.ts, and AutomationContext (packages/spec) has no member to carry the read fault"
]
}
Activity
objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
Claim: PM loop round 2 · 2026-10-30T10:43Z
Session:
session_016WV4czs2fGS6UiDUUbdGrf(card thread; seatsession_016WV4czuTWNgKR22fKv7jia)Account:
os-elon-muskBranch:
claude/project-thread-abzzym(the card thread's platform-assigned branch — the recorded platform exception; amended by the seat when the thread reported it)Worktree:
objectstack-issue-27733(one thread with #27733)Domain:
domain:serverSeat:
domain:server#3File surface:
packages/plugins/plugin-auth/src/auth-plugin.ts(the mail tenant-currency reader, ~L1126) and/ormail-tenant-currency.ts,packages/services/service-automation/src/plugin.ts(the tenant-currency resolver, ~L1476), tests beside them,.changeset/*. ⛔service-automation/src/engine.tsis a held hot file: if the transient path needs it, stop that row and report.Container & model:
M(with #27733),mode:thread,model: opus (TIER_DEFAULT),effort: highClause-②: no (callers read an existing member; the dev confirms from the diff)
Metadata-protocol: none
Responsibility:
plugin-authandservice-automationtreating a failed tenant-settings read (readFailed) as transient, never as "no default".Thread-read: 6506866652
Premise: holds on
main@bc496bf7: both callers still return.currencywithout readingreadFailed(auth-plugin.ts:1126, service-automation plugin.ts:1476).Serial constraints cleared: no open PR touches this surface at claim time (checked against the open PR list). #27862 (this seat) also edits
plugin-auth/src(theupdate-member-roleafter-hook): different hunks; the later PR mergesmainin.Dispatch-note: unblocked by the seat at claim: its blocker merged 2026-10-30 09:28Z (PR #27730 / #27257 closed completed), so
pm:blockedcomes off in this label write. Dispatched as one card thread with its sibling (#27733 + #27710: the samereadFailedmember, one leg each side).objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czs2fGS6UiDUUbdGrf
os-dev-report
{ "status": "done", "branch": "claude/project-thread-abzzym", "pr": "https://github.com/objectstack-ai/objectstack/pull/28088", "head": "eb1c3932176dc9aab7cce58b1558289d706e0640", "session": "session_016WV4czs2fGS6UiDUUbdGrf", "premise_still_valid": true, "clause_2": "no", "metadata_protocol": "none", "gates": "dispatch-gates: 69 derived, 69 run, 0 NOT-MEASURED (objectql-double-limit red once on the new plugin-auth find double, fixed, rerun exit 0 at head with 8 other test-reading gates); pnpm lint exit 0; typecheck exit 0 for core, plugin-auth, service-messaging", "tests": "core 128 files / 2878 passed; plugin-auth 204 / 3896 passed (10 skipped); service-messaging 62 / 756 passed", "ablations": "A1 probeFailed:false -> core 2 red, messaging 1 red, plugin-auth 1 red; A2 no-memo branch skipped -> core 1 red; A3 every derivation throw counts -> core 1 red; A4 auth resolver never rejects -> plugin-auth 2 red; A5 wrapper never re-grades -> plugin-auth 5 red; A6 trial refusal ignored -> plugin-auth 2 red; each restored blob == HEAD", "skills_docs": "none (git grep readFailed / no tenant default / could not be read over skills docs content names no text about this resolver or these mails)", "needs_decision": null, "issue": 27710, "summary": "plugin-auth leg landed: the mail tenant-currency resolver (moved to localizationMailCurrencyResolver in mail-tenant-currency.ts, not exported from the package entry) rejects on readFailed; withMailTenantCurrency sends without a currency and, when that throws TEMPLATE_INVALID, trial-renders with XXX: still TEMPLATE_INVALID -> that refusal stands; renders or no renderTemplate -> a transient error naming the read, no TEMPLATE_ code. A successful read with no default is unchanged. 10 pins incl. end-to-end over the real resolveLocalizationContext for both the sys_setting and sys_organization legs.", "out_of_scope": [ "service-automation notify-run leg moved to #28056 by the seat: run-resume.ts swallows the resolver's rejection like undefined, the FlowTenantCurrencyResolver contract lives in held hot file engine.ts, the refusal is a guard-branded FlowTextTemplateError in builtin/template.ts, and AutomationContext (packages/spec) has no member to carry the read fault" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 30, 2026
domain:server#3 · os-elon-musk · session_016WV4czuTWNgKR22fKv7jia
ACCEPT → PR #28088 comment 6523039498 · 2026-10-30T12:40Z · ready + auto-merge armed through the relay. The
service-automationrow moved to #28056.