ytdb-slate 0.10.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.
Files changed (68) hide show
  1. package/README.md +79 -163
  2. package/docs/blast-radius.md +463 -0
  3. package/docs/configuration.md +109 -0
  4. package/docs/context-budget.md +236 -273
  5. package/docs/delivery-packages.md +183 -0
  6. package/docs/design-principles.md +109 -91
  7. package/docs/model-routing.md +417 -773
  8. package/docs/pr-publishing.md +95 -63
  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 +314 -295
  24. package/docs/roadmap.md +32 -0
  25. package/docs/safety-and-trust.md +46 -0
  26. package/docs/track-workflow.md +688 -410
  27. package/docs/user-notes.md +205 -0
  28. package/docs/writing-guidance.md +223 -165
  29. package/extension/artifact-names.ts +32 -12
  30. package/extension/base-model.ts +16 -6
  31. package/extension/config.ts +79 -0
  32. package/extension/episodes.ts +370 -345
  33. package/extension/failover.ts +191 -312
  34. package/extension/handoff.ts +178 -173
  35. package/extension/index.ts +113 -177
  36. package/extension/logical-model-adapters.ts +302 -0
  37. package/extension/logical-model-definitions.ts +121 -0
  38. package/extension/logical-model-recovery.ts +296 -0
  39. package/extension/logical-model-render.ts +131 -0
  40. package/extension/logical-model-resolver.ts +256 -0
  41. package/extension/logical-model-runtime.ts +251 -0
  42. package/extension/mode.ts +510 -433
  43. package/extension/model-default.ts +6 -8
  44. package/extension/notify.ts +3 -3
  45. package/extension/observations.ts +108 -18
  46. package/extension/paths.ts +21 -1
  47. package/extension/prompt-docs.ts +2 -2
  48. package/extension/render.ts +12 -26
  49. package/extension/request-throttle.ts +362 -0
  50. package/extension/review-perspectives.ts +81 -0
  51. package/extension/slate-files.ts +49 -8
  52. package/extension/startup-summary.ts +113 -0
  53. package/extension/state.ts +251 -326
  54. package/extension/threads.ts +980 -1407
  55. package/extension/tools.ts +83 -153
  56. package/extension/worker-extensions.ts +138 -37
  57. package/extension/worker-reminder.ts +61 -0
  58. package/extension/worker.ts +498 -54
  59. package/extension/writing-check.mjs +46 -24
  60. package/extension/writing-reminder.ts +122 -54
  61. package/extension/writing.ts +223 -62
  62. package/package.json +6 -6
  63. package/docs/model-failover.md +0 -242
  64. package/docs/thread-cache-cost.md +0 -227
  65. package/extension/model-profiles.ts +0 -967
  66. package/extension/model-router.ts +0 -1168
  67. package/extension/route.ts +0 -1294
  68. package/extension/thread-choice.ts +0 -1207
package/README.md CHANGED
@@ -1,205 +1,121 @@
1
- # ytdb-slate
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).
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
- The orchestrator (your main pi session) dispatches **bounded actions** to persistent **worker threads**. Each completed action is compressed by an LLM into an **episode** — a durable, structured record (intent, actions, findings, artifacts, open issues, handoff notes) that the orchestrator composes into further dispatches instead of re-reading raw transcripts. Slate also injects a mandatory workflow doctrine. Its design and review gates scale with the confirmed change class. Optional umbrella **draft-PR publishing** covers tracks.
7
+ ## What Slate does
8
8
 
9
- An opt-in **model-failover** map adds high availability: when a model API fails, the orchestrator, worker threads, and episode compression each retry once on a configured equal-quality alternative. A second opt-in, **action-level model routing**, gives each dispatched action a model and an effort level chosen to be up to the task and no more, so cost is bounded per action instead of per session.
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.
10
14
 
11
- ## Why Slate?
15
+ ## Quick start
12
16
 
13
- Long-horizon agentic work fails on context management, not model capability. Existing architectures each solve a piece of the problem and trade away the rest. Compaction is unpredictably lossy; naive subagents isolate context but hand back only a single response string; markdown plans go stale and get under-executed. Rigid task trees can't adapt to information discovered mid-task, and planner/executor stacks synchronize through compress-and-return boundaries that risk dropping critical state.
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:
14
18
 
15
- Slate's answer is the **thread**: the orchestrator dispatches one bounded action at a time; the worker executes it and returns an **episode**. The orchestrator keeps the reactivity of a plain agent loop while gaining the context isolation, compaction, and parallelism that the single-context loop lacks.
16
-
17
- | Aspect | ReAct | Markdown plan | Task trees | RLM (Recursive Language Models) | Devin / Manus / Altera | Claude Code / Codex subagents | Slate |
18
- | --- | --- | --- | --- | --- | --- | --- | --- |
19
- | Planning | implicit | file | explicit tree | REPL | planning agent | plan mode | implicit / adaptive — no upfront static plan |
20
- | Decomposition | none | none | direct tree | REPL functions | task-based | subagent delegation | implicit |
21
- | Synchronization | single thread | single thread | gated steps | REPL return | reduce & return | message passing | episodes |
22
- | Intermediate feedback | per step | per step | on task failure | on execution end | after compress | message passing | per episode |
23
- | Context isolation | none | none | per subtask | per subcall | subagent | subagent | per thread |
24
- | Context compaction | none | none | task-based | REPL slicing | subagent compress | compaction | episode compress |
25
- | Parallel execution | none | none | none | in REPL | Altera only | native | native |
26
- | Expressivity | high | high | low | high | medium | medium | high |
27
- | Adaptability | yes | if plan updated | no | limited — no mid-run course correction | yes | limited by message passing | yes |
28
-
29
- Characterizations of third-party systems reflect their publicly described designs at the time of writing. The taxonomy is adapted from the Random Labs technical report introducing the thread-weaving "Slate" architecture (its agent ships as the npm package `@randomlabs/slate`); ytdb-slate is an independent implementation of that architecture for pi.
30
-
31
- **Threads are not subagents:**
32
-
33
- - **Per-episode feedback.** Each thread executes one bounded action and hands control back. The orchestrator adapts after every episode — reactive like a ReAct loop — instead of firing off a subagent and hoping the result comes back usable.
34
- - **Compaction at a chosen boundary.** Compression happens at a predictable point — action completion — instead of mid-stream when context overflows. The compression itself is still LLM-performed and lossy, but the boundary is chosen, not forced.
35
- - **Episodes compose.** One thread's episode can seed another thread's context, so conclusions travel across the system by reference. Subagents pass back a single response string; episodes are durable, structured, reusable records.
36
-
37
- Full rationale: [`docs/design-principles.md`](docs/design-principles.md), shipped in the package — if this summary and that document disagree, the document wins.
38
-
39
- ## Feature development workflow
40
-
41
- In orchestrator mode, Slate injects a mandatory track-based development workflow. Project configuration can extend it through `doctrineExtraPath`. Configuration cannot replace it.
42
-
43
- Slate uses four change classes. Evaluate these tests in order. The first match
44
- sets the class:
45
-
46
- 1. **Risky:** The change touches concurrency, durability, recovery,
47
- transactional semantics, security, or user data. This class also covers a
48
- public API or behavioral change, or a silent failure mode.
49
- 2. **Complex:** The shape is unclear, several parts interact, or a live design
50
- alternative exists.
51
- 3. **Trivial:** The change is an obvious fix with no behavioral change, and one
52
- reviewer pass covers it.
53
- 4. **Medium:** Otherwise.
54
-
55
- After classification, follow these workflow steps:
56
-
57
- 1. **Classification and research** — the orchestrator proposes the change class, and the user confirms it. A research log is required for medium changes and above.
58
- 2. **Design gates** — medium changes need high-level design approval before implementation. Complex and risky changes add an adversarial review between two user approvals.
59
- 3. **Track split** — the orchestrator owns the split. Size determines tracks and marker commits, not workflow gates.
60
- 4. **Per-track loop** — each track gets implementation, fixes, and mandatory user review. Agent code review is skipped only when the whole change is trivial.
61
- 5. **Delivery** — the user performs the squash merge when draft publishing is enabled. Otherwise, the squashed commit carries the workflow log's key content.
62
-
63
- Trivial changes have no high-level design gate. Every change keeps mandatory user review of its track diff. Umbrella draft-PR publishing activates only when `workflow.draftPRs` is `true`.
64
-
65
- This summary is orientation only; the shipped docs listed below are normative.
66
-
67
- ## Model failover
68
-
69
- Slate can ride through model API outages. The opt-in `modelFailover` map in `.pi/slate.json` (trusted projects only) maps a model (`provider/id`) to an equal-quality alternative; on an eligible model API failure — not an abort or a context overflow, and for the orchestrator and worker sites only after pi's own retries are exhausted — the affected site (orchestrator, worker thread, or episode compression) retries once on the mapped model (single hop, never chained). An orchestrator failover — like the handoff adoption that re-applies a parent session's model — would otherwise leave pi's global model defaults changed, so Slate restores them on a best-effort basis unless `preserveGlobalModelDefault` is `false`. The map is empty by default (feature off) and read once at session start. Full semantics: the `modelFailover` row in [Configuration](#configuration) and the shipped [`docs/model-failover.md`](docs/model-failover.md) — if they disagree, that document wins.
70
-
71
- ## Action-level model routing
19
+ ```bash
20
+ pi install -l npm:ytdb-slate@<version>
21
+ ```
72
22
 
73
- Slate can pick the model and the effort level per dispatched action rather than running every action on whatever model the orchestrator happens to be on. `router.models` in `.pi/slate.json` (trusted projects only) is a closed list of `provider/id` specs. Each action uses its `model` and `effort` arguments when present. Otherwise, it uses the thread's base model and a level DERIVED for the model it routes to. That level is the lowest one with a capability measurement, never a fixed default. The list is empty by default. An empty list disables candidate-list enforcement, base seeding, effort derivation, and the router's window, billing, and substitution paths. Per-action `model` and `effort` arguments stay active on both router states. Slate always checks an explicit effort against pi's vocabulary, and against the ladder of the model it routes to whenever it has that model's profile data. An action that omits `model` plans for the thread's pre-router pin, and a thread with no pin gives it no plan target. An action that omits `effort` resolves no level. In both cases the worker session returns to what it opened on. [`docs/model-routing.md`](docs/model-routing.md) holds the full contract, including the known cases where the model or level that runs differs. Only models Slate ships a benchmark profile for can be routed to; entries pi cannot serve, or has no profile for, are dropped with a warning naming them.
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.
74
24
 
75
- Router startup warnings have two classes. One class is a configuration fault. It reports project configuration that Slate ignored or dropped. A configuration fault also covers problems the user can stop by adding a model, credential, or failover entry.
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.
76
26
 
77
- The addition must go into their project configuration or pi credentials. Removing the model named by a warning does not meet this second test. Slate always shows configuration faults.
27
+ Start a new interactive pi session and let Slate delegate actions:
78
28
 
79
- The other class is a model data note. It reports shipped research data that project configuration cannot correct. Slate hides those notes by default.
29
+ ```text
30
+ /slate on
31
+ ```
80
32
 
81
- With this repository's six-model list and pi's stock registry, Slate hides eleven notes. Slate shows one discoverability line instead. A local registry override can change that count. The line names the hidden warning count and the `router.showWarnings` setting. A hidden note can still affect which model runs an action.
33
+ Try a request with a clear outcome:
82
34
 
83
- What the code enforces is deliberately narrower than what the routing data advises. The dispatch guards refuse an unlisted model, a level off the target model's ladder and a level the provider rejects outright; they warn about — and mark — an unmeasured level, refusing it only when `router.allowUnmeasuredEffort` is `false`; and the context-window guard substitutes a wider listed model instead of ever blocking an action. The obligations that come from the profile data itself — keeping review and gate actions on measured levels, and honoring a REFUSE such as `anthropic/claude-fable-5`'s for zero-data-retention work — are stated in the doctrine for the orchestrator to honor; they are **not** code-enforced guards. Full semantics: the `router.*` rows in [Configuration](#configuration) and the shipped [`docs/model-routing.md`](docs/model-routing.md) — if they disagree, that document wins.
35
+ ```text
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.
37
+ ```
84
38
 
85
- ## Optional writing guidance
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.
86
40
 
87
- Set `writing.check` to `true` to add writing guidance and human-only telemetry. In orchestrator mode, Slate adds a doctrine rule that states the convention. It also adds a status value such as `writing 1/4`. This value means that one of four measured prose turns had a fail-level finding. Each worker gets a shorter preamble reminder about sentence length, semicolons, and contractions.
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).
88
42
 
89
- The option has prompt cost. Each orchestrator system prompt contains the doctrine rule. You pay for this text on every turn. Each worker session also gets a gated preamble addition. Both additions are absent when the option is off. The worker preamble then stays byte-identical to its pre-feature form.
43
+ ## How Slate works
90
44
 
91
- > **No conformance claim:** This is a dictionary-free proxy. It embeds no controlled vocabulary and claims no ASD-STE100 conformance.
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.
92
49
 
93
- The shipped CLI checks plain files, JSONL records, and unified diffs. See [`docs/writing-guidance.md`](docs/writing-guidance.md) for its rules, limits, output, and command examples.
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.
94
51
 
95
- Set `writing.remind` to `true` to add context-paced reminders after eligible tool results. Context-paced means Slate waits for configured context growth between reminders. The reminders are hidden from the normal TUI. They repeat five writing requirements and the scope exclusion before the next assistant response. This option remains off unless `writing.check` is also `true`.
52
+ Slate independently implements the thread-weaving architecture from the Random Labs technical report for `@randomlabs/slate`.
96
53
 
97
- ## Install
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
55
+ concurrency defects, data loss, security weaknesses, performance degradation,
56
+ test-quality defects, unreadable user-facing prose, licensing exposure,
57
+ non-local logic defects, consumer contract breaks, governing-rule defects, and
58
+ unreported failures.
98
59
 
99
- Install into a project (pinned, project-scoped — recorded in `.pi/settings.json`):
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.
100
61
 
101
- ```bash
102
- pi install -l npm:ytdb-slate@<version>
103
- ```
62
+ ## Commands
104
63
 
105
- > **Note on pinning:** pinned specs (`@<version>`) are deliberately skipped by `pi update --extensions` / `pi update --all`. Bumping the pin is a conscious project change — review Slate's shipped workflow docs for changes when you do.
64
+ | Command | Current behavior |
65
+ | --- | --- |
66
+ | `/slate on` | Turn on orchestrator mode. Slate removes tactical tools from the main session and expects delegation through worker threads. |
67
+ | `/slate off` | Turn off orchestrator mode and restore the earlier tool set. |
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. |
72
+ | `/slate effective` | Show the effective logical-model policy and remembered route selections. |
73
+ | `/slate handoff [focus]` | Prepare a new-session handoff, with an optional focus. |
74
+ | `/slate resume` | Clear a context-budget pause and accept user prompts again. |
106
75
 
107
76
  ## Configuration
108
77
 
109
- Optional config file: `slate.json` in the project's pi config dir (`.pi/slate.json`). It is honored **only in trusted projects** (see [Trust](#trust)).
110
-
111
- | Key | Type | Default | Semantics |
112
- | --- | --- | --- | --- |
113
- | `orchestratorModeDefault` | boolean | `false` | Start fresh interactive sessions with orchestrator mode ON. |
114
- | `episodeModel` | string | newest available Anthropic Sonnet, else the orchestrator's own base model | Model (`provider/id`) used to compress a finished action into an episode. Never the model an action was routed to: an episode is read by every later consumer of the thread, so one cheap route must not degrade the record. An unusable value is reported and the default is used. |
115
- | `workerTools` | string[] | `["read", "bash", "edit", "write", "grep", "find", "ls"]` | Tools available to worker threads (an empty list also falls back to the default). |
116
- | `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 extensions. 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. |
117
- | `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 dispatches wait in a queue; actions on the same thread always run in dispatch order. Default rationale: shipped `docs/design-principles.md` §5 (repo-local note). |
118
- | `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). |
119
- | `orchestratorPromptDocs` | string[] | `[]` | Project markdown files (paths relative to the project root) whose **contents** are appended to the orchestrator system prompt. |
120
- | `workerPromptDocs` | string[] | `[]` | Project markdown files whose **contents** are appended to every worker-thread system prompt. |
121
- | `workflow.draftPRs` | boolean | `false` | Enable umbrella draft-PR publishing for tracks. |
122
- | `workflow.followUpIssues` | boolean | `false` | When true, the orchestrator asks which suggestions become follow-up issues in the project tracker. Suggestions are always reported whatever the value. |
123
- | `writing.check` | boolean | `false` | Add the writing doctrine rule, per-turn status, and worker guidance. An absent option is silently off. A malformed `writing` value, or a non-boolean `check` value, warns and defaults to off. Unknown `writing` keys warn and are ignored. See [`docs/writing-guidance.md`](docs/writing-guidance.md). |
124
- | `writing.remind` | boolean | `false` | Send a hidden reminder after an eligible tool result. All gates must pass: orchestrator mode, project trust, `writing.check`, this option, no pause, cadence or handoff force, and one-per-round control. See [`docs/writing-guidance.md`](docs/writing-guidance.md). |
125
- | `writing.remindPercent` | number | `10` | Set cadence as a percentage of Slate's current effective context budget. The value must be finite and in `(0, 100]`. The interval has an 8,192-token floor and no cap. A handoff force bypasses this threshold. See [`docs/writing-guidance.md`](docs/writing-guidance.md). |
126
- | `doctrineExtraPath` | string | — | Project markdown whose **content** is appended to the orchestrator doctrine (project-specific workflow additions). |
127
- | `reviewPerspectivesPath` | string | — | Project review charters, each declaring its own finding-ID prefix. The doctrine references this **path**; the orchestrator reads the file alongside the shipped review rules. |
128
- | `modelFailover` | object (string → string) | — (empty, failover off) | Map of `provider/id` → equal-quality alternative model; on a model API failure the affected site retries once on the mapped model (worker/orchestrator sites only after pi's own retries are exhausted; episode compression has no pi retry loop). Read once at session start — see [`docs/model-failover.md`](docs/model-failover.md). |
129
- | `preserveGlobalModelDefault` | boolean | `true` | Put pi's global model defaults (`defaultProvider`, `defaultModel`, `defaultThinkingLevel`) back after a Slate-initiated model switch — orchestrator failover and handoff adoption — so the switch stays session-scoped. `false` turns that restore off at both sites (the switches themselves are unaffected), leaving each one persisted in pi's global settings. Best-effort: Slate reverts only a value its own switch produced, and can stand down or give up — limits in [`docs/model-failover.md`](docs/model-failover.md). |
130
- | `router.models` | string[] | `[]` (empty — routing off) | Closed list of models (`provider/id`) an action may use. Empty or absent means the router is OFF. Slate enforces no candidate list, seeds no thread base, derives no effort level, and runs no router-only window, billing, or substitution path. Per-action `model` and `effort` arguments stay active on both router states. Slate still checks explicit effort against pi's vocabulary and the routed model's ladder when it has that model's profile data. An action that omits `model` plans for the thread's pre-router pin, and a thread with no pin gives it no plan target. An action that omits `effort` resolves no level. In both cases the worker session returns to what it opened on. The known cases where the model or level that runs differs are listed in [`docs/model-routing.md`](docs/model-routing.md). A listed model becomes routable only if Slate has its benchmark profile, pi registers it, and credentials are configured. Slate drops other entries with a warning. If all entries drop, routing turns off with one summary warning. Slate reads and resolves the list once per session. See [`docs/model-routing.md`](docs/model-routing.md). |
131
- | `router.allowUnmeasuredEffort` | boolean | `true` | What happens when an explicitly requested effort level is on the target model's ladder but has no capability measurement in Slate's profiles: `true` dispatches it with a ⚠ notice and marks the episode `(unmeasured level)`; `false` refuses the dispatch. Either way a level that is off the model's ladder, or one the provider rejects outright, is refused, and a level Slate DERIVES for an action is always a measured one. |
132
- | `router.showWarnings` | boolean | `false` | Reveal model data notes about Slate's shipped routing research. Configuration faults are never hidden. See [`docs/model-routing.md`](docs/model-routing.md). |
133
-
134
- Example `.pi/slate.json` (the `docs/agents/...` paths are placeholders — point them at markdown files that actually exist in **your** project):
135
-
136
- ```json
137
- {
138
- "orchestratorModeDefault": true,
139
- "episodeModel": "anthropic/claude-sonnet-5",
140
- "maxConcurrent": 4,
141
- "orchestratorPromptDocs": ["docs/agents/orchestrator-guidelines.md"],
142
- "workerPromptDocs": ["docs/agents/thread-guidelines.md"],
143
- "workflow": { "draftPRs": true, "followUpIssues": false },
144
- "writing": {
145
- "check": true,
146
- "remind": false,
147
- "remindPercent": 10
148
- },
149
- "doctrineExtraPath": "docs/agents/workflow-additions.md",
150
- "reviewPerspectivesPath": "docs/agents/review-perspectives.md",
151
- "modelFailover": { "anthropic/claude-sonnet-5": "openai/gpt-5.2" },
152
- "router": { "models": ["openai/gpt-5.6-luna", "anthropic/claude-opus-5"] }
153
- }
154
- ```
155
-
156
- Older Slate releases warn about these reminder keys and ignore them. Use a Slate release whose documentation includes these keys.
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.
157
79
 
158
- > **Silent skip:** the project-file keys fail silently — no error is shown. For the content-injected keys (`orchestratorPromptDocs`, `workerPromptDocs`, `doctrineExtraPath`) a missing, unreadable, or empty file is skipped and nothing is injected. For `reviewPerspectivesPath` the pointer is omitted only when the file is missing — the file is not read at injection time, so an unreadable or empty file is still cited. Verify your paths after copying the example.
80
+ ## Safety and trust
159
81
 
160
- **Worker extensions (`workerExtensions`).** By default worker threads load no extensions. 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:
161
-
162
- ```json
163
- {
164
- "workerExtensions": ["pi-smart-fetch", "pi-web-search"]
165
- }
166
- ```
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.
167
83
 
168
- 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. pi's discovery, project-trust gating, and dedup remain the only ingress: a worker can never load an extension the host is not running, an extension that registers no tools cannot be whitelisted, and a host started with extensions disabled offers nothing to whitelist.
84
+ ## Roadmap
169
85
 
170
- **What to know before whitelisting** — it reaches past Slate's isolation, so it is an operator decision:
86
+ The main goal is that you can guide a change through its design without reading the code. Planned work:
171
87
 
172
- - **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.
173
- - **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.
174
- - **Unsynced model-scoped tools.** Worker sessions never fire the session-start event, so an extension whose tool set is model-scoped stays unsynced and may offer a tool the worker's model cannot serve (e.g. pi-web-search's `url_context` on a non-Google worker model) — the call simply fails and the episode records it.
175
- - **Abort.** A third-party extension may ignore the abort signal, so its network activity can outlive an abort or a context-budget pause.
176
- - **Cost.** Provider-native tool billing can escape Slate's worker cost accounting.
177
- - **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; treat it as a footgun to avoid, not a privilege boundary.
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)).
178
92
 
179
- 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).
180
-
181
- ## Trust
182
-
183
- Slate reads project configuration (`.pi/slate.json`) and injects project files (`orchestratorPromptDocs`, `workerPromptDocs`, `doctrineExtraPath`, `reviewPerspectivesPath`) **only in trusted projects**. In untrusted projects Slate runs with built-in defaults and injects nothing from the working tree.
93
+ See [`docs/roadmap.md`](docs/roadmap.md) for details.
184
94
 
185
95
  ## Shipped docs
186
96
 
187
- In orchestrator mode, Slate appends a short **doctrine** (a block of numbered rules) to the orchestrator's system prompt each turn. The doctrine does not embed the workflow docs — it cites them by **absolute path**, resolved inside the installed package (not your project), and the orchestrator reads them on demand. Those embedded paths are also why the block's character count depends on your install location; [`docs/context-budget.md`](docs/context-budget.md) has the measured sizes, with and without the optional rules, and the arithmetic for your own install:
97
+ These documents define workflow and reference behavior. Slate cites workflow documents by installed path in its numbered system-prompt rules.
98
+
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.
188
112
 
189
- - `docs/track-workflow.md` — the class-scaled workflow for research, high-level design, adversarial review, and track review
190
- - `docs/pr-publishing.md` — umbrella draft-PR publishing (cited only when `workflow.draftPRs` is `true`)
191
- - `docs/review-rules.md` — review discipline and finding rules
192
- - `docs/design-principles.md` — Slate's own design rationale
193
- - `docs/model-failover.md` — the opt-in `modelFailover` map (**reference documentation** — unlike the entries above it is not workflow doctrine and is not cited by the doctrine)
194
- - `docs/context-budget.md` — the orchestrator `contextBudget`: defaults, per-model overrides, the window clamp, and the pricing rationale (also **reference documentation**, not cited by the doctrine)
195
- - `docs/writing-guidance.md` — the optional writing convention, `writing.check` behavior, status line, and checker CLI
196
- - `docs/model-routing.md` — the action-level model routing reference. It covers the three `router` keys, model eligibility, omitted effort, and dispatch guards. It also covers first-session warnings. The doctrine cites this absolute path only while the routing rule renders. This path is fourth normally and fifth when `workflow.draftPRs` is on. The rule renders the live list because it depends on the session registry and credentials.
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.
197
114
 
198
- Project-specific additions layer on top — they extend, not replace, the shipped doctrine — via two distinct mechanisms:
115
+ ## Community
199
116
 
200
- - **Content injection**: `doctrineExtraPath` (appended to the doctrine itself, re-read at each prompt assembly) and `orchestratorPromptDocs` / `workerPromptDocs` (appended to the respective system prompts).
201
- - **Pointer**: `reviewPerspectivesPath` is cited by path from the doctrine's review rule and read on demand, like the shipped docs.
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.
202
118
 
203
119
  ## License
204
120
 
205
- Apache-2.0 — see [LICENSE](LICENSE).
121
+ Apache-2.0. See [LICENSE](LICENSE).