@mmerterden/multi-agent-pipeline 20.20.0 → 20.21.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 (39) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +24 -13
  3. package/README.tr.md +21 -10
  4. package/docs/ecosystem.md +6 -5
  5. package/docs/facts.json +5 -4
  6. package/docs/features.md +1 -0
  7. package/install/catalog-history.json +1 -1
  8. package/manifest.json +42 -39
  9. package/package.json +1 -1
  10. package/pipeline/commands/multi-agent/SKILL.md +1 -1
  11. package/pipeline/commands/multi-agent/route-on/SKILL.md +32 -8
  12. package/pipeline/commands/multi-agent/route-status/SKILL.md +12 -2
  13. package/pipeline/commands/multi-agent/setup/SKILL.md +2 -1
  14. package/pipeline/lib/model-dispatch.sh +72 -24
  15. package/pipeline/lib/outbound-gate.mjs +2 -0
  16. package/pipeline/lib/route-state.sh +118 -10
  17. package/pipeline/lib/toolkit-llm.sh +30 -0
  18. package/pipeline/lib/unattended-profile-check.mjs +23 -2
  19. package/pipeline/multi-agent-refs/analysis/evidence.md +3 -1
  20. package/pipeline/multi-agent-refs/cross-cli-contract.md +8 -3
  21. package/pipeline/multi-agent-refs/features/doctor.md +11 -0
  22. package/pipeline/multi-agent-refs/features/free-models.md +111 -0
  23. package/pipeline/multi-agent-refs/features/model-fallback.md +21 -15
  24. package/pipeline/multi-agent-refs/features/unattended-security.md +4 -2
  25. package/pipeline/multi-agent-refs/setup/free-models.md +22 -0
  26. package/pipeline/preferences-template.json +1 -0
  27. package/pipeline/schemas/prefs.schema.json +10 -1
  28. package/pipeline/schemas/route-config.schema.json +33 -8
  29. package/pipeline/schemas/secret-patterns.json +14 -0
  30. package/pipeline/scripts/bulk-read.sh +98 -12
  31. package/pipeline/scripts/cost-table.json +9 -1
  32. package/pipeline/scripts/doctor.mjs +100 -0
  33. package/pipeline/scripts/pre-commit-check.sh +1 -1
  34. package/pipeline/scripts/unattended_policy.py +20 -0
  35. package/pipeline/skills/.skill-manifest.json +5 -5
  36. package/pipeline/skills/shared/core/multi-agent/SKILL.md +2 -0
  37. package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +31 -7
  38. package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +12 -2
  39. package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +1 -0
package/manifest.json CHANGED
@@ -1,15 +1,15 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "20.20.0",
4
- "commit": "3eaded72b1509c7426dcba713df56fd72a0a2698",
5
- "generatedAt": "2026-10-11T23:40:41.943Z",
3
+ "version": "20.21.0",
4
+ "commit": "e2d004d1ef1ce70ca42cd6083052d67ebff6c0c5",
5
+ "generatedAt": "2026-10-12T02:43:40.290Z",
6
6
  "algorithm": "sha256",
7
- "fileCount": 1357,
7
+ "fileCount": 1360,
8
8
  "files": {
9
- "CHANGELOG.md": "cf8a8131da43152e49483d7b7a9890a70f23e4df07c8c3e99f768ec632840e55",
9
+ "CHANGELOG.md": "2c2cac1fda619f849e9002de180cc0f02fbe0ad9ec15f7392cebd434b80ea56f",
10
10
  "LICENSE": "8d8c51aaf1e1538b180c69965fa038db71be86798cc3e26a143bebfefe16a43e",
11
- "README.md": "a73f80dafda9ee106db1613bb359d56b02f53f9c3e16fb5691fef06719d2c2e9",
12
- "README.tr.md": "7338743b34baa2128236775f8e11b7e7df486294e15f63268755e62d12e4fe4d",
11
+ "README.md": "4cb9fee0aed62bd1467bdc09954e011612b0de6e7895d663f297bc8778e00b2e",
12
+ "README.tr.md": "f30edbc26e51e311077fbb5b64234e70285db92340e6dadc259cfd673f104326",
13
13
  "SECURITY.md": "0eb89553ddcfc56bfe9712315b55a6630ee2f579631aaeccd6ad24f8ac769a0b",
14
14
  "docs/FIGMA_PIPELINE.md": "ea01f3ea5fef1a9cb316040a2d416fcf87dd4f2a14b5497aa00994a0b5dc7e6a",
15
15
  "docs/adr/0001-three-model-triage.md": "79a6f1025469f607a5859add21854052d7433bc213f4aceee2e159b613eeb6a1",
@@ -31,10 +31,10 @@
31
31
  "docs/adr/README.md": "6ff58bc97dde4f1d94df60e4e221396a46906682b429ef275fd813cd288956e1",
32
32
  "docs/architecture.md": "04fe9630d51646962bc5b660b4c82a8a8199984dc14d993aaf5c147c4c8f6968",
33
33
  "docs/best-practices.md": "f8b75b0d38b5896a6a852bb30a1edddeb24dab8b5b7b1d9313290e1241c72024",
34
- "docs/ecosystem.md": "a1aa8134339f915749652814f4ee7291a37a926467fbb097109d5821f97aeeb8",
34
+ "docs/ecosystem.md": "44f7d2af1c3a655958bfc590d9d3ab10fcb2c9fe2f1558450f996dce0b45393a",
35
35
  "docs/engineering.md": "550528cd47c7d2c921729c68d0782a00ac8e77a4bdfec479f6749f9c3235d188",
36
- "docs/facts.json": "3a12532eb8aab78df188985a05e593251ba248de79201ea6e5bba1ab696fbe8b",
37
- "docs/features.md": "703435e309d1e37668c24bde3c2c0a7e4689a05d95449dcd394406fda1a19858",
36
+ "docs/facts.json": "8f1a90b5ece44ac36d2a8a58777e63038cddac208a044b092eefd709882524a4",
37
+ "docs/features.md": "17e9971ba14b940a562c99df727150fadc8688d793a8dda4b8204482d51c30a4",
38
38
  "docs/performance.md": "bbf2f3922c25dcba0c1a9e69ef420e3871a729af5b35009a49b48a5d3c5cd151",
39
39
  "docs/recovery-guide.md": "59a8f1b66b34cb9ff5507b3d54dac3b9915e184aa044d9c758d18cac818d510e",
40
40
  "docs/server-readiness.md": "ea21eee6a08c6fc0f2d1da8058acd5a50c556cea486d3acfe48fc0b23f4581fc",
@@ -52,7 +52,7 @@
52
52
  "install/_telemetry.mjs": "5433d753f909beed2c8789272bba05e245482c472f83d3444f58000c4c9a634b",
53
53
  "install/_unattended-profile.mjs": "e1ed82bde35d19105ee12c2a551eb778912b0e5c93ab227fd15c993098d98de0",
54
54
  "install/_xcode-skills.mjs": "1a7e20f1e6743324b941c5d3ecac9f94c65fff1534ffd9c63b39cbea4f8d101a",
55
- "install/catalog-history.json": "9f8bd5ce3b6d5d49faec993a50111b4942be2a9402c4a5c38ba7ff6bdfde3e48",
55
+ "install/catalog-history.json": "39c2b310f9b7bd243141442aac55ab09d804ff085be794e0f4a43cce4ebb553c",
56
56
  "install/claude.mjs": "106ce353ebc19c8319d057ce342e1f989519510465c798399076b5f3d8727904",
57
57
  "install/codex.mjs": "08925fe9f3ecdf509b37f01105652c847475d20fcde2db0d679b9a7d663ca145",
58
58
  "install/copilot.mjs": "41dc394b8a3ae77cfd194ce0ca9bbcafce9bdce349f1f72eeb86569f993e15fe",
@@ -63,7 +63,7 @@
63
63
  "install/templates/multi-agent-autopilot-awake.plist.template": "ddd25c76c56fcbb38a89de8e35637372d70ace993d6bc487a88ca9cfb702fe1f",
64
64
  "install/templates/multi-agent-autopilot.plist.template": "122c8a61cd927edd99375d6e3da40f1d42bcceed5b6641785c8b28bb930bc77e",
65
65
  "install/unattended-profile-legacy.json": "f52e86b998956f09ad306b1735a6c10b58580d7082d8a55665a4c6bb15c3aa1f",
66
- "package.json": "6f50165ff1e18ae3f084464e171f7e710d106f37a96d77927b525509b5981de0",
66
+ "package.json": "72825278361b88c1b2742622d7ff2337a0f8c254467949052c6833793e3b1e89",
67
67
  "pipeline/agents/android-architect.md": "11fb74543cb0ebcf9525ca6654fe95d53da7229e0bf4a1149b31fd9005abc453",
68
68
  "pipeline/agents/backend-architect.md": "b02a606c301e4714131aed70ae6d16eeb77fbc819a001e2752cff2488d4246de",
69
69
  "pipeline/agents/bulk-reader.md": "6597052cd7d205bac2b1c7633f5232fe1a40730664a913b8eb77efd5a786dc25",
@@ -78,7 +78,7 @@
78
78
  "pipeline/commands/archive-guard.md": "16c5d3feaa91950402d62e66adc7fcf519a25d028a9303cb1e9c08af2765c04b",
79
79
  "pipeline/commands/deploy.md": "d20f95f3b1d2357c8c92f3047e8fe11eadf539ff13cab9b54f072f0ad697242a",
80
80
  "pipeline/commands/figma-to-swiftui.md": "cb198d279d36c6c34648ab9834433d00f81c9d427934cc1641c0e09f1878b0a6",
81
- "pipeline/commands/multi-agent/SKILL.md": "accb6db9000040e519071f8414810063b8193ce9f3c310d1e935246685f58ab6",
81
+ "pipeline/commands/multi-agent/SKILL.md": "20e3d9af469af2e347700d1ff4a600e44a69a18f15f374ba107c011e52a1c31a",
82
82
  "pipeline/commands/multi-agent/analysis-jira/SKILL.md": "c08647b18a56f86690b7db7223e73194b6511f403796252ae8c17cb4265184cd",
83
83
  "pipeline/commands/multi-agent/analysis-resolve/SKILL.md": "48b72f59775ebfaab916afaeb2609e5694c0f7a3ce2bf2689cf25623d9755682",
84
84
  "pipeline/commands/multi-agent/analysis/SKILL.md": "8b92d8832f72e195408d6e8e137956df3a4920074ccc0a4a130f36995aa0f6d9",
@@ -119,8 +119,8 @@
119
119
  "pipeline/commands/multi-agent/review-jira/SKILL.md": "db8ecc7ec8c7040aac9c71dcf40dae194a76f146ab227833b909b45580b5347a",
120
120
  "pipeline/commands/multi-agent/review/SKILL.md": "dcbf4370351ed8b52e4cc9bc1167a1c385ef2cbb2a3a634e94b8c23d0e6e1f8d",
121
121
  "pipeline/commands/multi-agent/route-off/SKILL.md": "aa8b677898b0efde1bd19c50383497da43a83b3b811e36f60695675d845c2de8",
122
- "pipeline/commands/multi-agent/route-on/SKILL.md": "3324430a81609719264a5118d6b4613a6af10e4a04c13a809ee367f1251e58f9",
123
- "pipeline/commands/multi-agent/route-status/SKILL.md": "00b1759c523b672c053bfb5f3c6af67ef0bd9b7ab473576017da22c6a73148ec",
122
+ "pipeline/commands/multi-agent/route-on/SKILL.md": "009668650f618daafe78db728f82ebac5b3af7fe34600283e18480b01ece572c",
123
+ "pipeline/commands/multi-agent/route-status/SKILL.md": "feeb453a21f56699df148ae944a6fa6c75dcb1a57061fef736e5c6a7273daf3c",
124
124
  "pipeline/commands/multi-agent/routines/SKILL.md": "570aa4c2349b0b4960d4a92ad94e1e63590a5e026032c2bb80155a89812a6cd3",
125
125
  "pipeline/commands/multi-agent/save/SKILL.md": "90c18995e4acd04564ee5041f72703426cee43aa940442e77d5e5d645ab1ad82",
126
126
  "pipeline/commands/multi-agent/scaffold/SKILL.md": "046d17dbf91719354fb7ba226996139b3a44a545fb9c956871b67ddfa795620a",
@@ -129,7 +129,7 @@
129
129
  "pipeline/commands/multi-agent/search/SKILL.md": "231f0dd266907423cc45feeadc4170852dc6fd45239e0bee3ee4e08d4d0f5958",
130
130
  "pipeline/commands/multi-agent/security-review/SKILL.md": "dfc2fad484c81169912062391f7ad97500ef113d95741902e5e18e7dd60b6da1",
131
131
  "pipeline/commands/multi-agent/serve/SKILL.md": "e931219d8be258a155a692d23c2b275c2e7e0a761b3f0354c943e26d2ce7b035",
132
- "pipeline/commands/multi-agent/setup/SKILL.md": "b6b4af9eac2ec9454dda08d960ab9ed559421e167f6726915b451e86fbb3f058",
132
+ "pipeline/commands/multi-agent/setup/SKILL.md": "2f55f1ab3d3c2052584e4d189bb3cbaf11f7096da0f55d618b5c7c28df08a71a",
133
133
  "pipeline/commands/multi-agent/stack/SKILL.md": "26ecb48b28b61250330edb26fdfd014e401992e4f1329c572766ba4e2dc6e35d",
134
134
  "pipeline/commands/multi-agent/status/SKILL.md": "b08338841a5282f8ae2494751001aa31cbf4829146a58ed2c395b1c062b48443",
135
135
  "pipeline/commands/multi-agent/steer/SKILL.md": "07e738c228ba328f717f86e97e7af207df090b16433e28e613d430c3ff0aee3e",
@@ -203,11 +203,11 @@
203
203
  "pipeline/lib/jira-publish.sh": "a32e6a682ae730ddd9c6df64b9ece1fb73c797111c63f5c247d7e733668da6b7",
204
204
  "pipeline/lib/json-file-lock.mjs": "6ff8d8d7b890fc549e07287eca1e8261b69f930ec523d08fb73786677aa0a45a",
205
205
  "pipeline/lib/md2confluence-v3.py": "3677ca47931e4b3d0fd2ce3e11299fc5f6d24799eb8332e37dd60b6c3c4653a2",
206
- "pipeline/lib/model-dispatch.sh": "7edd5c92d41ee3bf74972e0827ccbb671853d5410e7fb0af0b7cb020f95e05c5",
206
+ "pipeline/lib/model-dispatch.sh": "6500a5a7cb6a4c099cf1d01678bc9465a3d4eb1001e1f516dcc5eacd69577158",
207
207
  "pipeline/lib/model-rung.sh": "8cecb4d390f306270713bd162e311dee879995e393970405c9a8f9af11da1727",
208
208
  "pipeline/lib/multi-repo-pipeline.sh": "5cca6bcc4fb857448ddadb31add343952be89423a328267e56496c7b7cdc7710",
209
209
  "pipeline/lib/normalize-text.mjs": "c2eeed65ab85cdc27a12ecaadc45dfa00b49a7611250c9ad881b9e93882a51c1",
210
- "pipeline/lib/outbound-gate.mjs": "1ebc840e975f19b0da4699b3a37361ecc8a2be1a7a558d2b2fb39b8b64244011",
210
+ "pipeline/lib/outbound-gate.mjs": "669194caf8f3c2b469e836866bcb5aa979cde870924f5f783be62ee8d11f615d",
211
211
  "pipeline/lib/owned-path-gate.mjs": "28e75cf021ee43bf8c6369f72d27f426c79e8f4a4ab5ef99a009ac6399669319",
212
212
  "pipeline/lib/parse-complaints.sh": "d787ce870f141cf7f881da80fab4320814044554065e82e94632f061675b4d12",
213
213
  "pipeline/lib/phase-schema.mjs": "8fc0c909f129341295cd8ef2ea9e93cecd0ac493c3a8d83e25879f7ff522f1ab",
@@ -223,12 +223,13 @@
223
223
  "pipeline/lib/repo-profile.mjs": "4da219c9f72f3d74cfe42d9ff8685d4f53a8426c347cef85f0c2a737ac275133",
224
224
  "pipeline/lib/require-jq.sh": "a137b4df202515c2b89d5b93c3e28b04c73c8bc2f7c42be9ca9a22926e042918",
225
225
  "pipeline/lib/review-watch.sh": "89a53f79aab902a39ab8301cabe6eb54c8dc854af4d97c024c6b3b1f3ab38a75",
226
- "pipeline/lib/route-state.sh": "8d7555a79be96d824b533382214431436bb95f6d3d21c4f811800f4ab4963f86",
226
+ "pipeline/lib/route-state.sh": "be023c5d77dbbb46834475af3c772094cbfd73b9b2203c3ce7430b353a632c8a",
227
227
  "pipeline/lib/run-paths.sh": "2063a1d2f07d6caa391089c1e581fd870a4e9c3caa3b0c25a03f0b4fe4f6d070",
228
228
  "pipeline/lib/shadow-git.sh": "8a36d3942153c27c34762369f7c2716aadca489851e630d4a2a3f324af1e0b93",
229
229
  "pipeline/lib/stack-detect.sh": "53242b46482547f861625b9cbf44b65790849bce7e42be3bbd56abac67bc3489",
230
230
  "pipeline/lib/submodule-detector.sh": "e2c1a762876c5ae4756818e91f0f0fdd5897cac60decb979651124086e9cab97",
231
- "pipeline/lib/unattended-profile-check.mjs": "80a9005a43ed66d7fded8335e73a22c24483854ea532a6d503480512386d0c6d",
231
+ "pipeline/lib/toolkit-llm.sh": "81b89279f42e2795472d4f1ea5fb89baa8bc9d330d4eedaf56f2c6ea0e5a98f7",
232
+ "pipeline/lib/unattended-profile-check.mjs": "942d5dba815e90a5b6b961b330c6b2f58e012cf9441e593767d7236bdb594d09",
232
233
  "pipeline/lib/unattended-settings-location.mjs": "8db0d143ae79a4c81318994f5201cb805547938208f75dad70357eeb1e2d8745",
233
234
  "pipeline/lib/unattended.mjs": "391231047478c60765a9ce05ed7134bad14f6caf79a91930c24276eb15dcd8bf",
234
235
  "pipeline/lib/unattended.sh": "6160d784bb36b9eaa71fcd097d5b34c093534ced02442bdf16778d66a794dac2",
@@ -246,7 +247,7 @@
246
247
  "pipeline/multi-agent-refs/_repo-picker.md": "c325e86d00fa5e26893eeafcfae8c809f62e34e2ec643b4b364ac4c6f9caca45",
247
248
  "pipeline/multi-agent-refs/analysis-template-corporate.md": "ffccd6ba4b8db4e1492c5b569dbd14f1953dd8da6a3aa5825e7563506b820779",
248
249
  "pipeline/multi-agent-refs/analysis-template.md": "7062312f153aa9219a1ced9f0b60ac3583b4a2034d9d205cf7144ac9bf70ef17",
249
- "pipeline/multi-agent-refs/analysis/evidence.md": "1385d8c794018feec254831b2e325d11ba4fa697a7a987890047e735b34cce26",
250
+ "pipeline/multi-agent-refs/analysis/evidence.md": "cac132b0d11b7ebd754fa154678fe7d127ab0faf08decc5829086b8d3e538e4d",
250
251
  "pipeline/multi-agent-refs/analysis/intake.md": "f5fb9e16620acb63fa41d14165d04f0fa6f5f7e178250a6f2b5b6d921d176f53",
251
252
  "pipeline/multi-agent-refs/analysis/locked.md": "68c010154e57191075778dbaf81200e1085181acacefef160c76023e665bbe09",
252
253
  "pipeline/multi-agent-refs/analysis/redesign.md": "6314fc1e14e05166efbea4819d5b07adb838d0704bde61b4b69cef637f251d58",
@@ -271,7 +272,7 @@
271
272
  "pipeline/multi-agent-refs/component-dispatch.md": "2ab9094aa716397e4840cd48f736c3f4fc3e7c4f9ccc5c7c7c52f9e8b0a28fb5",
272
273
  "pipeline/multi-agent-refs/component-generation.md": "04fdb3fd0f1c129e1df8243184a3225cebd9c4f63511d6015eb356a92eda8891",
273
274
  "pipeline/multi-agent-refs/conventions-defaults.md": "608a05ec6332fc19ee12c0418fbf25165f80e6c06cfee9efed7f27fab185d97d",
274
- "pipeline/multi-agent-refs/cross-cli-contract.md": "d7f6dc9e0d589077150c807ca2def54f78f5aa717d266941f70458e6480069b2",
275
+ "pipeline/multi-agent-refs/cross-cli-contract.md": "431d0a6e4f0021937af3cc8a7f994cc04f86136d37c473f12cf919e886e2852b",
275
276
  "pipeline/multi-agent-refs/design-check/build-launch.md": "0ac64d07ef7389e22f7443f79c70a0a4f8bb87dcff6dbc94c63e034febe194ea",
276
277
  "pipeline/multi-agent-refs/design-check/compare.md": "2a0a89542a8bfefcfeaf1068dd91edb6947392f911f23e8b4857e4ace8fd15d7",
277
278
  "pipeline/multi-agent-refs/design-check/drive-capture.md": "dee4cd6230a401bc9e9dc82fc08109803dd2630c872c5b77a43cf17db062b05f",
@@ -292,12 +293,13 @@
292
293
  "pipeline/multi-agent-refs/features/cost-analysis.md": "42f1b90b41ef454f29ccfd3f93c959920f0e74cbca65e140695e9a30d6d90b87",
293
294
  "pipeline/multi-agent-refs/features/design-conformance.md": "a88ca595827cafa0c87c2facfcf9190dac69485e0596e5c198c6fc1613880452",
294
295
  "pipeline/multi-agent-refs/features/dev-critic.md": "08e01edef04b5ac216f8f43332126966d33da7b95625e47a8a6cd8ac105b263f",
295
- "pipeline/multi-agent-refs/features/doctor.md": "62ff75a085095b11818ffabb97bd76e62e58de6affd24f4eaf3d9f89f2fe1d66",
296
+ "pipeline/multi-agent-refs/features/doctor.md": "f5faeb062470e1e3b5777c1f9eb586b7b11cd923be149c0bdca12001aeae77a7",
296
297
  "pipeline/multi-agent-refs/features/exploratory-testing.md": "ac534fdb9e056b1a3782f9b9e38f0b8823f85e03cb85924513079179e318c45d",
297
298
  "pipeline/multi-agent-refs/features/external-context-injection.md": "be9a0e904efd52535fa18a254567c9d0c3fc2ed12fcbc7a116f7879048303df6",
299
+ "pipeline/multi-agent-refs/features/free-models.md": "64afaba7e7a77575f4ed6a10905a01330a83f573907fb1a5d5356ae6c80999a0",
298
300
  "pipeline/multi-agent-refs/features/jira-context.md": "7d14802ed9ad1747e1a06dec26f22ff9e8959e03c47d7a018af45b8274aea47c",
299
301
  "pipeline/multi-agent-refs/features/maturity-followup.md": "e663e5bcf0b3b4d4d2a67f4516dbb9fb12520dfbdedb47a9c5f57c13a9a0633e",
300
- "pipeline/multi-agent-refs/features/model-fallback.md": "e6b9635124f3557013dfbfa71d414a9d9abe9ddc89f2228a5496086c8e3b0c72",
302
+ "pipeline/multi-agent-refs/features/model-fallback.md": "ba1eff2c9abc2b1fddbcac3c77bcdd6f5c2887ae5da4dfb862427256c107742a",
301
303
  "pipeline/multi-agent-refs/features/package-manager.md": "b9e52f798f5dcba43abff1fe5cad8d5d5374058c9a6847c993975c665acab05a",
302
304
  "pipeline/multi-agent-refs/features/phone-api.md": "817eeaffd3772b0a80811b0cd17dee3498f08f6eccf8fd7e56deb0bc24c1c434",
303
305
  "pipeline/multi-agent-refs/features/plan-critic.md": "d218c8599d893211480a412d46efdbba4aa48e3b18e8bb0ebfd66782f3b8ebc5",
@@ -318,7 +320,7 @@
318
320
  "pipeline/multi-agent-refs/features/stack-adapters.md": "71e23385da872ceed35263f4838f154800aa2da55bb6688ccca74726b70a3ef5",
319
321
  "pipeline/multi-agent-refs/features/stack-skill-routing.md": "1989f7f64be6c5ee0a42d8e9962aead7cd7472d795915ab953d89d9382f317e6",
320
322
  "pipeline/multi-agent-refs/features/unattended-gates.md": "46b516cac81a4eacf5d58bc3b1613e2266c26f1559be8dac060d1dc6b7d7ca01",
321
- "pipeline/multi-agent-refs/features/unattended-security.md": "24235b0479342e4a9f0edb88d387619dd5f222ea82769b99acbc703392769005",
323
+ "pipeline/multi-agent-refs/features/unattended-security.md": "f0f05ed17bbf26a50fa0f88d890f7ac3ccb8f78f169b9f759e997299fdeb5cac",
322
324
  "pipeline/multi-agent-refs/features/url-enrichment.md": "72e01a799d9fa54b56c762ba404a9f9236adbbf98320e395a96f6b0f5917e76b",
323
325
  "pipeline/multi-agent-refs/features/usage-reporting.md": "bd8643e804a70d86679e431368e2fff7a8fbe7b121837340e745b1dd221a428d",
324
326
  "pipeline/multi-agent-refs/features/valven.md": "13b1fb8a3815330f6f970181506ac117e0d1c42761e5a83454edbd0b383ee1a7",
@@ -365,6 +367,7 @@
365
367
  "pipeline/multi-agent-refs/setup/discovery.md": "ebf6365102b336beba9904f0d01a6fadc0e734b2988919860ea9313908116a19",
366
368
  "pipeline/multi-agent-refs/setup/figma.md": "95405e7303c34c9f640fdea7e4aa84388ad57dd31ed5d0d19b0b1cb4f1a3572d",
367
369
  "pipeline/multi-agent-refs/setup/firebase.md": "a82031c67993762303a7ecd222e2574fbbf8d65dcc6b17e051a8dd53a9e31474",
370
+ "pipeline/multi-agent-refs/setup/free-models.md": "57b374a9732a98eea443103ac8de53ec614050c9bfb055aba1f02c32ade34b4a",
368
371
  "pipeline/multi-agent-refs/setup/google-play.md": "c60117fb8b13c709da93d379064aa0d56869bfde88fc5d5737996b7c1fc02ff7",
369
372
  "pipeline/multi-agent-refs/setup/identity-routing.md": "299870880a1d4f27986d09ce912288472d35cc333382301536ea25bc13289c70",
370
373
  "pipeline/multi-agent-refs/setup/repo-discovery.md": "06944e7b7677d998b6d169fbf5bebcac08c0f5eab808f9f1f3e5b6b2dc6a1f55",
@@ -384,7 +387,7 @@
384
387
  "pipeline/multi-agent-refs/web-guide.md": "714cba0d92fa45bf71fbff21bb2f09c88534ebf785b3a2ea96d18037e2e7f7f9",
385
388
  "pipeline/multi-agent-refs/website-deploy.md": "ce819c8b1ef8e8ec3257611379aaf0ab4678e08e0b58bd88c936e98cb8ead609",
386
389
  "pipeline/multi-agent-refs/wiki-capture.md": "bfd33cf097b966e61f80c9235d98c8139e4c9ede2e47c14b920a5b910cdc76d8",
387
- "pipeline/preferences-template.json": "8c74c0fa9f182a6c474aa7d4d2cfe6d67635ec0917c847f19ddae3095e6af944",
390
+ "pipeline/preferences-template.json": "f7e57c9fd4d776168a192d270f7ef68a71d0351df311b15d389dcffa4a98ca47",
388
391
  "pipeline/rules/app-store-guidelines.md": "cdfa4f8a2e0e642460bb72517f9f430638d6f09eb4a37898747cb8d55df03405",
389
392
  "pipeline/rules/code-review.md": "b18eec5cec31710fe76cdae6f03b53e7403d4f0406274691ab38a4771505a1c5",
390
393
  "pipeline/rules/code-style.md": "cd7d8fa872d1d640d143a573a0bdeeb7a9095f62a4d69741a11b4f0cee9d5a48",
@@ -452,7 +455,7 @@
452
455
  "pipeline/schemas/plan-todos.schema.json": "f1dcf8df338b29bbc1d874addd3408c0841a5f869c0b6075efd9242e3e8552d6",
453
456
  "pipeline/schemas/planning-output.schema.json": "bc6eda32ecd435cf84d846078f9d38347f8f741f8a427cff15913dd6c380d4b8",
454
457
  "pipeline/schemas/pr-request.schema.json": "ae75c4856349d62834802b1189af516bb6fb3d36646831b7ff2fa61d938afcd0",
455
- "pipeline/schemas/prefs.schema.json": "d603707539234845e4390cb33e4bfe9a116d7c6485dfcd3207caf786db36ccdc",
458
+ "pipeline/schemas/prefs.schema.json": "6beee7dbb67168528cb3d677cf4215c34c48fd97b5354017ef6f23de8662c482",
456
459
  "pipeline/schemas/repo-profile.schema.json": "1a74ef8330da9a26a5a70955f6f9cbb20eda54a8615efaf86c7993d420a7f04e",
457
460
  "pipeline/schemas/repos.schema.json": "a9bf56f25c66201c170912e3389bd73e4a3f61922410f83e31a6c6ba47aee861",
458
461
  "pipeline/schemas/research-output.schema.json": "54e3ba1b04fdc20fbaa84333b943a8ab95d1395c7b0e0aedc67929184cb49523",
@@ -460,14 +463,14 @@
460
463
  "pipeline/schemas/review-file-exclusions.json": "2e8c44b45d21d2c82fc95aa2bf76ad3fbf2d5c68180c7b2ebf89c4a926688d77",
461
464
  "pipeline/schemas/review-file-exclusions.schema.json": "d7310b4328ae14673f0971c9f823a697d3cafe054062a680ef0f020be1867ea3",
462
465
  "pipeline/schemas/reviewer-output.schema.json": "57512ef7ebeee39575937bfff266651685568ee17b326bbb8e1d9113296b4e46",
463
- "pipeline/schemas/route-config.schema.json": "6f606926c257b7ad3d2972e53d0b772714774140c473b9cb8c7cd9e52731020f",
466
+ "pipeline/schemas/route-config.schema.json": "cb6bd03a38956ad2fa1a7245d633918756f2b3d9be10abf0bdd929cd2328517f",
464
467
  "pipeline/schemas/run-log.schema.json": "3ac10faf0aafb05a8ae89e027b7923aee604cb4bf8daebdbbf4da8c31bc97a1d",
465
468
  "pipeline/schemas/run-questions.json": "7928448ac408b8e90df2e24070c7d433691fe861315adb80ea754c7d21db7688",
466
469
  "pipeline/schemas/run-questions.schema.json": "d4b5b4c3e297164182dac7e86ba05e350f41085a7f024c6c7adefb0be42c4a8e",
467
470
  "pipeline/schemas/runs-index.schema.json": "ad7d598f39a599031f89339a955fc939624fc127a635c70f5cc4667b9395124f",
468
471
  "pipeline/schemas/scaffold-manifest.schema.json": "4ee8dfacf646a96c62438234bedab9d286d80d1a6d3d4984361d91a7411ce171",
469
472
  "pipeline/schemas/scope-check.schema.json": "f96973c59372b36b7d68b9ac4b03490e7da8d54acf29a35947f5f610e82b98ea",
470
- "pipeline/schemas/secret-patterns.json": "d9a7bec7b2ba704b73f2302c3498874c6298cde69bde0f181932c282d3fe0b0e",
473
+ "pipeline/schemas/secret-patterns.json": "4ae313b7f2529252b71be8b1cbee9bfd954cad6a9d0f30248a2593d1212a4c08",
471
474
  "pipeline/schemas/secret-patterns.schema.json": "faf32274ca4999217bb725d7b16f455143f1775fa72768a02ba87783fbec3d27",
472
475
  "pipeline/schemas/security-finding.schema.json": "623d965edf2de8ab0f2a49c33fa5be507d479d5bc3067ccd72cdf90a480b498a",
473
476
  "pipeline/schemas/skill-observation.schema.json": "05f16c6e5055ef99a102b12b578ba841251267d41dd7343f8ab66cd8070180ff",
@@ -527,7 +530,7 @@
527
530
  "pipeline/scripts/build-references.mjs": "724fe25d9d1bd9d2a0f53abd7c0e13e9bced22126cb5562d0d285f63ff5eeecb",
528
531
  "pipeline/scripts/build-skills-index.mjs": "35b7ae8299db6a554064096ea34b476cb231b5f15bbf0dd86dd3b128399e9390",
529
532
  "pipeline/scripts/build-stack-plugins.mjs": "bd7b7f9a3983d4daaf5e4468abc79c0f195877a02a390dcccfb529d79e8c39c7",
530
- "pipeline/scripts/bulk-read.sh": "f5f55e229b00b849a84e6b6015e3bba1f0cb59dba5fb011857d1ceaafe7ad614",
533
+ "pipeline/scripts/bulk-read.sh": "eb13ef378768e98a7624dc14c83e0cdc83ac01476567bcca16e390368f5706d0",
531
534
  "pipeline/scripts/capture-evidence.sh": "2f7657786e07c17c302b76d4ea6bafe391b65be3dd891901b78019af3a7e38e1",
532
535
  "pipeline/scripts/capture-flush.sh": "291da92a3a708bf2e8e0884d1d6e0a676da83650ee723f7a499a6549e6cd2adc",
533
536
  "pipeline/scripts/capture-resume.sh": "4934ff7961e2b8eabcd154ca06dd53c1d4aab03986a39dff287b8c16f5cea7ee",
@@ -547,12 +550,12 @@
547
550
  "pipeline/scripts/cost-analyze.mjs": "ba6f402bd7b08359b8eb502b6502d3c86a70dcf50b4a8f5829bd771cade5cd43",
548
551
  "pipeline/scripts/cost-budget-check.mjs": "0edc96feccc3fe07f36eefe3b52b611e43ef94178fd257f0f4537a024e2754cd",
549
552
  "pipeline/scripts/cost-lib.sh": "64eeb1d4515b802cc9136ef520f93b7a81aa9cc1c1065e81fe522fccf7fd2cb5",
550
- "pipeline/scripts/cost-table.json": "cc9f762cf9d1e7ddf1f233c9346bacf2e3b72475b6567d7ef4217a69efdd24f9",
553
+ "pipeline/scripts/cost-table.json": "934fcf2682f5998587f6d5337219be1c836aa68bd51fc5fda95e4306465ddfe8",
551
554
  "pipeline/scripts/council-view.mjs": "f904aa3a71fe31f7b02a00c603186e251f66a652950d285e934b591571db56cc",
552
555
  "pipeline/scripts/crush-json.mjs": "303382670f8f170c8c6710202853a2de2915625813cd157185f9be4e2b27258e",
553
556
  "pipeline/scripts/diff-explain.mjs": "194d0635639607cb1af3de064453162e01c0d59dc0c2e187d21d45bae3bc559c",
554
557
  "pipeline/scripts/diff-risk-score.mjs": "b3e8da42fea1258162e40f4eb7809074831339b7563874527f7e825f7aa795ca",
555
- "pipeline/scripts/doctor.mjs": "a86a39b3eab13158166f44133c1fdc1fda3d4cc7ad0122f3dc47e3cfae2f5ad1",
558
+ "pipeline/scripts/doctor.mjs": "4905cedb5a71e9890f6b9994d6097d840fccc4afcff2b4fbdc69aefb8017a2cb",
556
559
  "pipeline/scripts/estimate.mjs": "9847e412dd74ac19a5c3b84bed343f79d25f256022b2df98e3eb1296db45ed3a",
557
560
  "pipeline/scripts/evidence-gate.mjs": "347a8d3fa1d17d996de345585c216bd7071f4c1d687999daf6e48881720ea5df",
558
561
  "pipeline/scripts/explore-findings.mjs": "997cca3ef42a170ff51ee2c382263eff8653affd6bb675877b94b8bba782e717",
@@ -610,7 +613,7 @@
610
613
  "pipeline/scripts/plugin-refresh.sh": "687a33199ad963616ab537e32210ec8c967e76ecc42f494ee8a1dc9fe947fc30",
611
614
  "pipeline/scripts/pr-request.mjs": "e6f4ded2366c6599bb345b3011ecc771e13b8a1561afa4c9a50bca4edff17456",
612
615
  "pipeline/scripts/pr-timeline.mjs": "6a12df12a72f3440796569d3264edb0b3e105be6e4f2e26e958a5a0da340d05c",
613
- "pipeline/scripts/pre-commit-check.sh": "08f72728c6ca5266aac1c91f12af1dccf898ae315549511611657e7b034efc96",
616
+ "pipeline/scripts/pre-commit-check.sh": "46081c47891c46e4aa96d7df58222d06d95087bce98bb2f543fb15a63322a52a",
614
617
  "pipeline/scripts/pre-push-check.sh": "4a1554a625df4745a829c0df294db7ce450fbe44fe624e562008e9912be78925",
615
618
  "pipeline/scripts/probe-evidence-capability.sh": "ac74252eed6b773fdbc7ec475a63606925f1ba7b5e7c6f911329f46fd920eae7",
616
619
  "pipeline/scripts/probe-store-key.mjs": "b46dfcf444c95d0bb61de36823314945dacaaacb8f35841d153dcfcde8e4df1a",
@@ -662,7 +665,7 @@
662
665
  "pipeline/scripts/token-budget-report.mjs": "508bbc659df478c535c0ecdd3f8611372af8fef0b0932c7b19a247af2b2b9265",
663
666
  "pipeline/scripts/triage-memory.mjs": "2d8541145f1749593ae5728fb4c9eb3001484edb5e4d37be473aeec34d1dbe7c",
664
667
  "pipeline/scripts/ui-tree-dumper.swift": "a09e42ef069eafa08c05afd8333e05b754ef6a7d8b9687712039b0f2c9801273",
665
- "pipeline/scripts/unattended_policy.py": "e2ac82b4a969fdd230e3c3f390cb31cde1e2178c4caa57574ad63a3d786f8379",
668
+ "pipeline/scripts/unattended_policy.py": "851f3982bf8a5d12415caf724146184c50801f9ee2e3654ba2ded593351f71af",
666
669
  "pipeline/scripts/uninstall.mjs": "ba11803733cf3bfcc966f0d4aa2cc5fbed000cb37a251005f067ce0289306233",
667
670
  "pipeline/scripts/update-check.sh": "9c00647e7ca4249414b2e5af08f61705ab5bd2106b6f66ae8ebce8aa143dc957",
668
671
  "pipeline/scripts/update-issue-progress.sh": "ccfef87743e91272e009e396ac07461d2784b2fa84a06c802a582526eeeb9ed9",
@@ -691,7 +694,7 @@
691
694
  "pipeline/scripts/worktrees.mjs": "90dfd09b70fffe9b56c331a4ae2692cc248f4898f4ee6aee4239ef0b20888a90",
692
695
  "pipeline/scripts/write-state.mjs": "e1198bf970eace07d3eff22b394808a526e473df65d3d58aa2d5a12cfdac8b49",
693
696
  "pipeline/scripts/write-store-config.mjs": "b994a061f6febb2ca3d396074d8b51d2c1c1f991d3072d321703380da3639a56",
694
- "pipeline/skills/.skill-manifest.json": "93cf5b7a3d7011a6be1e1c7601892039775051ff34ad80dc172ea4c44c82fc20",
697
+ "pipeline/skills/.skill-manifest.json": "7bc20de35075819d6c43d5bf84376ccfe2b0db1dd06a9efe1d307780ebef01ba",
695
698
  "pipeline/skills/.skills-index.json": "b2917fa44e273b939549f1c3ab3dd81c26ba8168772bc7644c9fa076116d8a4c",
696
699
  "pipeline/skills/shared/README.md": "928fe4292be729c3b7d7d0898cade8be0dfa868f208e0c6d1fe7b2c6bd6223c5",
697
700
  "pipeline/skills/shared/core/apple-archive-compliance/SKILL.md": "7239fef717ea45b79276bfcc2c3903acd57950b6e00dd6a2a66399c4b09cbd51",
@@ -738,8 +741,8 @@
738
741
  "pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md": "a17a1f11fcf6c75640452e53ddddaaf906ff9e3ebfeda73e333f44db02515352",
739
742
  "pipeline/skills/shared/core/multi-agent-review/SKILL.md": "2b6934d6086a467bdf145b326061ab4b83d5479bfb1a2fb36420ff8012a02e5d",
740
743
  "pipeline/skills/shared/core/multi-agent-route-off/SKILL.md": "a30c0b9b73d5101c70c147599273019cf357969c37bc799017a9f6de4b8686a8",
741
- "pipeline/skills/shared/core/multi-agent-route-on/SKILL.md": "a807767460b09455087d48a7dd45036be788f67997475360acab29f2422f425b",
742
- "pipeline/skills/shared/core/multi-agent-route-status/SKILL.md": "b473b670b3f8535b295752eb5aed8b01cba8d1ed6763ae4d80d9cc2dbb1f7794",
744
+ "pipeline/skills/shared/core/multi-agent-route-on/SKILL.md": "97c76d711454e6bc9edfd47344bbeab7f73cf72c116cca92cffacdcda7fe96b1",
745
+ "pipeline/skills/shared/core/multi-agent-route-status/SKILL.md": "869689dbf84edece67168a892a61b51459ff6c15cbf7dafe40c2b774f875b9f0",
743
746
  "pipeline/skills/shared/core/multi-agent-routines/SKILL.md": "564f06a2754e8ad2ddab9996133680c1a91bf7ecba5bd860ee5afcdde12ca0a5",
744
747
  "pipeline/skills/shared/core/multi-agent-save/SKILL.md": "6da2cb991c3a15e538f2d618383a23389183756be402a995d58f813667a2f986",
745
748
  "pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md": "892415937ed2094d470f297f742e35e2684ad58ef262028873d8535210065dc0",
@@ -748,7 +751,7 @@
748
751
  "pipeline/skills/shared/core/multi-agent-search/SKILL.md": "5f5177cd28cbb13583441fb98402cfa251c78e69de693540584e9a1dcc7692cb",
749
752
  "pipeline/skills/shared/core/multi-agent-security-review/SKILL.md": "3c483d5942f2c2b81c0537d4db0b36804c13cabd66fd7fae2972d07a8f239f69",
750
753
  "pipeline/skills/shared/core/multi-agent-serve/SKILL.md": "90e4dd7225e10e670118ed05d0c8a9e346112c4bbbdb24a7fe7c5c334a83e848",
751
- "pipeline/skills/shared/core/multi-agent-setup/SKILL.md": "427df811e5130da1ab6e23ff78202eb9134fb76bcd601924fba5668cbd630158",
754
+ "pipeline/skills/shared/core/multi-agent-setup/SKILL.md": "e3523960d5d178125302e5ceeb865902d7b12ea5d615670cddeb4d542fa48035",
752
755
  "pipeline/skills/shared/core/multi-agent-stack/SKILL.md": "ac964cd00dd6ed06512530489d867efbc51d7d7614265f9aa022679325d5defe",
753
756
  "pipeline/skills/shared/core/multi-agent-status/SKILL.md": "444c3773b52e6786e40bc67c8833ea6aecadbcd4459b01127b4aff152157040a",
754
757
  "pipeline/skills/shared/core/multi-agent-steer/SKILL.md": "20f332bd2fe2745da5341f8d8187211fc47c06b4b5f5031e217affee0282ddb5",
@@ -762,7 +765,7 @@
762
765
  "pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md": "6bfd1569117bfbacb485d831c0b7f262ebb3a2f9471f6177a646f5ce32c06a25",
763
766
  "pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md": "9dccf78ffc2fb014d83f67d683d395f56f4fad8b5a36b9aa84e6cbd075b58818",
764
767
  "pipeline/skills/shared/core/multi-agent-update/SKILL.md": "013317432263490a01d081b657928b977012afb78f75a64d278d94d2daa8e894",
765
- "pipeline/skills/shared/core/multi-agent/SKILL.md": "3dd44ccc00e41c09e59ad223900a391f80158bd3f69e45d67c684285bc42418d",
768
+ "pipeline/skills/shared/core/multi-agent/SKILL.md": "a39f712426638e7955db9171c950be720f11c861621884e628c81a0b6a49de5d",
766
769
  "pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md": "400842e4653f038fad22509fe3f3d152151120758f5f9b170e6dba59afaf4a48",
767
770
  "pipeline/skills/shared/external/NOTICE-dimillian-skills.md": "f9c3d783fd3563418c18291b90899251e890fd3fa8ee353c8c1fbbe61078526e",
768
771
  "pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md": "bca5fe8779df70fb0f234483d65ff3562c67521e719b69b22aac260803b75244",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mmerterden/multi-agent-pipeline",
3
- "version": "20.20.0",
3
+ "version": "20.21.0",
4
4
  "description": "6-phase AI development pipeline with full orchestration on Claude Code, Copilot CLI and Codex CLI. Analysis, planning, TDD, CLI-aware parallel review with consensus surfacing + Fable triage, default-FAIL evidence gates, secret + intent guards, per-phase cost ledger, persistent learnings memory, wiki generation, commit automation. Token-preserving uninstall.",
5
5
  "type": "module",
6
6
  "main": "index.js",
@@ -157,7 +157,7 @@ This command uses lazy loading for token efficiency. Read the relevant sub-file
157
157
  - `$HOME/.claude/agents/backend-architect.md` - Backend/API architecture review (`preferredModel: fable`)
158
158
  - `$HOME/.claude/agents/security-auditor.md` - Security audit (`preferredModel: opus`)
159
159
 
160
- **Per-persona model routing:** Before each Agent dispatch, the orchestrator reads `preferredModel` from the persona file and exports `CLAUDE_CODE_SUBAGENT_MODEL` (Claude Code) / passes `--model` (Copilot CLI). Precedence: per-dispatch `PHASE_MODEL_OVERRIDE` > a matching `prefs.global.modelRouting` rule (v19.0.0+, consulted only when the phase named no model, and only inside the Anthropic ladder because subagent dispatch belongs to the host) > persona `preferredModel` > `fable` (falls back per `$HOME/.claude/multi-agent-refs/features/model-fallback.md`). Full contract: `skills/shared/core/multi-agent/SKILL.md#agent-dispatch--per-persona-model-routing-v610`.
160
+ **Per-persona model routing:** Before each Agent dispatch, the orchestrator reads `preferredModel` from the persona file and exports `CLAUDE_CODE_SUBAGENT_MODEL` (Claude Code) / passes `--model` (Copilot CLI). Precedence: per-dispatch `PHASE_MODEL_OVERRIDE` > a matching `prefs.global.modelRouting` rule (v19.0.0+, consulted only when the phase named no model, and only inside the Anthropic ladder because subagent dispatch belongs to the host) > persona `preferredModel` > `fable` (falls back per `$HOME/.claude/multi-agent-refs/features/model-fallback.md`). Full contract: `skills/shared/core/multi-agent/SKILL.md#agent-dispatch--per-persona-model-routing-v610`. Simple text tasks (summaries, extraction, labels, drafts) ask `model-dispatch.sh delegate --default host` first and use `llm_delegate` on `free`: `$HOME/.claude/multi-agent-refs/features/free-models.md`.
161
161
 
162
162
  ---
163
163
 
@@ -1,8 +1,8 @@
1
1
  ---
2
2
  description: "Enable policy-driven model routing: pick a strategy, a scope, and the rules that say which rung a call lands on. Use when asked to turn model routing on."
3
3
  description-tr: "Politika güdümlü model yönlendirmesini açar: strateji, kapsam ve hangi çağrının hangi basamağa düşeceğini söyleyen kuralları sorar."
4
- argument-hint: "[--strategy=manual|task-fit|cost-ceiling] [--scope=subagent,bulk-read,research]"
5
- parameters: [{"name":"--strategy","kind":"enum","enum":["manual","task-fit","cost-ceiling"]},{"name":"--scope","kind":"enum","repeat":true,"enum":["subagent","bulk-read","research"]}]
4
+ argument-hint: "[--free [--allow-training] | --no-free] [--strategy=manual|task-fit|cost-ceiling] [--scope=subagent,bulk-read,delegate,research]"
5
+ parameters: [{"name":"--free","kind":"flag"},{"name":"--allow-training","kind":"flag"},{"name":"--no-free","kind":"flag"},{"name":"--strategy","kind":"enum","enum":["manual","task-fit","cost-ceiling"]},{"name":"--scope","kind":"enum","repeat":true,"enum":["subagent","bulk-read","delegate","research"]}]
6
6
  gui: form
7
7
  destructive: false
8
8
  confirm: none
@@ -25,7 +25,8 @@ Routing ships **off**. This is the command that turns it on, and it writes to
25
25
  ```
26
26
 
27
27
  Ordered, first match wins. `when` matches on `persona`, `phase` (0..5) or
28
- `taskKind`; `prefer` lists rungs in descending preference.
28
+ `taskKind`; `prefer` lists rungs in descending preference. `free` is a rung too,
29
+ honoured only at `bulk-read` and `delegate` and only while `--free` is on.
29
30
 
30
31
  **Rung names are the contract; model ids are not.** `opus` is a rung here and a
31
32
  model id in `cost-table.json`, and the second can change without anyone editing
@@ -38,18 +39,41 @@ Set rules with:
38
39
  bash "$HOME/.claude/lib/route-state.sh" set-rules path/to/rules.json
39
40
  ```
40
41
 
42
+ ## Free models: `--free`
43
+
44
+ ```bash
45
+ bash "$HOME/.claude/lib/route-state.sh" on --free
46
+ ```
47
+
48
+ Layer 2. Simple text work the pipeline does itself - a large-file read, a log or
49
+ document summary, field extraction, a label, a translation or commit-body draft -
50
+ goes to the multi-agent-toolkit's verified free-model chain first. Every answer
51
+ is checked against its source before it is used; when none passes, Claude does
52
+ the task as before. Decisions, plans, code, reviews and triage never leave Claude.
53
+
54
+ `--free` turns on `modelRouting.free`, adds `bulk-read` and `delegate` to the
55
+ scope, and lists which providers are usable. With none, it says exactly which key
56
+ to add: one free Groq key is enough. `--allow-training` also admits free tiers
57
+ that may train on prompts; leave it off for corporate code and tickets.
58
+ `--no-free` turns only the free chain off. Full contract, the task list for
59
+ development and analysis, and unattended behaviour:
60
+ `$HOME/.claude/multi-agent-refs/features/free-models.md`.
61
+
41
62
  ## Strategies
42
63
 
43
64
  | Strategy | What it does |
44
65
  |---|---|
45
66
  | `manual` | only the explicit rules apply, nothing is inferred. The default, because a router that guesses is a router nobody can predict |
46
- | `task-fit` | a rule may match on `taskKind`, and the cheapest rung clearing it is chosen |
47
- | `cost-ceiling` | rungs downgrade as the run approaches `budgetCeilingUsd` |
67
+ | `task-fit` | the matched rule's rungs are tried cheapest first (cost-table prices, `free` first) |
68
+ | `cost-ceiling` | the rule's order holds until the run reaches the warn threshold of `budgetCeilingUsd`, then the cheapest rung is tried first |
69
+
70
+ `set-rules` checks every rule against the schema and the cost table and writes
71
+ nothing if one fails: an unknown rung, a phase outside 0-5, an unknown key.
48
72
 
49
73
  ## Scope, and the value that is not in it
50
74
 
51
75
  `scope` names the call sites routing may act on: `subagent`, `bulk-read`,
52
- `research`. Every one of them is a call **this pipeline makes itself**.
76
+ `delegate`, `research`. Every one of them is a call **this pipeline makes itself**.
53
77
 
54
78
  There is no `host-session` value, and that absence is enforced by that schema
55
79
  rather than written as advice. Routing a host session means rewriting the CLI's
@@ -62,8 +86,8 @@ Passing `--scope=host-session` is refused with that reason, not ignored.
62
86
 
63
87
  On Claude Code a subagent cannot be dispatched to a non-Anthropic model: subagent
64
88
  dispatch belongs to the host, not to us. So Phase 1, 2 and 3 personas stay inside
65
- the Anthropic ladder no matter what the rules say, and external providers apply
66
- only at `bulk-read` and `research`, where the pipeline makes the HTTP call.
89
+ the Anthropic ladder no matter what the rules say, and the `free` rung applies
90
+ only at `bulk-read` and `delegate`, where the pipeline makes the call itself.
67
91
 
68
92
  This is printed by `route-status` on every invocation instead of living in a doc,
69
93
  because the question it answers - "routing is on, why is the reviewer still on
@@ -28,13 +28,23 @@ A disabled router with rules is deliberately not reported as "off" alone: that
28
28
  reads as "unconfigured" and sends the user through `route-on`'s questions a
29
29
  second time.
30
30
 
31
+ ## Free models and what they saved
32
+
33
+ With `route-on --free`, status also prints `free: true` with its data policy,
34
+ where the free chain answers first (`bulk-read`, `delegate`), and the last seven
35
+ days from the toolkit's usage log: tasks answered free and verified, answers
36
+ served from cache, tasks handed back to Claude, and the input and output tokens
37
+ kept off Claude with an estimated saving at haiku rates. The estimate is labelled
38
+ as one: it prices the tokens at the rung the task would otherwise have used.
39
+
31
40
  ## The limit, printed every time
32
41
 
33
42
  On Claude Code a subagent cannot be sent to a non-Anthropic model. Subagent
34
43
  dispatch belongs to the host; the pipeline asks for a persona and the host
35
44
  decides what answers. So Phase 1, 2 and 3 personas stay inside the Anthropic
36
- ladder whatever the rules say, and an external provider is only reachable where
37
- the pipeline makes the HTTP call itself - `bulk-read.sh` and `research_ask`.
45
+ ladder whatever the rules say, and a free model answers only where the pipeline
46
+ makes the call itself - `bulk-read.sh` and the `delegate` call site - and only
47
+ after the toolkit verified its answer against the source.
38
48
 
39
49
  This paragraph is output, not documentation, because the alternative is the
40
50
  question arriving later as "routing is on but the reviewer is still on Opus, is
@@ -209,6 +209,7 @@ The Step 2 discovery summary is never the end of setup. Immediately after showin
209
209
  10. `jenkins`
210
210
  11. App Store Connect block (Step 3b; only when the target repo is iOS)
211
211
  12. Google Play block (Step 3d; only when the target repo is Android)
212
+ 13. Free-model keys `llm-<id>` (only after `route-on --free`): `$HOME/.claude/multi-agent-refs/setup/free-models.md`
212
213
 
213
214
  Loop rules:
214
215
 
@@ -377,7 +378,7 @@ Standard key names are a convention for NEW tokens; discovery may find existing
377
378
 
378
379
  ### Inline Token Save Pattern
379
380
 
380
- All tokens go through `~/.claude/lib/credential-store.sh`, which auto-delegates to the deterministic Python helper (`~/.claude/scripts/keychain.py`). The Python path writes both `-l` (label) and `-s` (service) attributes so existing manually-added entries with either convention remain findable.
381
+ All tokens go through `~/.claude/lib/credential-store.sh` (Python helper and label/service attributes: see "Setup" above).
381
382
 
382
383
  ```bash
383
384
  # PAT / API Key / JSON contents (from clipboard)
@@ -9,11 +9,11 @@
9
9
  # model-dispatch.sh <call-site> [--persona P] [--phase N] [--task-kind K]
10
10
  # [--default RUNG] [--task-id ID]
11
11
  #
12
- # <call-site> is one of the `scope` members: subagent | bulk-read | research.
13
- # stdout is a single rung NAME. Rung names are the contract; the model id behind
14
- # one lives in cost-table.json and moves without a config edit.
12
+ # <call-site> is one of the `scope` members: subagent | bulk-read | delegate |
13
+ # research. stdout is a single rung NAME. Rung names are the contract; the model
14
+ # id behind one lives in cost-table.json and moves without a config edit.
15
15
  #
16
- # Exit is always 0 and stdout is always a usable rung. A router that can fail
16
+ # Exit is always 0 and stdout is always a usable answer. A router that can fail
17
17
  # turns every call site into a place the run can die, for a feature that ships
18
18
  # disabled; when anything is missing, unparseable or out of scope, the caller's
19
19
  # default comes back unchanged.
@@ -22,16 +22,18 @@
22
22
  #
23
23
  # Layer 1 an Anthropic rung. Reachable from every call site, because it
24
24
  # writes to a seam that already exists and opens no new network path.
25
- # Layer 2 a non-Anthropic rung. NO call site can dispatch to one today, and
26
- # the router refuses it rather than returning a rung its caller will
27
- # hand to a CLI that does not know the name:
28
- # - a subagent is dispatched by the HOST;
29
- # - bulk-read shells out to `claude -p --model <rung>`;
30
- # - research_ask runs in the MCP server and picks its own model.
31
- # `provider` in cost-table.json is what makes this checkable, and it
32
- # is the seam a future call site would use. Until one exists, the
33
- # refusal is the honest answer: an allowed rung nothing can honour is
34
- # a rule the user believes worked.
25
+ # Layer 2 the `free` rung: the multi-agent-toolkit's verified free-model
26
+ # chain. Reachable only where the pipeline makes the call itself -
27
+ # bulk-read and delegate - and only with modelRouting.free.enabled.
28
+ # Its caller must keep its default as the fallback, because the chain
29
+ # answers ESCALATE_TO_CLAUDE whenever no free answer survives
30
+ # verification. A subagent is dispatched by the HOST, so `free` and
31
+ # every other non-Anthropic rung is refused there and the rule's next
32
+ # rung answers instead.
33
+ #
34
+ # Strategies: manual keeps the rule's order; task-fit tries the cheapest rung
35
+ # first; cost-ceiling keeps the order until cost-budget-check.mjs reports the run
36
+ # at its warn threshold of budgetCeilingUsd, then tries the cheapest first.
35
37
 
36
38
  set -uo pipefail
37
39
 
@@ -74,7 +76,7 @@ fi
74
76
  [ "$DEFAULT_RUNG" = "fable" ] && [ "$FABLE_ON" != "true" ] && DEFAULT_RUNG="opus"
75
77
 
76
78
  case "$CALL_SITE" in
77
- subagent|bulk-read|research) ;;
79
+ subagent|bulk-read|delegate|research) ;;
78
80
  *) emit "$DEFAULT_RUNG" ;;
79
81
  esac
80
82
 
@@ -103,11 +105,45 @@ MATCH=$(jq -r \
103
105
  and ((.when.taskKind // null) as $k | $k == null or $k == $kind)
104
106
  )
105
107
  ] | first | (.prefer // []) | join(" ")' "$PREFS" 2>/dev/null) || emit "$DEFAULT_RUNG"
106
- [ -n "$MATCH" ] && [ "$MATCH" != "null" ] || emit "$DEFAULT_RUNG"
108
+ [ "$MATCH" = "null" ] && MATCH=""
109
+
110
+ FREE_ON=$(jq -r '.global.modelRouting.free.enabled // false' "$PREFS" 2>/dev/null)
111
+ CANDIDATES="$MATCH"
112
+ case "$CALL_SITE" in
113
+ bulk-read|delegate) [ "$FREE_ON" = "true" ] && CANDIDATES="free $MATCH" ;;
114
+ esac
115
+ [ -n "${CANDIDATES// /}" ] || emit "$DEFAULT_RUNG"
107
116
 
108
117
  HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
109
118
  COST_TABLE="$HERE/../scripts/cost-table.json"
110
119
 
120
+ STRATEGY=$(jq -r '.global.modelRouting.strategy // "manual"' "$PREFS" 2>/dev/null)
121
+ CHEAPEST_FIRST=false
122
+ STRATEGY_NOTE=""
123
+ case "$STRATEGY" in
124
+ task-fit) CHEAPEST_FIRST=true; STRATEGY_NOTE="task-fit" ;;
125
+ cost-ceiling)
126
+ CEILING=$(jq -r '.global.modelRouting.budgetCeilingUsd // empty' "$PREFS" 2>/dev/null)
127
+ if [ -n "$CEILING" ] && [ "$TASK_ID" != "unknown" ] && command -v node >/dev/null 2>&1 \
128
+ && [ -f "$HERE/../scripts/cost-budget-check.mjs" ]; then
129
+ node "$HERE/../scripts/cost-budget-check.mjs" --task-id "$TASK_ID" --max-usd "$CEILING" --enabled >/dev/null 2>&1
130
+ case $? in
131
+ 10|11) CHEAPEST_FIRST=true; STRATEGY_NOTE="cost-ceiling reached" ;;
132
+ esac
133
+ fi
134
+ ;;
135
+ esac
136
+
137
+ if [ "$CHEAPEST_FIRST" = "true" ] && [ -f "$COST_TABLE" ]; then
138
+ CANDIDATES=$(
139
+ jq -r --arg c "$CANDIDATES" '
140
+ .prices as $p
141
+ | ($c | split(" ") | map(select(length > 0)))
142
+ | to_entries
143
+ | sort_by([($p[.value].inPerMtok // 1e9), .key])
144
+ | map(.value) | join(" ")' "$COST_TABLE" 2>/dev/null || printf '%s' "$CANDIDATES")
145
+ fi
146
+
111
147
  # The fable rung answers only when the fable switch is on (FABLE_ON, read
112
148
  # above). Routing is a policy over what is available; it is not a second way to
113
149
  # turn a rung on, or `/multi-agent:model off` would stop meaning anything the
@@ -116,13 +152,13 @@ COST_TABLE="$HERE/../scripts/cost-table.json"
116
152
  record() {
117
153
  [ -x "$HERE/../scripts/log-metric.sh" ] || return 0
118
154
  local rec
119
- rec=$(jq -r '.global.modelRouting.recordDecisions // true' "$PREFS" 2>/dev/null)
155
+ rec=$(jq -r 'if .global.modelRouting.recordDecisions == false then "false" else "true" end' "$PREFS" 2>/dev/null)
120
156
  [ "$rec" = "false" ] && return 0
121
157
  "$HERE/../scripts/log-metric.sh" "$TASK_ID" "${PHASE:-0}" model_routing.decision \
122
158
  call_site="$CALL_SITE" rung="$1" reason="$2" >/dev/null 2>&1 || true
123
159
  }
124
160
 
125
- for rung in $MATCH; do
161
+ for rung in $CANDIDATES; do
126
162
  if [ ! -f "$COST_TABLE" ]; then
127
163
  record "$rung" "no cost table; rung taken on trust"
128
164
  emit "$rung"
@@ -139,15 +175,27 @@ for rung in $MATCH; do
139
175
  echo "model-dispatch: rule prefers 'fable' but modelFallback.fableEnabled is false; skipping it" >&2
140
176
  continue
141
177
  fi
178
+ if [ "$PROVIDER" = "free-chain" ]; then
179
+ if [ "$FREE_ON" != "true" ]; then
180
+ echo "model-dispatch: rule prefers 'free' but modelRouting.free.enabled is false (route-on --free); skipping it" >&2
181
+ continue
182
+ fi
183
+ case "$CALL_SITE" in
184
+ bulk-read|delegate)
185
+ record "$rung" "free chain${STRATEGY_NOTE:+, $STRATEGY_NOTE}"
186
+ emit "$rung" ;;
187
+ esac
188
+ echo "model-dispatch: rung 'free' is reachable only at bulk-read and delegate; a $CALL_SITE is dispatched by the host, skipping it" >&2
189
+ continue
190
+ fi
142
191
  if [ "$PROVIDER" != "anthropic" ]; then
143
- # The honest limit, said out loud at the moment it bites. Every call site
144
- # that asks here hands the rung to something that only speaks the Anthropic
145
- # ladder, so returning an external rung would produce a failed call rather
146
- # than a cheaper one.
147
- echo "model-dispatch: rung '$rung' is $PROVIDER and no call site can dispatch to one yet; skipping it" >&2
192
+ # Every call site that asks here hands any other rung to something that
193
+ # speaks the Anthropic ladder or the free chain, so returning an external
194
+ # rung would produce a failed call rather than a cheaper one.
195
+ echo "model-dispatch: rung '$rung' is $PROVIDER and no call site dispatches to it; skipping it" >&2
148
196
  continue
149
197
  fi
150
- record "$rung" "rule matched"
198
+ record "$rung" "rule matched${STRATEGY_NOTE:+, $STRATEGY_NOTE}"
151
199
  emit "$rung"
152
200
  done
153
201
 
@@ -82,6 +82,8 @@ export const RULES = [
82
82
  { name: "stripe-key", certain: true, re: /\b[sr]k_live_[A-Za-z0-9]{20,}\b/g },
83
83
  { name: "perplexity-key", certain: true, re: /\bpplx-[A-Za-z0-9]{32,}\b/g },
84
84
  { name: "huggingface-token", certain: true, re: /\bhf_[A-Za-z0-9]{30,}\b/g },
85
+ { name: "groq-key", certain: true, re: /\bgsk_[A-Za-z0-9]{40,}\b/g },
86
+ { name: "openrouter-key", certain: true, re: /\bsk-or-v1-[A-Za-z0-9]{40,}\b/g },
85
87
  {
86
88
  name: "service-account-json",
87
89
  certain: true,