Skip to content

docs(rfd): Update RFD 081 with ToggleScope, string allow_toggle values - #817

Merged
JeanMertz merged 3 commits into
mainfrom
rfd-081
Jun 30, 2026
Merged

docs(rfd): Update RFD 081 with ToggleScope, string allow_toggle values#817
JeanMertz merged 3 commits into
mainfrom
rfd-081

Conversation

@JeanMertz

Copy link
Copy Markdown
Collaborator

Replace DirectiveScope with ToggleScope throughout the design, and switch allow_toggle from a bool to a string enum: "any" (formerly true / Always) and "never" (formerly false / Never). The "any" spelling is deliberate — it cannot be confused with the legacy enable = "always" shorthand, which means the opposite (locked-on).

Clarify that Serialize operates on stored optional fields rather than effective_enable(), and that the bool shorthand is only emitted when both fields are set and allow_toggle is Always. A { state: Some(true), allow_toggle: None } therefore serializes as { state = true }, never true.

Expand the apply_tool_use validation note to explain this is a config-eligibility check, not a delivery guarantee, and that runtime mismatches (tool absent from the resolved list after MCP startup) are left to the runtime access-control track.

Move the assistant.tool_choice locked-off validation from config-resolution time to AppConfig::validate, which is the only validator that sees both assistant and conversation.tools.

Add a Phase 1 task to make deep_merge_toml recurse into inline tables (as_table_like_mut / as_table_like), fixing the case where jp config set conversation.tools.foo.enable.state ... against an inline enable = { ... } would silently drop allow_toggle.

Update the RFD cross-reference tasks to include RFD 056, 057, and 083 updates in Phase 4, and clarify that existing bool/string payloads written to conversation.tools.*.enable remain valid under the new deserializer.

…alues

Replace `DirectiveScope` with `ToggleScope` throughout the design, and
switch `allow_toggle` from a bool to a string enum: `"any"` (formerly
`true` / `Always`) and `"never"` (formerly `false` / `Never`). The
`"any"` spelling is deliberate — it cannot be confused with the legacy
`enable = "always"` shorthand, which means the opposite (locked-on).

Clarify that `Serialize` operates on stored optional fields rather than
`effective_enable()`, and that the bool shorthand is only emitted when
both fields are set and `allow_toggle` is `Always`. A `{ state:
Some(true), allow_toggle: None }` therefore serializes as `{ state =
true }`, never `true`.

Expand the `apply_tool_use` validation note to explain this is a
config-eligibility check, not a delivery guarantee, and that runtime
mismatches (tool absent from the resolved list after MCP startup) are
left to the runtime access-control track.

Move the `assistant.tool_choice` locked-off validation from
config-resolution time to `AppConfig::validate`, which is the only
validator that sees both `assistant` and `conversation.tools`.

Add a Phase 1 task to make `deep_merge_toml` recurse into inline tables
(`as_table_like_mut` / `as_table_like`), fixing the case where `jp
config set conversation.tools.foo.enable.state ...` against an inline
`enable = { ... }` would silently drop `allow_toggle`.

Update the RFD cross-reference tasks to include RFD 056, 057, and 083
updates in Phase 4, and clarify that existing bool/string payloads
written to `conversation.tools.*.enable` remain valid under the new
deserializer.

Signed-off-by: Jean Mertz <git@jeanmertz.com>
…ggle` values

Signed-off-by: Jean Mertz <git@jeanmertz.com>
…ggle` values

Signed-off-by: Jean Mertz <git@jeanmertz.com>
@JeanMertz
JeanMertz merged commit a373b2f into main Jun 30, 2026
15 checks passed
@JeanMertz
JeanMertz deleted the rfd-081 branch June 30, 2026 17:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant