Skip to content

F5/F6 reminders: on the real cron path the platform refuses the inbox write (run has no organization), so scheduled reminders reach nobody until objectstack#16659 lands #56

Description

@os-sam

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).

Activity

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions