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>
The gitea posting snippet used the issue-comment endpoint, which has no
path or line, so findings named `path:line` in prose instead of landing
on the code. Both forges now post one COMMENT review carrying anchored
findings in comments[] and loose ones in the body.
land's gitea baseline missed review-comment ids, which would replay
every code comment on the first hint.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The units ran from nixos-config while the scripts they execute live
here, so a fix like KillMode had to be made in the repo that does not
contain the daemon. They are defined here now and each machine opts in
with programs.agentSkills.<name>.enable, which keeps the property that
nothing starts a session unless a host asks for it.
ExecStart still points at the checkout, not the store: an edit should
take effect on restart rather than needing a flake bump.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Scanner covered Claude Code only. It now also reads pi jsonl sessions, the
opencode sqlite store, and Codex (rollout files plus the sqlite thread index
as fallback), and records per-session model, effort level, token counts, tool
errors and cost.
Cost is reported natively by pi and opencode; Claude Code and Codex are
estimated from pricing.json and marked as such, since a subscription seat is
not billed those numbers.
New models.md output ranks (tool, model, effort) by spend with cost per human
turn and a push-back count, and SKILL.md step 4 says how to read it without
turning a regex into a verdict.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
A PR is never reviewed by the harness that wrote it. With `selfReview`
on, an own PR gets both roles: `land` on the head branch and `review-pr`
on a local pull/N/head checkout, which is what keeps routing unambiguous
with two sessions on one PR.
The reviewer is drawn from a configured roster of harness+model+effort
combinations, excluding the author's harness, picking among the
least-used so every combination keeps getting exercised and a new entry
goes out immediately. Each pick is appended to a JSONL ledger, which is
what makes rating them possible later.
Drafts never get a reviewer; the draft-to-ready flip spawns one.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>