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
Notify recipients editor: no row for the { emailField } form, and the Record field row over an email-typed field is now refused at run time on an email node unless a user holds the address #25900
Filing gate ③, a downstream consequence of a landed objectstack change: the ## Contract review of #25739 (6395784809, flag F6) escalated it because neither the dev nor the seat had filed a carrier. Filed by the objectstack domain:spec seat 2 (seat post #18549) · sunhaolin · session session_01PC4NPXPgPmpDRG9DdDnyXT. ⛔ Not a claim. Grade and routing are objectui triage's.
There is no row for { emailField }, the form built for exactly this case (an applicant who is not a user). An author who wants it must hand-edit the flow.
The Email address row stores an author constant and is unaffected.
What would change
Add an Email field row: pick an email-typed field of the trigger object, store { emailField: 'FIELD' } as the whole value, and require or set channels: 'email'.
On the Record field row, steer an email-typed field to the Email field row. Alternatively, say inline that on an email node the address must belong to a user.
Dedupe
Searched repo:objectstack-ai/objectui FlowRecipientsField record field email recipient emailField picker: one hit, objectstack-ai/objectui#13152 (closed, the __search field in pickers), which is unrelated. New.
p2: the Studio editor offers a recipient combination that a server at or past objectstack d1e329e96d refuses at run time, and it has no row for the form built for that case.
Transferred 2026-10-26T03:06Z from objectstack-ai/objectui#13509, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the ui/ workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.
Paths. Read every repository path in the body with a ui/ prefix: packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.tsx is now ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.tsx.
References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#13152.
Claim: PM loop round 1
Session: session_017iXjUm1rujwDk7f3KT1Pkk (seat); implementing card thread session_01VrsYtPiyNCyFG3fUsVvNEQ
Account: os-steve
Branch: claude/project-thread-05x6gm (platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record. Wording amended by the seat: an issue-shaped placeholder here was read by the Closing-Target Claim Guard as a second claimed branch)
Worktree: the card thread's own container
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.tsx, FlowReferenceField.tsx (optional field-type filter), FlowNodeConfigField.tsx (~649, channels plumbing), ui/packages/app-shell/src/views/metadata-admin/i18n.ts (en + zh rows); tests. packages/spec and service-automation read-only (stop on breach; explain in the report). ⛔ ui/.github/** and the root .github/workflows/ci.yml are out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root .changeset/.
Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no (the editor writes { emailField }, a form the spec already accepts)
Metadata-protocol: none
Responsibility: n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public Console
Thread-read: 6407308420
Premise: holds (read-only premise check at origin/main, 2026-10-26T07:06Z; spot-checked by the seat)
Serial constraints cleared: none: no open PR touches these files (open-PR file scan 2026-10-26T06:33Z; #25903 is in metadata-admin/inspectors/ but only DatasetDefaultInspector*); no in-flight domain:ui claim on them
Dispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.
Claim amendment · domain:ui#1 · session_017iXjUm1rujwDk7f3KT1Pkk · 2026-10-26T07:08Z · amends the claim 6410289508 (append-only; its other lines stand)
File surface, added on the card thread's request:ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.tsx (setField). Reason given by the dev: FlowNodeConfigField only forwards a value, and setField patches exactly one path from the node it closed over, so writing channels: ['email'] beside { emailField } atomically needs an optional sibling write there; two sequential setField calls would race on the stale node and drop one key. Same defect, no other claim holds the file (open-PR scan at claim time).
{
"issue": 25900,
"status": "done",
"branch": "claude/project-thread-05x6gm",
"pr": "https://github.com/objectstack-ai/objectstack/pull/25996",
"session": "session_01VrsYtPiyNCyFG3fUsVvNEQ",
"premise_still_valid": true,
"summary": "All three PM hypotheses held at origin/main 0c372288: a stored recipients { emailField } read as [] and the first edit replaced it; the Record field row had no field-type filter; the spec needs channels email alone. FlowRecipientsField now reads/writes { emailField } as an Email field row (whole value only: offered only as the sole row, Add disabled beside it), suggests only email-typed trigger fields, and the first commit of it writes channels [email] in the same patch unless the node already names email alone (stored-wrong-channels note + one-click fix). On email-sending nodes the Record field picker drops email-typed fields and a stored one shows a must-belong-to-a-user note. Channels plumbing: FlowNodeConfigField onCommit(value, alongside) and FlowNodeInspector setField applies alongside to the same node before the one patch (file-surface addition FlowNodeInspector.tsx declared to the seat).",
"tests": "New FlowRecipientsField.emailField-25900.test.tsx (11). Pre-fix: 10 failed / 1 passed (data-loss pins: expected [] to deeply equal [ { kind: emailField } ], expected null not to be null). Post-fix at e25d3a6e: FlowRecipientsField* 2 files 28/28; ui/packages/app-shell/src/views/metadata-admin/ 597 files, 6561 passed, 1 skipped (lock VERDICT command-exit 0). Ablation on committed fix via scripts/ablation-replace.mjs (src resolved through the vitest alias, no dist): drop the emailField arm of the readRecipients filter -> mutation landed anchor 1->0, exactly the 5 stored-value tests red (6/11 pass), restored blob == HEAD, git diff HEAD empty. pnpm --filter @object-ui/app-shell run type-check: exit 0 (lock VERDICT 0); tsconfig.test.json --listFilesOnly lists the new test file. eslint on touched files: 0 errors.",
"gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at e25d3a6e: 34 derived, all exit 0 (check:type-check-debt first exit 3 = queue-timeout NOT MEASURED, re-run under the lock: OK, re-measure none above recorded). --ran with per-line exit codes: 34 derived, 34 run, 0 NOT-MEASURED (derived zero). CI families (Type Check UI, Lint UI, Build and E2E UI, Test Core, Lint and Repo Gates): in_progress at report time, not re-run locally.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "5 — mcp__github__issue_read x5 (get x2, get_comments x3); no MCP write tool",
"api_writes": "2 relay strokes — fleet-write pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/25996/assignees os-steve; read-back 5605 bytes identical), and this os-dev-report comment via post-stamped (POST /issues/25900/comments). git push is not counted.",
"deviations": [
"Card-thread branch claude/project-thread-05x6gm (platform-assigned; Claim names it), worktree created by detaching the primary checkout and adding ../objectstack-issue-25900 on that branch.",
"File surface +1: ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.tsx (setField alongside), declared to the seat before editing.",
"Commit trailers are the AGENTS.md model-free pair, not the harness model-named Co-Authored-By."
],
"files_changed": [
".changeset/25900-notify-recipients-email-field-row.md",
"ui/packages/app-shell/src/views/metadata-admin/i18n.ts",
"ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeConfigField.tsx",
"ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.tsx",
"ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.emailField-25900.test.tsx",
"ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.tsx",
"ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowReferenceField.tsx"
],
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: public door — Studio flow editor, notify node Channels field: a stored channels: email (string spelling, which NotifyConfigSchema accepts) draws as an empty list, and adding inbox commits [inbox], silently dropping email · evidence: FlowStringListField reads a non-array value as [] (probe test, rendered with value email: no email input, one textbox after Add, last commit [inbox]; probe deleted) · Seam: spec:NotifyConfigSchema.channels (string | string[]) → renderer:FlowStringListField · dedupe words: channels stringList string, FlowStringListField string value, notify channels editor empty",
"class: note · four new react-refresh/only-export-components lint warnings from new helper exports, same pattern as existing exports in these files · carrier: 承接者:无 — Acceptance notes only"
]
}
Seat: PR #25996 ACCEPT (2026-10-26T08:35Z), checks green on head e25d3a6e; ready + auto-merge requested. The report's out-of-scope finding is filed as #25999.
Activity
objectstack-fleet commentedon Oct 25, 2026
Triage: first grade —
bug·priority:p2·domain:ui·area:workflow·pm:queue(corrected) · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-25T10:53Z⛔ Not a claim, ⛔ not a dispatch.
d1e329e96drefuses at run time, and it has no row for the form built for that case.main's.objectstack-shais5874d25302, and objectstack's compare fromd1e329e96dto it readsahead. So the pin already carries feat(spec,lint): a notify recipient form{ emailField }— the address in an email-typed field of the triggering record #25645 (6021b5e837) and feat(service-automation)!: notify mails an email-field recipient, limited per address, and refuses a computed address no user holds #25721 (d1e329e96d). This seat first read a stale pin and held the card by mistake; it ispm:queue.{ emailField }row, and stop offering the Record-field CEL row on an email node (or warn on it).Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Transferred 2026-10-26T03:06Z from objectstack-ai/objectui#13509, with its comments and timeline; the old URL redirects here. objectui moved into this repository as the
ui/workspace (epic #25677) and is being archived (#25854). The body is left exactly as filed.Paths. Read every repository path in the body with a
ui/prefix:packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.tsxis nowui/packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.tsx.References. The bare issue numbers in the body were written in objectui and now resolve against this repository by mistake; read them as objectstack-ai/objectui#13152.
No stale
pm:dispatchedor assignee to strip.Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1
Session:
session_017iXjUm1rujwDk7f3KT1Pkk(seat); implementing card threadsession_01VrsYtPiyNCyFG3fUsVvNEQAccount:
os-steveBranch:
claude/project-thread-05x6gm(platform-assigned card-thread branch; a card thread can push only its assigned branch, and the name carries no issue number, so this claim is the identity record. Wording amended by the seat: an issue-shaped placeholder here was read by the Closing-Target Claim Guard as a second claimed branch)Worktree: the card thread's own container
Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.tsx,FlowReferenceField.tsx(optional field-type filter),FlowNodeConfigField.tsx(~649, channels plumbing),ui/packages/app-shell/src/views/metadata-admin/i18n.ts(en + zh rows); tests.packages/specandservice-automationread-only (stop on breach; explain in the report). ⛔ui/.github/**and the root.github/workflows/ci.ymlare out of bounds (maintainer's word, ui-merge epic in flight). Changeset in the root.changeset/.Container & model:
M,mode:thread,model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no (the editor writes
{ emailField }, a form the spec already accepts)Metadata-protocol: none
Responsibility:
n/a: renderer defect in ui/, the producing code is the cited ui file; no platform path covers it; reached through the public ConsoleThread-read: 6407308420
Premise: holds (read-only premise check at
origin/main, 2026-10-26T07:06Z; spot-checked by the seat)Serial constraints cleared: none: no open PR touches these files (open-PR file scan 2026-10-26T06:33Z; #25903 is in
metadata-admin/inspectors/but onlyDatasetDefaultInspector*); no in-flightdomain:uiclaim on themDispatch order handed to the card thread by the project coordinator (three partitions: ruling / mechanism hypotheses / suggested route); the dev does not claim, and starts only once this claim names its branch.
objectstack-fleet commentedon Oct 26, 2026
Claim amendment ·
domain:ui#1·session_017iXjUm1rujwDk7f3KT1Pkk· 2026-10-26T07:08Z · amends the claim6410289508(append-only; its other lines stand)File surface, added on the card thread's request:
ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.tsx(setField). Reason given by the dev:FlowNodeConfigFieldonly forwards a value, andsetFieldpatches exactly one path from the node it closed over, so writingchannels: ['email']beside{ emailField }atomically needs an optional sibling write there; two sequentialsetFieldcalls would race on the stale node and drop one key. Same defect, no other claim holds the file (open-PR scan at claim time).objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 25900, "status": "done", "branch": "claude/project-thread-05x6gm", "pr": "https://github.com/objectstack-ai/objectstack/pull/25996", "session": "session_01VrsYtPiyNCyFG3fUsVvNEQ", "premise_still_valid": true, "summary": "All three PM hypotheses held at origin/main 0c372288: a stored recipients { emailField } read as [] and the first edit replaced it; the Record field row had no field-type filter; the spec needs channels email alone. FlowRecipientsField now reads/writes { emailField } as an Email field row (whole value only: offered only as the sole row, Add disabled beside it), suggests only email-typed trigger fields, and the first commit of it writes channels [email] in the same patch unless the node already names email alone (stored-wrong-channels note + one-click fix). On email-sending nodes the Record field picker drops email-typed fields and a stored one shows a must-belong-to-a-user note. Channels plumbing: FlowNodeConfigField onCommit(value, alongside) and FlowNodeInspector setField applies alongside to the same node before the one patch (file-surface addition FlowNodeInspector.tsx declared to the seat).", "tests": "New FlowRecipientsField.emailField-25900.test.tsx (11). Pre-fix: 10 failed / 1 passed (data-loss pins: expected [] to deeply equal [ { kind: emailField } ], expected null not to be null). Post-fix at e25d3a6e: FlowRecipientsField* 2 files 28/28; ui/packages/app-shell/src/views/metadata-admin/ 597 files, 6561 passed, 1 skipped (lock VERDICT command-exit 0). Ablation on committed fix via scripts/ablation-replace.mjs (src resolved through the vitest alias, no dist): drop the emailField arm of the readRecipients filter -> mutation landed anchor 1->0, exactly the 5 stored-value tests red (6/11 pass), restored blob == HEAD, git diff HEAD empty. pnpm --filter @object-ui/app-shell run type-check: exit 0 (lock VERDICT 0); tsconfig.test.json --listFilesOnly lists the new test file. eslint on touched files: 0 errors.", "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack at e25d3a6e: 34 derived, all exit 0 (check:type-check-debt first exit 3 = queue-timeout NOT MEASURED, re-run under the lock: OK, re-measure none above recorded). --ran with per-line exit codes: 34 derived, 34 run, 0 NOT-MEASURED (derived zero). CI families (Type Check UI, Lint UI, Build and E2E UI, Test Core, Lint and Repo Gates): in_progress at report time, not re-run locally.", "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm", "mcp_calls": "5 — mcp__github__issue_read x5 (get x2, get_comments x3); no MCP write tool", "api_writes": "2 relay strokes — fleet-write pr_create (POST /repos/objectstack-ai/objectstack/pulls draft + POST /issues/25996/assignees os-steve; read-back 5605 bytes identical), and this os-dev-report comment via post-stamped (POST /issues/25900/comments). git push is not counted.", "deviations": [ "Card-thread branch claude/project-thread-05x6gm (platform-assigned; Claim names it), worktree created by detaching the primary checkout and adding ../objectstack-issue-25900 on that branch.", "File surface +1: ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.tsx (setField alongside), declared to the seat before editing.", "Commit trailers are the AGENTS.md model-free pair, not the harness model-named Co-Authored-By." ], "files_changed": [ ".changeset/25900-notify-recipients-email-field-row.md", "ui/packages/app-shell/src/views/metadata-admin/i18n.ts", "ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeConfigField.tsx", "ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowNodeInspector.tsx", "ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.emailField-25900.test.tsx", "ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.tsx", "ui/packages/app-shell/src/views/metadata-admin/inspectors/FlowReferenceField.tsx" ], "open_questions": [], "out_of_scope_findings": [ "class: a · reach: public door — Studio flow editor, notify node Channels field: a stored channels: email (string spelling, which NotifyConfigSchema accepts) draws as an empty list, and adding inbox commits [inbox], silently dropping email · evidence: FlowStringListField reads a non-array value as [] (probe test, rendered with value email: no email input, one textbox after Add, last commit [inbox]; probe deleted) · Seam: spec:NotifyConfigSchema.channels (string | string[]) → renderer:FlowStringListField · dedupe words: channels stringList string, FlowStringListField string value, notify channels editor empty", "class: note · four new react-refresh/only-export-components lint warnings from new helper exports, same pattern as existing exports in these files · carrier: 承接者:无 — Acceptance notes only" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Seat: PR #25996 ACCEPT (2026-10-26T08:35Z), checks green on head
e25d3a6e; ready + auto-merge requested. The report's out-of-scope finding is filed as #25999.