Blocked-by: objectstack-ai/objectstack#16659
Found while delivering #7 (card 12). credential_expiry_reminder (daily) and interview_reminder (hourly) are correct in what they select, mark and dedupe on both drivers and on the real cron path — but a run launched by the schedule trigger carries no organization, notify emits org-less, and this install (12 employer organizations + the platform one) refuses the tenant-scoped inbox/delivery writes under the platform's #8844 rule. Measured on cli 17.3.0 with the cron temporarily set to every minute:
- sqlite, two ticks: F5
selected=8 acted=4 then selected=4 acted=0; F6 acted=2 (a Quillstone and a Harborline interview, so the system sweep does span employers) then acted=0; reminder_sent / expiry_reminded_at stamped. A direct read of the sqlite file afterwards: sys_inbox_message EMPTY. Every recipient's GET /api/v1/notifications: empty. Boot log: [notify] no organization in scope per emit, plus Insert on 'sys_automation_run' was REFUSED: a system-context write on a tenant-scoped object must carry an organization ... holds 2 organizations.
- memory, two ticks: identical shape — same log lines, all recipient inboxes empty.
- The same two flows triggered through
POST /api/v1/automation/<name>/trigger under a session (which threads that session's organization) deliver on both drivers: recipients read the rows back from their own inbox, and the second trigger inside the window sends nothing.
Nothing in this repo can thread the organization: NotifyConfigSchema has no organization key, the schedule and time-relative triggers set no tenantId, and a defineJob handler has no messaging handle at all. The flows will start delivering the moment the platform threads an organization for scheduled runs (or declares the user-keyed inbox objects platform-global) — no change here is expected beyond re-verifying.
Re-verification recipe (verification-only cron mutation, restore by blob hash afterwards): set both start-node crons to * * * * *, npx objectstack build, boot --fresh, create an ats_interview at now+24h, wait two ticks, read GET /api/v1/notifications as talent1@quillstone.example and candidate01@mail.example.
Related here: #39 (the tenant wall on ats_interview for platform personas — a different read-side symptom of the same posture).
Blocked-by: objectstack-ai/objectstack#16659
Found while delivering #7 (card 12).
credential_expiry_reminder(daily) andinterview_reminder(hourly) are correct in what they select, mark and dedupe on both drivers and on the real cron path — but a run launched by the schedule trigger carries no organization,notifyemits org-less, and this install (12 employer organizations + the platform one) refuses the tenant-scoped inbox/delivery writes under the platform's #8844 rule. Measured on cli 17.3.0 with the cron temporarily set to every minute:selected=8 acted=4thenselected=4 acted=0; F6acted=2(a Quillstone and a Harborline interview, so the system sweep does span employers) thenacted=0;reminder_sent/expiry_reminded_atstamped. A direct read of the sqlite file afterwards:sys_inbox_messageEMPTY. Every recipient'sGET /api/v1/notifications: empty. Boot log:[notify] no organization in scopeper emit, plusInsert on 'sys_automation_run' was REFUSED: a system-context write on a tenant-scoped object must carry an organization ... holds 2 organizations.POST /api/v1/automation/<name>/triggerunder a session (which threads that session's organization) deliver on both drivers: recipients read the rows back from their own inbox, and the second trigger inside the window sends nothing.Nothing in this repo can thread the organization:
NotifyConfigSchemahas no organization key, the schedule and time-relative triggers set notenantId, and adefineJobhandler has no messaging handle at all. The flows will start delivering the moment the platform threads an organization for scheduled runs (or declares the user-keyed inbox objects platform-global) — no change here is expected beyond re-verifying.Re-verification recipe (verification-only cron mutation, restore by blob hash afterwards): set both start-node crons to
* * * * *,npx objectstack build, boot--fresh, create anats_interviewat now+24h, wait two ticks, readGET /api/v1/notificationsastalent1@quillstone.exampleandcandidate01@mail.example.Related here: #39 (the tenant wall on
ats_interviewfor platform personas — a different read-side symptom of the same posture).