agent-policy-kit 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/AGENT_INSTALL.md +126 -42
  2. package/CHANGELOG.md +52 -3
  3. package/README.md +17 -10
  4. package/docs/README.md +46 -0
  5. package/docs/design/2026-11-01-documentation-structure.md +58 -0
  6. package/docs/guide/commands.md +375 -0
  7. package/docs/guide/configurator.md +163 -0
  8. package/docs/guide/getting-started.md +119 -0
  9. package/docs/guide/preferences.md +168 -0
  10. package/docs/guide/privacy.md +76 -0
  11. package/docs/guide/updates-and-removal.md +188 -0
  12. package/docs/maintainers/architecture.md +71 -0
  13. package/docs/maintainers/development.md +93 -0
  14. package/docs/maintainers/model-review.md +101 -0
  15. package/docs/maintainers/release.md +114 -0
  16. package/docs/maintainers/verification.md +95 -0
  17. package/docs/maintainers/website.md +112 -0
  18. package/docs/reference/assistants.md +165 -0
  19. package/docs/reference/model-catalog.md +194 -0
  20. package/docs/reference/ownership.md +177 -0
  21. package/docs/reference/presets.md +128 -0
  22. package/docs/reference/roles.md +157 -0
  23. package/docs/research/2026-11-01-model-review.md +341 -0
  24. package/docs/research/limits-evidence.md +28 -0
  25. package/models/README.md +2 -6
  26. package/models/catalog.json +51 -20
  27. package/package.json +2 -2
  28. package/policies/balanced.json +1 -1
  29. package/policies/fast.json +1 -11
  30. package/policies/quality.json +2 -12
  31. package/site/index.html +28 -19
  32. package/src/inspect.mjs +2 -1
  33. package/src/install.mjs +14 -8
  34. package/src/release.mjs +1 -1
  35. package/src/share.mjs +4 -4
  36. package/docs/architecture.md +0 -17
  37. package/docs/compatibility.md +0 -39
  38. package/docs/configuration-page.md +0 -44
  39. package/docs/deployment.md +0 -33
  40. package/docs/development.md +0 -31
  41. package/docs/installation.md +0 -23
  42. package/docs/limits-evidence.md +0 -24
  43. package/docs/model-catalog.md +0 -102
  44. package/docs/model-updates.md +0 -22
  45. package/docs/npm-release.md +0 -27
  46. package/docs/policy.md +0 -16
  47. package/docs/privacy.md +0 -9
  48. package/docs/recovery.md +0 -13
  49. package/docs/releases.md +0 -40
  50. package/docs/use-cases.md +0 -25
  51. package/docs/verification.md +0 -61
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.3.0/">
10
+ <link rel="canonical" href="https://agent-policy-kit.trymenow.io/v/0.4.0/">
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.3.0/#webpage","name":"Agent Policy Kit — by Mykola Maksymenko","url":"https://agent-policy-kit.trymenow.io/v/0.3.0/","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.4.0/#webpage","name":"Agent Policy Kit — by Mykola Maksymenko","url":"https://agent-policy-kit.trymenow.io/v/0.4.0/","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
 
@@ -224,7 +224,7 @@ header,main,footer{width:min(calc(100% - 64px),920px);margin-inline:auto}header{
224
224
  .tag-box{display:flex;flex-wrap:wrap;align-items:center;gap:8px;min-height:56px;padding:10px 12px;background:var(--white);border:1px solid var(--line);border-radius:7px}.tag-box:focus-within{outline:2px solid var(--accent);outline-offset:2px}.empty{padding:5px 1px;font-size:var(--text-ui);color:var(--muted)}.suggestions{display:flex;flex-wrap:wrap;gap:8px;margin-top:10px;min-height:34px}.suggestion{padding:6px 11px;border:1px dashed var(--line);border-radius:5px;background:var(--white);color:var(--ink);font-size:var(--text-ui);line-height:1.4;font-weight:400}.suggestion:hover{border-color:var(--brand-blue);background:var(--control-hover);color:var(--accent)}.plus{color:var(--accent);margin-right:5px}
225
225
  .tag{display:inline-flex;align-items:center;min-height:32px;overflow:hidden;border:1px solid var(--line);border-radius:5px;background:var(--control-hover);color:var(--ink);font-size:var(--text-ui);line-height:1.4;font-weight:500}.tag-label{padding:5px 10px}.remove{display:grid;place-items:center;align-self:stretch;width:26px;border:0;border-left:1px solid var(--line);background:transparent;color:inherit;font-size:16px;font-weight:400}.remove:hover{background:var(--control-hover)}
226
226
  .tool-group{display:flex;gap:4px;min-height:54px;padding:4px;border:1px solid var(--line);border-radius:7px;background:var(--paper)}.tool-group .tool-scope{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:3px;min-width:0;min-height:44px;padding:8px 28px 8px 13px;border:0;border-radius:5px;background:transparent;color:var(--ink);font-size:var(--text-ui);font-weight:500;line-height:1.4}.tool-group .tool-scope small{border-radius:3px;font-size:var(--text-meta);font-weight:400;line-height:1.5;color:var(--muted)}.tool-group .tool-scope:hover{background:var(--control-hover);color:var(--accent)}.tool-item.active .tool-scope{background:transparent;color:var(--accent);font-weight:600}.tool-item.active{box-shadow:inset 0 -2px 0 var(--brand-blue)}.tool-item{position:relative;display:flex;flex:1;min-width:0;border:1px solid var(--line);border-radius:5px;background:var(--control-hover)}.tool-item .tool-scope{width:100%}.tool-remove{position:absolute;right:4px;top:50%;transform:translateY(-50%);display:grid;place-items:center;width:24px;height:30px;border:0;border-radius:4px;background:transparent;color:var(--muted);font-size:15px;opacity:.8}.tool-item.active .tool-remove{color:var(--muted)}.tool-remove:hover{background:var(--control-hover);opacity:1}.tool-item.active .tool-remove:hover{background:var(--control-hover);color:var(--accent)}
227
- .mode-heading{display:flex;align-items:center;justify-content:space-between;margin:0 0 16px}.scope-label{display:inline-block;padding:3px 6px;margin-left:-6px;border-radius:4px;color:var(--muted);font-size:var(--text-support);line-height:1.5}.mode-placeholder{padding:20px;border:1px dashed var(--line);border-radius:7px;color:var(--muted);font-size:var(--text-support)}#mode-options{position:relative;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin:0 0 16px}#mode-options::before{content:"";position:absolute;top:13px;left:12.5%;right:12.5%;height:2px;background:var(--line)}.mode-option{position:relative;z-index:1;display:grid;grid-template-rows:20px auto;align-content:start;align-items:center;justify-items:center;gap:10px;padding:4px;text-align:center;font-size:var(--text-ui);font-weight:400;line-height:1.5;cursor:pointer}.mode-option input{appearance:none;position:relative;z-index:1;width:10px;height:10px;margin:0;border:0;border-radius:50%;background:var(--muted);cursor:pointer}.mode-option input:checked{width:18px;height:18px;border:3px solid var(--white);box-shadow:0 0 0 2px var(--brand-blue);background:var(--brand-blue)}.mode-option input:checked+span{color:var(--accent);font-weight:600}.mode-option:has(input:disabled){cursor:default}.notice{padding:0;margin:0 0 14px;color:var(--muted);font-size:var(--text-support);line-height:1.6}
227
+ .mode-heading{display:flex;align-items:center;justify-content:space-between;margin:0 0 16px}.scope-label{display:inline-block;padding:3px 6px;margin-left:-6px;border-radius:4px;color:var(--muted);font-size:var(--text-support);line-height:1.5}.mode-placeholder{padding:20px;border:1px dashed var(--line);border-radius:7px;color:var(--muted);font-size:var(--text-support)}#mode-options{position:relative;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));margin:0 0 16px}#mode-options::before{content:"";position:absolute;top:13px;left:12.5%;right:12.5%;height:2px;background:var(--line)}.mode-option{position:relative;z-index:1;display:grid;grid-template-rows:20px auto;align-content:start;align-items:center;justify-items:center;gap:10px;padding:4px;text-align:center;font-size:var(--text-ui);font-weight:400;line-height:1.5;cursor:pointer}.mode-option input{appearance:none;position:relative;z-index:1;width:10px;height:10px;margin:0;border:0;border-radius:50%;background:var(--muted);cursor:pointer}.mode-option input:checked{width:18px;height:18px;border:3px solid var(--white);box-shadow:0 0 0 2px var(--brand-blue);background:var(--brand-blue)}.mode-option input:checked+span{color:var(--accent);font-weight:600}.mode-option:has(input:disabled){cursor:default}.notice{padding:0;margin:0 0 14px;color:var(--muted);font-size:var(--text-support);line-height:1.6}.tools-notice{margin:12px 0 0}
228
228
  .advanced{border-top:1px solid var(--line);padding-top:12px}.advanced summary{width:fit-content;color:var(--accent);font-size:var(--text-support);line-height:1.5;cursor:pointer}.editor{display:grid;grid-template-columns:140px minmax(0,1fr) minmax(0,1fr);gap:16px;align-items:end;margin-top:16px}.editor label{display:block;margin-bottom:7px;color:var(--muted);font-size:var(--text-support);line-height:1.4}.editor select{appearance:none;width:100%;min-width:0;height:42px;padding:0 32px 0 10px;border:1px solid var(--line);border-radius:5px;background:var(--white) url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none'%3E%3Cpath d='m4 6 4 4 4-4' stroke='%2359657a' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat right 10px center/16px 16px;color:var(--ink);font-size:var(--text-ui)}.efforts{display:flex;gap:3px;align-items:center;min-height:42px;padding:3px;border:1px solid var(--line);border-radius:6px;background:var(--paper)}.efforts button{flex:1;min-height:32px;padding:5px;border:0;border-radius:4px;background:transparent;color:var(--muted);font-size:var(--text-support)}.efforts button[aria-pressed=true]{background:var(--control-hover);color:var(--accent);font-weight:600;box-shadow:inset 0 0 0 1px var(--brand-blue)}.unavailable{width:100%;text-align:center;color:var(--muted);font-size:var(--text-support)}.role-description{margin:10px 0 0;color:var(--muted);font-size:var(--text-support);line-height:1.6}
229
229
  .output{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:12px 20px;padding:18px 20px;border:1px solid var(--line);border-radius:6px;background:var(--paper)}.output[data-ready=true]{border-color:var(--brand-blue)}.output strong{font-size:var(--text-ui);font-weight:600;line-height:1.5}.output p{margin:5px 0 0;color:var(--muted);font-size:var(--text-support);line-height:1.6}.output p:empty{display:none}.output p a{color:var(--accent);text-underline-offset:3px}.output[data-ready=false] .primary{background:var(--line);border-color:var(--line);color:var(--muted);opacity:1}.primary{white-space:nowrap}
230
230
  footer{display:grid;gap:14px;margin-top:20px;padding:16px 0 24px;border-top:1px solid var(--line);color:var(--muted);font-size:var(--text-meta);line-height:1.6}.footer-row{display:flex;justify-content:space-between;align-items:baseline;gap:8px 24px;flex-wrap:wrap}.footer-attribution{display:flex;align-items:baseline;gap:4px 24px;flex-wrap:wrap;font-size:var(--text-meta)}.footer-attribution nav{display:flex;align-items:baseline;gap:4px 10px;flex-wrap:wrap}
@@ -310,11 +310,11 @@ section[aria-labelledby=helpers-heading]{view-transition-name:step-helpers}secti
310
310
  <text class="val" x="560.0" y="271">25 h</text>
311
311
  </svg>
312
312
  </div>
313
- <p>From my own Codex logs; tasks differed between the runs. <a href="https://github.com/automatis-tools/agent-policy-kit/blob/main/docs/limits-evidence.md" target="_blank" rel="noopener noreferrer">How it was measured</a>. APK writes your AI assistants’ native settings, then exits. Your main agent and its model stay unchanged.</p>
313
+ <p>From my own Codex logs; tasks differed between the runs. <a href="https://github.com/automatis-tools/agent-policy-kit/blob/main/docs/research/limits-evidence.md" target="_blank" rel="noopener noreferrer">How it was measured</a>. APK writes your AI assistants’ native settings, then exits. Your main agent and its model stay unchanged.</p>
314
314
  </div></details><p class="link-error" id="link-error" role="status" hidden></p></div>
315
315
  <div class="builder">
316
316
  <section aria-labelledby="helpers-heading"><div class="step-heading"><span class="step-number">1</span><h2 id="helpers-heading" tabindex="-1">Subagent roles</h2></div><div class="tag-box" id="selected-helpers" role="group" aria-label="Selected subagent roles"></div><div class="suggestions" id="helper-options" role="group" aria-label="Available subagent roles"></div></section>
317
- <section aria-labelledby="tools-heading"><div class="step-heading"><span class="step-number">2</span><h2 id="tools-heading" tabindex="-1">AI assistants</h2></div><div class="tool-group" id="selected-tools" role="group" aria-label="Selected AI assistants"></div><div class="suggestions" id="tool-options" role="group" aria-label="Available AI assistants"></div></section>
317
+ <section aria-labelledby="tools-heading"><div class="step-heading"><span class="step-number">2</span><h2 id="tools-heading" tabindex="-1">AI assistants</h2></div><div class="tool-group" id="selected-tools" role="group" aria-label="Selected AI assistants"></div><div class="suggestions" id="tool-options" role="group" aria-label="Available AI assistants"></div><p class="notice tools-notice" id="tools-notice" role="note" hidden></p></section>
318
318
  <section aria-labelledby="mode-heading"><div class="step-heading"><span class="step-number">3</span><h2 id="mode-heading" tabindex="-1">Work mode</h2></div><div id="mode-empty" class="mode-placeholder">Choose subagent roles and AI assistants above.</div><div id="mode-panel" hidden><div class="mode-heading"><span class="scope-label" id="scope-label">All selected AI assistants</span></div><div id="mode-options" role="radiogroup" aria-label="Work mode"></div><p class="notice" id="mode-notice" hidden></p><div class="top-models" id="top-models" hidden><button type="button" role="switch" id="top-models-toggle" aria-checked="false"><span class="switch-track" aria-hidden="true"></span><span id="top-models-label">Use top models for code, review and tests</span></button></div><section class="advanced" id="advanced" aria-label="Models and effort"><h3>Models &amp; effort</h3><div id="editor"></div><div class="concurrency" id="concurrency-panel" hidden><h3>Parallel subagents</h3><div class="concurrency-row"><label for="max-concurrent" id="concurrency-label">Max per session</label><div class="concurrency-stepper" role="group" aria-label="Maximum concurrent subagents"><button id="decrease-concurrency" type="button" aria-label="Decrease maximum concurrent subagents">−</button><input id="max-concurrent" type="number" min="1" max="32" step="1" value="3" inputmode="numeric" aria-describedby="concurrency-error"><button id="increase-concurrency" type="button" aria-label="Increase maximum concurrent subagents">+</button></div></div><p class="field-error" id="concurrency-error" role="status" hidden>Enter a whole number from 1 to 32.</p></div></section></div></section>
319
319
 
320
320
  <section aria-labelledby="setup-heading"><div class="step-heading"><span class="step-number">4</span><h2 id="setup-heading">Copy setup command</h2><span class="step-hint" id="step-hint-4" role="status" aria-live="polite" aria-atomic="true" hidden></span></div><div class="output" data-ready="false"><div class="setup-result"><div aria-live="polite" aria-atomic="true"><strong id="setup-summary">Complete the steps above.</strong><p id="setup-description">Choose a subagent role in step 1 and an AI assistant in step 2.</p></div><textarea class="setup-command" id="setup-command" readonly aria-label="Setup command" wrap="soft" rows="1" hidden></textarea><p id="copy-feedback" role="status" hidden></p></div><button class="button primary" id="copy" type="button" aria-describedby="setup-description" disabled>Copy command</button></div><div class="setup-footer"><p class="release-status" id="release-status"></p><button type="button" class="reset-form" id="reset-form">Reset form</button></div></section>
@@ -324,7 +324,7 @@ section[aria-labelledby=helpers-heading]{view-transition-name:step-helpers}secti
324
324
  <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>
325
325
  <script>
326
326
  'use strict';
327
- const RELEASE = {"schemaVersion":1,"version":"0.3.0","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":"medium"},"light":{"model":"gpt-6-luna","effort":"low"},"roles":{"reviewer":{"model":"gpt-6-luna","effort":"high"},"tester":{"model":"gpt-6-luna","effort":"high"}},"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-sol","effort":"medium"}},"avoidModels":[]},"claude":{"code":{"model":"claude-sonnet-5-5","effort":"medium"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"reviewer":{"model":"claude-sonnet-5-5","effort":"high"},"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"tester":{"model":"claude-sonnet-5-5","effort":"high"},"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":"gpt-6-astra","claude":"claude-fable-5-1","kimi":"kimi-code/k3.1-pro"},"preferences":{"schemaVersion":1,"maxConcurrent":2,"clients":{"chatgpt":{"code":{"model":"gpt-6.1-sol","effort":"high"},"light":{"model":"gpt-6.1-sol","effort":"medium"},"roles":{"explorer":{"model":"gpt-6.1-sol","effort":"high"},"writer":{"model":"gpt-6.1-sol","effort":"high"}},"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":"high"},"writer":{"model":"claude-opus-5-5","effort":"high"}},"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-10-30","preferencesHash":"808e505cbbff97d0356fa2c31408e7c13de8369ad10ccc767df6b748e347a022","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.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/model-catalog.md#how-the-presets-are-designed) 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/compatibility.md) and [model maintenance](docs/model-updates.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/releases.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.3.0","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-sol","effort":"medium"}},"avoidModels":[]},"claude":{"code":{"model":"claude-sonnet-5-5","effort":"medium"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"reviewer":{"model":"claude-sonnet-5-5","effort":"high"},"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"tester":{"model":"claude-sonnet-5-5","effort":"high"},"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-10-30","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","models":[{"id":"gpt-6-astra","label":"GPT-6 Astra","efforts":["low","medium","high","xhigh","max"],"defaultEffort":"low","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"]},{"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","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"}],"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"}],"note":"Efforts and defaults follow the bundled Codex CLI 0.166.0 catalog. 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."},"claude":{"label":"Claude","efforts":["low","medium","high","xhigh","max"],"observedClientVersion":"2.1.312","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"},{"id":"claude-sonnet-4-5-20250929","label":"Sonnet 4.5 (deprecated)","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"model","lifecycle":{"status":"deprecated","retirementDate":"2026-11-30","scope":"Anthropic-operated platforms; partner lifecycles differ","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"},{"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.","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"},{"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.","observedClientVersion":"2.4.0","observation":"Kimi Code CLI 2.4.0: 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.10","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"},{"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. CLI 1.4.10 parser explicitly accepts inherit/flash_lite/flash/pro, including Flash Lite absent from the shared docs App table. Per-role effort is not exposed by the agent-file schema."},"grok":{"label":"Grok","efforts":[],"observedClientVersion":"1.0.70","models":[{"id":"grok-4.7","label":"Grok 4.7","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.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. Per-role effort is not exposed by the agent-file schema, so subagents use the main session effort. [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};
327
+ const RELEASE = {"schemaVersion":1,"version":"0.4.0","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":"medium"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"reviewer":{"model":"claude-sonnet-5-5","effort":"high"},"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"tester":{"model":"claude-sonnet-5-5","effort":"high"},"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-01","preferencesHash":"b3285cace0e2935382fc6e23d2f64d9723d2b29384296d3b5cd03af67b4b56ea","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.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.4.0","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":"medium"},"light":{"model":"claude-haiku-5-5","effort":"low"},"roles":{"reviewer":{"model":"claude-sonnet-5-5","effort":"high"},"explorer":{"model":"claude-haiku-5-5","effort":"medium"},"tester":{"model":"claude-sonnet-5-5","effort":"high"},"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-01","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","source":"https://platform.claude.com/docs/en/about-claude/model-deprecations"}},{"id":"claude-sonnet-4-5-20250929","label":"Sonnet 4.5 (deprecated)","efforts":[],"defaultEffort":null,"source":"https://code.claude.com/docs/en/model-config","kind":"model","lifecycle":{"status":"deprecated","retirementDate":"2026-11-30","scope":"Anthropic-operated platforms; partner lifecycles differ","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","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":[],"observedClientVersion":"1.0.70","models":[{"id":"grok-4.7","label":"Grok 4.7","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","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. Grok 4.7 supports low/medium/high/xhigh reasoning effort and Grok Build resolves subagent effort from a spawn override, role default, persona default and then the parent session. The [subagents.models] entries that APK writes carry only a model, so APK leaves effort to the main session. [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
328
  // Pure command codec, also embedded in the offline configuration page.
329
329
  const TOOL_FLAGS=Object.freeze({chatgpt:'chatgpt',claude:'claude',kimi:'kimi',gemini:'gemini',grok:'grok'});
330
330
  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')]);
@@ -464,7 +464,7 @@ function shareRelease(release){
464
464
  for(const preset of release.presets){
465
465
  shareRecord(preset);if(typeof preset.id!=='string'||!preset.id||preset.id==='custom'||SHARE_UNSAFE.has(preset.id)||presets.has(preset.id))invalidShare();
466
466
  shareRecord(shareRecord(preset.preferences).clients);
467
- if(preset.topModels!==undefined&&Object.values(shareRecord(preset.topModels)).some(model=>typeof model!=='string'))invalidShare();
467
+ if(preset.topModels!==undefined)for(const top of Object.values(shareRecord(preset.topModels))){shareRecord(top,['model','effort']);if(typeof top.model!=='string'||(top.effort!==null&&typeof top.effort!=='string'))invalidShare();}
468
468
  presets.set(preset.id,preset);
469
469
  }
470
470
  if(!presets.has(release.preset))invalidShare();
@@ -510,12 +510,12 @@ function sharePayload(payload,release,metadata){
510
510
  if(!legacy&&tool.maxConcurrent!==(clients[id]?.maxConcurrent??preset.maxConcurrent))invalidShare();
511
511
  if(!Object.hasOwn(clients,id))invalidShare();
512
512
  const preferences=shareRecord(clients[id]),own=role=>preferences.roles&&Object.hasOwn(preferences.roles,role);
513
- // A preset's optional top model replaces every shared code role that has no role-specific choice, or none of them.
513
+ // A preset's optional top choice (model and effort) replaces every shared code role that has no role-specific choice, or none of them.
514
514
  const top=named.topModels&&Object.hasOwn(named.topModels,id)?named.topModels[id]:null;
515
- const topRoles=roles.filter(role=>metadata.roles.get(role).kind==='code'&&!own(role)),topped=top!==null&&topRoles.some(role=>choices[role].model===top);
515
+ const topRoles=roles.filter(role=>metadata.roles.get(role).kind==='code'&&!own(role)),topped=top!==null&&topRoles.some(role=>choices[role].model===top.model&&choices[role].effort===top.effort);
516
516
  for(const role of roles){
517
517
  const expected=own(role)?preferences.roles[role]:preferences[metadata.roles.get(role).kind];
518
- const choice=shareChoice(expected,id,metadata);if(topped&&topRoles.includes(role))choice.model=top;
518
+ const choice=shareChoice(expected,id,metadata);if(topped&&topRoles.includes(role)){choice.model=top.model;choice.effort=top.effort;}
519
519
  if(choice.model!==choices[role].model||choice.effort!==choices[role].effort)invalidShare();
520
520
  }
521
521
  }
@@ -596,6 +596,11 @@ function archivedReleaseUrl(error,href,hostedReleases=[]){
596
596
  const IDENTIFIER = /^[A-Za-z0-9][A-Za-z0-9._:@/\[\]-]{0,127}$/;
597
597
  const LABELS = {chatgpt: 'ChatGPT', claude: 'Claude', kimi: 'Kimi', gemini: 'Gemini', grok: 'Grok'};
598
598
  const TASKS = Object.fromEntries(RELEASE.roles.map(role=>[role.id,role.name]));
599
+ // A general name can cover several products; say which coding agent APK configures when that is not obvious.
600
+ const SCOPE_NOTES = {gemini: 'Gemini: APK configures Antigravity, not Gemini CLI.'};
601
+ function assistantNotices(selected) {
602
+ return selected.filter(client => Object.hasOwn(SCOPE_NOTES, client)).map(client => SCOPE_NOTES[client]);
603
+ }
599
604
  const NOTES = {chatgpt: '', claude: '', kimi: 'Effort changes apply to every task using the same alias.', gemini: 'Native tiers only; per-task effort is unavailable.', grok: 'Per-task effort is unavailable; subagents use the main session effort.'};
600
605
  const clone = value => JSON.parse(JSON.stringify(value));
601
606
  const addAll = (selected, available) => [...selected, ...available.filter(id => !selected.includes(id))];
@@ -608,8 +613,10 @@ function archivedReleaseUrl(error,href,hostedReleases=[]){
608
613
  profiles: Object.fromEntries(available.map(client => [client, {presetId, custom: false, modeSelected:!empty,top:topModelFor(RELEASE.presets?.find(preset=>preset.id===presetId),client),presetCap:preferences.clients[client].maxConcurrent??preferences.maxConcurrent,maxConcurrent:preferences.clients[client].maxConcurrent??preferences.maxConcurrent,preferences: clone(preferences.clients[client])}])),
609
614
  jobs: Object.fromEntries(available.map(client => [client, Object.fromEntries(ROLES.map(role => [role, clone(effective(preferences.clients[client], role))]))]))};
610
615
  }
611
- function topModelFor(preset, client) {return typeof preset?.topModels?.[client]==='string'?preset.topModels[client]:null;}
612
- // Code roles without a role-specific preset choice can switch to the preset's optional top model.
616
+ // A top choice is a model and its effort; the same model at a higher effort also counts.
617
+ function topModelFor(preset, client) {const top=preset?.topModels?.[client];return top&&typeof top.model==='string'?{model:top.model,effort:top.effort??null}:null;}
618
+ const isTop=(choice,top)=>!!top&&choice?.model===top.model&&choice?.effort===top.effort;
619
+ // Code roles without a role-specific preset choice can switch to the preset's optional top choice.
613
620
  function topModelRoles(state, client) {
614
621
  const profile=state.profiles?.[client];
615
622
  if(!profile?.top||profile.custom||profile.modeSelected===false)return [];
@@ -617,17 +624,17 @@ function archivedReleaseUrl(error,href,hostedReleases=[]){
617
624
  }
618
625
  function topModelsOn(state, client) {
619
626
  const roles=topModelRoles(state,client).filter(role=>(state.selectedRoles??ROLES).includes(role));
620
- return roles.length>0&&roles.every(role=>state.jobs?.[client]?.[role]?.model===state.profiles[client].top);
627
+ return roles.length>0&&roles.every(role=>isTop(state.jobs?.[client]?.[role],state.profiles[client].top));
621
628
  }
622
629
  function setTopModels(state, clients, on) {
623
630
  for(const client of clients){
624
631
  const profile=state.profiles[client];
625
- for(const role of topModelRoles(state,client)){const base=effective(profile.preferences,role);state.jobs[client][role]={model:on?profile.top:base.model,effort:base.effort};}
632
+ for(const role of topModelRoles(state,client)){const base=effective(profile.preferences,role);state.jobs[client][role]=on?{...profile.top}:{model:base.model,effort:base.effort};}
626
633
  }
627
634
  }
628
635
  function presetJob(state, client, role) {
629
636
  const profile=state.profiles[client],base=effective(profile.preferences,role);
630
- return topModelsOn(state,client)&&topModelRoles(state,client).includes(role)?{model:profile.top,effort:base.effort}:base;
637
+ return topModelsOn(state,client)&&topModelRoles(state,client).includes(role)?{...profile.top}:base;
631
638
  }
632
639
  // Tools whose presets choose identical role models differ only by parallel limits.
633
640
  function presetModelSummary(presets, client) {
@@ -688,7 +695,7 @@ function archivedReleaseUrl(error,href,hostedReleases=[]){
688
695
  state.profiles[tool.id]={presetId:tool.base,custom:tool.mode==='custom'||tool.mode!==null&&maxConcurrent!==presetCap,modeSelected:tool.mode!==null,top:topModelFor(base,tool.id),presetCap,maxConcurrent,preferences:selected};
689
696
  state.jobs[tool.id]=Object.fromEntries(ROLES.map(role=>[role,clone(effective(selected,role))]));
690
697
  for(const [role,choice]of Object.entries(tool.choices))state.jobs[tool.id][role]={...choice};
691
- if(topModelRoles(state,tool.id).some(role=>tool.choices[role]?.model===state.profiles[tool.id].top))setTopModels(state,[tool.id],true);
698
+ if(topModelRoles(state,tool.id).some(role=>isTop(tool.choices[role],state.profiles[tool.id].top)))setTopModels(state,[tool.id],true);
692
699
  }
693
700
  return state;
694
701
  }
@@ -787,7 +794,7 @@ function archivedReleaseUrl(error,href,hostedReleases=[]){
787
794
  return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
788
795
  }
789
796
  function buildCommand(config, release) {return formatExplicitCommand(config,release.version,RELEASE.roles);}
790
- globalThis.APKConfigurator = Object.freeze({initialState, modeFor, presetModelSummary, topModelRoles, topModelsOn, setTopModels, applyPreset, effective, allowedEfforts, preferenceForModel, updateEffort, updateConcurrency, stepConcurrency, concurrencyFor, restoreState, addAll, buildConfig, encodeConfig, buildCommand});
797
+ globalThis.APKConfigurator = Object.freeze({initialState, assistantNotices, modeFor, presetModelSummary, topModelRoles, topModelsOn, setTopModels, applyPreset, effective, allowedEfforts, preferenceForModel, updateEffort, updateConcurrency, stepConcurrency, concurrencyFor, restoreState, addAll, buildConfig, encodeConfig, buildCommand});
791
798
  if (typeof document === 'undefined') return;
792
799
 
793
800
  (() => {
@@ -904,7 +911,9 @@ function archivedReleaseUrl(error,href,hostedReleases=[]){
904
911
  const remove=el('button',{type:'button',class:isRole?'remove':'tool-remove','aria-label':'Remove '+item.name},'×');remove.addEventListener('click',()=>{if(isRole){helpers=helpers.filter(id=>id!==item.id);}else{pickedTools=pickedTools.filter(id=>id!==item.id);}render();});tag.append(remove);box.append(tag);
905
912
  }
906
913
  }
907
-
914
+ const notices=A.assistantNotices(pickedTools),toolsNotice=$('tools-notice');
915
+ if(toolsNotice.textContent!==notices.join(' '))toolsNotice.textContent=notices.join(' ');
916
+ toolsNotice.hidden=!notices.length;
908
917
  }
909
918
  function apply(preset){
910
919
  const message=state.active==='all'?`Apply ${preset.label} to all selected AI assistants? This replaces their individual modes, models and effort.`:state.selected.length>1?`Apply ${preset.label} to ${toolName(state.active)} only? Other AI assistants keep their choices.`:`Replace your changes to ${toolName(state.active)} with ${preset.label}?`;
@@ -924,7 +933,7 @@ function archivedReleaseUrl(error,href,hostedReleases=[]){
924
933
  }
925
934
  function renderTopModels(){
926
935
  const targets=topTargets(),toggle=$('top-models-toggle');$('top-models').hidden=!targets.length;if(!targets.length)return;
927
- const names=targets.map(client=>{const top=state.profiles[client].top;return RELEASE.catalog.clients[client].models.find(model=>model.id===top)?.label??top;});
936
+ const names=targets.map(client=>{const top=state.profiles[client].top,label=RELEASE.catalog.clients[client].models.find(model=>model.id===top.model)?.label??top.model;return top.effort?`${label} · ${top.effort}`:label;});
928
937
  const text=state.active==='all'?`Use top models (${names.join(', ')}) for code, review and tests`:`Use ${names[0]} for code, review and tests`;
929
938
  if($('top-models-label').textContent!==text)$('top-models-label').textContent=text;
930
939
  const on=targets.filter(client=>A.topModelsOn(state,client)).length;toggle.setAttribute('aria-checked',String(on===targets.length));toggle.toggleAttribute('data-mixed',on>0&&on<targets.length);
package/src/inspect.mjs CHANGED
@@ -100,10 +100,11 @@ function extractSettings(client,id,native,env,models){
100
100
  }else if(id==='claude'){
101
101
  const stored=native.env??{};if(!record(stored))throw failure('UNSUPPORTED_NATIVE_SETTING');
102
102
  client.defaults.model=optionalString(stored.CLAUDE_CODE_SUBAGENT_MODEL);
103
+ client.defaults.effort=optionalString(stored.CLAUDE_CODE_SUBAGENT_EFFORT);
103
104
  const count=stored.CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS;
104
105
  if(count!==undefined){if(typeof count!=='string'||!/^\d{1,9}$/.test(count))throw failure('UNSUPPORTED_NATIVE_SETTING');client.concurrency.value=cap(Number(count));}
105
106
  client.overrides={};
106
- for(const[key,field]of [['CLAUDE_CODE_SUBAGENT_MODEL','model'],['CLAUDE_CODE_EFFORT_LEVEL','effort']]){
107
+ for(const[key,field]of [['CLAUDE_CODE_SUBAGENT_MODEL','model'],['CLAUDE_CODE_SUBAGENT_EFFORT','subagentEffort'],['CLAUDE_CODE_EFFORT_LEVEL','effort']]){
107
108
  const value=env[key]??(field==='effort'?stored[key]:undefined);
108
109
  if(value!==undefined)client.overrides[field]=safeString(value);
109
110
  }
package/src/install.mjs CHANGED
@@ -87,11 +87,15 @@ function ensureObject(parent,key) {
87
87
  if(!object(parent[key]))fail('UNSUPPORTED_CONFIG');
88
88
  return parent[key];
89
89
  }
90
- function jsonInstall(text,maxConcurrent,defaultModel) {
90
+ // Claude Code 2.1.316+ reads CLAUDE_CODE_SUBAGENT_EFFORT for subagents that name no effort; older versions ignore it.
91
+ // It copies the Coder effort, capped at high, so a Coder at xhigh or max does not raise every unnamed subagent.
92
+ const CLAUDE_SUBAGENT_EFFORTS=['low','medium','high'];
93
+ const claudeSubagentEffort=effort=>effort===null?null:CLAUDE_SUBAGENT_EFFORTS.includes(effort)?effort:'high';
94
+ function jsonInstall(text,maxConcurrent,defaultChoice) {
91
95
  const value=configJson(text),ops=[],created=[];
92
96
  if(!own(value,'env'))created.push(['env']);
93
- const env=ensureObject(value,'env');
94
- for(const [key,after] of [['CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS',String(maxConcurrent)],['CLAUDE_CODE_SUBAGENT_MODEL',defaultModel]]) {
97
+ const env=ensureObject(value,'env'),effort=claudeSubagentEffort(defaultChoice.effort);
98
+ for(const [key,after] of [['CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS',String(maxConcurrent)],['CLAUDE_CODE_SUBAGENT_MODEL',defaultChoice.model],...(effort===null?[]:[['CLAUDE_CODE_SUBAGENT_EFFORT',effort]])]) {
95
99
  if(own(env,key)&&typeof env[key]!=='string')fail('UNSUPPORTED_CONFIG');
96
100
  ops.push({kind:'value',path:['env',key],existed:own(env,key),before:env[key]??null,after});env[key]=after;
97
101
  }
@@ -235,12 +239,14 @@ function validateTomlSnapshot(file,client,schemaVersion,selectedRoles=ROLE_IDS)
235
239
  if(!aliases.includes(name)||pinned.has(name))fail('INVALID_RECEIPT');pinned.add(name);scalar(op,['models',name,'overrides','default_effort'],'string');
236
240
  }
237
241
  }
238
- function validateJsonSnapshot(file) {
239
- if(!Array.isArray(file.ops)||file.ops.length!==2||!Array.isArray(file.created)||file.created.length>1||!file.created.every(keys=>equal(keys,['env'])))fail('INVALID_RECEIPT');
240
- for(const[i,key]of ['CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS','CLAUDE_CODE_SUBAGENT_MODEL'].entries()) {
242
+ function validateJsonSnapshot(file,schemaVersion) {
243
+ // Receipts before format v4 never owned CLAUDE_CODE_SUBAGENT_EFFORT; v4 owns it only when the Coder effort was pinned.
244
+ if(!Array.isArray(file.ops)||!(schemaVersion===4?[2,3]:[2]).includes(file.ops.length)||!Array.isArray(file.created)||file.created.length>1||!file.created.every(keys=>equal(keys,['env'])))fail('INVALID_RECEIPT');
245
+ for(const[i,key]of ['CLAUDE_CODE_MAX_CONCURRENT_SUBAGENTS','CLAUDE_CODE_SUBAGENT_MODEL','CLAUDE_CODE_SUBAGENT_EFFORT'].slice(0,file.ops.length).entries()) {
241
246
  const op=file.ops[i];fields(op,['kind','path','existed','before','after']);
242
247
  if(op.kind!=='value'||!equal(op.path,['env',key])||typeof op.existed!=='boolean'||typeof op.after!=='string'||op.after.length>4096||(op.existed?typeof op.before!=='string'||op.before.length>4096:op.before!==null))fail('INVALID_RECEIPT');
243
248
  if(i===0&&(!/^[1-9]\d?$/.test(op.after)||Number(op.after)>32))fail('INVALID_RECEIPT');
249
+ if(i===2&&!CLAUDE_SUBAGENT_EFFORTS.includes(op.after))fail('INVALID_RECEIPT');
244
250
  }
245
251
  }
246
252
  function validateReceipt(r,plan) {
@@ -260,7 +266,7 @@ function validateReceipt(r,plan) {
260
266
  fields(file,['path','type','existed','prefix','block']);
261
267
  if(file.type!=='instructions'||!['','\n','\n\n'].includes(file.prefix)||typeof file.block!=='string'||file.block.length>65536||!file.block.startsWith(BEGIN+'\n')||!file.block.endsWith(END+'\n')||file.block.split(BEGIN).length!==2||file.block.split(END).length!==2)fail('INVALID_RECEIPT');
262
268
  } else if(plan.client==='claude') {
263
- fields(file,['path','type','existed','ops','created']);if(file.type!=='json')fail('INVALID_RECEIPT');validateJsonSnapshot(file);
269
+ fields(file,['path','type','existed','ops','created']);if(file.type!=='json')fail('INVALID_RECEIPT');validateJsonSnapshot(file,r.schemaVersion);
264
270
  } else {
265
271
  fields(file,['path','type','existed','ops']);if(file.type!=='toml')fail('INVALID_RECEIPT');validateTomlSnapshot(file,plan.client,r.schemaVersion,r.schemaVersion===4?r.selectedRoles:LEGACY_ROLE_IDS);
266
272
  }
@@ -397,7 +403,7 @@ export async function planInstall(options) {
397
403
  }
398
404
  const files=[];plan.warnings=[...nativeWarnings(plan.client),...(resolvedAliases?['kimi-catalog-alias-resolved']:[])];
399
405
  if(plan.client==='claude') {
400
- const edited=jsonInstall(config.text,maxConcurrent,rolePreference(selected,roleIds[0]).model);nativeChange(l.config,config,edited.text);
406
+ const edited=jsonInstall(config.text,maxConcurrent,rolePreference(selected,roleIds[0]));nativeChange(l.config,config,edited.text);
401
407
  files.push({path:l.config,type:'json',existed:config.text!==null,ops:edited.ops,created:edited.created});
402
408
  } else if(config) {
403
409
  let text=config.text??'';const ops=[];
package/src/release.mjs CHANGED
@@ -4,7 +4,7 @@ import {validatePolicy} from './policy.mjs';
4
4
 
5
5
  export const PACKAGE_VERSION=JSON.parse(fs.readFileSync(new URL('../package.json',import.meta.url),'utf8')).version;
6
6
  const canonical=value=>Array.isArray(value)?value.map(canonical):value&&typeof value==='object'?Object.fromEntries(Object.keys(value).sort().map(key=>[key,canonical(value[key])])):value;
7
- export const PRESETS=Object.freeze([{id:'fast',label:'Light',description:'Light models for every role. Limits last longest.'},{id:'balanced',label:'Standard',description:'Stronger models for code, review, tests and docs. Fits most plans.'},{id:'quality',label:'Top-tier',description:'High-end models for most roles. Uses limits fastest.',topModels:Object.freeze({chatgpt:'gpt-6-astra',claude:'claude-fable-5-1',kimi:'kimi-code/k3.1-pro'})}].map(Object.freeze));
7
+ export const PRESETS=Object.freeze([{id:'fast',label:'Light',description:'Light models for every role. Limits last longest.'},{id:'balanced',label:'Standard',description:'Stronger models for code, review, tests and docs. Fits most plans.'},{id:'quality',label:'Top-tier',description:'High-end models for most roles. Uses limits fastest.',topModels:Object.freeze({chatgpt:Object.freeze({model:'gpt-6-astra',effort:'high'}),claude:Object.freeze({model:'claude-opus-5-5',effort:'xhigh'}),kimi:Object.freeze({model:'kimi-code/k3.1-pro',effort:'high'})})}].map(Object.freeze));
8
8
  export function presetPreferences(id='balanced'){
9
9
  if(!PRESETS.some(preset=>preset.id===id))throw Object.assign(new Error('Unknown preset.'),{code:'UNKNOWN_PRESET'});
10
10
  return validatePolicy(JSON.parse(fs.readFileSync(new URL(`../policies/${id}.json`,import.meta.url),'utf8')));
package/src/share.mjs CHANGED
@@ -47,7 +47,7 @@ function shareRelease(release){
47
47
  for(const preset of release.presets){
48
48
  shareRecord(preset);if(typeof preset.id!=='string'||!preset.id||preset.id==='custom'||SHARE_UNSAFE.has(preset.id)||presets.has(preset.id))invalidShare();
49
49
  shareRecord(shareRecord(preset.preferences).clients);
50
- if(preset.topModels!==undefined&&Object.values(shareRecord(preset.topModels)).some(model=>typeof model!=='string'))invalidShare();
50
+ if(preset.topModels!==undefined)for(const top of Object.values(shareRecord(preset.topModels))){shareRecord(top,['model','effort']);if(typeof top.model!=='string'||(top.effort!==null&&typeof top.effort!=='string'))invalidShare();}
51
51
  presets.set(preset.id,preset);
52
52
  }
53
53
  if(!presets.has(release.preset))invalidShare();
@@ -93,12 +93,12 @@ function sharePayload(payload,release,metadata){
93
93
  if(!legacy&&tool.maxConcurrent!==(clients[id]?.maxConcurrent??preset.maxConcurrent))invalidShare();
94
94
  if(!Object.hasOwn(clients,id))invalidShare();
95
95
  const preferences=shareRecord(clients[id]),own=role=>preferences.roles&&Object.hasOwn(preferences.roles,role);
96
- // A preset's optional top model replaces every shared code role that has no role-specific choice, or none of them.
96
+ // A preset's optional top choice (model and effort) replaces every shared code role that has no role-specific choice, or none of them.
97
97
  const top=named.topModels&&Object.hasOwn(named.topModels,id)?named.topModels[id]:null;
98
- const topRoles=roles.filter(role=>metadata.roles.get(role).kind==='code'&&!own(role)),topped=top!==null&&topRoles.some(role=>choices[role].model===top);
98
+ const topRoles=roles.filter(role=>metadata.roles.get(role).kind==='code'&&!own(role)),topped=top!==null&&topRoles.some(role=>choices[role].model===top.model&&choices[role].effort===top.effort);
99
99
  for(const role of roles){
100
100
  const expected=own(role)?preferences.roles[role]:preferences[metadata.roles.get(role).kind];
101
- const choice=shareChoice(expected,id,metadata);if(topped&&topRoles.includes(role))choice.model=top;
101
+ const choice=shareChoice(expected,id,metadata);if(topped&&topRoles.includes(role)){choice.model=top.model;choice.effort=top.effort;}
102
102
  if(choice.model!==choices[role].model||choice.effort!==choices[role].effort)invalidShare();
103
103
  }
104
104
  }
@@ -1,17 +0,0 @@
1
- # Architecture
2
-
3
- APK runs only for configuration commands. It detects installed CLIs, reads release/custom preferences, writes native files and exits. Native agent operation never imports or launches APK.
4
-
5
- One npm version is one configuration release. src/release.mjs exposes its presets, catalog date and notes. policies contains Light/Standard/Top-tier data (ids fast/balanced/quality); models/catalog.json is the dated native model/effort snapshot. The self-contained page is generated from that same version and data. src/explicit.mjs supplies the pure command codec to Node and is embedded in the page at build time. Commands always expand selected role values, even for presets. The CLI converts complete maps to normal validated policy. Required code/light fallbacks copy the first explicit role and are unused by the complete per-role map. No browser/backend/provider request is needed to compose a command.
6
-
7
- src/share.mjs validates and encodes the visible form state into the URL fragment. It never runs native operations or stores clipboard history. The page restores only release-compatible state, then applies normal command validation.
8
-
9
- src/roles.mjs supplies the shared role descriptions/prompts for the page and native generation. src/policy.mjs validates code/light defaults, optional selectedRoles and per-client role overrides. Native generation uses selected roles only. The first selected role in catalog order supplies the native subagent default. Effort null means no explicit pin. Documented levels depend on model and client. Selected Kimi aliases merge explicit effort and resolve only to provisioned entries. Ambiguity fails without writes.
10
-
11
- The fixed native role filenames remain apk-worker/reviewer/explorer/tester/writer/routine. Their presence does not require delegation. The main agent decides whether helpers are useful; main models and disabled features are preserved.
12
-
13
- Receipt v4 stores the selected role set, bounded ownership snapshots and actual release/source/preset provenance. It verifies that the owned file set matches selectedRoles. Inspection/removal checks old hashes, blocks and typed operations without current templates or catalog validation. Historical v3 and v2 native snapshots remain supported. v2 has unknown release provenance. Unsupported layouts/runtime receipts are refused.
14
-
15
- Explicit replacement virtually undoes owned changes to the original user baseline, renders the target, and commits final changes against actual current preimages. The existing transaction protects complete read dependencies, locks, staging, rollback and competing edits. Final uninstall restores original user values and keeps unrelated later edits. Receipts are applied truth; canonical policy is the latest requested snapshot. Per-client partial outcomes are explicit.
16
-
17
- There is one TOML parser dependency and no CLI compilation. The static page's data injection is a deterministic release-preparation step. Generated native files have no package/source/state dependency; npm package removal does not remove saved native settings.