Commit graph

1364 commits

Author SHA1 Message Date
iamtoruk
0090decf7d chore: bump to 0.9.20 2026-08-10 15:38:47 -07:00
Resham Joshi
e1d44f0f23
Merge pull request #964 from getagentseal/docs/changelog-aug10
docs(changelog): entries for the Aug 10 wave
2026-08-10 15:27:29 -07:00
iamtoruk
5b2251616c docs(changelog): entries for the Aug 10 wave (serve perf, parity, accuracy fixes) 2026-08-10 15:27:23 -07:00
Resham Joshi
84b2bcd857
Merge pull request #963 from getagentseal/fix/punchcard-tooltip
fix: punchcard tooltip cropping; remove menubar Workflow strip
2026-08-10 14:38:41 -07:00
iamtoruk
6cd11ab436 fix(app,dash): punchcard tooltip never crops; remove the menubar Workflow strip
- Punchcard tooltips flipped below the cursor on the top rows (the
  overflow container clips anything above its own edge) and clamp
  horizontally near the strip edges. Applied to both the app and dash
  copies of the component.
- The menubar Workflow strip is removed (view, strip model, tests):
  the popover is the compact surface and the workflow metrics live in
  the desktop app, dash and TUI. The payload keeps emitting the block
  (add-only contract; the other surfaces read it).
2026-08-10 14:35:40 -07:00
Resham Joshi
8df6c4f553
Merge pull request #962 from getagentseal/feat/surface-parity
feat(app,menubar): surface parity — punchcard in the app, PR spend in the menubar
2026-08-10 14:32:30 -07:00
iamtoruk
411d52f924 feat(app,menubar): surface parity — Spend punchcard in the app, Pull requests strip in the menubar
The release's new capabilities were unevenly surfaced: the Spend
punchcard existed only on the web dashboard, and the menubar decoded
nothing of the PR-attribution block the payload already carries.

- Desktop app: new Punchcard component (hour-of-day x weekday spend
  matrix, ported from the dash and restyled to the app's tokens) on the
  Spend page. Fed by a dedicated getTimeline bridge channel that fetches
  the payload WITH history.timeline; every other fetch keeps the lean
  --no-timeline path, and the serve child makes the extra fetch cheap.
  Hides gracefully when the payload has no timeline (older CLI).
- Menubar: PullRequestsSection renders the top three PRs by attributed
  spend under the Workflow strip; MenubarPayload now decodes the
  pullRequests block (decodeIfPresent, so older payloads are unchanged).
  Hidden when absent or empty.

Deliberately NOT ported: codex Tok/s (reads rollout files per session -
too heavy for payload cadence; stays a TUI/report analytics view) and
the punchcard in the menubar (a 7x24 matrix has no legible place in a
compact popover).

App suite 468 green (bridge channel pinned, mocks extended), swift
build + 156 tests green, CLI suite green.
2026-08-10 14:29:26 -07:00
Resham Joshi
9703e35e4e
Merge pull request #961 from getagentseal/fix/pr-cwd-time-bound
fix(pr-attribution): time-bound the working-directory correlation
2026-08-10 14:17:19 -07:00
iamtoruk
2262a82f51 fix(pr-attribution): time-bound working-directory correlation
The cwd evidence rule attributed ANY session sharing a checkout with a
PR-linked session, with no time bound - so a repo whose only captured PR
link was pasted once became a black hole: 129 of 131 sessions and a
month of unrelated work (~$7.4K direct, $11.2K displayed) attributed to
one PR, observed live on the desktop Pull requests tab.

Cwd anchors now carry the evidence sessions' own activity window (union
across evidence for the same PR set), and only sessions overlapping that
window plus a 6h pad inherit the PR. The rule's charter is 'a tool
session launched around PR work in this checkout', which is inherently a
same-working-stretch claim; the design's own philosophy (timestamps
narrow, never create) now applies to this rule too.

On the real corpus the row corrected to $450.87 / 21 sessions across the
PR's actual two-day working stretch. Regression pins both directions:
nearby same-cwd session inherits, weeks-later one never does; multiple
evidence sessions widen the window.
2026-08-10 14:13:57 -07:00
Resham Joshi
a887233cd9
Merge pull request #960 from getagentseal/perf/serve-fs-invalidation
perf(serve): event-driven parse reuse — a no-change fetch costs nothing
2026-08-10 14:07:04 -07:00
iamtoruk
555a1a89f5 perf(serve): event-driven parse reuse — a no-change fetch costs nothing
The remaining warm-serve cost was the per-request discovery sweep
(stat-ing thousands of session files) plus re-aggregation, even when
nothing on disk had changed. Serve now watches every provider's
probeRoots() via fs.watch (FSEvents-backed recursive watches on macOS)
and injects a quiet-since validator into the parser: while the watched
roots are quiet, a previous parse stays reusable past the burst window,
and an output-level memo returns identical panel queries verbatim - so a
fetch with no data changes skips the sweep AND the aggregation.

Safety rails, in order: a parse is validated-reusable only if the
watchers were armed before it ran; any filesystem event ends reuse
instantly; a 5-minute hard cap self-heals a missed event; a root that
fails to watch just goes uncovered (shorter reuse, never staleness);
outside serve the validator is never installed and behavior is
byte-identical. During an active AI session the session roots fire
constantly, so reuse correctly stays inside the 10s burst window - the
extended reuse serves the idle-browsing case it was built for.

The one watched path inside the cache dir is antigravity's statusline
file specifically, so serve's own cache writes never self-invalidate.
2026-08-10 14:04:01 -07:00
Resham Joshi
77e809a3ec
Merge pull request #959 from getagentseal/perf/web-prefetch
perf: web dashboard period prefetch + menubar serve client
2026-08-10 11:21:01 -07:00
iamtoruk
df05d7792e perf: web dashboard period prefetch + menubar serve client
Two more surfaces adopt the resident-serve pattern the desktop app got:

- Web dashboard: every period tab is prefetched sequentially right after
  startup, so the first click on 7d/30d/Month answers from the payload
  cache instead of paying a full parse; stale-while-revalidate rebuilds
  behind a served payload past 75% of the TTL so expiry never lands its
  multi-second parse on a user's click. Lifetime prefetches last.
- Menubar: ServeConnection (Swift actor) holds one codeburn serve --stdio
  child; status payload fetches route through it once warm, with the same
  contract as the app client — cold start and every failure keep the
  spawn path, three child deaths disable serve for the run, requests
  time out by killing the child, app termination shuts it down, and a
  pre-serve CLI (0.9.19) simply dies into permanent spawn fallback, so
  mixed-version installs degrade gracefully.

swift build clean, swift test 156/156, CLI tsc clean; verified live with
both the Electron app's and the menubar's serve children resident and
answering.
2026-08-10 11:17:59 -07:00
Resham Joshi
635299563b
Merge pull request #958 from getagentseal/fix/dash-oneshot-percent
fix(dash): one-shot rate showed 10000% in Model efficiency
2026-08-10 10:40:21 -07:00
iamtoruk
5bfc0e436c fix(dash): render modelEfficiency one-shot rate verbatim, it is already a percent
The payload's current.oneShotRate is a fraction but
modelEfficiency[].oneShotRate is 0-100 (the TUI and menubar render it
verbatim); the dash multiplied the latter by 100 again and showed
10000% / 8570% in the Model efficiency table. Caught live during the
release surface sweep.
2026-08-10 10:37:10 -07:00
Resham Joshi
8e61b205b3
Merge pull request #957 from getagentseal/fix/serve-hardening
Some checks are pending
CI / semgrep (push) Waiting to run
Tests / test (push) Waiting to run
fix(serve): close the resident-process staleness and growth holes
2026-08-10 10:06:10 -07:00
iamtoruk
cecb6239c6 fix(serve): close the resident-process staleness and growth holes
Adversarial review of the serve design surfaced three weaknesses a
one-shot CLI never had, because it never lived long enough:

- Pricing-affecting config (model aliases, price overrides, local-model
  savings) now participates in the parse memo key. Config reloads fresh
  per request (the preAction hook), but a memoized or burst-reused parse
  embedded costs priced under the OLD config; the widened key makes any
  such change an automatic memo miss. New alias-hash helper + tests.
- Memory guard: past 3GB RSS the serve loop drops its in-memory memos
  (session cache + parse entries) and the next request re-parses once.
  The child never exits for this, so the client's death budget is
  untouched.
- codeburn serve typed in an interactive terminal now explains itself on
  stderr instead of hanging silently on stdin.
2026-08-10 10:03:33 -07:00
Resham Joshi
da31f21a8d
Merge pull request #956 from getagentseal/perf/serve-stdio
perf: resident serve process — desktop panel fetches drop from ~7s to milliseconds
2026-08-10 09:46:53 -07:00
iamtoruk
d78ab77d96 perf: resident serve process for the desktop app — panel fetches in milliseconds
Every CLI spawn on a large corpus pays seconds of fixed cost before any
query work: node boot, a 100MB+ session-cache JSON.parse, the discovery +
fingerprint sweep, and serve-time classification. The desktop app spawns
one CLI per panel fetch, so it pays that cost per panel.

codeburn serve --stdio is the same CLI kept warm: the app holds one child,
sends {id, args} per line, and gets the command's stdout back. Three layers
make it fast, each disabled outside serve so one-shot runs stay byte-exact:

- loadCache memo (session-cache.ts): the parsed cache object is reused
  while a stat() shows the file unchanged; saveCache updates it
  write-through. A rewrite by another process still forces a fresh read.
- burst reuse (parser.ts, CODEBURN_PARSE_BURST_MS, serve sets 10s): panel
  bursts anchor their range ends at their own new Date(), so the exact-key
  memo never hits in real traffic; within the window a re-anchored range is
  served by trimming the previous parse instead of re-running discovery.
- fresh commander program per request (main.ts buildProgram factory),
  because commander option state is sticky across parses.

The server allows only the app's read queries (status/overview/models/
sessions/compare/yield/spend/optimize/audit), refuses everything else
(client falls back to a spawn), serializes requests, and converts
process.exit into a caught signal. The app starts the child once at
startup; requests route through it only when warm, cold-start keeps the
spawn path with its progress events, any serve failure falls back to a
spawn, and three child deaths disable serve for the app run.

Measured on a real 17B-token corpus: panel fetches drop from ~7.4s per
spawn to 5-900ms warm (sessions/spend 5ms, status 898ms). One-shot CLI
output verified byte-identical against the pre-branch baseline.
2026-08-10 09:43:44 -07:00
Resham Joshi
d302846453
Merge pull request #955 from getagentseal/fix/868-activate-only
fix(menubar): activate before creating the status item, policy pinned (#868)
2026-08-10 06:25:20 -07:00
iamtoruk
1ba09dc423 docs(menubar): correct the activation-policy comment the #868 probe disproved 2026-08-10 06:21:37 -07:00
ozymandiashh
0c8cb9e8eb experiment(menubar): activate before setupStatusItem, no policy transition
Test build for #868. Keeps the activation policy pinned at .accessory
(LSUIElement makes the :92-96 call a no-op in packaged builds anyway) and
restores only the NSApp.activate(ignoringOtherApps: true) half of the
#147 fix, immediately before the status item is created.
2026-08-10 06:20:49 -07:00
Resham Joshi
0af7c00e30
Merge pull request #954 from getagentseal/fix/941-bash-read-verify
fix(insights): count read-shaped shell commands as reads, not as verification
2026-08-10 06:10:52 -07:00
iamtoruk
1103ca77a5 fix(insights): count read-shaped shell commands as reads, not as verification (#941) 2026-08-10 06:07:27 -07:00
Resham Joshi
7fd9015c72
Merge pull request #783 from getagentseal/feat/dash-workflow-punchcard
dash: Workflow panel and Spend punchcard
2026-08-10 04:52:55 -07:00
iamtoruk
b55a14542e Merge remote-tracking branch 'origin/main' into feat/dash-workflow-punchcard 2026-08-10 04:52:29 -07:00
Resham Joshi
93402f2392
Merge pull request #786 from getagentseal/feat/tui-workflow-titles
tui: Workflow panel, rotating coaching notes, titles in the context browser
2026-08-10 04:52:15 -07:00
iamtoruk
44082c3d1f Merge remote-tracking branch 'origin/main' into feat/tui-workflow-titles
# Conflicts:
#	src/dashboard.tsx
2026-08-10 04:51:55 -07:00
Resham Joshi
e7a3313cb9
Merge pull request #951 from getagentseal/feat/tui-wheel-scroll
feat(tui): mouse-wheel scrolling for the dashboard viewport
2026-08-10 04:51:18 -07:00
Resham Joshi
c3e2f67d57
Merge pull request #952 from getagentseal/fix/correction-detector-prose
fix(insights): stop counting prose 'wrong answer' as a user correction
2026-08-10 04:51:15 -07:00
iamtoruk
f220bea73d fix(dash): floor pricing coverage so 100% means genuinely complete 2026-08-10 04:47:10 -07:00
iamtoruk
61f5e7c24f fix(tui): floor pricing coverage so 100% means genuinely complete 2026-08-10 04:46:39 -07:00
iamtoruk
420f1f051f fix(insights): stop counting prose 'wrong answer' as a user correction 2026-08-10 04:45:52 -07:00
iamtoruk
cf281a2fb1 feat(tui): mouse-wheel scrolling for the dashboard viewport via SGR mouse reporting 2026-08-10 04:41:34 -07:00
Resham Joshi
7b6757504f
Merge pull request #902 from ozymandiashh/chore/contributor-hygiene
chore: pin node via .nvmrc, add the new-provider checklist
2026-08-10 04:24:53 -07:00
Resham Joshi
240b583ad8
Merge pull request #907 from ozymandiashh/chore/gitleaks-allowlist
chore(security): add gitleaks allowlist after a clean full-history secret audit
2026-08-10 04:24:49 -07:00
iamtoruk
2532c0f743 Scope path-limited allowlists with condition AND; cover the example-JWT fixture
Gitleaks ORs an allowlist entry's conditions by default, so pairing a
fixture regex with a tests/ path allowlisted every finding under tests/,
regex or not - a real secret committed to a test file would have been
suppressed. condition = AND restores the intended semantics (verified: a
planted AWS/Stripe-shaped canary in tests/ is flagged again), and the
canonical example JWT header fixture that the path condition was silently
covering gets its own scoped entry. Full-history scan stays green.
2026-08-10 04:19:56 -07:00
Resham Joshi
3bf80c1e51
Merge pull request #949 from getagentseal/feat/openclaude-surfaces
feat(menubar): surface OpenClaude in the menubar and docs indexes
2026-08-10 04:15:27 -07:00
Resham Joshi
7423c4b24a
Merge pull request #950 from getagentseal/ci/test-scripts
ci: call the npm test scripts instead of duplicating their vitest strings
2026-08-10 04:11:33 -07:00
iamtoruk
dc8f3c2416 ci: call the npm test scripts instead of duplicating their vitest strings 2026-08-10 04:03:01 -07:00
Resham Joshi
a6446d94d8
Merge pull request #948 from therickfactr/fix/root-test-script-scope
Scope the root test script to tests/ so npm test runs from a clean install
2026-08-10 04:02:42 -07:00
iamtoruk
4e9c3771f0 feat(menubar): OpenClaude provider tab, change-guard watch root, docs index rows 2026-08-10 02:53:05 -07:00
Resham Joshi
9df25fa066
Merge pull request #903 from ozymandiashh/feat/899-proberoots-tier1
feat(doctor): probeRoots for 12 more providers (#899 Tier 1)
2026-08-10 02:49:47 -07:00
Resham Joshi
60a8b29103
Merge pull request #905 from ozymandiashh/feat/213-openclaude-provider
feat(openclaude): OpenClaude CLI provider (#213)
2026-08-10 02:49:44 -07:00
iamtoruk
27eac2cca4 Merge main; declare openclaude in the env-declaration guard file map 2026-08-10 02:49:25 -07:00
Resham Joshi
5d66f073ad
Merge pull request #900 from ozymandiashh/fix/ink-win-strip-sync-escapes
fix(ink-win): strip synchronized-update escapes instead of exact-matching them
2026-08-10 02:48:17 -07:00
Resham Joshi
5a18e44ba2
Merge pull request #919 from ozymandiashh/fix/918-windows-shortcuts
fix(desktop): make keyboard shortcuts work on Windows and Linux
2026-08-10 02:48:13 -07:00
Resham Joshi
ad3b12bb4d
Merge pull request #908 from ozymandiashh/fix/swarm-robustness
fix(hardening): guard three malformed-input crashes (URL, timestamp, pricing entry)
2026-08-10 02:40:33 -07:00
Resham Joshi
c6548fc96f
Merge pull request #906 from ozymandiashh/fix/770-tz-carry-dedup
fix(daily-cache): surgical tz-migration de-dup for carried days (#770)
2026-08-10 02:30:12 -07:00
Resham Joshi
259c7b5708
Merge pull request #927 from ozymandiashh/fix/920-provider-env-fingerprints
fix(cache): declare the provider env overrides that must invalidate the cache
2026-08-10 02:30:08 -07:00