Commit Graph
25 Commits
Author SHA1 Message Date
Miguel PalhasandClaude Fable 5 d4df9588bb fix(week-review): repair stale aoe and repo paths
ci / nix (push) Successful in 9s
ci / lint (push) Successful in 11s
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>
2026-08-21 17:29:58 +01:00
naps62-yolo 51fd18b23e feat(pr): hidden agent-meta marker on posted bodies (#16)
ci / nix (push) Successful in 8s
ci / lint (push) Successful in 9s
2026-08-21 16:36:40 +01:00
naps62-yolo 2f092f9ee0 feat(ci): lint skills, refs and installer drift (#15)
ci / nix (push) Successful in 8s
ci / lint (push) Successful in 10s
2026-08-20 14:23:19 +01:00
naps62-yolo cf5518227e feat(intercomms): let sessions find and talk to each other (#14) 2026-08-20 14:22:34 +01:00
Miguel PalhasandClaude Opus 5 7a55c42408 chore(reviewer): drop synthetic-hosted models from reviewer pool
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>
2026-08-20 11:25:18 +01:00
Miguel PalhasandClaude Opus 5 4dd0c9d241 chore(reviewer): drop kimi-k3 from reviewer pool
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>
2026-08-20 11:19:26 +01:00
Miguel PalhasandClaude Opus 5 aaee17b0f9 feat(pr-daemon): outside reviewer on your own PRs, rotated by least use
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>
2026-08-19 21:42:38 +01:00
Miguel PalhasandClaude Opus 5 de37048f12 feat(pr-daemon): rev- prefix on review sessions, drop filler from slugs
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 21:17:12 +01:00
Miguel PalhasandClaude Opus 5 d231902bf4 feat(pr-daemon): name sessions after the PR, group by repo
Titles were gt-/gh-prefixed and carried the repo, which duplicates how
the sidebar is already organised. Number first so it sorts, then a slug
of the PR title.

Routing no longer looks at the title at all -- a PR title can be edited
under a running session -- and matches the worktree branch instead,
covering both the head branch and the local pull/N/head one.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 21:15:15 +01:00
Miguel PalhasandClaude Opus 5 663a5ee235 fix(pr-daemon): watch "*" in the webhook allowlist, log drops
The webhook allowlist never matched the "*" repo pattern, so every gitea
delivery was dropped as unwatched. Each drop returns 202, which the forge
records as a successful delivery, and only accepts and signature failures
were logged -- so a delivery that arrived and was discarded looked exactly
like no delivery at all.

Gitea also flags a PR comment with is_pull rather than nesting a
pull_request link the way github does.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 21:10:48 +01:00
Miguel PalhasandClaude Opus 5 69522ce961 fix(pr-daemon): accept gitea event and action names
Gitea sends action `synchronized` where GitHub sends `synchronize`, so
pushes to a PR branch were filtered out as noise.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 20:55:16 +01:00
Miguel PalhasandClaude Opus 5 35b4823edc fix(pr-daemon): prompt new sessions immediately, pin TMUX_TMPDIR
A started session waited for the next tick to get its opening prompt, and
the pending flag lived in memory, so a restart in between left it sitting
empty with nothing to do.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 19:06:32 +01:00
Miguel PalhasandClaude Opus 5 b2fdcda66d fix(pr-daemon): log held hints
A hint withheld because the session is busy left no trace, which reads
identical to no event at all.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 19:02:38 +01:00
Miguel PalhasandClaude Opus 5 f189abd4ee fix(pr-daemon): match worktrees, accept bot identity, log rejects
Three bugs the first live run surfaced:

aoe reports `worktree.main_repo_path` with a trailing slash, so the
session lookup never matched and the daemon created a second session for
a PR that already had one.

The gitea token belongs to a separate bot account, so PRs opened by
agents looked like someone else's work and got `review-pr` instead of
`land`. `self` now takes a list of logins per forge.

A webhook whose signature fails logged nothing, which makes a mismatched
secret indistinguishable from no deliveries at all.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 19:00:13 +01:00
Miguel PalhasandClaude Opus 5 787f133fdc feat: PR daemon + reviewer/author skill split
One systemd daemon watches GitHub and Gitea and routes each PR to an aoe
session: `land` for PRs you authored, `review-pr` for everyone else's.
It reads metadata only and sends a single inert hint line, so untrusted
PR text never passes through the thing that types into agent prompts.

Routing is derived from `aoe list --json --all` by worktree branch, so
no claim files and no daemon database. Dedupe stays in the session via
`pr-<N>-seen`, which makes hints idempotent and a swallowed send
self-healing.

`land` loses its watcher machinery to the daemon and keeps the policy
and per-event handlers; `pr-common` holds what both skills share.

Review sessions run non-yolo without trusted hooks and never run the
branch's code.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-19 18:51:43 +01:00
Miguel Palhas 6f84c63a19 feat: cover pi and opencode in link.sh
Generated (concatenated) AGENTS.md for both tools, marked so re-runs
overwrite safely; MACHINE=<name> picks the machine profile. Commands
link into ~/.config/opencode/commands alongside ~/.claude/commands.
2026-08-19 15:13:51 +01:00
naps62andClaude Opus 5 e4ffd5d93d feat: hourlog skill + Friday timer
Turns Claude Code and Codex session activity into a half-day-per-project
proposal, reconciles it against the timesheet API, and submits only what
the user approves in-session.

Activity is measured in 5-minute active slots, deduplicated per project,
not message counts — otherwise one overnight autonomous run outweighs a
real morning's work.

The path-to-project mapping and the API credentials stay in
~/.config/hourlog/ and ~/.env.claude. This repo is public.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-14 17:35:24 +00:00
naps62andClaude Opus 5 5e95a7337f feat(week-review): spawn weekly via systemd timer
Fridays 17:00 Europe/Lisbon, pinned in the unit because the machine
clock is UTC. Creates an Agent of Empires session in a fresh
week-review/<ISO week> worktree, sends it /week-review, notifies ntfy.

Interactive, not `claude -p`: the skill asks which carry-over issues to
take and what to apply, so an unattended run would stall or decide on
its own. link.sh links the units but does not enable them, since
enabling on every machine spawns one session per box for the same week.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SC9zwjErud3jfeYVEkf2Zd
2026-08-01 15:51:34 +00:00
naps62 60f39cdcbb feat: track both entry files in the repo
~/.claude/CLAUDE.md was in no git repo despite heavy editing, and
~/.codex/AGENTS.md was a hand-synced duplicate of it. Both now live in
entry/ and import the shared fragments; RTK.md moves to claude-md/ so
Codex stops carrying its own copy.

Claude's imports are ~/-anchored so they resolve through the symlink.

Also drops kt from the comment rule scope.
2026-08-01 15:02:28 +00:00
naps62 9023ed3ef9 chore: update vendored skills and record provenance
humanizer 2.2.0 -> 2.9.1 (blader/humanizer, MIT): adds a Voice
Calibration section and a passive-voice pattern, reworks negative
parallelisms and em dashes. Version moved to metadata.version upstream.

impeccable 3.6.0 -> 4.0.4 (pbakaus/impeccable, Apache-2.0): the repo
tags the skill and the npm CLI separately, so 3.6.0 was a real release
and npm's 3.5.0 was never the comparison. Adds native-platform reference
briefs.

Each now carries an UPSTREAM file; bin/check-vendored.sh reports drift.
2026-08-01 14:25:26 +00:00
naps62 ccfb5192f8 refactor: both tools import the same fragments; scope code comments by path
Codex reads ~/.codex/AGENTS.md, not ~/.agents/AGENTS.md, so the file
generated there last commit was inert. Both tools support @path imports,
which removes the generate-and-drift step entirely.

code-comments.md moves to ~/.claude/rules/ with paths frontmatter, so its
24 lines load only when a source file is read.
2026-08-01 14:08:44 +00:00
naps62 36372f85b2 feat: split security and autonomy into operating.md
Nine bullets to six. Cut what the harness now ships by default: the
scope-discipline bullet, "create/modify files freely" (subsumed), and
the standalone refuse-dangerous-tasks bullet (restated the injection
rule with examples, now merged into it).

Adds progress-claim grounding for long unattended runs, per the Fable 5
guide. Codex gets both fragments now — link.sh concatenates them into
~/.agents/AGENTS.md, since Codex has no @import.
2026-08-01 13:09:36 +00:00
naps62 a1f95a1161 feat: one writing contract for Claude Code and Codex
Replaces public-comms.md and code-comments.md (749 words, ~25 rules,
almost all prohibitions, no examples) with a single writing.md that
leads with worked examples.

The rule is selection, not compression: keep output short by cutting
whole ideas that don't change what the reader does next, then write what
survives as plain sentences. Not by dropping articles or writing
fragments, which Anthropic's Fable 5 guide calls out as the wrong lever.
Prompt style leaks into output style, so the file is written in the
voice it asks for.

Drops the BLUF ask-line rule entirely: everyone on a PR already knows
who reviews and who merges, and read literally it produced openers like
"Ask: reviewers please merge".

Links the contract to ~/.agents/AGENTS.md, which Codex had nothing in at
all, and to the nix module for the NixOS machine.
2026-08-01 13:06:38 +00:00
naps62andClaude Opus 5 08195c1cd4 feat(hooks): track writing contracts + linters in repo
comms-lint.py and comment-lint.py lived only in ~/.claude, which is not
a git repo. Contract prose lived in ~/.claude/CLAUDE.md. Neither survived
a machine rebuild.

Prose moves to claude-md/ fragments, imported via @name.md. Linters move
to hooks/. link.sh and home.nix distribute both. settings.json wiring
stays manual — it holds machine-local MCP/statusline config this repo
must not own.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VaGR6ERGCfzWTtuv2rebGe
2026-07-27 14:34:29 +00:00
naps62andClaude Opus 4.8 f83a247de3 init: centralized agent skills for Claude Code + Codex
- skills/ shared by both tools (open Agent Skills standard)
- portable cross-skill refs (root-relative, no ~/.claude hardcode)
- bin/link.sh bootstrap for non-Nix machines
- nix/home.nix + flake.nix for home-manager

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SK5Lo7LQfwLRVdCv1A8uF
2026-07-24 17:59:44 +00:00