Proof · pulled at 03:12 · unit 4 of 4

Your issues go to press overnight.

The humans are the day shift: you talk the idea through, write the spec and cut it into issues. The agents work the third shift: give thirdshift an Issue URL and it implements the issue, reviews its own work and opens a pull request that is ready for review by morning.

Built on Matt Pocock's skills: aihero.dev/skills · mattpocock/skills

Install

curl -fsSL https://thirdshift.app/install.sh | sh
Show the full commandcurl -LsSf https://github.com/JacobStephens2/thirdshift/releases/latest/download/thirdshift-installer.sh | sh

Two shifts

You plan by day. The press runs at night.

Day shift

Humans, with Matt Pocock's skills, used interactively

  1. grill
  2. spec
  3. issues

The human half of the workflow: shaping work into issues the factory can take on, by grilling the idea, writing the spec and cutting it into issues, and reviewing the pull requests it delivers.

Third shift

Agents, with headless copies of the same skills

  1. implement
  2. review
  3. pull request

thirdshift takes one Issue URL per Run. Its Factory skills, adapted to run with no human in the loop, implement the issue, review the work and open a pull request that is ready for review.

How a Run works

One issue in, one pull request out.

A Run feeds one issue through four units and delivers a pull request that is ready for review. Units 2 and 3 are one agent session. Under each unit are the lines thirdshift printed on stderr during a real Run: issue #24, which produced pull request #25.

The press line: a feeder, units C, M, Y and K, and a delivery pile Issue #24 goes in at the feeder and passes through four press units: 1 · C · Prepare, 2 · M · Implement, 3 · Y · Review and 4 · K · Finish. A bracket over units M and Y marks them as one agent session. Pull request #25, ready for review, comes out on the delivery pile. ONE AGENT SESSION ISSUE #24 FEEDER the issue C UNIT 1 1 · C · PREPARE M UNIT 2 2 · M · IMPLEMENT Y UNIT 3 3 · Y · REVIEW K UNIT 4 4 · K · FINISH PR #25 · READY DELIVERY PILE ready for review

1 · C · Prepare

Pre-flight checks the Origin match, that the issue is open and that git has a name and email to commit with. thirdshift then picks the Issue branch, fresh or a Continuation, and creates a worktree next to your clone. Pre-flight prints nothing when it passes, so the first line is the worktree.

  1. thirdshift: creating worktree /home/jacob/repos/thirdshift-issue-24 on issue-24 from origin/main

2 · M · Implement

A headless Claude Code session, with the Factory skills loaded, implements the issue in the worktree, test-first where it can, and commits.

  1. thirdshift: logging the session to /home/jacob/.thirdshift/logs/JacobStephens2-thirdshift-issue-24-20260925T134143Z-implement.jsonl
  2. thirdshift: implement: session started
  3. thirdshift: implement: $ gh issue view 24 --comments && ls && cat CONTEXT.md | head -80 && ls docs docs/adr
  4. thirdshift: implement: $ gh issue view 24 --json title,body,comments,labels && ls && ls docs docs/adr 2>/dev/null; git log --…
  5. thirdshift: implement: $ cat src/interrupt.rs && grep -rn "assert_interrupt_fails_the_run\|SIGTERM\|SIGINT\|Signal::" tests/ …
  6. thirdshift: implement: $ sed -n 1,40p tests/failed_run.rs && sed -n 150,240p tests/failed_run.rs; grep -rn "fn tmp\|\"tmp\"\|…
  7. thirdshift: implement: $ sed -n 40,70p tests/failed_run.rs; sed -n 290,340p tests/support/mod.rs; grep -n "fn run_and_signal"…
  8. thirdshift: implement: Edit tests/failed_run.rs
  9. thirdshift: implement: $ cargo test --test failed_run sighup 2>&1 | tail -15
  10. thirdshift: implement: $ python3 - <<'EOF'
  11. thirdshift: implement: $ grep -rni "interrupt\|ctrl-c\|signal" README.md CONTEXT.md docs/adr; cargo fmt && cargo clippy --all…
  12. thirdshift: implement: $ sed -i 's/ends, including by Ctrl-C, without/ends, including by Ctrl-C or a closed terminal, without…
  13. thirdshift: implement: commit

3 · Y · Review

The same session reviews its work against the Base branch, fixes the Standards findings and Spec findings it agrees with, and lists the rest as Unaddressed findings in the pull request body. Then it opens the pull request, ready for review.

  1. thirdshift: implement: skill thirdshift:code-review
  2. thirdshift: implement: $ git rev-parse main && git log main..HEAD --oneline && git diff main...HEAD --stat; ls .agents/skills…
  3. thirdshift: implement: Agent Standards review
  4. thirdshift: implement: $ git diff main...HEAD && cat CODING_STANDARDS.md && ls .agents/skills/codebase-design/ && cat .agents…
  5. thirdshift: implement: Agent Spec review
  6. thirdshift: implement: $ cat CONTEXT.md; grep -rn -i "sigint\|sigterm\|ctrl-c\|interrupt\|signal" README.md CONTEXT.md docs s…
  7. thirdshift: implement: $ gh issue view 24 --json body,comments; git diff main...HEAD
  8. thirdshift: implement: $ sed -n 140,240p tests/failed_run.rs; grep -n "fn assert_cleaned_up" -A25 tests/support/mod.rs; grep …
  9. thirdshift: implement: $ grep -n "TMPDIR\|fn entries\|fn run_and_signal" -A8 tests/support/mod.rs | head -60; git show --stat…
  10. thirdshift: implement: SubagentHandback
  11. thirdshift: implement: $ sed -n 145,162p tests/support/mod.rs; cargo test --test failed_run 2>&1 | tail -8
  12. thirdshift: implement: $ cargo test 2>&1 | grep -E "test result|FAILED|panicked" | head
  13. thirdshift: implement: $ python3 - <<'EOF'
  14. thirdshift: implement: SubagentHandback
  15. thirdshift: implement: commit and push
  16. thirdshift: implement: skill thirdshift:pr
  17. thirdshift: implement: $ cat > /tmp/pr24.md <<'EOF'
  18. thirdshift: implement: session ended after 3m 40s: 5 turns, $1.06 at API prices

4 · K · Finish

thirdshift pushes, checks the pull request, merges the Base branch in and watches CI. A merge conflict or failing CI starts a Repair, at most 3. A Resume can happen in any session and isn't a Repair. The Run ends once the pull request is open, ready, mergeable and passing CI. This Run needed no Repair.

  1. thirdshift: pushing issue-24
  2. thirdshift: checking the PR
  3. thirdshift: merging origin/main into issue-24
  4. thirdshift: pushing issue-24
  5. thirdshift: waiting up to 60s for CI on f32bc95
  6. thirdshift: CI on f32bc95: 1 of 1 checks still running
  7. thirdshift: CI passed on f32bc95
  8. thirdshift: checking the PR is open, ready and mergeable
  9. thirdshift: cleaning up the worktree and local branch issue-24
  10. thirdshift: PR https://github.com/JacobStephens2/thirdshift/pull/25 is ready for review

The implement: lines are the Run's session log passed through thirdshift's own progress condensing. The other lines are thirdshift's progress messages, filled in with pull request #25's branch, commit and CI result. The session's duration is rebuilt from its log file's timestamps, so thirdshift may have printed 3m 41s.

Delivery pile

What comes off the press

Ready for review

An open pull request from the Issue branch to the Base branch. It is mergeable, its CI passes, and it has been reviewed against your repository's documented coding standards and against the issue. Otherwise thirdshift doesn't call it ready.

Unaddressed findings

Every Standards finding and Spec finding the agent chose not to fix is listed as an Unaddressed finding in the pull request body, so you decide on it.

Failed runs keep their work

A Failed run still pushes its work, so nothing is lost (if the push fails, it keeps the worktree instead), and its pull request goes back to draft. Run the same command again to continue it.

Plan view · the press hall

The factory grows

One Run is the first primitive the factory is built from: one Issue URL in, one pull request ready for review out. It is the only line on the floor today.

The rest of the floor is marked out, not built. Each outlined line is a machine that is not yet installed, linked to the issue that tracks it.

Floor plan of the press hall One press line is installed: a Run, from the issue through units C, M, Y and K to a pull request. Three more lines are outlined and not yet installed: self-merge, the architecture pass and implementing a whole spec. LINE 1 · ONE RUN INSTALLED An Issue URL in, a pull request out. LINE 2 · SELF-MERGE NOT YET INSTALLED · #26 Would merge its own pull request. LINE 3 · ARCHITECTURE NOT YET INSTALLED · #27 Would run /improve-codebase-architecture. LINE 4 · WHOLE SPEC NOT YET INSTALLED · #28 Would implement every issue in a spec.

Engineer the factory while the factory engineers the software.

Proof sheets

Pulled from the press

Real pull requests thirdshift made on its own repository. Judge the work yourself.

Before you run it

Requirements and platforms

Requirements

  • claude (Claude Code), logged in.
  • gh (GitHub CLI), logged in.
  • git with a global user.name and user.email, and credentials that can push to the repository.

Platforms

  • Rocky Linux 9.8 and later, x86_64.
  • Ubuntu 24.04.3 and later, x86_64.
  • WSL2, latest release, with Ubuntu 24.04 or later, x86_64. Keep your repositories on the Linux filesystem (e.g. ~/repos), not under /mnt/c. WSL1 is not supported.
  • macOS Tahoe 26.5.2 and later, Apple Silicon.

Details in the README.

Colophon

Third shift

My dad, Mark Stephens, was a pressman at Tursack Printing, the print shop Robert Tursack Sr. founded in Philadelphia in 1959. My dad worked third shift at the Morgantown, Pennsylvania plant, keeping the big four-color presses running through the night. Sometimes I got to visit, and I always wondered whether I'd end up in printing myself. The lineage carries on. Bob Tursack went on to found Brilliant Graphics in Exton, where my mom still does graphic design. This is as close as I am to printing right now.

The printing press made copying words cheap. Agents are doing that for code. thirdshift is named for my dad's shift: the machines can run overnight, and I need something to keep them running.

- Jacob Stephens