Repository navigation
fix(service-messaging,mcp): the inbox list hides the raw topic; an MCP argument refusal ends at the fix - #30688
Conversation
…tification topic Claude-Session: https://claude.ai/code/session_016WV4cxrNurGFU9PsE6NwNT Co-authored-by: Claude <noreply@anthropic.com>
…n why the key used to be dropped Claude-Session: https://claude.ai/code/session_016WV4cxrNurGFU9PsE6NwNT Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4cxrNurGFU9PsE6NwNT Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 2 package(s): 16 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 2 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 15 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 7a52005dbf0a32cd7bbfe0757a31b7fa25636201 && git checkout 7a52005dbf0a32cd7bbfe0757a31b7fa25636201
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin a2437b560bd8872feece6ec8b57c6fdf21cff1f4 3a5b38d6a0dfa3a9bf51148abe2e3cc13d950288 && git checkout -B drift-repro a2437b560bd8872feece6ec8b57c6fdf21cff1f4 && git merge --no-ff 3a5b38d6a0dfa3a9bf51148abe2e3cc13d950288
node scripts/docs-audit/affected-docs.mjs --json a2437b560bd8872feece6ec8b57c6fdf21cff1f4
|
|
domain:server#4 · os-elon-musk · session_016WV4czvZykUqhYxYXSSDt4 维护者速读
席位意见:ACCEPT(#30126 第 8、15 行, 席位核对Head-sha:
|
Requested by Elon · project thread
domain:server#4 · os-elon-musk · session_016WV4cxrNurGFU9PsE6NwNT
Part of #30126 (rows 8 and 15 land here; rows 9, 12, 13 and 16 stay on the card, see Acceptance notes)
Clause-②: no
Metadata-protocol: none
维护者速读
notify这类原始主题 id(只剩标题、级别、时间);MCP 工具收到没声明的参数时,报错只说错在哪、该怎么写,不再追加一句给内部开发者看的历史说明。notify,读者看不懂;MCP 报错末尾「This argument used to be dropped silently…」对调用方没有用,只是噪音。topic字段本身没动,仍可搜索、可被其他视图使用;MCP 照旧拒收每个未声明参数,只是少了最后一句。回滚即撤本 PR。packages/mcp/src/mcp-http-tools.ts的withoutHistorySentence与strictToolInput;packages/services/service-messaging/src/objects/inbox-message.object.ts的mine视图columns。pnpm --filter @objectstack/mcp exec vitest run src/mcp-http-tools.unknown-argument-keys.test.ts,预期 13 条全绿;另有pnpm --filter @objectstack/service-messaging exec vitest run src/objects/inbox-message-mine-view.test.ts2 条全绿。What changes
@objectstack/service-messaging.sys_inbox_message'sminelist view (a person's own notifications) projected['title', 'topic', 'severity', 'created_at'].topicis the producer's machine id (notifyfrom a flow's notify node,collab.mentionfrom a mention) and no catalog labels it, so the column readnotify. The view now projects['title', 'severity', 'created_at']. The card's suggestion was "hide it or give it a label"; there is nothing to label it from, so it is hidden. Thetopicfield is unchanged and stillsearchable.@objectstack/mcp. Every MCP tool closes its argument shape withstrictUnknownKeyError(@objectstack/spec/shared), which ends each message with the surface'shistorysentence. The MCP tools passedUNKNOWN_ARG_HISTORY("This argument used to be dropped silently and the call still succeeded, …"). They now pass an empty history through a small wrapper,withoutHistorySentence, which trims the separator the factory leaves, so the message ends at its last fix channel. The explanation of the posture stays in the file's comments.packages/specis not touched: the factory is unchanged for every authorable schema.Tests
packages/services/service-messaging/src/objects/inbox-message-mine-view.test.ts(new, 2): themineview's columns are exactly title, severity, time;topicstays a searchable field.packages/mcp/src/mcp-http-tools.unknown-argument-keys.test.ts(new top-leveldescribein the existing harness, 2): the reportedsortcall is refused with`sort` → `orderBy`and no history sentence; over every advertised tool, no refusal carries the sentence or ends in whitespace.scripts/ablation-replace.mjs, each restored withgit diff HEADempty: the old history sentence put back → 2 failed of 13 in the MCP file;topicput back in the view → 1 failed of 2. Both test files importsrc.@objectstack/mcpfull suite: 56 files, 680 passed.@objectstack/service-messagingfull suite: 67 files, 847 passed.typecheckfor both: exit 0.Acceptance notes
needs_decision. The delivery chain is the maintainer's ruling quoted inrecipient-locale.ts(「解析链 = 收件人locale→ 部署默认」), which also lists a request-scoped locale as deliberately not in the chain. Since the card was filed, PR fix(console): save a language picked on the sign-in page as the person's own when they have none #30539 and PR fix(console): save a language picked on the register page as the new person's own when they have none #30597 save a language picked on the sign-in and register pages as the person's own when they have none. Whether a person who never picks a language should get one stamped, or whether a "last used" rung should join the chain, is a product choice; the options go to the maintainer through the seat.packages/rest/src/meta-item-read-gate.tswith open PR fix(objectql,rest)!: serve an object an extension renames without the base's plural (#30391) #30459, which is still waiting on the maintainer, so per the claim's serial constraint it is left for after that lands.os package export-u/-tvsos package install-r/--email/--password): not built,needs_decision. About twenty commands use-u/--url+-t/--token;installuses-r/--runtimewith a session sign-in, andpublishuses-s/--server. One way to name them means renaming a published option (breaking; this repo keeps no alias window) and, forinstall, choosing which credential kinds it takes. Options go to the maintainer.list_actionslists admin-only identity actions to a plain member): not built,needs_decision. The listing is inpackages/runtime/src/domains/mcp.ts, outside the claimedpackages/mcp/src/**. The actions' admin gate lives only in each target's own mount (/api/v1/auth/admin/*,plugin-auth'sjudgePlatformAdmin, and different gates for SSO and manager doors) and in a display-onlyvisiblepredicate; no key the action door reads states it. Hiding or marking them means either a declared gate on the actions or a second copy of the targets' predicates in the runtime, and the two precedents (actionPermissionErrorhides, the runtime(mcp): an OAuth-token agent's api action forward carries a bearer the target door does not accept (acceptOAuthAccessToken matches /mcp paths only), so the target likely resolves the caller as anonymous #28178 / MCP list_actions offers sys_api_key.revoke_api_key as runnable to an API-key caller, and run_action then refuses it 403 #28943 credential table marksunavailable) point different ways. Every refusal is unchanged.invite_userappearing four times is four objects each declaring it, whichrun_action'sobjectNamedisambiguates.Verification
Derived gates and suites
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat18552efc(5 paths vs merge baseb77c160a): 63 commands, each run with its exit code captured before any pipe. 60 exit 0 on the first pass; three exit 3 (prerequisite):node scripts/check-plugin-teardown-shape.mjs --self-test: exit 0 after fetching its pinned fixture commit621a4876(48 cases).pnpm check:i18n: exit 0 after its own named prerequisite build (CLI + the ten extract packages): "all bundles in sync, no undeclared authoring keys".pnpm check:dual-build-cjs-loads: NOT MEASURED locally (needs a whole-workspace build); CI's Lint & Repo Gates runs it.dispatch-gates --ran: 63 derived, 62 run, 1 NOT-MEASURED (the one above), 0 UNRUN, exit 0. Changed lines: 126 (+107 / -19, 5 files).pnpm --filter @objectstack/mcp typecheck,pnpm --filter @objectstack/service-messaging typecheck: exit 0 (after a full build of both closures).@objectstack/mcp56 files / 680 tests passed;@objectstack/service-messaging67 files / 847 tests passed.origin/main(a2437b56) before opening; the incoming commits touch neither package, so nothing was re-run. Final head3a5b38d6. CI check-runs: not read at the time of writing.Generated by Claude Code