Skip to content

Support CC 2.1.170 (Fable 5 release)#7

Merged
skrabe merged 4 commits into
mainfrom
fable-cc-2.1.170
Jun 10, 2026
Merged

Support CC 2.1.170 (Fable 5 release)#7
skrabe merged 4 commits into
mainfrom
fable-cc-2.1.170

Conversation

@skrabe

@skrabe skrabe commented Jun 9, 2026

Copy link
Copy Markdown
Owner

Summary

Support for CC 2.1.170 (the Fable 5 release).

  • data/prompts/prompts-2.1.170.json: extracted with our extractor, upstream identifierMaps adopted for 306 shared prompts. Corpus is structurally identical to 2.1.169 (389 named, 0 new/removed); content changed only in 12 data-* API-doc prompts picking up Fable 5 / Mythos 5 (new tier above Opus, $10/$50 per MTok, thinking:{type:"disabled"} → 400). We name 389 vs Piebald's 346.
  • autoModeClassifierModel patch: new match method for the 2.1.170 resolver shape — Anthropic added a Fable branch that falls back to the default Opus model when the main model is Fable/Mythos. Regression test added with the real minified fixture.
  • Extractor: named the three partial-map code-review slots (VERIFY_VOTE_DEFINITIONS, RECALL_BIASED_RUBRIC, SWEEP_MISS_CATEGORIES) whose pristine stubs rendered ${UNKNOWN_N}.
  • README: target version 2.1.170, refreshed counts.

Test plan

  • pnpm lint, pnpm test (336 passing incl. 4 new patch tests), pnpm build
  • --apply on a pristine 2.1.170 native install: clean, four zeros, auditMisbinds 0, fresh extraction matches committed JSON
  • Smoke: patched binary returns READY

skrabe added 4 commits June 9, 2026 19:47
Corpus is structurally identical to 2.1.169: 389 prompts, 0 new ids, 0
removed, 0 anonymous. Content changed in only 12 data-* prompts — the
claude-api skill docs picking up Claude Fable 5 / Mythos 5 (model catalog
adds the Fable tier above Opus at $10/$50 per MTok, 1M ctx; API references,
HTTP error codes, token counting, tool-use concepts updated accordingly).
Behavioral system prompts, tool descriptions, and reminders are byte-identical.

Seeded from our 2.1.169, upstream identifierMap adopted for 306 shared
prompts (TWEAKCC_UPSTREAM_JSON). Piebald's 2.1.170 names 346; we name 389.
Their 4 extra ids (3 design-sync lib/*.mjs build modules + browser
file-upload tool description) are deliberate exclusions in our extractor
(documented in validateInput), not coverage gaps.

Note: versionBumpReport's matchesCommittedJson requires TWEAKCC_UPSTREAM_JSON
in the env to reproduce the upstream-map adoption.
CC 2.1.170 extends the resolver with a Fable branch: when the main model is
Fable/Mythos, the auto-mode classifier falls back to the default Opus model
(ANTHROPIC_DEFAULT_OPUS_MODEL ?? opus48, with [1m] handling) instead of the
main-loop model. Added pattern170 as the first match method (167/156/138
shapes kept as fallbacks) plus a regression test with the real minified
2.1.170 fixture.
…eros fix)

skill-code-review-phase-2-verify-3-state, -recall-biased, and -phase-3-sweep
carried partial identifierMaps, so their pristine stubs rendered ${UNKNOWN_N}.
Surfaced when the Fable-5 override pass left these files pristine. Named from
the binary: P6q=VERIFY_VOTE_DEFINITIONS (3-state vote rubric),
W6q=RECALL_BIASED_RUBRIC (PLAUSIBLE-by-default), Z6q=SWEEP_MISS_CATEGORIES.
Piebald doesn't catalogue these fragments, so the names are ours. JSON
regenerated; report shows UNKNOWN=0, misbind=0, extraction matches committed.
@BenIsLegit

Copy link
Copy Markdown

Hey @skrabe sorry for going off topic from the PR, but I mentioned you in this issue incase you want to take over the npm package
BenIsLegit#3

@dividedby

Copy link
Copy Markdown

Heads-up from downstream, evidence only — not asking you to block or rework this PR on it. While gating this branch on our side we ran a duplicate-id scan across the prompts JSONs and found a chronic carryover class that's present in this PR's data/prompts/prompts-2.1.170.json (verified at head e096008). Since you said in the #6 review you'd rather root-cause this class than lock in snapshots, here's the full picture so one pass can cover all of it.

1. Three byte-identical duplicate pairs, carried for ~30 releases. Each id appears twice with entries that hash identically (sha256 over the sorted JSON entry):

id carryover version stamp
system-prompt-memory-description-of-user-details 2.1.94
system-prompt-description-part-of-memory-instructions 2.1.69
system-prompt-claude-in-chrome-browser-automation 2.1.20

The same three pairs are already in prompts-2.1.141.json on main (which also has a fourth, system-prompt-version-banner-detailed ×2, that later resolved), and they persist unchanged through every JSON we checked up to this PR's 2.1.170 — a dedup miss in carryover that re-propagates each bump.

2. The same class compounded: system-reminder-cross-session-peer-message-authority-warning ×4. Trajectory on main: 0 (2.1.165) → 1 (2.1.167) → 1 (2.1.168) → 4 (2.1.169), and still 4 in this PR. The four entries are: one live 4-piece template stamped 2.1.169 (identifiers: [0,1,2]) plus three byte-identical stale copies of the superseded single-piece 2.1.167 literal. So this one is the dedup miss stacked on a fuzzy-carryover miss — the old literal shape wasn't matched to the new template shape, and then the stale copies multiplied.

3. Why we're flagging it rather than just shrugging: the ×4 case has two divergent shapes (different piece-sets/identifierMaps) under one id, which makes override binding ambiguous — the same mis-bind/orphan surface auditMisbinds exists to guard. And none of the current gates see it: at this branch's head, tools/ and skills/showtime/driver.mjs have no duplicate-id check (grep for "duplicat" comes back empty), so the Four-zeros + auditMisbinds=0 run stays green while the class recurs every bump.

Reproduction recipe (any prompts JSON):

import json, hashlib, collections
d = json.load(open("data/prompts/prompts-2.1.170.json"))
c = collections.Counter(p["id"] for p in d["prompts"])
for i, n in c.items():
    if n > 1:
        entries = [p for p in d["prompts"] if p["id"] == i]
        hashes = {hashlib.sha256(json.dumps(e, sort_keys=True).encode()).hexdigest()[:12] for e in entries}
        print(i, "x", n, "distinct-shapes:", len(hashes))

Cost on your side if you pick it up: a dedup/supersede pass in the extractor's carryover (and optionally a dup-id assert in the gate so it can't silently return). Entirely your call on whether/when — the fix is yours; we just had the multi-version diff view handy and didn't want the evidence to go stale after this merges. Happy to share the full per-version scan if useful.

@dividedby

Copy link
Copy Markdown

Downstream feature ask — nothing for this PR to do; posting here because issues are disabled. (Separate topic from the dup-id evidence above; keeping pings one-at-a-time.)

Ask: make the escape-or-not decision mechanical for override authors

Whether a ${VAR} in an override needs escaping depends on the prompt's delimiter in cli.js — backtick template literals interpolate live (literal examples must be escaped), quoted strings are inert (escaping them corrupts the render via the patcher's backslash-doubling). Your patcher already reads the delimiter at apply time (systemPrompts.ts, the content[matchIndex - 1] check), but nothing surfaces it to an author before apply + review — the rule is folklore. Evidence it bites:

  • We shipped 2 wrong escapes against the quote-delimited data-anthropic-cli / skill-cowork-plugin-authoring-mcp-discovery in Align opus-4-7 overrides to upstream vocab (CC 2.1.169) + escape literal examples lobotomized-claude-code#5; you caught and reverted them by manual review (cb08b73).
  • Fresh, from gating this PR pair this week: our static orphan scan flagged JSON as an orphan variable — it's actually ${JSON.stringify(...)} JS-literal examples inside the workflow-script-* / skill-design-sync-* overrides (both fable-5 and opus-4-8 sets). Without delimiter context, neither authors nor tooling can classify those mechanically.
  • prompts-2.1.170.json carries no delimiter context (per-prompt fields today: name/id/description/pieces/identifiers/identifierMap/version).

Two possible shapes — your architecture call

  1. Extractor emits a per-prompt delimiter field (backtick | quote) in the prompts JSON. The data exists at extraction time. Honest cost: a schema addition that rides every future extraction/regeneration, and a one-time churn for anything diffing prompts JSONs.
  2. An auditMisbinds-style escape audit: flags escaped placeholders under a quote delimiter and unescaped literal ${...} examples under a backtick delimiter, per override. Honest cost: zero until run, one more tool surface to maintain; catches mistakes at audit time rather than guiding authors at writing time.

Happy to prepare a draft PR for whichever you'd pick — or neither; if you'd rather keep the rule in review, that's a fine answer and we'll keep validating on our side. No urgency, nothing here blocks 2.1.170.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants