Commit Graph
2878 Commits
Author SHA1 Message Date
ciregenzandClaude Opus 5 e5e8da37ac [eric] agents: a provider's error never reaches the user as the agent's own words
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 12:22:34 -07:00
ciregenzandClaude Opus 5 18b83d9697 [eric] build: the signing preflight must not assume a keychain exists
The pin added earlier read the local keychain unconditionally, which was right
for publish.sh and wrong for release-macos.yml: on CI the cert arrives as a
base64 .p12 in CSC_LINK and electron-builder imports it into a temporary
keychain LATER than this preflight runs, so the probe would have found nothing
and aborted every CI mac build before it started. Fixed by branching on where
the cert actually comes from -- keychain locally, the .p12 itself on CI -- and
running the profile check against whichever cert that resolves to, since both
sources can drift from the embedded profile.

Verified with controls on both paths: the .p12 reader returns the true SHA-1 of
a synthetic cert and returns nothing (rather than a bogus hash) under a wrong
password, and the local path still passes against the live cert and profile.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 11:49:01 -07:00
ciregenzandClaude Opus 5 00e4336b71 [eric] build: rebind the embedded profile to the live signing cert
The profile shipped with the app listed only the certificate whose private key
was lost with the old Mac, so it would have signed the new build without
complaint and then dropped keychain-access-groups at runtime, taking passkeys
and Touch ID with it. Regenerated against the cert we can actually sign with;
the preflight added alongside it now refuses any build where the two disagree.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 11:40:00 -07:00
ciregenzandClaude Opus 5 e15b0dc8a1 [eric] build: prove the signing identity before packing, not after
find-identity reports five entries all named "Developer ID Application: Haik
Decie (Y26NUZH4NG)": one live cert and four copies of the one whose private key
died with the old Mac. The dead copies still report valid and only fail at the
moment they are asked to sign, so auto-discovery was a coin flip between a real
build and a crash forty minutes into packing a 4.8 GB .app. Pin by SHA-1, then
spend one scratch signature proving the key is actually usable.

The profile check is the same lesson applied to a quieter failure. entitlements
request keychain-access-groups, which macOS honors only when the embedded
profile lists the very cert that signed the app. A profile issued for the
previous cert signs without one complaint and then loses passkeys and Touch ID
at runtime: a green build that ships broken. Verified with both controls, the
old profile fails against the new cert and passes against its own.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 11:36:34 -07:00
ciregenzandClaude Opus 5 0f2543db65 [eric] agents: a finished turn always leaves the user something to read
Every silent-stop fix so far was a detector for a shape somebody had already
found in the field, which is why the class kept coming back wearing a new hat.
turn_spoke.py moves the question down a tier: at the one exit every terminal
path passes through, ask whether anything readable appeared since the user last
spoke, and if not, say the honest line. Cause no longer has to be enumerated for
the user to be answered.

proactive_prune.py is the hermes trigger we were missing. Their own tests say
our bug out loud: on a large window, a percentage-of-window compaction check
almost never fires, so aged tool output rides in history and is re-sent verbatim
every turn. Measured here, our shaping cut 0.0% at every session size; with a
fixed 60K-token cost trigger it cuts 88% at 12 turns, 93% at 30, 94% at 60. The
prompt-cache contract is load-bearing rather than optional, because our prune is
a rebuild: it commits only when it reclaims enough to pay for the busted prefix,
then disarms until history has regrown a full runway.

Also: lane preflight now treats only 401/403 as a dead credential, since
testStatus=="unavailable" conflated a throttled lane with a revoked one and told
users to reconnect a merely rate-limited Gemini; and awaiting_reconnect is
cleared when the retry budget is spent, so a stale flag can no longer muzzle the
floor and end an ask in total silence.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 11:36:34 -07:00
ciregenzandClaude Opus 5 9a7570092f [eric] agents: never spend a turn on a lane the router gave up on, and stop our own retries stacking cards
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 09:20:46 -07:00
ciregenzandClaude Opus 5 58e376496e [eric] agents: an outage parks the turn and resumes when the provider answers; OAuth connects survive a backend restart
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 08:39:41 -07:00
ciregenzandClaude Opus 5 d5934b1da1 [eric] agents: no turn ends silent, and a codex 401 waits out the rotation window
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 07:21:00 -07:00
ciregenzandClaude Opus 5 cc854d9c0f [eric] analytics: a test that installs its own sink still captures diagnostics
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 07:20:46 -07:00
ciregenzandClaude Opus 5 9014db8a75 [eric] release: package-lock catches up to 1.7.8-exp.20
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014wtspwSFzZmjCx9UNPAorQ
2026-08-20 07:20:35 -07:00
ciregenz 681818d008 [eric] release: bump to 1.7.8-exp.20 2026-08-19 17:25:04 -07:00
ciregenz 46fe42674f [eric] dictation: fn dead-key deadlock broken; a no-prompt IOHIDCheckAccess boot probe arms fn on granted machines and intent arming covers the rest (Haik, 99% of devices) 2026-08-19 17:24:23 -07:00
ciregenz 7a4af2c419 [eric] workflows: the restart-loop-guard pause notice called a nonexistent broadcast; it never reached the user (linter catch) 2026-08-19 17:24:23 -07:00
ciregenz a00f277821 [eric] agents: a retry re-failing identically bumps the existing error card instead of stacking clones 2026-08-19 17:24:23 -07:00
ciregenz 4be2f10d02 [eric] agents: every sub lane self-heals a mid-run token expiry before any card; codex retries wait out the rotation window instead of burning the one shot inside it 2026-08-19 17:24:23 -07:00
ciregenz cf7790ca3b [eric] agents: status flips to running BEFORE the user-message snapshot; a stale completed on disk hid follow-up-turn crashes from the boot detector (exp.19 drill catch) 2026-08-19 16:51:35 -07:00
ciregenz 455b8fa4d3 [eric] agents: MCP responses over the CLI's silent output ceiling get shrunk instead of dropped; a 340KB result line was written and never resolved, the lost-delegation class (ENG-327 root) 2026-08-19 16:43:38 -07:00
ciregenz cbfb8ea9b6 [eric] agents: the error path dispatches an armed self-heal continuation; the recap-free policy retry armed and then rotted because only the success path had a dispatcher (exp.19 drill catch) 2026-08-19 16:39:32 -07:00
ciregenz d9bf748add [eric] release: publish.sh auto-deletes a dangling remote tag when the release stays draft; a public tag over a draft 404s every experimental updater (ENG-319 chokepoint) 2026-08-19 16:13:07 -07:00
ciregenz 8f1ebf0942 [eric] telemetry: unit tests can no longer submit diagnostics to prod; seam-test envelopes were polluting the numbers we diagnose users with 2026-08-19 16:10:49 -07:00
ciregenz 575a4d05db [eric] release: bump to 1.7.8-exp.19 2026-08-19 15:44:37 -07:00
ciregenz 7e3a98e315 [eric] agents: a turn cut off by a dirty exit auto-resumes at boot, gated by a consecutive-crash breaker; a clean Cmd+Q keeps the manual chip (hermes #30719 pairing) 2026-08-19 15:36:01 -07:00
ciregenz 8c482aa351 [eric] agents: the session recap moves to the SYSTEM channel; history-as-user-text was the anti-distillation filter's exact target shape and no rewording made it safe (ENG-358 structural fix) 2026-08-19 15:29:09 -07:00
ciregenz da3c1be6ca [eric] agents: the recap-free policy retry arms on ANY fresh-session recap, not just post-compaction; the packaged drill caught the gate firing never (ENG-358) 2026-08-19 15:10:51 -07:00
ciregenz a1e1bc9aa9 [eric] updater: a feed 404 with experimental on stops claiming you are on the latest version; that lie fired during every publish window and read as no-updates-in-red to new users (ENG-319 class) 2026-08-19 14:47:59 -07:00
ciregenz 9b9a1472d1 [eric] release: bump to 1.7.8-exp.18 2026-08-19 14:17:04 -07:00
ciregenz 043a6efb4c [eric] system: out-of-loop OS-thread watchdog hard-exits a provably frozen event loop with stack forensics so Electron respawns a working backend (hermes #66892 lift) 2026-08-19 14:09:28 -07:00
ciregenz fd14cb3bdb [eric] apps: a preview whose dev server never binds shows an honest failure card with retry instead of spinning Starting preview forever (Alex's report) 2026-08-19 14:07:30 -07:00
ciregenz 108287eda4 [eric] agents: provider content-policy blocks are terminal (no snag flicker), recap-bearing sessions get ONE recap-free retry, and the recap reads first-person instead of a User:/Assistant: transcript that trips distillation filters (Alex's bricked chats) 2026-08-19 14:07:29 -07:00
ciregenz 160180624d [eric] workflows: restart-loop breaker pauses a schedule that was mid-fire in consecutive backend deaths during a boot storm (hermes #30719 lift) 2026-08-19 13:43:50 -07:00
ciregenz 6a1dbc4212 [eric] agents: recap ages history hermes-style instead of dropping it; stubs keep the re-runnable command, duplicates collapse, newest results survive verbatim (ENG-354 endgame) 2026-08-19 13:40:47 -07:00
ciregenz 39d8da2697 [eric] agents: a vanishing quit (nothing persisted) on a session that already silent-quit is claimed and compacted; the poke-storm hole the one-for-one repro exposed (ENG-354) 2026-08-19 11:41:02 -07:00
ciregenz a66b0b0eaa [eric] agents: a REPEAT silent quit compacts from a 40% floor; Haik's opus-5 quits at ~149K, under the 180K trigger, so the band fix alone missed his storms (ENG-354) 2026-08-19 11:32:29 -07:00
ciregenz 8ae3f94d20 [eric] browser: fast path refuses multi-page sweeps (3+ URLs deterministic + classifier rule); a grabbed sweep answered INSUFFICIENT from one read (ENG-355) 2026-08-19 08:00:40 -07:00
ciregenz dbb83ec237 [eric] release: bump to 1.7.8-exp.17 2026-08-19 00:07:23 -07:00
ciregenz e6d05dfb1b [eric] agents: RunToolScript (PTC): scripts chain allowlisted tools in one turn and only printed output enters context (hermes code_execution lift, ENG-354 lever) 2026-08-18 23:41:38 -07:00
ciregenz 8c2ebf0f21 [eric] release: bump to 1.7.8-exp.16 v1.7.8-exp.16 2026-08-18 21:36:16 -07:00
ciregenz a5e5c8db39 [eric] tests: free-trial revert target follows the new sonnet-5 default 2026-08-18 21:31:04 -07:00
ciregenz 16b8f21177 [eric] agents: a silent quit at high context compacts history and goes fresh before the nudge; re-sending the bloat just burned a nudge (ENG-354) 2026-08-18 21:17:57 -07:00
ciregenz 4f3e68c7ac [eric] agents: the 25s unwedge verifies the sidecar is actually wedged (heartbeat file) before shooting it; alive-but-slow gets 120s (ENG-353) 2026-08-18 21:13:47 -07:00
ciregenz f6b2352acc [eric] canvas: creating a docked app no longer yanks the camera to its stored rect; the mini card is already in the chat you're watching (ENG-352) 2026-08-18 20:59:00 -07:00
ciregenz 9327475c3a [eric] models: shipped defaults are Sonnet 5 (Anthropic) and GPT-5.6 Terra (OpenAI); explicit user picks untouched 2026-08-18 20:57:32 -07:00
ciregenz 3acbc2b882 [eric] release: bump to 1.7.8-exp.15 v1.7.8-exp.15 2026-08-18 19:51:03 -07:00
ciregenz 2a9f1a7024 [eric] canvas: two same-instant app creations can never fully cover each other; the clash pushes down the column (ENG-346) 2026-08-18 19:43:08 -07:00
ciregenz b9e357c082 [eric] models: heal ALREADY-stranded haiku defaults too, not just at migration time; Eric's own dev install carried one (ENG-343) 2026-08-18 19:29:16 -07:00
ciregenz 3c8abfc7fb [eric] tests: scan test pins the ENG-342 platform split; darwin skips TCC folders, others keep them 2026-08-18 19:17:59 -07:00
ciregenz 4c2db3bbb1 [eric] chat: docked mini cards are inert previews; drag from anywhere on the body, clicks stop leaking into the live page, wheel scrolls the transcript (ENG-348) 2026-08-18 19:12:36 -07:00
ciregenz 88d6c536cd [eric] dictation: app-scoped by default with a Dictate-anywhere opt-in, and the Input Monitoring prompt moves from install time to first dictation use (ENG-341) 2026-08-18 19:10:08 -07:00
ciregenz 123f71b8cb [eric] browser: RequestUserSignIn is a first-class tool; auth walls hand off to the user in place instead of killing the run (ENG-351) 2026-08-18 19:06:38 -07:00
ciregenz 201216d166 [eric] canvas: new app cards anchor on the nearest on-canvas ancestor and docked rects stop being invisible obstacles (ENG-346) 2026-08-18 19:04:56 -07:00