agent-policy-kit 0.5.1 → 0.5.2

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/AGENT_INSTALL.md CHANGED
@@ -20,7 +20,7 @@ Obey these rules in every step:
20
20
  In the steps below, `agent-policy` means the pinned command for the requested release:
21
21
 
22
22
  ```sh
23
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy
23
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy
24
24
  ```
25
25
 
26
26
  ## Step 1: Select the release
@@ -30,7 +30,7 @@ The package version is the configuration release. Use the version that the owner
30
30
  1. Read the release notes:
31
31
 
32
32
  ```sh
33
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy release --json
33
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy release --json
34
34
  ```
35
35
 
36
36
  2. Read the entry for this version in [CHANGELOG.md](CHANGELOG.md): what changed, why, and the migration limits.
@@ -41,7 +41,7 @@ The package version is the configuration release. Use the version that the owner
41
41
  For several commands, you can install the package into a temporary or user-owned prefix:
42
42
 
43
43
  ```sh
44
- npm install --prefix PREFIX agent-policy-kit@0.5.1 --ignore-scripts --no-audit --no-fund
44
+ npm install --prefix PREFIX agent-policy-kit@0.5.2 --ignore-scripts --no-audit --no-fund
45
45
  ```
46
46
 
47
47
  Then run `PREFIX/node_modules/.bin/agent-policy`. If the owner gives you a verified local `.tgz` file of a version that is not on npm, install that file in the same way. You need no sudo, no fixed prefix and no shell profile change.
@@ -51,7 +51,7 @@ More: [updates and removal](docs/guide/updates-and-removal.md), [presets](docs/r
51
51
  ## Step 2: Detect
52
52
 
53
53
  ```sh
54
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy detect --json
54
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy detect --json
55
55
  ```
56
56
 
57
57
  1. Read the status of each assistant: `detected`, `not_found`, `invalid` or `timeout`.
@@ -112,7 +112,7 @@ APK updates owned files in a transaction for each client, without a removal gap.
112
112
  1. Run `doctor`:
113
113
 
114
114
  ```sh
115
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy doctor --json
115
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy doctor --json
116
116
  ```
117
117
 
118
118
  Each client reports its saved release, source and preset from its receipt, independent of the version that runs `doctor`. `verified` means that the owned files match the receipt.
@@ -120,7 +120,7 @@ APK updates owned files in a transaction for each client, without a removal gap.
120
120
  2. Run `show` to read the current user-level subagent settings, including manual edits:
121
121
 
122
122
  ```sh
123
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy show --json
123
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy show --json
124
124
  ```
125
125
 
126
126
  `show` does not resolve project, managed or session settings. It exits with code 3 when a client needs attention, and it keeps the results of the other clients.
@@ -134,7 +134,7 @@ A verified configuration does not prove that a model runs. After verification, y
134
134
  1. Plan the removal:
135
135
 
136
136
  ```sh
137
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy uninstall --json
137
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy uninstall --json
138
138
  ```
139
139
 
140
140
  2. Review the plan.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,35 @@
2
2
 
3
3
  Each npm version is one configuration release: its presets, native role definitions, instructions and configuration page. Published versions are not rewritten. Applying another release is explicit; package installation alone changes no settings.
4
4
 
5
+ ## 0.5.2 — 2026-11-01
6
+
7
+ ### Why this release
8
+
9
+ Uninstall did not give back `config.toml` byte for byte when APK had added a table to it (#34). When APK adds a table, such as `[subagents.models]` for Grok, it writes one empty line before the table header. Uninstall removed the header but kept this empty line. Each replacing setup, for example with another preset, removed the table in memory the same way and then wrote the table again with a new empty line. After a Grok setup, one replacing setup and an uninstall, two empty lines stayed after the `[subagents]` table. Settings and values were always restored. Only the bytes of the file were different. The undo logic reaches your setup only through a new release.
10
+
11
+ ### Who should update
12
+
13
+ - Anyone who uses Grok Build with APK. APK always adds the `[subagents.models]` table for Grok.
14
+ - Anyone who uses ChatGPT or Kimi with APK and whose `config.toml` did not have the table that APK writes to: `[agents]` for ChatGPT, or `[secondary_model]` and `[models."ALIAS".overrides]` for Kimi. A ChatGPT file that had an `[agents]` table was restored exactly before.
15
+ - Claude and Gemini get no change. They have no `config.toml`.
16
+ - Role files, presets, instructions and the model catalog are the same as in 0.5.1.
17
+
18
+ ### Migration and rollback
19
+
20
+ Assistant IDs, preset ids, share-link format v2 and receipt format v4 are unchanged. `doctor`, `show`, setup and `uninstall` of 0.5.2 read receipts from 0.4.0, 0.5.0 and 0.5.1. These releases wrote the same file layout, so uninstall of 0.5.2 also removes the empty line before a table that they added. This was checked for Grok with the published 0.4.0, 0.5.0 and 0.5.1 packages in isolated homes.
21
+
22
+ - An empty line that a replacing setup of 0.5.1 or earlier already left in the file stays. APK cannot tell it from your own lines. Remove it by hand if you want.
23
+ - If your `config.toml` did not end with a line break, APK must add one before it writes the first new line. 0.5.2 records this in the receipt as `addedLineBreak`, a hash of that last line, and removes the line break again on uninstall when the file ends with that line again. A line that you added after it keeps its line break. Releases 0.5.1 and earlier do not know this field and stop with `INVALID_RECEIPT`. To move such an assistant back to 0.5.1, first remove it with 0.5.2: `npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy uninstall --client grok --apply`. Then set up with 0.5.1. A receipt from 0.5.1 or earlier for such a file has no record, so uninstall keeps the line break at the end of the file.
24
+ - All other 0.5.2 receipts have the same fields as before. Setup with 0.5.1 moves them back in place, and uninstall with 0.5.1 removes them, with the old empty line behavior.
25
+
26
+ See the [migration boundaries](docs/guide/updates-and-removal.md#migration-boundaries).
27
+
28
+ ### What changed
29
+
30
+ - Fixed: uninstall and replacing setups remove the empty line that APK wrote before a table it added, together with the table (#34). APK removes the empty line with the line ending of the table header, so an empty line that you added with another line ending stays. A setup, any number of replacing setups and an uninstall give back the original bytes of `config.toml` for Grok, ChatGPT and Kimi. Empty lines that you added stay.
31
+ - Fixed: uninstall removes a line break that APK added at the end of a `config.toml` that did not end with one. If you added lines after the APK settings, the line break stays, because TOML needs it.
32
+ - A replacing setup writes the same `config.toml` bytes as a first setup on the original file.
33
+
5
34
  ## 0.5.1 — 2026-11-01
6
35
 
7
36
  ### Why this release
package/README.md CHANGED
@@ -22,7 +22,7 @@ Created and maintained by [Mykola Maksymenko](https://www.linkedin.com/in/nick-m
22
22
  One command removes the APK settings. It restores the settings that you had before APK and keeps your unrelated edits:
23
23
 
24
24
  ```sh
25
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy uninstall --apply
25
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy uninstall --apply
26
26
  ```
27
27
 
28
28
  To preview the removal first, run the command without `--apply`. Removal uses the receipts in `~/.agent-policy-kit`, so keep that folder. [Updates and removal](docs/guide/updates-and-removal.md#remove-apk) gives the details and the exceptions.
@@ -32,7 +32,7 @@ To preview the removal first, run the command without `--apply`. Removal uses th
32
32
  - Your main agent and its model do not change. The main agent still decides when to delegate.
33
33
  - APK configures the coding agent of each assistant: Codex in ChatGPT, Claude Code in Claude, Kimi Code, Antigravity for Gemini, and Grok Build. Plain chats do not change. [Assistants](docs/reference/assistants.md) lists the details, also for the desktop apps.
34
34
  - APK adds no proxy and no background process. You can delete the npm package after setup.
35
- - `npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy show` reads your current settings.
35
+ - `npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy show` reads your current settings.
36
36
  - Apart from the npm download, APK makes no network requests. [Privacy](docs/guide/privacy.md) tells what it reads and writes.
37
37
 
38
38
  ## Documentation
@@ -9,10 +9,10 @@ APK needs Node.js 22.13 or later in the 22 line, or Node.js 24 or later.
9
9
  Run a pinned release with `npx`:
10
10
 
11
11
  ```sh
12
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy <command> [options]
12
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy <command> [options]
13
13
  ```
14
14
 
15
- - `--package agent-policy-kit@0.5.1` selects the configuration release. The package version is the release version.
15
+ - `--package agent-policy-kit@0.5.2` selects the configuration release. The package version is the release version.
16
16
  - `--ignore-scripts` prevents npm install scripts.
17
17
  - `--yes` lets npx download the package without a prompt.
18
18
 
@@ -116,7 +116,7 @@ The command always lists every selected assistant and role with its model and ef
116
116
  A generated command has this form:
117
117
 
118
118
  ```sh
119
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy setup \
119
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy setup \
120
120
  --roles 'reviewer,explorer' \
121
121
  --max-concurrent 3 \
122
122
  --chatgpt 'reviewer=gpt-6.1-sol:high,explorer=gpt-6-luna:high' \
@@ -138,7 +138,7 @@ The [Commands](commands.md#explicit-tool-arguments) reference describes this syn
138
138
  Under step 4, the box **You can undo the setup** shows the command that removes the APK settings. The command is pinned to the release of the page, for example:
139
139
 
140
140
  ```sh
141
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy uninstall --apply
141
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy uninstall --apply
142
142
  ```
143
143
 
144
144
  The removal restores the settings that you had before APK and keeps your unrelated edits. It uses the receipts that setup saves in the state directory, `~/.agent-policy-kit` by default. Keep this directory.
@@ -49,13 +49,13 @@ For each control on the page, see [Configurator](configurator.md).
49
49
  1. Run `doctor` to verify the configuration that APK owns:
50
50
 
51
51
  ```sh
52
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy doctor
52
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy doctor
53
53
  ```
54
54
 
55
55
  2. Run `show` to read the subagent settings that your assistants use now, including settings that you made yourself:
56
56
 
57
57
  ```sh
58
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy show
58
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy show
59
59
  ```
60
60
 
61
61
  A verified configuration does not prove that a provider runs a specific model. For all command options, see [Commands](commands.md).
@@ -91,7 +91,7 @@ Each assistant gets its own native role files and instructions. No central servi
91
91
  Run setup with the release input mode:
92
92
 
93
93
  ```sh
94
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy setup --release
94
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy setup --release
95
95
  ```
96
96
 
97
97
  This previews the Standard mode. Add `--preset fast` for Light or `--preset quality` for Top-tier. Add `--apply` to write the files. For details, see [Commands](commands.md#release-presets---release-and---preset).
@@ -18,7 +18,7 @@ Preferences apply only when the main agent decides to delegate. They do not turn
18
18
  1. Create a file with the Standard preset of the release:
19
19
 
20
20
  ```sh
21
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy init --policy ./preferences.json
21
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy init --policy ./preferences.json
22
22
  ```
23
23
 
24
24
  2. Edit the file. Use the rules below.
@@ -112,7 +112,7 @@ Some conditions can only be checked against the native files, for example missin
112
112
  APK has no separate validation command. A preview checks the file and writes nothing:
113
113
 
114
114
  ```sh
115
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy setup --policy ./preferences.json
115
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy setup --policy ./preferences.json
116
116
  ```
117
117
 
118
118
  If the file is not valid, the command fails with `INVALID_POLICY`. The file must be a regular file of at most 64 KiB, not a symbolic link.
@@ -126,13 +126,13 @@ Use one of these methods.
126
126
  1. Preview the setup:
127
127
 
128
128
  ```sh
129
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy setup --policy ./preferences.json
129
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy setup --policy ./preferences.json
130
130
  ```
131
131
 
132
132
  2. Apply it:
133
133
 
134
134
  ```sh
135
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy setup --policy ./preferences.json --apply
135
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy setup --policy ./preferences.json --apply
136
136
  ```
137
137
 
138
138
  `--policy` is conservative. If APK already has a setup with other values, it stops with `INSTALLATION_CONFLICT` or `POLICY_CONFLICT`.
@@ -150,7 +150,7 @@ To replace saved values with the values of a file, send the file as `--config`:
150
150
  2. Preview the setup with the encoded value:
151
151
 
152
152
  ```sh
153
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy setup --config ENCODED_VALUE
153
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy setup --config ENCODED_VALUE
154
154
  ```
155
155
 
156
156
  3. Run the same command with `--apply`.
@@ -21,7 +21,7 @@ Installing or updating the npm package does not change your native files. Only `
21
21
  2. Show the release and its notes with the `release` command:
22
22
 
23
23
  ```sh
24
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy release
24
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy release
25
25
  ```
26
26
 
27
27
  3. Check the installed versions of your assistants and the models that your account can use.
@@ -37,7 +37,7 @@ A release that is not published yet has the heading `VERSION — Unreleased` in
37
37
  1. Preview the setup with the release that you want:
38
38
 
39
39
  ```sh
40
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy setup --release
40
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy setup --release
41
41
  ```
42
42
 
43
43
  2. To select another preset, add `--preset fast` (Light) or `--preset quality` (Top-tier). The default is `balanced` (Standard).
@@ -77,6 +77,7 @@ These boundaries are known:
77
77
  | Assistant | Change | Setup without removal | Remove with |
78
78
  |---|---|---|---|
79
79
  | Claude | From 0.4.0 or later to 0.3.0 or earlier | `INVALID_RECEIPT` | The installed release, 0.4.0 or later |
80
+ | ChatGPT, Kimi and Grok, only if `config.toml` did not end with a line break before setup | From 0.5.2 or later to 0.5.1 or earlier | `INVALID_RECEIPT` | The installed release, 0.5.2 or later |
80
81
  | ChatGPT and Gemini | From 0.2.0 or earlier to 0.3.0 or later | `OWNERSHIP_CONFLICT` | The release that created the settings, for example 0.2.0 |
81
82
  | ChatGPT and Gemini | From 0.3.0 or later to 0.2.0 or earlier | `OWNERSHIP_CONFLICT` | The release that created the settings, for example 0.4.0 |
82
83
 
@@ -85,13 +86,25 @@ These boundaries are known:
85
86
  1. Remove the Claude settings with the installed release (0.4.0 or later), for example:
86
87
 
87
88
  ```sh
88
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy uninstall --client claude --apply
89
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy uninstall --client claude --apply
89
90
  ```
90
91
 
91
92
  2. Set up Claude with 0.3.0.
92
93
 
93
94
  ChatGPT, Kimi, Gemini and Grok move from 0.4.0 to 0.3.0 in place.
94
95
 
96
+ **ChatGPT, Kimi and Grok, 0.5.2 or later to 0.5.1 or earlier.** If `config.toml` did not end with a line break before setup, APK adds one before its first new line. Since 0.5.2, the receipt records this as `addedLineBreak`, so that uninstall can remove the line break again (#34). Releases 0.5.1 and earlier do not know this field, so they refuse the receipt. To move such an assistant back to 0.5.1:
97
+
98
+ 1. Remove its settings with the installed release (0.5.2 or later), for example:
99
+
100
+ ```sh
101
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy uninstall --client grok --apply
102
+ ```
103
+
104
+ 2. Set up that assistant with 0.5.1.
105
+
106
+ If `config.toml` ended with a line break, the receipt has no such field, and these assistants move from 0.5.2 to 0.5.1 in place.
107
+
95
108
  **ChatGPT and Gemini, 0.2.0 and 0.3.0.** Release 0.3.0 renamed the assistant IDs `codex` to `chatgpt` and `agy` to `gemini`. Releases 0.3.0 and later do not read receipts under the old IDs, and releases 0.2.0 and earlier do not know the new IDs. To move from 0.2.0 to a later release:
96
109
 
97
110
  1. Remove the settings with 0.2.0:
@@ -124,14 +137,14 @@ APK has no background updater and requests no live model catalog. Your configure
124
137
  1. Preview the removal:
125
138
 
126
139
  ```sh
127
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy uninstall
140
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy uninstall
128
141
  ```
129
142
 
130
143
  2. Read the preview.
131
144
  3. Remove the configuration:
132
145
 
133
146
  ```sh
134
- npx --yes --ignore-scripts --package agent-policy-kit@0.5.1 agent-policy uninstall --apply
147
+ npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy uninstall --apply
135
148
  ```
136
149
 
137
150
  4. Run `show` to check the current settings.
@@ -14,6 +14,20 @@ A configuration check does not prove native loading. Native loading does not pro
14
14
 
15
15
  Each record names the platform and the date. Browser evidence, temporary homes, raw configuration fixtures and logs stay outside Git and npm.
16
16
 
17
+ ## 0.5.2
18
+
19
+ macOS arm64, 2026-11-01.
20
+
21
+ | Layer | Evidence |
22
+ |---|---|
23
+ | Full Node 26.5.1 suite | PASS: 398/398. New byte-for-byte tests cover TOML round trips for nine originals (including CRLF, empty and comment-only files and files without a final line break), one to three Grok setups for seven originals, ChatGPT with and without `[agents]`, user lines next to APK's separator and line break, and forged `addedLineBreak` values |
24
+ | Hosted CI | PASS on main c6b0434: macOS Node 22.13.0 and Ubuntu Node 24 suites and the site build ([run](https://github.com/automatis-tools/agent-policy-kit/actions/runs/41386000485)) |
25
+ | Published 0.5.1 to 0.5.2 | PASS in isolated homes with the npm 0.5.1 package and the 0.5.2 tarball, Standard and Light presets. ChatGPT, Claude, Gemini and Grok upgrade to 0.5.2, move back to 0.5.1 and upgrade again in place. Kimi NOT CHECKED with a provisioned model pool: both versions return a prerequisite in an empty home |
26
+ | Byte-for-byte restoration | PASS: 0.5.1 setup, 0.5.2 upgrade, 0.5.2 replacing setup and 0.5.2 uninstall give back the original Grok and ChatGPT `config.toml` (`cmp`). A sequence that includes a replacing setup of 0.5.1 keeps the one empty line that 0.5.1 left, as the release notes describe |
27
+ | Native ChatGPT, Claude, Kimi, Gemini and Grok loading and provider execution | NOT CHECKED for 0.5.2. No live model tasks were used as configuration proof |
28
+ | npm packaging | PASS: `npm pack --dry-run` lists 50 files. No private evidence or configuration |
29
+ | Model catalog | Unchanged from 0.5.0 |
30
+
17
31
  ## 0.5.1
18
32
 
19
33
  macOS arm64, 2026-11-01.
@@ -58,7 +58,7 @@ Each file entry records only what APK owns in that file:
58
58
  | `role` | `apk-<role>` role files | The SHA-256 hash of the content that APK wrote. A role file never existed before APK. |
59
59
  | `instructions` | The global instruction file | The exact block between the markers and the line breaks that APK added before it. |
60
60
  | `json` | Claude `settings.json` | Each owned `env` value: its key, whether it existed, its old value and its new value. Also whether APK created the `env` object. |
61
- | `toml` | `config.toml` of ChatGPT, Kimi and Grok | Each owned value: its key path, its old value and its new value. For Kimi, also a value that APK removed. |
61
+ | `toml` | `config.toml` of ChatGPT, Kimi and Grok | Each owned value: its key path, its old value and its new value. Whether APK added the table of the value (`addedTable`). Since 0.5.2, when APK added a line break at the end of a file that did not end with one, a SHA-256 hash of that last line (`addedLineBreak`); the receipt keeps no config text. For Kimi, also a value that APK removed. |
62
62
 
63
63
  ### Receipt formats
64
64
 
@@ -74,6 +74,7 @@ APK 0.4.0 writes format v4. It can read, check and remove v2, v3 and v4.
74
74
  - Grok receipts exist only in v4.
75
75
  - A Claude v4 receipt owns two or three `env` values. The third, `CLAUDE_CODE_SUBAGENT_EFFORT`, is new in 0.4.0. It is present only when the effort of the first selected role is pinned. Receipts from 0.3.0 without it stay valid.
76
76
  - An older APK version can reject a v4 receipt that a newer version wrote. For example, APK 0.3.0 accepts only two owned `env` values in a Claude receipt, so it stops with `INVALID_RECEIPT` on a 0.4.0 Claude receipt that owns `CLAUDE_CODE_SUBAGENT_EFFORT`. Use a version that supports the receipt before you downgrade. For example, remove the Claude settings with 0.4.0 and then run setup with 0.3.0. [Migration boundaries](../guide/updates-and-removal.md#migration-boundaries) lists the known cases.
77
+ - A `toml` value has `addedLineBreak` only when `config.toml` did not end with a line break before setup. APK 0.5.1 and earlier stop with `INVALID_RECEIPT` on such a receipt.
77
78
 
78
79
  APK refuses these receipts:
79
80
 
@@ -165,6 +166,7 @@ A prerequisite or drift leaves the applied release unchanged. A late failure rol
165
166
  - It deletes the owned role files.
166
167
  - It removes the owned instruction block and the line breaks that APK added. It deletes the instruction file if APK created it and the file is then empty.
167
168
  - It restores each owned value to its old value, or removes it if it did not exist. It deletes a configuration file if APK created it and the file is then empty.
169
+ - When a table that APK added to `config.toml` has no values left, it removes the table header and the empty line that APK wrote before the header. It also removes a line break that APK added at the end of the file, if no lines follow. A `config.toml` then has its original bytes again, also after several updates (since 0.5.2, #34).
168
170
  - It deletes the receipt.
169
171
 
170
172
  Removal restores the values from before the first APK setup, also after several updates. It keeps later edits that are not owned. It keeps `policy.json` and the backups. Without `--client`, `uninstall` processes each assistant that has a receipt.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agent-policy-kit",
3
- "version": "0.5.1",
3
+ "version": "0.5.2",
4
4
  "description": "Configure native subagent settings across AI assistants, then exit",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -65,5 +65,5 @@
65
65
  "bugs": {
66
66
  "url": "https://github.com/automatis-tools/agent-policy-kit/issues"
67
67
  },
68
- "homepage": "https://agent-policy-kit.trymenow.io/v/0.5.1/"
68
+ "homepage": "https://agent-policy-kit.trymenow.io/v/0.5.2/"
69
69
  }
package/site/index.html CHANGED
@@ -7,9 +7,9 @@
7
7
  <meta name="description" content="Configure local subagent roles, models and effort with Agent Policy Kit, an open source tool by Mykola Maksymenko.">
8
8
  <meta name="author" content="Mykola Maksymenko">
9
9
  <link rel="author" href="https://www.linkedin.com/in/nick-maximenko/">
10
- <link rel="canonical" href="https://agent-policy-kit.trymenow.io/v/0.5.1/">
10
+ <link rel="canonical" href="https://agent-policy-kit.trymenow.io/v/0.5.2/">
11
11
  <title>Agent Policy Kit — by Mykola Maksymenko</title>
12
- <script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Person","@id":"https://www.linkedin.com/in/nick-maximenko/#person","name":"Mykola Maksymenko","url":"https://www.linkedin.com/in/nick-maximenko/"},{"@type":"SoftwareSourceCode","@id":"https://github.com/automatis-tools/agent-policy-kit#software","name":"Agent Policy Kit","description":"Configure native subagent settings across AI assistants, then exit","url":"https://agent-policy-kit.trymenow.io/","codeRepository":"https://github.com/automatis-tools/agent-policy-kit","author":{"@id":"https://www.linkedin.com/in/nick-maximenko/#person"}},{"@type":"WebPage","@id":"https://agent-policy-kit.trymenow.io/v/0.5.1/#webpage","name":"Agent Policy Kit — by Mykola Maksymenko","url":"https://agent-policy-kit.trymenow.io/v/0.5.1/","author":{"@id":"https://www.linkedin.com/in/nick-maximenko/#person"},"mainEntity":{"@id":"https://github.com/automatis-tools/agent-policy-kit#software"},"mentions":[{"@type":"SoftwareSourceCode","name":"Agents Can Communicate","codeRepository":"https://github.com/automatis-tools/agents-can-communicate"},{"@type":"SoftwareSourceCode","name":"Automatis Skills","codeRepository":"https://github.com/automatis-tools/automatis-skills"}]}]}</script>
12
+ <script type="application/ld+json">{"@context":"https://schema.org","@graph":[{"@type":"Person","@id":"https://www.linkedin.com/in/nick-maximenko/#person","name":"Mykola Maksymenko","url":"https://www.linkedin.com/in/nick-maximenko/"},{"@type":"SoftwareSourceCode","@id":"https://github.com/automatis-tools/agent-policy-kit#software","name":"Agent Policy Kit","description":"Configure native subagent settings across AI assistants, then exit","url":"https://agent-policy-kit.trymenow.io/","codeRepository":"https://github.com/automatis-tools/agent-policy-kit","author":{"@id":"https://www.linkedin.com/in/nick-maximenko/#person"}},{"@type":"WebPage","@id":"https://agent-policy-kit.trymenow.io/v/0.5.2/#webpage","name":"Agent Policy Kit — by Mykola Maksymenko","url":"https://agent-policy-kit.trymenow.io/v/0.5.2/","author":{"@id":"https://www.linkedin.com/in/nick-maximenko/#person"},"mainEntity":{"@id":"https://github.com/automatis-tools/agent-policy-kit#software"},"mentions":[{"@type":"SoftwareSourceCode","name":"Agents Can Communicate","codeRepository":"https://github.com/automatis-tools/agents-can-communicate"},{"@type":"SoftwareSourceCode","name":"Automatis Skills","codeRepository":"https://github.com/automatis-tools/automatis-skills"}]}]}</script>
13
13
  <!-- Public Sans is embedded under the SIL Open Font License.
14
14
  Copyright 2015 The Public Sans Project Authors (https://github.com/uswds/public-sans)
15
15
 
@@ -325,7 +325,7 @@ section[aria-labelledby=helpers-heading]{view-transition-name:step-helpers}secti
325
325
  <footer><div class="footer-row footer-details"><span class="show-settings">Check current settings <button type="button" class="quiet-button" id="copy-show" aria-label="Copy the command that shows current settings">Copy</button><code id="show-command" hidden></code></span><div class="footer-attribution"><span>by <a rel="author" href="https://www.linkedin.com/in/nick-maximenko/">Mykola Maksymenko</a></span><nav aria-label="Related projects"><span>More tools:</span><a href="https://github.com/automatis-tools/agents-can-communicate">Agents Can Communicate</a> <a href="https://github.com/automatis-tools/automatis-skills">Automatis Skills</a></nav></div></div></footer>
326
326
  <script>
327
327
  'use strict';
328
- const RELEASE = {"schemaVersion":1,"version":"0.5.1","preset":"balanced","presets":[{"id":"fast","label":"Light","description":"Light models for every role. Limits last longest.","preferences":{"schemaVersion":1,"maxConcurrent":2,"clients":{"chatgpt":{"code":{"model":"gpt-6-luna","effort":"high"},"light":{"model":"gpt-6-luna","effort":"low"},"avoidModels":[]},"claude":{"code":{"model":"claude-haiku-5-5","effort":"medium"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"reviewer":{"model":"claude-haiku-5-5","effort":"high"},"tester":{"model":"claude-haiku-5-5","effort":"high"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/kimi-for-coding","effort":"low"},"light":{"model":"kimi-code/kimi-for-coding","effort":"low"},"avoidModels":[]},"gemini":{"code":{"model":"flash","effort":null},"light":{"model":"flash_lite","effort":null},"avoidModels":[]},"grok":{"code":{"model":"grok-build-0.1","effort":null},"light":{"model":"grok-build-0.1","effort":null},"avoidModels":[]}}}},{"id":"balanced","label":"Standard","description":"Stronger models for code, review, tests and docs. Fits most plans.","preferences":{"schemaVersion":1,"maxConcurrent":3,"clients":{"chatgpt":{"code":{"model":"gpt-6.1-sol","effort":"medium"},"light":{"model":"gpt-6-luna","effort":"low"},"roles":{"reviewer":{"model":"gpt-6.1-sol","effort":"high"},"explorer":{"model":"gpt-6-luna","effort":"high"},"tester":{"model":"gpt-6.1-sol","effort":"high"},"writer":{"model":"gpt-6.1-terra","effort":"medium"}},"avoidModels":[]},"claude":{"code":{"model":"claude-sonnet-5-5","effort":"high"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"writer":{"model":"claude-sonnet-5-5","effort":"medium"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/k3-256k","effort":"high"},"light":{"model":"kimi-code/kimi-for-coding","effort":"low"},"roles":{"writer":{"model":"kimi-code/k3-256k","effort":"high"}},"avoidModels":[]},"gemini":{"code":{"model":"pro","effort":null},"light":{"model":"flash_lite","effort":null},"roles":{"explorer":{"model":"flash","effort":null},"writer":{"model":"flash","effort":null}},"avoidModels":[]},"grok":{"code":{"model":"grok-4.7","effort":null},"light":{"model":"grok-build-0.1","effort":null},"roles":{"writer":{"model":"grok-4.7","effort":null}},"avoidModels":[]}}}},{"id":"quality","label":"Top-tier","description":"High-end models for most roles. Uses limits fastest.","topModels":{"chatgpt":{"model":"gpt-6-astra","effort":"high"},"claude":{"model":"claude-opus-5-5","effort":"xhigh"},"kimi":{"model":"kimi-code/k3.1-pro","effort":"high"}},"preferences":{"schemaVersion":1,"maxConcurrent":2,"clients":{"chatgpt":{"code":{"model":"gpt-6.1-sol","effort":"high"},"light":{"model":"gpt-6.1-sol","effort":"medium"},"avoidModels":[]},"claude":{"code":{"model":"claude-opus-5-5","effort":"high"},"light":{"model":"claude-sonnet-5-5","effort":"medium"},"roles":{"explorer":{"model":"claude-opus-5-5","effort":"medium"},"writer":{"model":"claude-opus-5-5","effort":"medium"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/k3","effort":"high"},"light":{"model":"kimi-code/kimi-for-coding","effort":"high"},"roles":{"explorer":{"model":"kimi-code/k3","effort":"high"},"writer":{"model":"kimi-code/k3","effort":"high"}},"avoidModels":[]},"gemini":{"code":{"model":"pro","effort":null},"light":{"model":"flash","effort":null},"roles":{"explorer":{"model":"pro","effort":null},"writer":{"model":"pro","effort":null}},"avoidModels":[]},"grok":{"code":{"model":"grok-4.7","effort":null},"light":{"model":"grok-build-0.1","effort":null},"roles":{"explorer":{"model":"grok-4.7","effort":null},"writer":{"model":"grok-4.7","effort":null}},"avoidModels":[]}}}}],"catalogReviewedAt":"2026-11-02","preferencesHash":"87086ab43ff48d4b30fefc0989ea9b86684f0374369486ba197900c13a9eb1ce","notes":"# Changelog\n\nEach npm version is one configuration release: its presets, native role definitions, instructions and configuration page. Published versions are not rewritten. Applying another release is explicit; package installation alone changes no settings.\n\n## 0.5.1 — 2026-11-01\n\n### Why this release\n\nThe Grok Reviewer and Code explorer roles were not read-only (#30). Releases 0.4.0 and 0.5.0 wrote `permission_mode: plan` in their role files. Grok Build reads the fields of an agent file in camelCase, so it ignored this key without a warning, and the prompt was the only restriction. A role file template reaches your setup only through a new release.\n\n### Who should update\n\n- Anyone who uses Grok Build with APK and wants the Reviewer and the Code explorer to be read-only.\n- Other assistants get no configuration change. Their role files, presets and the model catalog are the same as in 0.5.0.\n\n### Migration and rollback\n\nAssistant IDs, preset ids, share-link format v2 and receipt format v4 are unchanged. `doctor` and `show` of 0.5.1 read installations and receipts from 0.4.0 and 0.5.0. Setup with 0.5.1 and `--release`, `--preset`, `--config` or explicit tool arguments replaces their Grok role files in place. A setup without these options reports `unchanged` and keeps the old role files. Setup with 0.5.0 or 0.4.0 moves Grok back in place and writes `permission_mode: plan` again. `uninstall` of 0.5.1 removes a 0.4.0, 0.5.0 or 0.5.1 installation. This was checked for Grok with the published 0.4.0 and 0.5.0 packages in isolated homes and with `grok inspect --json` of Grok Build 1.0.70. The [migration boundaries](docs/guide/updates-and-removal.md#migration-boundaries) of earlier releases still apply.\n\n### What changed\n\n- Grok: the Reviewer and the Code explorer role files have `capabilityMode: read-only` instead of `permission_mode: plan` (#30). When Grok Build starts a subagent of this type, it removes the built-in tools that edit, write, delete or move files and the shell tool. A capability mode requested at spawn cannot widen it. Tools from MCP servers stay, and image or video tools can stay when they are enabled. See [Grok read-only roles](docs/reference/assistants.md#grok-read-only-roles).\n- Grok: APK does not write `permissionMode: plan`. Grok Build reads this field, but at spawn it uses only `bypassPermissions`.\n- `show` reports `UNSUPPORTED_ROLE_CAPABILITY` for a Grok agent file whose `capabilityMode` Grok Build does not accept. Grok Build drops such an agent without a warning.\n- Not checked: a live Grok model task with a read-only role.\n- Configuration page: when you edit Kimi, Gemini or Grok alone, a short note above the model table tells how that assistant applies effort. Kimi shares one effort among the roles that use the same model alias. Gemini has native tiers only and no effort per role. Grok applies an effort only for models that support it, and a role without one runs at its model default. The **All** view shows no note. The unused note text in the page source is removed (#21).\n\n## 0.5.0 — 2026-11-01\n\n### Why this release\n\nThree follow-ups from the 2026-11-01 model review needed released configuration changes. Primary Anthropic data showed that Sonnet 5.5 at medium is too weak for the Standard Coder (#29). Grok Build turned out to accept a reasoning effort per role, and APK described its Grok effort behavior wrongly (#27). Claude 4.5 models approach retirement, and the `sonnet` alias still points at Sonnet 4.5 on some providers (#28). The release also makes undo visible, so people can apply a setup without fear, and keeps the share link short until a setup is complete.\n\n### Who should update\n\n- Anyone who uses the Standard preset with Claude.\n- Anyone who uses Grok Build and wants a different effort per role.\n- Everyone else can update for the clearer undo guidance and the corrected Grok and Claude information. Light and Top-tier values do not change.\n\n### Migration and rollback\n\nAssistant IDs, preset ids, share-link format v2 and receipt format v4 are unchanged. Setup with 0.5.0 replaces a 0.4.0 installation in place, and setup with 0.4.0 moves back in place, for ChatGPT, Claude, Gemini and Grok. A Grok role effort written by 0.5.0 is removed when 0.4.0 writes its role files. Kimi was not checked with a provisioned model pool. The Claude boundary to 0.3.0 and earlier from 0.4.0 still applies to receipts from 0.5.0: see the [migration boundaries](docs/guide/updates-and-removal.md#migration-boundaries).\n\n### Presets and model catalog\n\n- **Standard, Claude:** the Coder uses Sonnet 5.5 at high instead of medium (#29). Anthropic's per-effort data puts Sonnet 5.5 at medium 8.6 to 14.2 points below high on Terminal-Bench 4.0, FrontierCode and CursorBench, and Opus 5.5 at medium costs more per solved task on every measurement. Claude subagents without a named role in Standard also move from medium to high, so they use more of the plan. Reviewer and Test writer keep Sonnet 5.5 at high.\n- **Grok:** Grok 4.7 lists the native levels low, medium, high and xhigh, with high as its default. Grok 4.6, Grok 4.5 and Grok Build 0.1 offer no effort. Grok presets keep the native default, and there is still no Grok top choice (#27).\n- **Claude lifecycle:** Sonnet 4.5 is labelled \"Sonnet 4.5 (retires 2026-11-30)\" and records its deprecation date, its replacement and the partner schedules: Bedrock Legacy with end of life 2027-04-08, and no date on Google managed. Opus 4.5 and Haiku 4.5 stay active as legacy models without a deprecation notice (#28). The catalog review date is 2026-11-02.\n\nConfiguration checks are not model-quality evaluations.\n\n### What changed\n\n- Grok: each role can pin a reasoning effort. Setup writes `effort: \u003clevel>` in `~/.grok/agents/apk-\u003crole>.md`; a role without an effort gets no line. `--grok` accepts `role=model:effort` and `role=model:native`; `role=model` still means the native default and produces the same files as before. The configurator offers effort buttons for Grok 4.7 and custom model IDs, share links keep a Grok effort, and `agent-policy show` reports the effort of each Grok agent.\n- Fixed: APK no longer says that Grok subagents use the main session effort. APK pins each role's model, so a role without an effort runs at that model's default (Grok 4.7: high). The setup warning `grok-per-role-effort-unsupported` is replaced by `grok-effort-model-dependent`.\n- The README and step 4 of the configurator show how to undo a setup: the uninstall command pinned to the release, with a copy button. Removal restores the settings you had before APK and keeps your unrelated edits.\n- The configurator puts a `#setup=` share link in the address only when steps 1–3 are complete. Opening the page, Reset form, or a change that leaves a step incomplete removes the link. Existing links, including links to unfinished forms, still open as before.\n- Docs: the AI assistants reference shows which 4.5 models the Claude `sonnet`, `haiku` and `default` aliases resolve to on Bedrock, Google Agent Platform, Microsoft Foundry and Claude Platform on AWS, and tells Foundry users to pin a newer Sonnet before 2026-11-30. The model review cites primary sources for the Opus 5.5 and Sonnet 5.5 equal-effort numbers and records the Standard Claude Coder decision.\n- Docs: Grok Build ignores the `permission_mode` field that APK writes for read-only roles, so the Grok Reviewer and Code explorer are not read-only yet (#30).\n\n## 0.4.0 — 2026-11-01\n\n### Why this release\n\nThe presets and the model catalog were checked again on 2026-11-01 against the installed native clients and current vendor documentation. No vendor released or retired a subagent model since 2026-10-30. The new evidence changes where effort is spent, and it shows that Claude's top model is Opus 5.5, not Fable 5.1.\n\n### Who should update\n\n- Anyone who uses ChatGPT or Claude presets and wants the revised effort levels.\n- Anyone who uses the Top-tier top models switch in Claude.\n- Claude Code 2.1.316+ users who want subagents without a named role to stop inheriting the main session effort.\n\nKimi, Gemini and Grok preset values do not change, so their 0.3.0 installations need no update.\n\n### Migration and rollback\n\nAssistant IDs, preset ids (`fast`, `balanced`, `quality`), share-link format v2 and receipt format v4 are unchanged. Setup with 0.4.0 replaces a 0.3.0 installation in place, and receipts written by 0.3.0 still validate and uninstall. Setup with 0.3.0 moves ChatGPT, Kimi, Gemini and Grok back.\n\nClaude has a migration boundary in the downgrade direction. A 0.4.0 Claude receipt owns a third setting, `CLAUDE_CODE_SUBAGENT_EFFORT`, whenever the Coder effort is pinned, and every preset pins it. Version 0.3.0 does not know this setting, so its setup reports `INVALID_RECEIPT` and changes nothing. To move Claude back to 0.3.0, first remove its settings with 0.4.0: `npx --yes --ignore-scripts --package agent-policy-kit@0.4.0 agent-policy uninstall --client claude --apply`. Then set up with 0.3.0. This was checked with the 0.3.0 source in an isolated home. Removal restores the value that the setting had before setup, or removes it. Share links of 0.3.0 open on the 0.3.0 page.\n\n### Presets and model catalog\n\nRe-running setup applies these values. Installations keep their current values until then.\n\n- **Light, ChatGPT:** the Coder runs Luna at high instead of medium, the starting level OpenAI suggests for Luna. Luna stays the cheapest Codex model.\n- **Standard, ChatGPT:** the Docs writer uses GPT-6.1 Terra at medium instead of GPT-6.1 Sol. OpenAI positions Terra for clear writing, at half of Sol's usage.\n- **Top-tier, ChatGPT and Claude:** the Code explorer and Docs writer keep GPT-6.1 Sol and Opus 5.5 but run at medium instead of high. Implementation, review and tests stay at high.\n- **Top models switch, Claude:** Coder, Reviewer and Test writer use Opus 5.5 at xhigh instead of Fable 5.1 at high. Anthropic's own benchmarks put Opus 5.5 ahead of Fable 5.1 on every published coding benchmark at 2.5 times lower price, and Anthropic suggests a higher Opus effort before Fable. Fable 5.1 stays available in Custom. The switch now sets a model and an effort; ChatGPT and Kimi keep GPT-6 Astra and K3.1 Pro at high.\n\nThe catalog snapshot is dated 2026-11-01:\n\n- GPT-5.5 is marked retired from Codex for ChatGPT sign-in on 2026-10-14; it remains for API-key sign-in.\n- GPT-6 Astra's native default effort is medium in the signed-in server catalog; the bundled value low is kept as `bundledDefaultEffort`. The hidden, undocumented `gpt-reserve` selector is excluded.\n- Claude Code 2.1.316, Kimi Code 2.4.1 and Antigravity 1.4.12 are the observed client versions. Opus 4.5 and Haiku 4.5 record their earliest retirement dates.\n- Kimi records plan requirements: K3 and K3.1 Pro need Plus or higher, and the 1M context of K3 needs Pro or higher.\n- Antigravity's Flash Lite tier is marked undocumented: the CLI accepts it, but the subagent documentation lists only inherit, Flash and Pro.\n- Grok 4.7's reasoning levels (low to xhigh) are recorded as API capabilities. APK still writes only a model for each Grok role, so subagents use the main session effort.\n\nConfiguration checks are not model-quality evaluations.\n\n### What changed\n\n- Claude: setup also writes `CLAUDE_CODE_SUBAGENT_EFFORT`, the effort for subagents that name none, from the Coder effort capped at high. Claude Code 2.1.316 added this setting; earlier versions ignore it. Before, those subagents kept the main session effort.\n- `agent-policy show` reports the stored Claude default subagent effort and a `CLAUDE_CODE_SUBAGENT_EFFORT` environment override.\n- The top models switch label shows each tool's model and effort.\n- The website deployment guard also compares `src/release.mjs` with the release tag, because the page embeds its preset labels and top choices.\n- The configurator shows a note when Gemini is selected: APK configures Antigravity, not Gemini CLI. The README and the AI assistants reference say the same.\n- The documentation is reorganized into independent documents by audience: `docs/guide/` for people who use APK, `docs/reference/` for facts about assistants, roles, presets, the catalog and ownership, `docs/research/` for the evidence behind presets, and `docs/maintainers/` for development, releases and the website. [docs/README.md](docs/README.md) is the index. Old `docs/*.md` paths are removed without redirects. The 2026-11-01 model review is documented in [docs/research/2026-11-01-model-review.md](docs/research/2026-11-01-model-review.md).\n\n## 0.3.0 — 2026-11-01\n\n### Why this release\n\nPeople know their assistants as ChatGPT, Claude, Kimi, Gemini and Grok, not by the names of the coding agents inside them. The configurator and the CLI now use those names. Some people use only the desktop apps, and they have no CLI on PATH. Before this release, setup found nothing for them.\n\n### Who should update\n\n- Anyone who uses Codex in ChatGPT Desktop or Claude Code in the Code tab of Claude Desktop on macOS without a separate CLI.\n- Anyone who wants the general assistant names on the page and in the terminal.\n\nPreset values do not change, so an installation of 0.2.0 keeps working without an update.\n\n### Breaking change\n\nAI assistants now have general names: ChatGPT, Claude, Kimi, Gemini and Grok. APK still configures their coding agents: Codex, Claude Code, Kimi Code, Antigravity and Grok Build. Two technical IDs changed, and there is no migration:\n\n- `codex` is now `chatgpt`: `--chatgpt`, `--chatgpt-max-concurrent`, `--avoid-chatgpt`, `--client chatgpt` and the `clients.chatgpt` policy key.\n- `agy` is now `gemini`: `--gemini`, `--gemini-max-concurrent`, `--avoid-gemini`, `--client gemini` and the `clients.gemini` policy key.\n- Warning and error codes follow the new IDs, for example `chatgpt-native-precedence-limits` and `CHATGPT_CAP_ALIAS_CONFLICT`.\n\nBefore you use this version, remove the APK settings for these two assistants with the version that created them: `npx --yes --ignore-scripts --package agent-policy-kit@0.2.0 agent-policy uninstall --apply`. This version does not read the old `codex` and `agy` installation receipts, so its setup refuses the existing `apk-*` files as unowned. Policy files and share links that use the old IDs are refused too. Claude, Kimi and Grok keep their IDs.\n\n### Migration and rollback\n\nThe two renamed IDs set a migration boundary. These results come from tests with the published 0.2.0 package and this release:\n\n- **ChatGPT (Codex) and Gemini (Antigravity):** remove the APK settings with the version that created them before you set up with the other version. A move in either direction without removal reports `OWNERSHIP_CONFLICT` and changes nothing. After removal, setup with the other version succeeds.\n- **Claude, Kimi and Grok:** their IDs and receipt format v4 are unchanged. In the tests, setup with 0.3.0 upgraded 0.2.0 installations of Claude and Grok in place, and setup with 0.2.0 moved Claude back. Kimi uses the same receipt format, but it was not tested with a provisioned model pool.\n\n`uninstall --apply` removes the settings of every assistant. Run setup again afterwards for the assistants you use.\n\n### Presets and model catalog\n\nPreset models, effort levels and parallel limits are the same as in 0.2.0. Only the keys `codex` and `agy` became `chatgpt` and `gemini`, and the catalog labels became the general names. The model catalog snapshot is still dated 2026-10-30, with the Grok entries checked on 2026-11-01. Configuration checks are not model-quality evaluations.\n\n### What changed\n\n- The configurator calls the second step \"AI assistants\" and shows the general names. Readable CLI output uses the same names.\n- On macOS, setup finds the Codex that ChatGPT Desktop includes and the Claude Code in the Code tab of Claude Desktop, also when no CLI is on PATH. Both apps read the same settings as their CLIs. A CLI on PATH or in a conventional location still has priority. Detect output reports these clients with `origin: \"desktop_app\"`. Claude Cowork reads its settings from the Claude account, so APK does not configure it.\n\n## 0.2.0 — 2026-11-01\n\n### Why this release\n\nSubagents draw on the same plan limits as the main session, and every parallel session adds to that usage. Without explicit choices, subagents can inherit the most expensive model and use up a weekly limit within days. This release names the work modes by how much of a plan subagents may use, adds per-tool parallel limits, a read-only settings check and Grok Build support.\n\n### Who should update\n\nAnyone who wants Grok Build roles, per-tool parallel limits or the renamed modes. Re-running setup with 0.2.0 applies the new preset values: Top-tier now uses Opus 5.5, GPT-6.1 Sol and K3 at high effort, with top models behind an opt-in switch, and Kimi's Standard Docs writer uses K3 256K. Installations of 0.1.0 keep working unchanged until setup is run again.\n\n### Migration and rollback\n\nPreset ids (`fast`, `balanced`, `quality`), receipt format v4 and ownership, drift and rollback behavior are unchanged. Version 1 share links still open; new links use version 2 and carry each tool's parallel limit. Applying 0.1.0 again restores its owned settings, as the synthetic upgrade/downgrade gate verifies. Grok Build is new, so it has nothing to migrate.\n\n### Presets and model catalog\n\nThe model catalog snapshot is dated 2026-10-30; Grok Build entries were checked on 2026-11-01 against the Grok Build 1.0.70 user guide and the xAI model list. An independent audit compared every preset, tool and role with the catalog and the documentation tables, and a test now keeps those tables in sync. Configuration checks are not model-quality evaluations.\n\n### What changed\n\n- Add Grok Build as a fifth coding tool, listed after Antigravity. APK writes `agents/apk-\u003crole>.md` role files (Reviewer and Code explorer use the read-only `permission_mode: plan`), per-role models and a `general-purpose` fallback copied from the first selected role (the Coder when selected) in `config.toml` `[subagents.models]`, a native `[subagents] max_concurrent` cap and a delegation block in `AGENTS.md` under `$GROK_HOME` (default `~/.grok`). Per-role effort is not configurable, so every Grok choice has effort null and the page shows no effort controls. Presets use Grok Build 0.1, xAI's fast coding model, for light work and Grok 4.7 for stronger roles; Grok 4.6 and 4.5 stay available in Custom. Explicit commands use `--grok`, `--grok-max-concurrent` and `--avoid-grok`. Removal restores the original settings and refuses on local edits.\n\n- Rename work modes to Light, Standard and Top-tier and describe them by how much of a plan's limits subagents use. Preset ids and share-link ids are unchanged. Top-tier now uses Opus 5.5, GPT-6.1 Sol and K3 at high effort for code, review and tests. A per-tool switch under Top-tier opts those roles into Fable 5.1, GPT-6 Astra or K3.1 Pro; it is off by default. Top models no longer run at xhigh/max, because native default subagent settings copy the first selected role (the Coder when selected) to subagents started without a named role.\n\n- Explain each configuration step with a short ? note, and stop repeating vendor billing or version documentation in the work-mode notice.\n\n- Start a fresh or reset form with every subagent role selected, and give the empty coding-tool field the same appearance as the empty role field.\n\n- Automatically deploy the latest website from verified main while preserving exact tagged release pages and older share links. Configuration guards keep commands pinned to published package capabilities; npm releases remain explicit.\n\n- Credit Mykola Maksymenko in the configuration page and package metadata. Link the supplied LinkedIn profile and related projects, with static author/project structured data and a release-specific canonical URL.\n\n- Interactive terminals get readable setup, doctor, release and show output; captured output keeps the existing JSON contract, and `--json` forces JSON.\n\n- `agent-policy show` reads the current user-level subagent settings of every tool, before or after APK installation, without writing files. The page footer offers it as \"Check current settings\" with a copy button.\n\n- Each tool has its own parallel limit from 1 to 32, set in its details on the page or with `--TOOL-max-concurrent`; policies accept `clients[tool].maxConcurrent`.\n\n- The page adds Add all for roles and tools, a GitHub link in the header, Reset form beside the release line, and preset switching for a single selected tool without a needless confirmation.\n\n## 0.1.0 — 2026-10-30\n\n### Why this release\n\nUse a common approach to optional delegation across Codex, Claude Code, Kimi and Antigravity, without an extra process in normal agent operation. Configure once and remove the installer afterward.\n\n### What it configures\n\nSix focused roles cover implementation, read-only review, code discovery, test creation, documentation and prescribed execution. Each preset assigns a model and supported effort to every role; the [preset matrix](docs/reference/presets.md) explains the choices.\n\nThese are starting preferences, not model-quality benchmarks. Native model formats and alias behavior were reviewed against the official sources linked in [support](docs/reference/assistants.md) and [model maintenance](docs/maintainers/model-review.md). Model availability must be checked before applying. Provider aliases and tiers may resolve differently over time.\n\n### Presets and model catalog\n\nAll three presets were rebuilt for public use. Personal Astra/Opus/Fable and other avoid lists were removed. Fast gives review and testing more reasoning than simple execution. Balanced separates implementation, verification, discovery, documentation and mechanics. Quality uses Astra/Fable for demanding work and regular K3.1 Pro at max for Kimi code/review/tests. Claude recommendations pin current versioned IDs; Kimi Balanced uses the quota-conscious K3 256K variant. These are editable recommendations, not benchmark results.\n\nThe release contains a dated model/effort catalog from official documentation and native selector observations, including native-default effort and account-dependent availability. Antigravity role choices are native tiers, with no invented per-role effort setting.\n\nCatalog audit, 2026-10-30 UTC: Kimi now lists all six current models, including K3.1 Pro and Pro Highspeed. Quality first now uses regular K3.1 Pro at max effort for implementation/review/tests; other roles have separate choices described in the preset matrix. Highspeed remains optional because its faster output consumes about twice regular Pro's quota, according to Kimi. Setup requires provisioned access and does not silently fall back to another model.\n\nBoth Pro variants require compatible thinking settings. Even with unpinned effort, setup refuses an explicit thinking-disabled setting without modifying it.\n\nCodex effort choices/defaults now follow CLI 0.166.0 rather than API defaults; API metadata remains separate, and Ultra stays separate from ordinary effort. Claude Opus 4.5 no longer advertises an API-only native effort override. Existing custom inputs using levels outside the current native catalog require review before reapplication; owned inspection/removal remains independent of current recommendations. Sonnet 4.5 remains selectable with its Anthropic deprecation status marked. Antigravity CLI's four tier choices are unchanged.\n\n### What changed\n\n- Added Test writer and Docs writer; clarified Code explorer and Task runner. Old four-role native v2/v3 receipts remain supported, including explicit expansion to six, owned removal, drift refusal and late rollback. New v4 snapshots support six independently configured Kimi aliases.\n\n- Readable type uses a compact 36/20/15/13 px scale with more spacing; narrow layouts stack model controls and command actions.\n- A short collapsible explanation introduces role-specific models, native setup and optional delegation, using the same wording as the README.\n- The builder now starts with no roles, tools or chosen modes. Green checks track completed selections and successful copy, and Reset form restores a blank state. URL fragments restore visible settings without a backend. Conditional section hints and changed step markers use a two-second highlight hold plus two-second fade, respecting reduced motion. Selection controls share a soft treatment; Copy remains the primary action.\n- Page commands always list every selected role/model/effort under its tool, including presets. Explicit --roles, --max-concurrent and optional --avoid-TOOL preserve the existing selection, cap and guidance. :native represents unpinned effort; Antigravity remains tier-only. The shared codec validates complete role maps and rejects duplicate/mixed input before writes. Legacy release/config/policy inputs remain supported.\n- The four-step page now selects subagent roles and coding tools before mode/model/effort configuration. It generates and copies a real pinned command. Tool additions preserve All or a manually selected view. Role help uses the same prompt definitions as native generation.\n- Optional selectedRoles creates only the requested native roles. Receipt v4 binds that role set to owned files and supports safe expansion, reduction and removal. Earlier v2/v3 native receipts retain their historical four-role ownership boundary. Unselected Kimi aliases do not need provisioning or effort pins.\n- Native role files and routing instructions apply only when the main agent chooses delegation. Main models and disabled delegation features are preserved.\n- A static page lets each tool use its own mode and per-task models/effort. All shows mixed settings as Custom and can apply one preset to every tool. Scope warnings protect individual and global replacements; the page generates one pinned command.\n- Explicit release application supports safe upgrade/downgrade of owned settings; per-client receipts record the actual applied version and custom choices.\n- Ownership/drift checks, private backups and rollback preserve unrelated settings and earlier user values.\n- No custom hooks, proxy, plugin, launcher, daemon or normal-operation runtime is installed.\n\n### Who should use it\n\nPeople who want consistent subagent preferences across their installed coding tools. You can keep the recommendations or select different native models in the configuration page.\n\n### Applying this version\n\n```sh\nnpx --yes --ignore-scripts --package agent-policy-kit@0.1.0 agent-policy setup --release --apply\n```\n\nWithout --apply the same command previews the changes. The page-generated explicit tool arguments apply the visible choices using this release's native templates. See [release usage](docs/guide/updates-and-removal.md).\n\n### Migration and limits\n\nThis is the first public release. Synthetic versions in tests are not real releases. Experimental runtime receipts from older development commits require their original owned removal. Supported native snapshot formats can be updated safely; unknown future formats/layouts are refused.\n\nKimi/Antigravity concurrency guidance and native tier/precedence limits remain explicit. A pinned release reproduces declared configuration, not provider weights, entitlement or model quality.\n","packageSpec":"agent-policy-kit@0.5.1","preferences":{"schemaVersion":1,"maxConcurrent":3,"clients":{"chatgpt":{"code":{"model":"gpt-6.1-sol","effort":"medium"},"light":{"model":"gpt-6-luna","effort":"low"},"roles":{"reviewer":{"model":"gpt-6.1-sol","effort":"high"},"explorer":{"model":"gpt-6-luna","effort":"high"},"tester":{"model":"gpt-6.1-sol","effort":"high"},"writer":{"model":"gpt-6.1-terra","effort":"medium"}},"avoidModels":[]},"claude":{"code":{"model":"claude-sonnet-5-5","effort":"high"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"writer":{"model":"claude-sonnet-5-5","effort":"medium"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/k3-256k","effort":"high"},"light":{"model":"kimi-code/kimi-for-coding","effort":"low"},"roles":{"writer":{"model":"kimi-code/k3-256k","effort":"high"}},"avoidModels":[]},"gemini":{"code":{"model":"pro","effort":null},"light":{"model":"flash_lite","effort":null},"roles":{"explorer":{"model":"flash","effort":null},"writer":{"model":"flash","effort":null}},"avoidModels":[]},"grok":{"code":{"model":"grok-4.7","effort":null},"light":{"model":"grok-build-0.1","effort":null},"roles":{"writer":{"model":"grok-4.7","effort":null}},"avoidModels":[]}}},"hostedReleases":[],"catalog":{"schemaVersion":1,"reviewedAt":"2026-11-02","scope":"Documented/native coding-tool selectors at this release; account access and custom deployment IDs vary.","clients":{"chatgpt":{"label":"ChatGPT","efforts":["none","minimal","low","medium","high","xhigh","max"],"observedClientVersion":"0.166.0","observation":"codex debug models --bundled: 9 visible selectors; 3 hidden specialized/utility entries excluded. The signed-in server catalog (2026-11-01) lists 8 visible selectors without GPT-5.5, the hidden gpt-reserve entry and a medium default for GPT-6 Astra.","models":[{"id":"gpt-6-astra","label":"GPT-6 Astra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-6-astra","kind":"model","apiEfforts":["low","medium","high","xhigh","max"],"apiDefaultEffort":null,"nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"],"bundledDefaultEffort":"low"},{"id":"gpt-6.1-sol","label":"GPT-6.1 Sol","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-6.1-sol","kind":"model","apiEfforts":["low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6.1-terra","label":"GPT-6.1 Terra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-6.1-terra","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6-sol","label":"GPT-6 Sol","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-6-sol","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6-luna","label":"GPT-6 Luna","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-6-luna","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models"},{"id":"gpt-5.6-sol","label":"GPT-5.6 Sol","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-5.6-sol","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-5.6-terra","label":"GPT-5.6 Terra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-5.6-terra","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-5.6-luna","label":"GPT-5.6 Luna","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-5.6-luna","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models"},{"id":"gpt-5.5","label":"GPT-5.5 (API key only)","efforts":["low","medium","high","xhigh"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-5.5","kind":"model","apiEfforts":["none","low","medium","high","xhigh"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","lifecycle":{"status":"retired","retirementDate":"2026-10-14","scope":"Codex with ChatGPT sign-in; API-key sign-in keeps access","source":"https://learn.chatgpt.com/docs/models"}}],"excluded":[{"id":"gpt-daybreak-blue-latest","reason":"hidden specialized selector"},{"id":"gpt-daybreak-red-latest","reason":"hidden specialized selector"},{"id":"codex-auto-review","reason":"hidden internal utility selector"},{"id":"gpt-reserve","reason":"hidden undocumented selector in the server catalog"}],"note":"Efforts follow the bundled Codex CLI 0.166.0 catalog. Defaults follow the signed-in server catalog of 2026-11-01 where it differs (bundledDefaultEffort keeps the bundled value). API capabilities are separate apiEfforts/apiDefaultEffort metadata. Ultra is a delegating execution mode, recorded separately and not offered as ordinary subagent effort. An API-supported level absent from the native catalog is unverified for manual per-role configuration, not proven runtime-rejected. GPT-5.5 left Codex for ChatGPT sign-in on 2026-10-14 and remains for API-key sign-in."},"claude":{"label":"Claude","efforts":["low","medium","high","xhigh","max"],"observedClientVersion":"2.1.316","models":[{"id":"sonnet","label":"Sonnet (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"opus","label":"Opus (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"haiku","label":"Haiku (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"fable","label":"Fable (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/sub-agents#choose-a-model","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"claude-fable-5-1","label":"Fable 5.1","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-5-5","label":"Opus 5.5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-sonnet-5-5","label":"Sonnet 5.5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-haiku-5-5","label":"Haiku 5.5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-fable-5","label":"Fable 5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-5","label":"Opus 5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-sonnet-5","label":"Sonnet 5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-8","label":"Opus 4.8","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-7","label":"Opus 4.7","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"xhigh","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-6","label":"Opus 4.6","efforts":["low","medium","high","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-sonnet-4-6","label":"Sonnet 4.6","efforts":["low","medium","high","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-5-20251101","label":"Opus 4.5","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config#adjust-effort-level","kind":"model","apiEfforts":["low","medium","high"],"apiDefaultEffort":null,"apiSource":"https://platform.claude.com/docs/en/build-with-claude/effort","lifecycle":{"status":"active","earliestRetirement":"2026-11-24","scope":"Claude API, Claude Platform on AWS, Claude Models on Google Cloud (Anthropic managed) and Microsoft Foundry","note":"Legacy model with no deprecation notice. The date is a floor, not a scheduled retirement; Anthropic gives at least 60 days' notice.","partners":[{"platform":"Google Cloud (Google managed)","earliestRetirement":"2026-11-24","source":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/deprecations/partner-models"}],"source":"https://platform.claude.com/docs/en/about-claude/model-deprecations"}},{"id":"claude-sonnet-4-5-20250929","label":"Sonnet 4.5 (retires 2026-11-30)","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"model","lifecycle":{"status":"deprecated","deprecationDate":"2026-09-30","retirementDate":"2026-11-30","replacement":"claude-sonnet-5-5","scope":"Claude API, Claude Platform on AWS, Claude Models on Google Cloud (Anthropic managed) and Microsoft Foundry","partners":[{"platform":"Amazon Bedrock","status":"legacy","endOfLife":"2027-04-08","source":"https://docs.aws.amazon.com/bedrock/latest/userguide/model-lifecycle-legacy.html"},{"platform":"Google Cloud (Google managed)","note":"No retirement date announced. The earliest retirement date, 2026-09-29, passed.","source":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/partner-models/claude/sonnet-4-5"}],"source":"https://platform.claude.com/docs/en/about-claude/model-deprecations"}},{"id":"claude-haiku-4-5-20251001","label":"Haiku 4.5","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"model","lifecycle":{"status":"active","earliestRetirement":"2026-10-15","scope":"Claude API, Claude Platform on AWS, Claude Models on Google Cloud (Anthropic managed) and Microsoft Foundry","note":"Legacy model with no deprecation notice. The earliest retirement date passed without an announcement.","partners":[{"platform":"Google Cloud (Google managed)","earliestRetirement":"2026-12-07","source":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/deprecations/partner-models"}],"source":"https://platform.claude.com/docs/en/about-claude/model-deprecations"}},{"id":"inherit","label":"Inherit main model","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/sub-agents","kind":"inherit","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."}],"note":"Full model IDs use the current Claude Code native effort table, which differs from API support for Opus 4.5. Alias/inherit efforts are possible requested levels, not a guarantee for every resolved provider model; unsupported levels can clamp or be ignored. Current account access and provider alias resolution vary. Claude Code 2.1.316 adds CLAUDE_CODE_SUBAGENT_EFFORT for subagents that name no effort; earlier versions ignore it. CLAUDE_CODE_EFFORT_LEVEL still overrides subagent effort frontmatter.","excluded":[{"id":"best","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"default","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"opus[1m]","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"opusplan","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"sonnet[1m]","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"}]},"kimi":{"label":"Kimi","efforts":["low","medium","high","xhigh","max"],"models":[{"id":"kimi-code/k3.1-pro","label":"K3.1 Pro","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3.1-pro","thinkingRequired":true},{"id":"kimi-code/k3.1-pro-highspeed","label":"K3.1 Pro Highspeed","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3.1-pro-highspeed","thinkingRequired":true},{"id":"kimi-code/k3","label":"K3","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3","planRequirement":"Plus (Moderato) or higher; 1M context requires Pro (Allegretto) or higher"},{"id":"kimi-code/k3-256k","label":"K3 · 256K","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3-256k"},{"id":"kimi-code/kimi-for-coding","label":"K2.8 Preview","efforts":["low","high","max"],"defaultEffort":"max","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"kimi-for-coding"},{"id":"kimi-code/kimi-for-coding-highspeed","label":"K2.7 Code HighSpeed","efforts":[],"defaultEffort":null,"source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"kimi-for-coding-highspeed"}],"note":"Current Kimi Code docs list six model IDs; the older kimi.ai/help page still lists four. K3.1 Pro and Highspeed require thinking and support low/high/max, default high. These are preferred native aliases: setup resolves a missing preferred alias only to a unique provisioned match; no provider identity is invented. Account tier controls access. K3 and K3.1 Pro require the Plus (Moderato) plan or higher. The 1M context of K3 and every Highspeed model require Pro (Allegretto) or higher; on Plus, k3 stays at 256K context and uses about twice the quota of k3-256k. K2.7 Code HighSpeed uses about three times the quota.","observedClientVersion":"2.4.1","observation":"Kimi Code CLI 2.4.0 and 2.4.1: all six documented preferred aliases and native effort/default capabilities corroborated through whitelisted provisioned metadata; no credentials or custom account aliases retained."},"gemini":{"label":"Gemini","efforts":[],"observedClientVersion":"1.4.12","models":[{"id":"pro","label":"Pro","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"},{"id":"flash","label":"Flash","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"},{"id":"flash_lite","label":"Flash Lite","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier","documented":false,"nativeSource":"Antigravity CLI 1.4.12 agent-file parser"},{"id":"inherit","label":"Inherit main model","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"}],"note":"Native per-subagent selectors are tiers, not the session model inventory. The CLI 1.4.12 parser accepts inherit/flash_lite/flash/pro; the public subagent documentation lists only inherit, flash and pro, so flash_lite is undocumented. Google does not document which Gemini model each tier uses; the server sets it per account. Per-role effort is not exposed by the agent-file schema; --effort and /effort apply to the whole session."},"grok":{"label":"Grok","efforts":["low","medium","high","xhigh","max"],"observedClientVersion":"1.0.70","models":[{"id":"grok-4.7","label":"Grok 4.7","efforts":["low","medium","high","xhigh"],"defaultEffort":"high","source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model","apiEfforts":["low","medium","high","xhigh"],"apiDefaultEffort":"high"},{"id":"grok-4.6","label":"Grok 4.6","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"},{"id":"grok-4.5","label":"Grok 4.5","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"},{"id":"grok-build-0.1","label":"Grok Build 0.1","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"}],"note":"Per-subagent models are set in config.toml [subagents.models]; model IDs follow the documented xAI model list and account access varies. APK writes a role effort as effort in the agent frontmatter (agents/apk-\u003crole>.md); Grok Build 1.0.70 accepts low/medium/high/xhigh/max there and drops the whole agent for any other value. The effort applies only when the model supports effort: Grok 4.7 lists low/medium/high/xhigh with default high, Grok Build 0.1 has no configurable effort, and the effort levels of Grok 4.6 and 4.5 are not verified. A role without an effort runs at the default effort of its pinned model, not at the main session effort; a role named like the agent ([subagents.roles.\u003cagent>] reasoning_effort) or a harness spawn override wins over the frontmatter. [subagents] max_concurrent is a native cap."}}},"roles":[{"id":"worker","name":"Coder","kind":"code","assignment":"scoped implementation and fixes","description":"Implements scoped changes, preserves peers' edits, and verifies the result.","prompt":"Implement the assigned change or fix within the assigned files. You share the workspace with other agents: preserve their edits. Verify the result and report changes, checks, and remaining limitations. Do not create child agents; return any need for further delegation to the parent."},{"id":"reviewer","name":"Reviewer","kind":"code","assignment":"read-only correctness, security and regression review","description":"Reviews correctness, security and regressions without edits; reports actionable evidence.","prompt":"Review the assigned change without editing files. Find actionable correctness, security, and regression issues. Report each finding with file and line evidence and explain its impact; distinguish confirmed issues from uncertainty. Do not create child agents; return any need for further delegation to the parent."},{"id":"explorer","name":"Code explorer","kind":"light","assignment":"read-only code and documentation discovery","description":"Maps code and documentation, cites sources, and separates facts from uncertainty.","prompt":"Explore the assigned code and documentation without editing files. Return a concise map or factual answer with source paths or citations. Distinguish verified facts from assumptions and unknowns. Do not create child agents; return any need for further delegation to the parent."},{"id":"tester","name":"Test writer","kind":"code","assignment":"test creation and targeted execution","description":"Writes behavior and edge-case tests, reproduces issues, and runs targeted checks.","prompt":"Own the assigned tests and targeted execution. Reproduce the issue or establish a baseline, then test observable behavior and edge cases. Never weaken checks to make them pass. Do not edit application code unless explicitly assigned. Preserve peers' edits and report results and limitations. Do not create child agents; return any need for further delegation to the parent."},{"id":"writer","name":"Docs writer","kind":"light","assignment":"assigned documentation, examples and release notes","description":"Updates assigned docs and examples, verifies claims, and keeps terminology consistent.","prompt":"Update only the assigned documentation, examples, or release notes. Verify claims against code or cited sources and use consistent terminology. Do not edit application code. Preserve peers' edits and report changes and unknowns. Do not create child agents; return any need for further delegation to the parent."},{"id":"routine","name":"Task runner","kind":"light","assignment":"explicit commands and mechanical edits","description":"Runs prescribed commands and mechanical edits; returns ambiguous decisions to the parent.","prompt":"Execute only the prescribed commands or clearly specified mechanical edits. Preserve other agents' work and report the outcome. Do not make ambiguous design or behavior decisions; return those decisions to the parent. Do not create child agents; return any need for further delegation to the parent."}],"unreleased":false};
328
+ const RELEASE = {"schemaVersion":1,"version":"0.5.2","preset":"balanced","presets":[{"id":"fast","label":"Light","description":"Light models for every role. Limits last longest.","preferences":{"schemaVersion":1,"maxConcurrent":2,"clients":{"chatgpt":{"code":{"model":"gpt-6-luna","effort":"high"},"light":{"model":"gpt-6-luna","effort":"low"},"avoidModels":[]},"claude":{"code":{"model":"claude-haiku-5-5","effort":"medium"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"reviewer":{"model":"claude-haiku-5-5","effort":"high"},"tester":{"model":"claude-haiku-5-5","effort":"high"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/kimi-for-coding","effort":"low"},"light":{"model":"kimi-code/kimi-for-coding","effort":"low"},"avoidModels":[]},"gemini":{"code":{"model":"flash","effort":null},"light":{"model":"flash_lite","effort":null},"avoidModels":[]},"grok":{"code":{"model":"grok-build-0.1","effort":null},"light":{"model":"grok-build-0.1","effort":null},"avoidModels":[]}}}},{"id":"balanced","label":"Standard","description":"Stronger models for code, review, tests and docs. Fits most plans.","preferences":{"schemaVersion":1,"maxConcurrent":3,"clients":{"chatgpt":{"code":{"model":"gpt-6.1-sol","effort":"medium"},"light":{"model":"gpt-6-luna","effort":"low"},"roles":{"reviewer":{"model":"gpt-6.1-sol","effort":"high"},"explorer":{"model":"gpt-6-luna","effort":"high"},"tester":{"model":"gpt-6.1-sol","effort":"high"},"writer":{"model":"gpt-6.1-terra","effort":"medium"}},"avoidModels":[]},"claude":{"code":{"model":"claude-sonnet-5-5","effort":"high"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"writer":{"model":"claude-sonnet-5-5","effort":"medium"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/k3-256k","effort":"high"},"light":{"model":"kimi-code/kimi-for-coding","effort":"low"},"roles":{"writer":{"model":"kimi-code/k3-256k","effort":"high"}},"avoidModels":[]},"gemini":{"code":{"model":"pro","effort":null},"light":{"model":"flash_lite","effort":null},"roles":{"explorer":{"model":"flash","effort":null},"writer":{"model":"flash","effort":null}},"avoidModels":[]},"grok":{"code":{"model":"grok-4.7","effort":null},"light":{"model":"grok-build-0.1","effort":null},"roles":{"writer":{"model":"grok-4.7","effort":null}},"avoidModels":[]}}}},{"id":"quality","label":"Top-tier","description":"High-end models for most roles. Uses limits fastest.","topModels":{"chatgpt":{"model":"gpt-6-astra","effort":"high"},"claude":{"model":"claude-opus-5-5","effort":"xhigh"},"kimi":{"model":"kimi-code/k3.1-pro","effort":"high"}},"preferences":{"schemaVersion":1,"maxConcurrent":2,"clients":{"chatgpt":{"code":{"model":"gpt-6.1-sol","effort":"high"},"light":{"model":"gpt-6.1-sol","effort":"medium"},"avoidModels":[]},"claude":{"code":{"model":"claude-opus-5-5","effort":"high"},"light":{"model":"claude-sonnet-5-5","effort":"medium"},"roles":{"explorer":{"model":"claude-opus-5-5","effort":"medium"},"writer":{"model":"claude-opus-5-5","effort":"medium"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/k3","effort":"high"},"light":{"model":"kimi-code/kimi-for-coding","effort":"high"},"roles":{"explorer":{"model":"kimi-code/k3","effort":"high"},"writer":{"model":"kimi-code/k3","effort":"high"}},"avoidModels":[]},"gemini":{"code":{"model":"pro","effort":null},"light":{"model":"flash","effort":null},"roles":{"explorer":{"model":"pro","effort":null},"writer":{"model":"pro","effort":null}},"avoidModels":[]},"grok":{"code":{"model":"grok-4.7","effort":null},"light":{"model":"grok-build-0.1","effort":null},"roles":{"explorer":{"model":"grok-4.7","effort":null},"writer":{"model":"grok-4.7","effort":null}},"avoidModels":[]}}}}],"catalogReviewedAt":"2026-11-02","preferencesHash":"87086ab43ff48d4b30fefc0989ea9b86684f0374369486ba197900c13a9eb1ce","notes":"# Changelog\n\nEach npm version is one configuration release: its presets, native role definitions, instructions and configuration page. Published versions are not rewritten. Applying another release is explicit; package installation alone changes no settings.\n\n## 0.5.2 — 2026-11-01\n\n### Why this release\n\nUninstall did not give back `config.toml` byte for byte when APK had added a table to it (#34). When APK adds a table, such as `[subagents.models]` for Grok, it writes one empty line before the table header. Uninstall removed the header but kept this empty line. Each replacing setup, for example with another preset, removed the table in memory the same way and then wrote the table again with a new empty line. After a Grok setup, one replacing setup and an uninstall, two empty lines stayed after the `[subagents]` table. Settings and values were always restored. Only the bytes of the file were different. The undo logic reaches your setup only through a new release.\n\n### Who should update\n\n- Anyone who uses Grok Build with APK. APK always adds the `[subagents.models]` table for Grok.\n- Anyone who uses ChatGPT or Kimi with APK and whose `config.toml` did not have the table that APK writes to: `[agents]` for ChatGPT, or `[secondary_model]` and `[models.\"ALIAS\".overrides]` for Kimi. A ChatGPT file that had an `[agents]` table was restored exactly before.\n- Claude and Gemini get no change. They have no `config.toml`.\n- Role files, presets, instructions and the model catalog are the same as in 0.5.1.\n\n### Migration and rollback\n\nAssistant IDs, preset ids, share-link format v2 and receipt format v4 are unchanged. `doctor`, `show`, setup and `uninstall` of 0.5.2 read receipts from 0.4.0, 0.5.0 and 0.5.1. These releases wrote the same file layout, so uninstall of 0.5.2 also removes the empty line before a table that they added. This was checked for Grok with the published 0.4.0, 0.5.0 and 0.5.1 packages in isolated homes.\n\n- An empty line that a replacing setup of 0.5.1 or earlier already left in the file stays. APK cannot tell it from your own lines. Remove it by hand if you want.\n- If your `config.toml` did not end with a line break, APK must add one before it writes the first new line. 0.5.2 records this in the receipt as `addedLineBreak`, a hash of that last line, and removes the line break again on uninstall when the file ends with that line again. A line that you added after it keeps its line break. Releases 0.5.1 and earlier do not know this field and stop with `INVALID_RECEIPT`. To move such an assistant back to 0.5.1, first remove it with 0.5.2: `npx --yes --ignore-scripts --package agent-policy-kit@0.5.2 agent-policy uninstall --client grok --apply`. Then set up with 0.5.1. A receipt from 0.5.1 or earlier for such a file has no record, so uninstall keeps the line break at the end of the file.\n- All other 0.5.2 receipts have the same fields as before. Setup with 0.5.1 moves them back in place, and uninstall with 0.5.1 removes them, with the old empty line behavior.\n\nSee the [migration boundaries](docs/guide/updates-and-removal.md#migration-boundaries).\n\n### What changed\n\n- Fixed: uninstall and replacing setups remove the empty line that APK wrote before a table it added, together with the table (#34). APK removes the empty line with the line ending of the table header, so an empty line that you added with another line ending stays. A setup, any number of replacing setups and an uninstall give back the original bytes of `config.toml` for Grok, ChatGPT and Kimi. Empty lines that you added stay.\n- Fixed: uninstall removes a line break that APK added at the end of a `config.toml` that did not end with one. If you added lines after the APK settings, the line break stays, because TOML needs it.\n- A replacing setup writes the same `config.toml` bytes as a first setup on the original file.\n\n## 0.5.1 — 2026-11-01\n\n### Why this release\n\nThe Grok Reviewer and Code explorer roles were not read-only (#30). Releases 0.4.0 and 0.5.0 wrote `permission_mode: plan` in their role files. Grok Build reads the fields of an agent file in camelCase, so it ignored this key without a warning, and the prompt was the only restriction. A role file template reaches your setup only through a new release.\n\n### Who should update\n\n- Anyone who uses Grok Build with APK and wants the Reviewer and the Code explorer to be read-only.\n- Other assistants get no configuration change. Their role files, presets and the model catalog are the same as in 0.5.0.\n\n### Migration and rollback\n\nAssistant IDs, preset ids, share-link format v2 and receipt format v4 are unchanged. `doctor` and `show` of 0.5.1 read installations and receipts from 0.4.0 and 0.5.0. Setup with 0.5.1 and `--release`, `--preset`, `--config` or explicit tool arguments replaces their Grok role files in place. A setup without these options reports `unchanged` and keeps the old role files. Setup with 0.5.0 or 0.4.0 moves Grok back in place and writes `permission_mode: plan` again. `uninstall` of 0.5.1 removes a 0.4.0, 0.5.0 or 0.5.1 installation. This was checked for Grok with the published 0.4.0 and 0.5.0 packages in isolated homes and with `grok inspect --json` of Grok Build 1.0.70. The [migration boundaries](docs/guide/updates-and-removal.md#migration-boundaries) of earlier releases still apply.\n\n### What changed\n\n- Grok: the Reviewer and the Code explorer role files have `capabilityMode: read-only` instead of `permission_mode: plan` (#30). When Grok Build starts a subagent of this type, it removes the built-in tools that edit, write, delete or move files and the shell tool. A capability mode requested at spawn cannot widen it. Tools from MCP servers stay, and image or video tools can stay when they are enabled. See [Grok read-only roles](docs/reference/assistants.md#grok-read-only-roles).\n- Grok: APK does not write `permissionMode: plan`. Grok Build reads this field, but at spawn it uses only `bypassPermissions`.\n- `show` reports `UNSUPPORTED_ROLE_CAPABILITY` for a Grok agent file whose `capabilityMode` Grok Build does not accept. Grok Build drops such an agent without a warning.\n- Not checked: a live Grok model task with a read-only role.\n- Configuration page: when you edit Kimi, Gemini or Grok alone, a short note above the model table tells how that assistant applies effort. Kimi shares one effort among the roles that use the same model alias. Gemini has native tiers only and no effort per role. Grok applies an effort only for models that support it, and a role without one runs at its model default. The **All** view shows no note. The unused note text in the page source is removed (#21).\n\n## 0.5.0 — 2026-11-01\n\n### Why this release\n\nThree follow-ups from the 2026-11-01 model review needed released configuration changes. Primary Anthropic data showed that Sonnet 5.5 at medium is too weak for the Standard Coder (#29). Grok Build turned out to accept a reasoning effort per role, and APK described its Grok effort behavior wrongly (#27). Claude 4.5 models approach retirement, and the `sonnet` alias still points at Sonnet 4.5 on some providers (#28). The release also makes undo visible, so people can apply a setup without fear, and keeps the share link short until a setup is complete.\n\n### Who should update\n\n- Anyone who uses the Standard preset with Claude.\n- Anyone who uses Grok Build and wants a different effort per role.\n- Everyone else can update for the clearer undo guidance and the corrected Grok and Claude information. Light and Top-tier values do not change.\n\n### Migration and rollback\n\nAssistant IDs, preset ids, share-link format v2 and receipt format v4 are unchanged. Setup with 0.5.0 replaces a 0.4.0 installation in place, and setup with 0.4.0 moves back in place, for ChatGPT, Claude, Gemini and Grok. A Grok role effort written by 0.5.0 is removed when 0.4.0 writes its role files. Kimi was not checked with a provisioned model pool. The Claude boundary to 0.3.0 and earlier from 0.4.0 still applies to receipts from 0.5.0: see the [migration boundaries](docs/guide/updates-and-removal.md#migration-boundaries).\n\n### Presets and model catalog\n\n- **Standard, Claude:** the Coder uses Sonnet 5.5 at high instead of medium (#29). Anthropic's per-effort data puts Sonnet 5.5 at medium 8.6 to 14.2 points below high on Terminal-Bench 4.0, FrontierCode and CursorBench, and Opus 5.5 at medium costs more per solved task on every measurement. Claude subagents without a named role in Standard also move from medium to high, so they use more of the plan. Reviewer and Test writer keep Sonnet 5.5 at high.\n- **Grok:** Grok 4.7 lists the native levels low, medium, high and xhigh, with high as its default. Grok 4.6, Grok 4.5 and Grok Build 0.1 offer no effort. Grok presets keep the native default, and there is still no Grok top choice (#27).\n- **Claude lifecycle:** Sonnet 4.5 is labelled \"Sonnet 4.5 (retires 2026-11-30)\" and records its deprecation date, its replacement and the partner schedules: Bedrock Legacy with end of life 2027-04-08, and no date on Google managed. Opus 4.5 and Haiku 4.5 stay active as legacy models without a deprecation notice (#28). The catalog review date is 2026-11-02.\n\nConfiguration checks are not model-quality evaluations.\n\n### What changed\n\n- Grok: each role can pin a reasoning effort. Setup writes `effort: \u003clevel>` in `~/.grok/agents/apk-\u003crole>.md`; a role without an effort gets no line. `--grok` accepts `role=model:effort` and `role=model:native`; `role=model` still means the native default and produces the same files as before. The configurator offers effort buttons for Grok 4.7 and custom model IDs, share links keep a Grok effort, and `agent-policy show` reports the effort of each Grok agent.\n- Fixed: APK no longer says that Grok subagents use the main session effort. APK pins each role's model, so a role without an effort runs at that model's default (Grok 4.7: high). The setup warning `grok-per-role-effort-unsupported` is replaced by `grok-effort-model-dependent`.\n- The README and step 4 of the configurator show how to undo a setup: the uninstall command pinned to the release, with a copy button. Removal restores the settings you had before APK and keeps your unrelated edits.\n- The configurator puts a `#setup=` share link in the address only when steps 1–3 are complete. Opening the page, Reset form, or a change that leaves a step incomplete removes the link. Existing links, including links to unfinished forms, still open as before.\n- Docs: the AI assistants reference shows which 4.5 models the Claude `sonnet`, `haiku` and `default` aliases resolve to on Bedrock, Google Agent Platform, Microsoft Foundry and Claude Platform on AWS, and tells Foundry users to pin a newer Sonnet before 2026-11-30. The model review cites primary sources for the Opus 5.5 and Sonnet 5.5 equal-effort numbers and records the Standard Claude Coder decision.\n- Docs: Grok Build ignores the `permission_mode` field that APK writes for read-only roles, so the Grok Reviewer and Code explorer are not read-only yet (#30).\n\n## 0.4.0 — 2026-11-01\n\n### Why this release\n\nThe presets and the model catalog were checked again on 2026-11-01 against the installed native clients and current vendor documentation. No vendor released or retired a subagent model since 2026-10-30. The new evidence changes where effort is spent, and it shows that Claude's top model is Opus 5.5, not Fable 5.1.\n\n### Who should update\n\n- Anyone who uses ChatGPT or Claude presets and wants the revised effort levels.\n- Anyone who uses the Top-tier top models switch in Claude.\n- Claude Code 2.1.316+ users who want subagents without a named role to stop inheriting the main session effort.\n\nKimi, Gemini and Grok preset values do not change, so their 0.3.0 installations need no update.\n\n### Migration and rollback\n\nAssistant IDs, preset ids (`fast`, `balanced`, `quality`), share-link format v2 and receipt format v4 are unchanged. Setup with 0.4.0 replaces a 0.3.0 installation in place, and receipts written by 0.3.0 still validate and uninstall. Setup with 0.3.0 moves ChatGPT, Kimi, Gemini and Grok back.\n\nClaude has a migration boundary in the downgrade direction. A 0.4.0 Claude receipt owns a third setting, `CLAUDE_CODE_SUBAGENT_EFFORT`, whenever the Coder effort is pinned, and every preset pins it. Version 0.3.0 does not know this setting, so its setup reports `INVALID_RECEIPT` and changes nothing. To move Claude back to 0.3.0, first remove its settings with 0.4.0: `npx --yes --ignore-scripts --package agent-policy-kit@0.4.0 agent-policy uninstall --client claude --apply`. Then set up with 0.3.0. This was checked with the 0.3.0 source in an isolated home. Removal restores the value that the setting had before setup, or removes it. Share links of 0.3.0 open on the 0.3.0 page.\n\n### Presets and model catalog\n\nRe-running setup applies these values. Installations keep their current values until then.\n\n- **Light, ChatGPT:** the Coder runs Luna at high instead of medium, the starting level OpenAI suggests for Luna. Luna stays the cheapest Codex model.\n- **Standard, ChatGPT:** the Docs writer uses GPT-6.1 Terra at medium instead of GPT-6.1 Sol. OpenAI positions Terra for clear writing, at half of Sol's usage.\n- **Top-tier, ChatGPT and Claude:** the Code explorer and Docs writer keep GPT-6.1 Sol and Opus 5.5 but run at medium instead of high. Implementation, review and tests stay at high.\n- **Top models switch, Claude:** Coder, Reviewer and Test writer use Opus 5.5 at xhigh instead of Fable 5.1 at high. Anthropic's own benchmarks put Opus 5.5 ahead of Fable 5.1 on every published coding benchmark at 2.5 times lower price, and Anthropic suggests a higher Opus effort before Fable. Fable 5.1 stays available in Custom. The switch now sets a model and an effort; ChatGPT and Kimi keep GPT-6 Astra and K3.1 Pro at high.\n\nThe catalog snapshot is dated 2026-11-01:\n\n- GPT-5.5 is marked retired from Codex for ChatGPT sign-in on 2026-10-14; it remains for API-key sign-in.\n- GPT-6 Astra's native default effort is medium in the signed-in server catalog; the bundled value low is kept as `bundledDefaultEffort`. The hidden, undocumented `gpt-reserve` selector is excluded.\n- Claude Code 2.1.316, Kimi Code 2.4.1 and Antigravity 1.4.12 are the observed client versions. Opus 4.5 and Haiku 4.5 record their earliest retirement dates.\n- Kimi records plan requirements: K3 and K3.1 Pro need Plus or higher, and the 1M context of K3 needs Pro or higher.\n- Antigravity's Flash Lite tier is marked undocumented: the CLI accepts it, but the subagent documentation lists only inherit, Flash and Pro.\n- Grok 4.7's reasoning levels (low to xhigh) are recorded as API capabilities. APK still writes only a model for each Grok role, so subagents use the main session effort.\n\nConfiguration checks are not model-quality evaluations.\n\n### What changed\n\n- Claude: setup also writes `CLAUDE_CODE_SUBAGENT_EFFORT`, the effort for subagents that name none, from the Coder effort capped at high. Claude Code 2.1.316 added this setting; earlier versions ignore it. Before, those subagents kept the main session effort.\n- `agent-policy show` reports the stored Claude default subagent effort and a `CLAUDE_CODE_SUBAGENT_EFFORT` environment override.\n- The top models switch label shows each tool's model and effort.\n- The website deployment guard also compares `src/release.mjs` with the release tag, because the page embeds its preset labels and top choices.\n- The configurator shows a note when Gemini is selected: APK configures Antigravity, not Gemini CLI. The README and the AI assistants reference say the same.\n- The documentation is reorganized into independent documents by audience: `docs/guide/` for people who use APK, `docs/reference/` for facts about assistants, roles, presets, the catalog and ownership, `docs/research/` for the evidence behind presets, and `docs/maintainers/` for development, releases and the website. [docs/README.md](docs/README.md) is the index. Old `docs/*.md` paths are removed without redirects. The 2026-11-01 model review is documented in [docs/research/2026-11-01-model-review.md](docs/research/2026-11-01-model-review.md).\n\n## 0.3.0 — 2026-11-01\n\n### Why this release\n\nPeople know their assistants as ChatGPT, Claude, Kimi, Gemini and Grok, not by the names of the coding agents inside them. The configurator and the CLI now use those names. Some people use only the desktop apps, and they have no CLI on PATH. Before this release, setup found nothing for them.\n\n### Who should update\n\n- Anyone who uses Codex in ChatGPT Desktop or Claude Code in the Code tab of Claude Desktop on macOS without a separate CLI.\n- Anyone who wants the general assistant names on the page and in the terminal.\n\nPreset values do not change, so an installation of 0.2.0 keeps working without an update.\n\n### Breaking change\n\nAI assistants now have general names: ChatGPT, Claude, Kimi, Gemini and Grok. APK still configures their coding agents: Codex, Claude Code, Kimi Code, Antigravity and Grok Build. Two technical IDs changed, and there is no migration:\n\n- `codex` is now `chatgpt`: `--chatgpt`, `--chatgpt-max-concurrent`, `--avoid-chatgpt`, `--client chatgpt` and the `clients.chatgpt` policy key.\n- `agy` is now `gemini`: `--gemini`, `--gemini-max-concurrent`, `--avoid-gemini`, `--client gemini` and the `clients.gemini` policy key.\n- Warning and error codes follow the new IDs, for example `chatgpt-native-precedence-limits` and `CHATGPT_CAP_ALIAS_CONFLICT`.\n\nBefore you use this version, remove the APK settings for these two assistants with the version that created them: `npx --yes --ignore-scripts --package agent-policy-kit@0.2.0 agent-policy uninstall --apply`. This version does not read the old `codex` and `agy` installation receipts, so its setup refuses the existing `apk-*` files as unowned. Policy files and share links that use the old IDs are refused too. Claude, Kimi and Grok keep their IDs.\n\n### Migration and rollback\n\nThe two renamed IDs set a migration boundary. These results come from tests with the published 0.2.0 package and this release:\n\n- **ChatGPT (Codex) and Gemini (Antigravity):** remove the APK settings with the version that created them before you set up with the other version. A move in either direction without removal reports `OWNERSHIP_CONFLICT` and changes nothing. After removal, setup with the other version succeeds.\n- **Claude, Kimi and Grok:** their IDs and receipt format v4 are unchanged. In the tests, setup with 0.3.0 upgraded 0.2.0 installations of Claude and Grok in place, and setup with 0.2.0 moved Claude back. Kimi uses the same receipt format, but it was not tested with a provisioned model pool.\n\n`uninstall --apply` removes the settings of every assistant. Run setup again afterwards for the assistants you use.\n\n### Presets and model catalog\n\nPreset models, effort levels and parallel limits are the same as in 0.2.0. Only the keys `codex` and `agy` became `chatgpt` and `gemini`, and the catalog labels became the general names. The model catalog snapshot is still dated 2026-10-30, with the Grok entries checked on 2026-11-01. Configuration checks are not model-quality evaluations.\n\n### What changed\n\n- The configurator calls the second step \"AI assistants\" and shows the general names. Readable CLI output uses the same names.\n- On macOS, setup finds the Codex that ChatGPT Desktop includes and the Claude Code in the Code tab of Claude Desktop, also when no CLI is on PATH. Both apps read the same settings as their CLIs. A CLI on PATH or in a conventional location still has priority. Detect output reports these clients with `origin: \"desktop_app\"`. Claude Cowork reads its settings from the Claude account, so APK does not configure it.\n\n## 0.2.0 — 2026-11-01\n\n### Why this release\n\nSubagents draw on the same plan limits as the main session, and every parallel session adds to that usage. Without explicit choices, subagents can inherit the most expensive model and use up a weekly limit within days. This release names the work modes by how much of a plan subagents may use, adds per-tool parallel limits, a read-only settings check and Grok Build support.\n\n### Who should update\n\nAnyone who wants Grok Build roles, per-tool parallel limits or the renamed modes. Re-running setup with 0.2.0 applies the new preset values: Top-tier now uses Opus 5.5, GPT-6.1 Sol and K3 at high effort, with top models behind an opt-in switch, and Kimi's Standard Docs writer uses K3 256K. Installations of 0.1.0 keep working unchanged until setup is run again.\n\n### Migration and rollback\n\nPreset ids (`fast`, `balanced`, `quality`), receipt format v4 and ownership, drift and rollback behavior are unchanged. Version 1 share links still open; new links use version 2 and carry each tool's parallel limit. Applying 0.1.0 again restores its owned settings, as the synthetic upgrade/downgrade gate verifies. Grok Build is new, so it has nothing to migrate.\n\n### Presets and model catalog\n\nThe model catalog snapshot is dated 2026-10-30; Grok Build entries were checked on 2026-11-01 against the Grok Build 1.0.70 user guide and the xAI model list. An independent audit compared every preset, tool and role with the catalog and the documentation tables, and a test now keeps those tables in sync. Configuration checks are not model-quality evaluations.\n\n### What changed\n\n- Add Grok Build as a fifth coding tool, listed after Antigravity. APK writes `agents/apk-\u003crole>.md` role files (Reviewer and Code explorer use the read-only `permission_mode: plan`), per-role models and a `general-purpose` fallback copied from the first selected role (the Coder when selected) in `config.toml` `[subagents.models]`, a native `[subagents] max_concurrent` cap and a delegation block in `AGENTS.md` under `$GROK_HOME` (default `~/.grok`). Per-role effort is not configurable, so every Grok choice has effort null and the page shows no effort controls. Presets use Grok Build 0.1, xAI's fast coding model, for light work and Grok 4.7 for stronger roles; Grok 4.6 and 4.5 stay available in Custom. Explicit commands use `--grok`, `--grok-max-concurrent` and `--avoid-grok`. Removal restores the original settings and refuses on local edits.\n\n- Rename work modes to Light, Standard and Top-tier and describe them by how much of a plan's limits subagents use. Preset ids and share-link ids are unchanged. Top-tier now uses Opus 5.5, GPT-6.1 Sol and K3 at high effort for code, review and tests. A per-tool switch under Top-tier opts those roles into Fable 5.1, GPT-6 Astra or K3.1 Pro; it is off by default. Top models no longer run at xhigh/max, because native default subagent settings copy the first selected role (the Coder when selected) to subagents started without a named role.\n\n- Explain each configuration step with a short ? note, and stop repeating vendor billing or version documentation in the work-mode notice.\n\n- Start a fresh or reset form with every subagent role selected, and give the empty coding-tool field the same appearance as the empty role field.\n\n- Automatically deploy the latest website from verified main while preserving exact tagged release pages and older share links. Configuration guards keep commands pinned to published package capabilities; npm releases remain explicit.\n\n- Credit Mykola Maksymenko in the configuration page and package metadata. Link the supplied LinkedIn profile and related projects, with static author/project structured data and a release-specific canonical URL.\n\n- Interactive terminals get readable setup, doctor, release and show output; captured output keeps the existing JSON contract, and `--json` forces JSON.\n\n- `agent-policy show` reads the current user-level subagent settings of every tool, before or after APK installation, without writing files. The page footer offers it as \"Check current settings\" with a copy button.\n\n- Each tool has its own parallel limit from 1 to 32, set in its details on the page or with `--TOOL-max-concurrent`; policies accept `clients[tool].maxConcurrent`.\n\n- The page adds Add all for roles and tools, a GitHub link in the header, Reset form beside the release line, and preset switching for a single selected tool without a needless confirmation.\n\n## 0.1.0 — 2026-10-30\n\n### Why this release\n\nUse a common approach to optional delegation across Codex, Claude Code, Kimi and Antigravity, without an extra process in normal agent operation. Configure once and remove the installer afterward.\n\n### What it configures\n\nSix focused roles cover implementation, read-only review, code discovery, test creation, documentation and prescribed execution. Each preset assigns a model and supported effort to every role; the [preset matrix](docs/reference/presets.md) explains the choices.\n\nThese are starting preferences, not model-quality benchmarks. Native model formats and alias behavior were reviewed against the official sources linked in [support](docs/reference/assistants.md) and [model maintenance](docs/maintainers/model-review.md). Model availability must be checked before applying. Provider aliases and tiers may resolve differently over time.\n\n### Presets and model catalog\n\nAll three presets were rebuilt for public use. Personal Astra/Opus/Fable and other avoid lists were removed. Fast gives review and testing more reasoning than simple execution. Balanced separates implementation, verification, discovery, documentation and mechanics. Quality uses Astra/Fable for demanding work and regular K3.1 Pro at max for Kimi code/review/tests. Claude recommendations pin current versioned IDs; Kimi Balanced uses the quota-conscious K3 256K variant. These are editable recommendations, not benchmark results.\n\nThe release contains a dated model/effort catalog from official documentation and native selector observations, including native-default effort and account-dependent availability. Antigravity role choices are native tiers, with no invented per-role effort setting.\n\nCatalog audit, 2026-10-30 UTC: Kimi now lists all six current models, including K3.1 Pro and Pro Highspeed. Quality first now uses regular K3.1 Pro at max effort for implementation/review/tests; other roles have separate choices described in the preset matrix. Highspeed remains optional because its faster output consumes about twice regular Pro's quota, according to Kimi. Setup requires provisioned access and does not silently fall back to another model.\n\nBoth Pro variants require compatible thinking settings. Even with unpinned effort, setup refuses an explicit thinking-disabled setting without modifying it.\n\nCodex effort choices/defaults now follow CLI 0.166.0 rather than API defaults; API metadata remains separate, and Ultra stays separate from ordinary effort. Claude Opus 4.5 no longer advertises an API-only native effort override. Existing custom inputs using levels outside the current native catalog require review before reapplication; owned inspection/removal remains independent of current recommendations. Sonnet 4.5 remains selectable with its Anthropic deprecation status marked. Antigravity CLI's four tier choices are unchanged.\n\n### What changed\n\n- Added Test writer and Docs writer; clarified Code explorer and Task runner. Old four-role native v2/v3 receipts remain supported, including explicit expansion to six, owned removal, drift refusal and late rollback. New v4 snapshots support six independently configured Kimi aliases.\n\n- Readable type uses a compact 36/20/15/13 px scale with more spacing; narrow layouts stack model controls and command actions.\n- A short collapsible explanation introduces role-specific models, native setup and optional delegation, using the same wording as the README.\n- The builder now starts with no roles, tools or chosen modes. Green checks track completed selections and successful copy, and Reset form restores a blank state. URL fragments restore visible settings without a backend. Conditional section hints and changed step markers use a two-second highlight hold plus two-second fade, respecting reduced motion. Selection controls share a soft treatment; Copy remains the primary action.\n- Page commands always list every selected role/model/effort under its tool, including presets. Explicit --roles, --max-concurrent and optional --avoid-TOOL preserve the existing selection, cap and guidance. :native represents unpinned effort; Antigravity remains tier-only. The shared codec validates complete role maps and rejects duplicate/mixed input before writes. Legacy release/config/policy inputs remain supported.\n- The four-step page now selects subagent roles and coding tools before mode/model/effort configuration. It generates and copies a real pinned command. Tool additions preserve All or a manually selected view. Role help uses the same prompt definitions as native generation.\n- Optional selectedRoles creates only the requested native roles. Receipt v4 binds that role set to owned files and supports safe expansion, reduction and removal. Earlier v2/v3 native receipts retain their historical four-role ownership boundary. Unselected Kimi aliases do not need provisioning or effort pins.\n- Native role files and routing instructions apply only when the main agent chooses delegation. Main models and disabled delegation features are preserved.\n- A static page lets each tool use its own mode and per-task models/effort. All shows mixed settings as Custom and can apply one preset to every tool. Scope warnings protect individual and global replacements; the page generates one pinned command.\n- Explicit release application supports safe upgrade/downgrade of owned settings; per-client receipts record the actual applied version and custom choices.\n- Ownership/drift checks, private backups and rollback preserve unrelated settings and earlier user values.\n- No custom hooks, proxy, plugin, launcher, daemon or normal-operation runtime is installed.\n\n### Who should use it\n\nPeople who want consistent subagent preferences across their installed coding tools. You can keep the recommendations or select different native models in the configuration page.\n\n### Applying this version\n\n```sh\nnpx --yes --ignore-scripts --package agent-policy-kit@0.1.0 agent-policy setup --release --apply\n```\n\nWithout --apply the same command previews the changes. The page-generated explicit tool arguments apply the visible choices using this release's native templates. See [release usage](docs/guide/updates-and-removal.md).\n\n### Migration and limits\n\nThis is the first public release. Synthetic versions in tests are not real releases. Experimental runtime receipts from older development commits require their original owned removal. Supported native snapshot formats can be updated safely; unknown future formats/layouts are refused.\n\nKimi/Antigravity concurrency guidance and native tier/precedence limits remain explicit. A pinned release reproduces declared configuration, not provider weights, entitlement or model quality.\n","packageSpec":"agent-policy-kit@0.5.2","preferences":{"schemaVersion":1,"maxConcurrent":3,"clients":{"chatgpt":{"code":{"model":"gpt-6.1-sol","effort":"medium"},"light":{"model":"gpt-6-luna","effort":"low"},"roles":{"reviewer":{"model":"gpt-6.1-sol","effort":"high"},"explorer":{"model":"gpt-6-luna","effort":"high"},"tester":{"model":"gpt-6.1-sol","effort":"high"},"writer":{"model":"gpt-6.1-terra","effort":"medium"}},"avoidModels":[]},"claude":{"code":{"model":"claude-sonnet-5-5","effort":"high"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"writer":{"model":"claude-sonnet-5-5","effort":"medium"}},"avoidModels":[]},"kimi":{"code":{"model":"kimi-code/k3-256k","effort":"high"},"light":{"model":"kimi-code/kimi-for-coding","effort":"low"},"roles":{"writer":{"model":"kimi-code/k3-256k","effort":"high"}},"avoidModels":[]},"gemini":{"code":{"model":"pro","effort":null},"light":{"model":"flash_lite","effort":null},"roles":{"explorer":{"model":"flash","effort":null},"writer":{"model":"flash","effort":null}},"avoidModels":[]},"grok":{"code":{"model":"grok-4.7","effort":null},"light":{"model":"grok-build-0.1","effort":null},"roles":{"writer":{"model":"grok-4.7","effort":null}},"avoidModels":[]}}},"hostedReleases":[],"catalog":{"schemaVersion":1,"reviewedAt":"2026-11-02","scope":"Documented/native coding-tool selectors at this release; account access and custom deployment IDs vary.","clients":{"chatgpt":{"label":"ChatGPT","efforts":["none","minimal","low","medium","high","xhigh","max"],"observedClientVersion":"0.166.0","observation":"codex debug models --bundled: 9 visible selectors; 3 hidden specialized/utility entries excluded. The signed-in server catalog (2026-11-01) lists 8 visible selectors without GPT-5.5, the hidden gpt-reserve entry and a medium default for GPT-6 Astra.","models":[{"id":"gpt-6-astra","label":"GPT-6 Astra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-6-astra","kind":"model","apiEfforts":["low","medium","high","xhigh","max"],"apiDefaultEffort":null,"nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"],"bundledDefaultEffort":"low"},{"id":"gpt-6.1-sol","label":"GPT-6.1 Sol","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-6.1-sol","kind":"model","apiEfforts":["low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6.1-terra","label":"GPT-6.1 Terra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-6.1-terra","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6-sol","label":"GPT-6 Sol","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-6-sol","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-6-luna","label":"GPT-6 Luna","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-6-luna","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models"},{"id":"gpt-5.6-sol","label":"GPT-5.6 Sol","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","source":"https://developers.openai.com/api/docs/models/gpt-5.6-sol","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-5.6-terra","label":"GPT-5.6 Terra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-5.6-terra","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","delegationModes":["ultra"]},{"id":"gpt-5.6-luna","label":"GPT-5.6 Luna","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-5.6-luna","kind":"model","apiEfforts":["none","low","medium","high","xhigh","max"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models"},{"id":"gpt-5.5","label":"GPT-5.5 (API key only)","efforts":["low","medium","high","xhigh"],"defaultEffort":"medium","source":"https://developers.openai.com/api/docs/models/gpt-5.5","kind":"model","apiEfforts":["none","low","medium","high","xhigh"],"apiDefaultEffort":"medium","nativeSource":"https://learn.chatgpt.com/docs/models","lifecycle":{"status":"retired","retirementDate":"2026-10-14","scope":"Codex with ChatGPT sign-in; API-key sign-in keeps access","source":"https://learn.chatgpt.com/docs/models"}}],"excluded":[{"id":"gpt-daybreak-blue-latest","reason":"hidden specialized selector"},{"id":"gpt-daybreak-red-latest","reason":"hidden specialized selector"},{"id":"codex-auto-review","reason":"hidden internal utility selector"},{"id":"gpt-reserve","reason":"hidden undocumented selector in the server catalog"}],"note":"Efforts follow the bundled Codex CLI 0.166.0 catalog. Defaults follow the signed-in server catalog of 2026-11-01 where it differs (bundledDefaultEffort keeps the bundled value). API capabilities are separate apiEfforts/apiDefaultEffort metadata. Ultra is a delegating execution mode, recorded separately and not offered as ordinary subagent effort. An API-supported level absent from the native catalog is unverified for manual per-role configuration, not proven runtime-rejected. GPT-5.5 left Codex for ChatGPT sign-in on 2026-10-14 and remains for API-key sign-in."},"claude":{"label":"Claude","efforts":["low","medium","high","xhigh","max"],"observedClientVersion":"2.1.316","models":[{"id":"sonnet","label":"Sonnet (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"opus","label":"Opus (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"haiku","label":"Haiku (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"fable","label":"Fable (alias)","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/sub-agents#choose-a-model","kind":"alias","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."},{"id":"claude-fable-5-1","label":"Fable 5.1","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-5-5","label":"Opus 5.5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-sonnet-5-5","label":"Sonnet 5.5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-haiku-5-5","label":"Haiku 5.5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"medium","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-fable-5","label":"Fable 5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-5","label":"Opus 5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-sonnet-5","label":"Sonnet 5","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-8","label":"Opus 4.8","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-7","label":"Opus 4.7","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"xhigh","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-6","label":"Opus 4.6","efforts":["low","medium","high","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-sonnet-4-6","label":"Sonnet 4.6","efforts":["low","medium","high","max"],"defaultEffort":"high","source":"https://code.claude.com/docs/en/model-config","kind":"model"},{"id":"claude-opus-4-5-20251101","label":"Opus 4.5","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config#adjust-effort-level","kind":"model","apiEfforts":["low","medium","high"],"apiDefaultEffort":null,"apiSource":"https://platform.claude.com/docs/en/build-with-claude/effort","lifecycle":{"status":"active","earliestRetirement":"2026-11-24","scope":"Claude API, Claude Platform on AWS, Claude Models on Google Cloud (Anthropic managed) and Microsoft Foundry","note":"Legacy model with no deprecation notice. The date is a floor, not a scheduled retirement; Anthropic gives at least 60 days' notice.","partners":[{"platform":"Google Cloud (Google managed)","earliestRetirement":"2026-11-24","source":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/deprecations/partner-models"}],"source":"https://platform.claude.com/docs/en/about-claude/model-deprecations"}},{"id":"claude-sonnet-4-5-20250929","label":"Sonnet 4.5 (retires 2026-11-30)","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"model","lifecycle":{"status":"deprecated","deprecationDate":"2026-09-30","retirementDate":"2026-11-30","replacement":"claude-sonnet-5-5","scope":"Claude API, Claude Platform on AWS, Claude Models on Google Cloud (Anthropic managed) and Microsoft Foundry","partners":[{"platform":"Amazon Bedrock","status":"legacy","endOfLife":"2027-04-08","source":"https://docs.aws.amazon.com/bedrock/latest/userguide/model-lifecycle-legacy.html"},{"platform":"Google Cloud (Google managed)","note":"No retirement date announced. The earliest retirement date, 2026-09-29, passed.","source":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/partner-models/claude/sonnet-4-5"}],"source":"https://platform.claude.com/docs/en/about-claude/model-deprecations"}},{"id":"claude-haiku-4-5-20251001","label":"Haiku 4.5","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"model","lifecycle":{"status":"active","earliestRetirement":"2026-10-15","scope":"Claude API, Claude Platform on AWS, Claude Models on Google Cloud (Anthropic managed) and Microsoft Foundry","note":"Legacy model with no deprecation notice. The earliest retirement date passed without an announcement.","partners":[{"platform":"Google Cloud (Google managed)","earliestRetirement":"2026-12-07","source":"https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/deprecations/partner-models"}],"source":"https://platform.claude.com/docs/en/about-claude/model-deprecations"}},{"id":"inherit","label":"Inherit main model","efforts":["low","medium","high","xhigh","max"],"defaultEffort":null,"source":"https://code.claude.com/docs/en/sub-agents","kind":"inherit","effortResolution":"Depends on the resolved model and provider; requested levels can be clamped or ignored by Claude Code."}],"note":"Full model IDs use the current Claude Code native effort table, which differs from API support for Opus 4.5. Alias/inherit efforts are possible requested levels, not a guarantee for every resolved provider model; unsupported levels can clamp or be ignored. Current account access and provider alias resolution vary. Claude Code 2.1.316 adds CLAUDE_CODE_SUBAGENT_EFFORT for subagents that name no effort; earlier versions ignore it. CLAUDE_CODE_EFFORT_LEVEL still overrides subagent effort frontmatter.","excluded":[{"id":"best","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"default","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"opus[1m]","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"opusplan","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"},{"id":"sonnet[1m]","reason":"session/context selector rather than a distinct documented subagent model; custom native ID remains available"}]},"kimi":{"label":"Kimi","efforts":["low","medium","high","xhigh","max"],"models":[{"id":"kimi-code/k3.1-pro","label":"K3.1 Pro","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3.1-pro","thinkingRequired":true},{"id":"kimi-code/k3.1-pro-highspeed","label":"K3.1 Pro Highspeed","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3.1-pro-highspeed","thinkingRequired":true},{"id":"kimi-code/k3","label":"K3","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3","planRequirement":"Plus (Moderato) or higher; 1M context requires Pro (Allegretto) or higher"},{"id":"kimi-code/k3-256k","label":"K3 · 256K","efforts":["low","high","max"],"defaultEffort":"high","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"k3-256k"},{"id":"kimi-code/kimi-for-coding","label":"K2.8 Preview","efforts":["low","high","max"],"defaultEffort":"max","source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"kimi-for-coding"},{"id":"kimi-code/kimi-for-coding-highspeed","label":"K2.7 Code HighSpeed","efforts":[],"defaultEffort":null,"source":"https://www.kimi.com/code/docs/en/kimi-code/models","kind":"native-alias","upstreamModelId":"kimi-for-coding-highspeed"}],"note":"Current Kimi Code docs list six model IDs; the older kimi.ai/help page still lists four. K3.1 Pro and Highspeed require thinking and support low/high/max, default high. These are preferred native aliases: setup resolves a missing preferred alias only to a unique provisioned match; no provider identity is invented. Account tier controls access. K3 and K3.1 Pro require the Plus (Moderato) plan or higher. The 1M context of K3 and every Highspeed model require Pro (Allegretto) or higher; on Plus, k3 stays at 256K context and uses about twice the quota of k3-256k. K2.7 Code HighSpeed uses about three times the quota.","observedClientVersion":"2.4.1","observation":"Kimi Code CLI 2.4.0 and 2.4.1: all six documented preferred aliases and native effort/default capabilities corroborated through whitelisted provisioned metadata; no credentials or custom account aliases retained."},"gemini":{"label":"Gemini","efforts":[],"observedClientVersion":"1.4.12","models":[{"id":"pro","label":"Pro","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"},{"id":"flash","label":"Flash","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"},{"id":"flash_lite","label":"Flash Lite","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier","documented":false,"nativeSource":"Antigravity CLI 1.4.12 agent-file parser"},{"id":"inherit","label":"Inherit main model","efforts":[],"defaultEffort":null,"source":"https://antigravity.google/docs/subagents?tab=cli","kind":"tier"}],"note":"Native per-subagent selectors are tiers, not the session model inventory. The CLI 1.4.12 parser accepts inherit/flash_lite/flash/pro; the public subagent documentation lists only inherit, flash and pro, so flash_lite is undocumented. Google does not document which Gemini model each tier uses; the server sets it per account. Per-role effort is not exposed by the agent-file schema; --effort and /effort apply to the whole session."},"grok":{"label":"Grok","efforts":["low","medium","high","xhigh","max"],"observedClientVersion":"1.0.70","models":[{"id":"grok-4.7","label":"Grok 4.7","efforts":["low","medium","high","xhigh"],"defaultEffort":"high","source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model","apiEfforts":["low","medium","high","xhigh"],"apiDefaultEffort":"high"},{"id":"grok-4.6","label":"Grok 4.6","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"},{"id":"grok-4.5","label":"Grok 4.5","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"},{"id":"grok-build-0.1","label":"Grok Build 0.1","efforts":[],"defaultEffort":null,"source":"https://docs.x.ai/developers/models","nativeSource":"https://github.com/xai-org/grok-build/blob/main/crates/codegen/xai-grok-pager/docs/user-guide/16-subagents.md","kind":"model"}],"note":"Per-subagent models are set in config.toml [subagents.models]; model IDs follow the documented xAI model list and account access varies. APK writes a role effort as effort in the agent frontmatter (agents/apk-\u003crole>.md); Grok Build 1.0.70 accepts low/medium/high/xhigh/max there and drops the whole agent for any other value. The effort applies only when the model supports effort: Grok 4.7 lists low/medium/high/xhigh with default high, Grok Build 0.1 has no configurable effort, and the effort levels of Grok 4.6 and 4.5 are not verified. A role without an effort runs at the default effort of its pinned model, not at the main session effort; a role named like the agent ([subagents.roles.\u003cagent>] reasoning_effort) or a harness spawn override wins over the frontmatter. [subagents] max_concurrent is a native cap."}}},"roles":[{"id":"worker","name":"Coder","kind":"code","assignment":"scoped implementation and fixes","description":"Implements scoped changes, preserves peers' edits, and verifies the result.","prompt":"Implement the assigned change or fix within the assigned files. You share the workspace with other agents: preserve their edits. Verify the result and report changes, checks, and remaining limitations. Do not create child agents; return any need for further delegation to the parent."},{"id":"reviewer","name":"Reviewer","kind":"code","assignment":"read-only correctness, security and regression review","description":"Reviews correctness, security and regressions without edits; reports actionable evidence.","prompt":"Review the assigned change without editing files. Find actionable correctness, security, and regression issues. Report each finding with file and line evidence and explain its impact; distinguish confirmed issues from uncertainty. Do not create child agents; return any need for further delegation to the parent."},{"id":"explorer","name":"Code explorer","kind":"light","assignment":"read-only code and documentation discovery","description":"Maps code and documentation, cites sources, and separates facts from uncertainty.","prompt":"Explore the assigned code and documentation without editing files. Return a concise map or factual answer with source paths or citations. Distinguish verified facts from assumptions and unknowns. Do not create child agents; return any need for further delegation to the parent."},{"id":"tester","name":"Test writer","kind":"code","assignment":"test creation and targeted execution","description":"Writes behavior and edge-case tests, reproduces issues, and runs targeted checks.","prompt":"Own the assigned tests and targeted execution. Reproduce the issue or establish a baseline, then test observable behavior and edge cases. Never weaken checks to make them pass. Do not edit application code unless explicitly assigned. Preserve peers' edits and report results and limitations. Do not create child agents; return any need for further delegation to the parent."},{"id":"writer","name":"Docs writer","kind":"light","assignment":"assigned documentation, examples and release notes","description":"Updates assigned docs and examples, verifies claims, and keeps terminology consistent.","prompt":"Update only the assigned documentation, examples, or release notes. Verify claims against code or cited sources and use consistent terminology. Do not edit application code. Preserve peers' edits and report changes and unknowns. Do not create child agents; return any need for further delegation to the parent."},{"id":"routine","name":"Task runner","kind":"light","assignment":"explicit commands and mechanical edits","description":"Runs prescribed commands and mechanical edits; returns ambiguous decisions to the parent.","prompt":"Execute only the prescribed commands or clearly specified mechanical edits. Preserve other agents' work and report the outcome. Do not make ambiguous design or behavior decisions; return those decisions to the parent. Do not create child agents; return any need for further delegation to the parent."}],"unreleased":false};
329
329
  // Pure command codec, also embedded in the offline configuration page.
330
330
  const TOOL_FLAGS=Object.freeze({chatgpt:'chatgpt',claude:'claude',kimi:'kimi',gemini:'gemini',grok:'grok'});
331
331
  const EXPLICIT_FIELDS=Object.freeze(['roles','max-concurrent',...Object.keys(TOOL_FLAGS),...Object.keys(TOOL_FLAGS).map(flag=>'avoid-'+flag),...Object.keys(TOOL_FLAGS).map(flag=>flag+'-max-concurrent')]);
package/src/install.mjs CHANGED
@@ -182,8 +182,10 @@ function literalValue(raw,type,nullable=false) {
182
182
  }
183
183
  function alias(value) {return typeof value==='string'&&/^[A-Za-z0-9][A-Za-z0-9._:@/\[\]-]{0,127}$/.test(value);}
184
184
  function scalar(op,target,type) {
185
- fields(op,['kind','path','before','after','addedTable']);
185
+ fields(op,['kind','path','before','after','addedTable','addedLineBreak']);
186
186
  if(op.kind!=='scalar'||!equal(op.path,target)||(op.addedTable&&!equal(op.addedTable,target.slice(0,-1))))fail('INVALID_RECEIPT');
187
+ // Written since 0.5.2 only when setup ended a last line that had no line break (#34).
188
+ if(op.addedLineBreak!==undefined&&(typeof op.addedLineBreak!=='string'||!/^[a-f0-9]{64}$/.test(op.addedLineBreak)||op.before!==null))fail('INVALID_RECEIPT');
187
189
  literalValue(op.before,type,true);
188
190
  return literalValue(op.after,type);
189
191
  }
package/src/toml.mjs CHANGED
@@ -1,5 +1,6 @@
1
1
  import { parseForESLint, getStaticTOMLValue } from 'toml-eslint-parser';
2
2
  import { isDeepStrictEqual } from 'node:util';
3
+ import { createHash } from 'node:crypto';
3
4
 
4
5
  function fail(code) { throw Object.assign(new Error(code), {code}); }
5
6
  function ast(text) {
@@ -30,13 +31,30 @@ function locate(tree, target) {
30
31
  function replace(text, start, end, value) { return text.slice(0, start) + value + text.slice(end); }
31
32
  function newline(text) { return text.includes('\r\n') ? '\r\n' : '\n'; }
32
33
  function endLine(text, position) { const i = text.indexOf('\n', position); return i === -1 ? text.length : i + 1; }
33
- function removeStatement(text, node) {
34
+ function statementRange(text, node) {
34
35
  const startLine = text.lastIndexOf('\n', node.range[0] - 1) + 1;
35
36
  const start = /^\s*$/.test(text.slice(startLine, node.range[0])) ? startLine : node.range[0];
36
37
  const end = endLine(text, node.range[1]);
37
38
  const tail = text.slice(node.range[1], end);
38
- return replace(text, start, /^\s*$/.test(tail) ? end : node.range[1], '');
39
+ return [start, /^\s*$/.test(tail) ? end : node.range[1]];
39
40
  }
41
+ function removeStatement(text, node) { return replace(text, ...statementRange(text, node), ''); }
42
+ // setTomlValue writes one empty line before a table that it adds. Return the start of that line, or `start` when the line before is not empty.
43
+ // The separator that setTomlValue wrote before a table uses the same line ending as the table header.
44
+ // Among the empty lines directly before the header, remove the nearest one with that line ending,
45
+ // so an empty line that the user added with another line ending stays.
46
+ function separatorBefore(text, start, ending) {
47
+ let at = start;
48
+ while (at > 0) {
49
+ const previous = at < 2 ? 0 : text.lastIndexOf('\n', at - 2) + 1, line = text.slice(previous, at);
50
+ if (!/^\r?\n$/.test(line)) return null;
51
+ if (line === ending) return [previous, at];
52
+ at = previous;
53
+ }
54
+ return null;
55
+ }
56
+ // A hash identifies the last line that got an added line break without keeping config text in the receipt.
57
+ const lineHash = line => createHash('sha256').update(line).digest('hex');
40
58
 
41
59
  export function setTomlValue(text, target, value) {
42
60
  const tree = ast(text);
@@ -54,11 +72,13 @@ export function setTomlValue(text, target, value) {
54
72
  if (table) {
55
73
  const at = endLine(text, table.key.range[1]);
56
74
  const separator = at === text.length && !text.endsWith('\n') ? nl : '';
75
+ if (separator) ownership.addedLineBreak = lineHash(text.slice(text.lastIndexOf('\n') + 1));
57
76
  text = replace(text, at, at, separator + entry);
58
77
  } else if (tablePath.length === 0) {
59
78
  text = entry + text;
60
79
  } else {
61
80
  const prefix = text.length && !text.endsWith('\n') ? nl : '';
81
+ if (prefix) ownership.addedLineBreak = lineHash(text.slice(text.lastIndexOf('\n') + 1));
62
82
  text += `${prefix}${nl}[${tablePath.map(keyText).join('.')}]${nl}${entry}`;
63
83
  ownership.addedTable = tablePath;
64
84
  }
@@ -77,10 +97,28 @@ export function restoreTomlValue(text, ownership) {
77
97
  }
78
98
  if (!found || text.slice(...found.value.range) !== ownership.after) fail('OWNED_DRIFT');
79
99
  if (ownership.before !== null) return replace(text, ...found.value.range, ownership.before);
80
- text = removeStatement(text, found);
100
+ let [start, end] = statementRange(text, found);
101
+ text = replace(text, start, end, '');
81
102
  if (ownership.addedTable) {
82
103
  const table = ast(text).body[0].body.find(n => n.type === 'TOMLTable' && n.kind === 'standard' && same(n.resolvedKey, ownership.addedTable));
83
- if (table && table.body.length === 0) text = removeStatement(text, table);
104
+ if (table && table.body.length === 0) {
105
+ // Remove the header and the empty line that setTomlValue wrote before it. Releases 0.3.0 to 0.5.1 wrote the same empty line.
106
+ [start, end] = statementRange(text, table);
107
+ const header = text.slice(start, end), ending = header.endsWith('\r\n') ? '\r\n' : header.endsWith('\n') ? '\n' : newline(text);
108
+ const separator = separatorBefore(text, start, ending);
109
+ if (separator && separator[1] === start) start = separator[0];
110
+ text = replace(text, start, end, '');
111
+ if (separator && separator[1] < start) { text = replace(text, separator[0], separator[1], ''); start -= separator[1] - separator[0]; }
112
+ }
113
+ }
114
+ // setTomlValue ended a last line that had no line break. Remove that line break only when nothing follows
115
+ // the removed lines and the file again ends with that same line, so a line the user added keeps its line break.
116
+ if (typeof ownership.addedLineBreak === 'string' && start === text.length) {
117
+ const nl = text.endsWith('\r\n') ? '\r\n' : '\n';
118
+ if (text.endsWith(nl)) {
119
+ const body = text.slice(0, -nl.length);
120
+ if (lineHash(body.slice(body.lastIndexOf('\n') + 1)) === ownership.addedLineBreak) text = body;
121
+ }
84
122
  }
85
123
  ast(text);
86
124
  return text;