- runPrintMode dereferenced session.sessionManager before checking whether
plan.defaultOnStartup was even enabled, crashing partial-session harnesses;
the settings check now short-circuits first.
- Extended the print-mode session fakes with the settings/sessionManager
members every real session provides.
- Scoped the rpc-stdin-lock stderr assertion to non-load-notice lines: the
adversarial fixture's load failure is now legitimately surfaced (#4954)
and mentions the locked stream by design.
- Reverted the CURRENT_SETUP_VERSION bump (2 -> 1) introduced with the
default-model setup step (#5982): the new scene now only runs for fresh
installs instead of re-prompting every upgraded install once.
- Installs that already advanced to setupVersion 2 stay non-stale under
the cold-launch gate, so no repeat prompt either way.
Narrow the invalid-yield guard to !abortSent so array-typed incremental
yield sections no longer suppress the infinite-submit-loop abort; add
regression coverage for incremental yield followed by repeated malformed
terminal yields.
An idle worker's finalized last turn has duration set, so
calculateTokensPerSecond returned its completed rate indefinitely and the
status-line badge kept showing stale worker throughput instead of falling
back to the main session's rate. Gate the aggregation on isStreaming and
cover both the idle-worker and mixed idle/streaming contracts.
In /vibe mode the director is often idle while workers stream, so the
status-line tok/s badge showed a stale/zero rate even while parallel
workers were actively generating tokens. The badge now aggregates the
main session's live tok/s with every live vibe worker's tok/s, and
falls back to the main session's own cached rate when no workers are
streaming.
- Extract calculateTokensPerSecond to utils/token-rate.ts (neutral
location) so vibe/runtime.ts can depend on it without the render
layer depending on the heavy vibe/task graph.
- Add aggregateVibeWorkerTokensPerSecond to vibe/runtime.ts: sums
each live worker's rate via the shared calculator, returns null
when no workers are streaming so the main rate shines through.
- StatusLineComponent takes the aggregator via an injected
setVibeWorkerTokenRateProvider callback (wired in interactive-mode)
keeping the render layer off the vibe/task dependency graph.
- #getTokensPerSecond splits into #getMainSessionTokensPerSecond
(preserves the sticky per-assistant-message cache) plus the
worker-aggregation path, so the director-idle case no longer
short-circuits to null.
The interactive !/!! shortcut wrapped commands as `fish -l -c '…'`:
resolveUserShellConfig swaps in $SHELL but inherits the bash-oriented
["-l", "-c"] args, and ensureInteractiveShellArgs injected -i only
for zsh. A login fish fires `status is-login` blocks in user config
(agent/keychain setup, PATH mutation) on every command.
fish sources the same config.fish/conf.d files for interactive shells
as for login shells, so give fish -i and strip the inherited -l: user
aliases and functions (#1816) keep working without login-shell side
effects. zsh keeps -l -i since .zprofile is login-only.