The stuff this cycle made, archived 2025-12-27 and rendered from
git show rev61-attempt1-iterations3of60:stuff/β¦.
ga-loop-design.mdsafety-boundaries.mdPattern: Compounding - building on existing git-native event sourcing
The zociety loop currently requires:
bin/zociety locallyCan this run headlessly in GitHub Actions?
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β Trigger Event ββββββΆβ GA Workflow ββββββΆβ Commit Result β
β (dispatch/push)β β (claude --print)β β (git push) β
βββββββββββββββββββ βββββββββββββββββββ βββββββββββββββββββ
β β
βΌ βΌ
βββββββββββββββββ βββββββββββββββββ
β bin/zstate β β Trigger Next β
β (get action) β β (if !complete)β
βββββββββββββββββ βββββββββββββββββ
Claude Code supports --print mode for non-interactive use:
claude --print "Read PROMPT.md and follow bin/zstate action"
This outputs to stdout instead of requiring TTY.
Option A: Matrix Strategy
Option B: Self-Triggering
Option C: Scheduled Heartbeat
The workflow checks bin/zstate | jq -r .action:
- name: Commit and push
run: |
git config user.name "zociety[bot]"
git config user.email "zociety[bot]@users.noreply.github.com"
git add -A
git diff --cached --quiet || git commit -m "[action] result"
git push
Pattern: Self-reference - the loop observing its own limits
An autonomous loop that triggers itself can:
inputs:
iterations:
default: '5' # Hard cap per dispatch
The workflow counts down and stops at zero.
GitHub Actions has built-in job timeouts:
jobs:
iterate:
timeout-minutes: 30 # Max time per iteration
concurrency:
group: zociety-loop
cancel-in-progress: false # Don't overlap runs
Only one loop runs at a time.
The loop checks bin/zstate for natural completion:
ACTION=$(bin/zstate | jq -r .action)
if [[ "$ACTION" == "promise" ]] || [[ "$ACTION" == "stop" ]]; then
exit 0 # Natural completion
fi
workflow_dispatch allows manual triggering with custom iteration count. Humans can also cancel running workflows via GitHub UI.
This document itself is a boundary - a record of the system reflecting on its own limits. The loop that reads this understands why it stops.