Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions devlog/_plan/260904_provider_quota_refresh/000_plan.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
# Provider quota refresh affordance + Meta usage visibility

Unit opened 2026-09-04. Two defects reported against the live Providers dashboard
on `http://localhost:10100/#providers`:
Unit opened 2026-09-04. Two defects reported against the live Providers dashboard:

1. Only the Codex account pool has a "Refresh quotas" button. Every other provider
— anthropic, xai, cursor, google-antigravity, meta-muse — offers the operator no
way to force a fresh quota read from the dashboard.
2. Meta Muse shows no quota on the provider Usage tab even though the proxy has an
observation for it.

## Evidence gathered at P (live proxy, port 10100, v2.42.0, pid 73184)
## Evidence gathered at P (live proxy, v2.42.0)

`GET /api/provider-quotas` returns six reports, and `meta-muse` is one of them:

Expand Down Expand Up @@ -77,6 +76,6 @@ config save, provider add/remove. There is no operator-initiated path. The
`bun x tsc --noEmit`, `bun run lint:gui` only.
- Push with `--no-verify`; branch `codex/260904-provider-quota-refresh`; target `dev`.
- A GUI-mentioning PR requires a screenshot in the description (`enforce-target`).
- The live proxy on port 10100 is the user's working service. Read it, restart it
- The live proxy is the user's working service. Read it, restart it
only when a rebuild must be picked up, never repoint or reconfigure it.
- `refresh=1` must never cause a passive provider to spend an inference turn.
Original file line number Diff line number Diff line change
Expand Up @@ -9,31 +9,32 @@ phase is the evidence phase.
1. `bun run build:gui` — the service serves `gui/dist`, so an unbuilt change is
invisible no matter how green the tests are.
2. `ocx service restart` — picks up the server-side `observed` flag. Confirm a new
pid and fresh uptime on `/healthz`, and that the port is still 10100. The service
pid and fresh uptime on `/healthz`, and that the configured port is unchanged. The service
is the user's own; restart it, never repoint or reconfigure it.
3. `curl /api/provider-quotas` with the admin token — the meta-muse row must now
carry `"observed": true`. This is the wire-level proof, checked before the UI so a
blank screen can be attributed correctly.

## Browser verification (`aside-jun`, CLI repl on the signed-in profile)
## Browser verification (aside CLI repl on the signed-in profile)

The dashboard is loopback and needs no login, so `aside repl` is the right surface:
one invocation is one session, it throws on a bad path instead of skipping, and the
screenshots land as real files. A whole inspect-act-verify flow must fit in a single
invocation because bindings do not persist between calls.

Shots to capture into `devlog/_plan/260904_provider_quota_refresh/assets/`:
The planned capture set covered the Usage quota display, the Usage and Accounts
refresh controls, and the post-click success state. The completed record in
`031_live_verification_record.md` preserves the observed outcomes.

| File | Content |
|------|---------|
| `010_meta_usage_quota.png` | meta-muse → Usage tab with both windows and the observation age |
| `020_usage_refresh_button.png` | the Usage rate-limits header with its refresh control |
| `030_accounts_refresh_button.png` | the Accounts tab refresh control for an OAuth provider |
| `040_refresh_result.png` | the post-click success status |
Those live captures were subsequently removed from the current tree under one
retention rule for both surfaces: account and usage screenshots from a real
operator profile are unnecessary once the behavioral evidence is recorded in
text. The planned filename list is also retired; it differed from the delivered
filenames and must not be treated as an asset inventory.

Aside writes under `~/.aside/u/0/`; Codex copies the files into the repository. Every
`aside` invocation runs under `perl -e 'alarm shift; exec @ARGV' 300` because macOS
has no `timeout` and the bare spelling exits 127 without ever starting the run.
The plan required each `aside` invocation to run under
`perl -e 'alarm shift; exec @ARGV' 300` because macOS has no `timeout` and the bare
spelling exits 127 without starting the run.

## Push and PR

Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,14 @@
# Live verification record — 2026-09-04

Both defects were reproduced and then confirmed fixed against a running proxy serving the
built GUI. Screenshots in `assets/`.
built GUI. The observations below preserve that historical verification.

## Isolation

The user's own proxy runs on port 10100 from
`/Users/jun/Developer/new/700_projects/opencodex` under launchd — a different checkout
from this worktree, so restarting it would NOT have loaded this change, and repointing it
is out of bounds. Verification therefore ran on a scratch instance:

- `OPENCODEX_HOME` = a `mktemp -d` directory holding only `config.json` (three providers),
`auth.json`, and `provider-account-quota-cache.json` copied from the real home.
- port 10399, started with `bun run src/cli/index.ts start --port 10399` from this worktree.
- Port 10100 was confirmed untouched afterwards: same pid 73184, uptime still climbing.
- The scratch home was moved to Trash when finished.
Verification ran against an isolated scratch instance. The existing proxy used a
separate checkout and was left untouched; its process identity and increasing
uptime were confirmed afterwards. The scratch home was moved to Trash when
verification finished.

## Wire evidence

Expand Down Expand Up @@ -46,17 +40,16 @@ The refresh control was exercised, not merely rendered:

- Usage tab: clicking `Refresh quotas` produced `status: "Quotas refreshed"` and the age
line re-derived from `5h ago` to `6h ago` — the read really happened.
- Accounts tab (anthropic, three pooled accounts): the control appears beside
- Accounts tab (pooled OAuth provider): the control appears beside
`Add account` and reported `Quotas refreshed` after a real forced read.

## Assets
## Capture retention

| File | Content |
|---|---|
| `010_meta_usage_quota.png` | Muse Code → Usage with both windows and the refresh control |
| `020_usage_refresh_result.png` | the same tab after a click, showing the success status |
| `030_accounts_refresh_button.png` | Accounts tab control for a pooled OAuth provider |
| `040_accounts_refresh_result.png` | Accounts tab after a click |
The Accounts and Usage captures were subsequently removed from the current tree.
Both came from a real operator profile; retaining either surface is unnecessary
for the behavioral evidence above. This applies the same retention rule to both
surfaces without claiming that the Usage captures were independently cleared of
personal information. Git history is unchanged.

## CI (PR #3448, head 232afdd97)

Expand Down
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading