Drop legacy frontend proof-of-concepts (TUI, web UI, HTTP gateway,
Emacs major mode) to focus on the core. Assist remains as the primary
frontend; any 9P-speaking program can serve as a frontend.
Update README, mkfile, .gitignore, and architecture/client-interactions
diagrams accordingly.
- Archive tag accepts YYYYMMdd date (defaults to today)
- Loads messages from ~/.local/share/anvillm/mail/{date}-*.jsonl
- Shows both sent and received with From/To columns
- Inbox '- <id>' now deletes instead of archiving
Add /beads/deferred aggregate endpoint and per-mount /beads/<mount>/deferred
endpoint to list beads with status=deferred.
- internal/p9/beads.go: add readDeferredFromStore and readDeferredAggregate
- internal/p9/server.go: wire up deferred in walk, directory listings
- cmd/Assist: update listBeadsWithFilter to use deferred endpoint
- Beads tagged with scope:<value> label, auto-derived from cwd
- Strict scope matching: bots only see beads matching their scope
- Updated scripts: create_bead, list_beads, list_ready_beads, wait_for_bead, search_beads, batch_create_beads, jira_to_beads, github_to_beads
- Fixed batch-create to handle raw JSON and create beads one at a time
- Added scope to JSON output and BeadReady events
- Add Comment tag to bead view window tagline
- New /AnviLLM/Tasks/{bead-id}/comment window with Put handler
- Fix comments display: JSON field is 'text' not 'body'
Classic cron does not support variable assignments in the crontab.
Inline PLAN9, PATH, DISPLAY, and NAMESPACE exports directly in the
cron command, expanded at install time from the user's environment.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Cron runs with a minimal environment; without PLAN9 and the full PATH,
9p cannot locate the namespace socket and sessions are not detected.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
send_message.sh is not on PATH outside the MCP context; use
bash <(9p read anvillm/tools/send_message.sh) instead.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove internal/supervisor Go package. Replace with anvillm-supervisor
script driven by cron: --orphans (every 5m) recovers in_progress beads
whose assignee session has died, --nudge (every 1m) prompts idle worker-
role bots to check for available work via execute_code + wait_for_bead.sh.
Nudges sent as user via send_message.sh. cron-install uses a temp file
to avoid pipeline issues.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Remove the internal/supervisor Go package and cron-driven orphan check
script. Replace with a single anvillm-supervisor script invoked by cron
that handles both orphan bead recovery (--orphans, every 5m) and idle
worker nudging (--nudge, every 1m). Nudges use send_message.sh as user,
consistent with existing mail processing. anvilsrv no longer runs any
supervisor goroutine.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The supervisor drives re-polling via 15s nudges to idle workers.
Roles no longer need to instruct bots to loop — just what to do
when the supervisor prompts them.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace dead assignWork() stub with nudgeIdleWorkers(), which sends a
prompt to any session whose role has worker: true in its front-matter
and has been idle for more than 15 seconds. A 15-second ticker drives
the checks. Bots that should be polling for beads will self-correct
after a brief idle period.
Add Worker bool to RoleMeta, parsed from "worker: true" front-matter,
and IsWorker() helper on RolesFS. Remove unused beads/mailbox/eventbus
deps from the supervisor.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
BeadReady events are already fired when a bead becomes ready; bots
listen for those directly. Sending inbox messages was redundant and
caused duplicate/unexpected prompts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
9p write exits 0 even when the server returns Rerror on Tclunk, so
the previous exit-code check never detected failed claims. Read back
the bead's assignee after writing and fail if it doesn't match.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Concurrent writes to the same mount (e.g. two bots claiming the same
bead simultaneously) could race through RunInTransaction before either
committed. A per-mount writeMu serializes all writes without blocking
independent mounts.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
9p write error was ignored; bots always printed "claimed" regardless
of whether the server rejected the claim with ErrAlreadyClaimed.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
cmd.Run() waits for stdout pipe EOF, but the 9p read subprocess
spawned by process substitution inherits the fd and keeps it open
after bash exits. Capture the PID and kill it in an EXIT trap.
9p read inherits the stderr pipe write end from bash -c, keeping
cmd.Wait() blocked after bash exits. Redirecting to /dev/null lets
the goroutine see EOF and the execute_code call complete normally.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Inbox checking, bead reading, and any single-tool op must be done
directly — never delegated to a sub-agent.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Role filtering was silently dropping events when $AGENT_ROLE didn't
match the default "developer". The bot already handles out-of-scope
work refusal — no need to filter here.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Tasks window Put handler prefix changes:
~ → c (claim)
^ → u (unclaim)
o (open/promote deferred)
d (defer)
x, f, -, + unchanged
Orphan check now skips beads claimed by "user" — human-held beads
are not orphans.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>