`homeboy activity`
Unified read-only activity surface for orchestrators and operators asking what Homeboy is doing now and what just finished.
Usage
homeboy activity
homeboy activity list --limit 50
homeboy activity list --no-runners
homeboy activity show <id>
homeboy activity watch <id> --timeout 30m
homeboy agent-task watch <id> # alias for `activity watch`<id> resolves across observation run ids, agent-task run ids, cook ids, and runner daemon job ids.
Output
JSON output uses the standard command-result envelope with data.schema = homeboy/activity-report/v1. The activity payload normalizes observation runs, agent-task lifecycle records, daemon jobs, and connected runner sessions into ActivityItem records with:
id,kind,source_store,state- timestamps:
created_at,updated_at,finished_at - runner refs:
runner_id,job_id,transport - cross refs:
run_id,agent_task_run_id,runner_job_id - artifact/evidence refs
- structured
next_actionswithlabeland exactcommand
agent_task_record_health is a full-corpus diagnostic attached by list only. show and watch resolve a single id and leave it null rather than scanning every durable agent-task record to fill it.
reconciled is always false here. It is emitted because agent-task status <id> --bridge is a reconciling read that writes, so the two surfaces can legitimately report different states for the same run at the same instant — and calling the reconciling one changes what this one returns next. The flag lets a consumer tell which kind of answer it received.
Human output is a compact table followed by next-action command lines per item.
The default view prioritizes active work, scans a bounded extra window for stale
projections, and omits stale rows that would crowd out current records. Its
truncation object states omitted record and next-action counts explicitly.
Use homeboy activity list --all --limit <count> to retain every collected
record and action, or homeboy activity show <id> for a direct record lookup.
Runner federation
Records for a run offloaded to a Lab runner live on that runner until it reports back, so a controller-local read cannot see them. activity federates connected Lab runners by default:
- The remote read is
statuses_indexed— one/jobsquery against the already-connected session, with no generation reconcile — bounded byHOMEBOY_READONLY_PROBE_TIMEOUT_SECONDS(15s default). - A runner with no connected session is never queried: no session is opened and no network is performed. It appears with
queried: false. - A connected runner that fails or times out sets
partial: trueand is named inrunner_federation.runners[].error. Every other source still returns; a runner outage is never a command failure. - Federation is skipped entirely when no runner layer is registered in the process.
Opt out with --no-runners, or HOMEBOY_ACTIVITY_FEDERATE_RUNNERS=0 for a whole process (for example a long-lived daemon serving the HTTP activity endpoint).
Scope
This is a local read model only. List, show, and watch do not reconcile or otherwise mutate persisted state. show and watch resolve their id through indexed per-provider probes — agent-task lifecycle, observation run, daemon job — and only fall back to a bounded full report when no probe answers. (list still refreshes agent-task records through the reconciling lifecycle status read, which writes; making that projection read-only is tracked separately.) Agent-task stale actions target the inspected run with homeboy agent-task reconcile <run-id> --dry-run; review the authoritative provider-state preview, then add --apply to authorize that one lifecycle mutation. It does not create a daemon, event bus, or offloaded job, and the Lab contract marks it local-only.