Skip to main content

Automation Infrastructure

TABS is operated almost entirely through automated pipelines. This page documents the two main chains: the hands-off coding workflow that takes a GitHub Issue to a merged PR without any human writing code, and the daily data pipeline that processes Prolific submissions, runs analysis, and commits results - all without a human pressing a button.

The Hands-Off Chain

Every feature and fix follows an eight-step chain from GitHub Issue to merged PR. No human writes code; the workflow is purely assignment, review, and approval.

StepActorActionOutput
1HumanCreates a GitHub Issue describing the taskIssue assigned to @Copilot or Claude Code
2Copilot / ClaudeReads the issue, explores the codebase, plans and implements the changeBranch + commits pushed to GitHub
3GitHub ActionsCI runs: format check, lint, unit tests, build, Playwright E2EGreen or red status on the PR
4Copilot PR ReviewAutomatically reviews the PR diff for correctness, style, and securityInline review comments on the PR
5Copilot / ClaudeReads review comments, applies fixes, pushes updated commitsPR updated; CI re-runs
6GitHub ActionsCI re-runs on the updated commitsGreen or red status
7HumanReviews the final diff and CI results; approves if satisfiedPR approval recorded
8GitHubMerge queue runs final checks; merges to main and deploys to GitHub PagesFeature live on technologyadoptionbarriers.org

Daily Data Pipeline

A GitHub Actions workflow (daily-pipeline.yml) runs every morning. The workflow runs a seven-phase chain that processes Prolific submissions, exports and analyzes Qualtrics responses, and commits updated JSON artifacts - all without manual intervention.

PhaseNameWhat it doesGitHub Environment
1FetchPulls auth checks and submission statuses from the Prolific API; produces a disposition CSV artifactprolific-prod
2AnalyzeExports Qualtrics survey responses, enriches with Prolific status, runs disposition waterfall, descriptive stats, advanced analysis, psychometrics, and quality audit - 7 sub-steps in sequencequaltrics-prod
3aApproveBulk-approves CLEAN-disposition participants on Prolific; pre-filters already-approved PIDs to avoid double-processingprolific-prod
3bMessageSends disposition-specific messages to FLAG participants via the Prolific messaging API - 9 message variants, run sequentiallyprolific-prod
3cDashboardGenerates disposition-summary.json with live Prolific counts cross-referenced against the analysis sample Nsprolific-prod
4CommitRuns Prettier on all changed data files, then opens a PR with updated JSON artifacts via the format-and-pr composite actioncopilot
5ReportCreates a daily GitHub Issue summarizing pipeline results, counts, and any anomalies - always runs, even if earlier phases failgithub-pages

Data Privacy Boundaries

The pipeline is designed so that PII never reaches the repository. The table below classifies every artifact produced during a pipeline run.

ArtifactContains PIDs?Committed to repo?Retention
sensitivity-analysis.jsonNo (aggregate stats)YesPermanent
data-audit.jsonNo (aggregate counts)YesPermanent
disposition-summary.jsonNo (aggregate counts)YesPermanent
Disposition CSVYes (PROLIFIC_PID)No (artifact only)1 day
Qualtrics raw CSVYes (PII fields)No (stays on runner)Ephemeral
Prolific demographicsYes (per-participant)No (not fetched in daily pipeline)Ephemeral
Step summariesNo (aggregate counts)No (Actions UI)Workflow lifetime
Workflow logsYes (PIDs in debug)No (Actions UI)90 days

Demographic data (age, sex, ethnicity, language, nationality) from Prolific profiles is not fetched during the daily pipeline. When fetched via manual workflows or standalone scripts, any resulting CSV files are written only to runner temp or short-lived artifacts and are never committed to the repository. The public dataset excludes all direct identifiers.

Privacy Rule

Never commit PROLIFIC_PID or participant-level data to the repository. Step summaries use aggregate counts only. Workflow logs containing PIDs are retained only in the GitHub Actions UI for 90 days and are not accessible to the public.

AI Agent Ecosystem

Three distinct AI agents collaborate on every feature, each with a different role and access level.

Copilot Coding Agent

Implementation

  • Assigned GitHub Issues
  • Writes and pushes code to a branch
  • Opens a pull request
  • Fixes review comments
  • Never merges - human approves

Claude Code

Implementation (alternate)

  • IDE-integrated; runs locally or in CI
  • Same write access as Copilot agent
  • Used for complex multi-file refactors
  • Can call MCP servers (Qualtrics, GitHub)
  • Submits work via PR - same review chain

Copilot PR Review

Review

  • Triggered when PR is marked ready
  • Reviews diffs for bugs and style
  • Posts inline comments
  • Re-reviews after fixes
  • Cannot merge - advisory only

How the agents hand off on a single feature

  1. Human creates an issue and assigns it to @Copilot.
  2. Copilot coding agent clones the repo, reads the issue, and writes the code.
  3. Agent pushes a branch and opens a PR, which triggers CI.
  4. CI (format, lint, tests, build, E2E) runs automatically and posts status.
  5. Human marks the PR as “Ready for review” - Copilot PR Review reads the diff and posts comments.
  6. Copilot coding agent (or Claude) reads the review comments and pushes fixes.
  7. CI re-runs; if green, human reviews the final diff and approves.
  8. GitHub merge queue merges the PR and deploys to GitHub Pages.

Dependency Provenance

Every external API is accessed through either an official first-party client library or a centralized TypeScript/Python module that wraps the REST API directly. No third-party API wrappers are used.

Qualtrics API v3 (REST)

Survey export, embedded data, and quota operations use the official Qualtrics REST API v3. The centralized client is src/lib/qualtrics-api.ts (TypeScript) and scripts/analysis/tabs_api.py (Python). No third-party Qualtrics SDK is used.

Prolific API v1 (REST)

Participant operations (approve, message, status) use the official Prolific API with token-based authentication. The centralized client is src/lib/prolific-api.ts (TypeScript) and scripts/analysis/prolific_tools.py (Python).

Google Analytics & Search Console

Analytics and SEO metrics use the official @google-analytics/data and googleapis SDKs from Google. Service account authentication is used; credentials are stored in GitHub Secrets and never committed to the repository.

GitHub MCP Server

AI agents access GitHub - creating issues, pushing files, managing PRs - through the official @modelcontextprotocol/server-github MCP server, not via third-party wrappers. Qualtrics MCP uses the first-party MCP endpoint built into the Qualtrics platform.