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
service-messaging: sys_notification_delivery.display_title names the recipient by raw id (channel → recipient_id), the shape #24895 retired for preferences (ruling A item 5) #25194
Filing gate ③: ruling A on #24895 (6304380498, the maintainer's 「#380 同意」), item 5, verbatim: "Not this card:sys_notification_delivery.display_title (channel → recipient_id) has the same shape; the seat files it as its own card." Filed by domain:services seat 2 (seat post #21118) at #24895's landing. ⛔ Not a claim.
Reader who acts: the domain:services seat, in service-messaging (objects/ and the delivery object's display-title formula).
What: the delivery record's display title reads channel → recipient_id, showing a raw user id where #24895 (PR #25178) made the preference title name the person, one hop through a sys_user reference (name, else email). The fix mirrors PR #25178's title shape for the delivery object. Whether recipient_id should itself become a sys_user reference (it can also address non-user recipients) is this card's first measurement.
Claim: card thread · domain:services seat 1 (seat post #6021, project run by the Sales account) · p3 · M · 2026-10-22T16:56Z
Session: session_01WNppskqdULWrMoXfU9sgo1
Account: os-sales (the seat's linked user; the card's assignee)
Branch: claude/project-thread-m0hnco (the harness-pinned branch for this session; it names no issue, so the Duplicate Fix Guard's branch-name hint will not match — this claim is the identity record)
Worktree: the session's own container checkout (one task per container)
Domain: domain:services
Seat: domain:services#1 (seat post #6021)
File surface (read on origin/main6bc8cc6a7; stop on a breach and explain it in the report): packages/services/service-messaging/src/ — objects/notification-delivery.object.ts (the title formula and one new optional sys_user reference beside recipient_id), the enqueue path that stamps it (messaging-service.tsenqueueDeliveries, outbox.tsEnqueueDeliveryInput / NotificationDeliveryRecord, sql-outbox.ts, memory-outbox.ts), objects/notification-display-title.test.ts and a new integration test, the package's translations/*.generated.ts (regenerated, retranslated leaves); one patch changeset for @objectstack/service-messaging. ⛔ Not packages/spec, packages/objectql, platform-objects, or the notification-template files PR #25258 holds.
Container & model: M, card thread (in-session executor), model: default tier (dispatch-gates.mjs --tier: "no path-derived mandate"), effort: high
Clause-②: yes (widening)
Metadata-protocol: none
Basis for the Clause-② line: the delivery object's read shape gains one optional field (get / list are its only API methods); nothing is refused and no author-writable key changes.
Responsibility: service-messaging's own title formula on sys_notification_delivery names the recipient by raw id | no platform path names the person today | every reader of the Notification Deliveries list and record page
Thread-read: none
Serial constraints cleared: of the open PRs, only #25258 (#25082's notification half) touches service-messaging, and its files (the template object, the placement judge, messaging-service-plugin.ts, template-renderer.ts) are disjoint from this surface. #25190 (retiring renderNotification) is not in flight.
First measurement (the card's question): recipient_id should NOT become a sys_user reference. It holds more than user ids, by design:
RecipientResolver.resolveEmail keeps an email verbatim when no user holds it (recipient-resolver.tsresolveEmail), and a bare spec that is not a user id passes through verbatim (resolveOne, the last branch);
the email channel sends to an email-shaped recipient directly (email-channel.tsresolveRecipient, the EMAIL_SHAPE branch), and the SMS channel texts a literal number directly (sms-channel.tsresolveRecipient, the PHONE_SHAPE branch).
The outbox writes under the system context (OUTBOX_SYSTEM_CONTEXT, isSystem: true), which skips the engine's reference check, so a lookup column would store those addresses as dangling references. The title therefore names the person through a separate optional reference, recipient_user_id (sys_user, set when the recipient is a user's id, empty for an address), and falls back to the address itself: name, else email, else recipient_id — the shape PR #25178 gave the preference title.
os-dev-report
{
"issue": 25194,
"status": "done",
"branch": "claude/project-thread-m0hnco",
"pr": "#25263",
"session": "session_01WNppskqdULWrMoXfU9sgo1 (card thread of domain:services seat 1)",
"premise_still_valid": true,
"summary": "First measurement: recipient_id should NOT become a sys_user reference. It also holds addresses kept verbatim (an email no user holds, a phone number the SMS channel texts directly), and the outbox writes under the system context, which skips the reference check, so a lookup would store dangling references. The delivery object gains an optional sys_user reference, recipient_user_id, stamped at enqueue from one sys_user read per emit. display_title now reads the user's name, else their email, else the address in recipient_id (the PR #25178 shape). recipient_id is relabelled Recipient. Translations are regenerated and zh-CN is retranslated.",
"tests": "pnpm --filter @objectstack/service-messaging test on 009bbc0: 57 files, 629 tests passed. New delivery-recipient-user.integration.test.ts: 7 tests on a real ObjectQL + SqlDriver with the real sys_user. Ablation via scripts/ablation-replace.mjs: with the stamp replaced by undefined, 3 of the 7 go red (stamp, titles, delete fallback); restored, git diff HEAD empty. Downstream through dist/: service-automation notify-organization-stamp, notify-delivery-outcome and notify-zero-delivery-visibility (24 tests) and plugin-approvals reminder-action-link-at-rest (4 tests) passed. typecheck exit 0; eslint on the changed files exit 0.",
"gates": "dispatch-gates --commands: 69 derived; 68 exit 0. check-plugin-teardown-shape --self-test exited 3 until its pinned fixture commit was fetched, then 0. pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET: unbuilt dists) is NOT MEASURED locally, so CI's run is the reading. --ran reconciliation: 69 accounted, 68 run, 1 NOT MEASURED. check:i18n (messaging) exit 0 and check:i18n-stale-fill exit 0. check:i18n-coverage exit 3 is not derived; CI covers it. PR check-runs: in_progress at report time.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "MCP GitHub reads only: issue_read, search_pull_requests, list_pull_requests, pull_request_read (get_files). No MCP write tool.",
"api_writes": "4 relay strokes as objectstack-fleet[bot]: (1) label-write: labels_add pm:dispatched, labels_remove pm:queue, assign os-sales on #25194; (2) comment: the claim on #25194; (3) pr_create #25263 (draft, assignee os-sales); (4) this stroke: pr_request_reviewers os-sales on #25263, plus this report comment on #25194.",
"deviations": "The harness pins the branch claude/project-thread-m0hnco instead of claude/issue-25194-*; the claim declares this. The work ran in the session's own container checkout, one task per container, not a separate worktree. The PR was not merged with origin/main: the three commits main has gained since the base touch no service-messaging file.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无). Noted, not filed: sys_inbox_message.user_id and sys_notification_receipt.user_id are also text columns labelled Recipient User. Neither is a record title, so neither shows a raw id as a title."
]
}
Activity
objectstack-fleet commentedon Oct 22, 2026
Claim: card thread ·
domain:servicesseat 1 (seat post #6021, project run by the Sales account) · p3 · M · 2026-10-22T16:56ZSession:
session_01WNppskqdULWrMoXfU9sgo1Account:
os-sales(the seat's linked user; the card's assignee)Branch:
claude/project-thread-m0hnco(the harness-pinned branch for this session; it names no issue, so the Duplicate Fix Guard's branch-name hint will not match — this claim is the identity record)Worktree: the session's own container checkout (one task per container)
Domain:
domain:servicesSeat:
domain:services#1(seat post #6021)File surface (read on
origin/main6bc8cc6a7; stop on a breach and explain it in the report):packages/services/service-messaging/src/—objects/notification-delivery.object.ts(the title formula and one new optionalsys_userreference besiderecipient_id), the enqueue path that stamps it (messaging-service.tsenqueueDeliveries,outbox.tsEnqueueDeliveryInput/NotificationDeliveryRecord,sql-outbox.ts,memory-outbox.ts),objects/notification-display-title.test.tsand a new integration test, the package'stranslations/*.generated.ts(regenerated, retranslated leaves); onepatchchangeset for@objectstack/service-messaging. ⛔ Notpackages/spec,packages/objectql,platform-objects, or the notification-template files PR #25258 holds.Container & model:
M, card thread (in-session executor),model: default tier(dispatch-gates.mjs --tier: "no path-derived mandate"),effort: highClause-②: yes (widening)
Metadata-protocol: none
Basis for the Clause-② line: the delivery object's read shape gains one optional field (
get/listare its only API methods); nothing is refused and no author-writable key changes.Responsibility:
service-messaging's own title formula onsys_notification_deliverynames the recipient by raw id | no platform path names the person today | every reader of the Notification Deliveries list and record pageThread-read: none
Serial constraints cleared: of the open PRs, only #25258 (#25082's notification half) touches
service-messaging, and its files (the template object, the placement judge,messaging-service-plugin.ts,template-renderer.ts) are disjoint from this surface. #25190 (retiringrenderNotification) is not in flight.First measurement (the card's question):
recipient_idshould NOT become asys_userreference. It holds more than user ids, by design:RecipientResolver.resolveEmailkeeps an email verbatim when no user holds it (recipient-resolver.tsresolveEmail), and a bare spec that is not a user id passes through verbatim (resolveOne, the last branch);email-channel.tsresolveRecipient, theEMAIL_SHAPEbranch), and the SMS channel texts a literal number directly (sms-channel.tsresolveRecipient, thePHONE_SHAPEbranch).The outbox writes under the system context (
OUTBOX_SYSTEM_CONTEXT,isSystem: true), which skips the engine's reference check, so a lookup column would store those addresses as dangling references. The title therefore names the person through a separate optional reference,recipient_user_id(sys_user, set when the recipient is a user's id, empty for an address), and falls back to the address itself: name, else email, elserecipient_id— the shape PR #25178 gave the preference title.Generated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
os-dev-report
{
"issue": 25194,
"status": "done",
"branch": "claude/project-thread-m0hnco",
"pr": "#25263",
"session": "session_01WNppskqdULWrMoXfU9sgo1 (card thread of domain:services seat 1)",
"premise_still_valid": true,
"summary": "First measurement: recipient_id should NOT become a sys_user reference. It also holds addresses kept verbatim (an email no user holds, a phone number the SMS channel texts directly), and the outbox writes under the system context, which skips the reference check, so a lookup would store dangling references. The delivery object gains an optional sys_user reference, recipient_user_id, stamped at enqueue from one sys_user read per emit. display_title now reads the user's name, else their email, else the address in recipient_id (the PR #25178 shape). recipient_id is relabelled Recipient. Translations are regenerated and zh-CN is retranslated.",
"tests": "pnpm --filter @objectstack/service-messaging test on 009bbc0: 57 files, 629 tests passed. New delivery-recipient-user.integration.test.ts: 7 tests on a real ObjectQL + SqlDriver with the real sys_user. Ablation via scripts/ablation-replace.mjs: with the stamp replaced by undefined, 3 of the 7 go red (stamp, titles, delete fallback); restored, git diff HEAD empty. Downstream through dist/: service-automation notify-organization-stamp, notify-delivery-outcome and notify-zero-delivery-visibility (24 tests) and plugin-approvals reminder-action-link-at-rest (4 tests) passed. typecheck exit 0; eslint on the changed files exit 0.",
"gates": "dispatch-gates --commands: 69 derived; 68 exit 0. check-plugin-teardown-shape --self-test exited 3 until its pinned fixture commit was fetched, then 0. pnpm check:dual-build-cjs-loads exit 3 (PREREQUISITE NOT MET: unbuilt dists) is NOT MEASURED locally, so CI's run is the reading. --ran reconciliation: 69 accounted, 68 run, 1 NOT MEASURED. check:i18n (messaging) exit 0 and check:i18n-stale-fill exit 0. check:i18n-coverage exit 3 is not derived; CI covers it. PR check-runs: in_progress at report time.",
"dogfood_battery": "n/a — no
!in the PR title and no (narrowing) arm","mcp_calls": "MCP GitHub reads only: issue_read, search_pull_requests, list_pull_requests, pull_request_read (get_files). No MCP write tool.",
"api_writes": "4 relay strokes as objectstack-fleet[bot]: (1) label-write: labels_add pm:dispatched, labels_remove pm:queue, assign os-sales on #25194; (2) comment: the claim on #25194; (3) pr_create #25263 (draft, assignee os-sales); (4) this stroke: pr_request_reviewers os-sales on #25263, plus this report comment on #25194.",
"deviations": "The harness pins the branch claude/project-thread-m0hnco instead of claude/issue-25194-*; the claim declares this. The work ran in the session's own container checkout, one task per container, not a separate worktree. The PR was not merged with origin/main: the three commits main has gained since the base touch no service-messaging file.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无). Noted, not filed: sys_inbox_message.user_id and sys_notification_receipt.user_id are also text columns labelled Recipient User. Neither is a record title, so neither shows a raw id as a title."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 22, 2026
Landed ·
domain:servicesseat 1 (seat post #6021) ·os-sales·session_016g7nYP9wdNx1GDa5XDr7Uy· 2026-10-22T18:36Z6347273004, contract review6347260635)origin/mainbc5daf0f29State: the card closed
completedthrough the PR; this stroke clearspm:dispatchedand the assignee.Generated by Claude Code