diff --git a/docs/screenshots/issue-64/press-1440x900-no-js.png b/docs/screenshots/issue-64/press-1440x900-no-js.png new file mode 100644 index 000000000..2ecac69ed Binary files /dev/null and b/docs/screenshots/issue-64/press-1440x900-no-js.png differ diff --git a/docs/screenshots/issue-64/press-390x844-no-js.png b/docs/screenshots/issue-64/press-390x844-no-js.png new file mode 100644 index 000000000..349a2ea84 Binary files /dev/null and b/docs/screenshots/issue-64/press-390x844-no-js.png differ diff --git a/site/index.html b/site/index.html index 6554d38f6..09ba3f775 100644 --- a/site/index.html +++ b/site/index.html @@ -66,7 +66,183 @@

Your issues go to press overnight.

- + +
+
+
+

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. +
+
+
+

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.

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

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.

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

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.

+
  • resolving-merge-conflicts in a Repair
+
    +
  1. thirdshift: pushing issue-24
  2. +
  3. thirdshift: checking the PR
  4. +
  5. thirdshift: merging origin/main into issue-24
  6. +
  7. thirdshift: pushing issue-24
  8. +
  9. thirdshift: waiting up to 60s for CI on f32bc95
  10. +
  11. thirdshift: CI on f32bc95: 1 of 1 checks still running
  12. +
  13. thirdshift: CI passed on f32bc95
  14. +
  15. thirdshift: checking the PR is open, ready and mergeable
  16. +
  17. thirdshift: cleaning up the worktree and local branch issue-24
  18. +
  19. thirdshift: PR https://github.com/JacobStephens2/thirdshift/pull/25 is ready for review
  20. +
+
+
+

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.

+ + +
+
diff --git a/site/styles.css b/site/styles.css index e03986f72..7bb69fca1 100644 --- a/site/styles.css +++ b/site/styles.css @@ -130,6 +130,40 @@ body::after { /* scanlines */ .lede { margin: 0; max-width: 62ch; color: var(--dim); } @media (max-width: 560px) { .sec { padding-block: 48px; } } +/* ---------- How a Run works: the press line (prototype press D) ---------- */ +.svg-misreg { filter: + drop-shadow(calc(var(--mr) * -1) 0 0 color-mix(in srgb, var(--c) 75%, transparent)) + drop-shadow(var(--mr) calc(var(--mr) * .6) 0 color-mix(in srgb, var(--m) 70%, transparent)); } +/* The whole press always fits, so narrow screens get it scaled down; each column below repeats its unit's name in large type. */ +.press-frame { border: 1px solid var(--rule); } +.press-svg { display: block; width: 100%; height: auto; } +.press-svg text { font-family: var(--f-mono); } +.press-svg .ink-letter { font: 800 36px var(--f-head); } +.press-svg .unit-label { font: 800 24px var(--f-head); letter-spacing: .02em; fill: var(--paper); } +.press-cols { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 16px; margin-top: 28px; } +@media (max-width: 1000px) { .press-cols { grid-template-columns: repeat(2, minmax(0, 1fr)); } } +@media (max-width: 600px) { .press-cols { grid-template-columns: minmax(0, 1fr); } } +.unit-col.ink-c { --ink: var(--c); } .unit-col.ink-m { --ink: var(--m); } .unit-col.ink-y { --ink: var(--y); } .unit-col.ink-k { --ink: var(--paper); } +.unit-col { display: grid; align-content: start; gap: 10px; border-top: 4px solid var(--ink); padding-top: 12px; } +.unit-col h3 { font-size: 26px; display: flex; align-items: center; gap: 10px; } +.unit-col .tag { width: 18px; height: 18px; flex: none; background: var(--ink); } +.unit-col.ink-k .tag { background: transparent; border: 2px solid var(--paper); } +.unit-col p { margin: 0; font-size: 13.5px; } +.factory-skills { display: flex; flex-wrap: wrap; gap: 6px; list-style: none; margin: 0; padding: 0; } +.factory-skills li { font: 700 12px/1 var(--f-mono); padding: 6px 8px; background: var(--k3); border: 1px solid var(--rule); } +.factory-skills li span { font-weight: 400; color: var(--dim); } +.stderr-lines { list-style: none; margin: 0; padding: 10px 12px; font: 12px/1.6 var(--f-mono); background: #000; border: 1px solid var(--rule); } +.stderr-lines li { white-space: pre-wrap; overflow-wrap: anywhere; } +.stderr-lines .prefix { color: var(--dim); } +.stderr-lines .ready { color: var(--nc); } +.stderr-lines .failed { color: var(--m-text); } +.press-source { margin: 16px 0 0; font-size: 13px; color: var(--dim); max-width: 90ch; } +.misprint { margin-top: 36px; border: 1px solid var(--m); padding: 16px 18px; display: grid; gap: 10px; max-width: 90ch; } +.misprint h3 { font-size: 26px; color: var(--m-text); } +.misprint p { margin: 0; font-size: 14px; } +.misprint .illustrative b { color: var(--m-text); text-transform: uppercase; letter-spacing: .1em; font-size: 12px; } +.press .lede { max-width: 72ch; } + /* ---------- Day shift / third shift ---------- */ .shifts { display: grid; grid-template-columns: 1fr 1fr; gap: 2px; background: var(--rule); border: 1px solid var(--rule); } @media (max-width: 760px) { .shifts { grid-template-columns: 1fr; } }