Repository navigation
Description
domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K
Filing gate: ② a maintainer ruling's server half. Ruling B on #29642 (record 6593872191, maintainer 「同意」 2026-11-03T02:26Z): "the Console sends the origin it was loaded from in RegisterDeviceRequest. The server stores it on the UserDevice row, and the push channel copies it into PushDeliveryDataSchema." The spec half is PR #29767 (#29642), which declares origin on all three schemas with the device-side members marked [PLANNED — not yet stored]. ⛔ Not a claim. Suggested-grade: p2 (inherits #29642; without it the declared origin is never stored or sent, so the mobile shell still opens a tap on the wrong server).
Business reason. A user with two saved servers in the mobile shell (objectstack-ai/mobile#173) taps a push from server B and lands on server A. The fix only works once the server stores the origin at registration and sends it back on every push. Reader: the domain:server seat, after PR #29767 merges.
What to build (measured by the #29642 dev, os-dev-report 6595041258)
packages/services/service-messaging/src/objects/user-device.object.ts:sys_user_devicegains anoriginfield besideapp_id/locale.packages/services/service-messaging/src/device-registry.ts: the row write storesrequest.origin ?? null(besideapp_id: request.appId ?? null,locale: request.locale ?? null), and the row read setsdevice.originwhen present (besideif (row.locale) device.locale = …).packages/runtime/src/domains/notifications.ts: no edit needed;POST /devicesalready passesparsed.datatoregisterDevice, sooriginreaches the registry once the spec merges.- The push channel (Push channel: build the device registry routes (
/notifications/devices) and the APNs + FCM transport that ADR-0012 marks "MUST ship M1" #29041): copy the device row'sorigininto the pushdata(PushDeliveryDataSchema.origin).git grep PushDeliveryDataoutsidepackages/specis empty today, so the copy lands there. - Remove the two
[PLANNED — not yet stored]markers inpackages/specand flip the marker pin inpush-server-origin.test.tsin the same PR (a spec-text edit inside the server PR, the declaration's own retirement).
Out of scope
- The Console sending
window.location.originat registration rides Console: register the mobile shell's native push token after sign-in, unregister it on sign-out #29042.
Serial: after PR #29767.
Dedupe: searched "sys_user_device" origin (3 hits: #29642, #29068 closed, #29067 closed) and push origin device registry (47 hits; nearest #29042 Console registration, #29067/#29068 the closed registry build). New.
Links back: #29642, PR #29767, #29042, #29041, objectstack-ai/mobile#174.
Activity
objectstack-fleet commentedon Nov 3, 2026
domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K
Carried here from the contract review of PR #29767 (record 6595157663, PASS, three should-fix items on
packages/spec/src/system/push-server-origin.ts), since this card edits that module when the[PLANNED …]markers come off:http://my_svc:3000and a trailing-dot FQDN are refused althoughwindow.location.origincan answer them. Allow_in a label, or name the limit in the docblock.:443on https,:80on http, leading zeros, out of range) and the IPv6 arm accepts[:::]; tighten, or note that the Console is the one producer.Also for the Console producer (#29042): send
originonly whenwindow.location.protocolishttp:orhttps:; an opaque"null"origin is refused and fails the whole registration with a 400.objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:server·pm:blocked· 2026-11-03T04:52Z⛔ Not a claim.
Blocked-by: #29767
sys_user_devicestores the device'sorigin, and the push channel copies it into the push data. Without it the declaredoriginis never stored, and a two-server shell still opens a tap on the wrong server. p2, inheriting [Decision] Push delivery data: name the server that sent a push, so a mobile shell with several saved servers opens a tap on the right one #29642.Generated by Claude Code