What? What? What? What? What? What? What? What? What? What? https://igor.bot/
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-08-09 20:59:41 +00:00
.forgejo/workflows feat: clean up some extended ASCII and other stuff 2026-05-15 21:37:31 -05:00
bin Merge branch 'master' into agent/493-fix-pre-claim-context-file-check-must-accept 2026-08-09 20:58:58 +00:00
docs WIP: issue #487 checkpoint -- revert out-of-scope deletions per rescope 2026-08-09 02:06:34 -05:00
lib Merge branch 'master' into agent/493-fix-pre-claim-context-file-check-must-accept 2026-08-09 20:58:58 +00:00
systemd fix: stop paying systemd's 1-minute timer accuracy slop 2026-07-28 11:03:39 -05:00
.env.example feat: add healthcheck ping wiring (lib/healthcheck.sh, opt-in) 2026-07-04 14:51:50 -05:00
.gitignore feat: ideas thought-stack reflection + top-of-stack post picker 2026-05-21 22:42:34 -05:00
.mdl-style.rb fix: switch markdown lint from npm's markdownlint-cli to the Debian mdl gem 2026-07-04 15:27:49 -05:00
.mdlrc fix: switch markdown lint from npm's markdownlint-cli to the Debian mdl gem 2026-07-04 15:27:49 -05:00
.shellcheckrc chore: get make lint's shellcheck target green (197 pre-existing findings) 2026-07-05 18:19:11 -05:00
agent-settings.json chore: remove Python from the harness 2026-05-27 21:15:19 -05:00
AGENTS.md WIP: issue #487 checkpoint -- revert out-of-scope deletions per rescope 2026-08-09 02:06:34 -05:00
CLAUDE.md WIP: issue #487 checkpoint -- revert out-of-scope deletions per rescope 2026-08-09 02:06:34 -05:00
LICENSE chore: add GPL v3 LICENSE + README license section 2026-08-08 21:09:44 -05:00
Makefile fix: switch markdown lint from npm's markdownlint-cli to the Debian mdl gem 2026-07-04 15:27:49 -05:00
README.md docs: bold only the label so the canonical-repo line passes mdl 2026-08-09 10:21:57 -05:00

Igor

Igor is an unattended Claude Code harness: a systemd timer fires a tick every minute, the tick claims one Agent-labeled issue from the git forge across every repo the bot can push to, and ships a PR. Every bot PR gets a shadow code review before a human ever sees it, and a fleet of other scheduled passes (maintenance audits, deploy verification, reporting) run alongside the issue grind. This repo is the harness itself -- the loop, not any one project it works on.

Generic harness. Project conventions live in each repo's AGENTS.md dossier (see docs/agents-md-spec.md for the required shape); CLAUDE.md is legacy and only present in repos still mid-migration.

Mirrors

Canonical repo: https://git.sherver.org/joshtronic/igor

Mirrored for your convenience:

I don't monitor these services or accept pull/merge requests on them.

What it does

  • Issue grind -- claims the oldest Agent-labeled issue across every accessible repo, does the work, opens a PR (or files a report, or blocks with a comment if it can't proceed).
  • PR shadow review + rework/adjudication -- an independent model reviews every bot PR (APPROVE/REQUEST_CHANGES/COMMENT); a REQUEST_CHANGES drives an automatic rework loop, capped at 3 rounds, where the agent may fix the finding or dismiss it with recorded reasoning before escalating to the human.
  • Checkpoint-and-resume -- a large issue that hits the per-tick turn cap snapshots its progress as a draft PR and picks back up next tick instead of losing the work, up to a bounded number of resumes.
  • Maintenance audits -- a weekly, per-repo dependency/security sweep (npm audit, cargo audit, pip-audit, govulncheck, bundle audit, ...) that files deduped tickets for bumps, security findings, and anything needing human judgment.
  • Auto-merge + deploy barrier -- for opted-in repos, merges an approved, green, up-to-date bot PR and then verifies the deploy actually landed (build SHA + sitemap check) before letting the next tick's work start.
  • SEO/GA reporting -- a monthly, Search-Console-driven pass that scores click-upside opportunities per domain (plus GA4 on-site numbers where available) and emails a report, filing a ticket for opted-in sites.
  • Logwatch -- a daily sweep of the local systemd journal for any repo that declares itself a service, filing a ticket on genuinely recurring failures (not one-off blips).
  • Feedback triage -- reads player/user feedback rows from an opted-in repo's published form CSV and files a ticket for anything real and new, dropping spam and dupes.

Install

Server prerequisites (one-time on the host before cloning):

  • jq curl git flock timeout sqlite3 -- sudo apt-get install -y jq curl git util-linux coreutils sqlite3
  • claude CLI via Anthropic's installer, authenticated with the host's Claude subscription login

See docs/setup.md for the full prereq picture (ecosystem toolchains, bot user setup, auth) and links.

Then:

git clone <git-repo-url> ~/.local/share/agent
cd ~/.local/share/agent
cp .env.example .env && chmod 600 .env
$EDITOR .env                   # fill in every var -- no defaults
bin/install.sh                 # pre-flights deps, wires systemd
bin/validate.sh                # confirm setup

install.sh is the "clone and go" entry point. It pre-flights all prereqs and wires up the systemd timer. Idempotent; re-run after git pull to pick up unit file changes.

Updating

cd ~/.local/share/agent
git pull
bin/install.sh                 # re-reads units, daemon-reloads

install.sh is idempotent. .env changes need no reload -- each tick re-sources it.

For each repo the agent should work: add the bot user as a collaborator, set up labels (the forge's label set -- on Forgejo, the Advanced template -- plus a custom Agent label), and confirm via bin/validate-repo.sh <owner>/<name>. See docs/onboarding-a-repo.md for the full readiness bar.

Docs

License

This project is licensed under the GNU General Public License v3.0 -- see LICENSE for the full text.