Files
lumbridge-code/scripts/claude-statusline-bridge.sh
Metal AgentandClaude Opus 5 ef52aa7ce2 Replace the footer's placeholder usage with a real observation ledger
The footer showed invented percentages. It now shows what two harnesses
actually report, or says it does not know.

lumbridge-core gains an append-only per-profile UsageLedger and a projection
that labels every derived value estimated, withholds a burn rate from a single
sample, withholds a window fraction with no reported ceiling, withholds an
exhaustion estimate that lands after the reset, and reports an expired window
as rolled over rather than freezing its last percentage. A missing fact renders
as missing, never as zero. (0012)

lumbridge-harness is the impure side: processes, clocks, and untrusted wire
text in, observations out. Three adapters:

- Codex's account/rateLimits/read over the app-server's JSON-RPC stdio. The
  client cannot express a request outside a two-variant enum and answers every
  server-to-client request with -32601, so a harness asking Lumbridge for a
  credential is refused by construction. (0013)
- Claude Code's session transcripts, as a byte-offset tail follower that
  reports nothing until the backlog is read to EOF — a partially-read backlog
  is indistinguishable from a burst of spend, and the first run against 20 MB
  reported forty-six billion tokens an hour. The parser models four counters,
  so the conversations in those files are not representable. (0014)
- Claude Code's five-hour and seven-day subscription windows, via a bridge
  installed as its statusLine command. 0014 had claimed no such surface
  existed; it does, and the record is corrected in place rather than quietly
  edited. Lumbridge does not read the OAuth credential to call the account
  usage endpoint, which is what comparable tools do — AGENTS.md forbids it,
  and 0015 says so rather than leaving the gap unexplained.

Also in here: a capability-check ordering fix in the workspace reducer, where
the applied-request replay table was consulted before the capability check and
so answered questions the caller had no right to ask; the GPUI spike wired to
the live probes with per-harness gauges and provenance chips; and a launcher
that matches its own window by PID, because GPUI sets WM_NAME but not
_NET_WM_NAME and a title match never succeeded.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-31 21:47:11 -07:00

32 lines
1.2 KiB
Bash
Executable File

#!/bin/sh
# Lumbridge status-line bridge for Claude Code.
#
# Claude Code 2.1.80+ pipes a JSON payload to the configured `statusLine`
# command on every turn. That payload carries `rate_limits.five_hour` and
# `rate_limits.seven_day` — the real subscription windows, relayed from
# rate-limit headers the CLI already received. Reading them here costs nothing
# and needs no credential, which is why Lumbridge takes this route rather than
# calling the account usage endpoint.
#
# This wrapper exists so a missing python3 degrades to a printed message
# instead of a broken status line. It `exec`s the parser so stdin stays the
# payload.
#
# Install with scripts/install-claude-statusline.sh; uninstall by removing the
# statusLine block it adds to settings.json.
set -u
FEED="${LUMBRIDGE_CLAUDE_FEED:-${XDG_DATA_HOME:-$HOME/.local/share}/lumbridge/claude-rate-limits.jsonl}"
HERE=$(dirname "$0")
if ! command -v python3 >/dev/null 2>&1; then
# No parser available. Say so rather than printing a number we cannot read.
echo "lumbridge · python3 not found"
exit 0
fi
mkdir -p "$(dirname "$FEED")" 2>/dev/null || true
exec python3 "$HERE/claude-statusline-bridge.py" "$FEED"