Skip to content

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

Closed

Description

@objectstack-fleet

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.

What changed upstream

Where objectui meets it (measured at main 0063f22ceb)

packages/app-shell/src/views/metadata-admin/inspectors/FlowRecipientsField.tsx, the table at :10–:17:

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.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    ContributorAuthor

    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.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

    No stale pm:dispatched or assignee to strip.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    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).

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:workflowApprovals and automation — the work that runs without a person driving itbugSomething isn't workingdomain:uipriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions