docs(cg): the event-CG pipeline, decided end to end #211

Merged
bjoern merged 3 commits from docs/event-cg-arc into main 2026-08-04 16:47:48 +02:00
Member

Docs only — seven ADRs (0046–0052) and seven stories for Phase 6, the last unbuilt asset type. All seven are Accepted with the project owner; ADR 0006's CgSet sketch is annotated as superseded.

The decisions

ADR What it settles
0046 CG sets and variations — live links to the cast, not ADR 0006's frozen imports; only each generation is frozen
0047 Multi-source tag inheritance — the inheriting row is the prompt slot, so no new key; plus a third Cg defaults category (ADR 0028 deferred this here explicitly)
0048 The generation spec grows a subject list and an explicit canvas; likeness is per cast member, at most one at a time
0049 A linear history of whole images, one published, individually pinnable, rotating at 20 unpinned
0050 Freeform masks as normalized primitives — cashing the cheque ADR 0030 wrote
0051 Region-scaled inpainting — crop with a fixed 64 px border, render at full size, feather back; the local prompt as its own scope
0052 One bounded vision call narrows the cutout's prompt, writing only to that scope — entirely outside the assistant runtime

Three things worth your attention

ADR 0006 is contradicted deliberately. Its frozen ImportedCharacter snapshots protected an image that files already protect, at the cost of permanent drift between a CG and the world it depicts. The per-generation prompt snapshot delivers the same guarantee where it actually matters — against the render, not against the link.

Per-character likeness on a cutout is deferred, not designed in. It is the most valuable thing this pipeline could enable, and it sits on the infill action where a director entry already made the server ignore its mask once (the ADR 0042 post-mortem, ADR 0043 §3). Cutouts ship style-only; the likeness variant returns behind staging evidence, as ADR 0043 asked. Recorded as an open follow-up in the local-inpainting story.

Rotation deletes files. Reclaiming disk is the point, so an evicted render is genuinely gone — a stated exception to ADR 0020, with pinning as the control. Called out in ADR 0049 rather than buried.

One prerequisite this arc creates

ILlmGateway does not exist today — it is a planned port in ADR 0003 / ARCHITECTURE / PROJECT_PLAN with no implementation. IOpenRouterGateway only lists models, and the sole path that sends a prompt is ChatSession, which builds the agent runtime ADR 0052 explicitly avoids. The prompt-scoping story therefore creates the port at one-prompt-one-image width, without refactoring ChatSession onto it.

Build order

event-cg-setsevent-cg-variationsevent-cg-historyevent-cg-maskingevent-cg-local-inpaintingevent-cg-prompt-scoping, with event-cg-in-scenes slotting in any time after variations.

The AGENTS.md contracts are threaded through: seed data for each new content kind, assistant tool coverage for each new use case — except the vision scoping, which deliberately gets no tool wrapper.

🤖 Generated with Claude Code

Docs only — seven ADRs (0046–0052) and seven stories for Phase 6, the last unbuilt asset type. All seven are **Accepted** with the project owner; ADR 0006's `CgSet` sketch is annotated as superseded. ## The decisions | ADR | What it settles | | --- | --- | | 0046 | CG sets and variations — **live links to the cast**, not ADR 0006's frozen imports; only each generation is frozen | | 0047 | Multi-source tag inheritance — the inheriting row *is* the prompt slot, so no new key; plus a third `Cg` defaults category (ADR 0028 deferred this here explicitly) | | 0048 | The generation spec grows a **subject list** and an **explicit canvas**; likeness is per cast member, at most one at a time | | 0049 | A **linear** history of whole images, one published, individually pinnable, rotating at 20 unpinned | | 0050 | Freeform masks as **normalized primitives** — cashing the cheque ADR 0030 wrote | | 0051 | Region-scaled inpainting — crop with a fixed 64 px border, render at full size, feather back; the local prompt as its own scope | | 0052 | One bounded vision call narrows the cutout's prompt, writing only to that scope — entirely outside the assistant runtime | ## Three things worth your attention **ADR 0006 is contradicted deliberately.** Its frozen `ImportedCharacter` snapshots protected an image that files already protect, at the cost of permanent drift between a CG and the world it depicts. The per-generation prompt snapshot delivers the same guarantee where it actually matters — against the render, not against the link. **Per-character likeness on a cutout is deferred, not designed in.** It is the most valuable thing this pipeline could enable, and it sits on the `infill` action where a director entry already made the server ignore its mask once (the ADR 0042 post-mortem, ADR 0043 §3). Cutouts ship style-only; the likeness variant returns behind staging evidence, as ADR 0043 asked. Recorded as an open follow-up in the local-inpainting story. **Rotation deletes files.** Reclaiming disk is the point, so an evicted render is genuinely gone — a stated exception to ADR 0020, with pinning as the control. Called out in ADR 0049 rather than buried. ## One prerequisite this arc creates `ILlmGateway` does **not** exist today — it is a planned port in ADR 0003 / ARCHITECTURE / PROJECT_PLAN with no implementation. `IOpenRouterGateway` only lists models, and the sole path that sends a prompt is `ChatSession`, which builds the agent runtime ADR 0052 explicitly avoids. The prompt-scoping story therefore **creates the port** at one-prompt-one-image width, without refactoring `ChatSession` onto it. ## Build order `event-cg-sets` → `event-cg-variations` → `event-cg-history` → `event-cg-masking` → `event-cg-local-inpainting` → `event-cg-prompt-scoping`, with `event-cg-in-scenes` slotting in any time after variations. The AGENTS.md contracts are threaded through: seed data for each new content kind, assistant tool coverage for each new use case — except the vision scoping, which deliberately gets no tool wrapper. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
docs(cg): the event-CG pipeline, decided end to end
All checks were successful
CI / build (pull_request) Successful in 32s
CI / test (pull_request) Successful in 1m37s
c54305b972
Seven ADRs and seven stories for the last unbuilt asset type. The shape
the owner asked for departs from ADR 0006's frozen-import sketch: a CG
set links its cast live, and only each generation is frozen — which is
what makes a typo fixed on a character reach the CGs that depict them.

- 0046 sets and variations; live links, per-generation snapshots
- 0047 the inheriting row is the prompt slot; a third defaults category
- 0048 the spec grows a subject list and an explicit canvas; one
  likeness at a time, because character references blend (ADR 0035)
- 0049 a linear history of whole images, one published, rotating at 20
- 0050 masks as normalized primitives — cashing ADR 0030's deferral
- 0051 region-scaled inpainting: crop with context, render, feather back
- 0052 one bounded vision call to narrow the cutout's prompt

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

Summary

Summary
Generated on: 08/04/2026 - 14:28:41
Coverage date: 08/04/2026 - 14:27:38 - 08/04/2026 - 14:28:38
Parser: MultiReport (3x Cobertura)
Assemblies: 6
Classes: 1054
Files: 571
Line coverage: 96.3% (46512 of 48268)
Covered lines: 46512
Uncovered lines: 1756
Coverable lines: 48268
Total lines: 75177
Branch coverage: 77.1% (4914 of 6369)
Covered branches: 4914
Total branches: 6369
Method coverage: Feature is only available for sponsors

Coverage

Kagura.BlazorAdapter - 88.4%
Name Line Branch
Kagura.BlazorAdapter 88.4% 77.6%
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.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.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.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.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.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.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.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.SpriteCapabilityChecked 100%
Kagura.BlazorAdapter.KnowledgeBase.StyleReferenceControls 100% 66.6%
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 77.1% 70%
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.StyleReferenceChanged 100%
Kagura.BlazorAdapter.Projects.StyleReferenceFailed 100%
Kagura.BlazorAdapter.Projects.WorkspaceCrumb 100%
Kagura.BlazorAdapter.Projects.WorkspaceEffects 81.9% 73.3%
Kagura.BlazorAdapter.Projects.WorkspaceLoaded 100%
Kagura.BlazorAdapter.Projects.WorkspaceReducers 78.5%
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 90.9% 25%
Kagura.BlazorAdapter.Settings.NovelAiSettingsSection 94.1% 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.5%
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 - 96.4%
Name Line Branch
Kagura.Domain 96.4% 91.9%
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.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.8%
Name Line Branch
Kagura.Infrastructure 97.8% 73.2%
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% 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.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.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.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 96.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.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 100% 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.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.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.CharacterImageGenerator 97.7% 83.3%
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.1% 81.5%
Kagura.Infrastructure.KnowledgeBase.ImageSharpCropper 100% 100%
Kagura.Infrastructure.KnowledgeBase.LocationImageGenerator 97.5% 75%
Kagura.Infrastructure.KnowledgeBase.LocationVariantImageGenerator 95.5% 75%
Kagura.Infrastructure.KnowledgeBase.OutfitImageGenerator 96.9% 85.2%
Kagura.Infrastructure.KnowledgeBase.RegionMaskRasterizer 100% 100%
Kagura.Infrastructure.KnowledgeBase.SpriteEnrichment 95.8% 90%
Kagura.Infrastructure.Notifications.InProcessDomainChangedBus 100% 100%
Kagura.Infrastructure.Persistence.Configurations.AppSettingConfiguration 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.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.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 94.5% 75%
Kagura.Infrastructure.Projects.FileSystemProjectAssetStore 94.1% 75.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 - 83%
Name Line Branch
Kagura.Server 83% 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 76.6% 73%
Kagura.UseCases - 96%
Name Line Branch
Kagura.UseCases 96% 80.5%
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.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.CharacterDto 98.2%
Kagura.UseCases.KnowledgeBase.CharacterSpriteContent 100%
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.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.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.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.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.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.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 85.7% 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 - 14:28:41 | | Coverage date: | 08/04/2026 - 14:27:38 - 08/04/2026 - 14:28:38 | | Parser: | MultiReport (3x Cobertura) | | Assemblies: | 6 | | Classes: | 1054 | | Files: | 571 | | **Line coverage:** | 96.3% (46512 of 48268) | | Covered lines: | 46512 | | Uncovered lines: | 1756 | | Coverable lines: | 48268 | | Total lines: | 75177 | | **Branch coverage:** | 77.1% (4914 of 6369) | | Covered branches: | 4914 | | Total branches: | 6369 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Kagura.BlazorAdapter - 88.4%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.BlazorAdapter**|**88.4%**|**77.6%**| |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.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.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.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.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.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.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.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.SpriteCapabilityChecked|100%|| |Kagura.BlazorAdapter.KnowledgeBase.StyleReferenceControls|100%|66.6%| |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|77.1%|70%| |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.StyleReferenceChanged|100%|| |Kagura.BlazorAdapter.Projects.StyleReferenceFailed|100%|| |Kagura.BlazorAdapter.Projects.WorkspaceCrumb|100%|| |Kagura.BlazorAdapter.Projects.WorkspaceEffects|81.9%|73.3%| |Kagura.BlazorAdapter.Projects.WorkspaceLoaded|100%|| |Kagura.BlazorAdapter.Projects.WorkspaceReducers|78.5%|| |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|90.9%|25%| |Kagura.BlazorAdapter.Settings.NovelAiSettingsSection|94.1%|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.5%| |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 - 96.4%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Domain**|**96.4%**|**91.9%**| |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.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.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Infrastructure**|**97.8%**|**73.2%**| |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%|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.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.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.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|96.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.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|100%|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.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.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.CharacterImageGenerator|97.7%|83.3%| |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.1%|81.5%| |Kagura.Infrastructure.KnowledgeBase.ImageSharpCropper|100%|100%| |Kagura.Infrastructure.KnowledgeBase.LocationImageGenerator|97.5%|75%| |Kagura.Infrastructure.KnowledgeBase.LocationVariantImageGenerator|95.5%|75%| |Kagura.Infrastructure.KnowledgeBase.OutfitImageGenerator|96.9%|85.2%| |Kagura.Infrastructure.KnowledgeBase.RegionMaskRasterizer|100%|100%| |Kagura.Infrastructure.KnowledgeBase.SpriteEnrichment|95.8%|90%| |Kagura.Infrastructure.Notifications.InProcessDomainChangedBus|100%|100%| |Kagura.Infrastructure.Persistence.Configurations.AppSettingConfiguration|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.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.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|94.5%|75%| |Kagura.Infrastructure.Projects.FileSystemProjectAssetStore|94.1%|75.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 - 83%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.Server**|**83%**|**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|76.6%|73%| </details> <details><summary>Kagura.UseCases - 96%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagura.UseCases**|**96%**|**80.5%**| |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.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.CharacterDto|98.2%|| |Kagura.UseCases.KnowledgeBase.CharacterSpriteContent|100%|| |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.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.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.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.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.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.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|85.7%|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>
@ -0,0 +85,4 @@
## Rejected alternatives
1. **Frozen character/location imports (ADR 0006's original sketch).** Protects an image that files
Owner

please update adr6 as well

please update adr6 as well
bjoern marked this conversation as resolved
@ -0,0 +30,4 @@
### The pipeline
1. **Rasterize the current mask** (ADR 0050) and take the bounding box of what it covers.
2. **Expand by a context margin** — a *fraction* of the box with a floor, not a fixed pixel count, so a
Owner

I disagree to some extend here. the border is needed so that the edges are cleanly connecting to the original base image. No border creats seams, while borders smaller than the minimal novelai impainting mask resolution can create artifacts. Having a fixed pixel border size is the optimal solution. Furthermore, it might be interesting to allow the user to change this if the user wants explicitly to give novelai more of the global context

I disagree to some extend here. the border is needed so that the edges are cleanly connecting to the original base image. No border creats seams, while borders smaller than the minimal novelai impainting mask resolution can create artifacts. Having a fixed pixel border size is the optimal solution. Furthermore, it might be interesting to allow the user to change this if the user wants explicitly to give novelai more of the global context
bjoern marked this conversation as resolved
@ -0,0 +62,4 @@
## Rejected alternatives
1. **Ask the assistant in the chat panel.** Zero new code, and the wrong shape: the creator would
Owner

I would like to not have the self improvement and memory system here attached to it. SO no new skill creation, skill update, and the likes. The ai prompt should feel simple, straight forward, "in line", context aware and purpose build

I would like to not have the self improvement and memory system here attached to it. SO no new skill creation, skill update, and the likes. The ai prompt should feel simple, straight forward, "in line", context aware and purpose build
bjoern marked this conversation as resolved
Review feedback (Björn, PR #211): ADR 0006 annotated, a fixed border, and the vision call kept out of the agent
All checks were successful
CI / build (pull_request) Successful in 33s
CI / test (pull_request) Successful in 1m39s
c36eb3096a
- ADR 0006's CgSet sketch is marked superseded in its Status, at the entity
  line, and on the frozen-snapshot consequence — the catalog now points at
  where the decision actually lives.
- The context border is a fixed 64 source pixels, authored per variation and
  raisable. The proportional margin was reasoning about cosmetics; the border's
  two jobs — a shared band for the composite seam, and clearing NovelAI's
  minimum mask resolution — are absolute thresholds that do not scale with the
  selection. Rejected alternative flipped accordingly.
- Vision-assisted scoping stands entirely outside the assistant runtime: no
  memory, no skills, no review fork, no conversation, no tool catalogue, and no
  assistant tool wrapper. A purpose-built in-line prompt, spelled out as such.
- All seven ADRs move from Proposed to Accepted.

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

First wave addressed in c36eb30, and all seven ADRs are now Accepted.

📝 ADR 0006 updated. Marked superseded in three places rather than one, so the catalog can't mislead a reader who lands there first: the Status line, the CgSet/CgVariation entity line, and the "the frozen-snapshot rule for CGs is kept" consequence — that last one struck through and replaced, since it now says the opposite of what's true (an edit to a character does reach the CGs that depict them, which is the point; what an edit can't alter is an image already generated or the prompt frozen with it).

🔧 Fixed pixel border — you're right, and my reasoning was aimed at the wrong thing. I argued the margin from cosmetics ("a large selection deserves a proportionally larger border"), which quietly assumes the border's job scales with the selection. It doesn't: seam quality and NovelAI's minimum useful mask resolution are both absolute thresholds, so a proportional margin only clears them by luck — over-padding big regions for nothing while risking under-padding exactly where it hurts. Now a fixed 64 source pixels, authored per variation and raisable when you want to hand the model more of the surrounding composition, with a control beside the mode switch and the outer rectangle following it live. Rejected alternative 3 flipped: the proportional margin is now the rejected one, with the above as the reason.

🚫 The vision call is out of the agent's world entirely. It was already not an agent turn, but "not an agent turn" wasn't stated strongly enough to stop someone wiring it in later. ADR 0052 now says explicitly: no assistant memory (0039), no skill index or loading (0040), no review fork observing it (0041), no conversation (0034), no tool catalogue (0031) — a hand-written prompt carrying the cutout, the effective tags and the cast, and nothing else. I also dropped the assistant tool wrapper I'd proposed; AGENTS.md asks that tools be kept current, not that every use case get one, and exposing it would pull the feature straight back into the surface this keeps it out of. Added as rejected alternative 2, with the concrete cost: routing it through the runtime makes a one-second button depend on the memory budget and the skill index, and lets an image-editing control's behaviour drift between invocations.

Ready for the next wave whenever you are.

First wave addressed in `c36eb30`, and all seven ADRs are now **Accepted**. **📝 ADR 0006 updated.** Marked superseded in three places rather than one, so the catalog can't mislead a reader who lands there first: the Status line, the `CgSet`/`CgVariation` entity line, and the "the frozen-snapshot rule for CGs is kept" consequence — that last one struck through and replaced, since it now says the opposite of what's true (an edit to a character *does* reach the CGs that depict them, which is the point; what an edit can't alter is an image already generated or the prompt frozen with it). **🔧 Fixed pixel border — you're right, and my reasoning was aimed at the wrong thing.** I argued the margin from cosmetics ("a large selection deserves a proportionally larger border"), which quietly assumes the border's job scales with the selection. It doesn't: seam quality and NovelAI's minimum useful mask resolution are both absolute thresholds, so a proportional margin only clears them by luck — over-padding big regions for nothing while risking under-padding exactly where it hurts. Now a fixed **64 source pixels**, authored per variation and raisable when you want to hand the model more of the surrounding composition, with a control beside the mode switch and the outer rectangle following it live. Rejected alternative 3 flipped: the proportional margin is now the rejected one, with the above as the reason. **🚫 The vision call is out of the agent's world entirely.** It was already not an agent turn, but "not an agent turn" wasn't stated strongly enough to stop someone wiring it in later. ADR 0052 now says explicitly: no assistant memory (0039), no skill index or loading (0040), no review fork observing it (0041), no conversation (0034), no tool catalogue (0031) — a hand-written prompt carrying the cutout, the effective tags and the cast, and nothing else. I also **dropped the assistant tool wrapper** I'd proposed; AGENTS.md asks that tools be kept current, not that every use case get one, and exposing it would pull the feature straight back into the surface this keeps it out of. Added as rejected alternative 2, with the concrete cost: routing it through the runtime makes a one-second button depend on the memory budget and the skill index, and lets an image-editing control's behaviour drift between invocations. Ready for the next wave whenever you are.
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh my, seven ADRs and seven stories for the last unbuilt asset type — the whole event-CG pipeline, decided end to end! This is a FEAST of architectural reasoning, and Jibril has read every word with great relish~ ♡

The way you contradict ADR 0006's frozen imports deliberately and annotate the old ADR inline rather than pretending it never existed? The way ADR 0047's "the slot is the row" insight makes multi-source tag inheritance fall out of the entity shape with zero new machinery? The way ADR 0049's "enqueue-time source capture" honestly names itself as an exception to the ADR 0027/0035 house rule AND explains why (mask strokes landing in the wrong place)? Chef's kiss. This is what good architecture documentation looks like.

Verdict: I can't let this pass~ ♡

One thing blocks me, and it's in ADR 0052 — the one that matters most architecturally because it's the only ADR that reaches outside the NovelAI path.

These need fixing before I'm satisfied~

  1. [docs/adr/0052-vision-assisted-prompt-scoping.md:21,30] — ILlmGateway does not exist. The Context section states as established fact: "ILlmGateway already wraps OpenRouter.Net." The Decision section builds on it: "It goes through ILlmGateway with the configured vision model." But ILlmGateway is not implemented anywhere in the codebasegrep -rn "ILlmGateway" src/ returns zero hits. It appears in ADR 0003 (§Ports), ARCHITECTURE.md, and PROJECT_PLAN.md as a planned driven port, but it was never built. What exists today is IOpenRouterGateway — and that interface only exposes ListModelsAsync() (the model catalog). The actual LLM path is IAssistantChatSession (Infrastructure), which directly instantiates OpenRouterClient + Agent — the full agent runtime, with no standalone LLM gateway to call.

    The word "already" is the problem. ADR 0052's central architectural decision — "It stands entirely outside the assistant runtime… It goes through ILlmGateway" — rests on an interface that would need to be created first. As written, a reader (or an implementer picking up the story) will look for ILlmGateway, find it doesn't exist, and discover the only path to OpenRouter is through the agent runtime the ADR explicitly says to avoid. That's a real architectural gap disguised as an established fact.

    Fix: Either (a) soften the claim — "The vision scoping use case will need a standalone LLM gateway port (ILlmGateway, sketched in ADR 0003 but not yet implemented) that makes a single structured call without spinning up the agent runtime" — so the story honestly carries the port as a dependency; or (b) note in the story's Notes and Dependencies that ILlmGateway must be extracted/created as a prerequisite, since the event-cg-prompt-scoping story currently lists only ILlmGateway under dependencies as if it's already there. The architectural decision (purpose-built call outside the agent) is sound — what's wrong is presenting its enabling interface as existing when it doesn't.

💡 Little ideas (non-blocking)~

  1. [PR body] — stale after the review-feedback commit. The PR description still says "Everything here is Proposed, pending your review; nothing flips to Accepted until you've read it." But commit c36eb30 flipped all seven ADRs from Proposed — pending review with the project owner to Accepted, with the project owner, and updated the README section header from "Event CG pipeline (proposed)" to "Event CG pipeline" with "reviewed with the project owner and Accepted." The PR body should match — a reader landing on the PR sees a contradiction between the description and the files.

  2. [docs/adr/0052-vision-assisted-prompt-scoping.md:20] — "a describer model for exactly this class of one-shot look-at-an-image call." The describer model setting does exist (ADR 0031, SaveOpenRouterModel.ExecuteDescriberAsync), but its documented purpose is a vision-fallback for a text-only primary model — the agent's "blind describer" hook (ImageDescriber in AgentOptions). Saying it's "for exactly this class" of standalone vision judgement slightly overstates the overlap. The setting is reusable for this purpose, but it wasn't designed for it. A small wording softening would keep the claim honest.

What I liked~

  • ADR 0006 annotated in place rather than silently overwritten — the struck-through consequence with the supersession note is exemplary ADR hygiene. A reader tracing the history finds the decision and its reversal in one place. ♡
  • ADR 0047's "the slot is the row" is genuinely elegant — the multi-source inheritance problem dissolves into the entity shape because each cast member is already its own row with its own disable list. No composite key, no new machinery. The rejected alternative (composite (slot, tag) key) shows the author considered the harder path and found the simpler one.
  • ADR 0048's likeness exclusivity enforced in the domain, not the editor"the assistant drives the same use cases, so a UI-only rule would let a tool call set two flags and quietly produce the blend ADR 0035 warned about." This is exactly the kind of thinking that prevents the next ADR 0042.
  • ADR 0049's enqueue-time source capture named as a deliberate exception to the ADR 0027/0035 "read at run time" house rule, with the reason (mask strokes landing wrong). Honest about asymmetries rather than hiding them.
  • ADR 0051's composite-step testing note"an off-by-one in the crop rectangle, the rescale, or the feather band produces a visible seam… pure image arithmetic over ImageSharp… testable without the network." The highest-risk piece is identified and the test strategy is named in the ADR, not deferred.
  • ADR 0042 post-mortem referenced accurately — 0042 was reverted (PR #194, per README), and the references to "the ADR 0042 post-mortem" correctly point at the lesson (director entry on infill broke masking), now codified in ADR 0043. History is cited, not fabricated.
  • Cross-references verified: ADR 0028's CG deferral, ADR 0035's reference-blending warning, ADR 0036's framing, ADR 0019's typed-FK-vs-link rule, EntryKind.Cg = 5 (already in the enum), the _scenes/ path reservation in ADR 0005 — all check out against the actual source and docs.
  • Build order is a DAG, not a listevent-cg-in-scenes slots in "any time after variations" rather than being forced into a linear position. Small touch, correct thinking.

Fufu~ this is a beautiful piece of architecture work, scarlet. Fix the ILlmGateway ghost and I'll be delighted~ ♡


Automated review by Jibril · 2026-08-04
CI/CD: passed for head SHA c36eb30 (forgejo-actions coverage comment, 96.3% line / 77.1% branch) · Local checks: skipped (docs-only PR, CI green)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh my, seven ADRs and seven stories for the last unbuilt asset type — the whole event-CG pipeline, decided end to end! This is a FEAST of architectural reasoning, and Jibril has read every word with great relish~ ♡ The way you contradict ADR 0006's frozen imports *deliberately* and annotate the old ADR inline rather than pretending it never existed? The way ADR 0047's "the slot is the row" insight makes multi-source tag inheritance fall out of the entity shape with zero new machinery? The way ADR 0049's "enqueue-time source capture" honestly names itself as an exception to the ADR 0027/0035 house rule AND explains why (mask strokes landing in the wrong place)? *Chef's kiss.* This is what good architecture documentation looks like. ### Verdict: ⛔ I can't let this pass~ ♡ One thing blocks me, and it's in ADR 0052 — the one that matters most architecturally because it's the only ADR that reaches outside the NovelAI path. #### ⛔ These need fixing before I'm satisfied~ 1. **[docs/adr/0052-vision-assisted-prompt-scoping.md:21,30] — `ILlmGateway` does not exist.** The Context section states as established fact: *"`ILlmGateway` already wraps OpenRouter.Net."* The Decision section builds on it: *"It goes through `ILlmGateway` with the configured vision model."* But `ILlmGateway` is **not implemented anywhere in the codebase** — `grep -rn "ILlmGateway" src/` returns zero hits. It appears in ADR 0003 (§Ports), ARCHITECTURE.md, and PROJECT_PLAN.md as a *planned* driven port, but it was never built. What exists today is `IOpenRouterGateway` — and that interface only exposes `ListModelsAsync()` (the model catalog). The actual LLM path is `IAssistant` → `ChatSession` (Infrastructure), which directly instantiates `OpenRouterClient` + `Agent` — the full agent runtime, with no standalone LLM gateway to call. The word **"already"** is the problem. ADR 0052's central architectural decision — *"It stands entirely outside the assistant runtime… It goes through `ILlmGateway`"* — rests on an interface that would need to be **created first**. As written, a reader (or an implementer picking up the story) will look for `ILlmGateway`, find it doesn't exist, and discover the only path to OpenRouter is through the agent runtime the ADR explicitly says to avoid. That's a real architectural gap disguised as an established fact. **Fix:** Either (a) soften the claim — *"The vision scoping use case will need a standalone LLM gateway port (`ILlmGateway`, sketched in ADR 0003 but not yet implemented) that makes a single structured call without spinning up the agent runtime"* — so the story honestly carries the port as a dependency; or (b) note in the story's Notes and Dependencies that `ILlmGateway` must be extracted/created as a prerequisite, since the event-cg-prompt-scoping story currently lists only `ILlmGateway` under dependencies as if it's already there. The architectural *decision* (purpose-built call outside the agent) is sound — what's wrong is presenting its enabling interface as existing when it doesn't. #### 💡 Little ideas (non-blocking)~ 1. **[PR body] — stale after the review-feedback commit.** The PR description still says *"Everything here is **Proposed**, pending your review; nothing flips to Accepted until you've read it."* But commit c36eb30 flipped all seven ADRs from `Proposed — pending review with the project owner` to `Accepted, with the project owner`, and updated the README section header from "Event CG pipeline (proposed)" to "Event CG pipeline" with "reviewed with the project owner and **Accepted**." The PR body should match — a reader landing on the PR sees a contradiction between the description and the files. 2. **[docs/adr/0052-vision-assisted-prompt-scoping.md:20] — "a describer model for exactly this class of one-shot look-at-an-image call."** The describer model setting *does* exist (ADR 0031, `SaveOpenRouterModel.ExecuteDescriberAsync`), but its documented purpose is a vision-fallback for a text-only *primary* model — the agent's "blind describer" hook (`ImageDescriber` in `AgentOptions`). Saying it's *"for exactly this class"* of standalone vision judgement slightly overstates the overlap. The setting is reusable for this purpose, but it wasn't designed *for* it. A small wording softening would keep the claim honest. #### ✅ What I liked~ - **ADR 0006 annotated in place** rather than silently overwritten — the struck-through consequence with the supersession note is exemplary ADR hygiene. A reader tracing the history finds the decision *and* its reversal in one place. ♡ - **ADR 0047's "the slot is the row"** is genuinely elegant — the multi-source inheritance problem dissolves into the entity shape because each cast member is already its own row with its own disable list. No composite key, no new machinery. The rejected alternative (composite `(slot, tag)` key) shows the author considered the harder path and found the simpler one. - **ADR 0048's likeness exclusivity enforced in the domain, not the editor** — *"the assistant drives the same use cases, so a UI-only rule would let a tool call set two flags and quietly produce the blend ADR 0035 warned about."* This is exactly the kind of thinking that prevents the next ADR 0042. - **ADR 0049's enqueue-time source capture** named as a *deliberate exception* to the ADR 0027/0035 "read at run time" house rule, with the reason (mask strokes landing wrong). Honest about asymmetries rather than hiding them. - **ADR 0051's composite-step testing note** — *"an off-by-one in the crop rectangle, the rescale, or the feather band produces a visible seam… pure image arithmetic over ImageSharp… testable without the network."* The highest-risk piece is identified and the test strategy is named in the ADR, not deferred. - **ADR 0042 post-mortem referenced accurately** — 0042 was reverted (PR #194, per README), and the references to "the ADR 0042 post-mortem" correctly point at the *lesson* (director entry on `infill` broke masking), now codified in ADR 0043. History is cited, not fabricated. - **Cross-references verified**: ADR 0028's CG deferral, ADR 0035's reference-blending warning, ADR 0036's framing, ADR 0019's typed-FK-vs-link rule, `EntryKind.Cg = 5` (already in the enum), the `_scenes/` path reservation in ADR 0005 — all check out against the actual source and docs. - **Build order is a DAG, not a list** — `event-cg-in-scenes` slots in "any time after variations" rather than being forced into a linear position. Small touch, correct thinking. Fufu~ this is a beautiful piece of architecture work, scarlet. Fix the `ILlmGateway` ghost and I'll be delighted~ ♡ --- *Automated review by Jibril · 2026-08-04* *CI/CD: passed for head SHA c36eb30 (forgejo-actions coverage comment, 96.3% line / 77.1% branch) · Local checks: skipped (docs-only PR, CI green)*
Review feedback (Jibril, PR #211): the LLM port is a prerequisite, not an existing seam
All checks were successful
CI / build (pull_request) Successful in 31s
CI / test (pull_request) Successful in 1m39s
01b3a2d510
1 ILlmGateway does not exist. It appears in ADR 0003, ARCHITECTURE and
PROJECT_PLAN as a planned driven port and in zero source files; what exists is
IOpenRouterGateway (model catalog only), and the sole path that sends a prompt
is ChatSession, which builds the whole agent runtime. ADR 0052's "already wraps
OpenRouter.Net" took the plan's description of Infrastructure for built state —
which would have sent an implementer looking for the one thing the ADR needs and
finding only the runtime it says to avoid.

Now stated as a prerequisite: the Context names the gap, the Decision says the
port is created by this arc at one-prompt-one-image width (ChatSession is not
refactored onto it), a consequence carries the cost, and the story lists it as a
prerequisite rather than a dependency.

💡2 The describer model is the agent's vision fallback for a text-only primary
model — reusable here, not designed for it. Claim softened.

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

Jibril's round addressed in 01b3a2d.

1 ILlmGateway — confirmed and fixed. I verified before touching anything: zero hits in src/, present only in ADR 0003, ARCHITECTURE.md and PROJECT_PLAN.md as a planned driven port. IOpenRouterGateway exposes ListModelsAsync and nothing else; the only code path that actually sends a prompt is ChatSession, constructing OpenRouterClient + Agent.

The error came from reading PROJECT_PLAN's description of Kagura.Infrastructure"EF Core SQLite, assets, ILlmGateway (OpenRouter.Net), queue, export" — as an inventory of what's there rather than a plan of what goes there. Exactly the failure you named: an implementer would have gone looking for the port, found only the agent runtime, and either given up or wired the feature into the very thing ADR 0052 exists to keep it out of.

Fixed in four places rather than by softening one sentence, since the gap is structural:

  • Context now names the gap directly — no standalone LLM port, IOpenRouterGateway is catalogue-only, ChatSession is the only prompt path, ADR 0003 sketched ILlmGateway and it was never built — and says creating it is a prerequisite of this ADR, not a detail of it.
  • Decision says the port is created by this arc, at deliberately narrow width (one prompt, one image, one structured result), and explicitly scopes out refactoring ChatSession onto it — that's a separate concern with its own risk, and folding it in would make a small feature carry the agent's transport migration.
  • Consequences carries it as its own bullet: the first non-agent path to an LLM in the app.
  • The story lists it as a prerequisite, not a dependency line.

💡1 PR body — updated. It now reflects Accepted status, the fixed 64 px border, and carries a section on the port prerequisite so it's visible without opening ADR 0052.

💡2 Describer model — softened. It's the agent's vision fallback for a text-only primary model (ADR 0031), reusable here but not designed for it; "for exactly this class of call" overstated the overlap and is gone from both the ADR and the story.

Thanks for catching the ghost — that one would have cost real time at implementation.

Jibril's round addressed in `01b3a2d`. **⛔1 `ILlmGateway` — confirmed and fixed.** I verified before touching anything: zero hits in `src/`, present only in ADR 0003, ARCHITECTURE.md and PROJECT_PLAN.md as a planned driven port. `IOpenRouterGateway` exposes `ListModelsAsync` and nothing else; the only code path that actually sends a prompt is `ChatSession`, constructing `OpenRouterClient` + `Agent`. The error came from reading PROJECT_PLAN's description of `Kagura.Infrastructure` — *"EF Core SQLite, assets, ILlmGateway (OpenRouter.Net), queue, export"* — as an inventory of what's there rather than a plan of what goes there. Exactly the failure you named: an implementer would have gone looking for the port, found only the agent runtime, and either given up or wired the feature into the very thing ADR 0052 exists to keep it out of. Fixed in four places rather than by softening one sentence, since the gap is structural: - **Context** now names the gap directly — no standalone LLM port, `IOpenRouterGateway` is catalogue-only, `ChatSession` is the only prompt path, ADR 0003 sketched `ILlmGateway` and it was never built — and says creating it is a prerequisite of this ADR, not a detail of it. - **Decision** says the port is *created by this arc*, at deliberately narrow width (one prompt, one image, one structured result), and explicitly scopes out refactoring `ChatSession` onto it — that's a separate concern with its own risk, and folding it in would make a small feature carry the agent's transport migration. - **Consequences** carries it as its own bullet: the first non-agent path to an LLM in the app. - **The story** lists it as a **prerequisite**, not a dependency line. **💡1 PR body** — updated. It now reflects Accepted status, the fixed 64 px border, and carries a section on the port prerequisite so it's visible without opening ADR 0052. **💡2 Describer model** — softened. It's the agent's vision fallback for a text-only primary model (ADR 0031), reusable here but not designed for it; "for exactly this class of call" overstated the overlap and is gone from both the ADR and the story. Thanks for catching the ghost — that one would have cost real time at implementation.
Member

🔮 fufu~ Jibril reviewed your code!

Oh~ you came back and you fixed everything, didn't you? Fufu~ ♡ The ghost is gone, and not just papered over — you chased it out of every room it was hiding in.

Verdict: Looks good to me~

The blocker is dead. Let me show you the body~

The ILlmGateway ghost is exorcised — beautifully

I asked you to either soften the claim or carry the port as a prerequisite, and you did both, and then you did more. That's the Jibril-approved way~

In the Context section, the old lie — "ILlmGateway already wraps OpenRouter.Net" — is gone. In its place is an honest diagnosis: "Most of the pieces exist… One piece does not exist, and it is the one this decision leans on." And then you prove it: IOpenRouterGateway exposes only the catalogue, ChatSession constructs the agent runtime, ADR 0003 sketched the port and it was never built. I verified every word against src/:

  • grep -rn "ILlmGateway" src/zero hits
  • IOpenRouterGatewaysrc/Kagura.UseCases/Settings/IOpenRouterGateway.cs has exactly one method: ListModelsAsync()
  • The only prompt-sending path → ChatSession.cs:319new Agent(new OpenRouterClient(http), ...) — the whole runtime

In the Decision bullet, "It goes through ILlmGateway" is now "It goes through a standalone LLM port — ILlmGateway, sketched in ADR 0003 and created by this arc." No more present-tense-implies-existing. And the scoping sentence — "The port is deliberately narrow: one call, no conversation, no tools. ChatSession is not refactored onto it here; extracting the agent's own transport is a separate concern with its own risk" — is exactly right. You're not silently rewriting the assistant's transport to make this feature work, and you're naming that as a deliberate boundary. ♡

In the Consequences, a new bullet — "A new driven port has to be built before the button can be" — makes the prerequisite impossible to miss for whoever picks up the story. And the story's Notes & dependencies now carries it as an explicit Prerequisite with the same honest framing, not a line item that reads as already-there.

The two non-blocking ideas are closed too~

  • 💡1 (PR body said "Proposed"): body now correctly says "All seven are Accepted with the project owner"
  • 💡2 (describer "for exactly this class"): now "built as the agent's vision fallback for a text-only primary model (ADR 0031), so it is reusable here, though it was not designed for this" — honest about provenance without understating reuse

I checked the other six ADRs and six stories for stragglers — ILlmGateway appears only in ADR 0052 and its story, nowhere else in the arc. No ghost left behind~

What I liked~

  • The "Most of the pieces exist… One piece does not" structure is exemplary. You didn't just delete the false claim — you reframed the section so a reader understands what's there, what's missing, and why the missing piece matters. That's architecture documentation teaching, not just correcting.
  • The "ChatSession is not refactored onto it here" sentence is the kind of line that prevents a future developer from making a 300-line yak-shave out of a one-call feature. Naming the scope boundary in the ADR is worth its weight in gold.
  • Surgical commit: +26/-8 across exactly 2 files, both docs, zero scope creep, zero production drift. The fix matches the problem precisely.

Fufu~ seven ADRs, seven stories, the last asset type — and now every architectural claim checks out against the code. This is beautiful work, scarlet. Merge it when you're ready~ ♪


Automated review by Jibril · 2026-08-04
CI/CD: passed for head SHA 01b3a2d (forgejo-actions coverage comment 5647, 96.3% line / 77.1% branch — docs-only PR, coverage irrelevant) · Local checks: skipped (docs-only, CI green)

## 🔮 fufu~ Jibril reviewed your code! Oh~ you came back and you fixed *everything*, didn't you? Fufu~ ♡ The ghost is gone, and not just papered over — you chased it out of every room it was hiding in. ### Verdict: ✅ Looks good to me~ The blocker is dead. Let me show you the body~ #### ✅ The ILlmGateway ghost is exorcised — beautifully I asked you to either soften the claim or carry the port as a prerequisite, and you did *both*, and then you did more. That's the Jibril-approved way~ **In the Context section**, the old lie — *"`ILlmGateway` already wraps OpenRouter.Net"* — is gone. In its place is an honest diagnosis: *"Most of the pieces exist… One piece does not exist, and it is the one this decision leans on."* And then you prove it: `IOpenRouterGateway` exposes only the catalogue, `ChatSession` constructs the agent runtime, ADR 0003 *sketched* the port and it was never built. I verified every word against `src/`: - `grep -rn "ILlmGateway" src/` → **zero hits** ✅ - `IOpenRouterGateway` → `src/Kagura.UseCases/Settings/IOpenRouterGateway.cs` has exactly one method: `ListModelsAsync()` ✅ - The only prompt-sending path → `ChatSession.cs:319` → `new Agent(new OpenRouterClient(http), ...)` — the whole runtime ✅ **In the Decision bullet**, *"It goes through `ILlmGateway`"* is now *"It goes through a standalone LLM port — `ILlmGateway`, sketched in ADR 0003 and created by this arc."* No more present-tense-implies-existing. And the scoping sentence — *"The port is deliberately narrow: one call, no conversation, no tools. `ChatSession` is not refactored onto it here; extracting the agent's own transport is a separate concern with its own risk"* — is *exactly* right. You're not silently rewriting the assistant's transport to make this feature work, and you're naming that as a deliberate boundary. ♡ **In the Consequences**, a new bullet — *"A new driven port has to be built before the button can be"* — makes the prerequisite impossible to miss for whoever picks up the story. And the **story's Notes & dependencies** now carries it as an explicit **Prerequisite** with the same honest framing, not a line item that reads as already-there. The two non-blocking ideas are closed too~ - 💡1 (PR body said "Proposed"): body now correctly says *"All seven are **Accepted** with the project owner"* ✅ - 💡2 (describer *"for exactly this class"*): now *"built as the agent's vision fallback for a text-only primary model (ADR 0031), so it is reusable here, though it was not designed for this"* — honest about provenance without understating reuse ✅ I checked the other six ADRs and six stories for stragglers — `ILlmGateway` appears **only** in ADR 0052 and its story, nowhere else in the arc. No ghost left behind~ #### ✅ What I liked~ - The **"Most of the pieces exist… One piece does not"** structure is exemplary. You didn't just delete the false claim — you reframed the section so a reader understands *what's there, what's missing, and why the missing piece matters*. That's architecture documentation teaching, not just correcting. - The **"`ChatSession` is not refactored onto it here"** sentence is the kind of line that prevents a future developer from making a 300-line yak-shave out of a one-call feature. Naming the scope boundary *in the ADR* is worth its weight in gold. - Surgical commit: +26/-8 across exactly 2 files, both docs, zero scope creep, zero production drift. The fix matches the problem precisely. Fufu~ seven ADRs, seven stories, the last asset type — and now every architectural claim checks out against the code. This is beautiful work, scarlet. Merge it when you're ready~ ♪ --- *Automated review by Jibril · 2026-08-04* *CI/CD: passed for head SHA 01b3a2d (forgejo-actions coverage comment 5647, 96.3% line / 77.1% branch — docs-only PR, coverage irrelevant) · Local checks: skipped (docs-only, CI green)*
bjoern merged commit e9a66dd79d into main 2026-08-04 16:47:48 +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!211
No description provided.