Tool chrome visibility uses two names and two polarities
- Status: Todo
- Kind: Enhancement
- Authors: jp
- Date: 2026-09-07
The same question is asked twice with different words pointing in opposite directions:
[style.tool_call]
show = false # global: hide tool chrome
[conversation.tools.cargo_test.style]
hidden = true # per-tool: hide tool chromeshow = false and hidden = true mean the same thing. A reader has to remember which level uses which word and which way round it points, and the two are ANDed at turn_loop.rs:
let tool_chrome_visible = cfg.style.tool_call.show && !tool_style.hidden;The two-level gate itself is right and RFD 095 documents it deliberately — a global switch with a per-tool exemption. Only the naming is accidental.
Why it matters now
RFD 091 adds a second two-level gate for the progress window, and it had to pick a side:
[style.tool_call.progress]
stderr_rows = "auto" # global: is there a window, how tall
[conversation.tools.cargo_test.style]
print_stderr = false # per-tool: does this tool feed itThat pair is positive at both levels, which is the convention this ticket proposes to settle on. Left alone, the config tree has one gate reading show/hidden and another reading stderr_rows/print_stderr, and neither tells a reader which is the house style.
Fix
Settle on the positive form at both levels, so the per-tool key becomes show and inverts:
[conversation.tools.cargo_test.style]
show = false # was: hidden = trueDouble negatives in config are worse than the inconsistency, which is the argument for positive over renaming the global to hidden.
Both keys are released and in use — .jp/config/personas/committer.toml sets tool_call.show = false, and the RFD-pipeline personas set per-tool hidden — so this needs a deprecation path, not a rename in place: accept hidden as an alias that warns, and drop it a release later.
Watch for
DisplayStyleConfig::hidden is read in six places in jp_cli (coordinator.rs, print.rs, turn.rs) and the polarity flips at each.
conversation.tools.'*'.style.hidden fills field-by-field into each tool (ticket 042d6hq), and ToolsConfig::to_partial subtracts the '*' block from each tool's style using equality. An alias has to resolve before that subtraction or a tool setting hidden and a '*' block setting show will not compare equal.