For what this experiment is and why it exists, start with About this Labs site. Here is the delivery mechanics layer: which tools hold state, which workflows fire when, and how a PM cycle ticket turns into merged code. The implementation lives in this codebase—workflow YAML under .github/workflows/, skills under .github/skills/, and agent instructions in AGENTS.md—summarised here for visitors without implying the repository is publicly browsable.
Tools
| Tool | Role |
|---|---|
| Linear | Tickets, workflow state, delegation to Cursor Cloud agents (PM cycle tickets include [repo=Titanium-Birch/MagnetMagpie] and model directives per linear-tickets skill) |
| GitHub Actions | CI on every PR, deploy on main, weekday iterate schedule (chains deploy, feedback sync, audience sim, PM heartbeat), plus manual and callable workflows |
| Cursor Cloud | Executes PM and builder sessions; builders push branches and open PRs |
| Slack | Human feedback in #magpie-feedback is copied into a Linear inbox ticket by Feedback Sync so PM cycles can read it without manual copy-paste |
Agent types
- PM agent—Runs one cycle per trigger. Reads
.github/skills/product-manager/SKILL.md: assess git and Linear, collect feedback (including audience simulation output read from iterate run logs viagh run list --workflow=iterate.ymlrather than manually reading every page), write outcome-based tickets, delegate to builders, updateAGENTS.mdor skills when new stable constraints appear. Does not merge PRs, poll agents, or implement code. - Builder agents—Pick up delegated Linear tickets, edit the repo, run
bash build.shlocally where needed, opencursor/*pull requests.
Process flow (each cycle)
- Trigger—PM Heartbeat (
heartbeat.yml) creates a Linear issue whose body instructs the PM agent and references the product-manager skill. Iterate (iterate.yml) runs on a weekday schedule (and manual dispatch) and invokes heartbeat after deploy, feedback-sync, and audience-sim with upstream step results embedded in the ticket. Heartbeat can also run alone viaworkflow_dispatch. Each agent run is a single cycle; recurrence is the next workflow trigger, not a loop inside the session. - State from Git—Recent merges and open PR counts are gathered in the heartbeat job and pasted into the new ticket description.
- State from Linear—PM reads active tickets and delegation state (per PM skill).
- State from GitHub Actions—CI results on PRs; optional audience simulation output via
ghCLI; deploy outcomes when iterate runs. - State from Slack—Via the inbox ticket populated by Feedback Sync (
feedback-sync.yml), which runs in the iterate chain on weekdays (and on manual dispatch) when secrets and variables are present. - Output—New builder tickets, occasional updates to
AGENTS.mdor skills, optional human-input requests filed as Linear issues.
Watchdog (watchdog.yml) has no cron; run it via workflow_dispatch or workflow_call. It lists open cursor/* PRs, flags conflicts, and can promote drafts—so stuck work can surface when the workflow is triggered.
Path from ticket to production
- Builder opens a PR from a
cursor/*branch. - CI runs
scripts/validate-site.sh(which includesbash build.sh: Hugo build, Playwright tests). - Auto-merge enables squash auto-merge for qualifying
cursor/*PRs; GitHub merges when required checks pass. - Deploy Labs Site runs on push to
main; if AWS role, region, bucket, and distribution variables are unset, the workflow logs a skip and exits without failing the chain.
GitHub Actions workflows
About a dozen workflows handle CI, auto-merge, deployment, agent scheduling, feedback sync, and housekeeping like branch cleanup and workflow linting. Each is a short YAML file under .github/workflows/ in the MagnetMagpie codebase.
Agent skills
Each agent type follows a skill file that defines its scope, rules, and exit conditions—covering product management, ticket mechanics, content authoring, development conventions, and graphics. Skills live under .github/skills/ alongside the code they govern. AGENTS.md at the repo root ties everything together with environment facts, cost constraints, and strategic context.
What changed after the first orchestration draft
An earlier PM design polled Linear and GitHub every minute, built the site every cycle, diff-reviewed every PR, and maintained a hand-off plan document. That burned context on status polling, duplicated CI’s job on reviews, and let plan files drift while Linear and git already held truth. The current heartbeat ticket text explicitly tells the PM not to read every page—Audience Simulation (audience-sim.yml) builds the site and checks rendered public/ pages against the content expectations register for violations, emitting PAGE_REVIEW: and PUBLIC_READINESS: lines, when iterate (or a manual run) invokes it.
Feedback and quality signals
- Feedback Sync—Slack threads → Linear inbox for PM step 2.
- Audience Simulation—Structured violation reports and pass/fail readiness lines in workflow logs when
CURSOR_API_KEYis configured; cloud agents without that secret cannot run the sim locally (AGENTS.md). - Actionlint—Validates workflow YAML on PRs that touch
.github/workflows/.
Related automation (same repo)
- Refresh Model Map—Updates
model-map.jsonfrom the Cursor models API whenCURSOR_API_KEYis set; trigger manually or viaworkflow_call(no schedule). - Branch cleanup—Deletes merged
cursor/*heads on PR close and can sweep stale branches onworkflow_dispatch(branch-cleanup.yml). - Slack Deploy Summary—Posts a commit summary after deploy (chained from
deploy.yml) when configured (no hourly cron).
For a live snapshot of merges, article coverage, and open questions at build time, see Live operations.