feat(cg): the CG editor shell — variations, their timeline, and the set's gallery #217

Merged
bjoern merged 5 commits from feat/cg-editor-shell into main 2026-08-05 06:30:20 +02:00
Member

Slice 3 of the event-CG arc: the full-screen CG editor (ADR 0054) exists and is filled with its first real content — variations and their generation timeline.

What this adds

Variations and their timeline (ADR 0046/0049). CgVariation (own tags, disabled inherited tags, a published-generation pointer, per-record style tuning) and CgGeneration (an append-only render log with a frozen prompt snapshot, Pinned from day one so later retention cannot evict rows by surprise). Composition is plain indexed Guids like Outfit/LocationVariant — no EF relationship. Renders accumulate as files; publishing moves the pointer, not bytes.

The editor shell (ADR 0054). Five fixed regions — toolbar, canvas, right panel (Tags/Cast tabs), timeline, generate — as one CSS grid that fills the app shell's content area exactly. The page never scrolls; the panel's surface and the timeline scroll themselves. Browser-verified at 1920×1080: the computed grid resolves to the sketch, and scrollHeight == clientHeight.

The set page becomes document + gallery. Tag authoring, style controls and Generate moved off the set page into the editor; the set page keeps name, description, the establishing image and a gallery of cards that open the editor. Creating a variation requires a name and lands straight in its editor.

Inherited rows (ADR 0047). The Tags tab shows the set's scene tags as inherited rows with checkboxes; unticking persists the disable on the variation, and Generate judges the effective prompt — an inherited positive tag is enough on its own.

Cross-session sync. CgVariation joins EntityKinds, and both the gallery and the editor handle DomainChangesReceived (the editor also reloads on its set's changes, since those tags are its inherited rows; never while a save is pending).

Found by verification, not by tests

  • SQLite cannot ORDER BY a DateTimeOffset — both new entities' timestamp columns now go through UtcTicksConverter; without it the gallery and timeline queries threw at first contact.
  • The assistant's floating button sat on top of Generate; the generate region yields the corner (the FAB is fixed-position outside the subtree, so its offset cannot be raised from the editor's stylesheet).
  • The editor sits outside WorkspaceShell and mounted no KaguraStoreInitializer — it only worked because the layout islands carry theirs, and in bUnit every dispatched action queued forever. It mounts its own now.

Coverage and contracts

  • 97 CG adapter tests (reducers, effects, the editor page, the gallery) — the behaviour ADR 0054 moved off the set page is pinned again, not deleted.
  • The seed grows two variations under "The rooftop confession", one with a disabled inherited tag, so the editor opens onto authored content and the cleared checkbox shows.
  • Assistant tools: get_cg_variation, create_cg_variation, update_cg_variation (partial, style tuning threaded through), delete_cg_variation; get_event_cg now lists its variations.

Known open point

ADR 0054 §2 says the set's establishing image opens the editor too. It doesn't yet: that image has no generation timeline (ADR 0046 replaces it in place), so the editor would need a second mode the ADR never specified. The gallery shows it as a deliberately non-clickable card with a comment saying why — I'd rather decide that gap explicitly than improvise it here.

Full suite: 1717 green (312 use-case / 777 adapter / 628 integration).

🤖 Generated with Claude Code

Slice 3 of the event-CG arc: the full-screen CG editor (ADR 0054) exists and is filled with its first real content — variations and their generation timeline. ## What this adds **Variations and their timeline (ADR 0046/0049).** `CgVariation` (own tags, disabled inherited tags, a published-generation pointer, per-record style tuning) and `CgGeneration` (an append-only render log with a frozen prompt snapshot, `Pinned` from day one so later retention cannot evict rows by surprise). Composition is plain indexed Guids like `Outfit`/`LocationVariant` — no EF relationship. Renders accumulate as files; publishing moves the pointer, not bytes. **The editor shell (ADR 0054).** Five fixed regions — toolbar, canvas, right panel (Tags/Cast tabs), timeline, generate — as one CSS grid that fills the app shell's content area exactly. The page never scrolls; the panel's surface and the timeline scroll themselves. Browser-verified at 1920×1080: the computed grid resolves to the sketch, and `scrollHeight == clientHeight`. **The set page becomes document + gallery.** Tag authoring, style controls and Generate moved off the set page into the editor; the set page keeps name, description, the establishing image and a gallery of cards that open the editor. Creating a variation requires a name and lands straight in its editor. **Inherited rows (ADR 0047).** The Tags tab shows the set's scene tags as inherited rows with checkboxes; unticking persists the disable on the variation, and Generate judges the effective prompt — an inherited positive tag is enough on its own. **Cross-session sync.** `CgVariation` joins `EntityKinds`, and both the gallery and the editor handle `DomainChangesReceived` (the editor also reloads on its set's changes, since those tags are its inherited rows; never while a save is pending). ## Found by verification, not by tests - SQLite cannot `ORDER BY` a `DateTimeOffset` — both new entities' timestamp columns now go through `UtcTicksConverter`; without it the gallery and timeline queries threw at first contact. - The assistant's floating button sat on top of Generate; the generate region yields the corner (the FAB is fixed-position outside the subtree, so its offset cannot be raised from the editor's stylesheet). - The editor sits outside `WorkspaceShell` and mounted no `KaguraStoreInitializer` — it only worked because the layout islands carry theirs, and in bUnit every dispatched action queued forever. It mounts its own now. ## Coverage and contracts - 97 CG adapter tests (reducers, effects, the editor page, the gallery) — the behaviour ADR 0054 moved off the set page is pinned again, not deleted. - The seed grows two variations under "The rooftop confession", one with a disabled inherited tag, so the editor opens onto authored content and the cleared checkbox shows. - Assistant tools: `get_cg_variation`, `create_cg_variation`, `update_cg_variation` (partial, style tuning threaded through), `delete_cg_variation`; `get_event_cg` now lists its variations. ## Known open point ADR 0054 §2 says the set's establishing image opens the editor too. It doesn't yet: that image has no generation timeline (ADR 0046 replaces it in place), so the editor would need a second mode the ADR never specified. The gallery shows it as a deliberately non-clickable card with a comment saying why — I'd rather decide that gap explicitly than improvise it here. Full suite: 1717 green (312 use-case / 777 adapter / 628 integration). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The record half of slice 3. A CgVariation is owned composition under its set —
inherited scene tags with per-tag disable, its own tags, style tuning — and its
renders accumulate as CgGeneration rows instead of overwriting one file.

Three things differ from every sibling asset path, all of them ADR 0049:

- the asset store's saver deliberately does NOT clear the folder first, because
  the folder is the timeline; eviction is the retention policy's job, not a side
  effect of writing the next render;
- each render is named by its own id, so entries never collide;
- the variation carries a published-generation *pointer*, so publishing an older
  entry updates every reference without moving bytes. The pointer is unjournaled,
  like every other image reference.

Each row freezes the prompt that made it, which is what lets the cast be linked
live (ADR 0046) — subjects are empty until the cast slice, and the spec already
takes them (ADR 0048), so that is an addition rather than a change.

BacklinkCompletenessTests caught the parent mapped as a real EF relationship: an
FK to an Entry is a typed structural reference (ADR 0019) that backlink views must
show, and composition is not an association anyone looks for in a Connections
panel. Now an indexed column, the shape Outfit, LocationVariant and Expression
already use.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The UI half of slice 3 (ADR 0054). Five fixed regions filling the app shell's
content area — toolbar, canvas, panel with Tags/Cast tabs, timeline, Generate —
defined in ONE stylesheet, because the editor__* rules copied across six of them
are what let slice 1 ship a page with no layout at all.

The page never scrolls: the panel's surface and the timeline scroll themselves.
The editor sits outside WorkspaceShell deliberately — the side menu and breadcrumb
are record navigation, and this is a tool.

The set's page becomes a document plus a gallery: name, description, Connections,
History, and pictures that open the editor. Its tag tables, style sliders and
generate button are gone; the profile save carries the stored values through
untouched so a save from this page can never reset what it no longer authors.

The three set-page tests asserting tags/style/generate are removed rather than
weakened — that behaviour moved to the editor and belongs in the editor's own
test file, which this commit does not yet add.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Browser verification caught both; neither had a test, and both are invisible to a
markup assertion.

SQLite has no DateTimeOffset and cannot ORDER BY one, so the gallery's and the
timeline's list queries threw at runtime the first time a page asked for them.
Every other entity converts its timestamps to ticks; the two new ones did not.
The conversion is load-bearing here rather than cosmetic, so it is commented as
such — and the migration and snapshot move to INTEGER with it.

The assistant's floating button pins itself to the bottom-right corner, which is
where ADR 0054 puts Generate. Measured: the button overlapped the action's right
end and would have eaten clicks on it. The FAB is fixed-position and rendered
outside this subtree, so --kg-fab-bottom cannot be raised from the editor's
stylesheet; the generate region yields the corner instead.

Verified against the render, not the text: grid resolves to the sketch's areas
("toolbar panel" / "canvas panel" / "timeline generate"), the panel spans both
upper rows, the page does not overflow its viewport at 1920x1080, and switching
panel tabs never introduces a page scrollbar.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
feat(cg): the editor's inherited rows, cross-session sync, tests, seed and assistant tools
All checks were successful
CI / build (pull_request) Successful in 36s
CI / test (pull_request) Successful in 1m45s
2a18818b16
The Tags tab now shows the set's scene tags as inherited rows the variation can turn
off (ADR 0047) — the hint promised this and the UI could not do it. Loading the editor
brings the set's tags along, and CanGenerate judges the effective prompt, so an
inherited positive tag is enough on its own.

CgVariation joins EntityKinds and both the gallery and the editor handle
DomainChangesReceived — without the constant and a handler the adopt-when-idle logic
could never fire (the EntityKinds remark warns about exactly this). The editor also
reloads on its set's changes, whose tags are its inherited rows.

The editor mounts KaguraStoreInitializer itself: it sits outside WorkspaceShell, so it
only worked because the layout islands happen to carry theirs — and in bUnit every
dispatched action sat in Fluxor's queue forever.

97 CG adapter tests now pin the behaviour ADR 0054 moved off the set page: reducers,
effects, the editor page and the gallery. The seed grows two variations (one with a
disabled inherited tag), and the assistant gains get/create/update/delete variation
tools, with get_event_cg listing its variations.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>

Summary

Summary
Generated on: 08/04/2026 - 21:47:57
Coverage date: 08/04/2026 - 21:46:46 - 08/04/2026 - 21:47:53
Parser: MultiReport (3x Cobertura)
Assemblies: 6
Classes: 1165
Files: 612
Line coverage: 96% (51049 of 53128)
Covered lines: 51049
Uncovered lines: 2079
Coverable lines: 53128
Total lines: 82611
Branch coverage: 76.6% (5258 of 6861)
Covered branches: 5258
Total branches: 6861
Method coverage: Feature is only available for sponsors

Coverage

Kagura.BlazorAdapter - 88.3%
Name Line Branch
Kagura.BlazorAdapter 88.3% 77.5%
Kagura.BlazorAdapter.Assistant.AssistantCapabilityChecked 100%
Kagura.BlazorAdapter.Assistant.AssistantChangeMade 100%
Kagura.BlazorAdapter.Assistant.AssistantConversationHydrated 100%
Kagura.BlazorAdapter.Assistant.AssistantEffects 62.5% 100%
Kagura.BlazorAdapter.Assistant.AssistantFailed 100%
Kagura.BlazorAdapter.Assistant.AssistantNoticed 100%
Kagura.BlazorAdapter.Assistant.AssistantPanel 90.6% 85.8%
Kagura.BlazorAdapter.Assistant.AssistantReducers 100% 75%
Kagura.BlazorAdapter.Assistant.AssistantSaid 100%
Kagura.BlazorAdapter.Assistant.AssistantState 100%
Kagura.BlazorAdapter.Assistant.AssistantToolCalled 100%
Kagura.BlazorAdapter.Assistant.AssistantUserSaid 100%
Kagura.BlazorAdapter.BlazorAdapterAssembly 100%
Kagura.BlazorAdapter.CmField 100% 75%
Kagura.BlazorAdapter.Connections.AddLinkModal 88.5% 81.5%
Kagura.BlazorAdapter.Connections.ConnectionsEffects 95.4% 80%
Kagura.BlazorAdapter.Connections.ConnectionsFailed 100%
Kagura.BlazorAdapter.Connections.ConnectionsLoaded 100%
Kagura.BlazorAdapter.Connections.ConnectionsPanel 100% 95.1%
Kagura.BlazorAdapter.Connections.ConnectionsReducers 100% 75%
Kagura.BlazorAdapter.Connections.ConnectionsState 90%
Kagura.BlazorAdapter.Connections.KindIcon 100%
Kagura.BlazorAdapter.Connections.LinkRequested 100%
Kagura.BlazorAdapter.Connections.LinkTargetsFound 100%
Kagura.BlazorAdapter.Connections.LoadConnections 100%
Kagura.BlazorAdapter.Connections.NodeKindIcons 100%
Kagura.BlazorAdapter.Connections.RemoveLinkRequested 100%
Kagura.BlazorAdapter.Connections.SearchLinkTargets 100%
Kagura.BlazorAdapter.Design 0% 0%
Kagura.BlazorAdapter.Diagnostics.AppErrorBoundary 100%
Kagura.BlazorAdapter.Diagnostics.CircuitError 100%
Kagura.BlazorAdapter.Diagnostics.CircuitErrorPanel 100%
Kagura.BlazorAdapter.Diagnostics.CircuitErrorSink 100% 85.7%
Kagura.BlazorAdapter.Diagnostics.KaguraStoreInitializer 92.3% 66.6%
Kagura.BlazorAdapter.EditorComponentsDemo 0%
Kagura.BlazorAdapter.FileUploadDemo 0%
Kagura.BlazorAdapter.Generation.ActivityQueueBridge 87.5% 50%
Kagura.BlazorAdapter.Generation.CancelActivityRequested 100%
Kagura.BlazorAdapter.Generation.GenerationQueueEffects 100%
Kagura.BlazorAdapter.Generation.GenerationQueueLoaded 100%
Kagura.BlazorAdapter.Generation.GenerationQueuePage 100% 100%
Kagura.BlazorAdapter.Generation.GenerationQueueReducers 100%
Kagura.BlazorAdapter.Generation.GenerationQueueState 100%
Kagura.BlazorAdapter.Generation.GenerationStatusBar 100% 95.4%
Kagura.BlazorAdapter.Generation.RemoveActivityRequested 100%
Kagura.BlazorAdapter.History.DiffValue 100% 87.5%
Kagura.BlazorAdapter.History.DocumentHistoryEffects 90% 68.7%
Kagura.BlazorAdapter.History.DocumentHistoryFailed 100%
Kagura.BlazorAdapter.History.DocumentHistoryLoaded 100%
Kagura.BlazorAdapter.History.DocumentHistoryPanel 79.3% 75%
Kagura.BlazorAdapter.History.DocumentHistoryReducers 95% 83.3%
Kagura.BlazorAdapter.History.DocumentHistoryState 100%
Kagura.BlazorAdapter.History.LoadDocumentHistory 100%
Kagura.BlazorAdapter.History.RevertCompleted 100%
Kagura.BlazorAdapter.History.RevertRequested 100%
Kagura.BlazorAdapter.History.RevisionDiffLoaded 100%
Kagura.BlazorAdapter.History.SelectRevision 100%
Kagura.BlazorAdapter.KnowledgeBase.AdoptEmotionsRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.BaseSpriteFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.BaseSpriteGenerated 100%
Kagura.BlazorAdapter.KnowledgeBase.CgEditorCapabilityChecked 100%
Kagura.BlazorAdapter.KnowledgeBase.CgEditorEffects 93.8% 95%
Kagura.BlazorAdapter.KnowledgeBase.CgEditorFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.CgEditorLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.CgEditorNotFound 100%
Kagura.BlazorAdapter.KnowledgeBase.CgEditorPage 87.2% 80.2%
Kagura.BlazorAdapter.KnowledgeBase.CgEditorReducers 100% 94.4%
Kagura.BlazorAdapter.KnowledgeBase.CgEditorState 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImage 0% 0%
Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageCapabilityChecked 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageEffects 86.3% 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageGenerated 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageReducers 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageState 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetCreated 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetDeleted 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorEffects 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorNotFound 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorPage 87.6% 67.3%
Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorReducers 100% 85.7%
Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorState 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetGallery 95.8% 77.7%
Kagura.BlazorAdapter.KnowledgeBase.CgSetOperationFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetSaved 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetsEffects 94.1% 75%
Kagura.BlazorAdapter.KnowledgeBase.CgSetsLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetsPage 95.4% 95.4%
Kagura.BlazorAdapter.KnowledgeBase.CgSetsReducers 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.CgSetsState 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.CgVariationCreated 100%
Kagura.BlazorAdapter.KnowledgeBase.CgVariationGenerated 100%
Kagura.BlazorAdapter.KnowledgeBase.CgVariationSaved 100%
Kagura.BlazorAdapter.KnowledgeBase.CgVariationsEffects 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.CgVariationsFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.CgVariationsLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.CgVariationsReducers 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.CgVariationsState 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterBaseSprite 91.3% 90%
Kagura.BlazorAdapter.KnowledgeBase.CharacterCreated 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterDeleted 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorEffects 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorNotFound 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorPage 92.9% 81.2%
Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorReducers 100% 92.8%
Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorState 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterImagesLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterOperationFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterOutfits 94.2% 83.3%
Kagura.BlazorAdapter.KnowledgeBase.CharacterPreview 88.1% 91.3%
Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewEffects 62.9% 25%
Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewFailed 0%
Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewReducers 83.3% 50%
Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewSaved 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewState 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterSaved 100%
Kagura.BlazorAdapter.KnowledgeBase.CharactersEffects 94.1% 75%
Kagura.BlazorAdapter.KnowledgeBase.CharactersLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.CharactersPage 95.8% 90.9%
Kagura.BlazorAdapter.KnowledgeBase.CharacterSpriteEffects 86.3% 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterSpriteReducers 100% 75%
Kagura.BlazorAdapter.KnowledgeBase.CharacterSpriteState 100%
Kagura.BlazorAdapter.KnowledgeBase.CharactersReducers 100% 87.5%
Kagura.BlazorAdapter.KnowledgeBase.CharactersState 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterTiers 100% 50%
Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceContextLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceEffects 77.7% 80%
Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterVoicePanel 95.3% 81%
Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceReducers 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterVoicesFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterVoicesLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceState 100%
Kagura.BlazorAdapter.KnowledgeBase.CreateCgSetFailed 0%
Kagura.BlazorAdapter.KnowledgeBase.CreateCgSetRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.CreateCgVariationRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.CreateCharacterFailed 0%
Kagura.BlazorAdapter.KnowledgeBase.CreateCharacterRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.CreateLocationFailed 0%
Kagura.BlazorAdapter.KnowledgeBase.CreateLocationRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.CreateLocationVariantRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.CreateLoreFailed 0%
Kagura.BlazorAdapter.KnowledgeBase.CreateLoreRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.CreateOutfitRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.CreateRelationshipRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.CreateTimelineEventRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.DeleteCgSetRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.DeleteCharacterRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.DeleteLocationRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.DeleteLocationVariantRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.DeleteLoreRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.DeleteOutfitRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.DeleteRelationshipRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.DeleteTimelineEventRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.ExpressionCapabilityChecked 100%
Kagura.BlazorAdapter.KnowledgeBase.ExpressionGenerated 100%
Kagura.BlazorAdapter.KnowledgeBase.ExpressionGenerationFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.ExpressionRemoved 100%
Kagura.BlazorAdapter.KnowledgeBase.ExpressionsEffects 87.9% 69.2%
Kagura.BlazorAdapter.KnowledgeBase.ExpressionsFailed 0%
Kagura.BlazorAdapter.KnowledgeBase.ExpressionsLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.ExpressionsReducers 85.7% 43.7%
Kagura.BlazorAdapter.KnowledgeBase.ExpressionsState 100%
Kagura.BlazorAdapter.KnowledgeBase.GenerateAllExpressions 100%
Kagura.BlazorAdapter.KnowledgeBase.GenerateBaseSprite 100%
Kagura.BlazorAdapter.KnowledgeBase.GenerateCgSetBaseImage 100%
Kagura.BlazorAdapter.KnowledgeBase.GenerateCgVariation 100%
Kagura.BlazorAdapter.KnowledgeBase.GenerateExpression 100%
Kagura.BlazorAdapter.KnowledgeBase.GenerateLocationBackground 100%
Kagura.BlazorAdapter.KnowledgeBase.GenerateLocationVariantImage 100%
Kagura.BlazorAdapter.KnowledgeBase.GenerateOutfitSprite 100%
Kagura.BlazorAdapter.KnowledgeBase.LabeledEntryMapping 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadCgEditor 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadCgSet 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadCgSets 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadCgVariations 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadCharacter 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadCharacterImages 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadCharacters 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadCharacterVoiceContext 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadCharacterVoices 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadExpressions 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadLocation 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadLocationHierarchy 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadLocationImages 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadLocations 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadLocationVariant 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadLocationVariants 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadLore 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadLoreEntry 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadOutfit 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadOutfits 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadRelationshipCast 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadRelationships 100%
Kagura.BlazorAdapter.KnowledgeBase.LoadTimeline 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationBackground 91.3% 90%
Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundCapabilityChecked 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundEffects 86.3% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundGenerated 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundReducers 100% 75%
Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundState 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationCreated 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationDeleted 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationEditorEffects 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationEditorLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationEditorNotFound 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationEditorPage 88.6% 75%
Kagura.BlazorAdapter.KnowledgeBase.LocationEditorReducers 86.9% 71.4%
Kagura.BlazorAdapter.KnowledgeBase.LocationEditorState 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyEffects 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyReducers 100% 75%
Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyState 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationImagesLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationOperationFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationPreview 91% 88.6%
Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewEffects 62.9% 25%
Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewFailed 0%
Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewReducers 83.3% 50%
Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewSaved 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewState 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationSaved 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationsEffects 94.1% 75%
Kagura.BlazorAdapter.KnowledgeBase.LocationsLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationsPage 95.4% 95.4%
Kagura.BlazorAdapter.KnowledgeBase.LocationsReducers 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationsState 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorEffects 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorNotFound 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorPage 88.8% 74%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorReducers 100% 93.7%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorSaved 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorState 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImage 93.1% 91.6%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageCapabilityChecked 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageEffects 86.3% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageGenerated 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageReducers 100% 75%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageState 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariants 94.2% 79.1%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsEffects 96.4% 83.3%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsReducers 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsState 100%
Kagura.BlazorAdapter.KnowledgeBase.LoreCategories 100% 50%
Kagura.BlazorAdapter.KnowledgeBase.LoreCreated 100%
Kagura.BlazorAdapter.KnowledgeBase.LoreDeleted 100%
Kagura.BlazorAdapter.KnowledgeBase.LoreEditorEffects 96.6% 87.5%
Kagura.BlazorAdapter.KnowledgeBase.LoreEditorLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.LoreEditorNotFound 100%
Kagura.BlazorAdapter.KnowledgeBase.LoreEditorPage 90.8% 75%
Kagura.BlazorAdapter.KnowledgeBase.LoreEditorReducers 86.9% 71.4%
Kagura.BlazorAdapter.KnowledgeBase.LoreEditorState 100%
Kagura.BlazorAdapter.KnowledgeBase.LoreEffects 94.1% 75%
Kagura.BlazorAdapter.KnowledgeBase.LoreLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.LoreOperationFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.LorePage 80% 78.5%
Kagura.BlazorAdapter.KnowledgeBase.LoreReducers 90.9% 87.5%
Kagura.BlazorAdapter.KnowledgeBase.LoreSaved 100%
Kagura.BlazorAdapter.KnowledgeBase.LoreState 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.NewTimelineEvent 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorEffects 96.4% 87.5%
Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorNotFound 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorPage 92.3% 75%
Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorReducers 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorSaved 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorState 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitExpressions 95.5% 92.8%
Kagura.BlazorAdapter.KnowledgeBase.OutfitFaceRegion 88.7% 70.2%
Kagura.BlazorAdapter.KnowledgeBase.OutfitsEffects 96.4% 83.3%
Kagura.BlazorAdapter.KnowledgeBase.OutfitsFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitsLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitSprite 92.5% 91.6%
Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteCapabilityChecked 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteEffects 86.3% 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteFailed 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteGenerated 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteReducers 100% 75%
Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteState 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitsReducers 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.OutfitsState 100%
Kagura.BlazorAdapter.KnowledgeBase.ParentCandidatesFound 100%
Kagura.BlazorAdapter.KnowledgeBase.ParentPickerModal 84.6% 89.2%
Kagura.BlazorAdapter.KnowledgeBase.PositioningPanel 100% 95.4%
Kagura.BlazorAdapter.KnowledgeBase.PreviewVoiceRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipCard 77.5% 63.3%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipCastLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipList 97.3% 88.4%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipModal 94.1% 94.7%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipsEffects 92.8% 77.7%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipsFailed 0%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipsLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipsPage 92.8% 87.5%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipsReducers 94.7% 75%
Kagura.BlazorAdapter.KnowledgeBase.RelationshipsState 100% 100%
Kagura.BlazorAdapter.KnowledgeBase.RemoveCharacterPreviewRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.RemoveExpressionRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.RemoveLocationPreviewRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.ReorderTimelineEventRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SaveCgSetRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SaveCgVariationRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SaveCharacterRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SaveFaceRegionsRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SaveLocationRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SaveLocationVariantRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SaveLoreRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SaveOutfitRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SearchParentCandidates 100%
Kagura.BlazorAdapter.KnowledgeBase.SetCgPanelTab 100%
Kagura.BlazorAdapter.KnowledgeBase.SetCgSetsFilter 100%
Kagura.BlazorAdapter.KnowledgeBase.SetCharacterPreviewRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SetCharactersFilter 100%
Kagura.BlazorAdapter.KnowledgeBase.SetCharactersTier 100%
Kagura.BlazorAdapter.KnowledgeBase.SetLocationPreviewRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SetLocationsFilter 100%
Kagura.BlazorAdapter.KnowledgeBase.SetLoreCategory 100%
Kagura.BlazorAdapter.KnowledgeBase.SetLoreFilter 100%
Kagura.BlazorAdapter.KnowledgeBase.SetParentRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.SetRelationshipsFilter 100%
Kagura.BlazorAdapter.KnowledgeBase.ShowCgGeneration 100%
Kagura.BlazorAdapter.KnowledgeBase.SpriteCapabilityChecked 100%
Kagura.BlazorAdapter.KnowledgeBase.StyleReferenceControls 100% 78.5%
Kagura.BlazorAdapter.KnowledgeBase.TimelineEffects 93.5% 70%
Kagura.BlazorAdapter.KnowledgeBase.TimelineEventCard 92.5% 80%
Kagura.BlazorAdapter.KnowledgeBase.TimelineEventEdit 100%
Kagura.BlazorAdapter.KnowledgeBase.TimelineFailed 0%
Kagura.BlazorAdapter.KnowledgeBase.TimelineLoaded 100%
Kagura.BlazorAdapter.KnowledgeBase.TimelinePage 95.8% 90%
Kagura.BlazorAdapter.KnowledgeBase.TimelineReducers 91.6% 75%
Kagura.BlazorAdapter.KnowledgeBase.TimelineSection 96.6% 91.6%
Kagura.BlazorAdapter.KnowledgeBase.TimelineState 100%
Kagura.BlazorAdapter.KnowledgeBase.UpdateRelationshipRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.UpdateTimelineEventRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.UploadVoiceClipRequested 100%
Kagura.BlazorAdapter.KnowledgeBase.VoiceClipSaved 100%
Kagura.BlazorAdapter.Notifications.DomainChangedBridge 88.8% 58.3%
Kagura.BlazorAdapter.Notifications.DomainChangesReceived 100% 100%
Kagura.BlazorAdapter.OverlayDemo 0% 0%
Kagura.BlazorAdapter.Projects.AssistantMemoryFailed 0%
Kagura.BlazorAdapter.Projects.AssistantMemorySaved 0%
Kagura.BlazorAdapter.Projects.ClearStyleReferenceRequested 100%
Kagura.BlazorAdapter.Projects.CreateProjectRequested 100%
Kagura.BlazorAdapter.Projects.DeleteProjectRequested 100%
Kagura.BlazorAdapter.Projects.LoadProjectAssets 100%
Kagura.BlazorAdapter.Projects.LoadWorkspace 100%
Kagura.BlazorAdapter.Projects.ProjectAssetsEffects 100%
Kagura.BlazorAdapter.Projects.ProjectAssetsFailed 100%
Kagura.BlazorAdapter.Projects.ProjectAssetsLoaded 100%
Kagura.BlazorAdapter.Projects.ProjectAssetsPage 94.2% 85.7%
Kagura.BlazorAdapter.Projects.ProjectAssetsReducers 100% 100%
Kagura.BlazorAdapter.Projects.ProjectAssetsState 100%
Kagura.BlazorAdapter.Projects.ProjectCreated 100%
Kagura.BlazorAdapter.Projects.ProjectCreateFailed 100%
Kagura.BlazorAdapter.Projects.ProjectDeleted 100%
Kagura.BlazorAdapter.Projects.ProjectSaved 100%
Kagura.BlazorAdapter.Projects.ProjectSaveFailed 100%
Kagura.BlazorAdapter.Projects.ProjectsEffects 100% 100%
Kagura.BlazorAdapter.Projects.ProjectsLoaded 100%
Kagura.BlazorAdapter.Projects.ProjectsPage 94.7% 100%
Kagura.BlazorAdapter.Projects.ProjectsReducers 100% 100%
Kagura.BlazorAdapter.Projects.ProjectsState 100% 100%
Kagura.BlazorAdapter.Projects.ProjectWorkspacePage 70.5% 63.8%
Kagura.BlazorAdapter.Projects.SaveAssistantMemoryRequested 0%
Kagura.BlazorAdapter.Projects.SaveProjectRequested 100%
Kagura.BlazorAdapter.Projects.SetProjectsFilter 100%
Kagura.BlazorAdapter.Projects.SetStageViewRequested 100%
Kagura.BlazorAdapter.Projects.SetStyleReferenceRequested 100%
Kagura.BlazorAdapter.Projects.SetStyleRequested 100%
Kagura.BlazorAdapter.Projects.StyleReferenceChanged 100%
Kagura.BlazorAdapter.Projects.StyleReferenceFailed 100%
Kagura.BlazorAdapter.Projects.WorkspaceCrumb 100%
Kagura.BlazorAdapter.Projects.WorkspaceEffects 82.3% 70.5%
Kagura.BlazorAdapter.Projects.WorkspaceLoaded 100%
Kagura.BlazorAdapter.Projects.WorkspaceReducers 80%
Kagura.BlazorAdapter.Projects.WorkspaceShell 100% 95%
Kagura.BlazorAdapter.Projects.WorkspaceState 100%
Kagura.BlazorAdapter.QuicklinkDemo 0%
Kagura.BlazorAdapter.RegionSelectorDemo 0% 0%
Kagura.BlazorAdapter.SelectDemo 0%
Kagura.BlazorAdapter.Settings.AssistantSkillsEffects 13.3% 0%
Kagura.BlazorAdapter.Settings.AssistantSkillsFailed 0%
Kagura.BlazorAdapter.Settings.AssistantSkillsLoaded 100%
Kagura.BlazorAdapter.Settings.AssistantSkillsReducers 28.5%
Kagura.BlazorAdapter.Settings.AssistantSkillsSection 32.4% 11.1%
Kagura.BlazorAdapter.Settings.AssistantSkillsState 100%
Kagura.BlazorAdapter.Settings.CheckTtsConnectionRequested 100%
Kagura.BlazorAdapter.Settings.CreateEmotionRequested 100%
Kagura.BlazorAdapter.Settings.CreateSkillRequested 0%
Kagura.BlazorAdapter.Settings.CreatorProfileFailed 0%
Kagura.BlazorAdapter.Settings.CreatorProfileSaved 0%
Kagura.BlazorAdapter.Settings.DeleteEmotionRequested 100%
Kagura.BlazorAdapter.Settings.EditSkillRequested 0%
Kagura.BlazorAdapter.Settings.EmotionCreated 100%
Kagura.BlazorAdapter.Settings.EmotionLibraryEffects 71.4% 37.5%
Kagura.BlazorAdapter.Settings.EmotionLibraryFailed 0%
Kagura.BlazorAdapter.Settings.EmotionLibraryLoaded 100%
Kagura.BlazorAdapter.Settings.EmotionLibraryReducers 96.5% 50%
Kagura.BlazorAdapter.Settings.EmotionLibrarySection 90.1% 80.7%
Kagura.BlazorAdapter.Settings.EmotionLibraryState 100%
Kagura.BlazorAdapter.Settings.NovelAiSettingsEffects 68.8% 50%
Kagura.BlazorAdapter.Settings.NovelAiSettingsFailed 100%
Kagura.BlazorAdapter.Settings.NovelAiSettingsLoaded 100%
Kagura.BlazorAdapter.Settings.NovelAiSettingsReducers 87.5% 25%
Kagura.BlazorAdapter.Settings.NovelAiSettingsSection 88.8% 91.6%
Kagura.BlazorAdapter.Settings.NovelAiSettingsState 100%
Kagura.BlazorAdapter.Settings.NovelAiTokenChecked 100%
Kagura.BlazorAdapter.Settings.OpenRouterModelsFailed 0%
Kagura.BlazorAdapter.Settings.OpenRouterModelsLoaded 100%
Kagura.BlazorAdapter.Settings.OpenRouterSettingsEffects 46.7% 27.7%
Kagura.BlazorAdapter.Settings.OpenRouterSettingsFailed 0%
Kagura.BlazorAdapter.Settings.OpenRouterSettingsLoaded 100%
Kagura.BlazorAdapter.Settings.OpenRouterSettingsReducers 77.2%
Kagura.BlazorAdapter.Settings.OpenRouterSettingsSection 91.1% 92.1%
Kagura.BlazorAdapter.Settings.OpenRouterSettingsState 100%
Kagura.BlazorAdapter.Settings.SaveCreatorProfileRequested 0%
Kagura.BlazorAdapter.Settings.SaveDefaultTagsRequested 100%
Kagura.BlazorAdapter.Settings.SaveEmotionRequested 100%
Kagura.BlazorAdapter.Settings.SaveNovelAiModelRequested 100%
Kagura.BlazorAdapter.Settings.SaveNovelAiTokenRequested 100%
Kagura.BlazorAdapter.Settings.SaveOpenRouterDescriberModelRequested 100%
Kagura.BlazorAdapter.Settings.SaveOpenRouterKeyRequested 100%
Kagura.BlazorAdapter.Settings.SaveOpenRouterModelRequested 100%
Kagura.BlazorAdapter.Settings.SaveOpenRouterReasoningEffortRequested 100%
Kagura.BlazorAdapter.Settings.SaveTtsFieldRequested 100%
Kagura.BlazorAdapter.Settings.SelectEmotion 100%
Kagura.BlazorAdapter.Settings.SetSkillPinnedRequested 0%
Kagura.BlazorAdapter.Settings.SetSkillStateRequested 0%
Kagura.BlazorAdapter.Settings.TokenVerdict 100%
Kagura.BlazorAdapter.Settings.TtsConnectionChecked 100%
Kagura.BlazorAdapter.Settings.TtsFieldSaved 100%
Kagura.BlazorAdapter.Settings.TtsSettingsEffects 73.5% 50%
Kagura.BlazorAdapter.Settings.TtsSettingsFailed 100%
Kagura.BlazorAdapter.Settings.TtsSettingsLoaded 100%
Kagura.BlazorAdapter.Settings.TtsSettingsReducers 100% 100%
Kagura.BlazorAdapter.Settings.TtsSettingsSection 77.9% 72.2%
Kagura.BlazorAdapter.Settings.TtsSettingsState 100%
Kagura.BlazorAdapter.Settings.TtsVerdict 100%
Kagura.BlazorAdapter.SliderDemo 0% 0%
Kagura.BlazorAdapter.Tags.ForgetTagAuthoringInstance 100%
Kagura.BlazorAdapter.Tags.PromptTagEditing 100% 76.3%
Kagura.BlazorAdapter.Tags.RequestSuggestions 100%
Kagura.BlazorAdapter.Tags.SearchTags 100%
Kagura.BlazorAdapter.Tags.SuggestionsReceived 100%
Kagura.BlazorAdapter.Tags.TagAuthoring 95.5% 78.8%
Kagura.BlazorAdapter.Tags.TagAuthoringEffects 100% 100%
Kagura.BlazorAdapter.Tags.TagAuthoringInstance 100%
Kagura.BlazorAdapter.Tags.TagAuthoringPage 0%
Kagura.BlazorAdapter.Tags.TagAuthoringReducers 100% 100%
Kagura.BlazorAdapter.Tags.TagAuthoringState 100% 100%
Kagura.BlazorAdapter.Tags.TagDatabaseChecked 100%
Kagura.BlazorAdapter.Tags.TagsSearched 100%
Kagura.BlazorAdapter.ToggleGroupDemo 0% 0%
Kagura.BlazorAdapter.VisualNovel.AddSceneCastRequested 100%
Kagura.BlazorAdapter.VisualNovel.AddSceneStepRequested 100%
Kagura.BlazorAdapter.VisualNovel.ChapterCreated 100%
Kagura.BlazorAdapter.VisualNovel.ChapterEditorDeleted 100%
Kagura.BlazorAdapter.VisualNovel.ChapterEditorEffects 90% 56.2%
Kagura.BlazorAdapter.VisualNovel.ChapterEditorLoaded 100%
Kagura.BlazorAdapter.VisualNovel.ChapterEditorNotFound 100%
Kagura.BlazorAdapter.VisualNovel.ChapterEditorPage 84.9% 70.4%
Kagura.BlazorAdapter.VisualNovel.ChapterEditorReducers 86.9% 42.8%
Kagura.BlazorAdapter.VisualNovel.ChapterEditorSaved 100%
Kagura.BlazorAdapter.VisualNovel.ChapterEditorState 100%
Kagura.BlazorAdapter.VisualNovel.ChapterOperationFailed 0%
Kagura.BlazorAdapter.VisualNovel.ChapterScenes 78.2% 65%
Kagura.BlazorAdapter.VisualNovel.ChaptersEffects 88.8% 64.2%
Kagura.BlazorAdapter.VisualNovel.ChaptersFailed 100%
Kagura.BlazorAdapter.VisualNovel.ChaptersLoaded 100%
Kagura.BlazorAdapter.VisualNovel.ChaptersPage 90.9% 90.9%
Kagura.BlazorAdapter.VisualNovel.ChaptersReducers 91.6% 100%
Kagura.BlazorAdapter.VisualNovel.ChaptersState 100%
Kagura.BlazorAdapter.VisualNovel.CreateChapterFailed 0%
Kagura.BlazorAdapter.VisualNovel.CreateChapterRequested 100%
Kagura.BlazorAdapter.VisualNovel.CreateSceneFailed 0%
Kagura.BlazorAdapter.VisualNovel.CreateSceneRequested 100%
Kagura.BlazorAdapter.VisualNovel.DeleteChapterRequested 100%
Kagura.BlazorAdapter.VisualNovel.DeleteSceneRequested 100%
Kagura.BlazorAdapter.VisualNovel.DeleteSceneStepRequested 100%
Kagura.BlazorAdapter.VisualNovel.GenerateStepAudioRequested 100%
Kagura.BlazorAdapter.VisualNovel.LoadChapter 100%
Kagura.BlazorAdapter.VisualNovel.LoadChapters 100%
Kagura.BlazorAdapter.VisualNovel.LoadPlayer 100%
Kagura.BlazorAdapter.VisualNovel.LoadScene 100%
Kagura.BlazorAdapter.VisualNovel.LoadScenes 100%
Kagura.BlazorAdapter.VisualNovel.LoadSceneSteps 100%
Kagura.BlazorAdapter.VisualNovel.PlayerEffects 100% 83.3%
Kagura.BlazorAdapter.VisualNovel.PlayerLoaded 100%
Kagura.BlazorAdapter.VisualNovel.PlayerPage 100% 78.2%
Kagura.BlazorAdapter.VisualNovel.PlayerReducers 100% 100%
Kagura.BlazorAdapter.VisualNovel.PlayerStage 98.2% 70.9%
Kagura.BlazorAdapter.VisualNovel.PlayerState 100% 83.3%
Kagura.BlazorAdapter.VisualNovel.RemoveSceneCastRequested 100%
Kagura.BlazorAdapter.VisualNovel.ReorderChaptersRequested 100%
Kagura.BlazorAdapter.VisualNovel.ReorderScenesRequested 0%
Kagura.BlazorAdapter.VisualNovel.ReorderSceneStepsRequested 100%
Kagura.BlazorAdapter.VisualNovel.SaveChapterRequested 100%
Kagura.BlazorAdapter.VisualNovel.SaveSceneRequested 100%
Kagura.BlazorAdapter.VisualNovel.SceneCast 100% 76.9%
Kagura.BlazorAdapter.VisualNovel.SceneCastAdded 100%
Kagura.BlazorAdapter.VisualNovel.SceneCastRemoved 100%
Kagura.BlazorAdapter.VisualNovel.SceneCreated 100%
Kagura.BlazorAdapter.VisualNovel.SceneEditorDeleted 100%
Kagura.BlazorAdapter.VisualNovel.SceneEditorEffects 92.1% 55.5%
Kagura.BlazorAdapter.VisualNovel.SceneEditorLoaded 100%
Kagura.BlazorAdapter.VisualNovel.SceneEditorNotFound 100%
Kagura.BlazorAdapter.VisualNovel.SceneEditorPage 87.9% 71.2%
Kagura.BlazorAdapter.VisualNovel.SceneEditorReducers 88.4% 42.8%
Kagura.BlazorAdapter.VisualNovel.SceneEditorSaved 100%
Kagura.BlazorAdapter.VisualNovel.SceneEditorState 100%
Kagura.BlazorAdapter.VisualNovel.SceneLineRow 88.5% 84.7%
Kagura.BlazorAdapter.VisualNovel.SceneLineStage 83.2% 71.4%
Kagura.BlazorAdapter.VisualNovel.SceneOperationFailed 0%
Kagura.BlazorAdapter.VisualNovel.SceneScript 91.4% 86.3%
Kagura.BlazorAdapter.VisualNovel.ScenesEffects 64.2% 35.7%
Kagura.BlazorAdapter.VisualNovel.ScenesFailed 100%
Kagura.BlazorAdapter.VisualNovel.ScenesLoaded 100%
Kagura.BlazorAdapter.VisualNovel.ScenesReducers 76.9% 83.3%
Kagura.BlazorAdapter.VisualNovel.ScenesState 100% 100%
Kagura.BlazorAdapter.VisualNovel.SceneStatuses 100% 50%
Kagura.BlazorAdapter.VisualNovel.SceneStepAdded 100%
Kagura.BlazorAdapter.VisualNovel.SceneStepDeleted 100%
Kagura.BlazorAdapter.VisualNovel.SceneStepSaved 100%
Kagura.BlazorAdapter.VisualNovel.SceneStepsEffects 81.3% 62.9%
Kagura.BlazorAdapter.VisualNovel.SceneStepsFailed 100%
Kagura.BlazorAdapter.VisualNovel.SceneStepsLoaded 100%
Kagura.BlazorAdapter.VisualNovel.SceneStepsReducers 97.2% 75%
Kagura.BlazorAdapter.VisualNovel.SceneStepsState 100% 50%
Kagura.BlazorAdapter.VisualNovel.SetScenesStatus 100%
Kagura.BlazorAdapter.VisualNovel.SetSceneStepStageRequested 100%
Kagura.BlazorAdapter.VisualNovel.StepAudioFailed 100%
Kagura.BlazorAdapter.VisualNovel.StepAudioFinished 100%
Kagura.BlazorAdapter.VisualNovel.StepAudioState 100%
Kagura.BlazorAdapter.VisualNovel.UpdateSceneStepRequested 100%
Kagura.Domain - 95.1%
Name Line Branch
Kagura.Domain 95.1% 91.4%
Kagura.Domain.Assistant.Skill 100% 90%
Kagura.Domain.Graph.Entry 100% 100%
Kagura.Domain.Graph.Link 100% 100%
Kagura.Domain.Graph.LinkRole 100% 100%
Kagura.Domain.Graph.LinkRoles 100%
Kagura.Domain.Graph.StructuralRef 100% 100%
Kagura.Domain.Graph.StructuralRefs 100% 100%
Kagura.Domain.Journal.ChangeLogEntry 100%
Kagura.Domain.KnowledgeBase.BodyTypes 100% 100%
Kagura.Domain.KnowledgeBase.CgGeneration 86.5%
Kagura.Domain.KnowledgeBase.CgPromptSnapshot 100%
Kagura.Domain.KnowledgeBase.CgSet 88%
Kagura.Domain.KnowledgeBase.CgSetProfile 54.5%
Kagura.Domain.KnowledgeBase.CgSubjectSnapshot 100%
Kagura.Domain.KnowledgeBase.CgVariation 92.4% 66.6%
Kagura.Domain.KnowledgeBase.CgVariationProfile 54.5%
Kagura.Domain.KnowledgeBase.Character 97.1% 100%
Kagura.Domain.KnowledgeBase.CharacterProfile 100%
Kagura.Domain.KnowledgeBase.CharacterVoice 100%
Kagura.Domain.KnowledgeBase.CupSizes 100% 100%
Kagura.Domain.KnowledgeBase.CuratedTag 100%
Kagura.Domain.KnowledgeBase.Emotion 87.8% 66.6%
Kagura.Domain.KnowledgeBase.EmotionProfile 50%
Kagura.Domain.KnowledgeBase.Expression 87%
Kagura.Domain.KnowledgeBase.ImageRegion 90% 100%
Kagura.Domain.KnowledgeBase.LabeledEntry 100%
Kagura.Domain.KnowledgeBase.Location 92.3% 100%
Kagura.Domain.KnowledgeBase.LocationProfile 100%
Kagura.Domain.KnowledgeBase.LocationVariant 92.5% 66.6%
Kagura.Domain.KnowledgeBase.LocationVariantProfile 100%
Kagura.Domain.KnowledgeBase.LoreEntry 100%
Kagura.Domain.KnowledgeBase.LoreProfile 100%
Kagura.Domain.KnowledgeBase.Outfit 93.4% 80%
Kagura.Domain.KnowledgeBase.OutfitProfile 100%
Kagura.Domain.KnowledgeBase.PromptTag 42.8% 100%
Kagura.Domain.KnowledgeBase.Relationship 91.8% 100%
Kagura.Domain.KnowledgeBase.RelationshipProfile 100%
Kagura.Domain.KnowledgeBase.RelationshipSecret 100% 75%
Kagura.Domain.KnowledgeBase.SpriteFramings 100% 100%
Kagura.Domain.KnowledgeBase.StyleReferenceTuning 100%
Kagura.Domain.KnowledgeBase.TimelineEvent 100% 100%
Kagura.Domain.Projects.Project 100% 90%
Kagura.Domain.Projects.Slug 100% 100%
Kagura.Domain.Settings.AppSetting 100%
Kagura.Domain.VisualNovel.Chapter 100% 100%
Kagura.Domain.VisualNovel.ChapterProfile 80%
Kagura.Domain.VisualNovel.EffectiveStage 100%
Kagura.Domain.VisualNovel.PlayerFrame 100%
Kagura.Domain.VisualNovel.PlayerSceneScript 100%
Kagura.Domain.VisualNovel.PlayerStep 100%
Kagura.Domain.VisualNovel.Scene 96.1% 83.3%
Kagura.Domain.VisualNovel.ScenePlayback 100% 100%
Kagura.Domain.VisualNovel.SceneProfile 100%
Kagura.Domain.VisualNovel.SceneStageProjection 100% 96.4%
Kagura.Domain.VisualNovel.SceneStep 100% 100%
Kagura.Domain.VisualNovel.SpriteLayout 100%
Kagura.Domain.VisualNovel.StageBackgroundChange 100%
Kagura.Domain.VisualNovel.StageCharacterChange 100%
Kagura.Domain.VisualNovel.StageCharacterState 100%
Kagura.Domain.VisualNovel.StageProjection 100% 100%
Kagura.Domain.VisualNovel.StageStepChanges 100%
Kagura.Domain.VisualNovel.StageView 100%
System.Text.RegularExpressions.Generated 90.2% 72.2%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE06CC341D340484
D04ADFED3A21D401C2764A1D17367E35BEB556CBB3B4B0B74__NonSlugChars_0
89.4% 75%
Kagura.Infrastructure - 97.6%
Name Line Branch
Kagura.Infrastructure 97.6% 72.4%
Kagura.Infrastructure.Assistant.AssistantContextResolver 94.1% 68.8%
Kagura.Infrastructure.Assistant.AssistantMutationTool`1 100% 87.5%
Kagura.Infrastructure.Assistant.AssistantTool`1 100% 100%
Kagura.Infrastructure.Assistant.AssistantToolContext 100%
Kagura.Infrastructure.Assistant.ChatSession 88.3% 46.1%
Kagura.Infrastructure.Assistant.DelegateProgress`1 100%
Kagura.Infrastructure.Assistant.EfSkillStore 100%
Kagura.Infrastructure.Assistant.InMemoryConversationStore 100% 87.5%
Kagura.Infrastructure.Assistant.ResolvedContext 100%
Kagura.Infrastructure.Assistant.Tools.BodyAttributeParams 100% 100%
Kagura.Infrastructure.Assistant.Tools.CharacterTiers 100% 100%
Kagura.Infrastructure.Assistant.Tools.CreateCgSetParams 0%
Kagura.Infrastructure.Assistant.Tools.CreateCgSetTool 13.7%
Kagura.Infrastructure.Assistant.Tools.CreateCgVariationParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateCgVariationTool 90.3%
Kagura.Infrastructure.Assistant.Tools.CreateChapterParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateChapterTool 93.3%
Kagura.Infrastructure.Assistant.Tools.CreateCharacterParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateCharacterTool 96.7%
Kagura.Infrastructure.Assistant.Tools.CreateLocationParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateLocationTool 93.6%
Kagura.Infrastructure.Assistant.Tools.CreateLocationVariantParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateLocationVariantTool 92.8%
Kagura.Infrastructure.Assistant.Tools.CreateLoreParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateLoreTool 94.5% 100%
Kagura.Infrastructure.Assistant.Tools.CreateOutfitParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateOutfitTool 94.7%
Kagura.Infrastructure.Assistant.Tools.CreateRelationshipParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateRelationshipTool 94.2%
Kagura.Infrastructure.Assistant.Tools.CreateSceneParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateSceneTool 93.9%
Kagura.Infrastructure.Assistant.Tools.CreateTimelineEventParams 100%
Kagura.Infrastructure.Assistant.Tools.CreateTimelineEventTool 95.8%
Kagura.Infrastructure.Assistant.Tools.DeleteCgSetParams 0%
Kagura.Infrastructure.Assistant.Tools.DeleteCgSetTool 14.2%
Kagura.Infrastructure.Assistant.Tools.DeleteCgVariationParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteCgVariationTool 90.4%
Kagura.Infrastructure.Assistant.Tools.DeleteChapterParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteChapterTool 95.2%
Kagura.Infrastructure.Assistant.Tools.DeleteCharacterParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteCharacterTool 95.2%
Kagura.Infrastructure.Assistant.Tools.DeleteLocationParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteLocationTool 95.2%
Kagura.Infrastructure.Assistant.Tools.DeleteLocationVariantParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteLocationVariantTool 95.6%
Kagura.Infrastructure.Assistant.Tools.DeleteLoreParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteLoreTool 95.2%
Kagura.Infrastructure.Assistant.Tools.DeleteOutfitParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteOutfitTool 95.6%
Kagura.Infrastructure.Assistant.Tools.DeleteRelationshipParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteRelationshipTool 100%
Kagura.Infrastructure.Assistant.Tools.DeleteSceneLineParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteSceneLineTool 100%
Kagura.Infrastructure.Assistant.Tools.DeleteSceneParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteSceneTool 95.2%
Kagura.Infrastructure.Assistant.Tools.DeleteTimelineEventParams 100%
Kagura.Infrastructure.Assistant.Tools.DeleteTimelineEventTool 100%
Kagura.Infrastructure.Assistant.Tools.EntryParam 100% 100%
Kagura.Infrastructure.Assistant.Tools.FindSimilarTagsParams 100%
Kagura.Infrastructure.Assistant.Tools.FindSimilarTagsTool 93.3%
Kagura.Infrastructure.Assistant.Tools.GenerateCharacterSpriteParams 100%
Kagura.Infrastructure.Assistant.Tools.GenerateCharacterSpriteTool 96.6%
Kagura.Infrastructure.Assistant.Tools.GenerateExpressionSpritesParams 100%
Kagura.Infrastructure.Assistant.Tools.GenerateExpressionSpritesTool 86.8% 50%
Kagura.Infrastructure.Assistant.Tools.GenerateLocationBackgroundParams 100%
Kagura.Infrastructure.Assistant.Tools.GenerateLocationBackgroundTool 93.3%
Kagura.Infrastructure.Assistant.Tools.GenerateOutfitSpriteParams 100%
Kagura.Infrastructure.Assistant.Tools.GenerateOutfitSpriteTool 73.3%
Kagura.Infrastructure.Assistant.Tools.GenerateVariantBackgroundParams 100%
Kagura.Infrastructure.Assistant.Tools.GenerateVariantBackgroundTool 94.1%
Kagura.Infrastructure.Assistant.Tools.GenerationLaunch 90.6% 62.5%
Kagura.Infrastructure.Assistant.Tools.GetCgSetParams 100%
Kagura.Infrastructure.Assistant.Tools.GetCgSetTool 95.5%
Kagura.Infrastructure.Assistant.Tools.GetCgVariationParams 0%
Kagura.Infrastructure.Assistant.Tools.GetCgVariationTool 16.1%
Kagura.Infrastructure.Assistant.Tools.GetChapterParams 100%
Kagura.Infrastructure.Assistant.Tools.GetChapterTool 97%
Kagura.Infrastructure.Assistant.Tools.GetCharacterParams 100%
Kagura.Infrastructure.Assistant.Tools.GetCharacterTool 98.3% 50%
Kagura.Infrastructure.Assistant.Tools.GetConnectionsParams 100%
Kagura.Infrastructure.Assistant.Tools.GetConnectionsTool 96.6%
Kagura.Infrastructure.Assistant.Tools.GetGenerationQueueTool 100% 50%
Kagura.Infrastructure.Assistant.Tools.GetLocationParams 100%
Kagura.Infrastructure.Assistant.Tools.GetLocationTool 97.3%
Kagura.Infrastructure.Assistant.Tools.GetLocationVariantParams 100%
Kagura.Infrastructure.Assistant.Tools.GetLocationVariantTool 100%
Kagura.Infrastructure.Assistant.Tools.GetLoreParams 100%
Kagura.Infrastructure.Assistant.Tools.GetLoreTool 96.2%
Kagura.Infrastructure.Assistant.Tools.GetOutfitParams 100%
Kagura.Infrastructure.Assistant.Tools.GetOutfitTool 100% 50%
Kagura.Infrastructure.Assistant.Tools.GetProjectOverviewTool 97.7%
Kagura.Infrastructure.Assistant.Tools.GetSceneParams 100%
Kagura.Infrastructure.Assistant.Tools.GetSceneStageOptionsTool 100%
Kagura.Infrastructure.Assistant.Tools.GetSceneTool 98% 100%
Kagura.Infrastructure.Assistant.Tools.GetTimelineTool 100%
Kagura.Infrastructure.Assistant.Tools.LinkRecordsParams 100%
Kagura.Infrastructure.Assistant.Tools.LinkRecordsTool 97.1%
Kagura.Infrastructure.Assistant.Tools.ListCgSetsTool 26.6%
Kagura.Infrastructure.Assistant.Tools.ListChaptersTool 100%
Kagura.Infrastructure.Assistant.Tools.ListCharactersTool 100%
Kagura.Infrastructure.Assistant.Tools.ListLocationsTool 100%
Kagura.Infrastructure.Assistant.Tools.ListLoreTool 100%
Kagura.Infrastructure.Assistant.Tools.ListRelationshipsTool 100% 100%
Kagura.Infrastructure.Assistant.Tools.ManageSkillParams 100%
Kagura.Infrastructure.Assistant.Tools.ManageSkillTool 92.7% 100%
Kagura.Infrastructure.Assistant.Tools.MemoryOperationParam 100%
Kagura.Infrastructure.Assistant.Tools.MemoryParams 100%
Kagura.Infrastructure.Assistant.Tools.MemoryTool 91.8% 76.6%
Kagura.Infrastructure.Assistant.Tools.MoveSceneLineParams 100%
Kagura.Infrastructure.Assistant.Tools.MoveSceneLineTool 87.8%
Kagura.Infrastructure.Assistant.Tools.NavigateToParams 100%
Kagura.Infrastructure.Assistant.Tools.NavigateToTool 80% 50%
Kagura.Infrastructure.Assistant.Tools.RedoTool 93.7%
Kagura.Infrastructure.Assistant.Tools.ResolveTagParams 100%
Kagura.Infrastructure.Assistant.Tools.ResolveTagTool 95%
Kagura.Infrastructure.Assistant.Tools.SceneLineParam 100%
Kagura.Infrastructure.Assistant.Tools.SceneScript 96.9% 100%
Kagura.Infrastructure.Assistant.Tools.SearchParams 100%
Kagura.Infrastructure.Assistant.Tools.SearchTagsParams 100%
Kagura.Infrastructure.Assistant.Tools.SearchTagsTool 100%
Kagura.Infrastructure.Assistant.Tools.SearchTool 86.2% 25%
Kagura.Infrastructure.Assistant.Tools.SetProjectStyleParams 100%
Kagura.Infrastructure.Assistant.Tools.SetProjectStyleTool 97.9% 92.8%
Kagura.Infrastructure.Assistant.Tools.SetSceneLineStageParams 100%
Kagura.Infrastructure.Assistant.Tools.SetSceneLineStageTool 97.4%
Kagura.Infrastructure.Assistant.Tools.SpriteFramingParams 100% 100%
Kagura.Infrastructure.Assistant.Tools.SpriteGenders 100% 100%
Kagura.Infrastructure.Assistant.Tools.StageBackgroundParam 100%
Kagura.Infrastructure.Assistant.Tools.StageCharacterParam 100%
Kagura.Infrastructure.Assistant.Tools.SuggestTagsParams 100%
Kagura.Infrastructure.Assistant.Tools.SuggestTagsTool 94.1%
Kagura.Infrastructure.Assistant.Tools.TagDetailsParams 100%
Kagura.Infrastructure.Assistant.Tools.TagDetailsTool 93.3%
Kagura.Infrastructure.Assistant.Tools.TagParam 100% 85.7%
Kagura.Infrastructure.Assistant.Tools.TagTools 100%
Kagura.Infrastructure.Assistant.Tools.UndoTool 94.1%
Kagura.Infrastructure.Assistant.Tools.UnlinkRecordsParams 100%
Kagura.Infrastructure.Assistant.Tools.UnlinkRecordsTool 88.2% 50%
Kagura.Infrastructure.Assistant.Tools.UpdateCgSetParams 0%
Kagura.Infrastructure.Assistant.Tools.UpdateCgSetTool 11.9%
Kagura.Infrastructure.Assistant.Tools.UpdateCgVariationParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateCgVariationTool 93.1%
Kagura.Infrastructure.Assistant.Tools.UpdateChapterParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateChapterTool 94.7%
Kagura.Infrastructure.Assistant.Tools.UpdateCharacterParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateCharacterTool 97.6%
Kagura.Infrastructure.Assistant.Tools.UpdateLocationParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateLocationTool 95.2%
Kagura.Infrastructure.Assistant.Tools.UpdateLocationVariantParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateLocationVariantTool 95.5%
Kagura.Infrastructure.Assistant.Tools.UpdateLoreParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateLoreTool 95.2%
Kagura.Infrastructure.Assistant.Tools.UpdateOutfitParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateOutfitTool 96.1%
Kagura.Infrastructure.Assistant.Tools.UpdateProjectParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateProjectTool 92.8%
Kagura.Infrastructure.Assistant.Tools.UpdateRelationshipParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateRelationshipTool 97.1%
Kagura.Infrastructure.Assistant.Tools.UpdateSceneLineParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateSceneLineTool 95.1% 75%
Kagura.Infrastructure.Assistant.Tools.UpdateSceneParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateSceneTool 95.4%
Kagura.Infrastructure.Assistant.Tools.UpdateTimelineEventParams 100%
Kagura.Infrastructure.Assistant.Tools.UpdateTimelineEventTool 96.2%
Kagura.Infrastructure.Assistant.Tools.ViewSkillParams 100%
Kagura.Infrastructure.Assistant.Tools.ViewSkillTool 100%
Kagura.Infrastructure.Assistant.Tools.WriteSceneLinesParams 100%
Kagura.Infrastructure.Assistant.Tools.WriteSceneLinesTool 93.6% 80%
Kagura.Infrastructure.Backups.BackupOptions 100%
Kagura.Infrastructure.Backups.BackupService 71.4% 83.3%
Kagura.Infrastructure.Backups.BackupWriter 92.3% 85.4%
Kagura.Infrastructure.DependencyInjection 100% 100%
Kagura.Infrastructure.Diagnostics.SqliteDatabaseSnapshotStore 100% 100%
Kagura.Infrastructure.Emotions.EfEmotionStore 92.3% 75%
Kagura.Infrastructure.Emotions.EmotionSeeder 100% 100%
Kagura.Infrastructure.Generation.ActivityQueue 99.3% 95.4%
Kagura.Infrastructure.Generation.ActivityQueueWorker 100%
Kagura.Infrastructure.Graph.EfGraphStore 98.2% 90.9%
Kagura.Infrastructure.Journal.EfChangeJournal 100%
Kagura.Infrastructure.Journal.EfDocumentReverter 95% 91.6%
Kagura.Infrastructure.Journal.EfUndoStore 98.4% 90.9%
Kagura.Infrastructure.Journal.OperationContext 100% 100%
Kagura.Infrastructure.Journal.SnapshotApplier 95% 90%
Kagura.Infrastructure.KnowledgeBase.CgSetImageGenerator 90.6% 37.5%
Kagura.Infrastructure.KnowledgeBase.CgVariationImageGenerator 91.3% 40%
Kagura.Infrastructure.KnowledgeBase.CharacterImageGenerator 97.8% 83.3%
Kagura.Infrastructure.KnowledgeBase.EfCgGenerationStore 91.6%
Kagura.Infrastructure.KnowledgeBase.EfCgSetStore 90.9% 50%
Kagura.Infrastructure.KnowledgeBase.EfCgVariationStore 90.9% 50%
Kagura.Infrastructure.KnowledgeBase.EfCharacterStore 92% 64.2%
Kagura.Infrastructure.KnowledgeBase.EfExpressionStore 96.1% 75%
Kagura.Infrastructure.KnowledgeBase.EfLocationStore 95.1% 80%
Kagura.Infrastructure.KnowledgeBase.EfLocationVariantStore 96.9% 83.3%
Kagura.Infrastructure.KnowledgeBase.EfLoreStore 100% 100%
Kagura.Infrastructure.KnowledgeBase.EfOutfitStore 95% 75%
Kagura.Infrastructure.KnowledgeBase.EfRelationshipStore 93.4% 60%
Kagura.Infrastructure.KnowledgeBase.EfTimelineStore 93.9% 75%
Kagura.Infrastructure.KnowledgeBase.ExpressionImageGenerator 94.4% 81.5%
Kagura.Infrastructure.KnowledgeBase.ImageSharpCropper 100% 100%
Kagura.Infrastructure.KnowledgeBase.LocationImageGenerator 97.6% 75%
Kagura.Infrastructure.KnowledgeBase.LocationVariantImageGenerator 95.7% 75%
Kagura.Infrastructure.KnowledgeBase.OutfitImageGenerator 97.1% 85.2%
Kagura.Infrastructure.KnowledgeBase.RegionMaskRasterizer 100% 100%
Kagura.Infrastructure.KnowledgeBase.SpriteEnrichment 91.1% 81.2%
Kagura.Infrastructure.Notifications.InProcessDomainChangedBus 100% 100%
Kagura.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.CgGenerationConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.CgSetConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.CgVariationConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.ChangeLogEntryConfiguratio
n
100%
Kagura.Infrastructure.Persistence.Configurations.ChapterConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.CharacterConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.EmotionConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.EntryConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.ExpressionConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.JsonColumnMapper 100%
Kagura.Infrastructure.Persistence.Configurations.LinkConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.LocationConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.LocationVariantConfigurati
on
100%
Kagura.Infrastructure.Persistence.Configurations.LoreEntryConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.OutfitConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.ProjectConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.RelationshipConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.SceneConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.SceneStepConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.SkillConfiguration 100%
Kagura.Infrastructure.Persistence.Configurations.TimelineEventConfiguration 100%
Kagura.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Kagura.Infrastructure.Persistence.KaguraDbContext 83.3% 88%
Kagura.Infrastructure.Persistence.KaguraDbContextFactory 0%
Kagura.Infrastructure.Persistence.Migrations.AddAppSettings 99.3%
Kagura.Infrastructure.Persistence.Migrations.AddCgSets 99.6%
Kagura.Infrastructure.Persistence.Migrations.AddCgVariations 99.5%
Kagura.Infrastructure.Persistence.Migrations.AddChangeLogUndoFlag 96.8%
Kagura.Infrastructure.Persistence.Migrations.AddChapters 99.5%
Kagura.Infrastructure.Persistence.Migrations.AddChapterStoryBeats 99.3%
Kagura.Infrastructure.Persistence.Migrations.AddCharacterBaseAppearance 98.4%
Kagura.Infrastructure.Persistence.Migrations.AddCharacterBaseImage 99%
Kagura.Infrastructure.Persistence.Migrations.AddCharacterBodyAttributes 99.1%
Kagura.Infrastructure.Persistence.Migrations.AddCharacterFraming 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddCharacterHeight 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddCharacterProfile 92.9%
Kagura.Infrastructure.Persistence.Migrations.AddCharacters 98.7%
Kagura.Infrastructure.Persistence.Migrations.AddCharacterTier 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddCharacterVoiceConfigs 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddCharacterVoiceProviderId 99.5%
Kagura.Infrastructure.Persistence.Migrations.AddEmotions 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddExpressions 99.5%
Kagura.Infrastructure.Persistence.Migrations.AddGraphEntryAndLink 97.7%
Kagura.Infrastructure.Persistence.Migrations.AddLocationBaseImage 99.1%
Kagura.Infrastructure.Persistence.Migrations.AddLocationBaseTags 99.1%
Kagura.Infrastructure.Persistence.Migrations.AddLocationHierarchy 96.6%
Kagura.Infrastructure.Persistence.Migrations.AddLocations 98.9%
Kagura.Infrastructure.Persistence.Migrations.AddLocationVariantImage 99.3%
Kagura.Infrastructure.Persistence.Migrations.AddLocationVariants 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddLocationVariantTags 98.8%
Kagura.Infrastructure.Persistence.Migrations.AddLoreEntries 99%
Kagura.Infrastructure.Persistence.Migrations.AddLoreEntryTables 97.8%
Kagura.Infrastructure.Persistence.Migrations.AddOutfitClothingTags 99.1%
Kagura.Infrastructure.Persistence.Migrations.AddOutfitDisabledInheritedTags 99.1%
Kagura.Infrastructure.Persistence.Migrations.AddOutfitFaceRegion 98.7%
Kagura.Infrastructure.Persistence.Migrations.AddOutfitImage 99.1%
Kagura.Infrastructure.Persistence.Migrations.AddOutfitReferenceTuning 99.2%
Kagura.Infrastructure.Persistence.Migrations.AddOutfits 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddOutfitUseBaseImageReference 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddPerRecordStyleReferenceTuni
ng
97.1%
Kagura.Infrastructure.Persistence.Migrations.AddProjectAssistantMemory 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddProjectDescription 98.1%
Kagura.Infrastructure.Persistence.Migrations.AddProjectStyleReference 99%
Kagura.Infrastructure.Persistence.Migrations.AddProjectStyleSource 99.2%
Kagura.Infrastructure.Persistence.Migrations.AddRelationships 99.2%
Kagura.Infrastructure.Persistence.Migrations.AddSceneMetadata 97.3%
Kagura.Infrastructure.Persistence.Migrations.AddScenes 99.5%
Kagura.Infrastructure.Persistence.Migrations.AddSceneSteps 99.5%
Kagura.Infrastructure.Persistence.Migrations.AddSceneStepStage 99%
Kagura.Infrastructure.Persistence.Migrations.AddSceneStepVoice 99.4%
Kagura.Infrastructure.Persistence.Migrations.AddSkills 99.6%
Kagura.Infrastructure.Persistence.Migrations.AddSoftDeleteAndChangeLog 90.3%
Kagura.Infrastructure.Persistence.Migrations.AddStageViews 98.3%
Kagura.Infrastructure.Persistence.Migrations.AddTimelineEvents 99.2%
Kagura.Infrastructure.Persistence.Migrations.CharacterPreviewImage 99.3%
Kagura.Infrastructure.Persistence.Migrations.InitialCreate 94.4%
Kagura.Infrastructure.Persistence.Migrations.KaguraDbContextModelSnapshot 100%
Kagura.Infrastructure.Persistence.Migrations.LocationPreviewImage 99.3%
Kagura.Infrastructure.Persistence.Migrations.MultiFaceRegions 98.2%
Kagura.Infrastructure.Persistence.Migrations.ReferenceStrengthDefault 98.8%
Kagura.Infrastructure.Projects.EfProjectStore 93.5% 71.4%
Kagura.Infrastructure.Projects.FileSystemProjectAssetStore 89.4% 71.5%
Kagura.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Kagura.Infrastructure.Settings.NovelAiGateway 76.4% 50%
Kagura.Infrastructure.Settings.OpenRouterGateway 85% 79.4%
Kagura.Infrastructure.Settings.SpriteRequestMapper 100% 100%
Kagura.Infrastructure.Tags.SqliteTagSearch 97.9% 87.9%
Kagura.Infrastructure.Tags.TagDatabaseOptions 100%
Kagura.Infrastructure.Tts.FishAudioTtsProvider 87.9% 58.6%
Kagura.Infrastructure.Tts.OpenAiCompatibleTtsProvider 87.5% 54.5%
Kagura.Infrastructure.Tts.PocketTtsProvider 76.4% 69%
Kagura.Infrastructure.Tts.Qwen3TtsProvider 87.3% 66.6%
Kagura.Infrastructure.Tts.SceneStepAudioGenerator 92.3% 71.4%
Kagura.Infrastructure.Tts.TtsProviderRegistry 100%
Kagura.Infrastructure.Tts.VoicePreviewGenerator 91.3% 67.8%
Kagura.Infrastructure.VisualNovel.EfChapterStore 93.7% 75%
Kagura.Infrastructure.VisualNovel.EfSceneStepStore 91.8% 66.6%
Kagura.Infrastructure.VisualNovel.EfSceneStore 93.7% 75%
System.Text.RegularExpressions.Generated 83.4% 68%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FFD7A84EAF2E5F7B
C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__ArtifactTimestampRegex_2
81.9% 62.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FFD7A84EAF2E5F7B
C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__ProjectRoute_0
88.5% 80.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FFD7A84EAF2E5F7B
C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__TabQuery_1
80.7% 62.5%
Kagura.Kernel - 90%
Name Line Branch
Kagura.Kernel 90% 75%
Kagura.Kernel.Err`1 100%
Kagura.Kernel.Ok`1 100%
Kagura.Kernel.Result`1 87.5% 75%
Kagura.Server - 80.9%
Name Line Branch
Kagura.Server 80.9% 75.9%
Kagura.Server.Components.App 100%
Kagura.Server.Components.Layout.MainLayout 100%
Kagura.Server.Components.Pages.Error 100% 50%
Kagura.Server.Components.Pages.Gate 100% 100%
Kagura.Server.Security.AccessGate 100% 83.3%
Kagura.Server.Security.AccessSecret 100% 100%
Program 74.3% 73%
Kagura.UseCases - 95.1%
Name Line Branch
Kagura.UseCases 95.1% 78.6%
Kagura.UseCases.Assistant.AssistantContext 100%
Kagura.UseCases.Assistant.AssistantEntry 100%
Kagura.UseCases.Assistant.AssistantEvent 100%
Kagura.UseCases.Assistant.ConversationSnapshot 100%
Kagura.UseCases.Assistant.ListSkills 100%
Kagura.UseCases.Assistant.MemoryDocument 89.1% 75%
Kagura.UseCases.Assistant.MemoryOperation 100%
Kagura.UseCases.Assistant.ReviewDue 100% 100%
Kagura.UseCases.Assistant.SaveCreatorProfile 75% 50%
Kagura.UseCases.Assistant.SaveProjectAssistantMemory 80% 50%
Kagura.UseCases.Assistant.SaveSkill 89.7% 77.2%
Kagura.UseCases.Assistant.SkillDto 75%
Kagura.UseCases.DependencyInjection 100%
Kagura.UseCases.Diagnostics.DatabaseSnapshot 100%
Kagura.UseCases.Diagnostics.DownloadDatabase 100%
Kagura.UseCases.Diagnostics.SeedDevData 100% 100%
Kagura.UseCases.Emotions.CreateEmotion 100% 66.6%
Kagura.UseCases.Emotions.DeleteEmotion 100% 100%
Kagura.UseCases.Emotions.EmotionDto 91.6%
Kagura.UseCases.Emotions.ListEmotions 100%
Kagura.UseCases.Emotions.UpdateEmotion 100% 50%
Kagura.UseCases.Generation.Activity`1 100% 50%
Kagura.UseCases.Generation.ActivityChanged 100%
Kagura.UseCases.Generation.ActivityOutcome 100%
Kagura.UseCases.Generation.ActivityProgress 100%
Kagura.UseCases.Generation.ActivityView 91.6%
Kagura.UseCases.Generation.GeneratedImage 100%
Kagura.UseCases.Generation.GenerationCanvas 100% 100%
Kagura.UseCases.Generation.GenerationSubject 100%
Kagura.UseCases.Generation.Img2ImgSource 100%
Kagura.UseCases.Generation.InpaintSource 100%
Kagura.UseCases.Generation.JobResult`1 100%
Kagura.UseCases.Generation.LineageReference 100%
Kagura.UseCases.Generation.SpriteGenerationSpec 100%
Kagura.UseCases.Generation.StyleReference 100%
Kagura.UseCases.Graph.EdgeGroup 100%
Kagura.UseCases.Graph.FindLinkTargets 100%
Kagura.UseCases.Graph.GetNodeGraph 97.5% 78.5%
Kagura.UseCases.Graph.GraphEdgeView 100%
Kagura.UseCases.Graph.LinkNodes 100% 100%
Kagura.UseCases.Graph.NodeGraphView 100%
Kagura.UseCases.Graph.NodeSummary 100%
Kagura.UseCases.Graph.RemoveLink 100% 100%
Kagura.UseCases.Graph.RestoreLink 100% 100%
Kagura.UseCases.Graph.StructuralEdge 100%
Kagura.UseCases.Journal.ChangeRecordView 57.1%
Kagura.UseCases.Journal.DocumentRevision 100%
Kagura.UseCases.Journal.FieldChange 100%
Kagura.UseCases.Journal.GetDocumentHistory 100%
Kagura.UseCases.Journal.GetEntityHistory 100%
Kagura.UseCases.Journal.GetRevisionDiff 100% 50%
Kagura.UseCases.Journal.GetUndoStatus 100%
Kagura.UseCases.Journal.Redo 100% 100%
Kagura.UseCases.Journal.RevertDocument 100% 100%
Kagura.UseCases.Journal.RevertOutcome 100%
Kagura.UseCases.Journal.RevisionCoalescer 100% 100%
Kagura.UseCases.Journal.RevisionDiff 80% 50%
Kagura.UseCases.Journal.RevisionDiffBuilder 98.4% 86.5%
Kagura.UseCases.Journal.RowChange 100%
Kagura.UseCases.Journal.Undo 100% 100%
Kagura.UseCases.Journal.UndoOutcome 100%
Kagura.UseCases.Journal.UndoStatus 100%
Kagura.UseCases.KnowledgeBase.AdoptEmotions 100% 100%
Kagura.UseCases.KnowledgeBase.CgGenerationDto 92.8% 100%
Kagura.UseCases.KnowledgeBase.CgSetDto 87.5%
Kagura.UseCases.KnowledgeBase.CgVariationDto 93.7%
Kagura.UseCases.KnowledgeBase.CharacterDto 98.2%
Kagura.UseCases.KnowledgeBase.CharacterSpriteContent 100%
Kagura.UseCases.KnowledgeBase.CreateCgSet 100%
Kagura.UseCases.KnowledgeBase.CreateCgVariation 88.8% 75%
Kagura.UseCases.KnowledgeBase.CreateCharacter 100%
Kagura.UseCases.KnowledgeBase.CreateLocation 100%
Kagura.UseCases.KnowledgeBase.CreateLocationVariant 100% 75%
Kagura.UseCases.KnowledgeBase.CreateLore 100%
Kagura.UseCases.KnowledgeBase.CreateOutfit 100% 75%
Kagura.UseCases.KnowledgeBase.CreateRelationship 93.3% 80%
Kagura.UseCases.KnowledgeBase.CreateTimelineEvent 100%
Kagura.UseCases.KnowledgeBase.DeleteCgSet 100% 100%
Kagura.UseCases.KnowledgeBase.DeleteCgVariation 100% 50%
Kagura.UseCases.KnowledgeBase.DeleteCharacter 100% 100%
Kagura.UseCases.KnowledgeBase.DeleteLocation 100% 100%
Kagura.UseCases.KnowledgeBase.DeleteLocationVariant 100% 100%
Kagura.UseCases.KnowledgeBase.DeleteLore 100% 100%
Kagura.UseCases.KnowledgeBase.DeleteOutfit 100% 100%
Kagura.UseCases.KnowledgeBase.DeleteRelationship 100% 50%
Kagura.UseCases.KnowledgeBase.DeleteTimelineEvent 100% 50%
Kagura.UseCases.KnowledgeBase.ExpressionView 100%
Kagura.UseCases.KnowledgeBase.FindParentCandidates 100% 50%
Kagura.UseCases.KnowledgeBase.GetCgSet 100% 100%
Kagura.UseCases.KnowledgeBase.GetCgVariation 100% 100%
Kagura.UseCases.KnowledgeBase.GetCharacter 100% 100%
Kagura.UseCases.KnowledgeBase.GetLocation 100% 100%
Kagura.UseCases.KnowledgeBase.GetLocationHierarchy 100%
Kagura.UseCases.KnowledgeBase.GetLocationVariant 100% 58.3%
Kagura.UseCases.KnowledgeBase.GetLore 100% 100%
Kagura.UseCases.KnowledgeBase.GetOutfit 100% 100%
Kagura.UseCases.KnowledgeBase.GetRelationshipsForCharacter 100%
Kagura.UseCases.KnowledgeBase.ListCgGenerations 100% 50%
Kagura.UseCases.KnowledgeBase.ListCgSets 100%
Kagura.UseCases.KnowledgeBase.ListCgVariations 100%
Kagura.UseCases.KnowledgeBase.ListCharacterImages 100% 92.8%
Kagura.UseCases.KnowledgeBase.ListCharacters 100%
Kagura.UseCases.KnowledgeBase.ListExpressions 100% 100%
Kagura.UseCases.KnowledgeBase.ListLocationImages 100% 90%
Kagura.UseCases.KnowledgeBase.ListLocations 100%
Kagura.UseCases.KnowledgeBase.ListLocationVariants 100%
Kagura.UseCases.KnowledgeBase.ListLore 100%
Kagura.UseCases.KnowledgeBase.ListOutfits 100%
Kagura.UseCases.KnowledgeBase.ListProjectAssets 100% 100%
Kagura.UseCases.KnowledgeBase.ListRelationships 100%
Kagura.UseCases.KnowledgeBase.ListTimeline 100%
Kagura.UseCases.KnowledgeBase.LocationDto 89.4%
Kagura.UseCases.KnowledgeBase.LocationHierarchyView 100%
Kagura.UseCases.KnowledgeBase.LocationPreviewSource 100%
Kagura.UseCases.KnowledgeBase.LocationVariantDto 91.6%
Kagura.UseCases.KnowledgeBase.LocationVariantEditorView 100%
Kagura.UseCases.KnowledgeBase.LoreDto 85.7%
Kagura.UseCases.KnowledgeBase.OpenCgGeneration 0% 0%
Kagura.UseCases.KnowledgeBase.OpenCgSetBase 0% 0%
Kagura.UseCases.KnowledgeBase.OpenCharacterBaseSprite 88.8% 70%
Kagura.UseCases.KnowledgeBase.OpenCharacterPreview 88.8% 60%
Kagura.UseCases.KnowledgeBase.OpenExpressionSprite 92.3% 68.7%
Kagura.UseCases.KnowledgeBase.OpenLocationBackground 88.8% 70%
Kagura.UseCases.KnowledgeBase.OpenLocationPreview 88.8% 60%
Kagura.UseCases.KnowledgeBase.OpenLocationVariant 90.9% 75%
Kagura.UseCases.KnowledgeBase.OpenOutfitSprite 90.9% 75%
Kagura.UseCases.KnowledgeBase.OutfitDto 96.7%
Kagura.UseCases.KnowledgeBase.OutfitEditorView 100%
Kagura.UseCases.KnowledgeBase.PreviewSource 100%
Kagura.UseCases.KnowledgeBase.ProjectAssetView 100%
Kagura.UseCases.KnowledgeBase.RelationshipDto 88%
Kagura.UseCases.KnowledgeBase.RelationshipEndpoint 100%
Kagura.UseCases.KnowledgeBase.RemoveCharacterPreview 75% 50%
Kagura.UseCases.KnowledgeBase.RemoveExpression 100% 100%
Kagura.UseCases.KnowledgeBase.RemoveLocationPreview 75% 50%
Kagura.UseCases.KnowledgeBase.ReorderTimelineEvent 94.1% 87.5%
Kagura.UseCases.KnowledgeBase.SetCharacterPreview 80.7% 63.8%
Kagura.UseCases.KnowledgeBase.SetLocationParent 90.4% 81.2%
Kagura.UseCases.KnowledgeBase.SetLocationPreview 93.7% 85.7%
Kagura.UseCases.KnowledgeBase.SetOutfitFaceRegions 100% 50%
Kagura.UseCases.KnowledgeBase.TimelineEventDto 88.8%
Kagura.UseCases.KnowledgeBase.UpdateCgSet 100% 100%
Kagura.UseCases.KnowledgeBase.UpdateCgVariation 100% 100%
Kagura.UseCases.KnowledgeBase.UpdateCharacter 100% 100%
Kagura.UseCases.KnowledgeBase.UpdateLocation 100% 100%
Kagura.UseCases.KnowledgeBase.UpdateLocationVariant 100% 100%
Kagura.UseCases.KnowledgeBase.UpdateLore 100% 100%
Kagura.UseCases.KnowledgeBase.UpdateOutfit 100% 100%
Kagura.UseCases.KnowledgeBase.UpdateRelationship 100% 50%
Kagura.UseCases.KnowledgeBase.UpdateTimelineEvent 100% 50%
Kagura.UseCases.Notifications.DomainChanged 100%
Kagura.UseCases.Projects.ClearProjectStyleReference 100% 100%
Kagura.UseCases.Projects.CreateProject 100% 100%
Kagura.UseCases.Projects.DeleteProject 100% 100%
Kagura.UseCases.Projects.GetProject 100% 100%
Kagura.UseCases.Projects.ListProjects 100%
Kagura.UseCases.Projects.OpenProjectStyleReference 100% 83.3%
Kagura.UseCases.Projects.ProjectDto 100%
Kagura.UseCases.Projects.SetProjectStageView 100% 50%
Kagura.UseCases.Projects.SetProjectStyle 100% 85%
Kagura.UseCases.Projects.SetProjectStyleReference 100% 100%
Kagura.UseCases.Projects.StyleReferenceContent 100%
Kagura.UseCases.Projects.UpdateProject 100% 100%
Kagura.UseCases.Settings.AssistantReasoningEfforts 100% 83.3%
Kagura.UseCases.Settings.CheckNovelAiToken 100% 100%
Kagura.UseCases.Settings.GenerationDefaultTagsJson 100% 100%
Kagura.UseCases.Settings.GetNovelAiSettings 100%
Kagura.UseCases.Settings.GetOpenRouterSettings 100% 100%
Kagura.UseCases.Settings.ListOpenRouterModels 100%
Kagura.UseCases.Settings.ModelReasoningSupport 100%
Kagura.UseCases.Settings.NovelAiModelOption 100%
Kagura.UseCases.Settings.NovelAiSettingsView 100%
Kagura.UseCases.Settings.OpenRouterModelOption 100%
Kagura.UseCases.Settings.OpenRouterSettingsView 100%
Kagura.UseCases.Settings.SaveGenerationDefaultTags 100%
Kagura.UseCases.Settings.SaveNovelAiModel 100%
Kagura.UseCases.Settings.SaveNovelAiToken 100% 100%
Kagura.UseCases.Settings.SaveOpenRouterKey 100% 100%
Kagura.UseCases.Settings.SaveOpenRouterModel 100%
Kagura.UseCases.Settings.SaveOpenRouterReasoningEffort 100%
Kagura.UseCases.Settings.SettingKeys 87.5% 75%
Kagura.UseCases.Tags.SimilarTag 100%
Kagura.UseCases.Tags.TagCategoryCount 100%
Kagura.UseCases.Tags.TagDetails 100%
Kagura.UseCases.Tags.TagResolution 100%
Kagura.UseCases.Tags.TagSearchFilter 100%
Kagura.UseCases.Tags.TagSuggestion 100%
Kagura.UseCases.Tags.TagSummary 83.3%
Kagura.UseCases.Tts.AudioContentTypes 62.5% 62.5%
Kagura.UseCases.Tts.CharacterVoiceConfig 100%
Kagura.UseCases.Tts.CheckTtsConnection 100% 100%
Kagura.UseCases.Tts.GeneratedAudio 100%
Kagura.UseCases.Tts.GetTtsSettings 100% 100%
Kagura.UseCases.Tts.ListTtsVoices 80% 50%
Kagura.UseCases.Tts.OpenSceneStepAudio 77.7% 50%
Kagura.UseCases.Tts.OpenVoiceClipByToken 92.3% 91.6%
Kagura.UseCases.Tts.SaveTtsProviderField 94.4% 88.8%
Kagura.UseCases.Tts.SceneStepAudioContent 100%
Kagura.UseCases.Tts.SetCharacterVoiceClip 88.8% 58.3%
Kagura.UseCases.Tts.TtsFieldView 100%
Kagura.UseCases.Tts.TtsProviderDescriptor 100%
Kagura.UseCases.Tts.TtsProviderView 100%
Kagura.UseCases.Tts.TtsSettingField 100%
Kagura.UseCases.Tts.TtsSettingsView 100%
Kagura.UseCases.Tts.TtsVoice 100%
Kagura.UseCases.Tts.TtsVoiceCapabilities 83.3%
Kagura.UseCases.Tts.TtsVoiceHandle 100%
Kagura.UseCases.Tts.VoiceReferenceClip 100%
Kagura.UseCases.VisualNovel.AddSceneStep 90% 50%
Kagura.UseCases.VisualNovel.ChapterDto 89.4%
Kagura.UseCases.VisualNovel.CreateChapter 100%
Kagura.UseCases.VisualNovel.CreateScene 100% 100%
Kagura.UseCases.VisualNovel.DeleteChapter 100% 50%
Kagura.UseCases.VisualNovel.DeleteScene 100% 50%
Kagura.UseCases.VisualNovel.DeleteSceneStep 100% 50%
Kagura.UseCases.VisualNovel.GetChapter 100% 100%
Kagura.UseCases.VisualNovel.GetPlayerScript 100% 70%
Kagura.UseCases.VisualNovel.GetScene 100% 100%
Kagura.UseCases.VisualNovel.GetSceneCast 100% 100%
Kagura.UseCases.VisualNovel.GetSceneStageOptions 100% 100%
Kagura.UseCases.VisualNovel.ListChapters 100%
Kagura.UseCases.VisualNovel.ListScenes 100%
Kagura.UseCases.VisualNovel.ListSceneSteps 100%
Kagura.UseCases.VisualNovel.PlayerSceneDto 100% 100%
Kagura.UseCases.VisualNovel.PlayerScriptDto 100%
Kagura.UseCases.VisualNovel.ReorderChapters 100%
Kagura.UseCases.VisualNovel.ReorderScenes 100%
Kagura.UseCases.VisualNovel.ReorderSceneSteps 100%
Kagura.UseCases.VisualNovel.SceneCastMember 100%
Kagura.UseCases.VisualNovel.SceneDto 96.5%
Kagura.UseCases.VisualNovel.SceneStageOptions 100%
Kagura.UseCases.VisualNovel.SceneStepDto 92.5%
Kagura.UseCases.VisualNovel.SetSceneStepStage 100% 50%
Kagura.UseCases.VisualNovel.StageBackgroundOption 100%
Kagura.UseCases.VisualNovel.StageCastOption 100%
Kagura.UseCases.VisualNovel.StageExpressionOption 100%
Kagura.UseCases.VisualNovel.StageOutfitOption 100%
Kagura.UseCases.VisualNovel.UpdateChapter 100% 50%
Kagura.UseCases.VisualNovel.UpdateScene 100% 50%
Kagura.UseCases.VisualNovel.UpdateSceneStep 100% 50%
<!-- coverage-comment --> # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 08/04/2026 - 21:47:57 | | Coverage date: | 08/04/2026 - 21:46:46 - 08/04/2026 - 21:47:53 | | Parser: | MultiReport (3x Cobertura) | | Assemblies: | 6 | | Classes: | 1165 | | Files: | 612 | | **Line coverage:** | 96% (51049 of 53128) | | Covered lines: | 51049 | | Uncovered lines: | 2079 | | Coverable lines: | 53128 | | Total lines: | 82611 | | **Branch coverage:** | 76.6% (5258 of 6861) | | Covered branches: | 5258 | | Total branches: | 6861 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Kagura.BlazorAdapter - 88.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.BlazorAdapter**|**88.3%**|**77.5%**| |Kagura.BlazorAdapter.Assistant.AssistantCapabilityChecked|100%|| |Kagura.BlazorAdapter.Assistant.AssistantChangeMade|100%|| |Kagura.BlazorAdapter.Assistant.AssistantConversationHydrated|100%|| |Kagura.BlazorAdapter.Assistant.AssistantEffects|62.5%|100%| |Kagura.BlazorAdapter.Assistant.AssistantFailed|100%|| |Kagura.BlazorAdapter.Assistant.AssistantNoticed|100%|| |Kagura.BlazorAdapter.Assistant.AssistantPanel|90.6%|85.8%| |Kagura.BlazorAdapter.Assistant.AssistantReducers|100%|75%| |Kagura.BlazorAdapter.Assistant.AssistantSaid|100%|| |Kagura.BlazorAdapter.Assistant.AssistantState|100%|| |Kagura.BlazorAdapter.Assistant.AssistantToolCalled|100%|| |Kagura.BlazorAdapter.Assistant.AssistantUserSaid|100%|| |Kagura.BlazorAdapter.BlazorAdapterAssembly|100%|| |Kagura.BlazorAdapter.CmField|100%|75%| |Kagura.BlazorAdapter.Connections.AddLinkModal|88.5%|81.5%| |Kagura.BlazorAdapter.Connections.ConnectionsEffects|95.4%|80%| |Kagura.BlazorAdapter.Connections.ConnectionsFailed|100%|| |Kagura.BlazorAdapter.Connections.ConnectionsLoaded|100%|| |Kagura.BlazorAdapter.Connections.ConnectionsPanel|100%|95.1%| |Kagura.BlazorAdapter.Connections.ConnectionsReducers|100%|75%| |Kagura.BlazorAdapter.Connections.ConnectionsState|90%|| |Kagura.BlazorAdapter.Connections.KindIcon|100%|| |Kagura.BlazorAdapter.Connections.LinkRequested|100%|| |Kagura.BlazorAdapter.Connections.LinkTargetsFound|100%|| |Kagura.BlazorAdapter.Connections.LoadConnections|100%|| |Kagura.BlazorAdapter.Connections.NodeKindIcons|100%|| |Kagura.BlazorAdapter.Connections.RemoveLinkRequested|100%|| |Kagura.BlazorAdapter.Connections.SearchLinkTargets|100%|| |Kagura.BlazorAdapter.Design|0%|0%| |Kagura.BlazorAdapter.Diagnostics.AppErrorBoundary|100%|| |Kagura.BlazorAdapter.Diagnostics.CircuitError|100%|| |Kagura.BlazorAdapter.Diagnostics.CircuitErrorPanel|100%|| |Kagura.BlazorAdapter.Diagnostics.CircuitErrorSink|100%|85.7%| |Kagura.BlazorAdapter.Diagnostics.KaguraStoreInitializer|92.3%|66.6%| |Kagura.BlazorAdapter.EditorComponentsDemo|0%|| |Kagura.BlazorAdapter.FileUploadDemo|0%|| |Kagura.BlazorAdapter.Generation.ActivityQueueBridge|87.5%|50%| |Kagura.BlazorAdapter.Generation.CancelActivityRequested|100%|| |Kagura.BlazorAdapter.Generation.GenerationQueueEffects|100%|| |Kagura.BlazorAdapter.Generation.GenerationQueueLoaded|100%|| |Kagura.BlazorAdapter.Generation.GenerationQueuePage|100%|100%| |Kagura.BlazorAdapter.Generation.GenerationQueueReducers|100%|| |Kagura.BlazorAdapter.Generation.GenerationQueueState|100%|| |Kagura.BlazorAdapter.Generation.GenerationStatusBar|100%|95.4%| |Kagura.BlazorAdapter.Generation.RemoveActivityRequested|100%|| |Kagura.BlazorAdapter.History.DiffValue|100%|87.5%| |Kagura.BlazorAdapter.History.DocumentHistoryEffects|90%|68.7%| |Kagura.BlazorAdapter.History.DocumentHistoryFailed|100%|| |Kagura.BlazorAdapter.History.DocumentHistoryLoaded|100%|| |Kagura.BlazorAdapter.History.DocumentHistoryPanel|79.3%|75%| |Kagura.BlazorAdapter.History.DocumentHistoryReducers|95%|83.3%| |Kagura.BlazorAdapter.History.DocumentHistoryState|100%|| |Kagura.BlazorAdapter.History.LoadDocumentHistory|100%|| |Kagura.BlazorAdapter.History.RevertCompleted|100%|| |Kagura.BlazorAdapter.History.RevertRequested|100%|| |Kagura.BlazorAdapter.History.RevisionDiffLoaded|100%|| |Kagura.BlazorAdapter.History.SelectRevision|100%|| |Kagura.BlazorAdapter.KnowledgeBase.AdoptEmotionsRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.BaseSpriteFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.BaseSpriteGenerated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgEditorCapabilityChecked|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgEditorEffects|93.8%|95%| |Kagura.BlazorAdapter.KnowledgeBase.CgEditorFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgEditorLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgEditorNotFound|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgEditorPage|87.2%|80.2%| |Kagura.BlazorAdapter.KnowledgeBase.CgEditorReducers|100%|94.4%| |Kagura.BlazorAdapter.KnowledgeBase.CgEditorState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImage|0%|0%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageCapabilityChecked|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageEffects|86.3%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageGenerated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageReducers|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetBaseImageState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetCreated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetDeleted|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorEffects|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorNotFound|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorPage|87.6%|67.3%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorReducers|100%|85.7%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetEditorState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetGallery|95.8%|77.7%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetOperationFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetSaved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetsEffects|94.1%|75%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetsLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgSetsPage|95.4%|95.4%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetsReducers|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CgSetsState|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CgVariationCreated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgVariationGenerated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgVariationSaved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgVariationsEffects|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CgVariationsFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgVariationsLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CgVariationsReducers|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CgVariationsState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterBaseSprite|91.3%|90%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterCreated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterDeleted|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorEffects|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorNotFound|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorPage|92.9%|81.2%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorReducers|100%|92.8%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterEditorState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterImagesLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterOperationFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterOutfits|94.2%|83.3%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterPreview|88.1%|91.3%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewEffects|62.9%|25%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewFailed|0%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewReducers|83.3%|50%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewSaved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterPreviewState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterSaved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharactersEffects|94.1%|75%| |Kagura.BlazorAdapter.KnowledgeBase.CharactersLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharactersPage|95.8%|90.9%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterSpriteEffects|86.3%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterSpriteReducers|100%|75%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterSpriteState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharactersReducers|100%|87.5%| |Kagura.BlazorAdapter.KnowledgeBase.CharactersState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterTiers|100%|50%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceContextLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceEffects|77.7%|80%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterVoicePanel|95.3%|81%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceReducers|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.CharacterVoicesFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterVoicesLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CharacterVoiceState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateCgSetFailed|0%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateCgSetRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateCgVariationRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateCharacterFailed|0%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateCharacterRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateLocationFailed|0%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateLocationRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateLocationVariantRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateLoreFailed|0%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateLoreRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateOutfitRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateRelationshipRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.CreateTimelineEventRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.DeleteCgSetRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.DeleteCharacterRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.DeleteLocationRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.DeleteLocationVariantRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.DeleteLoreRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.DeleteOutfitRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.DeleteRelationshipRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.DeleteTimelineEventRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ExpressionCapabilityChecked|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ExpressionGenerated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ExpressionGenerationFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ExpressionRemoved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ExpressionsEffects|87.9%|69.2%| |Kagura.BlazorAdapter.KnowledgeBase.ExpressionsFailed|0%|| |Kagura.BlazorAdapter.KnowledgeBase.ExpressionsLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ExpressionsReducers|85.7%|43.7%| |Kagura.BlazorAdapter.KnowledgeBase.ExpressionsState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.GenerateAllExpressions|100%|| |Kagura.BlazorAdapter.KnowledgeBase.GenerateBaseSprite|100%|| |Kagura.BlazorAdapter.KnowledgeBase.GenerateCgSetBaseImage|100%|| |Kagura.BlazorAdapter.KnowledgeBase.GenerateCgVariation|100%|| |Kagura.BlazorAdapter.KnowledgeBase.GenerateExpression|100%|| |Kagura.BlazorAdapter.KnowledgeBase.GenerateLocationBackground|100%|| |Kagura.BlazorAdapter.KnowledgeBase.GenerateLocationVariantImage|100%|| |Kagura.BlazorAdapter.KnowledgeBase.GenerateOutfitSprite|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LabeledEntryMapping|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadCgEditor|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadCgSet|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadCgSets|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadCgVariations|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadCharacter|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadCharacterImages|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadCharacters|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadCharacterVoiceContext|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadCharacterVoices|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadExpressions|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadLocation|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadLocationHierarchy|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadLocationImages|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadLocations|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadLocationVariant|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadLocationVariants|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadLore|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadLoreEntry|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadOutfit|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadOutfits|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadRelationshipCast|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadRelationships|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoadTimeline|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationBackground|91.3%|90%| |Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundCapabilityChecked|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundEffects|86.3%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundGenerated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundReducers|100%|75%| |Kagura.BlazorAdapter.KnowledgeBase.LocationBackgroundState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationCreated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationDeleted|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationEditorEffects|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationEditorLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationEditorNotFound|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationEditorPage|88.6%|75%| |Kagura.BlazorAdapter.KnowledgeBase.LocationEditorReducers|86.9%|71.4%| |Kagura.BlazorAdapter.KnowledgeBase.LocationEditorState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyEffects|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyReducers|100%|75%| |Kagura.BlazorAdapter.KnowledgeBase.LocationHierarchyState|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationImagesLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationOperationFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationPreview|91%|88.6%| |Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewEffects|62.9%|25%| |Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewFailed|0%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewReducers|83.3%|50%| |Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewSaved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationPreviewState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationSaved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationsEffects|94.1%|75%| |Kagura.BlazorAdapter.KnowledgeBase.LocationsLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationsPage|95.4%|95.4%| |Kagura.BlazorAdapter.KnowledgeBase.LocationsReducers|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationsState|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorEffects|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorNotFound|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorPage|88.8%|74%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorReducers|100%|93.7%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorSaved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantEditorState|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImage|93.1%|91.6%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageCapabilityChecked|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageEffects|86.3%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageGenerated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageReducers|100%|75%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantImageState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariants|94.2%|79.1%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsEffects|96.4%|83.3%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsReducers|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.LocationVariantsState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoreCategories|100%|50%| |Kagura.BlazorAdapter.KnowledgeBase.LoreCreated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoreDeleted|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoreEditorEffects|96.6%|87.5%| |Kagura.BlazorAdapter.KnowledgeBase.LoreEditorLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoreEditorNotFound|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoreEditorPage|90.8%|75%| |Kagura.BlazorAdapter.KnowledgeBase.LoreEditorReducers|86.9%|71.4%| |Kagura.BlazorAdapter.KnowledgeBase.LoreEditorState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoreEffects|94.1%|75%| |Kagura.BlazorAdapter.KnowledgeBase.LoreLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoreOperationFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LorePage|80%|78.5%| |Kagura.BlazorAdapter.KnowledgeBase.LoreReducers|90.9%|87.5%| |Kagura.BlazorAdapter.KnowledgeBase.LoreSaved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.LoreState|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.NewTimelineEvent|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorEffects|96.4%|87.5%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorNotFound|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorPage|92.3%|75%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorReducers|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorSaved|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitEditorState|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitExpressions|95.5%|92.8%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitFaceRegion|88.7%|70.2%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitsEffects|96.4%|83.3%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitsFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitsLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitSprite|92.5%|91.6%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteCapabilityChecked|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteEffects|86.3%|100%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteFailed|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteGenerated|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteReducers|100%|75%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitSpriteState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.OutfitsReducers|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.OutfitsState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ParentCandidatesFound|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ParentPickerModal|84.6%|89.2%| |Kagura.BlazorAdapter.KnowledgeBase.PositioningPanel|100%|95.4%| |Kagura.BlazorAdapter.KnowledgeBase.PreviewVoiceRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipCard|77.5%|63.3%| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipCastLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipList|97.3%|88.4%| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipModal|94.1%|94.7%| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipsEffects|92.8%|77.7%| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipsFailed|0%|| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipsLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipsPage|92.8%|87.5%| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipsReducers|94.7%|75%| |Kagura.BlazorAdapter.KnowledgeBase.RelationshipsState|100%|100%| |Kagura.BlazorAdapter.KnowledgeBase.RemoveCharacterPreviewRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.RemoveExpressionRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.RemoveLocationPreviewRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ReorderTimelineEventRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SaveCgSetRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SaveCgVariationRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SaveCharacterRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SaveFaceRegionsRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SaveLocationRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SaveLocationVariantRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SaveLoreRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SaveOutfitRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SearchParentCandidates|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetCgPanelTab|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetCgSetsFilter|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetCharacterPreviewRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetCharactersFilter|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetCharactersTier|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetLocationPreviewRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetLocationsFilter|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetLoreCategory|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetLoreFilter|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetParentRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SetRelationshipsFilter|100%|| |Kagura.BlazorAdapter.KnowledgeBase.ShowCgGeneration|100%|| |Kagura.BlazorAdapter.KnowledgeBase.SpriteCapabilityChecked|100%|| |Kagura.BlazorAdapter.KnowledgeBase.StyleReferenceControls|100%|78.5%| |Kagura.BlazorAdapter.KnowledgeBase.TimelineEffects|93.5%|70%| |Kagura.BlazorAdapter.KnowledgeBase.TimelineEventCard|92.5%|80%| |Kagura.BlazorAdapter.KnowledgeBase.TimelineEventEdit|100%|| |Kagura.BlazorAdapter.KnowledgeBase.TimelineFailed|0%|| |Kagura.BlazorAdapter.KnowledgeBase.TimelineLoaded|100%|| |Kagura.BlazorAdapter.KnowledgeBase.TimelinePage|95.8%|90%| |Kagura.BlazorAdapter.KnowledgeBase.TimelineReducers|91.6%|75%| |Kagura.BlazorAdapter.KnowledgeBase.TimelineSection|96.6%|91.6%| |Kagura.BlazorAdapter.KnowledgeBase.TimelineState|100%|| |Kagura.BlazorAdapter.KnowledgeBase.UpdateRelationshipRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.UpdateTimelineEventRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.UploadVoiceClipRequested|100%|| |Kagura.BlazorAdapter.KnowledgeBase.VoiceClipSaved|100%|| |Kagura.BlazorAdapter.Notifications.DomainChangedBridge|88.8%|58.3%| |Kagura.BlazorAdapter.Notifications.DomainChangesReceived|100%|100%| |Kagura.BlazorAdapter.OverlayDemo|0%|0%| |Kagura.BlazorAdapter.Projects.AssistantMemoryFailed|0%|| |Kagura.BlazorAdapter.Projects.AssistantMemorySaved|0%|| |Kagura.BlazorAdapter.Projects.ClearStyleReferenceRequested|100%|| |Kagura.BlazorAdapter.Projects.CreateProjectRequested|100%|| |Kagura.BlazorAdapter.Projects.DeleteProjectRequested|100%|| |Kagura.BlazorAdapter.Projects.LoadProjectAssets|100%|| |Kagura.BlazorAdapter.Projects.LoadWorkspace|100%|| |Kagura.BlazorAdapter.Projects.ProjectAssetsEffects|100%|| |Kagura.BlazorAdapter.Projects.ProjectAssetsFailed|100%|| |Kagura.BlazorAdapter.Projects.ProjectAssetsLoaded|100%|| |Kagura.BlazorAdapter.Projects.ProjectAssetsPage|94.2%|85.7%| |Kagura.BlazorAdapter.Projects.ProjectAssetsReducers|100%|100%| |Kagura.BlazorAdapter.Projects.ProjectAssetsState|100%|| |Kagura.BlazorAdapter.Projects.ProjectCreated|100%|| |Kagura.BlazorAdapter.Projects.ProjectCreateFailed|100%|| |Kagura.BlazorAdapter.Projects.ProjectDeleted|100%|| |Kagura.BlazorAdapter.Projects.ProjectSaved|100%|| |Kagura.BlazorAdapter.Projects.ProjectSaveFailed|100%|| |Kagura.BlazorAdapter.Projects.ProjectsEffects|100%|100%| |Kagura.BlazorAdapter.Projects.ProjectsLoaded|100%|| |Kagura.BlazorAdapter.Projects.ProjectsPage|94.7%|100%| |Kagura.BlazorAdapter.Projects.ProjectsReducers|100%|100%| |Kagura.BlazorAdapter.Projects.ProjectsState|100%|100%| |Kagura.BlazorAdapter.Projects.ProjectWorkspacePage|70.5%|63.8%| |Kagura.BlazorAdapter.Projects.SaveAssistantMemoryRequested|0%|| |Kagura.BlazorAdapter.Projects.SaveProjectRequested|100%|| |Kagura.BlazorAdapter.Projects.SetProjectsFilter|100%|| |Kagura.BlazorAdapter.Projects.SetStageViewRequested|100%|| |Kagura.BlazorAdapter.Projects.SetStyleReferenceRequested|100%|| |Kagura.BlazorAdapter.Projects.SetStyleRequested|100%|| |Kagura.BlazorAdapter.Projects.StyleReferenceChanged|100%|| |Kagura.BlazorAdapter.Projects.StyleReferenceFailed|100%|| |Kagura.BlazorAdapter.Projects.WorkspaceCrumb|100%|| |Kagura.BlazorAdapter.Projects.WorkspaceEffects|82.3%|70.5%| |Kagura.BlazorAdapter.Projects.WorkspaceLoaded|100%|| |Kagura.BlazorAdapter.Projects.WorkspaceReducers|80%|| |Kagura.BlazorAdapter.Projects.WorkspaceShell|100%|95%| |Kagura.BlazorAdapter.Projects.WorkspaceState|100%|| |Kagura.BlazorAdapter.QuicklinkDemo|0%|| |Kagura.BlazorAdapter.RegionSelectorDemo|0%|0%| |Kagura.BlazorAdapter.SelectDemo|0%|| |Kagura.BlazorAdapter.Settings.AssistantSkillsEffects|13.3%|0%| |Kagura.BlazorAdapter.Settings.AssistantSkillsFailed|0%|| |Kagura.BlazorAdapter.Settings.AssistantSkillsLoaded|100%|| |Kagura.BlazorAdapter.Settings.AssistantSkillsReducers|28.5%|| |Kagura.BlazorAdapter.Settings.AssistantSkillsSection|32.4%|11.1%| |Kagura.BlazorAdapter.Settings.AssistantSkillsState|100%|| |Kagura.BlazorAdapter.Settings.CheckTtsConnectionRequested|100%|| |Kagura.BlazorAdapter.Settings.CreateEmotionRequested|100%|| |Kagura.BlazorAdapter.Settings.CreateSkillRequested|0%|| |Kagura.BlazorAdapter.Settings.CreatorProfileFailed|0%|| |Kagura.BlazorAdapter.Settings.CreatorProfileSaved|0%|| |Kagura.BlazorAdapter.Settings.DeleteEmotionRequested|100%|| |Kagura.BlazorAdapter.Settings.EditSkillRequested|0%|| |Kagura.BlazorAdapter.Settings.EmotionCreated|100%|| |Kagura.BlazorAdapter.Settings.EmotionLibraryEffects|71.4%|37.5%| |Kagura.BlazorAdapter.Settings.EmotionLibraryFailed|0%|| |Kagura.BlazorAdapter.Settings.EmotionLibraryLoaded|100%|| |Kagura.BlazorAdapter.Settings.EmotionLibraryReducers|96.5%|50%| |Kagura.BlazorAdapter.Settings.EmotionLibrarySection|90.1%|80.7%| |Kagura.BlazorAdapter.Settings.EmotionLibraryState|100%|| |Kagura.BlazorAdapter.Settings.NovelAiSettingsEffects|68.8%|50%| |Kagura.BlazorAdapter.Settings.NovelAiSettingsFailed|100%|| |Kagura.BlazorAdapter.Settings.NovelAiSettingsLoaded|100%|| |Kagura.BlazorAdapter.Settings.NovelAiSettingsReducers|87.5%|25%| |Kagura.BlazorAdapter.Settings.NovelAiSettingsSection|88.8%|91.6%| |Kagura.BlazorAdapter.Settings.NovelAiSettingsState|100%|| |Kagura.BlazorAdapter.Settings.NovelAiTokenChecked|100%|| |Kagura.BlazorAdapter.Settings.OpenRouterModelsFailed|0%|| |Kagura.BlazorAdapter.Settings.OpenRouterModelsLoaded|100%|| |Kagura.BlazorAdapter.Settings.OpenRouterSettingsEffects|46.7%|27.7%| |Kagura.BlazorAdapter.Settings.OpenRouterSettingsFailed|0%|| |Kagura.BlazorAdapter.Settings.OpenRouterSettingsLoaded|100%|| |Kagura.BlazorAdapter.Settings.OpenRouterSettingsReducers|77.2%|| |Kagura.BlazorAdapter.Settings.OpenRouterSettingsSection|91.1%|92.1%| |Kagura.BlazorAdapter.Settings.OpenRouterSettingsState|100%|| |Kagura.BlazorAdapter.Settings.SaveCreatorProfileRequested|0%|| |Kagura.BlazorAdapter.Settings.SaveDefaultTagsRequested|100%|| |Kagura.BlazorAdapter.Settings.SaveEmotionRequested|100%|| |Kagura.BlazorAdapter.Settings.SaveNovelAiModelRequested|100%|| |Kagura.BlazorAdapter.Settings.SaveNovelAiTokenRequested|100%|| |Kagura.BlazorAdapter.Settings.SaveOpenRouterDescriberModelRequested|100%|| |Kagura.BlazorAdapter.Settings.SaveOpenRouterKeyRequested|100%|| |Kagura.BlazorAdapter.Settings.SaveOpenRouterModelRequested|100%|| |Kagura.BlazorAdapter.Settings.SaveOpenRouterReasoningEffortRequested|100%|| |Kagura.BlazorAdapter.Settings.SaveTtsFieldRequested|100%|| |Kagura.BlazorAdapter.Settings.SelectEmotion|100%|| |Kagura.BlazorAdapter.Settings.SetSkillPinnedRequested|0%|| |Kagura.BlazorAdapter.Settings.SetSkillStateRequested|0%|| |Kagura.BlazorAdapter.Settings.TokenVerdict|100%|| |Kagura.BlazorAdapter.Settings.TtsConnectionChecked|100%|| |Kagura.BlazorAdapter.Settings.TtsFieldSaved|100%|| |Kagura.BlazorAdapter.Settings.TtsSettingsEffects|73.5%|50%| |Kagura.BlazorAdapter.Settings.TtsSettingsFailed|100%|| |Kagura.BlazorAdapter.Settings.TtsSettingsLoaded|100%|| |Kagura.BlazorAdapter.Settings.TtsSettingsReducers|100%|100%| |Kagura.BlazorAdapter.Settings.TtsSettingsSection|77.9%|72.2%| |Kagura.BlazorAdapter.Settings.TtsSettingsState|100%|| |Kagura.BlazorAdapter.Settings.TtsVerdict|100%|| |Kagura.BlazorAdapter.SliderDemo|0%|0%| |Kagura.BlazorAdapter.Tags.ForgetTagAuthoringInstance|100%|| |Kagura.BlazorAdapter.Tags.PromptTagEditing|100%|76.3%| |Kagura.BlazorAdapter.Tags.RequestSuggestions|100%|| |Kagura.BlazorAdapter.Tags.SearchTags|100%|| |Kagura.BlazorAdapter.Tags.SuggestionsReceived|100%|| |Kagura.BlazorAdapter.Tags.TagAuthoring|95.5%|78.8%| |Kagura.BlazorAdapter.Tags.TagAuthoringEffects|100%|100%| |Kagura.BlazorAdapter.Tags.TagAuthoringInstance|100%|| |Kagura.BlazorAdapter.Tags.TagAuthoringPage|0%|| |Kagura.BlazorAdapter.Tags.TagAuthoringReducers|100%|100%| |Kagura.BlazorAdapter.Tags.TagAuthoringState|100%|100%| |Kagura.BlazorAdapter.Tags.TagDatabaseChecked|100%|| |Kagura.BlazorAdapter.Tags.TagsSearched|100%|| |Kagura.BlazorAdapter.ToggleGroupDemo|0%|0%| |Kagura.BlazorAdapter.VisualNovel.AddSceneCastRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.AddSceneStepRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.ChapterCreated|100%|| |Kagura.BlazorAdapter.VisualNovel.ChapterEditorDeleted|100%|| |Kagura.BlazorAdapter.VisualNovel.ChapterEditorEffects|90%|56.2%| |Kagura.BlazorAdapter.VisualNovel.ChapterEditorLoaded|100%|| |Kagura.BlazorAdapter.VisualNovel.ChapterEditorNotFound|100%|| |Kagura.BlazorAdapter.VisualNovel.ChapterEditorPage|84.9%|70.4%| |Kagura.BlazorAdapter.VisualNovel.ChapterEditorReducers|86.9%|42.8%| |Kagura.BlazorAdapter.VisualNovel.ChapterEditorSaved|100%|| |Kagura.BlazorAdapter.VisualNovel.ChapterEditorState|100%|| |Kagura.BlazorAdapter.VisualNovel.ChapterOperationFailed|0%|| |Kagura.BlazorAdapter.VisualNovel.ChapterScenes|78.2%|65%| |Kagura.BlazorAdapter.VisualNovel.ChaptersEffects|88.8%|64.2%| |Kagura.BlazorAdapter.VisualNovel.ChaptersFailed|100%|| |Kagura.BlazorAdapter.VisualNovel.ChaptersLoaded|100%|| |Kagura.BlazorAdapter.VisualNovel.ChaptersPage|90.9%|90.9%| |Kagura.BlazorAdapter.VisualNovel.ChaptersReducers|91.6%|100%| |Kagura.BlazorAdapter.VisualNovel.ChaptersState|100%|| |Kagura.BlazorAdapter.VisualNovel.CreateChapterFailed|0%|| |Kagura.BlazorAdapter.VisualNovel.CreateChapterRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.CreateSceneFailed|0%|| |Kagura.BlazorAdapter.VisualNovel.CreateSceneRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.DeleteChapterRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.DeleteSceneRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.DeleteSceneStepRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.GenerateStepAudioRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.LoadChapter|100%|| |Kagura.BlazorAdapter.VisualNovel.LoadChapters|100%|| |Kagura.BlazorAdapter.VisualNovel.LoadPlayer|100%|| |Kagura.BlazorAdapter.VisualNovel.LoadScene|100%|| |Kagura.BlazorAdapter.VisualNovel.LoadScenes|100%|| |Kagura.BlazorAdapter.VisualNovel.LoadSceneSteps|100%|| |Kagura.BlazorAdapter.VisualNovel.PlayerEffects|100%|83.3%| |Kagura.BlazorAdapter.VisualNovel.PlayerLoaded|100%|| |Kagura.BlazorAdapter.VisualNovel.PlayerPage|100%|78.2%| |Kagura.BlazorAdapter.VisualNovel.PlayerReducers|100%|100%| |Kagura.BlazorAdapter.VisualNovel.PlayerStage|98.2%|70.9%| |Kagura.BlazorAdapter.VisualNovel.PlayerState|100%|83.3%| |Kagura.BlazorAdapter.VisualNovel.RemoveSceneCastRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.ReorderChaptersRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.ReorderScenesRequested|0%|| |Kagura.BlazorAdapter.VisualNovel.ReorderSceneStepsRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.SaveChapterRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.SaveSceneRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneCast|100%|76.9%| |Kagura.BlazorAdapter.VisualNovel.SceneCastAdded|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneCastRemoved|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneCreated|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneEditorDeleted|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneEditorEffects|92.1%|55.5%| |Kagura.BlazorAdapter.VisualNovel.SceneEditorLoaded|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneEditorNotFound|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneEditorPage|87.9%|71.2%| |Kagura.BlazorAdapter.VisualNovel.SceneEditorReducers|88.4%|42.8%| |Kagura.BlazorAdapter.VisualNovel.SceneEditorSaved|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneEditorState|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneLineRow|88.5%|84.7%| |Kagura.BlazorAdapter.VisualNovel.SceneLineStage|83.2%|71.4%| |Kagura.BlazorAdapter.VisualNovel.SceneOperationFailed|0%|| |Kagura.BlazorAdapter.VisualNovel.SceneScript|91.4%|86.3%| |Kagura.BlazorAdapter.VisualNovel.ScenesEffects|64.2%|35.7%| |Kagura.BlazorAdapter.VisualNovel.ScenesFailed|100%|| |Kagura.BlazorAdapter.VisualNovel.ScenesLoaded|100%|| |Kagura.BlazorAdapter.VisualNovel.ScenesReducers|76.9%|83.3%| |Kagura.BlazorAdapter.VisualNovel.ScenesState|100%|100%| |Kagura.BlazorAdapter.VisualNovel.SceneStatuses|100%|50%| |Kagura.BlazorAdapter.VisualNovel.SceneStepAdded|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneStepDeleted|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneStepSaved|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneStepsEffects|81.3%|62.9%| |Kagura.BlazorAdapter.VisualNovel.SceneStepsFailed|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneStepsLoaded|100%|| |Kagura.BlazorAdapter.VisualNovel.SceneStepsReducers|97.2%|75%| |Kagura.BlazorAdapter.VisualNovel.SceneStepsState|100%|50%| |Kagura.BlazorAdapter.VisualNovel.SetScenesStatus|100%|| |Kagura.BlazorAdapter.VisualNovel.SetSceneStepStageRequested|100%|| |Kagura.BlazorAdapter.VisualNovel.StepAudioFailed|100%|| |Kagura.BlazorAdapter.VisualNovel.StepAudioFinished|100%|| |Kagura.BlazorAdapter.VisualNovel.StepAudioState|100%|| |Kagura.BlazorAdapter.VisualNovel.UpdateSceneStepRequested|100%|| </details> <details><summary>Kagura.Domain - 95.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Domain**|**95.1%**|**91.4%**| |Kagura.Domain.Assistant.Skill|100%|90%| |Kagura.Domain.Graph.Entry|100%|100%| |Kagura.Domain.Graph.Link|100%|100%| |Kagura.Domain.Graph.LinkRole|100%|100%| |Kagura.Domain.Graph.LinkRoles|100%|| |Kagura.Domain.Graph.StructuralRef|100%|100%| |Kagura.Domain.Graph.StructuralRefs|100%|100%| |Kagura.Domain.Journal.ChangeLogEntry|100%|| |Kagura.Domain.KnowledgeBase.BodyTypes|100%|100%| |Kagura.Domain.KnowledgeBase.CgGeneration|86.5%|| |Kagura.Domain.KnowledgeBase.CgPromptSnapshot|100%|| |Kagura.Domain.KnowledgeBase.CgSet|88%|| |Kagura.Domain.KnowledgeBase.CgSetProfile|54.5%|| |Kagura.Domain.KnowledgeBase.CgSubjectSnapshot|100%|| |Kagura.Domain.KnowledgeBase.CgVariation|92.4%|66.6%| |Kagura.Domain.KnowledgeBase.CgVariationProfile|54.5%|| |Kagura.Domain.KnowledgeBase.Character|97.1%|100%| |Kagura.Domain.KnowledgeBase.CharacterProfile|100%|| |Kagura.Domain.KnowledgeBase.CharacterVoice|100%|| |Kagura.Domain.KnowledgeBase.CupSizes|100%|100%| |Kagura.Domain.KnowledgeBase.CuratedTag|100%|| |Kagura.Domain.KnowledgeBase.Emotion|87.8%|66.6%| |Kagura.Domain.KnowledgeBase.EmotionProfile|50%|| |Kagura.Domain.KnowledgeBase.Expression|87%|| |Kagura.Domain.KnowledgeBase.ImageRegion|90%|100%| |Kagura.Domain.KnowledgeBase.LabeledEntry|100%|| |Kagura.Domain.KnowledgeBase.Location|92.3%|100%| |Kagura.Domain.KnowledgeBase.LocationProfile|100%|| |Kagura.Domain.KnowledgeBase.LocationVariant|92.5%|66.6%| |Kagura.Domain.KnowledgeBase.LocationVariantProfile|100%|| |Kagura.Domain.KnowledgeBase.LoreEntry|100%|| |Kagura.Domain.KnowledgeBase.LoreProfile|100%|| |Kagura.Domain.KnowledgeBase.Outfit|93.4%|80%| |Kagura.Domain.KnowledgeBase.OutfitProfile|100%|| |Kagura.Domain.KnowledgeBase.PromptTag|42.8%|100%| |Kagura.Domain.KnowledgeBase.Relationship|91.8%|100%| |Kagura.Domain.KnowledgeBase.RelationshipProfile|100%|| |Kagura.Domain.KnowledgeBase.RelationshipSecret|100%|75%| |Kagura.Domain.KnowledgeBase.SpriteFramings|100%|100%| |Kagura.Domain.KnowledgeBase.StyleReferenceTuning|100%|| |Kagura.Domain.KnowledgeBase.TimelineEvent|100%|100%| |Kagura.Domain.Projects.Project|100%|90%| |Kagura.Domain.Projects.Slug|100%|100%| |Kagura.Domain.Settings.AppSetting|100%|| |Kagura.Domain.VisualNovel.Chapter|100%|100%| |Kagura.Domain.VisualNovel.ChapterProfile|80%|| |Kagura.Domain.VisualNovel.EffectiveStage|100%|| |Kagura.Domain.VisualNovel.PlayerFrame|100%|| |Kagura.Domain.VisualNovel.PlayerSceneScript|100%|| |Kagura.Domain.VisualNovel.PlayerStep|100%|| |Kagura.Domain.VisualNovel.Scene|96.1%|83.3%| |Kagura.Domain.VisualNovel.ScenePlayback|100%|100%| |Kagura.Domain.VisualNovel.SceneProfile|100%|| |Kagura.Domain.VisualNovel.SceneStageProjection|100%|96.4%| |Kagura.Domain.VisualNovel.SceneStep|100%|100%| |Kagura.Domain.VisualNovel.SpriteLayout|100%|| |Kagura.Domain.VisualNovel.StageBackgroundChange|100%|| |Kagura.Domain.VisualNovel.StageCharacterChange|100%|| |Kagura.Domain.VisualNovel.StageCharacterState|100%|| |Kagura.Domain.VisualNovel.StageProjection|100%|100%| |Kagura.Domain.VisualNovel.StageStepChanges|100%|| |Kagura.Domain.VisualNovel.StageView|100%|| |System.Text.RegularExpressions.Generated|90.2%|72.2%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE06CC341D340484<br/>D04ADFED3A21D401C2764A1D17367E35BEB556CBB3B4B0B74__NonSlugChars_0|89.4%|75%| </details> <details><summary>Kagura.Infrastructure - 97.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Infrastructure**|**97.6%**|**72.4%**| |Kagura.Infrastructure.Assistant.AssistantContextResolver|94.1%|68.8%| |Kagura.Infrastructure.Assistant.AssistantMutationTool`1|100%|87.5%| |Kagura.Infrastructure.Assistant.AssistantTool`1|100%|100%| |Kagura.Infrastructure.Assistant.AssistantToolContext|100%|| |Kagura.Infrastructure.Assistant.ChatSession|88.3%|46.1%| |Kagura.Infrastructure.Assistant.DelegateProgress`1|100%|| |Kagura.Infrastructure.Assistant.EfSkillStore|100%|| |Kagura.Infrastructure.Assistant.InMemoryConversationStore|100%|87.5%| |Kagura.Infrastructure.Assistant.ResolvedContext|100%|| |Kagura.Infrastructure.Assistant.Tools.BodyAttributeParams|100%|100%| |Kagura.Infrastructure.Assistant.Tools.CharacterTiers|100%|100%| |Kagura.Infrastructure.Assistant.Tools.CreateCgSetParams|0%|| |Kagura.Infrastructure.Assistant.Tools.CreateCgSetTool|13.7%|| |Kagura.Infrastructure.Assistant.Tools.CreateCgVariationParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateCgVariationTool|90.3%|| |Kagura.Infrastructure.Assistant.Tools.CreateChapterParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateChapterTool|93.3%|| |Kagura.Infrastructure.Assistant.Tools.CreateCharacterParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateCharacterTool|96.7%|| |Kagura.Infrastructure.Assistant.Tools.CreateLocationParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateLocationTool|93.6%|| |Kagura.Infrastructure.Assistant.Tools.CreateLocationVariantParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateLocationVariantTool|92.8%|| |Kagura.Infrastructure.Assistant.Tools.CreateLoreParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateLoreTool|94.5%|100%| |Kagura.Infrastructure.Assistant.Tools.CreateOutfitParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateOutfitTool|94.7%|| |Kagura.Infrastructure.Assistant.Tools.CreateRelationshipParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateRelationshipTool|94.2%|| |Kagura.Infrastructure.Assistant.Tools.CreateSceneParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateSceneTool|93.9%|| |Kagura.Infrastructure.Assistant.Tools.CreateTimelineEventParams|100%|| |Kagura.Infrastructure.Assistant.Tools.CreateTimelineEventTool|95.8%|| |Kagura.Infrastructure.Assistant.Tools.DeleteCgSetParams|0%|| |Kagura.Infrastructure.Assistant.Tools.DeleteCgSetTool|14.2%|| |Kagura.Infrastructure.Assistant.Tools.DeleteCgVariationParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteCgVariationTool|90.4%|| |Kagura.Infrastructure.Assistant.Tools.DeleteChapterParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteChapterTool|95.2%|| |Kagura.Infrastructure.Assistant.Tools.DeleteCharacterParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteCharacterTool|95.2%|| |Kagura.Infrastructure.Assistant.Tools.DeleteLocationParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteLocationTool|95.2%|| |Kagura.Infrastructure.Assistant.Tools.DeleteLocationVariantParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteLocationVariantTool|95.6%|| |Kagura.Infrastructure.Assistant.Tools.DeleteLoreParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteLoreTool|95.2%|| |Kagura.Infrastructure.Assistant.Tools.DeleteOutfitParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteOutfitTool|95.6%|| |Kagura.Infrastructure.Assistant.Tools.DeleteRelationshipParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteRelationshipTool|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteSceneLineParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteSceneLineTool|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteSceneParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteSceneTool|95.2%|| |Kagura.Infrastructure.Assistant.Tools.DeleteTimelineEventParams|100%|| |Kagura.Infrastructure.Assistant.Tools.DeleteTimelineEventTool|100%|| |Kagura.Infrastructure.Assistant.Tools.EntryParam|100%|100%| |Kagura.Infrastructure.Assistant.Tools.FindSimilarTagsParams|100%|| |Kagura.Infrastructure.Assistant.Tools.FindSimilarTagsTool|93.3%|| |Kagura.Infrastructure.Assistant.Tools.GenerateCharacterSpriteParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GenerateCharacterSpriteTool|96.6%|| |Kagura.Infrastructure.Assistant.Tools.GenerateExpressionSpritesParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GenerateExpressionSpritesTool|86.8%|50%| |Kagura.Infrastructure.Assistant.Tools.GenerateLocationBackgroundParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GenerateLocationBackgroundTool|93.3%|| |Kagura.Infrastructure.Assistant.Tools.GenerateOutfitSpriteParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GenerateOutfitSpriteTool|73.3%|| |Kagura.Infrastructure.Assistant.Tools.GenerateVariantBackgroundParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GenerateVariantBackgroundTool|94.1%|| |Kagura.Infrastructure.Assistant.Tools.GenerationLaunch|90.6%|62.5%| |Kagura.Infrastructure.Assistant.Tools.GetCgSetParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GetCgSetTool|95.5%|| |Kagura.Infrastructure.Assistant.Tools.GetCgVariationParams|0%|| |Kagura.Infrastructure.Assistant.Tools.GetCgVariationTool|16.1%|| |Kagura.Infrastructure.Assistant.Tools.GetChapterParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GetChapterTool|97%|| |Kagura.Infrastructure.Assistant.Tools.GetCharacterParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GetCharacterTool|98.3%|50%| |Kagura.Infrastructure.Assistant.Tools.GetConnectionsParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GetConnectionsTool|96.6%|| |Kagura.Infrastructure.Assistant.Tools.GetGenerationQueueTool|100%|50%| |Kagura.Infrastructure.Assistant.Tools.GetLocationParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GetLocationTool|97.3%|| |Kagura.Infrastructure.Assistant.Tools.GetLocationVariantParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GetLocationVariantTool|100%|| |Kagura.Infrastructure.Assistant.Tools.GetLoreParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GetLoreTool|96.2%|| |Kagura.Infrastructure.Assistant.Tools.GetOutfitParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GetOutfitTool|100%|50%| |Kagura.Infrastructure.Assistant.Tools.GetProjectOverviewTool|97.7%|| |Kagura.Infrastructure.Assistant.Tools.GetSceneParams|100%|| |Kagura.Infrastructure.Assistant.Tools.GetSceneStageOptionsTool|100%|| |Kagura.Infrastructure.Assistant.Tools.GetSceneTool|98%|100%| |Kagura.Infrastructure.Assistant.Tools.GetTimelineTool|100%|| |Kagura.Infrastructure.Assistant.Tools.LinkRecordsParams|100%|| |Kagura.Infrastructure.Assistant.Tools.LinkRecordsTool|97.1%|| |Kagura.Infrastructure.Assistant.Tools.ListCgSetsTool|26.6%|| |Kagura.Infrastructure.Assistant.Tools.ListChaptersTool|100%|| |Kagura.Infrastructure.Assistant.Tools.ListCharactersTool|100%|| |Kagura.Infrastructure.Assistant.Tools.ListLocationsTool|100%|| |Kagura.Infrastructure.Assistant.Tools.ListLoreTool|100%|| |Kagura.Infrastructure.Assistant.Tools.ListRelationshipsTool|100%|100%| |Kagura.Infrastructure.Assistant.Tools.ManageSkillParams|100%|| |Kagura.Infrastructure.Assistant.Tools.ManageSkillTool|92.7%|100%| |Kagura.Infrastructure.Assistant.Tools.MemoryOperationParam|100%|| |Kagura.Infrastructure.Assistant.Tools.MemoryParams|100%|| |Kagura.Infrastructure.Assistant.Tools.MemoryTool|91.8%|76.6%| |Kagura.Infrastructure.Assistant.Tools.MoveSceneLineParams|100%|| |Kagura.Infrastructure.Assistant.Tools.MoveSceneLineTool|87.8%|| |Kagura.Infrastructure.Assistant.Tools.NavigateToParams|100%|| |Kagura.Infrastructure.Assistant.Tools.NavigateToTool|80%|50%| |Kagura.Infrastructure.Assistant.Tools.RedoTool|93.7%|| |Kagura.Infrastructure.Assistant.Tools.ResolveTagParams|100%|| |Kagura.Infrastructure.Assistant.Tools.ResolveTagTool|95%|| |Kagura.Infrastructure.Assistant.Tools.SceneLineParam|100%|| |Kagura.Infrastructure.Assistant.Tools.SceneScript|96.9%|100%| |Kagura.Infrastructure.Assistant.Tools.SearchParams|100%|| |Kagura.Infrastructure.Assistant.Tools.SearchTagsParams|100%|| |Kagura.Infrastructure.Assistant.Tools.SearchTagsTool|100%|| |Kagura.Infrastructure.Assistant.Tools.SearchTool|86.2%|25%| |Kagura.Infrastructure.Assistant.Tools.SetProjectStyleParams|100%|| |Kagura.Infrastructure.Assistant.Tools.SetProjectStyleTool|97.9%|92.8%| |Kagura.Infrastructure.Assistant.Tools.SetSceneLineStageParams|100%|| |Kagura.Infrastructure.Assistant.Tools.SetSceneLineStageTool|97.4%|| |Kagura.Infrastructure.Assistant.Tools.SpriteFramingParams|100%|100%| |Kagura.Infrastructure.Assistant.Tools.SpriteGenders|100%|100%| |Kagura.Infrastructure.Assistant.Tools.StageBackgroundParam|100%|| |Kagura.Infrastructure.Assistant.Tools.StageCharacterParam|100%|| |Kagura.Infrastructure.Assistant.Tools.SuggestTagsParams|100%|| |Kagura.Infrastructure.Assistant.Tools.SuggestTagsTool|94.1%|| |Kagura.Infrastructure.Assistant.Tools.TagDetailsParams|100%|| |Kagura.Infrastructure.Assistant.Tools.TagDetailsTool|93.3%|| |Kagura.Infrastructure.Assistant.Tools.TagParam|100%|85.7%| |Kagura.Infrastructure.Assistant.Tools.TagTools|100%|| |Kagura.Infrastructure.Assistant.Tools.UndoTool|94.1%|| |Kagura.Infrastructure.Assistant.Tools.UnlinkRecordsParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UnlinkRecordsTool|88.2%|50%| |Kagura.Infrastructure.Assistant.Tools.UpdateCgSetParams|0%|| |Kagura.Infrastructure.Assistant.Tools.UpdateCgSetTool|11.9%|| |Kagura.Infrastructure.Assistant.Tools.UpdateCgVariationParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateCgVariationTool|93.1%|| |Kagura.Infrastructure.Assistant.Tools.UpdateChapterParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateChapterTool|94.7%|| |Kagura.Infrastructure.Assistant.Tools.UpdateCharacterParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateCharacterTool|97.6%|| |Kagura.Infrastructure.Assistant.Tools.UpdateLocationParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateLocationTool|95.2%|| |Kagura.Infrastructure.Assistant.Tools.UpdateLocationVariantParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateLocationVariantTool|95.5%|| |Kagura.Infrastructure.Assistant.Tools.UpdateLoreParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateLoreTool|95.2%|| |Kagura.Infrastructure.Assistant.Tools.UpdateOutfitParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateOutfitTool|96.1%|| |Kagura.Infrastructure.Assistant.Tools.UpdateProjectParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateProjectTool|92.8%|| |Kagura.Infrastructure.Assistant.Tools.UpdateRelationshipParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateRelationshipTool|97.1%|| |Kagura.Infrastructure.Assistant.Tools.UpdateSceneLineParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateSceneLineTool|95.1%|75%| |Kagura.Infrastructure.Assistant.Tools.UpdateSceneParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateSceneTool|95.4%|| |Kagura.Infrastructure.Assistant.Tools.UpdateTimelineEventParams|100%|| |Kagura.Infrastructure.Assistant.Tools.UpdateTimelineEventTool|96.2%|| |Kagura.Infrastructure.Assistant.Tools.ViewSkillParams|100%|| |Kagura.Infrastructure.Assistant.Tools.ViewSkillTool|100%|| |Kagura.Infrastructure.Assistant.Tools.WriteSceneLinesParams|100%|| |Kagura.Infrastructure.Assistant.Tools.WriteSceneLinesTool|93.6%|80%| |Kagura.Infrastructure.Backups.BackupOptions|100%|| |Kagura.Infrastructure.Backups.BackupService|71.4%|83.3%| |Kagura.Infrastructure.Backups.BackupWriter|92.3%|85.4%| |Kagura.Infrastructure.DependencyInjection|100%|100%| |Kagura.Infrastructure.Diagnostics.SqliteDatabaseSnapshotStore|100%|100%| |Kagura.Infrastructure.Emotions.EfEmotionStore|92.3%|75%| |Kagura.Infrastructure.Emotions.EmotionSeeder|100%|100%| |Kagura.Infrastructure.Generation.ActivityQueue|99.3%|95.4%| |Kagura.Infrastructure.Generation.ActivityQueueWorker|100%|| |Kagura.Infrastructure.Graph.EfGraphStore|98.2%|90.9%| |Kagura.Infrastructure.Journal.EfChangeJournal|100%|| |Kagura.Infrastructure.Journal.EfDocumentReverter|95%|91.6%| |Kagura.Infrastructure.Journal.EfUndoStore|98.4%|90.9%| |Kagura.Infrastructure.Journal.OperationContext|100%|100%| |Kagura.Infrastructure.Journal.SnapshotApplier|95%|90%| |Kagura.Infrastructure.KnowledgeBase.CgSetImageGenerator|90.6%|37.5%| |Kagura.Infrastructure.KnowledgeBase.CgVariationImageGenerator|91.3%|40%| |Kagura.Infrastructure.KnowledgeBase.CharacterImageGenerator|97.8%|83.3%| |Kagura.Infrastructure.KnowledgeBase.EfCgGenerationStore|91.6%|| |Kagura.Infrastructure.KnowledgeBase.EfCgSetStore|90.9%|50%| |Kagura.Infrastructure.KnowledgeBase.EfCgVariationStore|90.9%|50%| |Kagura.Infrastructure.KnowledgeBase.EfCharacterStore|92%|64.2%| |Kagura.Infrastructure.KnowledgeBase.EfExpressionStore|96.1%|75%| |Kagura.Infrastructure.KnowledgeBase.EfLocationStore|95.1%|80%| |Kagura.Infrastructure.KnowledgeBase.EfLocationVariantStore|96.9%|83.3%| |Kagura.Infrastructure.KnowledgeBase.EfLoreStore|100%|100%| |Kagura.Infrastructure.KnowledgeBase.EfOutfitStore|95%|75%| |Kagura.Infrastructure.KnowledgeBase.EfRelationshipStore|93.4%|60%| |Kagura.Infrastructure.KnowledgeBase.EfTimelineStore|93.9%|75%| |Kagura.Infrastructure.KnowledgeBase.ExpressionImageGenerator|94.4%|81.5%| |Kagura.Infrastructure.KnowledgeBase.ImageSharpCropper|100%|100%| |Kagura.Infrastructure.KnowledgeBase.LocationImageGenerator|97.6%|75%| |Kagura.Infrastructure.KnowledgeBase.LocationVariantImageGenerator|95.7%|75%| |Kagura.Infrastructure.KnowledgeBase.OutfitImageGenerator|97.1%|85.2%| |Kagura.Infrastructure.KnowledgeBase.RegionMaskRasterizer|100%|100%| |Kagura.Infrastructure.KnowledgeBase.SpriteEnrichment|91.1%|81.2%| |Kagura.Infrastructure.Notifications.InProcessDomainChangedBus|100%|100%| |Kagura.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.CgGenerationConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.CgSetConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.CgVariationConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.ChangeLogEntryConfiguratio<br/>n|100%|| |Kagura.Infrastructure.Persistence.Configurations.ChapterConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.CharacterConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.EmotionConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.EntryConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.ExpressionConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.JsonColumnMapper|100%|| |Kagura.Infrastructure.Persistence.Configurations.LinkConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.LocationConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.LocationVariantConfigurati<br/>on|100%|| |Kagura.Infrastructure.Persistence.Configurations.LoreEntryConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.OutfitConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.ProjectConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.RelationshipConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.SceneConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.SceneStepConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.SkillConfiguration|100%|| |Kagura.Infrastructure.Persistence.Configurations.TimelineEventConfiguration|100%|| |Kagura.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Kagura.Infrastructure.Persistence.KaguraDbContext|83.3%|88%| |Kagura.Infrastructure.Persistence.KaguraDbContextFactory|0%|| |Kagura.Infrastructure.Persistence.Migrations.AddAppSettings|99.3%|| |Kagura.Infrastructure.Persistence.Migrations.AddCgSets|99.6%|| |Kagura.Infrastructure.Persistence.Migrations.AddCgVariations|99.5%|| |Kagura.Infrastructure.Persistence.Migrations.AddChangeLogUndoFlag|96.8%|| |Kagura.Infrastructure.Persistence.Migrations.AddChapters|99.5%|| |Kagura.Infrastructure.Persistence.Migrations.AddChapterStoryBeats|99.3%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacterBaseAppearance|98.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacterBaseImage|99%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacterBodyAttributes|99.1%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacterFraming|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacterHeight|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacterProfile|92.9%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacters|98.7%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacterTier|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacterVoiceConfigs|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddCharacterVoiceProviderId|99.5%|| |Kagura.Infrastructure.Persistence.Migrations.AddEmotions|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddExpressions|99.5%|| |Kagura.Infrastructure.Persistence.Migrations.AddGraphEntryAndLink|97.7%|| |Kagura.Infrastructure.Persistence.Migrations.AddLocationBaseImage|99.1%|| |Kagura.Infrastructure.Persistence.Migrations.AddLocationBaseTags|99.1%|| |Kagura.Infrastructure.Persistence.Migrations.AddLocationHierarchy|96.6%|| |Kagura.Infrastructure.Persistence.Migrations.AddLocations|98.9%|| |Kagura.Infrastructure.Persistence.Migrations.AddLocationVariantImage|99.3%|| |Kagura.Infrastructure.Persistence.Migrations.AddLocationVariants|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddLocationVariantTags|98.8%|| |Kagura.Infrastructure.Persistence.Migrations.AddLoreEntries|99%|| |Kagura.Infrastructure.Persistence.Migrations.AddLoreEntryTables|97.8%|| |Kagura.Infrastructure.Persistence.Migrations.AddOutfitClothingTags|99.1%|| |Kagura.Infrastructure.Persistence.Migrations.AddOutfitDisabledInheritedTags|99.1%|| |Kagura.Infrastructure.Persistence.Migrations.AddOutfitFaceRegion|98.7%|| |Kagura.Infrastructure.Persistence.Migrations.AddOutfitImage|99.1%|| |Kagura.Infrastructure.Persistence.Migrations.AddOutfitReferenceTuning|99.2%|| |Kagura.Infrastructure.Persistence.Migrations.AddOutfits|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddOutfitUseBaseImageReference|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddPerRecordStyleReferenceTuni<br/>ng|97.1%|| |Kagura.Infrastructure.Persistence.Migrations.AddProjectAssistantMemory|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddProjectDescription|98.1%|| |Kagura.Infrastructure.Persistence.Migrations.AddProjectStyleReference|99%|| |Kagura.Infrastructure.Persistence.Migrations.AddProjectStyleSource|99.2%|| |Kagura.Infrastructure.Persistence.Migrations.AddRelationships|99.2%|| |Kagura.Infrastructure.Persistence.Migrations.AddSceneMetadata|97.3%|| |Kagura.Infrastructure.Persistence.Migrations.AddScenes|99.5%|| |Kagura.Infrastructure.Persistence.Migrations.AddSceneSteps|99.5%|| |Kagura.Infrastructure.Persistence.Migrations.AddSceneStepStage|99%|| |Kagura.Infrastructure.Persistence.Migrations.AddSceneStepVoice|99.4%|| |Kagura.Infrastructure.Persistence.Migrations.AddSkills|99.6%|| |Kagura.Infrastructure.Persistence.Migrations.AddSoftDeleteAndChangeLog|90.3%|| |Kagura.Infrastructure.Persistence.Migrations.AddStageViews|98.3%|| |Kagura.Infrastructure.Persistence.Migrations.AddTimelineEvents|99.2%|| |Kagura.Infrastructure.Persistence.Migrations.CharacterPreviewImage|99.3%|| |Kagura.Infrastructure.Persistence.Migrations.InitialCreate|94.4%|| |Kagura.Infrastructure.Persistence.Migrations.KaguraDbContextModelSnapshot|100%|| |Kagura.Infrastructure.Persistence.Migrations.LocationPreviewImage|99.3%|| |Kagura.Infrastructure.Persistence.Migrations.MultiFaceRegions|98.2%|| |Kagura.Infrastructure.Persistence.Migrations.ReferenceStrengthDefault|98.8%|| |Kagura.Infrastructure.Projects.EfProjectStore|93.5%|71.4%| |Kagura.Infrastructure.Projects.FileSystemProjectAssetStore|89.4%|71.5%| |Kagura.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Kagura.Infrastructure.Settings.NovelAiGateway|76.4%|50%| |Kagura.Infrastructure.Settings.OpenRouterGateway|85%|79.4%| |Kagura.Infrastructure.Settings.SpriteRequestMapper|100%|100%| |Kagura.Infrastructure.Tags.SqliteTagSearch|97.9%|87.9%| |Kagura.Infrastructure.Tags.TagDatabaseOptions|100%|| |Kagura.Infrastructure.Tts.FishAudioTtsProvider|87.9%|58.6%| |Kagura.Infrastructure.Tts.OpenAiCompatibleTtsProvider|87.5%|54.5%| |Kagura.Infrastructure.Tts.PocketTtsProvider|76.4%|69%| |Kagura.Infrastructure.Tts.Qwen3TtsProvider|87.3%|66.6%| |Kagura.Infrastructure.Tts.SceneStepAudioGenerator|92.3%|71.4%| |Kagura.Infrastructure.Tts.TtsProviderRegistry|100%|| |Kagura.Infrastructure.Tts.VoicePreviewGenerator|91.3%|67.8%| |Kagura.Infrastructure.VisualNovel.EfChapterStore|93.7%|75%| |Kagura.Infrastructure.VisualNovel.EfSceneStepStore|91.8%|66.6%| |Kagura.Infrastructure.VisualNovel.EfSceneStore|93.7%|75%| |System.Text.RegularExpressions.Generated|83.4%|68%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FFD7A84EAF2E5F7B<br/>C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__ArtifactTimestampRegex_2|81.9%|62.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FFD7A84EAF2E5F7B<br/>C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__ProjectRoute_0|88.5%|80.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FFD7A84EAF2E5F7B<br/>C689CA5BBE6D1849B2CA79581BBB07D40636D85790C0E51A9__TabQuery_1|80.7%|62.5%| </details> <details><summary>Kagura.Kernel - 90%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Kernel**|**90%**|**75%**| |Kagura.Kernel.Err`1|100%|| |Kagura.Kernel.Ok`1|100%|| |Kagura.Kernel.Result`1|87.5%|75%| </details> <details><summary>Kagura.Server - 80.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Server**|**80.9%**|**75.9%**| |Kagura.Server.Components.App|100%|| |Kagura.Server.Components.Layout.MainLayout|100%|| |Kagura.Server.Components.Pages.Error|100%|50%| |Kagura.Server.Components.Pages.Gate|100%|100%| |Kagura.Server.Security.AccessGate|100%|83.3%| |Kagura.Server.Security.AccessSecret|100%|100%| |Program|74.3%|73%| </details> <details><summary>Kagura.UseCases - 95.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.UseCases**|**95.1%**|**78.6%**| |Kagura.UseCases.Assistant.AssistantContext|100%|| |Kagura.UseCases.Assistant.AssistantEntry|100%|| |Kagura.UseCases.Assistant.AssistantEvent|100%|| |Kagura.UseCases.Assistant.ConversationSnapshot|100%|| |Kagura.UseCases.Assistant.ListSkills|100%|| |Kagura.UseCases.Assistant.MemoryDocument|89.1%|75%| |Kagura.UseCases.Assistant.MemoryOperation|100%|| |Kagura.UseCases.Assistant.ReviewDue|100%|100%| |Kagura.UseCases.Assistant.SaveCreatorProfile|75%|50%| |Kagura.UseCases.Assistant.SaveProjectAssistantMemory|80%|50%| |Kagura.UseCases.Assistant.SaveSkill|89.7%|77.2%| |Kagura.UseCases.Assistant.SkillDto|75%|| |Kagura.UseCases.DependencyInjection|100%|| |Kagura.UseCases.Diagnostics.DatabaseSnapshot|100%|| |Kagura.UseCases.Diagnostics.DownloadDatabase|100%|| |Kagura.UseCases.Diagnostics.SeedDevData|100%|100%| |Kagura.UseCases.Emotions.CreateEmotion|100%|66.6%| |Kagura.UseCases.Emotions.DeleteEmotion|100%|100%| |Kagura.UseCases.Emotions.EmotionDto|91.6%|| |Kagura.UseCases.Emotions.ListEmotions|100%|| |Kagura.UseCases.Emotions.UpdateEmotion|100%|50%| |Kagura.UseCases.Generation.Activity`1|100%|50%| |Kagura.UseCases.Generation.ActivityChanged|100%|| |Kagura.UseCases.Generation.ActivityOutcome|100%|| |Kagura.UseCases.Generation.ActivityProgress|100%|| |Kagura.UseCases.Generation.ActivityView|91.6%|| |Kagura.UseCases.Generation.GeneratedImage|100%|| |Kagura.UseCases.Generation.GenerationCanvas|100%|100%| |Kagura.UseCases.Generation.GenerationSubject|100%|| |Kagura.UseCases.Generation.Img2ImgSource|100%|| |Kagura.UseCases.Generation.InpaintSource|100%|| |Kagura.UseCases.Generation.JobResult`1|100%|| |Kagura.UseCases.Generation.LineageReference|100%|| |Kagura.UseCases.Generation.SpriteGenerationSpec|100%|| |Kagura.UseCases.Generation.StyleReference|100%|| |Kagura.UseCases.Graph.EdgeGroup|100%|| |Kagura.UseCases.Graph.FindLinkTargets|100%|| |Kagura.UseCases.Graph.GetNodeGraph|97.5%|78.5%| |Kagura.UseCases.Graph.GraphEdgeView|100%|| |Kagura.UseCases.Graph.LinkNodes|100%|100%| |Kagura.UseCases.Graph.NodeGraphView|100%|| |Kagura.UseCases.Graph.NodeSummary|100%|| |Kagura.UseCases.Graph.RemoveLink|100%|100%| |Kagura.UseCases.Graph.RestoreLink|100%|100%| |Kagura.UseCases.Graph.StructuralEdge|100%|| |Kagura.UseCases.Journal.ChangeRecordView|57.1%|| |Kagura.UseCases.Journal.DocumentRevision|100%|| |Kagura.UseCases.Journal.FieldChange|100%|| |Kagura.UseCases.Journal.GetDocumentHistory|100%|| |Kagura.UseCases.Journal.GetEntityHistory|100%|| |Kagura.UseCases.Journal.GetRevisionDiff|100%|50%| |Kagura.UseCases.Journal.GetUndoStatus|100%|| |Kagura.UseCases.Journal.Redo|100%|100%| |Kagura.UseCases.Journal.RevertDocument|100%|100%| |Kagura.UseCases.Journal.RevertOutcome|100%|| |Kagura.UseCases.Journal.RevisionCoalescer|100%|100%| |Kagura.UseCases.Journal.RevisionDiff|80%|50%| |Kagura.UseCases.Journal.RevisionDiffBuilder|98.4%|86.5%| |Kagura.UseCases.Journal.RowChange|100%|| |Kagura.UseCases.Journal.Undo|100%|100%| |Kagura.UseCases.Journal.UndoOutcome|100%|| |Kagura.UseCases.Journal.UndoStatus|100%|| |Kagura.UseCases.KnowledgeBase.AdoptEmotions|100%|100%| |Kagura.UseCases.KnowledgeBase.CgGenerationDto|92.8%|100%| |Kagura.UseCases.KnowledgeBase.CgSetDto|87.5%|| |Kagura.UseCases.KnowledgeBase.CgVariationDto|93.7%|| |Kagura.UseCases.KnowledgeBase.CharacterDto|98.2%|| |Kagura.UseCases.KnowledgeBase.CharacterSpriteContent|100%|| |Kagura.UseCases.KnowledgeBase.CreateCgSet|100%|| |Kagura.UseCases.KnowledgeBase.CreateCgVariation|88.8%|75%| |Kagura.UseCases.KnowledgeBase.CreateCharacter|100%|| |Kagura.UseCases.KnowledgeBase.CreateLocation|100%|| |Kagura.UseCases.KnowledgeBase.CreateLocationVariant|100%|75%| |Kagura.UseCases.KnowledgeBase.CreateLore|100%|| |Kagura.UseCases.KnowledgeBase.CreateOutfit|100%|75%| |Kagura.UseCases.KnowledgeBase.CreateRelationship|93.3%|80%| |Kagura.UseCases.KnowledgeBase.CreateTimelineEvent|100%|| |Kagura.UseCases.KnowledgeBase.DeleteCgSet|100%|100%| |Kagura.UseCases.KnowledgeBase.DeleteCgVariation|100%|50%| |Kagura.UseCases.KnowledgeBase.DeleteCharacter|100%|100%| |Kagura.UseCases.KnowledgeBase.DeleteLocation|100%|100%| |Kagura.UseCases.KnowledgeBase.DeleteLocationVariant|100%|100%| |Kagura.UseCases.KnowledgeBase.DeleteLore|100%|100%| |Kagura.UseCases.KnowledgeBase.DeleteOutfit|100%|100%| |Kagura.UseCases.KnowledgeBase.DeleteRelationship|100%|50%| |Kagura.UseCases.KnowledgeBase.DeleteTimelineEvent|100%|50%| |Kagura.UseCases.KnowledgeBase.ExpressionView|100%|| |Kagura.UseCases.KnowledgeBase.FindParentCandidates|100%|50%| |Kagura.UseCases.KnowledgeBase.GetCgSet|100%|100%| |Kagura.UseCases.KnowledgeBase.GetCgVariation|100%|100%| |Kagura.UseCases.KnowledgeBase.GetCharacter|100%|100%| |Kagura.UseCases.KnowledgeBase.GetLocation|100%|100%| |Kagura.UseCases.KnowledgeBase.GetLocationHierarchy|100%|| |Kagura.UseCases.KnowledgeBase.GetLocationVariant|100%|58.3%| |Kagura.UseCases.KnowledgeBase.GetLore|100%|100%| |Kagura.UseCases.KnowledgeBase.GetOutfit|100%|100%| |Kagura.UseCases.KnowledgeBase.GetRelationshipsForCharacter|100%|| |Kagura.UseCases.KnowledgeBase.ListCgGenerations|100%|50%| |Kagura.UseCases.KnowledgeBase.ListCgSets|100%|| |Kagura.UseCases.KnowledgeBase.ListCgVariations|100%|| |Kagura.UseCases.KnowledgeBase.ListCharacterImages|100%|92.8%| |Kagura.UseCases.KnowledgeBase.ListCharacters|100%|| |Kagura.UseCases.KnowledgeBase.ListExpressions|100%|100%| |Kagura.UseCases.KnowledgeBase.ListLocationImages|100%|90%| |Kagura.UseCases.KnowledgeBase.ListLocations|100%|| |Kagura.UseCases.KnowledgeBase.ListLocationVariants|100%|| |Kagura.UseCases.KnowledgeBase.ListLore|100%|| |Kagura.UseCases.KnowledgeBase.ListOutfits|100%|| |Kagura.UseCases.KnowledgeBase.ListProjectAssets|100%|100%| |Kagura.UseCases.KnowledgeBase.ListRelationships|100%|| |Kagura.UseCases.KnowledgeBase.ListTimeline|100%|| |Kagura.UseCases.KnowledgeBase.LocationDto|89.4%|| |Kagura.UseCases.KnowledgeBase.LocationHierarchyView|100%|| |Kagura.UseCases.KnowledgeBase.LocationPreviewSource|100%|| |Kagura.UseCases.KnowledgeBase.LocationVariantDto|91.6%|| |Kagura.UseCases.KnowledgeBase.LocationVariantEditorView|100%|| |Kagura.UseCases.KnowledgeBase.LoreDto|85.7%|| |Kagura.UseCases.KnowledgeBase.OpenCgGeneration|0%|0%| |Kagura.UseCases.KnowledgeBase.OpenCgSetBase|0%|0%| |Kagura.UseCases.KnowledgeBase.OpenCharacterBaseSprite|88.8%|70%| |Kagura.UseCases.KnowledgeBase.OpenCharacterPreview|88.8%|60%| |Kagura.UseCases.KnowledgeBase.OpenExpressionSprite|92.3%|68.7%| |Kagura.UseCases.KnowledgeBase.OpenLocationBackground|88.8%|70%| |Kagura.UseCases.KnowledgeBase.OpenLocationPreview|88.8%|60%| |Kagura.UseCases.KnowledgeBase.OpenLocationVariant|90.9%|75%| |Kagura.UseCases.KnowledgeBase.OpenOutfitSprite|90.9%|75%| |Kagura.UseCases.KnowledgeBase.OutfitDto|96.7%|| |Kagura.UseCases.KnowledgeBase.OutfitEditorView|100%|| |Kagura.UseCases.KnowledgeBase.PreviewSource|100%|| |Kagura.UseCases.KnowledgeBase.ProjectAssetView|100%|| |Kagura.UseCases.KnowledgeBase.RelationshipDto|88%|| |Kagura.UseCases.KnowledgeBase.RelationshipEndpoint|100%|| |Kagura.UseCases.KnowledgeBase.RemoveCharacterPreview|75%|50%| |Kagura.UseCases.KnowledgeBase.RemoveExpression|100%|100%| |Kagura.UseCases.KnowledgeBase.RemoveLocationPreview|75%|50%| |Kagura.UseCases.KnowledgeBase.ReorderTimelineEvent|94.1%|87.5%| |Kagura.UseCases.KnowledgeBase.SetCharacterPreview|80.7%|63.8%| |Kagura.UseCases.KnowledgeBase.SetLocationParent|90.4%|81.2%| |Kagura.UseCases.KnowledgeBase.SetLocationPreview|93.7%|85.7%| |Kagura.UseCases.KnowledgeBase.SetOutfitFaceRegions|100%|50%| |Kagura.UseCases.KnowledgeBase.TimelineEventDto|88.8%|| |Kagura.UseCases.KnowledgeBase.UpdateCgSet|100%|100%| |Kagura.UseCases.KnowledgeBase.UpdateCgVariation|100%|100%| |Kagura.UseCases.KnowledgeBase.UpdateCharacter|100%|100%| |Kagura.UseCases.KnowledgeBase.UpdateLocation|100%|100%| |Kagura.UseCases.KnowledgeBase.UpdateLocationVariant|100%|100%| |Kagura.UseCases.KnowledgeBase.UpdateLore|100%|100%| |Kagura.UseCases.KnowledgeBase.UpdateOutfit|100%|100%| |Kagura.UseCases.KnowledgeBase.UpdateRelationship|100%|50%| |Kagura.UseCases.KnowledgeBase.UpdateTimelineEvent|100%|50%| |Kagura.UseCases.Notifications.DomainChanged|100%|| |Kagura.UseCases.Projects.ClearProjectStyleReference|100%|100%| |Kagura.UseCases.Projects.CreateProject|100%|100%| |Kagura.UseCases.Projects.DeleteProject|100%|100%| |Kagura.UseCases.Projects.GetProject|100%|100%| |Kagura.UseCases.Projects.ListProjects|100%|| |Kagura.UseCases.Projects.OpenProjectStyleReference|100%|83.3%| |Kagura.UseCases.Projects.ProjectDto|100%|| |Kagura.UseCases.Projects.SetProjectStageView|100%|50%| |Kagura.UseCases.Projects.SetProjectStyle|100%|85%| |Kagura.UseCases.Projects.SetProjectStyleReference|100%|100%| |Kagura.UseCases.Projects.StyleReferenceContent|100%|| |Kagura.UseCases.Projects.UpdateProject|100%|100%| |Kagura.UseCases.Settings.AssistantReasoningEfforts|100%|83.3%| |Kagura.UseCases.Settings.CheckNovelAiToken|100%|100%| |Kagura.UseCases.Settings.GenerationDefaultTagsJson|100%|100%| |Kagura.UseCases.Settings.GetNovelAiSettings|100%|| |Kagura.UseCases.Settings.GetOpenRouterSettings|100%|100%| |Kagura.UseCases.Settings.ListOpenRouterModels|100%|| |Kagura.UseCases.Settings.ModelReasoningSupport|100%|| |Kagura.UseCases.Settings.NovelAiModelOption|100%|| |Kagura.UseCases.Settings.NovelAiSettingsView|100%|| |Kagura.UseCases.Settings.OpenRouterModelOption|100%|| |Kagura.UseCases.Settings.OpenRouterSettingsView|100%|| |Kagura.UseCases.Settings.SaveGenerationDefaultTags|100%|| |Kagura.UseCases.Settings.SaveNovelAiModel|100%|| |Kagura.UseCases.Settings.SaveNovelAiToken|100%|100%| |Kagura.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Kagura.UseCases.Settings.SaveOpenRouterModel|100%|| |Kagura.UseCases.Settings.SaveOpenRouterReasoningEffort|100%|| |Kagura.UseCases.Settings.SettingKeys|87.5%|75%| |Kagura.UseCases.Tags.SimilarTag|100%|| |Kagura.UseCases.Tags.TagCategoryCount|100%|| |Kagura.UseCases.Tags.TagDetails|100%|| |Kagura.UseCases.Tags.TagResolution|100%|| |Kagura.UseCases.Tags.TagSearchFilter|100%|| |Kagura.UseCases.Tags.TagSuggestion|100%|| |Kagura.UseCases.Tags.TagSummary|83.3%|| |Kagura.UseCases.Tts.AudioContentTypes|62.5%|62.5%| |Kagura.UseCases.Tts.CharacterVoiceConfig|100%|| |Kagura.UseCases.Tts.CheckTtsConnection|100%|100%| |Kagura.UseCases.Tts.GeneratedAudio|100%|| |Kagura.UseCases.Tts.GetTtsSettings|100%|100%| |Kagura.UseCases.Tts.ListTtsVoices|80%|50%| |Kagura.UseCases.Tts.OpenSceneStepAudio|77.7%|50%| |Kagura.UseCases.Tts.OpenVoiceClipByToken|92.3%|91.6%| |Kagura.UseCases.Tts.SaveTtsProviderField|94.4%|88.8%| |Kagura.UseCases.Tts.SceneStepAudioContent|100%|| |Kagura.UseCases.Tts.SetCharacterVoiceClip|88.8%|58.3%| |Kagura.UseCases.Tts.TtsFieldView|100%|| |Kagura.UseCases.Tts.TtsProviderDescriptor|100%|| |Kagura.UseCases.Tts.TtsProviderView|100%|| |Kagura.UseCases.Tts.TtsSettingField|100%|| |Kagura.UseCases.Tts.TtsSettingsView|100%|| |Kagura.UseCases.Tts.TtsVoice|100%|| |Kagura.UseCases.Tts.TtsVoiceCapabilities|83.3%|| |Kagura.UseCases.Tts.TtsVoiceHandle|100%|| |Kagura.UseCases.Tts.VoiceReferenceClip|100%|| |Kagura.UseCases.VisualNovel.AddSceneStep|90%|50%| |Kagura.UseCases.VisualNovel.ChapterDto|89.4%|| |Kagura.UseCases.VisualNovel.CreateChapter|100%|| |Kagura.UseCases.VisualNovel.CreateScene|100%|100%| |Kagura.UseCases.VisualNovel.DeleteChapter|100%|50%| |Kagura.UseCases.VisualNovel.DeleteScene|100%|50%| |Kagura.UseCases.VisualNovel.DeleteSceneStep|100%|50%| |Kagura.UseCases.VisualNovel.GetChapter|100%|100%| |Kagura.UseCases.VisualNovel.GetPlayerScript|100%|70%| |Kagura.UseCases.VisualNovel.GetScene|100%|100%| |Kagura.UseCases.VisualNovel.GetSceneCast|100%|100%| |Kagura.UseCases.VisualNovel.GetSceneStageOptions|100%|100%| |Kagura.UseCases.VisualNovel.ListChapters|100%|| |Kagura.UseCases.VisualNovel.ListScenes|100%|| |Kagura.UseCases.VisualNovel.ListSceneSteps|100%|| |Kagura.UseCases.VisualNovel.PlayerSceneDto|100%|100%| |Kagura.UseCases.VisualNovel.PlayerScriptDto|100%|| |Kagura.UseCases.VisualNovel.ReorderChapters|100%|| |Kagura.UseCases.VisualNovel.ReorderScenes|100%|| |Kagura.UseCases.VisualNovel.ReorderSceneSteps|100%|| |Kagura.UseCases.VisualNovel.SceneCastMember|100%|| |Kagura.UseCases.VisualNovel.SceneDto|96.5%|| |Kagura.UseCases.VisualNovel.SceneStageOptions|100%|| |Kagura.UseCases.VisualNovel.SceneStepDto|92.5%|| |Kagura.UseCases.VisualNovel.SetSceneStepStage|100%|50%| |Kagura.UseCases.VisualNovel.StageBackgroundOption|100%|| |Kagura.UseCases.VisualNovel.StageCastOption|100%|| |Kagura.UseCases.VisualNovel.StageExpressionOption|100%|| |Kagura.UseCases.VisualNovel.StageOutfitOption|100%|| |Kagura.UseCases.VisualNovel.UpdateChapter|100%|50%| |Kagura.UseCases.VisualNovel.UpdateScene|100%|50%| |Kagura.UseCases.VisualNovel.UpdateSceneStep|100%|50%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! This is wonderful~ The way the composition mirrors LocationVariant and Outfit exactly — typed Guid, indexed column, no EF relationship — the append-only timeline with the frozen prompt snapshot, the publish-as-pointer-move... fufu~, every piece falls into place like a puzzle I didn't know I wanted to solve ♪

The EffectiveSceneTags composition (set tags minus disabled, plus own) is clean and sharp. The CgVariationImageGenerator mirrors CgSetImageGenerator almost line-for-line — pre-check scope → queue → worker scope — and the differences (append instead of replace, publish after render) are exactly the ones ADR 0049 calls for. The auto-save debounce with SyncFormFromState mirrors the set editor precisely, including the "never while dirty" reload guard. I'm genuinely impressed~

Verdict: I can't let this pass~ ♡

The architecture is beautiful, but you added two new database entities with custom UtcTicksConverter mappings, a brand-new AsJsonRequired() JSON column mapper, EF default values, and a migration — and none of it is verified against a real SQLite database. Fufu~ you wouldn't leave this in production, would you?

These need fixing before I'm satisfied~

  1. No integration tests for CgVariation / CgGeneration persistence — Your sibling CgSetTests.cs has 6 SQLite-backed tests that verify everything: journal creation, graph-node TPT storage, profile round-trip, base-image-not-journaled, delete-hides-from-list, cross-project isolation. The two new entities have zero equivalent tests. The migration adds two new tables with:

    • UtcTicksConverter on CreatedAt/UpdatedAt/DeletedAt (you noted in the PR body that SQLite "threw at first contact" without it — but it's never tested against real SQLite!)
    • AsJsonRequired() — a brand-new JsonColumnMapper extension with a documented caveat about record change tracking for collection members. CgPromptSnapshot holds IReadOnlyList<PromptTag> and IReadOnlyList<CgSubjectSnapshot> — exactly the shape the caveat warns about. Has it been round-tripped through a real DB? We don't know, because no test does it.
    • EF default values (UseStyleReference=true, Strength=0.65m, Fidelity=1.0m) — verified in the snapshot and migration, but never asserted to actually materialize on a fresh row read back.
    • The soft-delete query filter (HasQueryFilter) on both entities — never tested to confirm trashed variations/generations vanish from queries.
    • The composite index IX_CgGenerations_CgVariationId_CreatedAt — the timeline's ORDER BY depends on the ticks conversion working at the SQL level, and no integration test exercises it.

    Fix: Add a CgVariationTests.cs integration test (sibling to CgSetTests.cs) that covers at minimum: creation journals, profile round-trip through real SQLite (tags, disabled inherited tags, style tuning scalars), soft-delete hides from ListForSetAsync, and the UtcTicksConverter columns survive. A CgGenerationTests.cs for the append-only store + ListForVariationAsync ordering + AsJsonRequired snapshot round-trip is also needed.

  2. No integration tests for the CgVariationImageGenerator append-and-publish flow — Your sibling CgSetImageGenerationTests.cs has 5 tests covering the generation pipeline: success path, CG defaults (not location/character ones), artist source, muted set, and no-positive-tag-refused. The variation generator has critical behaviors that are only exercised through the adapter-layer fake (FakeCgVariationImageGenerator which just returns Result.Ok):

    • The file is appended (not replaced) via SaveCgVariationGenerationAsync
    • A CgGeneration row is created and persisted with the frozen snapshot
    • PublishAsync is called to point the variation at the new generation
    • The file naming uses Guid.CreateVersion7() to avoid collision
    • The effective-tags-minus-disabled logic runs through the real SpriteEnrichment path

    The fake generator returns instantly without doing any of this. The real RunAsync method — which is the entire point of the append-only design — is completely untested against real infrastructure.

    Fix: Add CgVariationImageGenerationTests.cs mirroring CgSetImageGenerationTests.cs, testing at minimum: success appends a generation + publishes it, disabled inherited tags are excluded from the effective prompt, and a variation with no effective positive tag is refused.

  3. Four new assistant tools with zero integration testsget_cg_variation, create_cg_variation, update_cg_variation, delete_cg_variation are registered in ChatSession and execute real use-case logic (project-scope checks, tag merging, style-reference threading). AssistantWriteToolsTests.cs has 25 tests covering every other mutation tool (characters, outfits, locations, lore, relationships, timeline events, chapters, scenes, links, project settings) — but the four new CgVariation tools have no test at all. The update_cg_variation tool's style-reference preservation (current.StyleReference threaded as the 4th positional) is exactly the class of silent-reset bug that PR #199 caught for VoiceProviderId — and it has no test pinning it.

    Now, I checked: the existing CgSet tools (get_event_cg, create_cg_set, etc.) also have no integration tests, so the variation tools technically follow an existing pattern. But the CgSet tools predate the testing convention; these four are new code in a PR that adds 97 other tests. Fufu~ adding tests for everything except the assistant tools feels like an oversight, not a decision.

    Fix: Add at least one test to AssistantWriteToolsTests.cs that creates a variation, verifies it appears in get_event_cg's response, partially edits it (title only, verifying style tuning survives), and deletes it — mirroring A_character_is_created_edited_and_deleted_through_the_agent.

💡 Little ideas (non-blocking)~

  1. CgEditorPage.razor:55 — The CanGenerate computed property correctly judges the effective prompt on the client side, but it duplicates the EffectiveSceneTags logic inline (set tags minus disabled + own positive check). The domain method CgVariation.EffectiveSceneTags(setTags) already encodes this. Consider whether the editor could call through to a shared helper rather than re-deriving the rule — if the disable-by-name logic ever changes, this client-side mirror would need to track it. Not blocking because it's correct today and the logic is simple.

  2. CgVariationProfile.cs:14 — The null! default on the StyleReference init property is a clever trick to land positional callers on the default tuning, and the comment explains it well. Consider whether a StyleReferenceTuning? parameter with ?? Default in the init accessor would be more self-documenting — but the current approach works and mirrors other profiles in the codebase.

What I liked~

  • The SuppressJournaling pattern on PublishAsync and AddAsync for generations is exactly right — a render is not authored content, and the comment says so clearly. Mirrors SetBaseImageAsync on the sibling store perfectly ♪
  • The SyncFormFromState logic with isNewDocument || (isFresherAndIdle && !dirty) is the correct auto-save adoption rule — it prevents both the "stale render under new URL" and the "reload mid-typing" traps. Every editor in this codebase follows it and this one does too~
  • The seed with two variations (one with a disabled inherited tag) is thoughtful — it means the editor opens onto authored content and the cleared checkbox shows immediately. Real content, not just empty states.
  • The CSS grid layout with five fixed regions and overflow: hidden on the container is a clean design — the PR body's honest note about the FAB collision and yielding the corner shows real verification happened.
  • The AsJsonRequired doc comment honestly documents the change-tracking caveat for records with collection members. That's the kind of self-aware code documentation I love to see~
  • 60 adapter tests pass, build is 0 warnings / 0 errors. The reducer tests cover every staleness arm, the effects tests cover every success/failure/stale path, and the page tests cover the five regions, inherited rows, gated generate, timeline preview, and cross-session sync. The adapter layer is thoroughly tested — it's the persistence and generation layers that need the same treatment.

Automated review by Jibril · 2026-08-05
CI/CD: absent for head SHA 2a18818 (no bot comment) · Local checks: build 0/0, 60 CG adapter tests + 14 CG integration tests pass

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! This is *wonderful*~ The way the composition mirrors LocationVariant and Outfit exactly — typed Guid, indexed column, no EF relationship — the append-only timeline with the frozen prompt snapshot, the publish-as-pointer-move... fufu~, every piece falls into place like a puzzle I didn't know I wanted to solve ♪ The `EffectiveSceneTags` composition (set tags minus disabled, plus own) is clean and sharp. The `CgVariationImageGenerator` mirrors `CgSetImageGenerator` almost line-for-line — pre-check scope → queue → worker scope — and the differences (append instead of replace, publish after render) are *exactly* the ones ADR 0049 calls for. The auto-save debounce with `SyncFormFromState` mirrors the set editor precisely, including the "never while dirty" reload guard. I'm genuinely impressed~ ### Verdict: ⛔ I can't let this pass~ ♡ The architecture is beautiful, but you added two new database entities with custom `UtcTicksConverter` mappings, a brand-new `AsJsonRequired()` JSON column mapper, EF default values, and a migration — and none of it is verified against a real SQLite database. Fufu~ you wouldn't leave *this* in production, would you? #### ⛔ These need fixing before I'm satisfied~ 1. **No integration tests for `CgVariation` / `CgGeneration` persistence** — Your sibling `CgSetTests.cs` has 6 SQLite-backed tests that verify everything: journal creation, graph-node TPT storage, profile round-trip, base-image-not-journaled, delete-hides-from-list, cross-project isolation. The two new entities have **zero** equivalent tests. The migration adds two new tables with: - `UtcTicksConverter` on `CreatedAt`/`UpdatedAt`/`DeletedAt` (you noted in the PR body that SQLite "threw at first contact" without it — but it's never tested against real SQLite!) - `AsJsonRequired()` — a **brand-new** `JsonColumnMapper` extension with a documented caveat about record change tracking for collection members. `CgPromptSnapshot` holds `IReadOnlyList<PromptTag>` and `IReadOnlyList<CgSubjectSnapshot>` — exactly the shape the caveat warns about. Has it been round-tripped through a real DB? We don't know, because no test does it. - EF default values (`UseStyleReference=true`, `Strength=0.65m`, `Fidelity=1.0m`) — verified in the snapshot and migration, but never asserted to actually materialize on a fresh row read back. - The soft-delete query filter (`HasQueryFilter`) on both entities — never tested to confirm trashed variations/generations vanish from queries. - The composite index `IX_CgGenerations_CgVariationId_CreatedAt` — the timeline's ORDER BY depends on the ticks conversion working at the SQL level, and no integration test exercises it. **Fix:** Add a `CgVariationTests.cs` integration test (sibling to `CgSetTests.cs`) that covers at minimum: creation journals, profile round-trip through real SQLite (tags, disabled inherited tags, style tuning scalars), soft-delete hides from `ListForSetAsync`, and the `UtcTicksConverter` columns survive. A `CgGenerationTests.cs` for the append-only store + `ListForVariationAsync` ordering + `AsJsonRequired` snapshot round-trip is also needed. 2. **No integration tests for the `CgVariationImageGenerator` append-and-publish flow** — Your sibling `CgSetImageGenerationTests.cs` has 5 tests covering the generation pipeline: success path, CG defaults (not location/character ones), artist source, muted set, and no-positive-tag-refused. The variation generator has critical behaviors that are **only** exercised through the adapter-layer fake (`FakeCgVariationImageGenerator` which just returns `Result.Ok`): - The file is appended (not replaced) via `SaveCgVariationGenerationAsync` - A `CgGeneration` row is created and persisted with the frozen snapshot - `PublishAsync` is called to point the variation at the new generation - The file naming uses `Guid.CreateVersion7()` to avoid collision - The effective-tags-minus-disabled logic runs through the real `SpriteEnrichment` path The fake generator returns instantly without doing any of this. The real `RunAsync` method — which is the entire point of the append-only design — is completely untested against real infrastructure. **Fix:** Add `CgVariationImageGenerationTests.cs` mirroring `CgSetImageGenerationTests.cs`, testing at minimum: success appends a generation + publishes it, disabled inherited tags are excluded from the effective prompt, and a variation with no effective positive tag is refused. 3. **Four new assistant tools with zero integration tests** — `get_cg_variation`, `create_cg_variation`, `update_cg_variation`, `delete_cg_variation` are registered in `ChatSession` and execute real use-case logic (project-scope checks, tag merging, style-reference threading). `AssistantWriteToolsTests.cs` has 25 tests covering every other mutation tool (characters, outfits, locations, lore, relationships, timeline events, chapters, scenes, links, project settings) — but the four new CgVariation tools have no test at all. The `update_cg_variation` tool's style-reference preservation (`current.StyleReference` threaded as the 4th positional) is exactly the class of silent-reset bug that PR #199 caught for `VoiceProviderId` — and it has no test pinning it. Now, I checked: the existing CgSet tools (`get_event_cg`, `create_cg_set`, etc.) also have no integration tests, so the variation tools technically follow an existing pattern. But the CgSet tools predate the testing convention; these four are *new* code in a PR that adds 97 other tests. Fufu~ adding tests for everything *except* the assistant tools feels like an oversight, not a decision. **Fix:** Add at least one test to `AssistantWriteToolsTests.cs` that creates a variation, verifies it appears in `get_event_cg`'s response, partially edits it (title only, verifying style tuning survives), and deletes it — mirroring `A_character_is_created_edited_and_deleted_through_the_agent`. #### 💡 Little ideas (non-blocking)~ 1. **`CgEditorPage.razor:55`** — The `CanGenerate` computed property correctly judges the effective prompt on the client side, but it duplicates the `EffectiveSceneTags` logic inline (set tags minus disabled + own positive check). The domain method `CgVariation.EffectiveSceneTags(setTags)` already encodes this. Consider whether the editor could call through to a shared helper rather than re-deriving the rule — if the disable-by-name logic ever changes, this client-side mirror would need to track it. Not blocking because it's correct today and the logic is simple. 2. **`CgVariationProfile.cs:14`** — The `null!` default on the `StyleReference` init property is a clever trick to land positional callers on the default tuning, and the comment explains it well. Consider whether a `StyleReferenceTuning?` parameter with `?? Default` in the init accessor would be more self-documenting — but the current approach works and mirrors other profiles in the codebase. #### ✅ What I liked~ - The `SuppressJournaling` pattern on `PublishAsync` and `AddAsync` for generations is *exactly right* — a render is not authored content, and the comment says so clearly. Mirrors `SetBaseImageAsync` on the sibling store perfectly ♪ - The `SyncFormFromState` logic with `isNewDocument || (isFresherAndIdle && !dirty)` is the correct auto-save adoption rule — it prevents both the "stale render under new URL" and the "reload mid-typing" traps. Every editor in this codebase follows it and this one does too~ - The seed with two variations (one with a disabled inherited tag) is thoughtful — it means the editor opens onto authored content and the cleared checkbox shows immediately. Real content, not just empty states. - The CSS grid layout with five fixed regions and `overflow: hidden` on the container is a clean design — the PR body's honest note about the FAB collision and yielding the corner shows real verification happened. - The `AsJsonRequired` doc comment honestly documents the change-tracking caveat for records with collection members. That's the kind of self-aware code documentation I love to see~ - 60 adapter tests pass, build is 0 warnings / 0 errors. The reducer tests cover every staleness arm, the effects tests cover every success/failure/stale path, and the page tests cover the five regions, inherited rows, gated generate, timeline preview, and cross-session sync. The *adapter* layer is thoroughly tested — it's the *persistence and generation* layers that need the same treatment. --- *Automated review by Jibril · 2026-08-05* *CI/CD: absent for head SHA 2a18818 (no bot comment) · Local checks: build 0/0, 60 CG adapter tests + 14 CG integration tests pass*
Review feedback (Jibril, PR #217): the persistence, generation and tool layers get their real-SQLite tests
All checks were successful
CI / build (pull_request) Successful in 35s
CI / test (pull_request) Successful in 1m51s
412a85dfda
1 CgVariationTests + CgGenerationTests: the profile round-trip (tags, disables,
style scalars), the EF column defaults materializing on a fresh read, the ticks
ORDER BY on both list queries, the unjournaled publish surviving a profile save,
the soft-delete filter on both tables, and the AsJsonRequired snapshot — nested
record collections included — through a real database.

2 CgVariationImageGenerationTests: a success appends a generation, freezes the
prompt that was actually sent and publishes it; a second render appends without
touching the first file; a disabled inherited tag stays out of the prompt; a
variation whose disables empty the effective prompt is refused before the queue.

3 AssistantWriteToolsTests: create → shows in get_event_cg → title-only edit
keeps own tags, disables and moved style sliders (the VoiceProviderId class of
silent reset) → delete.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Author
Member

All three blockers addressed in 412a85d — 13 new integration tests, full suite green at 1730 (312 / 777 / 641).

1 — persistence over real SQLite. CgVariationTests covers the title-on-create + creation journal (asserting EntityType == "CgVariation"), the profile round-trip through a fresh scope (tags with strength, disabled inherited names, the three style scalars), the gallery's oldest-first ORDER BY on the ticks column plus set isolation, the unjournaled publish surviving a later profile save (exactly two journal entries, and the pointer intact), and soft-delete hiding from both ListForSetAsync and GetCgVariation. The EF style-tuning defaults are asserted on a fresh-scope read, not the tracked entity, so they're proven to materialize from the database. CgGenerationTests round-trips the AsJsonRequired snapshot in exactly the shape the caveat warns about — scene tags, a nested CgSubjectSnapshot with its own tag list, and general defaults — plus the newest-first ticks ORDER BY with the published flag, and the query filter via a direct soft-delete (there's no delete use case yet; retention is a later slice, so the filter is exercised at the DbContext).

2 — the append-and-publish flow. CgVariationImageGenerationTests mirrors the set suite's harness (real stores, real filesystem, stub gateway, inline queue): a success appends a generation whose snapshot is what was actually sent, publishes it, and writes {generationId:N}.png into the variation's folder; a second render appends and moves the pointer while the first file survives on disk — the append-not-replace behaviour pinned directly; a disabled inherited tag stays out of the spec's scene tags; and a variation whose disables empty the effective prompt is refused with nothing enqueued, no timeline row, no pointer.

3 — the assistant tools. A_cg_variation_is_created_edited_and_deleted_through_the_agent in AssistantWriteToolsTests: create (card names both the variation and its event, route ends in variations/{id}) → appears in get_event_cg's variation list → a title-only edit against the seeded "After the rain" after moving its style sliders off the defaults, asserting own tags, the sunset disable and the tuned sliders all survive — the VoiceProviderId class of silent reset, pinned by name → delete, gone from the set's list.

💡 1 (CanGenerate duplicating EffectiveSceneTags) — leaving as is for now, agreed it's a mirror worth watching. The client check is deliberately conservative (button gating only; the generator re-derives the real rule server-side and refuses on its own), so a drift degrades to a wrong button state, never a wrong render. If the disable-by-name rule ever grows, extracting a shared helper is the move.

💡 2 (null! default on the profile) — keeping the current shape for consistency; it mirrors CgSetProfile, CgSetDto and CgVariationDto, and changing one in isolation would leave the family split between two idioms.

All three blockers addressed in `412a85d` — 13 new integration tests, full suite green at 1730 (312 / 777 / 641). **⛔ 1 — persistence over real SQLite.** `CgVariationTests` covers the title-on-create + creation journal (asserting `EntityType == "CgVariation"`), the profile round-trip through a fresh scope (tags with strength, disabled inherited names, the three style scalars), the gallery's oldest-first `ORDER BY` on the ticks column plus set isolation, the **unjournaled** publish surviving a later profile save (exactly two journal entries, and the pointer intact), and soft-delete hiding from both `ListForSetAsync` and `GetCgVariation`. The EF style-tuning defaults are asserted on a **fresh-scope read**, not the tracked entity, so they're proven to materialize from the database. `CgGenerationTests` round-trips the `AsJsonRequired` snapshot in exactly the shape the caveat warns about — scene tags, a **nested `CgSubjectSnapshot` with its own tag list**, and general defaults — plus the newest-first ticks `ORDER BY` with the published flag, and the query filter via a direct soft-delete (there's no delete use case yet; retention is a later slice, so the filter is exercised at the `DbContext`). **⛔ 2 — the append-and-publish flow.** `CgVariationImageGenerationTests` mirrors the set suite's harness (real stores, real filesystem, stub gateway, inline queue): a success appends a generation whose snapshot is **what was actually sent**, publishes it, and writes `{generationId:N}.png` into the variation's folder; a second render appends and moves the pointer **while the first file survives on disk** — the append-not-replace behaviour pinned directly; a disabled inherited tag stays out of the spec's scene tags; and a variation whose disables empty the effective prompt is refused with nothing enqueued, no timeline row, no pointer. **⛔ 3 — the assistant tools.** `A_cg_variation_is_created_edited_and_deleted_through_the_agent` in `AssistantWriteToolsTests`: create (card names both the variation and its event, route ends in `variations/{id}`) → appears in `get_event_cg`'s variation list → a **title-only** edit against the seeded "After the rain" after moving its style sliders off the defaults, asserting own tags, the `sunset` disable **and the tuned sliders** all survive — the `VoiceProviderId` class of silent reset, pinned by name → delete, gone from the set's list. **💡 1 (CanGenerate duplicating `EffectiveSceneTags`)** — leaving as is for now, agreed it's a mirror worth watching. The client check is deliberately conservative (button gating only; the generator re-derives the real rule server-side and refuses on its own), so a drift degrades to a wrong button state, never a wrong render. If the disable-by-name rule ever grows, extracting a shared helper is the move. **💡 2 (`null!` default on the profile)** — keeping the current shape for consistency; it mirrors `CgSetProfile`, `CgSetDto` and `CgVariationDto`, and changing one in isolation would leave the family split between two idioms.
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! You came back with exactly what I asked for~ A single surgical commit, +483 lines of nothing but tests, and every single one of my blockers pinned to the mat. This is how you answer a review. ♡

Verdict: Looks good to me~

My three blockers from round 1 (comment 5729) — all closed, all with genuine directional tests. Let me show my work~

How each blocker was laid to rest

Blocker 1 — CgVariation/CgGeneration persistence had zero SQLite-backed testsCgVariationTests.cs (5 tests) and CgGenerationTests.cs (3 tests) arrive. fufu~ you read the sibling pattern exactly right:

  • Every reload goes through a fresh DI scope, never the change tracker — so StyleReferenceTuning.Default materializing off a fresh row, the profile round-trip, the tick-column ORDER BY ordering, the journal entries, and the soft-delete query filter are all proven against real SQLite, not tracked-entity echoes.
  • Publishing_is_not_journaled_and_survives_a_profile_save is the sharpest of the set — it pins that the published pointer lives outside the journal (ADR 0049) AND that a profile save that knows nothing about it doesn't clobber it. Two contracts in one test. ♪
  • The_frozen_snapshot_survives_a_round_trip_through_the_database exercises exactly the shape AsJsonRequired's caveat warns about: a record whose members are collections, including a nested record list with its own PromptTag collection. That's the one that would have silently returned null on the old mapper.

Blocker 2 — CgVariationImageGenerator was only exercised through the fakeCgVariationImageGenerationTests.cs (4 tests) over real stores, real filesystem, stubbed gateway, inline queue. The append-and-publish flow is now pinned end to end:

  • A_success_appends_a_generation_publishes_it_and_freezes_the_prompt asserts the file exists on disk (named by generation id), the timeline has exactly one entry, the published pointer moved to it, and the frozen snapshot matches what was sent — not what the records say now.
  • A_second_render_appends_and_moves_the_pointer_without_touching_the_first_file proves the folder is the history — old render's file survives, timeline grows to 2, pointer moves. This is the ADR 0049 contract in its purest form.
  • A_disabled_inherited_tag_stays_out_of_the_prompt and A_variation_with_no_effective_positive_tag_is_refused cover both ends of ADR 0047 through the real generator.

Blocker 3 — the four variation tools had zero integration tests, and StyleReference preservation was the PR #199 bug classA_cg_variation_is_created_edited_and_deleted_through_the_agent covers create→list→partial-edit→delete through the actual tool layer. And the part that made me happiest~

The test pre-tunes the variation with StyleReferenceTuning(Use: false, Strength: 0.4m, Fidelity: 0.9m), then does a title-only edit through update_cg_variation, and asserts:

Assert.Equal(tuned, edited.StyleReference); // not reset to the record's default

That line goes red the instant current.StyleReference stops being threaded as the 4th positional — exactly the silent-reset trap PR #199 caught for VoiceProviderId. Verified in production at CgVariationTools.cs:161: current.StyleReference is there. ♡

What I liked~

  • Zero production drift. git diff 2a18818b..412a85df -- src/ is empty. Every line is test. The architecture I praised in round 1 stands untouched.
  • The comments inside the tests teach. Each test's XML doc and inline comments cite the ADR and explain why the assertion matters — "reloaded through the port in a fresh scope, not read back off the change tracker," "stored as three scalars so each shows on its own line in the document history (ADR 0022)." A reviewer six months from now will understand the intent instantly.
  • IDisposable cleanup in the generator tests — temp DB and asset dir deleted in Dispose(). No leaking temp files across test runs.
  • The empty-prompt refusal test asserts both the Err result AND an empty gateway spec list AND an empty timeline — belt and suspenders proving the refusal happened before anything was enqueued, not after a failed render.

Automated review by Jibril · 2026-08-05
CI/CD: passed for head 412a85df (build ✓ 35s, test ✓ 1m51s) · Local checks: build 0/0, 13/13 new tests pass (5 CgVariation + 3 CgGeneration + 4 CgVariationImageGen + 1 AssistantWriteTools)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! You came back with exactly what I asked for~ A single surgical commit, +483 lines of nothing but tests, and every single one of my blockers pinned to the mat. *This* is how you answer a review. ♡ ### Verdict: ✅ Looks good to me~ My three blockers from round 1 (comment 5729) — all closed, all with genuine directional tests. Let me show my work~ #### ✅ How each blocker was laid to rest **Blocker 1 — CgVariation/CgGeneration persistence had zero SQLite-backed tests** → `CgVariationTests.cs` (5 tests) and `CgGenerationTests.cs` (3 tests) arrive. fufu~ you read the sibling pattern exactly right: - Every reload goes through a **fresh DI scope**, never the change tracker — so `StyleReferenceTuning.Default` materializing off a fresh row, the profile round-trip, the tick-column `ORDER BY` ordering, the journal entries, and the soft-delete query filter are all proven against real SQLite, not tracked-entity echoes. - `Publishing_is_not_journaled_and_survives_a_profile_save` is the sharpest of the set — it pins that the published pointer lives outside the journal (ADR 0049) AND that a profile save that knows nothing about it doesn't clobber it. Two contracts in one test. ♪ - `The_frozen_snapshot_survives_a_round_trip_through_the_database` exercises exactly the shape `AsJsonRequired`'s caveat warns about: a record whose members are collections, including a nested record list with its own `PromptTag` collection. That's the one that would have silently returned null on the old mapper. **Blocker 2 — CgVariationImageGenerator was only exercised through the fake** → `CgVariationImageGenerationTests.cs` (4 tests) over real stores, real filesystem, stubbed gateway, inline queue. The append-and-publish flow is now pinned end to end: - `A_success_appends_a_generation_publishes_it_and_freezes_the_prompt` asserts the file exists on disk (named by generation id), the timeline has exactly one entry, the published pointer moved to it, and the frozen snapshot matches what was *sent* — not what the records say now. - `A_second_render_appends_and_moves_the_pointer_without_touching_the_first_file` proves the folder is the history — old render's file survives, timeline grows to 2, pointer moves. This is the ADR 0049 contract in its purest form. - `A_disabled_inherited_tag_stays_out_of_the_prompt` and `A_variation_with_no_effective_positive_tag_is_refused` cover both ends of ADR 0047 through the real generator. **Blocker 3 — the four variation tools had zero integration tests, and StyleReference preservation was the PR #199 bug class** → `A_cg_variation_is_created_edited_and_deleted_through_the_agent` covers create→list→partial-edit→delete through the actual tool layer. And the part that made me happiest~ The test pre-tunes the variation with `StyleReferenceTuning(Use: false, Strength: 0.4m, Fidelity: 0.9m)`, then does a **title-only** edit through `update_cg_variation`, and asserts: ```csharp Assert.Equal(tuned, edited.StyleReference); // not reset to the record's default ``` That line goes red the instant `current.StyleReference` stops being threaded as the 4th positional — exactly the silent-reset trap PR #199 caught for `VoiceProviderId`. Verified in production at `CgVariationTools.cs:161`: `current.StyleReference` is there. ♡ #### ✅ What I liked~ - **Zero production drift.** `git diff 2a18818b..412a85df -- src/` is empty. Every line is test. The architecture I praised in round 1 stands untouched. - **The comments inside the tests teach.** Each test's XML doc and inline comments cite the ADR and explain *why* the assertion matters — "reloaded through the port in a fresh scope, not read back off the change tracker," "stored as three scalars so each shows on its own line in the document history (ADR 0022)." A reviewer six months from now will understand the intent instantly. - **`IDisposable` cleanup in the generator tests** — temp DB and asset dir deleted in `Dispose()`. No leaking temp files across test runs. - **The empty-prompt refusal test asserts both the `Err` result AND an empty gateway spec list AND an empty timeline** — belt and suspenders proving the refusal happened *before* anything was enqueued, not after a failed render. --- *Automated review by Jibril · 2026-08-05* *CI/CD: passed for head 412a85df (build ✓ 35s, test ✓ 1m51s) · Local checks: build 0/0, 13/13 new tests pass (5 CgVariation + 3 CgGeneration + 4 CgVariationImageGen + 1 AssistantWriteTools)*
bjoern merged commit 93e01eef78 into main 2026-08-05 06:30:20 +02:00
bjoern deleted branch feat/cg-editor-shell 2026-08-05 06:30:20 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Kagura!217
No description provided.