Article VII Tier 5 currently lists four hard-coded path conventions
(AGENTS.md / CLAUDE.md / .codewhale/instructions.md / .deepseek/instructions.md)
as the canonical Local Law sources. Embedders that inject instructions via
`EngineConfig.instructions` (rather than placing files at one of those four
paths) get their files classified by path — and since their paths don't
match, the model defaults to treating their imperatives as Tier 7 Memory
(the lowest tier per Article VII), overridable by a single user sentence.
Adds an explicit clause to Tier 5: '...and any file configured via
`EngineConfig.instructions` (rendered as <instructions source=...> blocks
above). ...embedder-declared imperatives are Local Law, not Memory
preferences.'
Pairs naturally with #2311 (InstructionSource enum) but stands alone — this
is a doc/law clarification, not an API change.
Adds `local_law_tier_covers_engine_config_instructions` test pinning the
new clause's presence.
The environment block (`platform`, `shell`, `pwd`, `lang`) was inserted
above the volatile-content boundary as a workspace-static cache layer. The
original comment claimed 'workspace path is fixed for the run' → static-
cacheable — true for the terminal use case where one process owns one
workspace for its lifetime.
It is **not** true for embedders that swap workspaces between sessions:
- IDE/GUI integrations binding the engine to a per-tab workspace
- Multi-engine pools with one engine per session
- Anything sending Op::SyncSession with a new workspace
For these embedders, `pwd` drifts session-to-session, dragging the entire
static prefix (mode prompt, project context, skills, context management,
compact template) out of cache reuse on every session switch. That's a
~30KB+ cache miss for a few-byte path change.
Moves the environment block below the volatile-content boundary, alongside
the configured `instructions = [...]` block. Effect:
- Static prefix stays byte-stable across sessions even when workspace
changes (better KV prefix cache hit rate)
- Model still sees `pwd` / `platform` / `shell` (needed for exec_shell
and structured search tools), just in a slightly later position
- No behavior change for terminal callers (workspace fixed → block content
unchanged → still in same logical place, just below the boundary)
Added a comment explaining the per-session-workspace motivation.
The general-purpose sub-agent intro tells the agent how to plan, but says
nothing about when to *stop*. With less capable models this leads to a
failure mode where the agent retries the same failing tool call (e.g. an
unreachable or rate-limited external API) over and over until it hits the
elapsed/step ceiling, wasting the whole budget and returning nothing useful.
Add two short clauses to GENERAL_AGENT_INTRO:
- Stop quickly on failure: after the same call fails twice, return partial
results with a one-line note instead of looping.
- Bounded effort: prefer one focused attempt; if the task can't be completed
within a few tool calls, return current findings so the parent can compensate.
Prompt-only change; no behavioral code paths touched.
Keep the /statusline picker selection visible when navigating through all
available footer items in smaller terminal windows.
The picker now scrolls its visible rows as the cursor moves, wraps Up/Down at
the list edges, and renders the selected row with a continuous, slightly
brighter background.
The right-click context menu rendered all entries in English regardless of ui_locale. Added 26 MessageId variants with translations for en, ja, zh-Hans, zh-Hant, pt-BR, es-419. ContextMenuView now accepts a localized title. build_context_menu_entries() uses app.tr() instead of hardcoded strings.
Treat inputs like `/ hello` as plain user messages instead of slash commands.
This lets users start a message with a literal slash while preserving normal
slash command behavior for `/help`, `/model ...`, and other commands.
Run the stdio MCP server inside a blocking section when launched from the async CLI entrypoint.
This prevents Tokio from panicking when the MCP server's internal runtime is dropped after stdin closes.
Replace the incorrect CodeWhale backend example in /provider help text with DeepSeek.
CodeWhale is the app name, while deepseek is the actual provider id accepted by /provider.
Add a regression test for shipped locale descriptions.
Make the /provider modal size itself to the provider list when space allows,
and scroll the rendered list when the selected provider moves past the visible
rows.
Also make the selected row use a continuous, subtle highlight so the current
selection remains visible without looking disconnected.
Adds regression coverage for bottom providers, initial bottom selection, full
height rendering, and selected-row highlighting.
Add /new to start a fresh saved session from the TUI without overloading /clear.
The command creates a distinct session id, resets conversation state, and keeps
previous sessions available through /resume.
Block unsafe switches when pending input or active work exists, with /new --force
available for explicit discard.
PR #2076 deferred planning/checklist tools (checklist_write, update_plan,
task_create, task_list, task_read) to reduce catalog tokens, but the system
prompt actively instructs the model to use these tools. Without them in the
active catalog, the model cannot call them until it first discovers them via
tool_search, which it is not prompted to do for planning tools.
Keep these tools in DEFAULT_ACTIVE_NATIVE_TOOLS so the model can follow
the Constitution's Regulations (Tier 3) and the Mode: YOLO instructions.
- Replace visible_line_char_ranges with wrap_input_lines_for_mouse for accurate mouse selection
- Clamp selection_anchor and cursor_position to char_count
- Clear selection on history navigation to prevent stale highlights
- Add test for history-navigation-clears-stale-selection
- Use OwnedRwLockReadGuard for parallel-safe tools, OwnedRwLockWriteGuard for serial
- Add TOOL_EXECUTION_LOCK_HELD task-local for reentrancy detection
- Add BlockingHandler test harness and parallel-vs-serial concurrency tests
- Line-wrap long function signatures and format arguments
- Fix bracket placement for early returns (consistent style)
- Use [!] instead of [✓] for network-denied skill sync
- Fix copy-selection ordering: clear after success, not always
- Add SharedGoalState and goal tools (goal.rs) to the engine
- Sync goal state from host on engine init and goal-objective change
- Wire goal_objective through prompt context and system-prompt refresh
- Add continuation.md prompt for bounded task continuation
- Register goal tools in the tool registry
- Add continuation gate tests in engine/tests.rs
- Add FailureCategory enum for command-exit, network, sandbox, timeout, etc.
- Module is deliberately pure: no file reads, caller-provided records only
- Added as dead_code module, wired for future diagnostics integration
- Replace giant tool-result strings in session JSON with TOOL_OUTPUT_RECEIPT markers
- Reference artifact records by id for retrieval after session load
- Compact on save, checkpoint, load, and load_by_id paths
- Wire tool_output_receipts module into session_manager
- Add tests for compaction-on-save and legacy-load-then-compact paths
- Add show_thinking flag to PromptSessionContext
- When show_thinking=false, emit hidden-thinking English instruction
- Omit locale-reinforcement bookends when user can't see thinking blocks
- Keep final-visible-reply language rule unchanged
- Add test for hidden-thinking language directive
- Track tool catalog as a static layer in prompt inspection
- Include tools in cache-warmup request with tool_choice=none
- Ensure tool schema changes are visible to base-static-prefix diagnostics
- Factor test_tool helper for cache-inspect test coverage
- Add env guard with process-global mutex for ALLOW_INSECURE_HTTP tests
- Document LAN vLLM HTTP example in README
- Add config test for reported LAN HTTP endpoint + model resolution
- Guard validate_base_url_security tests against env leak
- Test that edit_file accepts calls with fuzz omitted, fuzz=false, and fuzz=true
- Verify fuzz is excluded from schema required fields but present as optional boolean
- Add agent-mode catalog test confirming edit_file is loaded and fuzz-less calls execute
- Update existing required-fields assertions to check for exactly path/search/replace