agent-policy-kit 0.3.0 → 0.5.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 (56) hide show
  1. package/AGENT_INSTALL.md +126 -42
  2. package/CHANGELOG.md +85 -3
  3. package/README.md +27 -10
  4. package/docs/README.md +46 -0
  5. package/docs/design/2026-11-01-documentation-structure.md +58 -0
  6. package/docs/design/2026-11-01-grok-build-support.md +5 -0
  7. package/docs/guide/commands.md +375 -0
  8. package/docs/guide/configurator.md +188 -0
  9. package/docs/guide/getting-started.md +121 -0
  10. package/docs/guide/preferences.md +168 -0
  11. package/docs/guide/privacy.md +76 -0
  12. package/docs/guide/updates-and-removal.md +188 -0
  13. package/docs/maintainers/architecture.md +71 -0
  14. package/docs/maintainers/development.md +93 -0
  15. package/docs/maintainers/model-review.md +101 -0
  16. package/docs/maintainers/release.md +114 -0
  17. package/docs/maintainers/verification.md +110 -0
  18. package/docs/maintainers/website.md +112 -0
  19. package/docs/reference/assistants.md +194 -0
  20. package/docs/reference/model-catalog.md +210 -0
  21. package/docs/reference/ownership.md +177 -0
  22. package/docs/reference/presets.md +130 -0
  23. package/docs/reference/roles.md +157 -0
  24. package/docs/research/2026-11-01-model-review.md +372 -0
  25. package/docs/research/limits-evidence.md +28 -0
  26. package/models/README.md +2 -6
  27. package/models/catalog.json +100 -25
  28. package/package.json +2 -2
  29. package/policies/balanced.json +2 -10
  30. package/policies/fast.json +1 -11
  31. package/policies/quality.json +2 -12
  32. package/schema/policy.schema.json +8 -1
  33. package/site/index.html +95 -47
  34. package/src/explicit.mjs +8 -6
  35. package/src/inspect.mjs +6 -4
  36. package/src/install.mjs +14 -8
  37. package/src/native.mjs +5 -3
  38. package/src/output.mjs +3 -1
  39. package/src/release.mjs +1 -1
  40. package/src/share.mjs +5 -5
  41. package/docs/architecture.md +0 -17
  42. package/docs/compatibility.md +0 -39
  43. package/docs/configuration-page.md +0 -44
  44. package/docs/deployment.md +0 -33
  45. package/docs/development.md +0 -31
  46. package/docs/installation.md +0 -23
  47. package/docs/limits-evidence.md +0 -24
  48. package/docs/model-catalog.md +0 -102
  49. package/docs/model-updates.md +0 -22
  50. package/docs/npm-release.md +0 -27
  51. package/docs/policy.md +0 -16
  52. package/docs/privacy.md +0 -9
  53. package/docs/recovery.md +0 -13
  54. package/docs/releases.md +0 -40
  55. package/docs/use-cases.md +0 -25
  56. package/docs/verification.md +0 -61
@@ -1,22 +0,0 @@
1
- # Keeping model choices current
2
-
3
- The task roles stay stable: worker for implementation, reviewer for findings, explorer for discovery, tester for tests, writer for documentation and routine for prescribed execution. Models and effort values are separate data in policies and models/catalog.json and can evolve without changing those responsibilities.
4
-
5
- Named presets and the dated model/effort catalog follow the npm package version. Record model-choice changes and their review date/sources in CHANGELOG.md when releasing a revised preset. Version 0.1.0 is a starting example, not a live ranking or a benchmark of model quality. Native format checks are recorded in [verification](verification.md).
6
-
7
- ## Before setup or an authorized update
8
-
9
- The installing AI agent should:
10
-
11
- 1. Read the saved preferences and installed client versions. Preserve explicit user choices.
12
- 2. Cross-check the provider's current dedicated model docs with native catalogs or schemas. Older official help pages can lag: Kimi's old help page omitted K3.1 Pro while its current Code Docs and provisioned metadata included it. Keep API capabilities separate from native choices; aliases and session modes are not additional versioned models. Check provisioned aliases without printing credentials.
13
- 3. Compare proposed choices with the saved setup. A newer model is not automatically better for every task, account or usage constraint.
14
- 4. Apply requested changes through the coordinated [preferences update procedure](../AGENT_INSTALL.md). Package installation alone must not rewrite native settings.
15
-
16
- No background updater, live model catalog request, or automatic model replacement runs during normal client use. Existing configured values stay saved until another configuration operation changes them.
17
-
18
- Provider aliases can still resolve to a newer model independently of APK. For example, Claude documents that its [model aliases update over time](https://code.claude.com/docs/en/model-config#model-aliases). Use available versioned identifiers where reproducibility matters and the client/provider supports them. A configured identifier remains distinct from proof of the actual provider model.
19
-
20
- ## Maintainer release check
21
-
22
- Update the preset data, source/date notes and configuration fixtures together. Recheck native schemas, preserve main-session behavior, and run unit plus packed-package acceptance. Do not present configuration tests as model-quality evaluations. All preferences continue to apply only when the main agent chooses to delegate.
@@ -1,27 +0,0 @@
1
- # Prepare a configuration release
2
-
3
- One version: package.json version identifies presets, model catalog, native templates, instructions and page. No second preset-version system. The owner authorizes each publication; nothing publishes automatically. New pull requests must remain draft, and only the owner merges them.
4
-
5
- ## Record what and why
6
-
7
- For every release, update CHANGELOG.md with: date, changed models/efforts/role instructions, why the changes fit the work, who should update, native/client requirements and migration/rollback limits. Record catalog source/date and distinguish configuration checks from model-quality evaluation. Do not claim performance/cost numbers without evidence.
8
-
9
- Patch releases can correct documentation/configuration bugs; intentional recommendation changes deserve clearly described release notes (normally a minor release); incompatible native ownership/layouts require a documented migration boundary. Never rewrite a published version. See [npm publication rules](https://docs.npmjs.com/cli/v11/commands/npm-publish/).
10
-
11
- ## Build and verify before tagging
12
-
13
- 1. Confirm npm name ownership and set actual repository/bugs/homepage URLs once they exist. Do not invent them.
14
- 2. Update package version and lockfile, preset JSON, model catalog/source date and this version's changelog entry. Fill the actual release date when cutting it.
15
- 3. Run npm run build:site. The generated single HTML file embeds that version's exact data and command.
16
- 4. Run npm run check and npm test. Required tarball gates deny source access, remove package/state, and prove two synthetic versions can upgrade/downgrade changed models AND templates safely. Synthetic 0.2.0 is not a real release.
17
- 5. Review npm pack --dry-run --json --ignore-scripts, npm publish --dry-run --ignore-scripts, and the final npm pack tarball/integrity. Private evidence/configs must stay out.
18
-
19
- The package includes CHANGELOG.md and its matching page. Its CLI requires no compilation; only the page data is regenerated. No lifecycle install script mutates native settings.
20
-
21
- After explicit publication authorization, create the corresponding git version tag/release with the reviewed changelog text and publish that exact tarball through npm's normal authenticated process. Publish application and npm releases only from reviewed commits already present in main. Before publication, fetch origin and require git merge-base --is-ancestor HEAD origin/main to succeed. Never merge, mark a draft ready or enable auto-merge. Recheck registry contents and public page links after an authorized release.
22
-
23
- ## Static page
24
-
25
- The latest site deploys automatically from reviewed main after CI, while each published /v/VERSION/ page remains an exact tagged snapshot. npm publication stays explicit. See [website deployment](deployment.md) for configuration guards, archive preservation, credentials and main-only retry.
26
-
27
- The public domain is https://agent-policy-kit.trymenow.io/. The workers.dev address remains available for earlier links. Domain-only infrastructure changes use wrangler triggers deploy and compare deployment/version IDs before and after. CI website deployment deliberately omits routing changes and does not publish npm packages.
package/docs/policy.md DELETED
@@ -1,16 +0,0 @@
1
- # Configuration preferences
2
-
3
- Start with policies/balanced.json or another preset in the selected release. The [JSON Schema](../schema/policy.schema.json) describes data shape; the configuration validator also checks the release catalog's known model/effort compatibility.
4
-
5
- - schemaVersion1; maxConcurrent is the shared fallback, from 1 to 32. Optional clients[tool].maxConcurrent overrides it for one tool. Older policies without overrides keep their shared behavior.
6
- - clients contains chatgpt (Codex), claude (Claude Code), kimi (Kimi Code), gemini (Antigravity) and/or grok (Grok Build). Version 0.2.0 and earlier used the keys codex and agy. They are not accepted.
7
- - Optional top-level selectedRoles is a nonempty unique array of worker, reviewer, explorer, tester, writer and routine IDs. Omit it for all six roles in the executing release. Only selected roles receive native files and routing instructions.
8
- - code/light hold default model+effort pairs.
9
- - Optional roles inside each client overrides each selected role independently. Worker/reviewer/tester otherwise use code; explorer/writer/routine use light. Public presets also contain role-specific overrides.
10
- - avoidModels is delegation guidance. An explicit page choice removes itself from that avoid list.
11
-
12
- Effort null means native behavior without an explicit effort override. Codex effort depends on the native model selector. Claude supports low through max as documented per model. Kimi actual aliases must declare the requested non-null effort. Antigravity's role field supports model tiers, with no per-role effort pin. Grok Build accepts any model ID and always uses effort null.
13
-
14
- A known model cannot request an effort excluded by the release catalog. Custom IDs can use the client's native level set, subject to actual native availability. Kimi can merge null with one explicit pin for a selected shared alias. Contradictory explicit pins are refused. Unselected role defaults do not require Kimi aliases or acquire pins. A section-wide effort conflicting with mixed default/pinned alias behavior is a prerequisite rather than a silent rewrite.
15
-
16
- [Presets/catalog](model-catalog.md) describe recommendations and sources. [Release usage](releases.md) explains explicit default/preset/custom replacement. Only when the main agent chooses delegation do any of these role preferences apply. No subagent feature is enabled by the configurator.
package/docs/privacy.md DELETED
@@ -1,9 +0,0 @@
1
- # Privacy
2
-
3
- The configurator reads local preferences and native configuration, probes CLI version/help identity, writes owned native settings and exits. It does not read transcripts or send prompts to a classifier, proxy or telemetry endpoint. It does not provision or transfer credentials.
4
-
5
- Client settings can contain existing secrets. Transaction backups and receipts are private local state and must never be published. CLI summaries omit configuration bodies, raw executable output, private paths and raw errors.
6
-
7
- There is no runtime audit, session tracking or token journal. Normal agent operation does not call package code. Native clients retain their own provider/account behavior.
8
-
9
- The npm package uses a files allowlist. Tests, development notes, private profiles, evidence and tarballs stay outside it. The acceptance gate uses fresh profiles with fake secret sentinels and denies source access. Fixtures do not establish live account or provider execution.
package/docs/recovery.md DELETED
@@ -1,13 +0,0 @@
1
- # Recovery
2
-
3
- Do not remove a lock or pending journal merely to make configuration proceed. Another operation may own it, or a failed transaction may need its backups.
4
-
5
- The installer stages changes and rechecks the complete read set. A failed commit restores matching postimages. A competing edit is preserved and yields a recovery conflict.
6
-
7
- Private state contains pending.json, .install.lock and backups/TRANSACTION_ID/index.json. Keep the journal and backup index together. The retained lock ID can identify the index if recreating pending.json failed.
8
-
9
- For recovery, ensure no configurator is active, make a private copy of affected files/state, compare current files with recorded preimages/postimages, and reconcile only owned changes. Preserve every later unrelated edit. Remove only the resolved transaction's blocking markers, then rerun a plan. Do not publish config bodies or backup indexes.
10
-
11
- Owned file/block/scalar drift stops removal. Reconcile that exact change rather than restoring a stale whole-file backup. Unknown experimental runtime receipts require the older version's owned uninstall first; never delete arbitrary hooks based on their text.
12
-
13
- Removing or moving the npm package after successful setup is safe. Native files have no package dependency. Reinstall or invoke the configurator with npx for future updates/removal. Preserve private receipts if owned removal is desired.
package/docs/releases.md DELETED
@@ -1,40 +0,0 @@
1
- # Choose and apply a configuration release
2
-
3
- **APK package version = configuration release.** Each published package freezes its named presets/model catalog/efforts, native role templates, instructions, changelog and static configuration page. There is no second preset-version system.
4
-
5
- ## Default settings from a specific release
6
-
7
- Inspect the release and preview its plan:
8
-
9
- ```sh
10
- npx --yes --ignore-scripts --package agent-policy-kit@0.3.0 agent-policy release
11
- npx --yes --ignore-scripts --package agent-policy-kit@0.3.0 agent-policy setup --release
12
- ```
13
-
14
- Apply explicitly:
15
-
16
- ```sh
17
- npx --yes --ignore-scripts --package agent-policy-kit@0.3.0 agent-policy setup --release --preset balanced --apply
18
- ```
19
-
20
- The package you select supplies both preferences and native templates. --release is a boolean, not another version argument. --preset selects fast/balanced/quality; its identity is stored alongside release/source. The same pattern selects an older compatible release for downgrade. Installing/updating an npm package alone does not change native files. Before publication, use that release's verified .tgz instead of the registry package spec.
21
-
22
- ## Your own choices
23
-
24
- Open this release's [configuration page](../site/index.html) in Google Chrome. Its fully expanded per-tool command is pinned to the page's package version. It applies your chosen models through that release's templates. Generated explicit commands record custom provenance, including when the form used a preset. The --release workflow retains named preset provenance.
25
-
26
- --config is bounded canonical base64url UTF-8 JSON. It is data, not executable shell content. Explicit tool arguments, --release/--preset, --config and --policy are alternative input modes. Explicit arguments, --config and --release permit replacement of owned configuration. --policy without those options remains conservative for advanced saved-file workflows.
27
-
28
- ## What happens during an update
29
-
30
- APK verifies old owned files, reconstructs the original user baseline in memory, renders the target, and commits one final change per file. There is no physical uninstall gap. Native prerequisites and drift refuse changes; late failure rolls back the previous installed release. Later unrelated user edits survive. Final uninstall restores original user values rather than the previous APK version's values.
31
-
32
- Transactions are per client. Missing, unsupported or blocked clients retain their actual previous release; successful independent clients may advance. setup results and doctor report each client's applied version/source. The shared state policy is the latest requested snapshot, not proof every client applied it. Doctor verifies receipts without needing that snapshot or today's templates.
33
-
34
- Current native receipt v4 records the selected subset of six bounded role filenames. Native v3 and v2 snapshots remain bounded to their historical four roles and remain supported. An explicit replacement with selectedRoles omitted can expand an earlier setup to all six roles in the chosen release; implicit setup keeps the existing installation unchanged. v2 has unknown release provenance. An older executable can reject v4. Use a receipt-compatible executable before an incompatible downgrade. Unknown future schemas/layouts are refused. An incompatible migration must explain its supported path in that release's notes.
35
-
36
- ## What a release does not freeze
37
-
38
- A release reproduces declared settings and templates. Provider aliases/tiers can resolve to new models, old model IDs can retire, and account access can change. See [model maintenance](model-updates.md). No runtime updater or model gateway is installed.
39
-
40
- Read [CHANGELOG](../CHANGELOG.md) for what changed, why, who should update and migration limits. Versions 0.1.0 and 0.2.0 are published and 0.3.0 is being prepared; synthetic versions in acceptance tests are not real releases.
package/docs/use-cases.md DELETED
@@ -1,25 +0,0 @@
1
- # Examples
2
-
3
- ## Add only reviewers and researchers
4
-
5
- Choose Reviewer and Researcher in the page, then select your AI assistants. APK creates only apk-reviewer and apk-explorer. Later additions can expand this set. Removing a selected role removes its earlier owned definition while preserving unrelated files and edits.
6
-
7
- ## One role scheme across AI assistants
8
-
9
- Choose models for the six focused roles: implementation, review, discovery, tests, documentation and prescribed execution. Presets provide role-specific starting choices. Each tool receives native definitions and delegation instructions; no central dispatcher runs between it and its provider.
10
-
11
- ## Keep your main model
12
-
13
- Apply the shared preferences to delegated helpers while preserving each tool's main model, account, permissions and unrelated setup.
14
-
15
- ## Configure and discard the installer
16
-
17
- Run detected setup with --apply, verify native files, remove the npm package, and start your AI assistants normally. Saved role files and settings keep working through native features.
18
-
19
- ## Customize model choices
20
-
21
- Use init --policy FILE, choose models/efforts actually available in each account, then apply through the AI guide. Kimi needs provisioned aliases; agy choices are tiers. Higher-priority native settings can override global preferences.
22
-
23
- ## Remove after other settings changed
24
-
25
- A later unrelated theme setting remains during owned uninstall. An edited generated role or managed block produces a drift conflict; the configurator preserves it for reconciliation.
@@ -1,61 +0,0 @@
1
- # Verification record
2
-
3
- Configuration checks, native loading and model execution are separate results.
4
-
5
- ## 0.3.0
6
-
7
- macOS arm64, 2026-11-01.
8
-
9
- | Layer | Current evidence |
10
- |---|---|
11
- | Full Node 26.5.1 suite | PASS: 368/368, including source-denied real-tarball gates, desktop app bundle detection and the renamed `chatgpt` and `gemini` IDs. A second run with `/Applications` replaced by a missing directory also passed 368/368, so no test depends on apps installed on the host |
12
- | Hosted CI | PASS on main e8c6ac3: macOS Node 22.13.0 and Ubuntu Node 24 suites plus site-build ([run](https://github.com/automatis-tools/agent-policy-kit/actions/runs/41348755442)) |
13
- | Two synthetic releases | PASS: the actual 0.3.0 tarball and a synthetic 0.4.0 tarball, A to B to A, mixed applied versions, drift safety and original-user restoration |
14
- | Published 0.2.0 to 0.3.0 | PASS in an isolated HOME with the npm 0.2.0 package: ChatGPT/Codex reports `OWNERSHIP_CONFLICT` in both directions until the creating version removes it, then setup succeeds; Claude upgrades to 0.3.0 and moves back to 0.2.0 in place; Grok upgrades in place. Kimi NOT CHECKED with a provisioned model pool |
15
- | Desktop app detection | PASS with the installed apps and a PATH without CLIs: ChatGPT Desktop's bundled `codex-cli 0.166.0-alpha.5.1` and Claude Desktop's bundled Claude Code 2.1.309, both reported as `desktop_app` |
16
- | Browser | PASS in local Chromium previews: the "AI assistants" step empty and with two assistants, its note, the All scope and the generated `--chatgpt` command |
17
- | Native ChatGPT/Claude/Kimi/Gemini/Grok loading and provider execution | NOT CHECKED for 0.3.0; no live model tasks used as configuration proof |
18
- | npm packaging | PASS: `npm pack --dry-run` and `npm publish --dry-run` list 45 files; no private evidence or configuration |
19
- | Current model catalog | Unchanged from 0.2.0 apart from the `chatgpt`/`gemini` keys and general labels: ChatGPT 9 selectors, Claude 19 selectors, Kimi 6 preferred aliases, Gemini 4 Antigravity tiers, Grok 4 model IDs. Account access and model quality are not established by configuration tests. |
20
-
21
- ## 0.2.0
22
-
23
- macOS arm64, 2026-11-01.
24
-
25
- | Layer | Current evidence |
26
- |---|---|
27
- | Full Node 26.5.1 suite | PASS: 350/350, including source-denied real-tarball gates, selected-role native generation, Grok Build files under an isolated GROK_HOME, per-tool limits and expanded page commands |
28
- | Hosted CI | PASS on main 7f8666d: macOS Node 22.13.0 and Ubuntu Node 24 suites plus site-build ([run](https://github.com/automatis-tools/agent-policy-kit/actions/runs/41283600922)) |
29
- | Two synthetic releases | PASS: the actual 0.2.0 tarball and a synthetic 0.3.0 tarball, A to B to A, mixed applied versions, drift safety and original-user restoration |
30
- | Page command via npx | PASS: the generated multiline command runs through a real shell and npx with the local tarball; independent Codex 5 and Claude 2 limits and Grok Build values are read back from native files |
31
- | Preset audit | PASS: an independent review compared every preset, tool and role with the catalog and documentation and found no data defects; wording fixes were applied, and a test keeps the documentation tables in sync |
32
- | Grok Build discovery | PASS: `grok inspect --json` with Grok Build 1.0.70 lists an `apk-*` agent from an isolated GROK_HOME. Model selection and execution NOT CHECKED |
33
- | Native Codex/Claude/Kimi/Antigravity loading and provider execution | NOT CHECKED for 0.2.0; no live model tasks used as configuration proof |
34
- | Browser | The owner reviewed local previews manually; no automated browser run for 0.2.0 |
35
- | npm packaging | PASS: `npm pack --dry-run` and `npm publish --dry-run` list 42 files; no private evidence or configuration |
36
- | Current model catalog | Codex 9 selectors, Claude 19 selectors, Kimi 6 preferred aliases, Antigravity CLI 4 tiers, Grok Build 4 model IDs. Account access and model quality are not established by configuration tests. |
37
-
38
- ## 0.1.0
39
-
40
- macOS arm64, 2026-10-30.
41
-
42
- | Layer | Current evidence |
43
- |---|---|
44
- | Full Node 26.5.1 suite | PASS: 248/248, including both source-denied real-tarball gates, selected-role native generation, v2/v3/v4 ownership and expanded page commands |
45
- | Minimum Node 22.13.0 suite | PASS: 248/248, using the checksum-verified official runtime outside the denied source checkout |
46
- | Two synthetic releases | PASS: actual 0.1.0/0.2.0 tarballs, changed model and shared role/instruction definitions, A to B to A, mixed applied versions, late replacement rollback, drift safety and original-user restoration |
47
- | Page-selected roles via npx | PASS: the shipped page formatter produced explicit Reviewer/Researcher options for selected Codex/Claude fixtures, including independent effort. The actual multiline command ran through a real shell and npx with the local tarball offline. Unselected installed tools stayed unchanged. Later role reduction/removal succeeded. A late failure after role deletion restored the complete prior installation. |
48
- | Package/state removal | PASS: native files and standalone consumer fixtures remain readable without package/source/state |
49
- | Desktop Google Chrome | PASS: approved four-step layout, empty/missing/error/ready states, per-tool modes, append order, automatic All/manual scope, synced role rows, visible per-tool model/effort arguments, actual clipboard copy, denied-clipboard fallback and stale-copy protection |
50
- | Custom input browser regression | PASS: real typing followed directly by effort or Copy clicks, without Tab, works with reduced motion. The earlier lost-click case was reproduced before the fix. Normal/reduced/fallback motion checks are recorded separately from model execution. |
51
- | Independent review | PASS: independent URL codec/controller review and scoped final animation/hover/label-cache review. Preset/role integration review found and verified fixes for six-role schema bounds and live Custom Fable notices. Fresh targeted checks passed 76/76; full suites passed 248/248 on both runtimes. |
52
- | URL/checklist behavior | PASS in local HTTP Chrome tabs: exact command restored from a shared link, imported copy remains incomplete, Reset clears state/hash, no default radio, first mode choice skips warning, Custom-only toggle skips unnecessary overwrite warning while genuine edits/mixed bases/cap remain protected, view-only navigation preserves copy, settings changes clear it, invalid links remain non-applicable. Hint/marker keyframes hold at offsets 0–0.5 and fade by offset 1 over 4000 ms. |
53
- | Current model catalog | Dated release snapshot: Codex 9 selectors, Claude 19 selectors, Kimi 6 preferred aliases, Antigravity CLI 4 tiers. API effort metadata is separate. Account access and model quality are not established by configuration tests. |
54
- | Native Codex/Antigravity loading | Historical parser/listing positive and malformed negative controls only. New subset behavior has file/consumer fixtures, not fresh vendor-client loading proof. |
55
- | Native Claude/Kimi loading and provider execution | NOT CHECKED; no live model tasks used as configuration proof |
56
- | Six-role compatibility | PASS: legacy four-role v2/v3/v4 inspection, owned removal, explicit expansion to six, drift refusal and late rollback; six-alias Kimi v4 plans/inspects/removes 14 bounded operations. |
57
- | npm packaging | PASS: 38-file package-content inspection and real local tarball consumption. No npm publication. |
58
- | Hosted macOS/Linux CI | See the public workflow runs linked from the GitHub release; local results above do not establish hosted CI. |
59
- | Deployment/publication | Public status and downloadable artifacts are recorded in the GitHub release; package checks below concern the reviewed tarball. |
60
-
61
- At 0.1.0, the 0.2.0 packages were synthetic test fixtures, not public releases. Browser evidence, disposable homes, raw configuration fixtures and logs stay outside Git/npm. Expanded commands preserve the selected cap and avoid lists; :native round-trips unpinned effort. A 2835-case preset/role/tool matrix produces identical native role files and routing instructions. Real-shell tests preserve colon/@/bracket IDs and prevent pathname expansion. The same pinned command consumes the published npm release. The verified local tarball supports testing before publication.