Workgroup-scoped by default
Polling is restricted to a single workgroup UUID unless --all-workgroups
is passed explicitly, and that flag prints a warning before it runs. The scheduled job
does not pass it.
Live workgroup · in production
Objective Connect stays the system of record. A scheduled, read-only poller reads workspace and audit metadata out of it and keeps one Airtable table current with identifiers and sync status only — it never opens a document. A second, separate pass reads the enrolment forms at build time and publishes aggregate counts alone. No candidate is individually identifiable anywhere on this page.
Milestone met: “read-only poller into sandbox Airtable, validated” — due 9 Oct 2026, validated 27 Aug 2026.
Live in production. Scope is the real candidate workgroup
(—). See what’s still outstanding.
Loading snapshot…
01 Architecture
The poller runs on a schedule in GitHub Actions. It authenticates to Objective Connect, asks each workspace for audit events newer than the cursor it last saw, and writes the outcome to Airtable. Nothing in the pipeline can write back to Objective Connect.
Polling is restricted to a single workgroup UUID unless --all-workgroups
is passed explicitly, and that flag prints a warning before it runs. The scheduled job
does not pass it.
Each workspace’s cursor is the timestamp of the newest audit event already seen, stored on that workspace’s own Airtable row. The first run picked up all 167. Two later runs returned 0 — nothing had changed. Then 50 workspaces had a document added, and the very next run returned events for exactly those 50 and nothing for the other 109. It is not returning zero blindly; it returns precisely what moved.
Every workspace is processed in isolation. A permission change or deleted workspace records an ERROR row with a follow-up flag, and the other 158 carry on.
02 Data boundary
Every field the poller is capable of writing is listed below. There is nothing else — this is the complete surface of the integration.
| Objective Connect source | Airtable field | Direction | Policy |
|---|
The audit-event fields below are returned by the Objective Connect API and are discarded at build time — they are never written to Airtable and are not present anywhere in this page’s data file.
03 Synced workspaces
Pulled from the Airtable base at build time — identifiers and sync status only. Select any workspace to see its genuine audit trail and the cursor the poller stored for it.
| Status | Workspace | School | Enrolment | Last audit event | New | Last polled | Workspace UUID |
|---|
No workspaces match that filter.
04 Cohort summary
Every workspace holds a Student Enrolment Form. This section is built by opening each one straight from Objective Connect, tallying it, and throwing the file away. Only counts are published — see how this differs from the sync path below.
Sync path hourly, automated
OC → poller → Airtable
Lists workspaces and audit events. Never opens a document. Writes identifiers and status only. Unchanged by anything on this page.
Summary path build time only
OC → parse in memory → counts
Downloads each form, reads the candidate rows, and emits totals. Names and SCNs are read to be counted and then discarded — they are never written anywhere.
This year's cohort should track the 2025/2026 bar. The earlier years are Powering Futures' real reported figures, shown for context.
| School | Candidates | Pass | No award | Withdrawn | Pass rate |
|---|
05 Where this goes next
The validation milestone is done and the poller is live. These are genuinely outstanding and both need a decision or an action outside this codebase.
The scheduled workflow currently runs from a personal repository. Moving it under the Powering Futures organisation puts the credentials in org-managed secrets, the run history somewhere the team can see it, and the job under PF’s access control rather than one person’s.
Not required — the live workgroup account has no MFA, so the scheduled job authenticates directly with it.