OC Flow Bridge Objective Connect → Airtable

Live workgroup · in production

The poller works.
167 workspaces, zero errors, nothing sensitive crossing the line.

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

One direction, one scope, one table

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.

SYSTEM OF RECORD Objective Connect Candidate documents and evidence live here — and only here. GET only /workspaces /auditevents SCHEDULED JOB The poller GitHub Actions hourly, on the hour no local state upsert 1 row per workspace STATUS MIRROR Airtable “OC Sync Status” table. Identifiers, timestamps, event types, status. No write path back into Objective Connect The poller only ever issues GET requests. Nothing in Airtable can change OC. Cursor per workspace is stored in Airtable itself — the job is stateless and safe to re-run

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.

It reads changes, not everything

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.

One bad workspace can’t stop the run

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

What crosses, and what never does

Every field the poller is capable of writing is listed below. There is nothing else — this is the complete surface of the integration.

Crosses into Airtable

Fields transferred from Objective Connect to Airtable
Objective Connect sourceAirtable fieldDirectionPolicy

Never leaves Objective Connect

    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

      Every row is real

      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.

      Synced Objective Connect workspaces
      Status Workspace School Enrolment Last audit event New Last polled Workspace UUID

      04 Cohort summary

      What the forms actually say

      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.

      Second data path

      This part reads document contents. The poller never does.

      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.

      Outcomes against Powering Futures' reported years

      This year's cohort should track the 2025/2026 bar. The earlier years are Powering Futures' real reported figures, shown for context.

      One category this form cannot record

      By school

      SchoolCandidates PassNo award WithdrawnPass rate

      Progress through the four outcomes

      Verification sampling

      Demographics

      05 Where this goes next

      Honest open items

      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.

      1. In progress

        Production hosting under the PF GitHub account

        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.

      2. Not needed

        Machine-user account

        Not required — the live workgroup account has no MFA, so the scheduled job authenticates directly with it.

      Deliberately not claimed

      • This page is a static snapshot, not a live console. It holds no credentials and makes no API calls in your browser.
      • Airtable cannot push anything back into Objective Connect. That is not a setting — no such code path exists.
      • Every workspace shown is real, from the live candidate workgroup. Only identifiers, sync status, and aggregate demographic/enrolment counts are published here — no candidate name, SCN, or individual record ever leaves Objective Connect.