Pi Project Update

Sample pod that summarizes changes to the Pi project [1] using the new git: source format. [1] https://github.com/earendil-works/pi

Cadence: Daily
Length: 2 minutes

Subscribe, Combine, Customize

Subscribe to this podcast
?Receive all episodes to this podcast in the apps below or anywhere that supports RSS.
Combine these episodes into your pod
?All episodes from this podcast will be fed into your own.
Sign up to add to your own podcast
Customize this pod with your own sources
?Use this if you want a brand new podcast with its own episodes using different sources.
Sign up to customize this pod

Sources

Episodes

Pi Project Update July 30: Pi Adds Comparative Eval Harness, Tightens OpenAI-Compatible Tool Calls
Created: July 30th, 2026 - 04:30 PT
Script

Here is today's Pi Project Update for Thursday July 30th. The lead story is a major step forward for Pi’s evaluation workflow. A merged change today adds a comparative Pi eval harness for the coding agent. It supports seeded, repeated comparisons across harnesses, reports score lift, and separates token, latency, and cost deltas. It also persists run artifacts and session snapshots, which should make it much easier to judge whether a prompt, provider, or extension change actually improves agent behavior instead of just feeling better in one test run. [1]

Provider correctness also improved. Yesterday’s fixes preserve original provider stop reasons across Anthropic, Bedrock, Google, Mistral, OpenAI-compatible, and Responses adapters. That gives Pi better raw diagnostic information when a model stops for a provider-specific reason. Another OpenAI-compatible fix preserves valid function-call arguments when a provider also emits an empty custom payload, preventing tool calls from being finalized with a blank `{ input: "" }` shape. Together, these are small but important reliability wins for tool-heavy sessions. [2]

On the interactive coding-agent side, Pi merged a cleanup today for `setToolsExpanded(false)`. Extensions that enforce collapsed tool output at startup will no longer produce a redundant “Tool output: collapsed” status when nothing changed. Yesterday, Pi also improved startup context display so file-backed `SYSTEM.md` and `APPEND_SYSTEM.md` entries are visible in the interactive Context section, making it clearer what instructions are actually in play. [3]

The issue queue shows where attention is going next: terminal stability, scrollback behavior, paste handling, extension failure isolation, provider retries, and safer defaults. Reports covered Windows Terminal scroll jumps, Termux multiline paste, broken extensions aborting startup, transient model catalog refresh failures, and requests for installable destructive-command guards. [4]

The broader trend is that Pi is moving from feature growth into operational hardening: better measurement, clearer provider errors, less noisy UI behavior, and more resilience around terminals and extensions. Thank you for listening to Pi Project Update from The Daily FM. See you tomorrow!

Source Evidence
  1. earendil-works/pi: development activity
    ...feat(coding-agent): add comparative Pi eval harness (merged 2026-07-30)
    ## Summary
    
    - add seeded, repeated multi-harness comparisons with score lift and separate token, latency, and cost deltas
    - snapshot native Pi sessions before temporary cleanup, register artifacts against the explicit Vitest test task, and index persisted runs in `runs.jsonl`
    - support per-harness model selection and system-prompt treatments
    - compare extension authoring with and without the full default Pi prompt using a non-gating deterministic judge
    - load extension dependencies correctly from TypeScript source, built Node, and Bun runtimes
    
    ## Testing
    
    - `npm run check` passes, with two unrelated existing TUI style infos
    - `npm test --workspace=@earendil-works/pi-evals` passes: 28 tests
    - coding-agent extension suites pass: 66 tests
    - `./test.sh` reaches the eval suite successfully, but exits...
  2. earendil-works/pi: development activity
    ...: preserve function arguments with empty custom payloads (merged 2026-07-29)
    Prefer valid function tool-call payloads when an OpenAI-compatible provider also emits an empty `custom` object. This prevents custom-tool finalization from replacing parsed function arguments with `{ "input": "" }`.
    
    Patch by @sunnyyoung.
    
    Fixes #7160
    Files: packages/ai/src/api/openai-completions.ts (+3/-4), packages/ai/test/openai-completions-tool-choice.test.ts (+49/-0)
    
    #7272 preserve providers raw stop reason (merged 2026-07-29)
    Adds `AssistantMessage.rawStopReason` and preserves provider original stop reasons.
    Improves certain cases of error messages.
    For mistral, change unmapped finish reasons to be "error" instead of "stop".
    
    fixes #7255
    Files: packages/ai/src/api/anthropic-messages.ts (+2/-1), packages/ai/src/api/bedrock-converse-stream.ts (+4/-1), packages/ai/src/api/google-gene...
  3. earendil-works/pi: development activity
    ...d. Reproduced.
    
    Fixed by making `setToolsExpanded()` return early when the requested state matches the current state, so startup extensions can safely enforce collapsed tools without noisy UI updates.
    
    The repro/regression test now passes.
    Files: packages/coding-agent/CHANGELOG.md (+4/-0), packages/coding-agent/src/modes/interactive/interactive-mode.ts (+2/-0)
    
    #7289 feat(coding-agent): add comparative Pi eval harness (merged 2026-07-30)
    ## Summary
    
    - add seeded, repeated multi-harness comparisons with score lift and separate token, latency, and cost deltas
    - snapshot native Pi sessions before temporary cleanup, register artifacts against the explicit Vitest test task, and index persisted runs in `runs.jsonl`
    - support per-harness model selection and system-prompt treatments
    - compare extension authoring with and without the full default Pi prompt using a non-gati...
  4. earendil-works/pi: development activity
    ...dels` succeeded 3/3 times in about three seconds.
    
    ### Steps to reproduce
    
    1. Use a network path where an individual `pi.dev/api/models/providers/*` request can transiently stall.
    2. Run `pi update --models`.
    3. One stalled request causes the global 15-second refresh timeout.
    
    A direct curl test showed 4/10 requests succeeding and 6/10 stalling after TLS, demonstrating that retrying is necessary on this network path.
    
    ### Expected behavior
    
    Retry transient catalog request failures within the existing outer refresh deadline. Aborting the outer signal should immediately stop all attempts.
    
    ### Version
    
    Pi 0.83.0, Node 26.5.0, macOS 26.6 arm64
    
    #7322 Single broken extension aborts pi startup with process.exit(1) instead of degrading gracefully (closed 2026-07-30)
    ## Summary
    
    When a single extension fails to load (syntax error, parse error, runtime error during factory ex...
Sources
    Pi Project Update July 29: Pi Fixes Worktree Instructions, llama.cpp Streaming Token Counts
    Created: July 29th, 2026 - 04:30 PT
    Script

    Here is today's Pi Project Update for Wednesday July 29th. The biggest fresh development is a set of reliability fixes for Pi’s coding agent and terminal interface. A merge today fixes nested Git worktrees loading the same AGENTS.md or CLAUDE.md twice. That matters for users running Pi inside generated or nested worktrees, because duplicate project instructions can waste context and potentially steer the model twice with the same guidance. [1]

    Provider and validation work also moved forward. Pi updated TypeBox to 1.3.7 to fix validation of nullable array schemas, such as tool arguments that allow either an array or null. The maintainers note this can be technically breaking for extensions that still rely on deprecated TypeBox APIs, so extension authors should check for old aliases like Type.Promise or Value.Mutate. In the same provider-reliability lane, the llama.cpp integration now requests streaming usage data. Before this fix, streamed llama-server responses could record zero tokens, making `/session` stats misleading. After the change, Pi can capture real usage counts, including cached token details. [2]

    The TUI received another practical hardening fix today: image fallback text now shortens home paths, supports file hyperlinks when available, and clamps long fallback lines to the terminal width. Previously, a long absolute image filename could overflow the render width and crash the terminal UI. That pairs with a wider issue backlog around TUI polish, including reports about wrapped hyperlinks, scroll jumping during long parallel bash runs, and rendering math-like Markdown safely. [3]

    Finally, the issue queue shows continued attention to edge cases in real workflows: dash-prefixed prompts being mistaken for flags, strict OpenAI-compatible Responses endpoints rejecting replayed assistant status fields, and custom context-window settings that can trap sessions in a compaction loop. [4]

    The trend is clear: Pi’s recent work is less about flashy new features and more about making agent sessions predictable across local models, strict provider APIs, terminal quirks, worktrees, and extensions. That is the kind of plumbing that makes daily use feel calmer. Thank you for listening to Pi Project Update from The Daily FM. See you tomorrow!

    Source Evidence
    1. earendil-works/pi: development activity
      ...under its main repo(e.g. repo/.claude/worktree/foo) loaded the project's AGENTS.md/CLAUDE.md twice. The ancestor walk climbs from cwd to the filesystem root, so it picked up the worktree's copy and then the main repo's copy above it, even though both are the same tracked file.
      
      The walk now drops that one duplicate: the main repo root's copy is skipped when the worktree root has a context file of the same name. Nothing else changes. The worktree still inherits the main repo's copy when it has none, directories above the main repo keep loading, and ordinary repos, sibling worktrees, submodules and bare layouts are untouched.
      
      Fixes https://github.com/earendil-works/pi/issues/7171
      Files: packages/coding-agent/src/core/footer-data-provider.ts (+2/-2), packages/coding-agent/src/core/resource-loader.ts (+33/-2), packages/coding-agent/test/resource-loader.test.ts (+163...
    2. earendil-works/pi: development activity
      ...d.
      
      Fixes https://github.com/earendil-works/pi/issues/7171
      Files: packages/coding-agent/src/core/footer-data-provider.ts (+2/-2), packages/coding-agent/src/core/resource-loader.ts (+33/-2), packages/coding-agent/test/resource-loader.test.ts (+163/-1)
      
      #7243 fix(ai): update TypeBox nullable array validation (merged 2026-07-29)
      Fixes #7003
      
      Bump TypeBox to 1.3.7 which solves some error around schema with array[T] | null.
      
      Technically can be breaking change, TypeBox 1.3 removes deprecated APIs including Type.Base, Type.Awaited, Type.Promise, Type.AsyncIterator, Type.Iterator, Type.Options, and Value.Mutate. Extensions using these through Pi's bundled TypeBox aliases must migrate to supported TypeBox APIs.
      Files: package-lock.json (+6/-6), packages/agent/package.json (+1/-1), packages/ai/package.json (+1/-1), packages/ai/test/validation.test.ts (+13/-0), packages/co...
    3. earendil-works/pi: development activity
      ...ge.json (+1/-1), packages/ai/package.json (+1/-1), packages/ai/test/validation.test.ts (+13/-0), packages/coding-agent/install-lock/package-lock.json (+6/-6), packages/coding-agent/npm-shrinkwrap.json (+6/-6), packages/coding-agent/package.json (+1/-1)
      
      #7262 fix(tui): shorten image fallback paths and clamp width (merged 2026-07-29)
      Image.render() previously emitted the imageFallback line without truncateToWidth. Long absolute paths (common when callers pass a filename) exceeded the terminal width and crashed the TUI.
      
      - imageFallback: home-shorten paths to ~/...; OSC 8 file:// link when hyperlinks are available and the path is absolute
      - Image.render: truncate fallback lines to the render width
      - tests for shorten, hyperlink, basename, and width clamp
      Files: packages/tui/src/components/image.ts (+3/-2), packages/tui/src/terminal-image.ts (+30/-1), packages/tui/te...
    4. earendil-works/pi: development activity
      ...first `content_block_start[type=thinking]` event. And if real thinking content comes or thinking has finished it hides `Thinking...`.
      
      ### Version
      
      0.82.1
      
      #7263 openai-responses: replayed assistant history includes status and fails against strict-compatible endpoints (closed 2026-07-29)
      ## Summary
      
      Pi fails on the second and later turns when an OpenAI-compatible `/v1/responses` endpoint rejects `status` on replayed `input` items.
      
      The first turn succeeds because there is no assistant history to replay. A new session appears healthy until its first follow-up request.
      
      ## Environment
      
      - Pi: `0.82.1`
      - Provider/API: `openai` / `openai-responses`
      - OS: Windows 11
      - Endpoint: strict OpenAI-compatible Responses endpoint
      
      ## Error
      
      ```text
      Error: Error Code invalid_request_error:
      [ObjectParam] [input[70].status] [unknown_parameter]
      Unknown parameter: 'input[70].status'.
      ``...
    Sources
      The Pi Update July 28: Pi Hardens Agent Sessions, Z.AI Tokens, Bedrock Credentials
      Created: July 28th, 2026 - 13:20 PT
      Script

      Here is today's The Pi Update for Tuesday July 28th. Pi’s coding-agent work is moving quickly today, with a cluster of fixes aimed at making interactive sessions safer and less surprising. A notable merge keeps `/tree` available while an agent response is streaming, but now asks for explicit confirmation before interrupting the agent and switching checkpoints. That should reduce the “weird stuff happens” class of bugs when users inspect history mid-response. The model selector also got a small but useful usability fix: when you type to filter models, the highlighted selection now resets to the top match instead of staying wherever it was. [1]

      Provider reliability was another major theme. Pi now sends `max_tokens` for Z.AI-compatible providers, after testing showed Z.AI ignores `max_completion_tokens`; that mismatch could lead to long reasoning turns being truncated mid-tool-call. Amazon Bedrock users also get a credential fix: when a Bedrock profile is configured through Pi, it now takes priority over ambient AWS keys, avoiding cases where the wrong credentials silently override the intended profile. [2]

      Extensions also got important attention. RPC-mode bash commands now emit and honor the same `user_bash` extension event as interactive `!` commands, closing a guardrail gap where policy extensions could be bypassed programmatically. Extensions can also now read the session’s scoped model list through `ctx.scopedModels`, making it easier to build model pickers or companion tools without reimplementing Pi’s filtering logic. A related resource-loader fix preserves skill, prompt, and theme metadata after extension-driven resource reloads. [3]

      Finally, install and maintenance edges are being cleaned up. Failed git extension installs now remove partial files instead of poisoning future attempts, and the project added documentation around a durable AgentHarness design. [4]

      The broader trend is clear: Pi is hardening the seams between interactive use, automation, provider adapters, and extensions. Expect fewer hidden differences between TUI and RPC behavior, and more stable extension ecosystems as those surfaces become more explicit and test-covered. Thank you for listening to The Pi Update from The Daily FM. See you tomorrow! [5]

      Source Evidence
      1. earendil-works/pi: development activity
        ...`pi install` created when the installation fails.
        
        Fixes #7189
        Files: packages/coding-agent/src/core/package-manager.ts (+13/-7), packages/coding-agent/test/package-manager.test.ts (+37/-1)
        
        #7211 fix(coding-agent): reset model selector selection to top row when filtering (merged 2026-07-28)
        Typing a model name in the /model selector only clamped selectedIndex to the filtered list length, leaving the highlight wherever it happened to be instead of moving to the best match. Reset selectedIndex to 0 when a non-empty query is present so the top row is highlighted in both the All and Scoped tabs. Keep the clamp behavior when the query is cleared.
        
        fixes #7209
        Files: packages/coding-agent/src/modes/interactive/components/model-selector.ts (+4/-1), packages/coding-agent/test/suite/regressions/7209-model-selector-filter-resets-selection.test.ts (+128/-0)
        
        #7214 fix: rpc...
      2. earendil-works/pi: development activity
        ...error](https://github.com/earendil-works/pi/actions/runs/30335599597/job/90199680073), fails CI build.
        Files: packages/coding-agent/src/modes/interactive/interactive-mode.ts (+1/-0), packages/coding-agent/test/trigger-compact-extension.test.ts (+1/-0)
        
        #7176 fix(ai): prefer configured Bedrock profile over ambient AWS keys (merged 2026-07-28)
        ## Summary
        
        Bedrock profile configured via pi's auth flow was ignored when ambient `AWS_ACCESS_KEY_ID`/`AWS_SECRET_ACCESS_KEY` were set. pi forced `config.credentials` from those ambient keys, and the AWS SDK treats explicit credentials as overriding `config.profile`, so the configured profile never took effect.
        
        This changes Bedrock credential resolution to prefer the configured Bedrock profile over ambient AWS keys.
        
        Fixes #6957
        
        ## Changes
        
        - `packages/ai/src/api/bedrock-converse-stream.ts`: stop forcing `config.credentials` f...
      3. earendil-works/pi: development activity
        ...` commands. I reproduced it locally with a minimal guard extension, updated RPC bash handling to emit `user_bash` and honor intercepted results/operations, and the regression tests passed.
        Files: packages/coding-agent/src/modes/rpc/rpc-mode.ts (+15/-0)
        
        #7218 fix(coding-agent): preserve resource metadata after extension resource reloads (merged 2026-07-28)
        fixes #6968
        Files: packages/coding-agent/src/core/resource-loader.ts (+8/-4), packages/coding-agent/test/resource-loader.test.ts (+101/-0)
        
        #7215 fix(coding-agent): include scoped models in TUI extension context (merged 2026-07-28)
        There was a [TS error](https://github.com/earendil-works/pi/actions/runs/30335599597/job/90199680073), fails CI build.
        Files: packages/coding-agent/src/modes/interactive/interactive-mode.ts (+1/-0), packages/coding-agent/test/trigger-compact-extension.test.ts (+1/-0)
        
        #7176 fix(ai): prefe...
      4. earendil-works/pi: development activity
        ....0.0.1:8080` with a model named to match the one in the settings.json.
        3. Run `pi -p "hello"` (non-interactive) or `pi` (interactive).
        4. Observe `No models available.` error.
        
        ### Expected behavior
        
        pi should discover the llama.cpp model from the loc…
        
        #7189 Failed git extension installs poison the install directory for future attempts (closed 2026-07-28)
        ### What happened?
        
        If you attempt an install via `pi install git <blah blah>` but this fails for some reason (such as bad or missing configs in the git repo, private installations, etc.), the `~/.pi/agent/git/<>` directory is created but not fully initialized.
        
        Attempting future installs after this gives: 
        ```sh
         Installing git:github.com/<repo>...
         fatal: not a git repository (or any of the parent directories): .git
         Error: git rev-parse origin/HEAD failed with code 128: fatal: not a git repository (or any of the...
      5. earendil-works/pi: development activity
        ...bash extension event (closed 2026-07-28)
        ## Summary
        
        Extensions can intercept user-initiated bash commands via the `user_bash` event
        (docs/extensions.md, "User Bash Events": *"Fired when user executes `!` or `!!`
        commands. **Can intercept.**"*). This works in interactive mode, but in RPC mode
        the `bash` command is executed directly and the event is never emitted, so
        extension interception is silently skipped.
        
        ## Environment
        
        - `@earendil-works/pi-coding-agent` 0.81.1 (npm install)
        - macOS (Darwin 25.4)
        
        ## Expected behavior
        
        The RPC `bash` command is the programmatic equivalent of `!` in the TUI, so
        extensions listening on `user_bash` should get the same chance to intercept
        (or wrap operations) regardless of mode. The docs make no mode distinction.
        
        ## Actual behavior
        
        - **Interactive mode** — `dist/modes/interactive/interactive-mode.js`,
          `handleBashCommand()`: emi...
      Sources

        <- Back to library