ytdb-slate 0.11.0 → 0.12.0
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.
- package/README.md +56 -241
- package/docs/blast-radius.md +22 -19
- package/docs/configuration.md +109 -0
- package/docs/context-budget.md +91 -60
- package/docs/delivery-packages.md +22 -16
- package/docs/design-principles.md +18 -3
- package/docs/model-routing.md +32 -16
- package/docs/pr-publishing.md +47 -79
- package/docs/review-common-policy.md +33 -0
- package/docs/review-implementation-input.md +19 -0
- package/docs/review-perspectives/cb.md +26 -0
- package/docs/review-perspectives/cn.md +20 -0
- package/docs/review-perspectives/du.md +21 -0
- package/docs/review-perspectives/gr.md +27 -0
- package/docs/review-perspectives/lx.md +19 -0
- package/docs/review-perspectives/nl.md +31 -0
- package/docs/review-perspectives/pf.md +20 -0
- package/docs/review-perspectives/pl.md +22 -0
- package/docs/review-perspectives/ri.md +24 -0
- package/docs/review-perspectives/se.md +20 -0
- package/docs/review-perspectives/tq.md +53 -0
- package/docs/review-perspectives/uf.md +27 -0
- package/docs/review-rules.md +37 -222
- package/docs/roadmap.md +32 -0
- package/docs/safety-and-trust.md +46 -0
- package/docs/track-workflow.md +106 -82
- package/docs/user-notes.md +15 -16
- package/docs/writing-guidance.md +50 -23
- package/extension/artifact-names.ts +29 -6
- package/extension/base-model.ts +1 -1
- package/extension/episodes.ts +12 -22
- package/extension/handoff.ts +66 -97
- package/extension/index.ts +33 -3
- package/extension/mode.ts +268 -83
- package/extension/notify.ts +1 -1
- package/extension/observations.ts +5 -4
- package/extension/paths.ts +17 -0
- package/extension/review-perspectives.ts +81 -0
- package/extension/slate-files.ts +48 -7
- package/extension/startup-summary.ts +113 -0
- package/extension/state.ts +75 -13
- package/extension/threads.ts +102 -23
- package/extension/tools.ts +18 -1
- package/extension/worker-extensions.ts +1 -1
- package/extension/worker.ts +50 -14
- package/extension/writing.ts +11 -3
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -1,305 +1,120 @@
|
|
|
1
|
-
# ytdb-slate:
|
|
1
|
+
# ytdb-slate: multi-agent orchestration for the pi coding agent
|
|
2
2
|
|
|
3
3
|
[](https://github.com/JetBrains/ytdb-slate/actions/workflows/ci.yml)
|
|
4
4
|
|
|
5
|
-
|
|
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
|
-
|
|
7
|
+
## What Slate does
|
|
8
8
|
|
|
9
|
-
-
|
|
10
|
-
-
|
|
11
|
-
-
|
|
12
|
-
-
|
|
13
|
-
-
|
|
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
|
-
##
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
52
|
+
Slate independently implements the thread-weaving architecture from the Random Labs technical report for `@randomlabs/slate`.
|
|
54
53
|
|
|
55
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
84
|
+
## Roadmap
|
|
242
85
|
|
|
243
|
-
|
|
86
|
+
The main goal is that you can guide a change through its design without reading the code. Planned work:
|
|
244
87
|
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
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
|
-
|
|
97
|
+
These documents define workflow and reference behavior. Slate cites workflow documents by installed path in its numbered system-prompt rules.
|
|
283
98
|
|
|
284
|
-
|
|
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
|
-
|
|
115
|
+
## Community
|
|
287
116
|
|
|
288
|
-
|
|
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
|
|
package/docs/blast-radius.md
CHANGED
|
@@ -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
|
|
17
|
-
|
|
18
|
-
|
|
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
|
|
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.
|
|
397
|
-
specialist.
|
|
398
|
-
|
|
399
|
-
newly required perspective reviews the completed range. The durable
|
|
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
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
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,
|
|
454
|
-
|
|
455
|
-
|
|
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.
|