johns-harness 2026.9.29 → 2026.9.31

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 (45) hide show
  1. package/CHANGELOG.md +11 -1
  2. package/dist/auth-profiles-5CHn7vq1.js +5 -0
  3. package/dist/channels/plugins/actions/telegram.js +1 -0
  4. package/dist/config-koj5M_EO.js +5 -0
  5. package/dist/daemon-cli.js +5 -0
  6. package/dist/model-selection-BGlGpPgM.js +6 -1
  7. package/dist/model-selection-BU6wl1le.js +6 -1
  8. package/dist/model-selection-L7RMwsG-.js +6 -1
  9. package/dist/models-config-CAmcg63r.js +1 -1
  10. package/dist/models-config-DXA5BkaM.js +1 -1
  11. package/dist/plugin-sdk/config-4Fgm-yEH.js +5 -0
  12. package/dist/plugin-sdk/config-Di-lyCdh.js +5 -0
  13. package/dist/plugin-sdk/discord.js +5 -0
  14. package/dist/plugin-sdk/mattermost.js +1 -0
  15. package/dist/plugin-sdk/model-auth-CX9cPHdC.js +5 -0
  16. package/dist/plugin-sdk/model-auth-Ciehz0x5.js +5 -0
  17. package/dist/plugin-sdk/model-auth-DVyo6JSX.js +5 -0
  18. package/dist/plugin-sdk/model-auth-kiHYHGrs.js +5 -0
  19. package/dist/plugin-sdk/model-selection-Dbj4jDYM.js +5 -0
  20. package/dist/plugin-sdk/thinking-B-rIrY_n.js +1 -0
  21. package/dist/plugin-sdk/thinking-CopbP_Cn.js +1 -0
  22. package/dist/plugin-sdk/thinking-WQ4Zq8Nl.js +1 -0
  23. package/dist/plugin-sdk/thinking-WXqkGljb.js +1 -0
  24. package/dist/plugin-sdk/thinking-_uXqFaFO.js +1 -0
  25. package/dist/plugin-sdk/thinking-pTdxk2dr.js +1 -0
  26. package/dist/thinking-B5B36ffe.js +1 -0
  27. package/dist/thinking-BYwvlJ3S.js +1 -0
  28. package/dist/thinking-CAzdgmNV.js +1 -0
  29. package/dist/thinking-DykY2Fzj.js +1 -0
  30. package/docs/PATCHES.md +34 -0
  31. package/docs/PROVIDER-AUDIT-2026-09-20.md +137 -0
  32. package/docs/PROVIDER-CATALOG.md +7 -4
  33. package/node_modules/@mariozechner/pi-ai/dist/models.generated.js +22 -0
  34. package/node_modules/@mariozechner/pi-ai/dist/models.js +1 -0
  35. package/node_modules/@mariozechner/pi-ai/dist/providers/anthropic.js +2 -2
  36. package/node_modules/@mariozechner/pi-ai/dist/providers/google.js +2 -1
  37. package/node_modules/@mariozechner/pi-ai/dist/providers/openai-completions.js +4 -1
  38. package/node_modules/@mariozechner/pi-ai/dist/providers/openai-responses.js +4 -3
  39. package/package.json +1 -1
  40. package/vendor/patched-deps/@mariozechner/pi-ai/dist/models.generated.js +22 -0
  41. package/vendor/patched-deps/@mariozechner/pi-ai/dist/models.js +1 -0
  42. package/vendor/patched-deps/@mariozechner/pi-ai/dist/providers/anthropic.js +2 -2
  43. package/vendor/patched-deps/@mariozechner/pi-ai/dist/providers/google.js +2 -1
  44. package/vendor/patched-deps/@mariozechner/pi-ai/dist/providers/openai-completions.js +4 -1
  45. package/vendor/patched-deps/@mariozechner/pi-ai/dist/providers/openai-responses.js +4 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.9.31
4
+
5
+ - Family 78: Claude Opus 5.5 (`anthropic/claude-opus-5-5`) is a first-class model. Id, $4/$20 pricing, $0.20 cache reads, 1M native context (300K owner cap), 128K max output and always-on adaptive thinking confirmed against the Anthropic model docs on 2026-09-23. Effort maps 1:1 (xhigh and max are distinct), temperature is dropped, and `opus` now resolves to Opus 5.5 on every install; `opus5` keeps Claude Opus 5 reachable and the opus-5 catalog entry is unchanged. Exact replay via `scripts/patch-opus-5-5-model.py`; verifier checks 78.1-78.3. Roll back with `npm i -g johns-harness@2026.9.30`.
6
+
7
+ ## 2026.9.30
8
+
9
+ - Family 77: weekly official six-provider audit. DeepSeek V4 Flash/Pro now transmit native low for minimal/low instead of silently using high. Meta Standard Muse 1.2/1.3 preserve provider-default effort when the caller omits it instead of forcing minimal. Gemini 3.8 Flash and 3.5 Flash-Lite omit deprecated/ignored sampling temperature. Preserve all aliases, saved model IDs, owner context caps and default selections.
10
+ - Astra native Responses max, Fable 5.1 max and Grok 4.6 xhigh were already correct and were independently wire-verified. Meta inference remains account-dependent; no configured account was available for this audit. New Gemini Live/Interactions models are not mislabeled as working generateContent chat models.
11
+ - Exact preimage/postimage replay, three actual-adapter regression surfaces and installed-artifact verification. See `docs/PROVIDER-AUDIT-2026-09-20.md`. Roll back with `npm i -g johns-harness@2026.9.29`; focused adapter installs use their recorded pre-patch backups.
12
+
3
13
  ## 2026.9.29
4
14
 
5
15
  - Family 76.1: the registration-safe reload worker waits for `launchctl bootout` teardown to finish before bootstrapping the staged plist. A gateway that shuts down gracefully on SIGTERM stays registered for a moment after `bootout`; 2026.9.28 mistook that lingering registration for the replacement, skipped `bootstrap`, and reported `Service removed while waiting for health` with the job left unloaded (observed on the first live fleet reload). The wait is bounded at 30 seconds and a timeout is a retryable worker error, not an advanced checkpoint. Ordinary `kickstart -k` restarts were unaffected. The real macOS self-restart fixture now exits gracefully so the reload cases reproduce the race; two unit cases cover the wait and the timeout.
@@ -34,7 +44,7 @@
34
44
  - New packed-artifact gate `scripts/check-packed-artifact.mjs` inspects the real `npm pack` output (and registry tarballs) and fails closed unless all ten plugin-loader copies carry the Family 68 option. Releases 2026.9.22 and 2026.9.23 were cut from the pre-68 base, so their tarballs lacked it while main carried it; this gate makes that impossible to repeat.
35
45
  - Roll back with `npm i -g johns-harness@2026.9.23`.
36
46
 
37
- ## 2026.9.23
47
+ ## 2026.9.31
38
48
 
39
49
  - Family 70: ship the `orchestrator` skill as a bundled, always-eligible skill so every harness install loads the delegation and briefing protocol implicitly (pass the user's words through when they are clear, expand when they are vague, keep briefings brief). Workspace overrides, `enabled: false` and `allowBundled` still apply. `RULES.md` points at the bundled copy.
40
50
 
@@ -5134,6 +5134,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
5134
5134
  "nano-banana": "google/gemini-3-pro-image-preview",
5135
5135
  image: "openai-codex/gpt-image-2"
5136
5136
  });
5137
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
5138
+ Object.assign(DEFAULT_MODEL_ALIASES, {
5139
+ opus: "anthropic/claude-opus-5-5",
5140
+ opus5: "anthropic/claude-opus-5"
5141
+ });
5137
5142
  const DEFAULT_MODEL_COST = {
5138
5143
  input: 0,
5139
5144
  output: 0,
@@ -2110,6 +2110,7 @@ const XHIGH_MODEL_REFS = [
2110
2110
  "anthropic/claude-fable-5-1",
2111
2111
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
2112
2112
  "meta/muse-spark-1.2",
2113
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
2113
2114
  "xai/grok-4.6",
2114
2115
  "openai/gpt-6-astra",
2115
2116
  "openai-codex/gpt-6-astra",
@@ -1829,6 +1829,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
1829
1829
  "nano-banana": "google/gemini-3-pro-image-preview",
1830
1830
  image: "openai-codex/gpt-image-2"
1831
1831
  });
1832
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
1833
+ Object.assign(DEFAULT_MODEL_ALIASES, {
1834
+ opus: "anthropic/claude-opus-5-5",
1835
+ opus5: "anthropic/claude-opus-5"
1836
+ });
1832
1837
  const DEFAULT_MODEL_COST = {
1833
1838
  input: 0,
1834
1839
  output: 0,
@@ -4981,6 +4981,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
4981
4981
  "nano-banana": "google/gemini-3-pro-image-preview",
4982
4982
  image: "openai-codex/gpt-image-2"
4983
4983
  });
4984
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
4985
+ Object.assign(DEFAULT_MODEL_ALIASES, {
4986
+ opus: "anthropic/claude-opus-5-5",
4987
+ opus5: "anthropic/claude-opus-5"
4988
+ });
4984
4989
  const DEFAULT_MODEL_COST = {
4985
4990
  input: 0,
4986
4991
  output: 0,
@@ -1686,6 +1686,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
1686
1686
  "nano-banana": "google/gemini-3-pro-image-preview",
1687
1687
  image: "openai-codex/gpt-image-2"
1688
1688
  });
1689
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
1690
+ Object.assign(DEFAULT_MODEL_ALIASES, {
1691
+ opus: "anthropic/claude-opus-5-5",
1692
+ opus5: "anthropic/claude-opus-5"
1693
+ });
1689
1694
  const DEFAULT_MODEL_COST = {
1690
1695
  input: 0,
1691
1696
  output: 0,
@@ -1797,7 +1802,7 @@ function applyTalkConfigNormalization(config) {
1797
1802
  window, but this scoped local ceiling keeps catalog, compaction, preflight,
1798
1803
  failover, and session snapshots on the same conservative budget. */
1799
1804
  const JOHNNESS_OPUS_CONTEXT_TOKENS = 3e5;
1800
- const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5"]);
1805
+ const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5", "claude-opus-5-5"]); // JOHNNESS_PATCH_OPUS_55_MODEL
1801
1806
  function resolveJohnnessOpusContextWindow(providerId, modelId) {
1802
1807
  if (normalizeProviderId(String(providerId ?? "")) !== "anthropic") return;
1803
1808
  const normalizedModelId = String(modelId ?? "").trim().toLowerCase();
@@ -1661,6 +1661,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
1661
1661
  "nano-banana": "google/gemini-3-pro-image-preview",
1662
1662
  image: "openai-codex/gpt-image-2"
1663
1663
  });
1664
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
1665
+ Object.assign(DEFAULT_MODEL_ALIASES, {
1666
+ opus: "anthropic/claude-opus-5-5",
1667
+ opus5: "anthropic/claude-opus-5"
1668
+ });
1664
1669
  const DEFAULT_MODEL_COST = {
1665
1670
  input: 0,
1666
1671
  output: 0,
@@ -1772,7 +1777,7 @@ function applyTalkConfigNormalization(config) {
1772
1777
  window, but this scoped local ceiling keeps catalog, compaction, preflight,
1773
1778
  failover, and session snapshots on the same conservative budget. */
1774
1779
  const JOHNNESS_OPUS_CONTEXT_TOKENS = 3e5;
1775
- const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5"]);
1780
+ const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5", "claude-opus-5-5"]); // JOHNNESS_PATCH_OPUS_55_MODEL
1776
1781
  function resolveJohnnessOpusContextWindow(providerId, modelId) {
1777
1782
  if (normalizeProviderId(String(providerId ?? "")) !== "anthropic") return;
1778
1783
  const normalizedModelId = String(modelId ?? "").trim().toLowerCase();
@@ -1592,6 +1592,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
1592
1592
  "nano-banana": "google/gemini-3-pro-image-preview",
1593
1593
  image: "openai-codex/gpt-image-2"
1594
1594
  });
1595
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
1596
+ Object.assign(DEFAULT_MODEL_ALIASES, {
1597
+ opus: "anthropic/claude-opus-5-5",
1598
+ opus5: "anthropic/claude-opus-5"
1599
+ });
1595
1600
  const DEFAULT_MODEL_COST = {
1596
1601
  input: 0,
1597
1602
  output: 0,
@@ -1703,7 +1708,7 @@ function applyTalkConfigNormalization(config) {
1703
1708
  window, but this scoped local ceiling keeps catalog, compaction, preflight,
1704
1709
  failover, and session snapshots on the same conservative budget. */
1705
1710
  const JOHNNESS_OPUS_CONTEXT_TOKENS = 3e5;
1706
- const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5"]);
1711
+ const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5", "claude-opus-5-5"]); // JOHNNESS_PATCH_OPUS_55_MODEL
1707
1712
  function resolveJohnnessOpusContextWindow(providerId, modelId) {
1708
1713
  if (normalizeProviderId(String(providerId ?? "")) !== "anthropic") return;
1709
1714
  const normalizedModelId = String(modelId ?? "").trim().toLowerCase();
@@ -11,7 +11,7 @@ const MODELS_JSON_WRITE_LOCKS = /* @__PURE__ */ new Map();
11
11
  models.json is generated from the raw source snapshot. Do not broaden older
12
12
  Anthropic models or add aliases. */
13
13
  const JOHNNESS_OPUS_CONTEXT_TOKENS = 3e5;
14
- const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5"]);
14
+ const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5", "claude-opus-5-5"]); // JOHNNESS_PATCH_OPUS_55_MODEL
15
15
  function applyJohnnessOpusContextWindows(providers) {
16
16
  const anthropicKey = Object.keys(providers).find((key) => key.trim().toLowerCase() === "anthropic");
17
17
  if (!anthropicKey) return providers;
@@ -11,7 +11,7 @@ const MODELS_JSON_WRITE_LOCKS = /* @__PURE__ */ new Map();
11
11
  models.json is generated from the raw source snapshot. Do not broaden older
12
12
  Anthropic models or add aliases. */
13
13
  const JOHNNESS_OPUS_CONTEXT_TOKENS = 3e5;
14
- const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5"]);
14
+ const JOHNNESS_OPUS_300K_MODEL_IDS = new Set(["claude-opus-4-8", "claude-opus-5", "claude-opus-5-5"]); // JOHNNESS_PATCH_OPUS_55_MODEL
15
15
  function applyJohnnessOpusContextWindows(providers) {
16
16
  const anthropicKey = Object.keys(providers).find((key) => key.trim().toLowerCase() === "anthropic");
17
17
  if (!anthropicKey) return providers;
@@ -7079,6 +7079,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
7079
7079
  "nano-banana": "google/gemini-3-pro-image-preview",
7080
7080
  image: "openai-codex/gpt-image-2"
7081
7081
  });
7082
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
7083
+ Object.assign(DEFAULT_MODEL_ALIASES, {
7084
+ opus: "anthropic/claude-opus-5-5",
7085
+ opus5: "anthropic/claude-opus-5"
7086
+ });
7082
7087
  const DEFAULT_MODEL_COST = {
7083
7088
  input: 0,
7084
7089
  output: 0,
@@ -8080,6 +8080,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
8080
8080
  "nano-banana": "google/gemini-3-pro-image-preview",
8081
8081
  image: "openai-codex/gpt-image-2"
8082
8082
  });
8083
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
8084
+ Object.assign(DEFAULT_MODEL_ALIASES, {
8085
+ opus: "anthropic/claude-opus-5-5",
8086
+ opus5: "anthropic/claude-opus-5"
8087
+ });
8083
8088
  const DEFAULT_MODEL_COST = {
8084
8089
  input: 0,
8085
8090
  output: 0,
@@ -5209,6 +5209,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
5209
5209
  "nano-banana": "google/gemini-3-pro-image-preview",
5210
5210
  image: "openai-codex/gpt-image-2"
5211
5211
  });
5212
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
5213
+ Object.assign(DEFAULT_MODEL_ALIASES, {
5214
+ opus: "anthropic/claude-opus-5-5",
5215
+ opus5: "anthropic/claude-opus-5"
5216
+ });
5212
5217
  const DEFAULT_MODEL_COST = {
5213
5218
  input: 0,
5214
5219
  output: 0,
@@ -3135,6 +3135,7 @@ const XHIGH_MODEL_REFS = [
3135
3135
  "anthropic/claude-fable-5-1",
3136
3136
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
3137
3137
  "meta/muse-spark-1.2",
3138
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
3138
3139
  "xai/grok-4.6",
3139
3140
  "openai/gpt-6-astra",
3140
3141
  "openai-codex/gpt-6-astra",
@@ -6000,6 +6000,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
6000
6000
  "nano-banana": "google/gemini-3-pro-image-preview",
6001
6001
  image: "openai-codex/gpt-image-2"
6002
6002
  });
6003
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
6004
+ Object.assign(DEFAULT_MODEL_ALIASES, {
6005
+ opus: "anthropic/claude-opus-5-5",
6006
+ opus5: "anthropic/claude-opus-5"
6007
+ });
6003
6008
  const DEFAULT_MODEL_COST = {
6004
6009
  input: 0,
6005
6010
  output: 0,
@@ -4969,6 +4969,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
4969
4969
  "nano-banana": "google/gemini-3-pro-image-preview",
4970
4970
  image: "openai-codex/gpt-image-2"
4971
4971
  });
4972
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
4973
+ Object.assign(DEFAULT_MODEL_ALIASES, {
4974
+ opus: "anthropic/claude-opus-5-5",
4975
+ opus5: "anthropic/claude-opus-5"
4976
+ });
4972
4977
  const DEFAULT_MODEL_COST = {
4973
4978
  input: 0,
4974
4979
  output: 0,
@@ -4973,6 +4973,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
4973
4973
  "nano-banana": "google/gemini-3-pro-image-preview",
4974
4974
  image: "openai-codex/gpt-image-2"
4975
4975
  });
4976
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
4977
+ Object.assign(DEFAULT_MODEL_ALIASES, {
4978
+ opus: "anthropic/claude-opus-5-5",
4979
+ opus5: "anthropic/claude-opus-5"
4980
+ });
4976
4981
  const DEFAULT_MODEL_COST = {
4977
4982
  input: 0,
4978
4983
  output: 0,
@@ -4973,6 +4973,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
4973
4973
  "nano-banana": "google/gemini-3-pro-image-preview",
4974
4974
  image: "openai-codex/gpt-image-2"
4975
4975
  });
4976
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
4977
+ Object.assign(DEFAULT_MODEL_ALIASES, {
4978
+ opus: "anthropic/claude-opus-5-5",
4979
+ opus5: "anthropic/claude-opus-5"
4980
+ });
4976
4981
  const DEFAULT_MODEL_COST = {
4977
4982
  input: 0,
4978
4983
  output: 0,
@@ -4782,6 +4782,11 @@ Object.assign(DEFAULT_MODEL_ALIASES, {
4782
4782
  "nano-banana": "google/gemini-3-pro-image-preview",
4783
4783
  image: "openai-codex/gpt-image-2"
4784
4784
  });
4785
+ // JOHNNESS_PATCH_OPUS_55_MODEL: Claude Opus 5.5 is the newest Opus; `opus` moves to it, opus-5 stays in the catalog.
4786
+ Object.assign(DEFAULT_MODEL_ALIASES, {
4787
+ opus: "anthropic/claude-opus-5-5",
4788
+ opus5: "anthropic/claude-opus-5"
4789
+ });
4785
4790
  const DEFAULT_MODEL_COST = {
4786
4791
  input: 0,
4787
4792
  output: 0,
@@ -990,6 +990,7 @@ const XHIGH_MODEL_REFS = [
990
990
  "anthropic/claude-fable-5-1",
991
991
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
992
992
  "meta/muse-spark-1.2",
993
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
993
994
  "xai/grok-4.6",
994
995
  "openai/gpt-6-astra",
995
996
  "openai-codex/gpt-6-astra",
@@ -990,6 +990,7 @@ const XHIGH_MODEL_REFS = [
990
990
  "anthropic/claude-fable-5-1",
991
991
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
992
992
  "meta/muse-spark-1.2",
993
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
993
994
  "xai/grok-4.6",
994
995
  "openai/gpt-6-astra",
995
996
  "openai-codex/gpt-6-astra",
@@ -990,6 +990,7 @@ const XHIGH_MODEL_REFS = [
990
990
  "anthropic/claude-fable-5-1",
991
991
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
992
992
  "meta/muse-spark-1.2",
993
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
993
994
  "xai/grok-4.6",
994
995
  "openai/gpt-6-astra",
995
996
  "openai-codex/gpt-6-astra",
@@ -990,6 +990,7 @@ const XHIGH_MODEL_REFS = [
990
990
  "anthropic/claude-fable-5-1",
991
991
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
992
992
  "meta/muse-spark-1.2",
993
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
993
994
  "xai/grok-4.6",
994
995
  "openai/gpt-6-astra",
995
996
  "openai-codex/gpt-6-astra",
@@ -990,6 +990,7 @@ const XHIGH_MODEL_REFS = [
990
990
  "anthropic/claude-fable-5-1",
991
991
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
992
992
  "meta/muse-spark-1.2",
993
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
993
994
  "xai/grok-4.6",
994
995
  "openai/gpt-6-astra",
995
996
  "openai-codex/gpt-6-astra",
@@ -1014,6 +1014,7 @@ const XHIGH_MODEL_REFS = [
1014
1014
  "anthropic/claude-fable-5-1",
1015
1015
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
1016
1016
  "meta/muse-spark-1.2",
1017
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
1017
1018
  "xai/grok-4.6",
1018
1019
  "openai/gpt-6-astra",
1019
1020
  "openai-codex/gpt-6-astra",
@@ -991,6 +991,7 @@ const XHIGH_MODEL_REFS = [
991
991
  "anthropic/claude-fable-5-1",
992
992
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
993
993
  "meta/muse-spark-1.2",
994
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
994
995
  "xai/grok-4.6",
995
996
  "openai/gpt-6-astra",
996
997
  "openai-codex/gpt-6-astra",
@@ -18,6 +18,7 @@ const XHIGH_MODEL_REFS = [
18
18
  "anthropic/claude-fable-5-1",
19
19
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
20
20
  "meta/muse-spark-1.2",
21
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
21
22
  "xai/grok-4.6",
22
23
  "openai/gpt-6-astra",
23
24
  "openai-codex/gpt-6-astra",
@@ -990,6 +990,7 @@ const XHIGH_MODEL_REFS = [
990
990
  "anthropic/claude-fable-5-1",
991
991
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
992
992
  "meta/muse-spark-1.2",
993
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
993
994
  "xai/grok-4.6",
994
995
  "openai/gpt-6-astra",
995
996
  "openai-codex/gpt-6-astra",
@@ -18,6 +18,7 @@ const XHIGH_MODEL_REFS = [
18
18
  "anthropic/claude-fable-5-1",
19
19
  "meta/muse-spark-1.3", // JOHNNESS_PATCH_MUSE_SPARK
20
20
  "meta/muse-spark-1.2",
21
+ "anthropic/claude-opus-5-5", // JOHNNESS_PATCH_OPUS_55_MODEL
21
22
  "xai/grok-4.6",
22
23
  "openai/gpt-6-astra",
23
24
  "openai-codex/gpt-6-astra",
package/docs/PATCHES.md CHANGED
@@ -2773,3 +2773,37 @@ restart` uses the safe worker. For a real plist change, use the new version's
2773
2773
  `gateway install --force`, which stages the change before handoff. Rolling back to
2774
2774
  2026.9.27 or earlier restores the old restart defect; if necessary install it externally and
2775
2775
  use kickstart, never its gateway restart CLI from a gateway child.
2776
+
2777
+
2778
+ ## 77. Weekly provider reasoning corrections (2026-09-20)
2779
+
2780
+ The six-provider audit changes only the DeepSeek, Meta Responses and Gemini adapters.
2781
+ Both DeepSeek V4 models now send native `low` for harness `minimal`/`low`, rather
2782
+ than silently spending at `high`. The existing `xhigh` to `max` compatibility
2783
+ mapping, explicit off, server-default omission, limits and aliases are preserved.
2784
+ Meta Standard Muse 1.2/1.3 now omit `reasoning.effort` when the caller omits it,
2785
+ instead of forcing `minimal`; explicit efforts, validation, encrypted replay and
2786
+ `store: false` are unchanged. Meta account access was not available for live inference.
2787
+
2788
+ `patches/provider-audit-20260920/changes.json` owns the exact three adapter pre/post
2789
+ images plus Meta's historical replay snapshot. Gemini 3.8 Flash and 3.5 Flash-Lite also omit deprecated/ignored temperature.
2790
+ The patcher preflights every target
2791
+ before writing, refuses drift, supports alternate roots and a dependency-only
2792
+ focused refresh. Family 67 reverses only these exact edits during historical hash
2793
+ validation. Both the modern and old Meta replay tests remain byte-identical.
2794
+
2795
+ No model IDs, aliases, config, credentials, default model or owner context caps
2796
+ change. Astra Responses already supports native `max`; Grok native `xhigh` and
2797
+ modern Claude native `max` were already correct. The global `/think max` synonym
2798
+ still means harness `xhigh`; it is not a new distinct UI level in this patch.
2799
+
2800
+ Evidence and official sources: [weekly audit](PROVIDER-AUDIT-2026-09-20.md).
2801
+ Tests: `tests/provider-audit-20260920.test.mjs`, provider catalog, Muse transport
2802
+ and historical replay; verifier 77.1 checks installed adapter hashes exactly.
2803
+
2804
+ ## Family 78: Claude Opus 5.5 (2026.9.31)
2805
+
2806
+ - `anthropic/claude-opus-5-5` registered in the shipped pi-ai catalog (marker `JOHNNESS_PATCH_OPUS_55_MODEL`). Id, pricing ($4/$20, cache read $0.20, 5m write $5), 1M native context (300K owner cap via `JOHNNESS_OPUS_300K_MODEL_IDS`), 128K max output confirmed against `platform.claude.com/docs/en/models/opus-5-5` and its migration guide on 2026-09-23.
2807
+ - Adaptive thinking is always on for Opus 5.5 (`thinking.type` disabled/enabled are 400s); the adapter already sends `thinking: {type: "adaptive"}` via the `opus-5` substring gate, and effort maps 1:1 (xhigh and max are distinct). Sampling temperature is dropped for the model. `XHIGH_MODEL_REFS` lists it in all 12 copies.
2808
+ - `opus` alias moves to Opus 5.5 in all 14 alias copies through a second `Object.assign(DEFAULT_MODEL_ALIASES, ...)` block; `opus5` keeps Claude Opus 5 reachable and the opus-5 entry is untouched. `scripts/check-alias-contract.mjs` evaluates every contract block.
2809
+ - Exact replay: `scripts/patch-opus-5-5-model.py` with `patches/opus-5-5/changes.json` (31 files, preimage/postimage hashes, `--check`, `--dependency-only`, `--present-only`). Families 53 and 67 reverse the family 78 edits before checking their historical hashes. Verifier 78.1-78.3; 63.12 now expects two contract blocks.
@@ -0,0 +1,137 @@
1
+ # Six-provider official API audit: 2026-09-20
2
+
3
+ This weekly audit builds on the successful September 13 catalog release, not on
4
+ upstream OpenClaw. Registry IDs, aliases, saved-session IDs, owner context caps,
5
+ credentials and the selected default are unchanged. Family 77 is a focused
6
+ provider-parameter patch prepared for `johns-harness@2026.9.30`. Release availability
7
+ is established by npm registry metadata and matching artifact integrity, not by
8
+ a successful publish-upload exit alone.
9
+
10
+ ## Changes
11
+
12
+ 1. **DeepSeek:** `minimal`/`low` now serialize as native `low` on `deepseek-flash`
13
+ and `deepseek-v4-pro`, rather than silently increasing effort to `high`.
14
+ Omission remains omitted; explicit low-level off disables thinking. Preserve
15
+ the existing harness `xhigh`/`max` -> native `max` compatibility mapping for
16
+ saved sessions. DeepSeek's own raw `xhigh` synonym maps to `high`; that is not
17
+ a reason to silently lower the harness's established highest-effort behavior.
18
+ 2. **Meta Muse:** omitted effort stays absent instead of forcing `minimal`.
19
+ Explicit effort validation, `store:false`, encrypted reasoning replay and
20
+ tool commentary phases are unchanged. No Contributor/training-consent models.
21
+ 3. **Gemini:** omit deprecated/ignored temperature for `gemini-3.8-flash` and
22
+ `gemini-3.5-flash-lite`. Older model behavior is unchanged. The live API still
23
+ accepts this field, but the official migration guide says to remove it and
24
+ warns that future models reject it. No topP/topK are generated by this adapter.
25
+
26
+ No new supported general-purpose model ID was identified since the prior audit.
27
+ No model was removed and no alias was upgraded to a preview.
28
+
29
+ ## Independent provider results
30
+
31
+ | Provider | Official/account result | Decision |
32
+ |---|---|---|
33
+ | DeepSeek | `/models` HTTP 200, two IDs: `deepseek-flash`, `deepseek-v4-pro`. Latest changelog release September 10, V4.1 Flash. Native low/high/max documented. Flash omission/low/high/xhigh/max and Pro low each HTTP 200. | Correct low serialization; retain all limits and prices. |
34
+ | Meta | Official Standard API confirms Muse 1.3 and retained 1.2 on `https://api.meta.ai/v1/responses`; 1.3 adds native max. No configured Meta credential. | Correct omission from official schema/reasoning docs and actual offline adapter tests; do not claim authenticated inference. |
35
+ | Google | Native model listing HTTP 200 (58 records); 3.8 Flash and 3.5 Flash-Lite confirmed, each 1,048,576 input / 65,536 output. 3.8 minimal smoke HTTP 200. | Omit deprecated temperature; preserve thinking-level mapping. New September 15 Live audio models require a Live adapter, not generateContent chat registration. September 17 Antigravity preview is an agent/Interactions API, not a drop-in model. |
36
+ | OpenAI | Native `/models` HTTP 200. Astra Responses omission/xhigh/max HTTP 200; none HTTP 400 explicitly reports supported low/medium/high/xhigh/max. | Existing native Responses max support is correct. Do not import another application's Chat Completions limitations. No catalog change. |
37
+ | Anthropic | Native `/v1/models` HTTP 200 (11 records) confirms Fable 5.1, Opus 5 and Sonnet 5. Fable adaptive thinking + output_config.effort=max HTTP 200. | Native max was already preserved by the adapter; no change. Account-gated models are not inferred from announcements. |
38
+ | xAI | Native `/v1/models` HTTP 200 (12 records) includes Grok 4.6. Omitted effort and xhigh Chat Completions requests HTTP 200. | xhigh was already supported. Keep exactly 200K owner context cap, 64K output, existing aliases. |
39
+
40
+ The model listing counts are account/time-specific, not availability promises.
41
+ No API list had an unconsumed pagination indicator. No 429 occurred and no
42
+ credential was printed or persisted in evidence. Minimal inference probes used
43
+ synthetic "Reply with OK only" prompts and at most 64 output tokens. Successful
44
+ HTTP parameter acceptance is not a long-output, all-modality or full tool-loop
45
+ inference certification. Offline existing tests separately cover streaming,
46
+ reasoning/signature/encrypted replay, tool calls and errors.
47
+
48
+ ## Metadata and compatibility
49
+
50
+ - DeepSeek Flash is V4.1 Flash (text/image), Pro is V4 Pro 0813 (text).
51
+ Both have 1,048,576 context / 393,216 maximum output. Native default is
52
+ thinking enabled/high. Nonthinking default max output is 8K; thinking high is
53
+ 64K and max is 128K. Temperature has no effect in thinking mode and remains
54
+ omitted. The adapter sends `max_tokens`, not `max_completion_tokens`, and
55
+ does not invent developer-role, store, or strict-tool support.
56
+ - Meta Standard 1.3/1.2 retain 1,048,576 context / 131,072 output and text/image
57
+ input in the harness. Models always reason. Omission lets the model choose
58
+ effort; none/off are invalid. Max is exclusive to Standard 1.3. Standard
59
+ pricing remains $1.25 input / $4.25 output / $0.15 cached input per million.
60
+ - Google current Flash/Lite use native thinking levels rather than a synthetic
61
+ budget. 3.8 MINIMAL remains mapped to LOW by the previously verified adapter;
62
+ 3.5 Lite supports MINIMAL. Omission stays omitted. Native API supports more
63
+ media than the pinned text/image agent interface; this patch does not claim
64
+ Live audio, Interactions, image/video output or unrelated tool adapters.
65
+ - OpenAI native context is 1,050,000 with 128K max output; conservative existing
66
+ harness budgets remain unchanged. Astra cannot disable reasoning. The native
67
+ Responses adapter already passes max exactly. The global `/think max` spelling
68
+ still normalizes to harness xhigh; adding a separate UI enum is not this patch.
69
+ - Modern Claude native effort levels include distinct xhigh and max. Adaptive
70
+ thinking omits manual budgets and sampling. Fable/Opus retain 300K owner caps;
71
+ Sonnet's conservative existing budget remains untouched.
72
+ - Grok 4.6 documents 500K native context / 64K output; the harness deliberately
73
+ retains 200K. Its reasoning_effort xhigh is transmitted exactly. Prices remain
74
+ $2 input / $6 output / $0.50 cached input per million; native long-prompt
75
+ multipliers are not represented by the basic catalog cost estimator.
76
+
77
+ Prices/limits not changed in this release remain at their last verified values;
78
+ there is no blanket claim of re-pricing every legacy registry entry. DeepSeek
79
+ current pricing and Meta Standard pricing were independently rechecked. No price,
80
+ context or output-limit diff was required on the changed entries.
81
+
82
+ ## First-party sources checked
83
+
84
+ - DeepSeek: [catalog/pricing](https://api-docs.deepseek.com/quick_start/pricing/),
85
+ [thinking](https://api-docs.deepseek.com/guides/thinking_mode/),
86
+ [complete Chat Completions reference](https://api-docs.deepseek.com/api/create-chat-completion/),
87
+ [changelog](https://api-docs.deepseek.com/updates).
88
+ - Meta: [models](https://ai.developer.meta.com/docs/models.md),
89
+ [reasoning](https://ai.developer.meta.com/docs/reasoning.md),
90
+ [Responses protocol](https://ai.developer.meta.com/docs/protocols/responses.md),
91
+ [create response](https://ai.developer.meta.com/docs/api-reference/responses/create-response.md),
92
+ [pricing](https://ai.developer.meta.com/docs/pricing-rate-limits.md).
93
+ HTML indexes intermittently returned HTTP 500; official `.md` pages succeeded.
94
+ - Google: [model catalog](https://ai.google.dev/gemini-api/docs/models),
95
+ [thinking](https://ai.google.dev/gemini-api/docs/thinking.md.txt),
96
+ [latest-model migration](https://ai.google.dev/gemini-api/docs/generate-content/latest-model),
97
+ [changelog](https://ai.google.dev/gemini-api/docs/changelog).
98
+ Some index requests redirected repeatedly; native model listing and direct
99
+ content fetch supplied the data. Locale variants do not alter exact API IDs.
100
+ - OpenAI: [catalog](https://developers.openai.com/api/docs/models/),
101
+ [Astra model reference](https://developers.openai.com/api/docs/models/gpt-6-astra.md).
102
+ - Anthropic: [overview](https://platform.claude.com/docs/en/models/overview),
103
+ [Fable 5.1](https://platform.claude.com/docs/en/models/fable-5-1/overview),
104
+ [effort](https://platform.claude.com/docs/en/build-with-claude/effort).
105
+ - xAI: [catalog](https://docs.x.ai/developers/models),
106
+ [Grok 4.6](https://docs.x.ai/developers/models/grok-4.6).
107
+
108
+ ## Verification and recovery
109
+
110
+ Family 77 has exact preimage/postimage hashes, all-file preflight before writes,
111
+ read-only checks, alternate-root and dependency-only modes, and idempotent replay.
112
+ Family 67 validates its historical surface after reversing only the exact new
113
+ edits. Meta's Family 53 snapshot is synchronized. Payload tests exercise actual
114
+ installed adapters, not string-only fixtures. Existing alias contract tests and
115
+ all prior catalog/transport replay tests remain part of the release gates.
116
+
117
+ The release is a three-adapter patch on 2026.9.29. Roll back a standard package
118
+ installation to `johns-harness@2026.9.29`; focused installations must restore their
119
+ recorded pre-patch adapter files, not overwrite state or migrate directories.
120
+ A running gateway caches provider modules. Disk validation is not activation:
121
+ coordinate a safe restart after active work finishes, never interrupt jobs merely
122
+ to report a refreshed version.
123
+
124
+
125
+ ## Verification and documentation notes
126
+
127
+ The source verifier passes 469 checks. A fresh local-prefix install passes 468
128
+ checks directly; its legacy check05 assumes nested playwright-core, while npm
129
+ hoists that dependency. Resolving playwright-core from the installed package and
130
+ comparing the actual `lib/server/dialog.js` with the complete reviewed vendored
131
+ file confirms the exact patch bytes and guard marker. This is a verifier path
132
+ limitation, not a missing runtime patch. No verifier assertion was weakened.
133
+
134
+ Documentation correction after packing: the September20 authenticated list
135
+ counts are Google **58**, Anthropic **11**, xAI **12**. The initial packed audit
136
+ narrative contained incorrect counts; no catalog entries or adapter logic were
137
+ based on those counts. This source document is the corrected audit record.
@@ -1,4 +1,4 @@
1
- # Current provider catalog — checked 2026-09-13
1
+ # Current provider catalog — checked 2026-09-20
2
2
 
3
3
  Family 67 audits general-purpose agent models against first-party documentation and
4
4
  provider-authenticated model lists. It is a targeted registry/adapter refresh on the
@@ -31,7 +31,7 @@ Registry presence does not promise account entitlement.
31
31
 
32
32
  - **DeepSeek V4:** omitted effort leaves `thinking` and `reasoning_effort` absent,
33
33
  preserving the server's default enabled/high. Explicit low-level `off`/`none`
34
- sets `thinking: {type: "disabled"}`. Minimal/low/medium/high map to native `high`;
34
+ sets `thinking: {type: "disabled"}`. Minimal/low map to native `low`; medium/high map to native `high`;
35
35
  xhigh/max map to native `max`. Unknown efforts fail before HTTP. Disabled thinking
36
36
  must not carry `reasoning_effort`. In enabled/default mode temperature is omitted
37
37
  because the API ignores sampling controls. Use `max_tokens`, not
@@ -43,10 +43,12 @@ Registry presence does not promise account entitlement.
43
43
  reasoning replay, and tool-loop commentary `phase`. Always-reasoning;
44
44
  minimal/low/medium/high/xhigh, with native max only on Standard 1.3. The pinned
45
45
  high-level `/think max` spelling still normalizes to xhigh, not a new global enum.
46
+ Omitted effort stays absent and provider-controlled rather than forcing minimal.
46
47
  - **Gemini:** Flash-Lite now enters the native thinking-level branch instead of
47
48
  the legacy thinking-budget branch. It supports MINIMAL/LOW/MEDIUM/HIGH; omission
48
49
  preserves its native minimal default. 3.8 Flash still maps minimal to LOW because
49
50
  the live API rejects MINIMAL (Family 50). No synthetic thinkingBudget is sent.
51
+ Deprecated/ignored temperature is omitted on 3.8 Flash and 3.5 Flash-Lite.
50
52
  - **Claude:** current Fable 5/5.1, Opus 5 and Sonnet 5 preserve native xhigh rather
51
53
  than silently downgrading it to high or promoting it to max. Low-level max remains
52
54
  distinct. Minimal maps to low. Adaptive thinking has no manual token budget.
@@ -60,7 +62,7 @@ Registry presence does not promise account entitlement.
60
62
  public thinking enum still tops out at xhigh. Transport token ceilings are not
61
63
  raised merely because the provider advertises a larger native window.
62
64
  - **Grok:** existing native effort mapping and 200K owner cap retained; live low
63
- effort request accepted by `grok-4.6`.
65
+ and xhigh effort requests accepted by `grok-4.6`.
64
66
 
65
67
  The pinned high-level API represents `/think off` as an absent reasoning option on
66
68
  some routes. Consequently omission and explicit off cannot be distinguished there;
@@ -96,7 +98,8 @@ Subscription cost entries remain zero (subscription-billed), not API-price estim
96
98
 
97
99
  ## Evidence and sources
98
100
 
99
- Checked 2026-09-13; first-party direct pages unless noted. Credential-bearing API
101
+ Baseline sources checked 2026-09-13; six-provider re-audit 2026-09-20 is in
102
+ [the dated audit](PROVIDER-AUDIT-2026-09-20.md). First-party pages unless noted. Credential-bearing API
100
103
  requests were sent only to the relevant official host, with redirects disabled.
101
104
 
102
105
  - DeepSeek: <https://api-docs.deepseek.com/quick_start/pricing/>,
@@ -1666,6 +1666,28 @@ export const MODELS = {
1666
1666
  contextWindow: 300000, // JOHNNESS_PATCH_FABLE_51_CONTEXT_300K
1667
1667
  maxTokens: 128000,
1668
1668
  },
1669
+ /* JOHNNESS_PATCH_OPUS_55_MODEL (family 78): Claude Opus 5.5. API id "claude-opus-5-5" (fixed id, no
1670
+ date suffix) confirmed against platform.claude.com/docs/en/models/opus-5-5 on
1671
+ 2026-09-23: $4/$20 per MTok, cache reads $0.20, 5m cache writes $5, 1M native
1672
+ context, 128K max output, adaptive thinking always on (effort is the only control,
1673
+ default medium). contextWindow capped at 300K per the family 30 Opus budget. */
1674
+ "claude-opus-5-5": {
1675
+ id: "claude-opus-5-5",
1676
+ name: "Claude Opus 5.5",
1677
+ api: "anthropic-messages",
1678
+ provider: "anthropic",
1679
+ baseUrl: "https://api.anthropic.com",
1680
+ reasoning: true,
1681
+ input: ["text", "image"],
1682
+ cost: {
1683
+ input: 4,
1684
+ output: 20,
1685
+ cacheRead: 0.2,
1686
+ cacheWrite: 5,
1687
+ },
1688
+ contextWindow: 300000,
1689
+ maxTokens: 128000,
1690
+ },
1669
1691
  /* JOHNNESS_PATCH_DEFAULTS_61 (family 61): Claude Opus 5; native 1M window; 300K per family 30 Opus budget. */
1670
1692
  "claude-opus-5": {
1671
1693
  id: "claude-opus-5",
@@ -38,6 +38,7 @@ export function supportsXhigh(model) {
38
38
  // JOHNNESS_PATCH_PROVIDER_CATALOG_67
39
39
  if (model.provider === "deepseek" && ["deepseek-flash", "deepseek-v4-pro"].includes(model.id)) return true;
40
40
  if (model.provider === "anthropic" && ["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1"].includes(model.id)) return true;
41
+ if (model.provider === "anthropic" && model.id === "claude-opus-5-5") return true; // JOHNNESS_PATCH_OPUS_55_MODEL
41
42
  // JOHNNESS_PATCH_MUSE_SPARK
42
43
  if (model.provider === "meta" && ["muse-spark-1.3", "muse-spark-1.2"].includes(model.id)) return true;
43
44
  if (model.id.includes("gpt-5.2") || model.id.includes("gpt-5.3")) {
@@ -353,7 +353,7 @@ function supportsAdaptiveThinking(modelId) {
353
353
  */
354
354
  function mapThinkingLevelToEffort(level, modelId) {
355
355
  // JOHNNESS_PATCH_PROVIDER_CATALOG_67: modern Claude supports distinct xhigh/max.
356
- if (["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1"].includes(modelId)) {
356
+ if (["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1", "claude-opus-5-5"].includes(modelId)) { // JOHNNESS_PATCH_OPUS_55_MODEL
357
357
  if (["low", "medium", "high", "xhigh", "max"].includes(level)) return level;
358
358
  return level === "minimal" ? "low" : "high";
359
359
  }
@@ -533,7 +533,7 @@ function buildParams(model, context, isOAuthToken, options) {
533
533
  }
534
534
  // Temperature is incompatible with extended thinking (adaptive or budget-based).
535
535
  if (options?.temperature !== undefined && !options?.thinkingEnabled &&
536
- !["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1", "claude-opus-4-8", "claude-opus-4-7"].includes(model.id)) { // JOHNNESS_PATCH_PROVIDER_CATALOG_67
536
+ !["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1", "claude-opus-4-8", "claude-opus-4-7", "claude-opus-5-5"].includes(model.id)) { // JOHNNESS_PATCH_PROVIDER_CATALOG_67 JOHNNESS_PATCH_OPUS_55_MODEL
537
537
  params.temperature = options.temperature;
538
538
  }
539
539
  if (context.tools) {
@@ -252,7 +252,8 @@ function createClient(model, apiKey, optionsHeaders) {
252
252
  function buildParams(model, context, options = {}) {
253
253
  const contents = convertMessages(model, context);
254
254
  const generationConfig = {};
255
- if (options.temperature !== undefined) {
255
+ // JOHNNESS_PATCH_PROVIDER_AUDIT_77: sampling is deprecated/ignored on these models.
256
+ if (options.temperature !== undefined && !["gemini-3.8-flash", "gemini-3.5-flash-lite"].includes(model.id)) {
256
257
  generationConfig.temperature = options.temperature;
257
258
  }
258
259
  if (options.maxTokens !== undefined) {
@@ -364,7 +364,10 @@ function buildParams(model, context, options) {
364
364
  } else {
365
365
  if (effort !== undefined) {
366
366
  params.thinking = { type: "enabled" };
367
- params.reasoning_effort = ["xhigh", "max"].includes(effort) ? "max" : "high";
367
+ // JOHNNESS_PATCH_PROVIDER_AUDIT_77: low is native on both V4 routes (2026-09-20).
368
+ // Preserve the harness's existing xhigh -> max compatibility mapping.
369
+ params.reasoning_effort = ["minimal", "low"].includes(effort) ? "low"
370
+ : ["xhigh", "max"].includes(effort) ? "max" : "high";
368
371
  }
369
372
  // Sampling controls have no effect in thinking mode; never imply they do.
370
373
  delete params.temperature;
@@ -176,11 +176,12 @@ function buildParams(model, context, options) {
176
176
  }
177
177
  // JOHNNESS_PATCH_MUSE_SPARK: always-reasoning, stateless encrypted replay.
178
178
  if (model.provider === "meta") {
179
- const effort = options?.reasoningEffort || "minimal";
180
- const allowed = ["minimal", "low", "medium", "high", "xhigh"];
179
+ // JOHNNESS_PATCH_PROVIDER_AUDIT_77: omission keeps Meta's model-selected effort.
180
+ const effort = options?.reasoningEffort;
181
+ const allowed = [undefined, "minimal", "low", "medium", "high", "xhigh"];
181
182
  if (model.id === "muse-spark-1.3") allowed.push("max");
182
183
  if (!allowed.includes(effort)) throw new Error("Muse Spark always reasons. Use minimal, low, medium, high or xhigh (max only on Standard 1.3); none/off is not supported.");
183
- params.reasoning = { effort, summary: options?.reasoningSummary || "auto" };
184
+ params.reasoning = { ...(effort === undefined ? {} : { effort }), summary: options?.reasoningSummary || "auto" };
184
185
  params.include = ["reasoning.encrypted_content"];
185
186
  params.store = false;
186
187
  // Avoid inventing Meta pricing multipliers from OpenAI service tiers.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "johns-harness",
3
- "version": "2026.9.29",
3
+ "version": "2026.9.31",
4
4
  "description": "John's Harness: a production agent harness that runs autonomous coding agents as one cooperative swarm.",
5
5
  "keywords": [
6
6
  "ai-agents",
@@ -1666,6 +1666,28 @@ export const MODELS = {
1666
1666
  contextWindow: 300000, // JOHNNESS_PATCH_FABLE_51_CONTEXT_300K
1667
1667
  maxTokens: 128000,
1668
1668
  },
1669
+ /* JOHNNESS_PATCH_OPUS_55_MODEL (family 78): Claude Opus 5.5. API id "claude-opus-5-5" (fixed id, no
1670
+ date suffix) confirmed against platform.claude.com/docs/en/models/opus-5-5 on
1671
+ 2026-09-23: $4/$20 per MTok, cache reads $0.20, 5m cache writes $5, 1M native
1672
+ context, 128K max output, adaptive thinking always on (effort is the only control,
1673
+ default medium). contextWindow capped at 300K per the family 30 Opus budget. */
1674
+ "claude-opus-5-5": {
1675
+ id: "claude-opus-5-5",
1676
+ name: "Claude Opus 5.5",
1677
+ api: "anthropic-messages",
1678
+ provider: "anthropic",
1679
+ baseUrl: "https://api.anthropic.com",
1680
+ reasoning: true,
1681
+ input: ["text", "image"],
1682
+ cost: {
1683
+ input: 4,
1684
+ output: 20,
1685
+ cacheRead: 0.2,
1686
+ cacheWrite: 5,
1687
+ },
1688
+ contextWindow: 300000,
1689
+ maxTokens: 128000,
1690
+ },
1669
1691
  /* JOHNNESS_PATCH_DEFAULTS_61 (family 61): Claude Opus 5; native 1M window; 300K per family 30 Opus budget. */
1670
1692
  "claude-opus-5": {
1671
1693
  id: "claude-opus-5",
@@ -38,6 +38,7 @@ export function supportsXhigh(model) {
38
38
  // JOHNNESS_PATCH_PROVIDER_CATALOG_67
39
39
  if (model.provider === "deepseek" && ["deepseek-flash", "deepseek-v4-pro"].includes(model.id)) return true;
40
40
  if (model.provider === "anthropic" && ["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1"].includes(model.id)) return true;
41
+ if (model.provider === "anthropic" && model.id === "claude-opus-5-5") return true; // JOHNNESS_PATCH_OPUS_55_MODEL
41
42
  // JOHNNESS_PATCH_MUSE_SPARK
42
43
  if (model.provider === "meta" && ["muse-spark-1.3", "muse-spark-1.2"].includes(model.id)) return true;
43
44
  if (model.id.includes("gpt-5.2") || model.id.includes("gpt-5.3")) {
@@ -353,7 +353,7 @@ function supportsAdaptiveThinking(modelId) {
353
353
  */
354
354
  function mapThinkingLevelToEffort(level, modelId) {
355
355
  // JOHNNESS_PATCH_PROVIDER_CATALOG_67: modern Claude supports distinct xhigh/max.
356
- if (["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1"].includes(modelId)) {
356
+ if (["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1", "claude-opus-5-5"].includes(modelId)) { // JOHNNESS_PATCH_OPUS_55_MODEL
357
357
  if (["low", "medium", "high", "xhigh", "max"].includes(level)) return level;
358
358
  return level === "minimal" ? "low" : "high";
359
359
  }
@@ -533,7 +533,7 @@ function buildParams(model, context, isOAuthToken, options) {
533
533
  }
534
534
  // Temperature is incompatible with extended thinking (adaptive or budget-based).
535
535
  if (options?.temperature !== undefined && !options?.thinkingEnabled &&
536
- !["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1", "claude-opus-4-8", "claude-opus-4-7"].includes(model.id)) { // JOHNNESS_PATCH_PROVIDER_CATALOG_67
536
+ !["claude-opus-5", "claude-sonnet-5", "claude-fable-5", "claude-fable-5-1", "claude-opus-4-8", "claude-opus-4-7", "claude-opus-5-5"].includes(model.id)) { // JOHNNESS_PATCH_PROVIDER_CATALOG_67 JOHNNESS_PATCH_OPUS_55_MODEL
537
537
  params.temperature = options.temperature;
538
538
  }
539
539
  if (context.tools) {
@@ -252,7 +252,8 @@ function createClient(model, apiKey, optionsHeaders) {
252
252
  function buildParams(model, context, options = {}) {
253
253
  const contents = convertMessages(model, context);
254
254
  const generationConfig = {};
255
- if (options.temperature !== undefined) {
255
+ // JOHNNESS_PATCH_PROVIDER_AUDIT_77: sampling is deprecated/ignored on these models.
256
+ if (options.temperature !== undefined && !["gemini-3.8-flash", "gemini-3.5-flash-lite"].includes(model.id)) {
256
257
  generationConfig.temperature = options.temperature;
257
258
  }
258
259
  if (options.maxTokens !== undefined) {
@@ -364,7 +364,10 @@ function buildParams(model, context, options) {
364
364
  } else {
365
365
  if (effort !== undefined) {
366
366
  params.thinking = { type: "enabled" };
367
- params.reasoning_effort = ["xhigh", "max"].includes(effort) ? "max" : "high";
367
+ // JOHNNESS_PATCH_PROVIDER_AUDIT_77: low is native on both V4 routes (2026-09-20).
368
+ // Preserve the harness's existing xhigh -> max compatibility mapping.
369
+ params.reasoning_effort = ["minimal", "low"].includes(effort) ? "low"
370
+ : ["xhigh", "max"].includes(effort) ? "max" : "high";
368
371
  }
369
372
  // Sampling controls have no effect in thinking mode; never imply they do.
370
373
  delete params.temperature;
@@ -176,11 +176,12 @@ function buildParams(model, context, options) {
176
176
  }
177
177
  // JOHNNESS_PATCH_MUSE_SPARK: always-reasoning, stateless encrypted replay.
178
178
  if (model.provider === "meta") {
179
- const effort = options?.reasoningEffort || "minimal";
180
- const allowed = ["minimal", "low", "medium", "high", "xhigh"];
179
+ // JOHNNESS_PATCH_PROVIDER_AUDIT_77: omission keeps Meta's model-selected effort.
180
+ const effort = options?.reasoningEffort;
181
+ const allowed = [undefined, "minimal", "low", "medium", "high", "xhigh"];
181
182
  if (model.id === "muse-spark-1.3") allowed.push("max");
182
183
  if (!allowed.includes(effort)) throw new Error("Muse Spark always reasons. Use minimal, low, medium, high or xhigh (max only on Standard 1.3); none/off is not supported.");
183
- params.reasoning = { effort, summary: options?.reasoningSummary || "auto" };
184
+ params.reasoning = { ...(effort === undefined ? {} : { effort }), summary: options?.reasoningSummary || "auto" };
184
185
  params.include = ["reasoning.encrypted_content"];
185
186
  params.store = false;
186
187
  // Avoid inventing Meta pricing multipliers from OpenAI service tiers.