yolo now follows COMMON.md worktree setup: stay put when already in a
worktree, create worktrees/<branch-name> when run from the main checkout.
Branch name comes from the issue, or a slug of the task description for
ad-hoc runs.
The merge step no longer does 'git checkout main' — that fails from a
worktree when the main checkout has main out. It merges and pushes in the
main worktree via git -C instead.
When maestro goes down, the daemon only sees aoe sessions. If a PR's
session lives in maestro, route() finds no match and creates a
duplicate on aoe. Track maestro health with exponential backoff and
suppress session creation until it answers again.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
humanizer 2.9.1 -> 2.11.1 (blader/humanizer, MIT): SKILL.md reorganised
into "Content patterns" with numbered pattern sections, plus a voice
matching and personality section. Upstream added a `skills/SKILL.md`
symlink pointing outside the skill directory, so `skills` joins the
excludes list rather than being copied in broken.
impeccable 4.0.4 -> 4.1.3 (pbakaus/impeccable, Apache-2.0): adds font
matching, comp diff/spec, hero checks and raster/PNG helpers under
scripts/; `scripts/live/ui-core.mjs` was split into `ui-surfaces.mjs`
and `project-ignores.mjs`.
bin/check-vendored.sh is green again.
Sessions started by hand now live in maestro. The daemon listed only aoe,
so it found no owner for their branches and spawned a second session on a
worktree that already had an agent in it.
Both listings now feed one session set, keyed the same way, and a hint
goes back out through whichever orchestrator owns the pane. Only the
delivery call branches on source; routing, cooldowns and state read one
set of names. Sessions the daemon creates are still aoe sessions --
profiles, yolo clearing and the review sandbox have no maestro
equivalent.
Assumes `maestro send <id> <message>`, which is landing separately.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
aoe fills worktree.branch with the worktree *name* for worktrees it
created, so a session started by hand in a worktree named after anything
else never matched its own PR and the daemon opened a second session on
the same directory -- PR #412 got one next to the session already sitting
on 387-rehearse-ta-wallet-registration in worktrees/spanish.
Read the branch from the worktree instead, and fall back to the field.
main_repo_path gets the same treatment: it is empty for worktrees aoe
does not manage, which left those sessions matching no repo at all.
Takes effect after: systemctl --user restart pr-daemon (runs from
~/tea/agent-skills, so this must reach main first).
The reviewer pool was the only place naming harness+model combos, and
blitz kept its own table inline. `reviewers` becomes `agents`, gains
`roles` and `tiers`, and blitz routes from it via scripts/roster.sh.
Config path moves to ~/.config/agent-skills/; the reviewer path stays
readable so a box migrates with a mv.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The old cores/SLOTS/2 left a full test suite on 2 of 10 cores even with
the box idle. Reserve two cores for the agent sessions and split the
rest across slots.
Also retire the CPU framing on the subagent fan-out cap. The number
stays 3, but the binding constraints are memory per worktree and the
shared rate-limit window; subagents are mostly idle waiting on the API.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The reviewer was filtered down to ci and state, so a reply to one of its
findings never reached it — it only learned about pushback when someone
asked. Replies are addressed to the reviewer, and an addressed thread is
now the reviewer's to resolve. Conflicts stay filtered out: those are the
author's to fix on their own branch.
Takes effect after: systemctl --user restart pr-daemon (runs from
~/tea/agent-skills, so this must reach main first).
Trust comes from a repos[] entry in the reviewer config, not from the
forge. Listed repos post findings directly; only an unlisted repo still
holds findings for approval. The old text tied gating to github and
misread the config's mode field, which is the daemon's land/review
switch.
Adds §3.1: resolve a thread once the author addresses the finding.
Unresolved findings pile up for the life of the PR and block the
author's land session, which never declares a PR ready over an open
thread. Approval is still not the reviewer's to give.
plan-milestone now POSTs to the dependencies API when filing issues,
instead of relying on Depends on: #N prose alone. blitz's finding-fold
step does the same. Body text is kept for readability.
The milestone is the handoff unit to /blitz and keeps concurrent
planning efforts' issues apart.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Subagent fan-out removed; model routing is a built-in default table,
overridden by instructing the run rather than per-repo config.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
backlog turns a design doc into a labeled, interdependent issue set
by grilling the operator. blitz gains an aoe-session worker mode with
per-difficulty model routing, exit-criteria prompts and stall nudging,
extracted from the arr driver run.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
aoe moved to the nix profile, so the hardcoded ~/.local/bin/aoe made the
Friday timer exit 127 before creating the session. Same resolution the
week-review script already uses.
Auto-review paid off on daemon and core PRs and reviewed clean on most
small ones, so spawning a reviewer on every non-draft PR spent tokens for
nothing. A review session now needs github plus one of your logins in the
PR's requested_reviewers; gitea spawns none.
The never-merge rule only holds for GitHub. Gitea repos here are the
user's own, so land squash-merges once CI is green, threads are
resolved and the branch is current. A gitea PR with no reviewer ever
requested counts as approved, otherwise it waits forever.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A sandboxed review session can't read ~/.env.claude, so $GITEA_TOKEN was
never set and reviewers improvised — one of them fell back to `git
credential fill`, another skipped posting.
A forge can now name a second, write-capable variable in reviewTokenEnv.
The daemon passes its value into the session as $GITEA_TOKEN ($GH_TOKEN
on GitHub), through the generated Claude settings file or the codex
profile's shell_environment_policy, both now written 0600. tokenEnv
stays read-only and unchanged. Nothing is injected when reviewTokenEnv
is unset.
Codex 0.148 discovers skills under $CODEX_HOME/skills only, so every
skill in this repo was invisible to codex sessions — review sessions run
by a codex reviewer reported review-pr as an unavailable skill and fell
back to improvising a review.
Both installers now link each skill into ~/.codex/skills as well. The
nix module links one symlink per skill dir instead of recursive=true:
codex skips any skill whose SKILL.md is itself a symlink, which is what
a per-file link produces.
Every codex review session so far reached for REVIEWER_GITEA_TOKEN,
the name it found in the daemon's config.json, got an empty header and
a 401, then retried with GITEA_TOKEN. The config file now says which of
its fields the session may use, and COMMON.md says why the other name
is not the one.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The checkout moved out of ~/tea/yolo. Codex sessions were the visible
casualty: entry/codex-AGENTS.md @imports absolute paths, so operating.md,
writing.md, code-comments.md, intercomms.md and RTK.md all resolved to
nothing and the sessions ran without them.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Reviewers followed the box's global "code reviews go to the rev server"
rule over the skill's posting step. Findings for maestro #45, #47 and #50
went into rev's DB under the review worktree path; the merge deleted the
worktree, rev now answers "not a known repo", and the PRs read as never
reviewed.
The rev rule is now scoped to changes the agent wrote itself, review-pr
names the forge as the only destination, and the daemon's opening prompt
repeats it.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Review sessions stopped at a permission prompt on every command, which
parks an unattended reviewer on a dialog nobody answers. They now run
confined: Claude gets a generated settings file (dontAsk + bash sandbox,
writes limited to the worktree and its git dir, network limited to the
forge API hosts, credentials unreadable), Codex gets --sandbox
workspace-write --ask-for-approval never plus a profile declaring the
repo untrusted, which also answers its trust prompt without granting it.
Claude Code treats .git as a protected path no allow rule opens, so the
seen and findings files are written with a shell redirect.
review-pr now always posts one review per head SHA, an ack when it has
no findings, so the author side gets a signal either way.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
aoe moved to nix profile and the repo lost its yolo/ nesting; the
timer exited 127 every week since.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Removes the GLM 5.2 entries that stood in for kimi in the previous commit.
The pool is now claude and gpt-5.6 only, across claude, pi and opencode.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Kimi K3 subscription is exhausted. Replaces the kimi entries in the
example config and README with GLM 5.2.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>