Skip to content

Tell the comment author who will not be notified: the discussion composer reads withheldMentions #28218

Closed

Description

@objectstack-fleet

domain:spec#2 · os-tesla · session_01L9qibx5r5nhDMwpRs4SL6D

Filing gate: ① maintainer ruling 6523848208 (#27703, letter A, 「27703 同意」 2026-10-30T13:21Z): "The ui half … follows as its own domain:ui card once the key is on main." The key landed in PR #28174 (7811c3f6). ⛔ Not a claim. Triage sets the lane and grade.
Reach: any record discussion where the author @-mentions a colleague who cannot read the record. The server now withholds that notification and tells the author's own request which ids were withheld; the console says nothing, so the author still believes the colleague was told.
Reader who acts: domain:ui (app-shell record page discussion, plugin-detail composer).

Observed (on main at 7811c3f6)

  • CreateDataResponseSchema / UpdateDataResponseSchema carry withheldMentions?: string[] (ids only, no reason, author's own request only, never stored); @objectstack/client mirrors it.
  • ui/packages/app-shell/src/views/RecordDetailView.tsx writes comments through three callbacks (dataSource.create('sys_comment', …) ≈L2980 and ≈L3020, .update('sys_comment', …) ≈L3374) and reads nothing from the answer.
  • Mention chips are drawn by ui/packages/plugin-detail/src/RichTextCommentInput.tsx.

Wanted (as ruled)

  • The three write callbacks read withheldMentions, map the ids to names through the mention picker's suggestions, and say in one sentence who will not be notified (no reason; the ruling's disclosure is one bit per named user). Test plus ablation.
  • Mention chips in RichTextCommentInput.tsx per the ruling.
  • ⛔ Not taken by the ruling: a picker-time readability read (B), so no new endpoint and no probe of colleagues' access.

Dedupe words: withheld mentions notice, mention not notified, comment mention gate toast, withheldMentions console.

Links back: #27703, PR #28174, ruling 6523848208.

Activity

  1. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: 真挡得住的权限 | none | P②

    Triage: p2 · domain:ui · area:records · pm:queue · 2026-10-30T18:12Z

    ⛔ Not a claim.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim: PM loop round 4 · 2026-10-30T19:40Z
    Session: session_01L9qibzC6RxMfB59EsgAoNN (seat; implementation by card thread session session_01L9qibvjxjPWDhWVKzkEU2x, mode:thread)
    Account: os-tesla (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-c68o40 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-28218
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: ui/packages/app-shell/src/views/RecordDetailView.tsx (the three sys_comment write callbacks plus one helper), ui/packages/plugin-detail/src/RichTextCommentInput.tsx (mention chips), ui/packages/data-objectstack/src/** only if the adapter strips the write answer, i18n packs, tests, root changeset (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the author-side notice that a mentioned user won't be notified. This is the console half of ruling A on #27703 (6523848208); the server half landed in PR #28174 7811c3f6
    Thread-read: 6530136006
    Premise: holds (triage 6530136006: p2 domain:ui, "Scope is as ruled"; withheldMentions is on CreateDataResponseSchema / UpdateDataResponseSchema on origin/main)
    Serial constraints cleared: partly. Open PR #28116 (seat 2, needs-user-decision, out of the queue) touches RecordDetailView.tsx and RichTextCommentInput.tsx, and open PR #27713 touches RecordDetailView.tsx and data-objectstack/src/index.ts. Edits stay narrow, and whichever lands first is merged in. domain:ui#2 is off duty.

    Clause-② is the seat's expectation: the dev measures it on the diff, and the seat amends the claim if it moves. Order: /mnt/project-files/ui-seat-1/r2026-10-30/dispatch-28218.md under FRAME.md.

  3. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibvjxjPWDhWVKzkEU2x

    os-dev-report

    {
      "issue": 28218,
      "status": "done",
      "branch": "claude/project-thread-c68o40",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/28261",
      "session": "session_01L9qibvjxjPWDhWVKzkEU2x (card thread; seat session_01L9qibzC6RxMfB59EsgAoNN)",
      "premise_still_valid": true,
      "summary": "Measured: ObjectStackAdapter.create/update resolved result.record and dropped withheldMentions, so the adapter is the producer fixed. Both take an optional per-call opts.onMentionsWithheld(ids) (update beside ifMatch); the resolved value is unchanged for every caller and a throwing listener cannot fail a stored write. RecordDetailView's three sys_comment writes (comment, reply, edit) pass one helper, tellMentionsWithheld, which maps ids to names through the picker suggestions and raises one toast.warning (detail.mentionsWithheld, no reason, ten packs). RichTextCommentInput draws picked mentions as a labelled chip row under the editor and as chips in the preview (detail.mentionedPeople, ten packs). Live on stock showcase: create and update answers carry withheldMentions for a non-member mention, and the real adapter's listener heard the id.",
      "tests": "head fcdb4c48. New: data-objectstack withheldMentions-28218 (4), app-shell RecordDetailView.withheldMentions-28218 (5, real RecordDetailView + en pack), plugin-detail RichTextCommentInput.mentionChips-28218 (5); 3 existing call-shape assertions updated (commentWriteFailure-10899 x2, feedRecordScope). Locked run: vitest data-objectstack + plugin-detail + 29 app-shell/console files naming sys_comment/mentionSuggestions/RichTextCommentInput/extractMentions + new file + defaults-maps-mirror-en-pack: VERDICT command-exit 0, Test Files 473 passed 1 skipped, Tests 4547 passed 18 skipped. i18n package + mirror: 93 files passed. type-check data-objectstack, plugin-detail, app-shell exit 0. Ablations via ablation-replace.mjs: comment write without the listener -> record-page file 2 failed/3 passed, restored blob 6cf08c0a = HEAD; adapter helper not calling the listener -> adapter file 3 failed/1 passed (control green), restored blob 20fba8d2 = HEAD.",
      "gates": "dispatch-gates --commands at fcdb4c48: 35 derived, 35 run, all exit 0 (check-sdui-manifest + --self-test, check:type-check-debt, ui vitest scripts/ 169 files passed included); --ran reconcile 35/35, 0 NOT-MEASURED, 0 UNRUN, exit 0. Outside the derivation: ui check:i18n-keys exit 0, check:i18n-drift exit 0, check:new-line-citations exit 0 (0 new), eslint on 19 changed ts/tsx 0 errors, full turbo build 116/116 exit 0. CI check-runs on PR 28261: in_progress at report time.",
      "line_budget": "+668 / -20, 21 files, under the 3000 human-merge threshold",
      "files_changed": [
        ".changeset/28218-withheld-mentions-console.md",
        "ui/packages/app-shell/src/views/RecordDetailView.commentWriteFailure-10899.test.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.feedRecordScope.test.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.tsx",
        "ui/packages/app-shell/src/views/RecordDetailView.withheldMentions-28218.test.tsx",
        "ui/packages/data-objectstack/README.md",
        "ui/packages/data-objectstack/src/index.ts",
        "ui/packages/data-objectstack/src/withheldMentions-28218.test.ts",
        "ui/packages/i18n/src/locales/ar.ts",
        "ui/packages/i18n/src/locales/de.ts",
        "ui/packages/i18n/src/locales/en.ts",
        "ui/packages/i18n/src/locales/es.ts",
        "ui/packages/i18n/src/locales/fr.ts",
        "ui/packages/i18n/src/locales/ja.ts",
        "ui/packages/i18n/src/locales/ko.ts",
        "ui/packages/i18n/src/locales/pt.ts",
        "ui/packages/i18n/src/locales/ru.ts",
        "ui/packages/i18n/src/locales/zh.ts",
        "ui/packages/plugin-detail/src/RichTextCommentInput.tsx",
        "ui/packages/plugin-detail/src/__tests__/RichTextCommentInput.mentionChips-28218.test.tsx",
        "ui/packages/plugin-detail/src/useDetailTranslation.ts"
      ],
      "deviations": "Two files outside the order's surface: plugin-detail/src/useDetailTranslation.ts (one defaults-map row, required by the defaults-mirror test beside the pack key) and ui/packages/data-objectstack/README.md (method list, ui/AGENTS.md #2). Clause-2 declared yes (widening) rather than the expected no: a published adapter method gains an optional parameter. The primary checkout was detached to host the designated branch in worktree objectstack-issue-28218. Serial constraint: neither 28116 nor 27713 has landed; branch on main 86cf7cef, merge-tree with origin/main (6 commits ahead) clean, no merge pushed.",
      "dogfood_battery": "n/a: no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "4: issue_read get x1, issue_read get_comments x1, pull_request_read get x2 (28116, 27713); no write tool",
      "api_writes": "2: pr_create via fleet-write relay (run 41125022807, read-back identical 12590 bytes); this comment via post-stamped",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none. Noted, not filed: a posted comment's body in the record feed still renders a mention as plain text; the ruling names chips in the composer only, and the feed renderer is outside this card's surface."
      ]
    }
  4. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Claim amendment · 2026-10-30T20:44Z · amends claim 6531972369 after the card thread's os-dev-report 6533064566. Append-only.

    Clause-②: yes (widening: @object-ui/data-objectstack ObjectStackAdapter.create gains an optional third parameter opts.onMentionsWithheld, and .update's existing opts gains the same optional member; both still resolve the record, no export, key or route added)

    The claim's Clause-②: no was the seat's expectation, and the dev's measurement on PR #28261 replaces it. The widening puts a contract face on the PR, so it goes to the contract-review lane before the seat lands it. The file surface grew by two small files outside the order's list (ui/packages/plugin-detail/src/useDetailTranslation.ts, one defaults row the mirror test requires, and ui/packages/data-objectstack/README.md, the method list), which the seat accepts.

    Seat read on head fcdb4c48, no blockers so far: the Console's record pages get the raw ObjectStackAdapter from AdapterProvider (no wrapper that would drop the third argument), RecordDetailView's dataSource is untyped so the shared DataSource interface does not move, and the preview escapes the text before any chip markup. ACCEPT follows the lane's PASS on a green head.

  5. objectstack-fleet commented on Oct 30, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#1 · os-tesla · session_01L9qibzC6RxMfB59EsgAoNN

    Landed · 2026-10-30T21:26Z · PR #28261 (seat ACCEPT 6533501608 pinned to fcdb4c48, contract-review PASS 6533483380).

    reading value
    PR merged 2026-10-30T21:25:54Z as be646ede through the merge queue, first pass
    origin/main content notifyWithheldMentions is in ui/packages/data-objectstack/src/index.ts, and detail.mentionsWithheld is in ui/packages/i18n/src/locales/en.ts and the other nine packs

    State: the card closes as completed by Fixes #28218, and pm:dispatched comes off in the same stroke as this note. With the server half (#28174) already on main, this completes the console half of ruling A on #27703. Nothing remains on this card. The review's two non-blocking should-fixes are left as written, for the reasons in the ACCEPT.

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

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:uienhancementNew feature or requestpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions