ytdb-slate 0.11.0 → 0.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/README.md +56 -241
  2. package/docs/blast-radius.md +22 -19
  3. package/docs/configuration.md +109 -0
  4. package/docs/context-budget.md +91 -60
  5. package/docs/delivery-packages.md +22 -16
  6. package/docs/design-principles.md +18 -3
  7. package/docs/model-routing.md +32 -16
  8. package/docs/pr-publishing.md +47 -79
  9. package/docs/review-common-policy.md +33 -0
  10. package/docs/review-implementation-input.md +19 -0
  11. package/docs/review-perspectives/cb.md +26 -0
  12. package/docs/review-perspectives/cn.md +20 -0
  13. package/docs/review-perspectives/du.md +21 -0
  14. package/docs/review-perspectives/gr.md +27 -0
  15. package/docs/review-perspectives/lx.md +19 -0
  16. package/docs/review-perspectives/nl.md +31 -0
  17. package/docs/review-perspectives/pf.md +20 -0
  18. package/docs/review-perspectives/pl.md +22 -0
  19. package/docs/review-perspectives/ri.md +24 -0
  20. package/docs/review-perspectives/se.md +20 -0
  21. package/docs/review-perspectives/tq.md +53 -0
  22. package/docs/review-perspectives/uf.md +27 -0
  23. package/docs/review-rules.md +37 -222
  24. package/docs/roadmap.md +32 -0
  25. package/docs/safety-and-trust.md +46 -0
  26. package/docs/track-workflow.md +106 -82
  27. package/docs/user-notes.md +15 -16
  28. package/docs/writing-guidance.md +50 -23
  29. package/extension/artifact-names.ts +29 -6
  30. package/extension/base-model.ts +1 -1
  31. package/extension/episodes.ts +12 -22
  32. package/extension/handoff.ts +66 -97
  33. package/extension/index.ts +33 -3
  34. package/extension/mode.ts +268 -83
  35. package/extension/notify.ts +1 -1
  36. package/extension/observations.ts +5 -4
  37. package/extension/paths.ts +17 -0
  38. package/extension/review-perspectives.ts +81 -0
  39. package/extension/slate-files.ts +48 -7
  40. package/extension/startup-summary.ts +113 -0
  41. package/extension/state.ts +75 -13
  42. package/extension/threads.ts +102 -23
  43. package/extension/tools.ts +18 -1
  44. package/extension/worker-extensions.ts +1 -1
  45. package/extension/worker.ts +50 -14
  46. package/extension/writing.ts +11 -3
  47. package/package.json +2 -2
package/README.md CHANGED
@@ -1,305 +1,120 @@
1
- # ytdb-slate: Agent orchestration for the pi coding agent
1
+ # ytdb-slate: multi-agent orchestration for the pi coding agent
2
2
 
3
3
  [![CI status](https://github.com/JetBrains/ytdb-slate/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/JetBrains/ytdb-slate/actions/workflows/ci.yml)
4
4
 
5
- **Slate is a thread-weaving orchestration extension for the [pi coding agent](https://pi.dev).** It helps you guide long coding tasks while focused worker sessions research, implement, and review bounded parts of the work.
5
+ Slate is a multi-agent orchestration extension for the [pi coding agent](https://pi.dev). You work in one interactive pi session, the main session. A bounded action is a focused task with a clear limit. A worker thread is an isolated pi session that researches, implements, or reviews changes. Slate sends bounded actions to separate worker threads. Each worker thread returns a short structured summary called an episode. A review workflow adds reviewers for risks that you approve or for work above a size threshold.
6
6
 
7
- You stay in the main session and decide what to build. Slate manages context, delegates actions, preserves useful results, and applies a risk-based development workflow.
7
+ ## What Slate does
8
8
 
9
- - [Start using Slate](#start-using-slate)
10
- - [Understand how Slate works](#how-slate-works)
11
- - [See the roadmap](#where-slate-is-going)
12
- - [Configure Slate](#configuration)
13
- - [Read the safety boundaries](#safety-and-trust)
14
- - [Open the complete reference](#shipped-docs)
9
+ - Gives each worker thread context for one action, not the full main-session history.
10
+ - Summarizes work at the action boundary. Summaries can omit details.
11
+ - Lets Slate adapt its plan after each result.
12
+ - Saves episodes for later worker threads to use by reference.
13
+ - Runs independent actions in parallel.
15
14
 
16
- ## Start using Slate
15
+ ## Quick start
17
16
 
18
- You need an installed and authenticated [pi coding agent](https://pi.dev/docs/latest/quickstart). From your project directory, install a pinned Slate version into the project:
17
+ You need an installed and authenticated [pi coding agent](https://pi.dev/docs/latest/quickstart). From your project directory, install a pinned Slate version:
19
18
 
20
19
  ```bash
21
20
  pi install -l npm:ytdb-slate@<version>
22
21
  ```
23
22
 
24
- The `-l` option records the package in `.pi/settings.json`. Pi may ask you to trust the project before it loads project settings and extensions.
23
+ The `-l` option records the package in `.pi/settings.json`. Pi may ask you to trust the project before loading its settings and extensions. Pi skips pins during `pi update --extensions` and `pi update --all`. Review the shipped workflow documents before moving the pin.
25
24
 
26
- Pinned package specifications such as `@<version>` are deliberately skipped by `pi update --extensions` and `pi update --all`. Moving the pin is a conscious project change. Review Slate's shipped workflow documents before you update it.
25
+ Slate has not reached version 1.0. Releases that change only the last number, for example 0.11.0 and 0.11.3, are compatible. A release that changes the second number, for example 0.12.0, can break compatibility. Review the release notes before you update.
27
26
 
28
- Start a new interactive pi session, then turn on orchestrator mode:
27
+ Start a new interactive pi session and let Slate delegate actions:
29
28
 
30
29
  ```text
31
30
  /slate on
32
31
  ```
33
32
 
34
- Try a request that gives Slate a clear outcome and leaves planning open:
33
+ Try a request with a clear outcome:
35
34
 
36
35
  ```text
37
- Add input validation to the account settings endpoint. First research the relevant code and tests. Show me the proposed tracks and risks before implementation.
36
+ Add input validation to the account settings endpoint. First research the relevant code and tests. Show me the proposed plan and risks before implementation.
38
37
  ```
39
38
 
40
- Slate will ask for required decisions before it edits code. It will delegate implementation work to worker threads after the workflow gates allow that work.
39
+ Slate asks for required decisions before editing code. It delegates work after workflow gates allow it. Slate shows a short workflow summary when orchestrator mode is on at interactive startup or when you turn it on. A saved `startupSummary: false` choice stops automatic display. The summary disappears when you send your first prompt to the model.
41
40
 
42
- To leave orchestrator mode, run `/slate off`. Running `/slate` with no argument toggles the mode. See [Everyday commands](#everyday-commands) for handoff, resume, and routing commands.
41
+ Run `/slate off` to stop Slate's delegation and remove the summary. `/slate summary off` also removes it. Toggling orchestrator mode off with `/slate` removes it too. Other slash commands leave it visible unless they reload or replace the session. `/reload`, `/new`, `/resume`, and `/fork` clear the panel when they reload or replace the session. Slate then shows it only when orchestrator mode is on and the saved choice allows automatic display. Run `/slate summary` to show it at any time. See [Commands](#commands).
43
42
 
44
43
  ## How Slate works
45
44
 
46
- Slate uses four terms throughout this README:
45
+ - **Main session and orchestrator:** the interactive pi session where you set goals and review results. In **orchestrator mode**, it delegates actions.
46
+ - **Bounded action:** focused work with a clear limit and expected result.
47
+ - **Worker thread:** an isolated pi session for one action. Follow-up work starts a new thread.
48
+ - **Episode:** a durable, structured summary of an action. It retains intent, actions, findings, artifacts, open issues, and handoff notes.
47
49
 
48
- - **Main session:** the interactive pi session where you set goals, answer questions, and review results. In orchestrator mode, this session acts as the **orchestrator**.
49
- - **Bounded action:** one focused unit of work with a clear limit and expected result.
50
- - **Worker thread:** a new isolated pi session that performs one bounded action. A follow-up action uses another new worker thread.
51
- - **Episode:** a durable, structured summary of one worker action. It retains intent, actions, findings, artifacts, open issues, and handoff notes.
50
+ Through `context`, later worker threads can receive earlier episodes without full transcripts. A model summarizes completed work and failed partial work. A worker thread that fails without a response receives a fixed episode instead. Summaries can lose details. [Design principles](docs/design-principles.md) and [model routing](docs/model-routing.md) explain the limits.
52
51
 
53
- The orchestrator dispatches bounded actions and adapts after each episode. A large language model compresses successful work and failed partial work into the episode. A failure without a worker response uses a fixed episode and no compression call.
52
+ Slate independently implements the thread-weaving architecture from the Random Labs technical report for `@randomlabs/slate`.
54
53
 
55
- Later actions can receive earlier episode identifiers through `context`. Slate loads those episodes into the new worker prompt. The main session can therefore compose prior results without re-reading every raw worker transcript.
56
-
57
- ### What Slate adds
58
-
59
- - **Context isolation.** Each worker receives the context for one action instead of the full history of the main session.
60
- - **Compaction at an action boundary.** Compression happens when the action ends. Compression remains model-performed and lossy, but the boundary is deliberate rather than forced by a full context window.
61
- - **Adaptive planning.** Control returns to the orchestrator after each episode. New evidence can change the next action.
62
- - **Composable results.** Episodes are durable records that later worker threads can use by reference.
63
- - **Parallel work.** Independent bounded actions can run in parallel while each action keeps its own worker context.
64
- - **Risk-based review.** User-approved risk proofs select workflow gates and agent reviewers instead of applying every review to every change.
65
-
66
- Slate follows the thread-weaving architecture introduced by the Random Labs technical report for its `@randomlabs/slate` agent. ytdb-slate is an independent implementation of that architecture for pi.
67
-
68
- The full rationale is in [`docs/design-principles.md`](docs/design-principles.md). If this summary and that document disagree, the document wins.
69
-
70
- ## Where Slate is going
71
-
72
- > **Planned work:** The two priorities below describe future changes. They are not current Slate features.
73
-
74
- Spend more time deciding what to build, and less time checking code or managing agents. We are working toward that goal with two priorities:
75
-
76
- 1. **Guide changes through design, not code.** Review the design without having to read the code yourself. We plan to add design documents at several levels, from system goals to component details, and keep them updated as work progresses. Agents will still review code quality and check that changes follow your approved design.
77
- Follow [#361](https://github.com/JetBrains/ytdb-slate/issues/361), [#402](https://github.com/JetBrains/ytdb-slate/issues/402), [#403](https://github.com/JetBrains/ytdb-slate/issues/403), and [#404](https://github.com/JetBrains/ytdb-slate/issues/404).
78
-
79
- 2. **Keep working while agents run.** Asynchronous threads will let the main session continue without waiting for each result. A redesigned terminal interface will make it easier to follow and control their work. Clear, accurate usage and cost reports will show where your resources go.
80
- Follow [#269](https://github.com/JetBrains/ytdb-slate/issues/269), [#296](https://github.com/JetBrains/ytdb-slate/issues/296), [#212](https://github.com/JetBrains/ytdb-slate/issues/212), and [#38](https://github.com/JetBrains/ytdb-slate/issues/38).
81
-
82
- ## Current workflow and behavior
83
-
84
- ### Feature development workflow
85
-
86
- In orchestrator mode, Slate injects a mandatory track-based development workflow. Project configuration can extend it through `doctrineExtraPath`. Configuration cannot replace it.
87
-
88
- Eleven focus areas name specific risks. They cover
54
+ A track is one coherent, independently mergeable part of a change. Slate supplies a track-based development workflow in orchestrator mode. Project configuration can extend the workflow rules but cannot replace them. Eleven focus areas name specific risks. They cover
89
55
  concurrency defects, data loss, security weaknesses, performance degradation,
90
56
  test-quality defects, unreadable user-facing prose, licensing exposure,
91
57
  non-local logic defects, consumer contract breaks, governing-rule defects, and
92
58
  unreported failures.
93
59
 
94
- During planning, the orchestrator writes an independent risk record for the change and for every track. Each record has one line for every focus area. A `NAMED` line carries a four-part proof. User approval makes that area proved. User rejection makes it `SKIPPED`. Only proved areas add gates or routine implementation reviewers. A track with at least one proved area gets one general Reviewer I plus every required area specialist. A track with no proved area gets no routine implementation reviewer.
95
-
96
- The workflow follows these steps:
97
-
98
- 1. **Plan and confirm.** The orchestrator proposes all eleven focus lines. The user alone approves or rejects each `NAMED` proof.
99
- 2. **Design.** A proved `DESIGN-TRIGGERING` area requires a high-level design. The user validates it before focus reconfirmation and one adversarial design review per proved `DESIGN-TRIGGERING` area. Final design approval follows.
100
- 3. **Implement tracks.** Each track is one coherent, independently mergeable unit with its own focus set. About 400 added plus removed lines is a planning guideline. The orchestrator estimates before splitting work. The implementer estimates during work and stops at a coherent boundary near the guideline. A small overrun may finish the nearest coherent unit and must include its reason. Lockfiles, migration files, and generated output do not count.
101
- 4. **Review and deliver.** When a track has a proved area, one Reviewer I and every required area specialist inspect it in separate review actions. A zero-area track reports routine implementation review as `NOT REQUIRED`. Tracks with a proved `DESIGN-TRIGGERING` area require blocking user acceptance. Other tracks do not. Where a marker applies, it follows required machine gates, the packet, and resolution of blocking user notes. Per-track mode uses the user-merged commit instead. Final change acceptance is always blocking.
102
-
103
- Draft pull request publishing activates only when `workflow.draftPRs` is `true`. The orchestrator then asks once whether every track gets its own pull request. A yes answer requires user merges in sequence and a fresh branch from updated `main` for each next track. A no answer keeps one umbrella draft pull request.
60
+ The orchestrator records risks for the change and each track. You approve or reject each named proof. Approved proofs select design gates and reviewers. A track with a proved risk gets one general reviewer and its required specialists. An implementer's approximate track size above 100 added plus removed lines also adds the general reviewer unless the track changes only documents that neither ship as code nor run. Lockfiles, migration files, and generated output do not count. A track that the orchestrator estimates above 100 such lines needs a high-level design before implementation, including when it changes only documents. A track with neither review trigger gets no routine implementation reviewer. See [workflow](docs/track-workflow.md) and [focus areas](docs/blast-radius.md) for the rules. Optional draft pull requests cover the whole change. Only you merge them.
104
61
 
105
- This summary provides orientation only. The [shipped workflow documents](#shipped-docs) are normative.
106
-
107
- ### Logical-model routing and recovery
108
-
109
- Every `thread` call names a provider-free logical `model` and a short `reason`. The active policy fixes effort, exact physical routes, capability and cost ratings, guidance, cautions, and bounded recovery order. Slate resolves one immutable policy when the parent session starts. Dispatch, compression, main-session recovery, doctrine, and `/slate effective` share it.
110
-
111
- The shipped ordinary pool has six definitions. A trusted project can replace membership, add complete definitions, replace selected fields, and exclude members. The independent compressor list defaults to Sonnet at `medium`. Untrusted projects use home preferences over the shipped policy and consume no project router data. Critical errors block logical work. Legacy physical-router keys produce named warnings and receive no automatic migration.
112
-
113
- Pi retries the active physical route first. Slate advances only after Pi reports known retry exhaustion. Recovery tries another permitted provider for the same logical model before it moves through the ordinary or compressor order. Unknown outcomes and cancellation stop recovery. One operation owns recovery. An overlapping operation receives a visible busy refusal. Slate does not queue or replay it.
114
-
115
- Pi 0.85.1 model and effort switches are session-only unless persistence is requested. Slate retains its saved-default compatibility guard for explicit persistence and older behavior. Slate retains bounded completed worker output when compression fails or is cancelled. A failed episode write can prevent an episode. A failed final state save can leave episode bytes without a proved durable reference. Both failures remain visible.
116
-
117
- A remembered later compressor starts later actions at that entry and does not move backward until preference reset. This is an accepted limitation. `extension/index.ts` is the supported package entry. Logical-runtime exports and retry-evidence exports are internal and unstable. Retry-evidence exports classify provider retry outcomes. [`docs/model-routing.md`](docs/model-routing.md) defines the complete contract.
118
-
119
- ### Writing guidance
120
-
121
- Writing guidance and checker findings are active in orchestrator mode when the project is trusted or a home configuration file exists. Slate adds one doctrine rule for writing and another for design discipline. It also adds a status value such as `writing 2 fail, 3 style / 10 turns` in interactive sessions. The value reports model-visible findings in the latest ten measured prose turns. Each worker with permitted Slate settings gets a shorter reminder about reader understanding, semicolons, and contractions.
122
-
123
- The guidance has prompt cost. Each orchestrator system prompt contains both doctrine rules. You pay for this text on every turn. Each worker with permitted Slate settings also gets the preamble addition.
124
-
125
- The shipped command checks plain files, JSON Lines records, and unified diffs. See [`docs/writing-guidance.md`](docs/writing-guidance.md) for its rules, limits, output, and command examples.
126
-
127
- Slate sends hidden reminders after completed turns. The default cadence is four completed turns. A model-visible finding can trigger an immediate reminder when that option is enabled. The reminder carries the writing and conversation title, three retained style rules, ten writing requirements, and seven design requirements. A findings section appears only when the latest measured turn carries a model-visible finding. The requirements exclude research logs, worker task text, and this project's agent instruction file.
128
-
129
- ## Everyday commands
62
+ ## Commands
130
63
 
131
64
  | Command | Current behavior |
132
65
  | --- | --- |
133
66
  | `/slate on` | Turn on orchestrator mode. Slate removes tactical tools from the main session and expects delegation through worker threads. |
134
67
  | `/slate off` | Turn off orchestrator mode and restore the earlier tool set. |
135
68
  | `/slate` | Toggle orchestrator mode. |
69
+ | `/slate summary` | Show the workflow summary in any mode, even when automatic display is off. |
70
+ | `/slate summary off` | Stop automatic display and remove a visible summary. |
71
+ | `/slate summary on` | Allow automatic display when orchestrator mode is on. |
136
72
  | `/slate effective` | Show the effective logical-model policy and remembered route selections. |
137
73
  | `/slate handoff [focus]` | Prepare a new-session handoff, with an optional focus. |
138
74
  | `/slate resume` | Clear a context-budget pause and accept user prompts again. |
139
75
 
140
- ## Community
141
-
142
- Join the [Slate Zulip community](https://youtrackdb.zulipchat.com/#narrow/channel/634235-slate) to share what you are building, ask for help, or discuss the project.
143
-
144
76
  ## Configuration
145
77
 
146
- ### Configuration files and merging
147
-
148
- Slate reads two optional configuration files at session start:
149
-
150
- - Home: `<getAgentDir()>/slate.json`, normally `~/.pi/agent/slate.json`. Pi's `PI_CODING_AGENT_DIR` environment variable can select another agent directory.
151
- - Project: `<cwd>/.pi/slate.json`, read **only when the project is trusted**.
152
-
153
- Project values override home values. Objects merge recursively. Arrays, scalar values, and explicit `null` replace the home value. Arrays never append. Slate applies its existing setting validators after the merge.
154
-
155
- A missing file is valid. An unreadable file, invalid JSON, or a root that is not an object produces a warning naming that file. Any such error in a permitted file blocks model routing, even when the other file is valid.
156
-
157
- Home preferences also apply in untrusted projects. Without a home file, existing project behavior and defaults stay unchanged. Configuration edits require a new session.
158
-
159
- Paths in `orchestratorPromptDocs`, `workerPromptDocs`, `doctrineExtraPath`, and `reviewPerspectivesPath` belong to the file that supplies the value. Relative home paths start at the agent directory. Relative project paths start at the project root, not `.pi`. Absolute paths stay absolute. See [Safety and trust](#safety-and-trust) for the security boundary.
160
-
161
- Pi can refresh a prompt cache by sending background requests. Slate disables those requests in every worker because they bypass its request limits. This does not disable prompt caching for ordinary worker requests. The main session and saved pi settings stay unchanged.
162
-
163
- ### Common starting point
164
-
165
- Create `.pi/slate.json` when you want new interactive sessions to start in orchestrator mode:
166
-
167
- ```json
168
- {
169
- "orchestratorModeDefault": true
170
- }
171
- ```
172
-
173
- The project must be trusted before Slate reads this file. Start a new session after any configuration change.
174
-
175
- ### Complete option reference
176
-
177
- | Key | Type | Default | Semantics |
178
- | --- | --- | --- | --- |
179
- | `orchestratorModeDefault` | boolean | `false` | Start fresh interactive sessions with orchestrator mode ON. |
180
- | `workerTools` | string[] | `["read", "bash", "edit", "write", "grep", "find", "ls"]` | Tools available to worker threads (an empty list also falls back to the default). |
181
- | `workerExtensions` | string[] | `[]` | Regex patterns (matched **unanchored**) selecting which of the host session's already-loaded extensions also load into every worker thread; each matched extension's tools are added **on top of** `workerTools`. Empty (default) means workers load no project or discovered extensions. Slate still supplies one internal reminder component. The orchestrator keeps its restricted tool set but its doctrine is told what was whitelisted. Invalid patterns are dropped with a warning at session start. |
182
- | `cacheKeyEnabled` | boolean | `true` | Add one OpenAI Responses prompt cache key to all workers in the current main Slate session. Another main session receives another key. `false` disables key injection. It does not disable request throttling. Provider requests with `cacheRetention: "none"`, including worker summaries, keep that opt-out and receive no forced key. |
183
- | `cacheKeyShards` | number | ignored | This removed partitioning key has no effect. Slate reports it once at session start. Remove it from `slate.json`. |
184
- | `requestThrottle.enabled` | boolean | `true` | Pace OpenAI Responses worker requests. `false` disables pacing. It does not disable cache-key injection. The scope includes worker turns, failover requests, history compaction, and branch summaries. It excludes orchestrator requests, episode compression, other provider interfaces, other sessions and processes, and direct tool requests. |
185
- | `requestThrottle.maxRequestsPerMinute` | number | `12` | Maximum logical SDK requests admitted for one actual `provider/id` in the preceding 60 seconds. The value must be a whole number from 1 through 1000. Provider network retries inside one SDK request do not consume another admission. Different models have independent counters. This threshold is request pacing, not a cache-hit or provider-rate-limit guarantee. |
186
- | `requestThrottle.baseWaitMs` | number | `1000` | Base delay before a blocked request rechecks capacity. The value must be a whole number from 1 through 60000. A positive minimum prevents a repeated zero-delay loop. |
187
- | `requestThrottle.jitterMs` | number | `1000` | Uniform random extra delay from zero through this inclusive bound before a blocked request rechecks. The value must be a whole number from 0 through 60000. Admission is approximately fair. It is not first-in-first-out and does not promise a bounded wait. |
188
- | `maxConcurrent` | number | `4` | Maximum number of worker actions running concurrently (must be ≥ 1 — unenforced: a value of 0 or less silently hangs all dispatches). Excess actions wait for a global concurrency slot. Every action has its own thread. Default rationale: shipped `docs/design-principles.md` §5 (repo-local note). |
189
- | `contextBudget` | number \| object | `256000` (Anthropic models: `400000`) | Absolute orchestrator context budget (tokens) at which Slate auto-pauses and prepares a fresh-session handoff — semantics, defaults, per-model overrides, and rationale in [`docs/context-budget.md`](docs/context-budget.md). |
190
- | `orchestratorPromptDocs` | string[] | `[]` | Markdown files whose paths follow the source rules above and whose **contents** are appended to the orchestrator system prompt. |
191
- | `workerPromptDocs` | string[] | `[]` | Markdown files whose **contents** are appended to every worker-thread system prompt. |
192
- | `workflow.draftPRs` | boolean | `false` | Enable draft-PR publishing. Before implementation, ask once whether each track gets its own pull request or all tracks share one umbrella pull request. |
193
- | `workflow.followUpIssues` | boolean | `false` | When true, the orchestrator asks which deferred items become tracked issues. Deferred items are always reported whatever the value. |
194
- | `workflow.routingRecommendations` | boolean | `false` | Before final acceptance, add an evidence-bounded model-routing field for logical models dispatched during the current change. The enabled field always appears. It reports when no change is recommended and never edits routing files. |
195
- | `writing.check` | boolean | ignored | This ignored writing key remains accepted for compatibility. Remove it from `slate.json`. Guidance is automatic during orchestrator mode when the project is trusted or a home file exists. See [`docs/writing-guidance.md`](docs/writing-guidance.md). |
196
- | `writing.remind` | boolean | ignored | This ignored writing key remains accepted for compatibility. Remove it from `slate.json`. Reminder gates require orchestrator mode, permitted Slate settings, no pause, and a ready trigger. Delivery is limited to one reminder per response round. See [`docs/writing-guidance.md`](docs/writing-guidance.md). |
197
- | `writing.remindPercent` | number | ignored | This retired key remains accepted and ignored. Slate emits a notice. Replace it with `writing.remindTurns`, which counts completed turns instead of a token-budget share. |
198
- | `writing.remindTurns` | number | `4` | Set the reminder cadence in completed turns. The value must be a whole number from 1 through 20. An invalid value warns and falls back to `4`. See [`docs/writing-guidance.md`](docs/writing-guidance.md). |
199
- | `writing.remindOnFinding` | boolean | `true` | Send a reminder on the turn after a measured turn with a model-visible finding. An invalid value warns and falls back to `true`. `writing.findings: false` disables this trigger. |
200
- | `writing.sentenceWordLimit` | number \| boolean | `25` | Set the sentence-length house-style limit in words. The value must be a whole number from 10 through 200, inclusive, or `false` to turn the rule off. See [`docs/writing-guidance.md`](docs/writing-guidance.md). |
201
- | `writing.statusWindowTurns` | number | `10` | Set the whole-number status window from 3 through 100 measured turns. An invalid value warns and falls back to `10`. The status line reports model-visible fail and style counts in this window. |
202
- | `writing.findings` | boolean | `true` | Include the latest model-visible writing findings in the hidden reminder. An invalid value warns and falls back to `true`. Measurement and the status line continue when this value is `false`. |
203
- | `doctrineExtraPath` | string | — | Markdown whose **content** is appended to the orchestrator doctrine (project-specific workflow additions). |
204
- | `reviewPerspectivesPath` | string | — | Review charters, each declaring its own finding-ID prefix. The doctrine references this **path**; the orchestrator reads the file alongside the shipped review rules. |
205
- | `router.models` | object | shipped six-model pool | Ordinary membership and definitions. `include` replaces the starting membership, including with an empty list. `add` accepts complete new definitions. `replace` changes selected fields. `exclude` applies last. Within each model definition, lists and provider maps replace shipped fields. The home and project configuration files merge first. |
206
- | `router.compressor.models` | array of `{ model, effort }` | `[{"model":"claude-sonnet-5","effort":"medium"}]` | Independent ordered compressor list. An explicit empty list blocks work. |
207
-
208
- ### Extended example
209
-
210
- The `docs/agents/...` values below are placeholders. Point them at Markdown files that exist in your project.
211
-
212
- ```json
213
- {
214
- "orchestratorModeDefault": true,
215
- "cacheKeyEnabled": true,
216
- "requestThrottle": { "enabled": true, "maxRequestsPerMinute": 12, "baseWaitMs": 1000, "jitterMs": 1000 },
217
- "maxConcurrent": 4,
218
- "orchestratorPromptDocs": ["docs/agents/orchestrator-guidelines.md"],
219
- "workerPromptDocs": ["docs/agents/thread-guidelines.md"],
220
- "workflow": { "draftPRs": true, "followUpIssues": false, "routingRecommendations": false },
221
- "writing": { "remindTurns": 4, "remindOnFinding": true, "sentenceWordLimit": 25, "statusWindowTurns": 10, "findings": true },
222
- "doctrineExtraPath": "docs/agents/workflow-additions.md",
223
- "reviewPerspectivesPath": "docs/agents/review-perspectives.md",
224
- "router": {
225
- "models": { "include": ["luna-6", "claude-opus-5.5"] },
226
- "compressor": { "models": [{ "model": "claude-sonnet-5", "effort": "medium" }] }
227
- }
228
- }
229
- ```
230
-
231
- Remove `writing.check` and `writing.remind` when copying an older configuration. Current Slate reports these ignored writing keys.
232
-
233
- ### Document path warning
234
-
235
- > **Silent skip:** document-path errors produce no warning. Slate skips missing, unreadable, or empty files selected by `orchestratorPromptDocs`, `workerPromptDocs`, and `doctrineExtraPath`. For `reviewPerspectivesPath`, Slate omits the pointer only when the file is missing. Slate does not read that file at injection time, so an unreadable or empty file is still cited. Verify your paths after copying the example.
78
+ Slate reads optional home configuration and trusted project configuration. The [configuration reference](docs/configuration.md) lists merge rules, options, examples, and document path warnings.
236
79
 
237
80
  ## Safety and trust
238
81
 
239
- ### Worker extensions (`workerExtensions`)
82
+ Slate limits which extensions worker threads can load and which project settings it reads. [Safety and trust](docs/safety-and-trust.md) explains worker extensions, provider registrations, and the project trust boundary.
240
83
 
241
- By default worker threads load no project or discovered extensions. Slate supplies one internal reminder component to every worker session. After tool results reach its handler, the component tells the worker to issue independent tool calls in one turn. It sends the reminder once for each such turn. The reminder persists in the worker transcript and stays hidden from the user in the normal terminal interface. The component is not gated on project trust.
84
+ ## Roadmap
242
85
 
243
- This key is a list of regex patterns that select extensions the **host session has already loaded** and load them into every worker too. Each pattern is matched **unanchored** (unlike `contextBudget.overrides`, which is anchored) against a load unit's recorded source spec (e.g. `npm:pi-web-search@1.3.1`), its load-unit path, or the entry path of any tool that unit contributes, so a bare package name matches:
86
+ The main goal is that you can guide a change through its design without reading the code. Planned work:
244
87
 
245
- ```json
246
- {
247
- "workerExtensions": ["pi-smart-fetch", "pi-web-search"]
248
- }
249
- ```
250
-
251
- Every worker then gets the fetch and web-search tools **on top of** `workerTools` (and on top of the per-dispatch `tools` argument of the `thread` tool — those two govern the built-in tools only). The orchestrator itself does **not** gain these tools — orchestrator mode keeps its restricted set — but its doctrine gains a rule naming each whitelisted extension and its tools, so it knows what it can delegate.
252
-
253
- For project and discovered extensions, pi's discovery, project-trust gating, and dedup remain the only ingress. A worker cannot load a whitelisted extension that the host is not running. An extension that registers no tools cannot be whitelisted. A host started with extensions disabled offers nothing to whitelist. Slate's internal reminder component is the separate always-loaded input described above.
254
-
255
- **What to know before whitelisting** — it reaches past Slate's isolation, so it is an operator decision:
256
-
257
- - **Delegation is unbounded.** Slate guarantees only that no worker obtains Slate's own `thread`/`threads`/`episode` tools. A whitelisted extension that ships its own sub-agent or delegation tool under any other name gives workers delegation Slate can neither detect, bound, nor account for.
258
- - **Credential and filesystem reach.** Inside a worker the extension has the same filesystem and credential access it has in the host. Slate's read-only settings snapshot blocks pi-settings writes and nothing else.
259
- - **Worker lifecycle.** Slate completes each selected extension's `session_start` before the worker action begins. A startup failure blocks the action. Slate emits one `session_shutdown` before it disposes the worker, including after startup or action failure and during host shutdown.
260
- - **Abort.** A third-party extension may ignore the abort signal, so its network activity can outlive an abort or a context-budget pause. During a pause, Slate still allows orchestrator state-save workers while it refuses new user prompts.
261
- - **Cost.** Provider-native tool billing can escape Slate's worker cost accounting.
262
- - **Pathological patterns.** The patterns are regexes from your own trusted config — the same file that already steers models, prompts, and tool lists — matched with no time bound while the extension set is resolved once per session. A pattern with catastrophic backtracking can stall that resolution. Avoid such patterns. They are not a privilege boundary.
263
-
264
- The load-time recursion guard behind this — and the risks it does and does not cover — is in [`docs/design-principles.md`](docs/design-principles.md).
265
-
266
- ### Worker provider registrations
267
-
268
- Every worker inherits host extension provider registrations that are absent after the worker session is constructed. This behavior is independent of `workerExtensions`. It supports provider-only extensions that register no tools. The worker's own registration wins by provider id, even when one side uses a native provider and the other uses the config form. A built-in provider is not an extension registration, so a host extension override of a built-in is inherited.
88
+ 1. Design documents that state exact guarantees and show why the design keeps them. Reviewers check the code against the approved design ([#402](https://github.com/JetBrains/ytdb-slate/issues/402), [#403](https://github.com/JetBrains/ytdb-slate/issues/403), [#404](https://github.com/JetBrains/ytdb-slate/issues/404)).
89
+ 2. Recursive decomposition for large, long-running changes ([#361](https://github.com/JetBrains/ytdb-slate/issues/361)).
90
+ 3. Better developer experience: asynchronous threads, a detailed cost breakdown, and a read-only view of thread execution.
91
+ 4. Remote development through integration with pi-agent-dashboard ([#417](https://github.com/JetBrains/ytdb-slate/issues/417)).
269
92
 
270
- Inheritance happens after worker session construction and before route authentication or the first model request. Slate copies current registrations and reuses their provider functions. Nested config values and native provider objects can remain shared by reference. A worker uses its own pi credential resolution, but inherited provider authentication callbacks and configured keys can read or update the same credential files and third-party state that the host uses. Slate does not copy host event handlers such as `before_provider_headers`, `before_provider_request`, or `after_provider_response`. Provider extensions that depend on those handlers will not behave the same in a worker.
271
-
272
- A worker extension can register the same provider id during construction. Its registration takes precedence. Slate does not synchronize later host changes or intercept later worker registrations. Pi can merge a later partial worker registration with inherited config. That merge can retain inherited credentials while changing the endpoint. This accepted startup-only boundary requires extension authors to replace provider configuration carefully. Compatibility with specific third-party provider extensions has not been verified.
273
-
274
- ### Project trust boundary
275
-
276
- Slate excludes untrusted project Slate configuration and content selected through that configuration. Home preferences remain active, including documents and host extensions selected by those preferences. A home document path can point into a working tree, so select those paths carefully.
277
-
278
- Home preferences do not change pi's project-trust decision. Pi's independent instruction loading stays unchanged. In particular, this feature does not filter pi's `AGENTS.md` context files. Slate still requires project trust before it restores pending handoff state. Worker pi settings remain nonpersistent.
93
+ See [`docs/roadmap.md`](docs/roadmap.md) for details.
279
94
 
280
95
  ## Shipped docs
281
96
 
282
- This section is the complete reference document roster.
97
+ These documents define workflow and reference behavior. Slate cites workflow documents by installed path in its numbered system-prompt rules.
283
98
 
284
- In orchestrator mode, Slate appends a short **doctrine**, which is a block of numbered rules, to the orchestrator system prompt each turn. The doctrine does not embed the workflow documents. It cites them by absolute path inside the installed package, and the orchestrator reads them when needed.
99
+ - [`docs/blast-radius.md`](docs/blast-radius.md) defines focus areas, proofs, and review coverage.
100
+ - [`docs/configuration.md`](docs/configuration.md) defines settings, merge rules, and path warnings.
101
+ - [`docs/context-budget.md`](docs/context-budget.md) defines context limits, model overrides, and measured prompt sizes.
102
+ - [`docs/delivery-packages.md`](docs/delivery-packages.md) — the compact track and change package format, read only before package preparation
103
+ - [`docs/design-principles.md`](docs/design-principles.md) explains the architecture and its trade-offs.
104
+ - [`docs/model-routing.md`](docs/model-routing.md) defines logical-model routing, recovery, and accepted limits.
105
+ - [`docs/pr-publishing.md`](docs/pr-publishing.md) defines optional draft pull request publishing.
106
+ - [`docs/review-rules.md`](docs/review-rules.md) defines reviewer roles, evidence, and fix gates.
107
+ - [`docs/roadmap.md`](docs/roadmap.md) describes planned work.
108
+ - [`docs/safety-and-trust.md`](docs/safety-and-trust.md) defines worker extension, provider, and trust boundaries.
109
+ - [`docs/track-workflow.md`](docs/track-workflow.md) defines research, design, implementation, review, and delivery.
110
+ - [`docs/user-notes.md`](docs/user-notes.md) defines user note handling.
111
+ - [`docs/writing-guidance.md`](docs/writing-guidance.md) defines writing rules, reminders, status, prompt cost, and the checker.
112
+
113
+ Project additions extend the shipped rules without replacing them. `doctrineExtraPath` content follows the numbered rules. Slate reads that file again each time it builds the prompt. `orchestratorPromptDocs` and `workerPromptDocs` add prompt content. The orchestrator reads the `reviewPerspectivesPath` file only when needed to compose reviewers. See [configuration](docs/configuration.md) for path rules.
285
114
 
286
- The embedded paths make the block size depend on your install location. [`docs/context-budget.md`](docs/context-budget.md) gives measured sizes with and without optional rules. It also gives the arithmetic for your own installation.
115
+ ## Community
287
116
 
288
- - [`docs/blast-radius.md`](docs/blast-radius.md) defines the eleven focus areas, proof requirements, track constraints, and review coverage.
289
- - [`docs/context-budget.md`](docs/context-budget.md) defines `contextBudget` defaults, per-model overrides, the window clamp, and pricing rationale. It is reference documentation and is not cited by the doctrine.
290
- - [`docs/delivery-packages.md`](docs/delivery-packages.md) — the compact track and change package format, read only before package preparation
291
- - [`docs/design-principles.md`](docs/design-principles.md) gives Slate's design rationale.
292
- - [`docs/model-routing.md`](docs/model-routing.md) defines the logical-model policy, exact defaults, configuration, common recovery, history, and accepted limitations. The doctrine cites its absolute path for trusted sessions.
293
- - [`docs/pr-publishing.md`](docs/pr-publishing.md) defines per-track and umbrella draft pull request publishing. The doctrine cites it only when `workflow.draftPRs` is `true`.
294
- - [`docs/review-rules.md`](docs/review-rules.md) defines reviewer composition, the combined test-quality role, evidence standards, findings, and fix gates.
295
- - [`docs/track-workflow.md`](docs/track-workflow.md) defines the focus-area lifecycle for research, design, implementation, review, and delivery.
296
- - [`docs/user-notes.md`](docs/user-notes.md) defines how Slate records, classifies, and resolves user notes during development.
297
- - [`docs/writing-guidance.md`](docs/writing-guidance.md) defines the writing convention, ignored writing keys, status line, and checker command.
298
-
299
- Project-specific additions extend the shipped doctrine. They do not replace it:
300
-
301
- - **Content injection:** `doctrineExtraPath` appends content to the doctrine and is read again at each prompt assembly. `orchestratorPromptDocs` and `workerPromptDocs` append content to their respective system prompts.
302
- - **Pointer:** `reviewPerspectivesPath` is cited by path from the doctrine's review rule and read when needed, like the shipped documents.
117
+ Join the [Slate Zulip community](https://youtrackdb.zulipchat.com/#narrow/channel/634235-slate) to share what you are building, ask for help, or discuss the project.
303
118
 
304
119
  ## License
305
120
 
@@ -13,9 +13,13 @@ four-part proof. The proof states the defect class, the place where the defect
13
13
  can occur, the material consequence, and the review contribution. User approval
14
14
  makes a NAMED area **proved**.
15
15
  User rejection makes it **SKIPPED**. Only a proved area adds focus-dependent
16
- gates or routine implementation reviewers. A track with one or more proved
17
- areas gets exactly one Reviewer I and every required area specialist. A track
18
- with no proved area gets no routine implementation reviewer. The user alone
16
+ gates or area reviewers. A track with one or more proved areas gets exactly
17
+ one Reviewer I and every required area specialist. The implementer's approximate
18
+ size above 100 counted lines also requires Reviewer I on a track that is not
19
+ documentation-only. Without either trigger, routine implementation review is
20
+ `NOT REQUIRED`. Size alone adds no area reviewer or blocking track acceptance.
21
+ [track-workflow.md](track-workflow.md) § Track size and split defines counted
22
+ lines and the separate pre-implementation design estimate. The user alone
19
23
  judges proofs and whether the proposal is the simplest solution. No script or
20
24
  other rule decides whether a proof holds.
21
25
 
@@ -341,7 +345,7 @@ change that does not engage the area.
341
345
  No rule mechanically decides whether a proof holds. The user alone judges every
342
346
  proof at the confirmation gate and at focus reconfirmation. A SKIPPED area gets
343
347
  no gate or reviewer. The skip is recorded and is not an escalation. A track with
344
- no proved area gets no routine implementation reviewer.
348
+ no proved area gets no area reviewer.
345
349
 
346
350
  Reviewer composition and merging belong to
347
351
  [review-rules.md](review-rules.md) § Reviewer sets, merge rule and charters.
@@ -393,19 +397,21 @@ On a halt, the orchestrator:
393
397
  The route never applies a design gate retrospectively to completed work. It
394
398
  keeps the recorded skip and every reviewer that already covered completed work.
395
399
  A late proved area recomputes the complete required routine reviewer set for the
396
- completed range. The first proved area adds Reviewer I and the new area
397
- specialist. A later proved area keeps the existing Reviewer I without
398
- redispatching that perspective and adds only the new area specialist. Every
399
- newly required perspective reviews the completed range. The durable delivery
400
- record reports the resulting coverage.
400
+ completed range. If Reviewer I has not covered that range, dispatch Reviewer I
401
+ and the new area specialist. If Reviewer I already ran because of size or
402
+ another proved area, dispatch only the new specialist. Do not dispatch Reviewer I
403
+ again. Every newly required perspective reviews the completed range. The durable
404
+ delivery record reports the resulting coverage.
401
405
 
402
406
  ## Review coverage and the coverage register
403
407
 
404
408
  Every part of a track range must reach the complete routine implementation
405
- reviewer set that the proved areas require. The set is empty when the track has
406
- no proved area. Otherwise it contains exactly one Reviewer I and every required
407
- area specialist. Required user acceptance never replaces required machine
408
- review. This requirement is the coverage invariant.
409
+ reviewer set defined in [track-workflow.md](track-workflow.md) § Review coverage.
410
+ A proved area requires exactly one Reviewer I and every required area
411
+ specialist. Without a proved area, a reported size above 100 counted lines
412
+ requires Reviewer I unless the track is documentation-only. Otherwise the set
413
+ is empty. Required user acceptance never replaces required machine review.
414
+ This requirement is the coverage invariant.
409
415
 
410
416
  Create a coverage register when a user-review fix commit exists. Record each
411
417
  contiguous user-review fix range and its gate verdict. The register remains the
@@ -450,11 +456,8 @@ or verification claims. Examples of forbidden claims include
450
456
  receive repository state and declared intent, not implementer confidence.
451
457
 
452
458
  For a multi-track change, every commit in a track's review range must belong to
453
- that track. A reviewer checks the range against the track brief, the selected
454
- mode's boundary authority, and the title prefixes. Marker commits are the
455
- boundary authority in umbrella mode and when publishing is disabled. Per-track
456
- mode uses the reviewed branch range before merge and the user-merged default
457
- branch commit afterward. A commit from another track is cross-track
458
- contamination. Correct a wrong boundary or title before the next writer starts.
459
+ that track. A reviewer checks the range against the track brief, marker commits
460
+ as boundary authority, and the title prefixes. A commit from another track is
461
+ cross-track contamination. Correct a wrong boundary or title before the next writer starts.
459
462
  An undeclared material deviation found during this check fires the halt and
460
463
  re-derivation route above.
@@ -0,0 +1,109 @@
1
+ # Configuration
2
+
3
+ The [How Slate works](../README.md#how-slate-works) section defines orchestrator mode, worker thread, and main session.
4
+
5
+ ## Configuration files and merging
6
+
7
+ Slate reads two optional configuration files at session start:
8
+
9
+ - Home: `<getAgentDir()>/slate.json`, normally `~/.pi/agent/slate.json`. Pi's `PI_CODING_AGENT_DIR` environment variable can select another agent directory.
10
+ - Project: `<cwd>/.pi/slate.json`, read **only when the project is trusted**.
11
+
12
+ Project values override home values. Objects merge recursively. Arrays, scalar values, and explicit `null` replace the home value. Arrays never append. Slate applies its existing setting validators after the merge.
13
+
14
+ A missing file is valid. An unreadable file, invalid JSON, or a root that is not an object produces a warning naming that file. Any such error in a permitted file blocks model routing, even when the other file is valid.
15
+
16
+ Home preferences also apply in untrusted projects. Without a home file, existing project behavior and defaults stay unchanged. Configuration edits require a new session.
17
+
18
+ Paths in `orchestratorPromptDocs`, `workerPromptDocs`, `doctrineExtraPath`, and `reviewPerspectivesPath` belong to the file that supplies the value. Relative home paths start at the agent directory. Relative project paths start at the project root, not `.pi`. Absolute paths stay absolute. See [Safety and trust](safety-and-trust.md) for the security boundary.
19
+
20
+ Pi can refresh a prompt cache by sending background requests. Slate disables those requests in every worker because they bypass its request limits. This does not disable prompt caching for ordinary worker requests. The main session and saved pi settings stay unchanged.
21
+
22
+ ## Startup workflow summary
23
+
24
+ Slate shows a short workflow summary at the start of an interactive terminal session when orchestrator mode is on. Slate also shows it each time you turn orchestrator mode on. A saved `startupSummary: false` choice stops both automatic displays. The summary explains the workflow steps. It disappears when you send your first prompt to the model.
25
+
26
+ `/slate off` and `/slate summary off` remove a visible summary. Toggling orchestrator mode off with `/slate` also removes it. Other slash commands leave it visible unless they reload or replace the session. `/reload`, `/new`, `/resume`, and `/fork` clear the panel when they reload or replace the session. Slate then shows it only when orchestrator mode is on and the saved choice allows automatic display. Run `/slate summary` to show it on demand in any mode, even when automatic display is off. Run `/slate summary off` to stop automatic display. Run `/slate summary on` to allow automatic display again.
27
+
28
+ Slate stores this choice as the boolean `startupSummary` key in `<getAgentDir()>/slate-preferences.json`. Pi uses `PI_CODING_AGENT_DIR` when that environment variable sets the agent directory. A missing file or key means the summary is on. This file does not grant home configuration permission in untrusted projects. A `startupSummary` key in either `slate.json` has no effect.
29
+
30
+ ## Common starting point
31
+
32
+ Create `.pi/slate.json` when you want new interactive sessions to start in orchestrator mode:
33
+
34
+ ```json
35
+ {
36
+ "orchestratorModeDefault": true
37
+ }
38
+ ```
39
+
40
+ The project must be trusted before Slate reads this file. Start a new session after any configuration change.
41
+
42
+ ## Complete option reference
43
+
44
+ | Key | Type | Default | Semantics |
45
+ | --- | --- | --- | --- |
46
+ | `orchestratorModeDefault` | boolean | `false` | Start fresh interactive sessions with orchestrator mode ON. |
47
+ | `workerTools` | string[] | `["read", "bash", "edit", "write", "grep", "find", "ls"]` | Tools available to worker threads (an empty list also falls back to the default). |
48
+ | `workerExtensions` | string[] | `[]` | Regex patterns (matched **unanchored**) selecting which of the host session's already-loaded extensions also load into every worker thread; each matched extension's tools are added **on top of** `workerTools`. Empty (default) means workers load no project or discovered extensions. Slate still supplies one internal reminder component. The orchestrator keeps its restricted tool set but its doctrine is told what was whitelisted. Invalid patterns are dropped with a warning at session start. |
49
+ | `cacheKeyEnabled` | boolean | `true` | Add one OpenAI Responses prompt cache key to all workers in the current main Slate session. Another main session receives another key. `false` disables key injection. It does not disable request throttling. Provider requests with `cacheRetention: "none"`, including worker summaries, keep that opt-out and receive no forced key. |
50
+ | `cacheKeyShards` | number | ignored | This removed partitioning key has no effect. Slate reports it once at session start. Remove it from `slate.json`. |
51
+ | `requestThrottle.enabled` | boolean | `true` | Pace OpenAI Responses worker requests. `false` disables pacing. It does not disable cache-key injection. The scope includes worker turns, failover requests, history compaction, and branch summaries. It excludes orchestrator requests, episode compression, other provider interfaces, other sessions and processes, and direct tool requests. |
52
+ | `requestThrottle.maxRequestsPerMinute` | number | `12` | Maximum logical SDK requests admitted for one actual `provider/id` in the preceding 60 seconds. The value must be a whole number from 1 through 1000. Provider network retries inside one SDK request do not consume another admission. Different models have independent counters. This threshold is request pacing, not a cache-hit or provider-rate-limit guarantee. |
53
+ | `requestThrottle.baseWaitMs` | number | `1000` | Base delay before a blocked request rechecks capacity. The value must be a whole number from 1 through 60000. A positive minimum prevents a repeated zero-delay loop. |
54
+ | `requestThrottle.jitterMs` | number | `1000` | Uniform random extra delay from zero through this inclusive bound before a blocked request rechecks. The value must be a whole number from 0 through 60000. Admission is approximately fair. It is not first-in-first-out and does not promise a bounded wait. |
55
+ | `maxConcurrent` | number | `4` | Maximum number of worker actions running concurrently (must be ≥ 1 — unenforced: a value of 0 or less silently hangs all dispatches). Excess actions wait for a global concurrency slot. Every action has its own thread. Default rationale: shipped `docs/design-principles.md` §5 (repo-local note). |
56
+ | `contextBudget` | number \| object | `256000` (Anthropic models: `400000`) | Absolute orchestrator context budget (tokens) at which Slate auto-pauses and prepares a fresh-session handoff — semantics, defaults, per-model overrides, and rationale in [`docs/context-budget.md`](context-budget.md). |
57
+ | `orchestratorPromptDocs` | string[] | `[]` | Markdown files whose paths follow the source rules above and whose **contents** are appended to the orchestrator system prompt. |
58
+ | `workerPromptDocs` | string[] | `[]` | Markdown files whose **contents** are appended to every worker-thread system prompt. |
59
+ | `workflow.draftPRs` | boolean | `false` | Enable one umbrella draft pull request for the whole change before implementation. |
60
+ | `workflow.followUpIssues` | boolean | `false` | When true, the orchestrator asks which deferred items become tracked issues. Deferred items are always reported whatever the value. |
61
+ | `workflow.routingRecommendations` | boolean | `false` | Before final acceptance, add an evidence-bounded model-routing field for logical models dispatched during the current change. The enabled field always appears. It reports when no change is recommended and never edits routing files. |
62
+ | `writing.check` | boolean | ignored | This ignored writing key remains accepted for compatibility. Remove it from `slate.json`. Guidance is automatic during orchestrator mode when the project is trusted or a home file exists. See [`docs/writing-guidance.md`](writing-guidance.md). |
63
+ | `writing.remind` | boolean | ignored | This ignored writing key remains accepted for compatibility. Remove it from `slate.json`. Reminder gates require orchestrator mode, permitted Slate settings, no pause, and a ready trigger. Delivery is limited to one reminder per response round. See [`docs/writing-guidance.md`](writing-guidance.md). |
64
+ | `writing.remindPercent` | number | ignored | This retired key remains accepted and ignored. Slate emits a notice. Replace it with `writing.remindTurns`, which counts completed turns instead of a token-budget share. |
65
+ | `writing.remindTurns` | number | `4` | Set the reminder cadence in completed turns. The value must be a whole number from 1 through 20. An invalid value warns and falls back to `4`. See [`docs/writing-guidance.md`](writing-guidance.md). |
66
+ | `writing.remindOnFinding` | boolean | `true` | Send a reminder on the turn after a measured turn with a model-visible finding. An invalid value warns and falls back to `true`. `writing.findings: false` disables this trigger. |
67
+ | `writing.sentenceWordLimit` | number \| boolean | `25` | Set the sentence-length house-style limit in words. The value must be a whole number from 10 through 200, inclusive, or `false` to turn the rule off. See [`docs/writing-guidance.md`](writing-guidance.md). |
68
+ | `writing.statusWindowTurns` | number | `10` | Set the whole-number status window from 3 through 100 measured turns. An invalid value warns and falls back to `10`. When `writing.showStatus` is true, the status line reports model-visible fail and style counts in this window. |
69
+ | `writing.showStatus` | boolean | `false` | Show the writing part of the status line. An invalid value warns and falls back to `false`. Measurement and reminders continue when it is `false`. |
70
+ | `writing.findings` | boolean | `true` | Include the latest model-visible writing findings in the hidden reminder. An invalid value warns and falls back to `true`. Measurement continues when this value is `false`. The status line follows `writing.showStatus`. |
71
+ | `doctrineExtraPath` | string | — | Markdown whose **content** is appended to the orchestrator doctrine (project-specific workflow additions). |
72
+ | `reviewPerspectivesPath` | string | — | Review charters, each declaring its own finding-ID prefix. The doctrine references this **path**; the orchestrator reads the file alongside the shipped review rules. |
73
+ | `router.models` | object | shipped six-model pool | Ordinary membership and definitions. `include` replaces the starting membership, including with an empty list. `add` accepts complete new definitions. `replace` changes selected fields. `exclude` applies last. Within each model definition, lists and provider maps replace shipped fields. The home and project configuration files merge first. |
74
+ | `router.compressor.models` | array of `{ model, effort }` | `[{"model":"claude-sonnet-5","effort":"medium"}]` | Independent ordered compressor list. An explicit empty list blocks work. |
75
+
76
+ ## Extended example
77
+
78
+ The `docs/agents/...` values below are placeholders. Point them at Markdown files that exist in your project.
79
+
80
+ ```json
81
+ {
82
+ "orchestratorModeDefault": true,
83
+ "cacheKeyEnabled": true,
84
+ "requestThrottle": { "enabled": true, "maxRequestsPerMinute": 12, "baseWaitMs": 1000, "jitterMs": 1000 },
85
+ "maxConcurrent": 4,
86
+ "orchestratorPromptDocs": ["docs/agents/orchestrator-guidelines.md"],
87
+ "workerPromptDocs": ["docs/agents/thread-guidelines.md"],
88
+ "workflow": { "draftPRs": true, "followUpIssues": false, "routingRecommendations": false },
89
+ "writing": { "remindTurns": 4, "remindOnFinding": true, "sentenceWordLimit": 25, "statusWindowTurns": 10, "findings": true },
90
+ "doctrineExtraPath": "docs/agents/workflow-additions.md",
91
+ "reviewPerspectivesPath": "docs/agents/review-perspectives.md",
92
+ "router": {
93
+ "models": { "include": ["luna-6", "claude-opus-5.5"] },
94
+ "compressor": { "models": [{ "model": "claude-sonnet-5", "effort": "medium" }] }
95
+ }
96
+ }
97
+ ```
98
+
99
+ Remove `writing.check` and `writing.remind` when copying an older configuration. Current Slate reports these ignored writing keys.
100
+
101
+ ## Built-in implementation review
102
+
103
+ Pass the optional `reviewPerspectives` list to `thread` with type `reviewer` for a built-in implementation review. Use the perspective names in [review-rules.md](review-rules.md) § Built-in implementation perspectives. The list must be nonempty and contain distinct names. Reviewer I and Test-quality and structure reviewer each run alone. Other specialists may share a list only when their code scope and required evidence match.
104
+
105
+ Slate loads the shared policy, implementation inputs, and selected charters before opening a worker. An invalid list or a missing, unreadable, or blank required file refuses dispatch before worker creation. An omitted list keeps the manual review route. The list does not enter saved thread state. Prefixes identify findings and do not select perspectives.
106
+
107
+ ## Document path warning
108
+
109
+ > **Silent skip:** document-path errors produce no warning. Slate skips missing, unreadable, or empty files selected by `orchestratorPromptDocs`, `workerPromptDocs`, and `doctrineExtraPath`. For `reviewPerspectivesPath`, Slate omits the pointer only when the file is missing. Slate does not read that file at injection time, so an unreadable or empty file is still cited. Verify your paths after copying the example.