docs(rfc): plan mode to implemented — amendments folded on the way
The proposal survives contact with the code with three amendments, per the RFCs-are-proposals rule. (1) A mode transition logs a request/header-delta only when expressible: adding exit_plan_mode resorts the canonical tool list, and a pure reordering has no delta form, so entering plan mode logs the full fallback snapshot — the attributability claim holds either way. (2) The proposed/ skeleton converts to the implemented grammar: Proposal → Decision, the roadmap's staging (now history) drops to the standing Deferred list, and Acceptance criteria + Risks fold into Consequences (what holds, then the accepted costs, including the ACP v2 mode-removal migration). (3) The two recorded scenarios stay pending a with-key session, recorded in Deferred. The docs tail completes: the cookbook's plan-mode row upgrades from sketch to the shipped package, architecture.md gains the ctx.modes capability row (ceiling 1640 → 1650: a new capability service's table row does not fit the old budget), and every reference repoints to implemented/.
This commit is contained in:
@@ -6,4 +6,4 @@ Session modes: named, logged, per-agent policy states, with **plan mode** as the
|
||||
|---|---|---|
|
||||
| `mode/` | `mode/set` vocabulary + fold, the `ctx.modes` service (list/get/set with the turn-boundary flush), the soft layer (assemble filter + `mode:policy` section), the hard layer (`tools/pre-execute` deny-by-default gate), and the model-facing `exit_plan_mode` review tool | `ctx.modes` |
|
||||
|
||||
The mode in force is a pure function of the session log (`SessionEventMap['mode/set']`, last one wins), so resume and fork restore it with no extra machinery; the default mode is the absence of policy, keeping the plugin invisible until a mode is set. UIs read flips off `session/event`: the [stdio app](../ui/stdio-agent) exposes `/mode`, the [ACP bridge](../ui/acp) maps the vocabulary to the session-mode picker. RFC: [plan mode](../../docs/rfc/proposed/feature/2026-07-07-plan-mode.md).
|
||||
The mode in force is a pure function of the session log (`SessionEventMap['mode/set']`, last one wins), so resume and fork restore it with no extra machinery; the default mode is the absence of policy, keeping the plugin invisible until a mode is set. UIs read flips off `session/event`: the [stdio app](../ui/stdio-agent) exposes `/mode`, the [ACP bridge](../ui/acp) maps the vocabulary to the session-mode picker. RFC: [plan mode](../../docs/rfc/implemented/feature/2026-07-07-plan-mode.md).
|
||||
|
||||
@@ -39,4 +39,4 @@ The model-facing exit tool. Its single required argument is the plan text — a
|
||||
|
||||
Definitions are validated at load (`resolveConfig`): the built-in `plan` (read-only allowlist, `bash`/`subagent` excluded) merges unless overridden, `default` is rejected as a key, and allowlists may name not-yet-registered tools (registration is dynamic). An unknown name fails loudly at `set()` time.
|
||||
|
||||
RFC: [plan mode](../../../docs/rfc/proposed/feature/2026-07-07-plan-mode.md).
|
||||
RFC: [plan mode](../../../docs/rfc/implemented/feature/2026-07-07-plan-mode.md).
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
* A flush that changes what the last logged request header told the model
|
||||
* appends one coalesced `context/message` notice in the same frame.
|
||||
*
|
||||
* RFC: docs/rfc/proposed/feature/2026-07-07-plan-mode.md
|
||||
* RFC: docs/rfc/implemented/feature/2026-07-07-plan-mode.md
|
||||
*
|
||||
* @module @deepseek-ai/dsh-mode
|
||||
*/
|
||||
|
||||
@@ -111,7 +111,7 @@ Tool-call presentation is **owned by each tool** (`presentCall` / `presentResult
|
||||
|
||||
## 6. Session modes / config options / models
|
||||
|
||||
Session modes ✅ (the [plan-mode RFC](../../../docs/rfc/proposed/feature/2026-07-07-plan-mode.md)): the picker maps 1:1 onto `dsh-mode`'s vocabulary — `ctx.modes.list()` fills `availableModes`, `session/set_mode` calls `set()` (pending intent, flushed at the turn boundary), and `current_mode_update` tracks both the optimistic echo and every logged flip. The division is picker-to-modes / knobs-to-config-options: individual environment knobs (sandbox mode, approval policy, the model) are NOT modes and belong to `session/set_config_option` — still unbuilt here, as is runtime model selection (the harness fixes the model per-bridge via `AcpConfig.model`). The ACP draft v2 direction reportedly slates session modes for removal in favor of config options; if that lands, the picker migrates mechanically (the mode state and both enforcement layers are wire-agnostic).
|
||||
Session modes ✅ (the [plan-mode RFC](../../../docs/rfc/implemented/feature/2026-07-07-plan-mode.md)): the picker maps 1:1 onto `dsh-mode`'s vocabulary — `ctx.modes.list()` fills `availableModes`, `session/set_mode` calls `set()` (pending intent, flushed at the turn boundary), and `current_mode_update` tracks both the optimistic echo and every logged flip. The division is picker-to-modes / knobs-to-config-options: individual environment knobs (sandbox mode, approval policy, the model) are NOT modes and belong to `session/set_config_option` — still unbuilt here, as is runtime model selection (the harness fixes the model per-bridge via `AcpConfig.model`). The ACP draft v2 direction reportedly slates session modes for removal in favor of config options; if that lands, the picker migrates mechanically (the mode state and both enforcement layers are wire-agnostic).
|
||||
|
||||
## 7. Content blocks
|
||||
|
||||
|
||||
Reference in New Issue
Block a user