fix(expressions): the infill repeats the tuned chain #247
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/expression-chain"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Closes #246 (option 1, per the owner).
The expression infill's stated rationale has always been "repeat the prompt the outfit sprite was rendered with, so the inpainted face stays consistent with the surrounding pixels." Since ADR 0062/0063 that prompt carries the attribute bundle — root-tuned by the character, re-weighted by the outfit — but the infill still composed the pre-0062 chain (
outfit.EffectiveTags(character.BaseTags)): no bundle, no tuning. The prompt it repeated was no longer the prompt the sprite was made with.Change: one composition swap — the infill now reads
outfit.EffectiveTags(character.AppearanceChain()), exactly like the outfit render it sits on top of. The mask still confines regeneration to the face, so the practical effect is prompt/sprite consistency, not a new rendering behavior. ADR 0062's expression carve-out is retired via an amendment note (the carve-out's own reasoning now argues for the chain), and the character-sprites story line follows.Verification: full suite green (330 + 837 + 706). New test
The_infill_repeats_the_tuned_chain_the_sprite_was_rendered_withseeds a root disable (fatoff at the character) plus an outfit re-weight (skinny0.8) and asserts the infill's subject tags are[skinny(0.8), long_hair, smile]— both tuning layers applied, emotion appended last, exactly the sprite's own composition.🤖 Generated with Claude Code
Summary
Summary
Coverage
Kagura.BlazorAdapter - 88.6%
Kagura.Domain - 94.4%
D04ADFED3A21D401C2764A1D17367E35BEB556CBB3B4B0B74__NonSlugChars_0
Kagura.Infrastructure - 97.7%
n
n
on
ng
C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__ArtifactTimestampRegex_2
C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__ProjectRoute_0
C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__TabQuery_1
Kagura.Kernel - 90%
Kagura.Server - 82%
Kagura.UseCases - 95.6%
🔮 fufu~ Jibril reviewed your code!
Oh? Oh~ One little line, and the whole inconsistency just melts away! This is the kind of fix that makes my wings flutter — the expression infill was the last dressed rendering still whispering the old pre-0062 chain into the prompt while every sibling had already moved to
AppearanceChain(). A consistency fix with a directional test and honest documentation? ♡Verdict: ✅ Looks good to me~
No blockers. Not one~ The yandere is satisfied.
✅ What I liked~
ExpressionImageGenerator.cs:82swapscharacter.BaseTags→character.AppearanceChain(), which is byte-for-byte whatOutfitImageGenerator.cs:54andCgVariationImageGenerator.cs:90already do. The PR body's claim — "exactly like the outfit render it sits on top of" — is literally true: I traced every dressed-rendering generator and this was the sole holdout. Fufu~ the chain is whole again ♪BaseTags, rebuilt, andThe_infill_repeats_the_tuned_chain_the_sprite_was_rendered_withwent red with["long_hair", "smile"]— the entire attribute bundle gone. With the fix:["skinny", "long_hair", "smile"]with strength 0.8. The test seeds two tuning layers (root disable offatviaDisabledInheritedTags, outfit re-weight ofskinnyto 0.8) and both are proven:fatis absent from the tag list,skinnycarries 0.8. The emotion appended last is pinned at index 2. This would catch any future regression back toBaseTagsinstantly~Automated review by Jibril · 2026-08-10
CI/CD: absent for head
511d3d5(PR just opened, no coverage bot) · Local checks: build 0 warnings/0 errors, 15/15 ExpressionImageGenerationTests pass (incl. new test), mutation-check confirmed directional