Console¶
bosun console serves a local web page over the ledger, the sessions, bosun's own health
and the knowledge base, read-only except for knowledge review decisions (design: docs/design/console.md). It runs in the
foreground until Ctrl-C and prints a URL such as http://127.0.0.1:8765/?t=<token>; open it (or
pass --open). The top bar shows how many things need you on every view; the page follows the system's
light or dark mode and works down to a narrow window.
- Ledger (
#/ledger): every item with its kind, state, window, what it waits on and when it changed, filtered by kind, group, window, person (requester or outreach recipient) and update time, searched over ids, titles, fields, notes and reports, and sorted by update, creation or kind. The filters live in the URL, so a view can be bookmarked. Groups: needs me (a pending proposal, outreach whose message awaits approval, a proposed task, a ticket that disagrees with our work), waiting on someone (my review or PR with the other side, outreach sent, open outreach or blockers), open and closed; the default shows every open item, asledger list --opendoes. - Needs you, above the list: windows waiting at a prompt, each pending proposal with its exact action, proposed outreach, and the items a ticket mismatch asks you to decide on (one entry per item, as the needs me group counts them, with the tickets behind it).
- Item page (
#/item/<id>): fields, delegation, latest report, outreach (to whom, what went out, nudges, reply, how long it waited), the pending proposal, what you said about it in a repo window, the lineage tree and links (duplicates, folded into, blocked by, tracks, and their inverses) that go to other items, every web link in the item labelled GitHub, Jira, Confluence, Slack or Web, and the history. Onlyhttp(s)links are clickable; they open in a new tab. - Sessions (
#/sessions): a card per window (bosun sessions --json): its kind, folder, model and effort, its agent's status (idle, busy, shell, waiting) and for how long, the items it holds, its active item and whether it works on it now, its last report, its login verdict, and thetmux attachcommand with a copy button. Below, Health: the watchdog's checks (aswatchdog --statusshows them; nothing is alerted or recorded), today's morning run and the last chores runs, the events dispatcher (deliveries today againstBOSUN_EVENTS_MAX_PER_DAY, events pending), the Slack watcher (last run, spend today against its daily cap, failures), the login (the last login check, windows answering only with login errors) and the feature flags (events, Slack watcher, learning: on or off). It never starts Claude, so whether the stored login works right now is left tobosun status. The view reloads every 15 s while visible. - Stats (
#/stats?days=7|30|90): from the ledger's history, items opened and closed per day by kind, my PRs merged and the median time to merge, review rounds done and their turnaround, tasks spawned, accepted and done, hand-overs per window and the median time to the report, outreach sent, replied, unanswered and waiting with the median reply time and nudges per reply, the people reached out to and worked for (top 10; names stay local), and bosun itself: the last chores runs, event deliveries, Slack-watch and learning runs and their spend per day. Each metric is defined in the design note. Charts are inline SVG, each with a text summary and its numbers in a data table. - Improvements (
#/learning): learning's runs, live and dry (when, outcome, findings, proposals, cost) with a link to each run's report, rendered in the page; everylearn:proposal with its finding, evidence, reason, the exact change and where it goes, and when and how it was applied or rejected; and the findings learning remembers, with how often each was seen. - Knowledge Graph (
#/knowledge): the knowledge base (bosun kg) in three tabs. The Briefing (the home): facts captured per day, the confirmed share, coverage per card, what changed this week (before -> after) and the new facts, today's review as a card stack (Y/N/S keys or drag, Z undoes), and the most connected entities. The Constellation (?view=constellation): the whole knowledge base as a force-laid graph with hover, a facts panel, search, card chips and an "as of" slider (at most 400 entities). Raw data (?view=raw): four cards, People, Process, Product and Systems, with entity counts, confirmed and proposed facts and what changed last, and a search over names, aliases and fact text with a type filter. A disabled Metro tab marks the map still on the roadmap. An entity's page (#/knowledge/<key>) shows its current facts by predicate with who stands behind each (user, stakeholder, observed, inferred), its status, dates and sources (web links and ledger items link; a memory note links to the Config view whenBOSUN_CONSOLE_MEMORY_DIRSlists its folder; a session shows its name; anything else is text), the facts that no longer hold (greyed, with what replaced them), the facts that point to it, related ledger items (a person as requester or outreach recipient, a repo by its items), a process's steps as an ordered flow (actor, gates, entry points, systems), and a small graph of what lies within two links. A person's page shows only work facts and how to have them deleted (bosun kg forget); restricted identifiers are never shown. The review (#/knowledge/review) is the batchkg batchuses, lettered the same way: confirm or reject a group or a fact, skip a fact, or confirm a group except the facts you tick. Decisions are recorded as yours, from the console, with the time, through the same code askg batch apply; once every fact of the batchkg batchprinted is decided, it is marked answered there too. The view reloads when the knowledge base changes (the review only while nothing is ticked). Systems groups the system, service and environment types. Without a knowledge base the view says how to start one. - Config (
#/library): the files that steer bosun, read-only: the repo's policy, chores, task types and prompts, and your site overlay from$BOSUN_CONFIG_DIR(policy, task types,sessions.yml, the orchestrator settings,bosun.env). Each task type says whether it is the onebosun delegateuses or a site file replaces it. Config values whose names contain TOKEN, SECRET, KEY or PASSWORD, and webhook URLs, are masked; site files are also redacted like learning's digest. Markdown is rendered (its front matter as a table). Claude Code memory notes appear only if you list their folders inBOSUN_CONSOLE_MEMORY_DIRS(colon-separated). - The open view refreshes when the ledger changes (checked every 15 s).
- It listens on
127.0.0.1only, onBOSUN_CONSOLE_PORT(8765) or--port N;--port 0picks a free port. A port in use is an error, not a silent fallback. - The first visit swaps the URL's token for an HttpOnly, SameSite=Strict cookie and drops it from
the address bar; the API answers 401 without the cookie, so other local processes and pages
cannot read the ledger by finding the port. The token is kept across restarts in
$BOSUN_STATE_DIR/console/token(file 0600, folder 0700), so an open tab stays signed in when the console restarts. A stored token that others could read, or a damaged file, is replaced by a new one.bosun console --new-tokenrotates it (signing out every tab), andBOSUN_CONSOLE_PERSIST_TOKEN=0makes it new on every start. - Read-only: GET and HEAD only, a strict Content-Security-Policy, and only its own files are
served. The one exception is a knowledge review decision (
POST /api/knowledge/review): local data, never outward-facing, and only with the cookie, this page's Origin, a JSON body and a per-start CSRF token that only the review page can read. Config files, learning reports and knowledge entities only by an opaque key from a list it builds itself (no path from a request ever reaches the filesystem). It readsledger.jsonas a snapshot (never its lock), re-read when the file changes. It reads the windows the waybosun sessions --jsonand the watchdog do (list them, read each agent's session records), at most every 10 s; it never sends keys to a pane, never reads a pane's text and never starts an agent. - It logs only refused requests (to stderr), never ledger content or item ids.
- A console keeps the code it started with.
bosun update's plan says to restart one that runs, and a review decision it can no longer save after an update says so, and to restart it (bosun console).
Impact¶
The console's Impact view (#/impact) asks what bosun changed, not what it did (design:
docs/design/impact.md). It compares weeks since the start
(BOSUN_IMPACT_START, else the ledger's first item) with my own baseline before it
(BOSUN_IMPACT_BASELINE_FROM, else 13 weeks earlier), shown as a band: PRs merged per week and
time to merge, reviews given per week and time to my first review, agent busy hours against my
touch time (leverage, week by week and before the start against since where transcripts from before
exist), what learning has produced (runs, findings that came back, proposals, the knowledge base's
growth), cost per week and per merged PR, and where agent time went per window, with the PRs behind
each week as links. Codex windows are not counted yet
(what they lack), so with them leverage and cost
come out low. Estimates (my touch time: BOSUN_IMPACT_PROMPT_MINUTES per
prompt I typed; cost at list prices) carry an "estimate" badge and a range, every number says how
many weeks it rests on, and fewer than four weeks since the start is marked early data. Other people
are never named. The view reads the snapshot bosun impact collect writes to
$BOSUN_STATE_DIR/impact/ (GitHub reads only, through gh, over BOSUN_IMPACT_REPOS or the
ledger's repos; transcripts through the same reader as the rest of bosun, cached per file); run it
by hand, or daily from the morning run with BOSUN_IMPACT_COLLECT=1.
Its Overhead panel shows what bosun itself costs. Every turn's tokens count against what
started it: my requests, tasks handed to a window and subagents are work; check-ins, events
summaries, background-task notifications, resume prompts, messages between sessions, prompts Claude
Code sends on a schedule (a session's own cron or wake-up) and the prompt openings in
BOSUN_IMPACT_OVERHEAD_PREFIXES (a site's own scheduled prompts, |-separated) are overhead. The panel shows the overhead share over the last 7 days against the 7 before, the
cost per check-in and per notification, the context a turn re-reads (median and p90; a long
conversation makes every turn there expensive), and the cost per week by what started each turn.
Bosun internals (#/impact/internals, linked from the page) has the context per window, the
cost per turn by week (check-in, notification, resume, events) and guardrails (tasks reported and
done, hand-over to report time, approval failures, outreach answered, events delivered and
waiting, check-ins sent and skipped) that show the work did not get worse when the cost fell. BOSUN_IMPACT_OVERHEAD_FIXED_AT (a date) adds a
before/after table there for the week on each side. The watchdog's context-size and overhead-share
checks warn when either grows.
Its Cost per task panel shows what each ledger item cost, its subagents included: by outcome
(done, merged, dropped, open), task type and kind, and the most expensive items next to the PR they
produced. A turn counts for the item its hand-over names, else the item the window reported on
next, else the window's active item, as long as that window's last ledger event is within
BOSUN_IMPACT_ATTRIBUTION_HOURS (8); the rest stays unattributed per window (the
orchestrator's coordination, work outside the ledger). BOSUN_IMPACT_TASKS_TOP (15) sets how
many items it lists. A model missing from the price table is priced as Opus and named on the panel.