fix: scratch dir as .igor/ + add ~/.local/bin to systemd PATH #8

Merged
joshtronic merged 2 commits from devel into master 2026-05-16 21:21:56 +00:00
Owner

Two bugs from the first maintenance tick that fired:

  1. tee: .../.git/claude-output.log: Not a directory

    In git worktrees, .git is a file (gitlink pointing at the
    real gitdir under /.git/worktrees//), not a
    directory. Writing files to .git/<name> -- claude-output.log,
    IGOR_JOURNAL.md, IGOR_MAINTENANCE_FINDINGS.md, PR_BODY.md -- can't
    work because .git isn't a dir.

    Swap all four scratch-file paths from .git/ to .igor/
    and mkdir .igor/ after each worktree creation (tier 1, tier 2,
    tier 3). AGENTS.md updated to tell Claude the new paths.

    Why .igor/: untracked (not in any .gitignore but harmless --
    harness uses explicit git add paths for commits, worktree gets
    removed at tick end, never appears in diffs).

  2. timeout: failed to run command 'claude': No such file or directory

    Systemd's default PATH doesn't include ~/.local/bin (where
    Anthropic's claude CLI lives by default), and ~/.bashrc-style
    PATH extensions aren't sourced for services. Add an explicit
    Environment=PATH=... to the unit putting %h/.local/bin first.

After this lands, the first tier-2 maintenance tick should complete
end-to-end: clone (already worked), claude invocation (was broken,
now fixed via PATH), tee output to .igor/claude-output.log (was
broken, now fixed via dir), findings read from .igor/IGOR_*.md
(was broken, now fixed).

Co-Authored-By: Claude Opus 4.7 (1M context) noreply@anthropic.com

Two bugs from the first maintenance tick that fired: 1. tee: .../.git/claude-output.log: Not a directory In git worktrees, `.git` is a *file* (gitlink pointing at the real gitdir under <main-repo>/.git/worktrees/<name>/), not a directory. Writing files to `.git/<name>` -- claude-output.log, IGOR_JOURNAL.md, IGOR_MAINTENANCE_FINDINGS.md, PR_BODY.md -- can't work because `.git` isn't a dir. Swap all four scratch-file paths from .git/<name> to .igor/<name> and mkdir .igor/ after each worktree creation (tier 1, tier 2, tier 3). AGENTS.md updated to tell Claude the new paths. Why .igor/: untracked (not in any .gitignore but harmless -- harness uses explicit git add paths for commits, worktree gets removed at tick end, never appears in diffs). 2. timeout: failed to run command 'claude': No such file or directory Systemd's default PATH doesn't include ~/.local/bin (where Anthropic's claude CLI lives by default), and ~/.bashrc-style PATH extensions aren't sourced for services. Add an explicit Environment=PATH=... to the unit putting %h/.local/bin first. After this lands, the first tier-2 maintenance tick should complete end-to-end: clone (already worked), claude invocation (was broken, now fixed via PATH), tee output to .igor/claude-output.log (was broken, now fixed via dir), findings read from .igor/IGOR_*.md (was broken, now fixed). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix: scratch dir as .igor/ + add ~/.local/bin to systemd PATH
All checks were successful
Lint / check-sync (push) Successful in 4s
Lint / check-sync (pull_request) Successful in 4s
2d02df9f41
Two bugs from the first maintenance tick that fired:

1. tee: .../.git/claude-output.log: Not a directory

   In git worktrees, `.git` is a *file* (gitlink pointing at the
   real gitdir under <main-repo>/.git/worktrees/<name>/), not a
   directory. Writing files to `.git/<name>` -- claude-output.log,
   IGOR_JOURNAL.md, IGOR_MAINTENANCE_FINDINGS.md, PR_BODY.md -- can't
   work because `.git` isn't a dir.

   Swap all four scratch-file paths from .git/<name> to .igor/<name>
   and mkdir .igor/ after each worktree creation (tier 1, tier 2,
   tier 3). AGENTS.md updated to tell Claude the new paths.

   Why .igor/: untracked (not in any .gitignore but harmless --
   harness uses explicit git add paths for commits, worktree gets
   removed at tick end, never appears in diffs).

2. timeout: failed to run command 'claude': No such file or directory

   Systemd's default PATH doesn't include ~/.local/bin (where
   Anthropic's claude CLI lives by default), and ~/.bashrc-style
   PATH extensions aren't sourced for services. Add an explicit
   Environment=PATH=... to the unit putting %h/.local/bin first.

After this lands, the first tier-2 maintenance tick should complete
end-to-end: clone (already worked), claude invocation (was broken,
now fixed via PATH), tee output to .igor/claude-output.log (was
broken, now fixed via dir), findings read from .igor/IGOR_*.md
(was broken, now fixed).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
fix: onboarding tickets use Priority/Critical, not Priority/High
All checks were successful
Lint / check-sync (push) Successful in 4s
Lint / check-sync (pull_request) Successful in 5s
ff29c1f940
A repo failing onboarding blocks Igor from doing any work on it.
That's a Critical priority, not just High -- nothing else proceeds
on this repo until the human acts.

Replaces Priority/High with Priority/Critical in:

- handle_onboarding_failure (lib/repo-checks.sh) -- the label applied
  to auto-filed onboarding tickets
- check_labels (lib/repo-checks.sh) -- the required label set the
  validator looks for on each onboarded repo
- docs/architecture.md + docs/onboarding-a-repo.md -- references to
  the required label set
- bin/install.sh -- the post-install reminder of which labels to
  ensure on each repo

Both Priority/High and Priority/Critical come from Forgejo's
Advanced label template, so operators who loaded that template
already have the new label available. Operators with existing
manually-curated labels need to add Priority/Critical and (if not
used elsewhere) can remove Priority/High.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
joshtronic deleted branch devel 2026-05-16 21:21:56 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
joshtronic/igor!8
No description provided.