johns-harness 2026.9.30 → 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 (38) hide show
  1. package/CHANGELOG.md +5 -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 +7 -0
  31. package/docs/PROVIDER-AUDIT-2026-09-20.md +21 -4
  32. package/node_modules/@mariozechner/pi-ai/dist/models.generated.js +22 -0
  33. package/node_modules/@mariozechner/pi-ai/dist/models.js +1 -0
  34. package/node_modules/@mariozechner/pi-ai/dist/providers/anthropic.js +2 -2
  35. package/package.json +1 -1
  36. package/vendor/patched-deps/@mariozechner/pi-ai/dist/models.generated.js +22 -0
  37. package/vendor/patched-deps/@mariozechner/pi-ai/dist/models.js +1 -0
  38. package/vendor/patched-deps/@mariozechner/pi-ai/dist/providers/anthropic.js +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
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
+
3
7
  ## 2026.9.30
4
8
 
5
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.
@@ -40,7 +44,7 @@
40
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.
41
45
  - Roll back with `npm i -g johns-harness@2026.9.23`.
42
46
 
43
- ## 2026.9.23
47
+ ## 2026.9.31
44
48
 
45
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.
46
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
@@ -2800,3 +2800,10 @@ still means harness `xhigh`; it is not a new distinct UI level in this patch.
2800
2800
  Evidence and official sources: [weekly audit](PROVIDER-AUDIT-2026-09-20.md).
2801
2801
  Tests: `tests/provider-audit-20260920.test.mjs`, provider catalog, Muse transport
2802
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.
@@ -3,7 +3,9 @@
3
3
  This weekly audit builds on the successful September 13 catalog release, not on
4
4
  upstream OpenClaw. Registry IDs, aliases, saved-session IDs, owner context caps,
5
5
  credentials and the selected default are unchanged. Family 77 is a focused
6
- provider-parameter patch, released as `johns-harness@2026.9.30`.
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.
7
9
 
8
10
  ## Changes
9
11
 
@@ -30,10 +32,10 @@ No model was removed and no alias was upgraded to a preview.
30
32
  |---|---|---|
31
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. |
32
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. |
33
- | Google | Native model listing HTTP 200 (62 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. |
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. |
34
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. |
35
- | Anthropic | Native `/v1/models` HTTP 200 (10 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. |
36
- | xAI | Native `/v1/models` HTTP 200 (34 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. |
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. |
37
39
 
38
40
  The model listing counts are account/time-specific, not availability promises.
39
41
  No API list had an unconsumed pagination indicator. No 429 occurred and no
@@ -118,3 +120,18 @@ recorded pre-patch adapter files, not overwrite state or migrate directories.
118
120
  A running gateway caches provider modules. Disk validation is not activation:
119
121
  coordinate a safe restart after active work finishes, never interrupt jobs merely
120
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.
@@ -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) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "johns-harness",
3
- "version": "2026.9.30",
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) {