Digital Garden

The Grand Card Clinic: Eight Packs, One Universal Preset

2026-10-12 · ~12 min read · SillyTavern · character card · MVU · variable system · clinic

Eight card-pack envoys arrived at the capital on the same day, requesting consultation. In this day’s diagnostic chamber were the critically ill, the perfectly healthy, and those needing only reinforcement — and the most precious product was something nobody named yet everyone benefits from: a universal parsing preset that eats every variable tree.

I. The Fate pack: nine cards, five confirmed problem classes

Pack structure: two world cards plus seven single-character cards. Cross-checked against the ST Doupo and Daoyuan cards, and measured with the configured space-bunny through the official MVU parsing flow, the problems surfaced:

The repair was an editorial surgery: the world cards’ 166 fragmented constant entries (synonym variants each getting their own entry, injected every turn) were hand-edited into ten core constants plus thirty-three converted to triggered; FSN constant characters fell 17066→14334 (-16%), constant entries 196→40; the seven single-character cards’ ZOD was rewritten Fate-style (per-card magic values 60/70/55/90/65/70/20 preserved), and all 49 greeting messages uniformly converted. Writing the PNG embed also caught a real bug: the tEXt chunk’s declared length used len(payload) instead of len(‘chara\x00’+payload) — the chunk tail lost six bytes and the CRC shifted. All 95 checks finally green, and MVU Variable Parse Preset - Fate written into ST.

II. Saekano and Oregairu: medals for the healthy

The Saekano delivery pack (one world card plus five heroine cards) is the highest-quality, leanest pack of the three: the world card’s 98 entries, ZOD syntax passing (the fixed toolkit), the variable tree customized for a modern campus (vigor/skills/connections/opportunities, cultivation fields removed wholesale), 23 constant entries all rules/MVU with no fragments, and correct order-tier design. The only substantive issue was the stage name: prologue - otherworlder template residue in first_mes (the zod-defined prologue is “prologue - eve of spring break”) — cleaned, 23 constants given ignore_budget, and a -fixed version produced. The five heroine cards needed nothing fixed.

Oregairu (My Youth Romantic Comedy Is Wrong, As I Expected — eight character cards plus one shared world book) is the healthiest of the five packs: a customized “relations/events/intelligence” three-table schema, all eight cards’ ZOD byte-identical, all 110 ops across 59 messages verified legal one by one (the initial scan’s /character, /event, /$narration “suspicious top-level” alarm was confirmed against the schema as legal custom paths — a false alarm), and only 13 constant entries totaling 6,623 characters. No fixed version produced — all eight cards usable as-is.

III. SAO and The Flower’s Bodyguard: two hard battles

The SAO pack (three world cards: Aincrad / Underworld / Gun Gale Online, 8,269 entries combined) passes ZOD syntax with consistent variable trees; the only real problem was constant-fragment overload: each card has 345–486 constant entries with a median of only 34 characters, totaling 34k–36k characters (~24k tokens, double the budget). The world-group fragments were converted wholesale to triggered (high-frequency mechanism words trigger naturally in dialogue), constants 486/473/345 → 46/32/60, characters -40%/-42%/-28%, 366+314+230 fragments converted to triggered and 74+127+55 deduplicated away, with zero content loss. Two of my own script bugs were fixed along the way: glob treating the generated fixed version as input, and “deduplicated” entries not actually leaving the constants.

The Flower’s Bodyguard is the most heavily diseased card of the six — the old toolkit’s three-layer masterpiece: the greeting’s self-invented JSON panel, the MVU status-bar template (a string of type errors, targets written as a single object while the schema is a name-keyed record, four fields missing), and the Zod schema, all three mismatched; it teaches the add op that MVU does not support; the whole card has no variable-tree path teaching entry; the handwritten layer’s order = 1~50, the lowest of all — ST allocates budget in descending order, so what gets dropped first is exactly the system rules and MVU teaching, with only ~505 entries making it into budget; plus a V1 shell-less card (the delivery README claims chara_card_v2 but the actual spec field is missing). The repair: constants 2,154 → 40 (-98%), characters 99,950 → 12,027 (-88%), 1,352 fragments converted to triggered and 762 deduplicated away, the handwritten layer raised to the global maximum with all ignore_budget, V2 shell upgraded, and the six greeting panels deterministically rewritten as XML sections.

IV. NIKKE, Zongheng Tianxia, and Jin Ping Mei: reinforcement and rebuild

The NIKKE Rapivi card is the highest single-card quality of all packs (the writing’s voice fingerprint consistent throughout, spoiler protection complete), the only defect being the status bar “has spec, no demonstration, no rendering” — a minimal fix (demonstration panel in first_mes, new render regex) followed by a full custom variable tree for the NIKKE IP: commander/Rapivi/missions/supplies/inner-voice, seven layers, with trust and affection on separate tracks (iron rule: her trust stays above affection), and the knot defaulting to “there is no answer yet to ‘what is a Nikke’” — the original work’s core question walked straight into the variables. Three forms coexist: the original (zero dependencies), the fixed version, and the variable version.

Zongheng Tianxia is the cleanest-baseline MVU card of the seven: zero .catch({}) mines, safe time defaults, a dual-track custom tree of game plus reality, and all 22 first_mes patches legal. The repair was reinforcement: install command sanitizer 2.1, add three rows to the amplitude table, and give 57 constants ignore_budget.

Jin Ping Mei - Plunder System (the desktop version in ZCode) is the second old-generation card after The Flower’s Bodyguard needing a full rebuild: nine .catch({}) whole-block reset mines, V1 shell-less, a cultivation tree on a Ming-dynasty manners world (the schema carrying realms/cultivation/spiritual power/techniques/divine powers, while the README itself states “this book has no cultivation realms; social hierarchy is the power system” — every turn forcing the model to invent Ximen Qing’s cultivation progress), teaching the add op, inverted handwritten-layer order, 34 fragmented constants, and greetings using the bare word data_block: (without even angle brackets, so the render regex can never match). The rebuild: a new tree redesigned for the manners world (class/silver/trade/storeroom, dao-companion→wives-and-concubines, spirit-pets→maids), six greeting panels rewritten, and the nine mines dying with the old schema. The protection surface was checked first and preserved: both hard boundaries in place (no non-consent/coercion/drugs, no intimate scenes for the underaged), Guan Ge’er and Xiao Ge’er only on opportunity lines with no conquest lines, and Ying’er’s entry explicitly “early on not a beauty line, protection and raising.”

V. The product nobody named

A cross-pack confirmed problem surfaced mid-clinic: the parsing preset is global — the Doupo preset breaks Fate cards (confirmed), and the Fate preset equally breaks Saekano cards (/seize-fate, /connections, /opportunities are not among Fate’s ten paths). The correct solution is a universal preset: top-level paths only allow keys actually present in the injected variable tree, with no card names hardcoded. space-bunny measured the Saekano and Fate fixtures passing together, after which SAO, Oregairu, The Flower’s Bodyguard, Zongheng Tianxia, Jin Ping Mei, and NIKKE each generalized in turn — one preset, eight packs. A quality issue found during measurement was also fixed: the parser copied example values when establishing Kato Megumi’s record (affection 12 / trust 40, when first meeting should be 0), so the iron rule gained “establishment values follow the plot, starting from 0 on first meeting.”

Two mechanisms were pinned down from ST source as a side investigation: sortFn = b.order - a.order is descending — higher-order entries get budget first, and when over budget the lower-order ones drop first (MVU/rules entries are protected; the script library is what gets squeezed); the token_budget field is not read by ST at all (not mapped in convertCharacterBook) — the actually effective anti-dropout marker is ignore_budget. The earlier Fate report’s reversed budget-mechanism discussion has been corrected against the source.

Real coordinates

Comments

← Digital Garden