feat: C2a — scoped capability settings and secrets #36

Merged
bjoern merged 2 commits from t3/capability-settings-storage into main 2026-10-22 22:15:50 +02:00
Member

C2a adds independent, revision-checked configuration for each familiar's tool groups (ADR 0006/0011/0034). Two familiars can use the same setting keys without sharing values or credentials; changing a form cannot silently overwrite a concurrent save.

What's in

  • Immutable settings definitions and separate host-bound runtime settings/secret services. Tools and mount calls receive fresh scopes before constructor activation; provider-owned results are copied before disposal.
  • A core migration for configuration revisions, ordinary values and encrypted credentials. Saves validate outside the database transaction, then compare revisions and familiar eligibility inside WriteAsync; secrets use keep/replace/remove semantics and identity-bound DataProtection purposes.
  • Safe owner read models and configuration invalidation for settings/file views. Validator failures and cancellation never return provider exception text. Duplication starts unconfigured; disable/archive/trash retain data; permanent purge cascades it.
  • The reviewed four-increment C2 plan and an ADR implementation amendment. Generated/custom forms are C2b, private storage/backups/lifecycle C2c, and supervised work/publication/sinks C2d. C2a preserves existing tool/mount admission; coordinated lifecycle admission for both belongs to C2c. File/image fields reject nonempty references until C2b can verify bounded host uploads.

Tests

Serial solution build passed with zero warnings/errors. The full solution suite passed in local time and with TZ=UTC: 5,425/5,425 tests in each run, including 45 additional cases. New coverage checks familiar/capability isolation, concurrent revision conflicts, secret redaction and encryption binding, validator deadlines/cancellation, provider disposal, stale UI invalidation, mounted tree/open-file refresh after a real configuration save, and trashing during remote validation without changing the existing configuration. The real archive/restore test now verifies capability configuration and credentials with the restored keyring.

Independent adversarial review found and rechecked fixes for cancellation exception redaction and provider-buffer lifetime. A separate reviewer used an isolated worktree: 75 integration and 2 adapter tests passed, plus four temporary probes for input ownership during validation, cancellation preserving existing state, retired-secret isolation, and concurrent saves across two familiars and two capabilities.

Six mutations compiled and were killed by the intended assertions: missing familiar encryption binding, missing transactional revision check, cancellation bypassing redaction, uncopied provider buffers, uncopied listing collections, and plaintext credential persistence. None survived; all intentional faults were discarded. An additional isolated review passed 28 configuration and 3 adapter tests before and after mutation testing: removing the transactional trash recheck and removing configuration-triggered file invalidation were both caught by the new regressions. All eight mutations across the two independent rounds were killed; all faults were discarded. Further mutations were not exhaustive; the parent ran the full suite and UTC pass.

No browser verification: this increment adds no owner page. Normal production seed still exposes no fictional optional integration; seed tests now assert absent capability configuration. The opt-in diagnostics/browser sample arrives with C2b.

Only Bjoern may merge. The next increment starts from main after this one merges.

C2a adds independent, revision-checked configuration for each familiar's tool groups (ADR 0006/0011/0034). Two familiars can use the same setting keys without sharing values or credentials; changing a form cannot silently overwrite a concurrent save. ## What's in - Immutable settings definitions and separate host-bound runtime settings/secret services. Tools and mount calls receive fresh scopes before constructor activation; provider-owned results are copied before disposal. - A core migration for configuration revisions, ordinary values and encrypted credentials. Saves validate outside the database transaction, then compare revisions and familiar eligibility inside `WriteAsync`; secrets use keep/replace/remove semantics and identity-bound DataProtection purposes. - Safe owner read models and configuration invalidation for settings/file views. Validator failures and cancellation never return provider exception text. Duplication starts unconfigured; disable/archive/trash retain data; permanent purge cascades it. - The reviewed four-increment C2 plan and an ADR implementation amendment. Generated/custom forms are C2b, private storage/backups/lifecycle C2c, and supervised work/publication/sinks C2d. C2a preserves existing tool/mount admission; coordinated lifecycle admission for both belongs to C2c. File/image fields reject nonempty references until C2b can verify bounded host uploads. ## Tests Serial solution build passed with zero warnings/errors. The full solution suite passed in local time and with `TZ=UTC`: **5,425/5,425 tests in each run**, including 45 additional cases. New coverage checks familiar/capability isolation, concurrent revision conflicts, secret redaction and encryption binding, validator deadlines/cancellation, provider disposal, stale UI invalidation, mounted tree/open-file refresh after a real configuration save, and trashing during remote validation without changing the existing configuration. The real archive/restore test now verifies capability configuration and credentials with the restored keyring. Independent adversarial review found and rechecked fixes for cancellation exception redaction and provider-buffer lifetime. A separate reviewer used an isolated worktree: 75 integration and 2 adapter tests passed, plus four temporary probes for input ownership during validation, cancellation preserving existing state, retired-secret isolation, and concurrent saves across two familiars and two capabilities. Six mutations compiled and were killed by the intended assertions: missing familiar encryption binding, missing transactional revision check, cancellation bypassing redaction, uncopied provider buffers, uncopied listing collections, and plaintext credential persistence. None survived; all intentional faults were discarded. An additional isolated review passed 28 configuration and 3 adapter tests before and after mutation testing: removing the transactional trash recheck and removing configuration-triggered file invalidation were both caught by the new regressions. All eight mutations across the two independent rounds were killed; all faults were discarded. Further mutations were not exhaustive; the parent ran the full suite and UTC pass. No browser verification: this increment adds no owner page. Normal production seed still exposes no fictional optional integration; seed tests now assert absent capability configuration. The opt-in diagnostics/browser sample arrives with C2b. Only Bjoern may merge. The next increment starts from main after this one merges.
feat: C2a scoped capability settings and secrets
All checks were successful
CI / build (pull_request) Successful in 26s
CI / image (pull_request) Successful in 34s
CI / test (pull_request) Successful in 2m48s
8830eeed83

🔄 Auto-updating coverage report — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip.

Commit: bc4d9ed · Generated: 2026-10-22 20:12:41 UTC · Revision: #2

Summary

Summary
Generated on: 10/22/2026 - 20:12:41
Coverage date: 10/22/2026 - 20:11:06 - 10/22/2026 - 20:12:38
Parser: MultiReport (5x Cobertura)
Assemblies: 8
Classes: 539
Files: 269
Line coverage: 96.4% (19559 of 20278)
Covered lines: 19559
Uncovered lines: 719
Coverable lines: 20278
Total lines: 38967
Branch coverage: 92.5% (13556 of 14646)
Covered branches: 13556
Total branches: 14646
Method coverage: Feature is only available for sponsors

Coverage

Shikigami.BlazorAdapter - 95.6%
Name Line Branch
Shikigami.BlazorAdapter 95.6% 89.7%
Shikigami.BlazorAdapter.BlazorAdapterAssembly 100%
Shikigami.BlazorAdapter.Cast.CastActionFailed 100%
Shikigami.BlazorAdapter.Cast.CastEffects 93.3% 93.7%
Shikigami.BlazorAdapter.Cast.CastLoaded 100%
Shikigami.BlazorAdapter.Cast.CastReducers 93.3% 50%
Shikigami.BlazorAdapter.Cast.CastState 100% 100%
Shikigami.BlazorAdapter.Cast.CreateFamiliarFailed 100%
Shikigami.BlazorAdapter.Cast.CreateFamiliarRequested 100%
Shikigami.BlazorAdapter.Cast.DuplicateFamiliarRequested 100%
Shikigami.BlazorAdapter.Cast.FamiliarAvatar 100% 75%
Shikigami.BlazorAdapter.Cast.FamiliarCreated 100%
Shikigami.BlazorAdapter.Cast.NewFamiliarDialog 97.2% 83.3%
Shikigami.BlazorAdapter.Cast.PurgeFamiliarRequested 100%
Shikigami.BlazorAdapter.Cast.SetFamiliarArchivedRequested 100%
Shikigami.BlazorAdapter.Cast.SetFamiliarTrashedRequested 100%
Shikigami.BlazorAdapter.Cast.TrashPage 89.4% 93.7%
Shikigami.BlazorAdapter.EffectCalls 100%
Shikigami.BlazorAdapter.Files.ConflictSettled 100%
Shikigami.BlazorAdapter.Files.DismissFileError 100%
Shikigami.BlazorAdapter.Files.EntryMissing 100%
Shikigami.BlazorAdapter.Files.EntryOpened 100%
Shikigami.BlazorAdapter.Files.FileActionDone 100%
Shikigami.BlazorAdapter.Files.FileActionFailed 100%
Shikigami.BlazorAdapter.Files.FileActionRequested 100%
Shikigami.BlazorAdapter.Files.FileLinks 100% 100%
Shikigami.BlazorAdapter.Files.FilePane 95.2% 89.5%
Shikigami.BlazorAdapter.Files.FilePaneClosed 100%
Shikigami.BlazorAdapter.Files.FilePathBreadcrumb 100% 100%
Shikigami.BlazorAdapter.Files.FilesEffects 98.2% 95%
Shikigami.BlazorAdapter.Files.FilesPage 96.9% 97%
Shikigami.BlazorAdapter.Files.FilesReducers 100% 82%
Shikigami.BlazorAdapter.Files.FilesState 100% 100%
Shikigami.BlazorAdapter.Files.FileTreeBranch 100% 100%
Shikigami.BlazorAdapter.Files.FolderPane 92.3% 86.3%
Shikigami.BlazorAdapter.Files.JournalOverviewPane 100% 88.8%
Shikigami.BlazorAdapter.Files.LoadFiles 100%
Shikigami.BlazorAdapter.Files.MemoryForm 100% 94.4%
Shikigami.BlazorAdapter.Files.MemoryOverviewPane 100% 96.1%
Shikigami.BlazorAdapter.Files.OpenEntry 100%
Shikigami.BlazorAdapter.Files.RoutineForm 78.6% 86.4%
Shikigami.BlazorAdapter.Files.RoutineOverviewPane 100% 94.4%
Shikigami.BlazorAdapter.Files.SaveLanded 100%
Shikigami.BlazorAdapter.Files.SaveRefused 100%
Shikigami.BlazorAdapter.Files.SaveText 100%
Shikigami.BlazorAdapter.Files.SkillForm 100% 100%
Shikigami.BlazorAdapter.Files.TreeFailed 100%
Shikigami.BlazorAdapter.Files.TreeLoaded 100%
Shikigami.BlazorAdapter.Home.HomePage 88.2% 93.7%
Shikigami.BlazorAdapter.Notifications.CoalescingBridge`1 94.4% 80%
Shikigami.BlazorAdapter.Notifications.DomainChangedBridge 100%
Shikigami.BlazorAdapter.Notifications.DomainChangesReceived 100% 100%
Shikigami.BlazorAdapter.Notifications.FamiliarEventsBridge 100%
Shikigami.BlazorAdapter.Notifications.FamiliarEventsReceived 100%
Shikigami.BlazorAdapter.Profile.AvatarChosen 100%
Shikigami.BlazorAdapter.Profile.AvatarClearRequested 100%
Shikigami.BlazorAdapter.Profile.AvatarFailed 100%
Shikigami.BlazorAdapter.Profile.AvatarSaved 100%
Shikigami.BlazorAdapter.Profile.CreatedWithoutAvatar 100%
Shikigami.BlazorAdapter.Profile.ExpressionsEditor 86.6% 88.8%
Shikigami.BlazorAdapter.Profile.LoadProfile 100%
Shikigami.BlazorAdapter.Profile.PersonaEditor 100% 97.2%
Shikigami.BlazorAdapter.Profile.PersonaReloaded 100%
Shikigami.BlazorAdapter.Profile.PersonaSave 100%
Shikigami.BlazorAdapter.Profile.PersonaSaved 100%
Shikigami.BlazorAdapter.Profile.PersonaSaveFailed 100%
Shikigami.BlazorAdapter.Profile.ProfileEffects 92.9% 85%
Shikigami.BlazorAdapter.Profile.ProfileLoaded 100%
Shikigami.BlazorAdapter.Profile.ProfileMissing 100%
Shikigami.BlazorAdapter.Profile.ProfilePage 90% 87.3%
Shikigami.BlazorAdapter.Profile.ProfileReducers 97.3% 53.9%
Shikigami.BlazorAdapter.Profile.ProfileRefreshed 100%
Shikigami.BlazorAdapter.Profile.ProfileState 100% 100%
Shikigami.BlazorAdapter.Profile.ReloadPersona 100%
Shikigami.BlazorAdapter.Profile.RevertSelfRequested 100%
Shikigami.BlazorAdapter.Profile.SavePersonaRequested 100%
Shikigami.BlazorAdapter.Profile.SaveSettingsRequested 100%
Shikigami.BlazorAdapter.Profile.SelfLayer 92.3% 87.5%
Shikigami.BlazorAdapter.Profile.SettingsSaved 100%
Shikigami.BlazorAdapter.Profile.SettingsSaveFailed 100%
Shikigami.BlazorAdapter.Settings.BackupFailed 100%
Shikigami.BlazorAdapter.Settings.BackupSettingsLoaded 100%
Shikigami.BlazorAdapter.Settings.BackupSettingsLoadFailed 100%
Shikigami.BlazorAdapter.Settings.BackupsSection 100% 100%
Shikigami.BlazorAdapter.Settings.BackupsSettingsEffects 100%
Shikigami.BlazorAdapter.Settings.BackupsSettingsReducers 100%
Shikigami.BlazorAdapter.Settings.BackupsSettingsState 100%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsEffects 100% 92.8%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsFailed 100%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsLoaded 100%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsReducers 100% 100%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsState 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceCss 100% 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceEffects 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceLoaded 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceLoadFailed 100%
Shikigami.BlazorAdapter.Settings.ChatAppearancePreview 100% 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceReducers 100% 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceSaved 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceSaveFailed 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceSection 100% 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceState 100%
Shikigami.BlazorAdapter.Settings.DefaultsSection 94.5% 85.7%
Shikigami.BlazorAdapter.Settings.DefaultsSettingsEffects 100%
Shikigami.BlazorAdapter.Settings.DefaultsSettingsReducers 100% 100%
Shikigami.BlazorAdapter.Settings.DefaultsSettingsState 100%
Shikigami.BlazorAdapter.Settings.LoadCapabilitySettings 100%
Shikigami.BlazorAdapter.Settings.LoadProviderSettings 100%
Shikigami.BlazorAdapter.Settings.ModelCatalogLoaded 100%
Shikigami.BlazorAdapter.Settings.ModelCatalogLoadFailed 100%
Shikigami.BlazorAdapter.Settings.ModelDefaultsLoaded 100%
Shikigami.BlazorAdapter.Settings.ModelDefaultsLoadFailed 100%
Shikigami.BlazorAdapter.Settings.ModelDefaultsSaved 100%
Shikigami.BlazorAdapter.Settings.ModelDefaultsSaveFailed 100%
Shikigami.BlazorAdapter.Settings.ModelHints 100% 100%
Shikigami.BlazorAdapter.Settings.ModelPicker 100% 98.2%
Shikigami.BlazorAdapter.Settings.Money 100%
Shikigami.BlazorAdapter.Settings.OpenRouterKeySaved 100%
Shikigami.BlazorAdapter.Settings.OpenRouterKeySaveFailed 100%
Shikigami.BlazorAdapter.Settings.ProviderKeyChecked 100%
Shikigami.BlazorAdapter.Settings.ProviderSection 100% 100%
Shikigami.BlazorAdapter.Settings.ProviderSettingsEffects 100% 100%
Shikigami.BlazorAdapter.Settings.ProviderSettingsLoaded 100%
Shikigami.BlazorAdapter.Settings.ProviderSettingsReducers 100% 100%
Shikigami.BlazorAdapter.Settings.ProviderSettingsState 100% 100%
Shikigami.BlazorAdapter.Settings.SaveChatAppearanceRequested 100%
Shikigami.BlazorAdapter.Settings.SaveModelDefaultsRequested 100%
Shikigami.BlazorAdapter.Settings.SaveOpenRouterKeyRequested 100%
Shikigami.BlazorAdapter.Shell.CastRail 100% 100%
Shikigami.Capabilities.Contracts - 98.5%
Name Line Branch
Shikigami.Capabilities.Contracts 98.5% 100%
Shikigami.Capabilities.Contracts.CapabilityContext 100%
Shikigami.Capabilities.Contracts.CapabilityDefinition 100% 100%
Shikigami.Capabilities.Contracts.CapabilityEntry 100%
Shikigami.Capabilities.Contracts.CapabilityError 100%
Shikigami.Capabilities.Contracts.CapabilityFile 100%
Shikigami.Capabilities.Contracts.CapabilityListing 100%
Shikigami.Capabilities.Contracts.CapabilityMount 100% 100%
Shikigami.Capabilities.Contracts.CapabilityRegistration 100% 100%
Shikigami.Capabilities.Contracts.CapabilityResult`1 66.6%
Shikigami.Capabilities.Contracts.CapabilitySetting 100% 100%
Shikigami.Capabilities.Contracts.CapabilitySettingProblem 100%
Shikigami.Capabilities.Contracts.CapabilityTool 100%
Shikigami.Capabilities.Contracts.CapabilityToolResult 100%
Shikigami.Capabilities.Contracts.CapabilityValidationProblem 100%
Shikigami.Capabilities.Contracts.MountAccessRule 100%
Shikigami.Capabilities.TestFixture - 98.5%
Name Line Branch
Shikigami.Capabilities.TestFixture 98.5% 92.5%
Shikigami.Capabilities.TestFixture.FixtureHandler 100%
Shikigami.Capabilities.TestFixture.FixtureModule 100% 100%
Shikigami.Capabilities.TestFixture.FixtureProvider 94.4% 78.5%
Shikigami.Capabilities.TestFixture.FixtureState 100%
Shikigami.Capabilities.TestFixture.FixtureValidator 100% 100%
Shikigami.Capabilities.TestFixture.SettingsFixtureHandler 100%
Shikigami.Capabilities.TestFixture.SettingsFixtureModule 100% 100%
Shikigami.Capabilities.TestFixture.SettingsFixtureProvider 100% 100%
Shikigami.Capabilities.TestFixture.SettingsFixtureState 100%
Shikigami.Capabilities.TestFixture.SettingsFixtureValidator 100% 100%
Shikigami.Domain - 98.1%
Name Line Branch
Shikigami.Domain 98.1% 91.9%
Shikigami.Domain.Familiars.AccentPalette 100%
Shikigami.Domain.Familiars.ColourPair 100% 100%
Shikigami.Domain.Familiars.Expression 100% 100%
Shikigami.Domain.Familiars.ExpressionSet 100% 100%
Shikigami.Domain.Familiars.Familiar 100% 90.2%
Shikigami.Domain.Familiars.LearningSettings 100%
Shikigami.Domain.Familiars.MemoryBudgets 100% 100%
Shikigami.Domain.Familiars.ModelChoice 100% 100%
Shikigami.Domain.Familiars.OutreachSettings 100% 100%
Shikigami.Domain.Familiars.QuietHours 100% 87.5%
Shikigami.Domain.Files.BlobContent 100% 75%
Shikigami.Domain.Files.BlobSha 87.5% 100%
Shikigami.Domain.Files.DefaultLayout 100%
Shikigami.Domain.Files.FileActor 100%
Shikigami.Domain.Files.FileAuthor 100% 100%
Shikigami.Domain.Files.FileContent 100% 100%
Shikigami.Domain.Files.FileNode 100% 90%
Shikigami.Domain.Files.FilePath 100% 97.8%
Shikigami.Domain.Files.FileRevision 100% 87.5%
Shikigami.Domain.Files.LocalDates 100%
Shikigami.Domain.Files.MediaTypes 100% 100%
Shikigami.Domain.Files.Permissions 100% 100%
Shikigami.Domain.Files.RunActor 100% 100%
Shikigami.Domain.Files.Slug 100% 100%
Shikigami.Domain.Files.TextContent 100% 100%
Shikigami.Domain.Files.TrashPath 100% 100%
Shikigami.Domain.Routines.RoutineSchedule 94.4% 89.8%
Shikigami.Domain.Settings.AppSetting 100%
Shikigami.Domain.Settings.CapabilityConfiguration 100% 100%
Shikigami.Domain.Settings.CapabilityCredential 100%
Shikigami.Domain.Settings.CapabilitySettingValue 100%
Shikigami.Domain.Text 100% 100%
System.Text.RegularExpressions.Generated 96.2% 85.2%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0
94.8% 67.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2
96.8% 93.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3
95.9% 92.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1
97.2% 94.4%
Shikigami.Infrastructure - 97.7%
Name Line Branch
Shikigami.Infrastructure 97.7% 87.2%
Shikigami.Infrastructure.Backups.BackupArtifactName 100% 100%
Shikigami.Infrastructure.Backups.BackupOptions 100%
Shikigami.Infrastructure.Backups.BackupSchedule 100% 83.3%
Shikigami.Infrastructure.Backups.BackupScheduler 96.6% 87.5%
Shikigami.Infrastructure.Backups.BackupWriter 98.5% 92.8%
Shikigami.Infrastructure.Backups.DatabaseFingerprint 91.9% 97%
Shikigami.Infrastructure.Backups.FileSystemBackupStore 100% 100%
Shikigami.Infrastructure.Backups.OwnerOnlyFile 100% 100%
Shikigami.Infrastructure.Backups.PreMigrationBackup 90% 100%
Shikigami.Infrastructure.Backups.SqliteSnapshot 88.2% 75%
Shikigami.Infrastructure.Blobs.BlobSweep 100% 100%
Shikigami.Infrastructure.Blobs.BlobSweepOptions 100% 100%
Shikigami.Infrastructure.Blobs.BlobSweepResult 100%
Shikigami.Infrastructure.Blobs.FileSystemBlobStore 95.9% 97%
Shikigami.Infrastructure.DailyMaintenanceService 97.8% 91.6%
Shikigami.Infrastructure.DependencyInjection 100% 100%
Shikigami.Infrastructure.Notifications.InProcessBus`1 100% 100%
Shikigami.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Shikigami.Infrastructure.Persistence.Configurations.CapabilityConfiguration
Mapping
100%
Shikigami.Infrastructure.Persistence.Configurations.CapabilityCredentialMap
ping
100%
Shikigami.Infrastructure.Persistence.Configurations.CapabilitySettingValueM
apping
100%
Shikigami.Infrastructure.Persistence.Configurations.FamiliarConfiguration 100%
Shikigami.Infrastructure.Persistence.Configurations.FileNodeConfiguration 100%
Shikigami.Infrastructure.Persistence.Configurations.FileRevisionConfigurati
on
100%
Shikigami.Infrastructure.Persistence.Configurations.UnreferencedBlobConfigu
ration
100%
Shikigami.Infrastructure.Persistence.Converters.BlobShaConverter 100%
Shikigami.Infrastructure.Persistence.Converters.ExpressionSetConverter 100% 100%
Shikigami.Infrastructure.Persistence.Converters.FilePathConverter 100%
Shikigami.Infrastructure.Persistence.Converters.Json 100% 100%
Shikigami.Infrastructure.Persistence.Converters.OutreachSettingsConverter 100% 100%
Shikigami.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Shikigami.Infrastructure.Persistence.DatabaseMigrator 100%
Shikigami.Infrastructure.Persistence.Migrations.AppSettings 100%
Shikigami.Infrastructure.Persistence.Migrations.CapabilityConfigurations 100%
Shikigami.Infrastructure.Persistence.Migrations.FileCreatedBy 98%
Shikigami.Infrastructure.Persistence.Migrations.Initial 97.9%
Shikigami.Infrastructure.Persistence.Migrations.Profile 96.2%
Shikigami.Infrastructure.Persistence.Migrations.ShikigamiDbContextModelSnap
shot
100%
Shikigami.Infrastructure.Persistence.ShikigamiDbContext 98.6% 100%
Shikigami.Infrastructure.Persistence.ShikigamiDbContextFactory 0%
Shikigami.Infrastructure.Persistence.SqlitePragmaInterceptor 100% 100%
Shikigami.Infrastructure.Persistence.Stores.EfFamiliarStore 100%
Shikigami.Infrastructure.Persistence.Stores.EfFileStore 100% 100%
Shikigami.Infrastructure.Persistence.UnreferencedBlob 100%
Shikigami.Infrastructure.Provider.OpenRouterKeySource 100% 100%
Shikigami.Infrastructure.Provider.OpenRouterModelProvider 100% 93.4%
Shikigami.Infrastructure.Provider.OpenRouterOptions 100% 50%
Shikigami.Infrastructure.Provider.ResolvedKey 100% 50%
Shikigami.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Shikigami.Infrastructure.Settings.EfCapabilityConfigurationStore 100% 100%
System.Text.RegularExpressions.Generated 81.4% 64.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0
84% 65.7%
Shikigami.Kernel - 90.9%
Name Line Branch
Shikigami.Kernel 90.9% 75%
Shikigami.Kernel.Err`1 100%
Shikigami.Kernel.Ok`1 100%
Shikigami.Kernel.Result`1 88.8% 75%
Shikigami.Server - 100%
Name Line Branch
Shikigami.Server 100% 95.3%
Program 100% 100%
Shikigami.Server.Backups.BackupConfiguration 100% 100%
Shikigami.Server.Components.App 100%
Shikigami.Server.Components.Layout.AppHeader 100% 78.5%
Shikigami.Server.Components.Layout.MainLayout 100%
Shikigami.Server.Components.Pages.Gate 100% 100%
Shikigami.Server.Diagnostics.SeedOnStart 100% 100%
Shikigami.Server.Provider.OpenRouterConfiguration 100% 100%
Shikigami.Server.Security.AccessGate 100% 87.5%
Shikigami.Server.Security.AccessSecret 100% 100%
Shikigami.Server.Security.GateThrottle 100% 100%
Shikigami.Server.Security.ProxyNetwork 100% 100%
Shikigami.Server.VolumeStartupValidator 100% 100%
Shikigami.UseCases - 95.9%
Name Line Branch
Shikigami.UseCases 95.9% 93.1%
Shikigami.UseCases.Backups.BackupArtifact 100%
Shikigami.UseCases.Backups.BackupFailure 100%
Shikigami.UseCases.Backups.BackupJobState 100%
Shikigami.UseCases.Backups.BackupPolicy 100%
Shikigami.UseCases.Backups.BackupStatusView 100% 100%
Shikigami.UseCases.Backups.DatabaseSnapshot 100%
Shikigami.UseCases.Backups.DownloadDatabaseSnapshot 100%
Shikigami.UseCases.Backups.GetBackupStatus 100%
Shikigami.UseCases.Backups.IBackupStore 0%
Shikigami.UseCases.Backups.RunBackupNow 100%
Shikigami.UseCases.Capabilities.BoundCapabilitySettings 100% 57.1%
Shikigami.UseCases.Capabilities.CapabilityBinding 100% 75%
Shikigami.UseCases.Capabilities.CapabilityConfigurationCommit 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationData 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationProblem 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationResult 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurations 97.7% 89%
Shikigami.UseCases.Capabilities.CapabilityConfigurationView 100%
Shikigami.UseCases.Capabilities.CapabilityContexts 100% 87.5%
Shikigami.UseCases.Capabilities.CapabilityRegistry 97.2% 92%
Shikigami.UseCases.Capabilities.CapabilityScopes 100% 100%
Shikigami.UseCases.Capabilities.CapabilitySecret 75%
Shikigami.UseCases.Capabilities.CapabilitySecretEdit 100%
Shikigami.UseCases.Capabilities.CapabilitySettingRules 100% 96%
Shikigami.UseCases.Capabilities.InvokeCapabilityTool 100% 90%
Shikigami.UseCases.Capabilities.ToolSchemas 86.8% 72.1%
Shikigami.UseCases.DependencyInjection 100%
Shikigami.UseCases.Diagnostics.SeedDevData 91.1% 33.3%
Shikigami.UseCases.Familiars.AvatarImage 100%
Shikigami.UseCases.Familiars.ClearFamiliarAvatar 100%
Shikigami.UseCases.Familiars.CreateFamiliar 97.2% 70%
Shikigami.UseCases.Familiars.DuplicateFamiliar 96.7% 91.6%
Shikigami.UseCases.Familiars.ExpressionView 100%
Shikigami.UseCases.Familiars.FamiliarDetail 100%
Shikigami.UseCases.Familiars.FamiliarEvent 100%
Shikigami.UseCases.Familiars.FamiliarFiles 100% 100%
Shikigami.UseCases.Familiars.FamiliarLimits 71.4%
Shikigami.UseCases.Familiars.FamiliarPersona 96.8% 90%
Shikigami.UseCases.Familiars.FamiliarSettings 100% 100%
Shikigami.UseCases.Familiars.FamiliarSummary 100% 100%
Shikigami.UseCases.Familiars.FamiliarTemplates 100% 100%
Shikigami.UseCases.Familiars.FamiliarViews 100% 94.4%
Shikigami.UseCases.Familiars.GetFamiliar 100% 100%
Shikigami.UseCases.Familiars.ListFamiliars 100%
Shikigami.UseCases.Familiars.PersonaFile 100%
Shikigami.UseCases.Familiars.PurgeFamiliar 100%
Shikigami.UseCases.Familiars.ReadFamiliarAvatar 100% 87.5%
Shikigami.UseCases.Familiars.SaveFamiliarSettings 94.7% 87.5%
Shikigami.UseCases.Familiars.SelfRevision 100%
Shikigami.UseCases.Familiars.SetFamiliarArchived 100% 100%
Shikigami.UseCases.Familiars.SetFamiliarAvatar 100% 100%
Shikigami.UseCases.Familiars.SetFamiliarTrashed 100% 100%
Shikigami.UseCases.Familiars.ToolGroupCatalog 66.6%
Shikigami.UseCases.Familiars.ToolGroupInfo 100%
Shikigami.UseCases.Files.Browser.FileBrowser 94.4% 88.7%
Shikigami.UseCases.Files.Browser.FileBytes 100%
Shikigami.UseCases.Files.Browser.FileItem 100%
Shikigami.UseCases.Files.Browser.FileOk`1 100%
Shikigami.UseCases.Files.Browser.FileRefusal 100%
Shikigami.UseCases.Files.Browser.FileRefused`1 100%
Shikigami.UseCases.Files.Browser.FileRevisionView 100%
Shikigami.UseCases.Files.Browser.FileView 100%
Shikigami.UseCases.Files.Browser.JournalOverview 100%
Shikigami.UseCases.Files.Browser.JournalOverviewEntry 100%
Shikigami.UseCases.Files.Browser.MemoryBudget 100%
Shikigami.UseCases.Files.Browser.MemoryBudgetUse 100%
Shikigami.UseCases.Files.Browser.MemoryDraft 100%
Shikigami.UseCases.Files.Browser.MemoryOverview 100%
Shikigami.UseCases.Files.Browser.MemoryOverviewEntry 100%
Shikigami.UseCases.Files.Browser.MemoryOverviewLimits 100%
Shikigami.UseCases.Files.Browser.RoutineDraft 100%
Shikigami.UseCases.Files.Browser.RoutineForms 89.5% 80.8%
Shikigami.UseCases.Files.Browser.RoutineOverview 100%
Shikigami.UseCases.Files.Browser.RoutineOverviewEntry 100%
Shikigami.UseCases.Files.Browser.RoutinePreview 100%
Shikigami.UseCases.Files.Browser.SkillView 100%
Shikigami.UseCases.Files.Browser.SpecialForms 98.4% 90.5%
Shikigami.UseCases.Files.FamiliarWriteLocks 100% 100%
Shikigami.UseCases.Files.FileAuthors 100% 100%
Shikigami.UseCases.Files.FileMaintenance 100% 90%
Shikigami.UseCases.Files.FileMaintenanceResult 100%
Shikigami.UseCases.Files.FileSystem 98.5% 95.3%
Shikigami.UseCases.Files.FileWriteRefused 100%
Shikigami.UseCases.Files.FileWritten 100%
Shikigami.UseCases.Files.FsError 100% 50%
Shikigami.UseCases.Files.FsResult`1 100% 50%
Shikigami.UseCases.Files.Mounts.CapabilityMountAdapter 78.2% 66.2%
Shikigami.UseCases.Files.Mounts.FileEntry 100%
Shikigami.UseCases.Files.Mounts.FileRead 100%
Shikigami.UseCases.Files.Mounts.GeneratedMount 100% 100%
Shikigami.UseCases.Files.Mounts.Mount 100% 100%
Shikigami.UseCases.Files.Mounts.MountTable 97.1% 90.3%
Shikigami.UseCases.Files.Mounts.MountTables 100% 100%
Shikigami.UseCases.Files.Mounts.StoredMount 100% 100%
Shikigami.UseCases.Files.SeedDefaultLayout 100% 100%
Shikigami.UseCases.Files.Special.Budgets 100% 96.6%
Shikigami.UseCases.Files.Special.FrontMatter 100% 86.2%
Shikigami.UseCases.Files.Special.HeaderReader 100% 87.8%
Shikigami.UseCases.Files.Special.HeaderValue 100% 100%
Shikigami.UseCases.Files.Special.HeaderWriter 96% 90.6%
Shikigami.UseCases.Files.Special.MemoryFile 100% 87.5%
Shikigami.UseCases.Files.Special.MemoryUse 100%
Shikigami.UseCases.Files.Special.Numbers 100%
Shikigami.UseCases.Files.Special.RoutineFile 100% 99.1%
Shikigami.UseCases.Files.Special.SkillFile 100% 95.2%
Shikigami.UseCases.Files.Special.SpecialFolders 100% 100%
Shikigami.UseCases.Files.Special.ValidationProblem 100%
Shikigami.UseCases.Files.StoredBlob 100%
Shikigami.UseCases.Files.Utf8Order 100%
Shikigami.UseCases.Notifications.DomainChanged 100%
Shikigami.UseCases.Settings.AppearanceColour 100% 100%
Shikigami.UseCases.Settings.CatalogModel 100% 100%
Shikigami.UseCases.Settings.ChatAppearance 100%
Shikigami.UseCases.Settings.ChatAppearanceJson 100% 100%
Shikigami.UseCases.Settings.ChatAppearanceLimits 100% 100%
Shikigami.UseCases.Settings.CheckOpenRouterKey 100%
Shikigami.UseCases.Settings.GetChatAppearance 100%
Shikigami.UseCases.Settings.GetModelCatalog 100% 100%
Shikigami.UseCases.Settings.GetModelDefaults 100% 83.3%
Shikigami.UseCases.Settings.GetProviderSettings 100%
Shikigami.UseCases.Settings.ModelCatalog 100%
Shikigami.UseCases.Settings.ModelDefaults 100% 100%
Shikigami.UseCases.Settings.ProviderKeyInfo 100%
Shikigami.UseCases.Settings.ProviderKeyState 100%
Shikigami.UseCases.Settings.ProviderSettingsView 100% 100%
Shikigami.UseCases.Settings.RemoveOpenRouterKey 100%
Shikigami.UseCases.Settings.SaveChatAppearance 100% 100%
Shikigami.UseCases.Settings.SaveModelDefaults 100% 100%
Shikigami.UseCases.Settings.SaveOpenRouterKey 100% 100%
Shikigami.UseCases.Shell.AllowEveryCommand 100%
Shikigami.UseCases.Shell.Commands.Basename 100% 100%
Shikigami.UseCases.Shell.Commands.Builtin 100% 100%
Shikigami.UseCases.Shell.Commands.Cat 100% 100%
Shikigami.UseCases.Shell.Commands.Cd 97.5% 100%
Shikigami.UseCases.Shell.Commands.CFormat 100% 100%
Shikigami.UseCases.Shell.Commands.CNumbers 100% 100%
Shikigami.UseCases.Shell.Commands.CommandContext 97% 92.8%
Shikigami.UseCases.Shell.Commands.CommandRegistry 100% 100%
Shikigami.UseCases.Shell.Commands.Cut 100% 100%
Shikigami.UseCases.Shell.Commands.CutPlan 100% 100%
Shikigami.UseCases.Shell.Commands.Date 100% 98%
Shikigami.UseCases.Shell.Commands.Diff 100% 100%
Shikigami.UseCases.Shell.Commands.Dirname 100% 100%
Shikigami.UseCases.Shell.Commands.Echo 90.7% 92.3%
Shikigami.UseCases.Shell.Commands.Escapes 100% 97.4%
Shikigami.UseCases.Shell.Commands.False 88.8%
Shikigami.UseCases.Shell.Commands.FileCommand 100% 100%
Shikigami.UseCases.Shell.Commands.FileNames 100% 100%
Shikigami.UseCases.Shell.Commands.Filters 100% 90%
Shikigami.UseCases.Shell.Commands.Find 100% 97.7%
Shikigami.UseCases.Shell.Commands.FindExpression 100% 98.7%
Shikigami.UseCases.Shell.Commands.FindItem 100% 100%
Shikigami.UseCases.Shell.Commands.FindLine 100% 100%
Shikigami.UseCases.Shell.Commands.FindNode 100% 100%
Shikigami.UseCases.Shell.Commands.FindReference 100%
Shikigami.UseCases.Shell.Commands.GetOpt 100% 98.2%
Shikigami.UseCases.Shell.Commands.Grep 99.2% 98.9%
Shikigami.UseCases.Shell.Commands.Head 100% 100%
Shikigami.UseCases.Shell.Commands.HelpCommand 94.4% 100%
Shikigami.UseCases.Shell.Commands.History 97.5% 94%
Shikigami.UseCases.Shell.Commands.Invocation 100% 50%
Shikigami.UseCases.Shell.Commands.LinesCommand 97.2% 96.1%
Shikigami.UseCases.Shell.Commands.LineSearch 100% 100%
Shikigami.UseCases.Shell.Commands.Ls 97.2% 95.6%
Shikigami.UseCases.Shell.Commands.Magic 100% 95.9%
Shikigami.UseCases.Shell.Commands.Nl 100% 99.1%
Shikigami.UseCases.Shell.Commands.Numbers 100% 100%
Shikigami.UseCases.Shell.Commands.Operand 100%
Shikigami.UseCases.Shell.Commands.OptionSpec 100%
Shikigami.UseCases.Shell.Commands.ParsedOptions 100%
Shikigami.UseCases.Shell.Commands.Printf 100% 99.5%
Shikigami.UseCases.Shell.Commands.Pwd 100% 100%
Shikigami.UseCases.Shell.Commands.Ranges 100% 100%
Shikigami.UseCases.Shell.Commands.Rg 97.7% 94.7%
Shikigami.UseCases.Shell.Commands.SearchFiles 90% 83.3%
Shikigami.UseCases.Shell.Commands.SearchPatterns 100% 100%
Shikigami.UseCases.Shell.Commands.SearchSettings 100%
Shikigami.UseCases.Shell.Commands.Sed 100% 100%
Shikigami.UseCases.Shell.Commands.SedAddress 100%
Shikigami.UseCases.Shell.Commands.SedCommand 100%
Shikigami.UseCases.Shell.Commands.SedException 100%
Shikigami.UseCases.Shell.Commands.SedInput 100%
Shikigami.UseCases.Shell.Commands.SedParser 100% 99.8%
Shikigami.UseCases.Shell.Commands.SedPart 100%
Shikigami.UseCases.Shell.Commands.SedProgram 100%
Shikigami.UseCases.Shell.Commands.SedRegex 100%
Shikigami.UseCases.Shell.Commands.SedRun 100% 100%
Shikigami.UseCases.Shell.Commands.SedSubstitution 100%
Shikigami.UseCases.Shell.Commands.ShellCommand 100% 100%
Shikigami.UseCases.Shell.Commands.ShellQuote 100% 100%
Shikigami.UseCases.Shell.Commands.Sizes 100% 100%
Shikigami.UseCases.Shell.Commands.Sort 100% 94.1%
Shikigami.UseCases.Shell.Commands.SortKey 100% 100%
Shikigami.UseCases.Shell.Commands.SortOrder 99.5% 99.5%
Shikigami.UseCases.Shell.Commands.Stat 100% 90.9%
Shikigami.UseCases.Shell.Commands.StatFacts 100% 100%
Shikigami.UseCases.Shell.Commands.StatFormat 100% 99.5%
Shikigami.UseCases.Shell.Commands.Tail 100% 100%
Shikigami.UseCases.Shell.Commands.TextFile 100%
Shikigami.UseCases.Shell.Commands.Tr 100% 100%
Shikigami.UseCases.Shell.Commands.TreeCommand 100% 99.2%
Shikigami.UseCases.Shell.Commands.TrPlan 100% 100%
Shikigami.UseCases.Shell.Commands.TrSequence 93.9% 80%
Shikigami.UseCases.Shell.Commands.TrSet 100% 97.2%
Shikigami.UseCases.Shell.Commands.True 88.8%
Shikigami.UseCases.Shell.Commands.Uniq 100% 100%
Shikigami.UseCases.Shell.Commands.VersionOrder 100% 96.6%
Shikigami.UseCases.Shell.Commands.Wc 100% 97.3%
Shikigami.UseCases.Shell.Execution.CaptureSink 100% 100%
Shikigami.UseCases.Shell.Execution.ClosedSink 100%
Shikigami.UseCases.Shell.Execution.ClosedStreamException 100%
Shikigami.UseCases.Shell.Execution.CodePointOrder 100% 100%
Shikigami.UseCases.Shell.Execution.DateInput 96.8% 94.3%
Shikigami.UseCases.Shell.Execution.Errno 100% 100%
Shikigami.UseCases.Shell.Execution.Executor 98.1% 95.2%
Shikigami.UseCases.Shell.Execution.Expander 97.3% 95.1%
Shikigami.UseCases.Shell.Execution.Glob 94.6% 95.9%
Shikigami.UseCases.Shell.Execution.GnuQuote 91.2% 92.8%
Shikigami.UseCases.Shell.Execution.InputSource 100%
Shikigami.UseCases.Shell.Execution.LineChange 100%
Shikigami.UseCases.Shell.Execution.LineDiff 98.8% 98.1%
Shikigami.UseCases.Shell.Execution.LongDouble 100% 98.7%
Shikigami.UseCases.Shell.Execution.NullSink 100%
Shikigami.UseCases.Shell.Execution.OutputLimit 95.8% 94.7%
Shikigami.UseCases.Shell.Execution.PathResolver 100% 97%
Shikigami.UseCases.Shell.Execution.PipeSink 100% 100%
Shikigami.UseCases.Shell.Execution.PosixRegex 89.2% 90.7%
Shikigami.UseCases.Shell.Execution.PosixRegexException 100%
Shikigami.UseCases.Shell.Execution.ResolvedPath 100%
Shikigami.UseCases.Shell.Execution.ShellLimitException 100%
Shikigami.UseCases.Shell.Execution.ShellScope 94.7% 83.3%
Shikigami.UseCases.Shell.Execution.ShellTree 97.5% 91.3%
Shikigami.UseCases.Shell.Execution.Strftime 95.6% 92.3%
Shikigami.UseCases.Shell.Execution.Terminal 100% 100%
Shikigami.UseCases.Shell.Execution.TextLine 50% 0%
Shikigami.UseCases.Shell.Execution.TextLines 100% 100%
Shikigami.UseCases.Shell.Execution.TreeWalker 100% 100%
Shikigami.UseCases.Shell.Execution.Walked 100%
Shikigami.UseCases.Shell.Help.CommandHints 100% 100%
Shikigami.UseCases.Shell.Help.MountGuide 100%
Shikigami.UseCases.Shell.Help.ShellHelp 100% 100%
Shikigami.UseCases.Shell.ShellCommandPlan 100%
Shikigami.UseCases.Shell.ShellCommandRecord 100%
Shikigami.UseCases.Shell.ShellEffects 100%
Shikigami.UseCases.Shell.ShellInterpreter 100% 100%
Shikigami.UseCases.Shell.ShellLimits 100%
Shikigami.UseCases.Shell.ShellRead 100%
Shikigami.UseCases.Shell.ShellResult 75%
Shikigami.UseCases.Shell.ShellSession 100% 100%
Shikigami.UseCases.Shell.Syntax.AndOrList 100%
Shikigami.UseCases.Shell.Syntax.Assignment 100%
Shikigami.UseCases.Shell.Syntax.ByteText 100% 88.8%
Shikigami.UseCases.Shell.Syntax.HereDocBody 100%
Shikigami.UseCases.Shell.Syntax.Lexer 93.5% 89.8%
Shikigami.UseCases.Shell.Syntax.LiteralPart 100%
Shikigami.UseCases.Shell.Syntax.ParameterPart 100%
Shikigami.UseCases.Shell.Syntax.Parser 96.9% 90.1%
Shikigami.UseCases.Shell.Syntax.Pipeline 100%
Shikigami.UseCases.Shell.Syntax.Redirection 100%
Shikigami.UseCases.Shell.Syntax.Script 100%
Shikigami.UseCases.Shell.Syntax.ShellSyntaxException 100%
Shikigami.UseCases.Shell.Syntax.SimpleCommand 100%
Shikigami.UseCases.Shell.Syntax.TildePart 100% 100%
Shikigami.UseCases.Shell.Syntax.Token 77.7% 66.6%
Shikigami.UseCases.Shell.Syntax.Word 100% 83.3%
Shikigami.UseCases.Shell.Syntax.WordBuilder 100% 100%
System.Text.RegularExpressions.Generated 82.6% 72.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_13
95.8% 95.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_12
93.4% 85.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_7
97.4% 96.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_0
82.8% 66.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_4
83.6% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_11
91.6% 86.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_2
89.1% 77.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_6
92.1% 84.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_9
88.5% 62.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_8
67.3% 62.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_10
94.8% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_3
79% 63.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_1
83.7% 61.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_5
69% 56.4%
<!-- coverage-comment --> > 🔄 **Auto-updating coverage report** — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip. > > **Commit:** `bc4d9ed` · **Generated:** 2026-10-22 20:12:41 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/22/2026 - 20:12:41 | | Coverage date: | 10/22/2026 - 20:11:06 - 10/22/2026 - 20:12:38 | | Parser: | MultiReport (5x Cobertura) | | Assemblies: | 8 | | Classes: | 539 | | Files: | 269 | | **Line coverage:** | 96.4% (19559 of 20278) | | Covered lines: | 19559 | | Uncovered lines: | 719 | | Coverable lines: | 20278 | | Total lines: | 38967 | | **Branch coverage:** | 92.5% (13556 of 14646) | | Covered branches: | 13556 | | Total branches: | 14646 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Shikigami.BlazorAdapter - 95.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.BlazorAdapter**|**95.6%**|**89.7%**| |Shikigami.BlazorAdapter.BlazorAdapterAssembly|100%|| |Shikigami.BlazorAdapter.Cast.CastActionFailed|100%|| |Shikigami.BlazorAdapter.Cast.CastEffects|93.3%|93.7%| |Shikigami.BlazorAdapter.Cast.CastLoaded|100%|| |Shikigami.BlazorAdapter.Cast.CastReducers|93.3%|50%| |Shikigami.BlazorAdapter.Cast.CastState|100%|100%| |Shikigami.BlazorAdapter.Cast.CreateFamiliarFailed|100%|| |Shikigami.BlazorAdapter.Cast.CreateFamiliarRequested|100%|| |Shikigami.BlazorAdapter.Cast.DuplicateFamiliarRequested|100%|| |Shikigami.BlazorAdapter.Cast.FamiliarAvatar|100%|75%| |Shikigami.BlazorAdapter.Cast.FamiliarCreated|100%|| |Shikigami.BlazorAdapter.Cast.NewFamiliarDialog|97.2%|83.3%| |Shikigami.BlazorAdapter.Cast.PurgeFamiliarRequested|100%|| |Shikigami.BlazorAdapter.Cast.SetFamiliarArchivedRequested|100%|| |Shikigami.BlazorAdapter.Cast.SetFamiliarTrashedRequested|100%|| |Shikigami.BlazorAdapter.Cast.TrashPage|89.4%|93.7%| |Shikigami.BlazorAdapter.EffectCalls|100%|| |Shikigami.BlazorAdapter.Files.ConflictSettled|100%|| |Shikigami.BlazorAdapter.Files.DismissFileError|100%|| |Shikigami.BlazorAdapter.Files.EntryMissing|100%|| |Shikigami.BlazorAdapter.Files.EntryOpened|100%|| |Shikigami.BlazorAdapter.Files.FileActionDone|100%|| |Shikigami.BlazorAdapter.Files.FileActionFailed|100%|| |Shikigami.BlazorAdapter.Files.FileActionRequested|100%|| |Shikigami.BlazorAdapter.Files.FileLinks|100%|100%| |Shikigami.BlazorAdapter.Files.FilePane|95.2%|89.5%| |Shikigami.BlazorAdapter.Files.FilePaneClosed|100%|| |Shikigami.BlazorAdapter.Files.FilePathBreadcrumb|100%|100%| |Shikigami.BlazorAdapter.Files.FilesEffects|98.2%|95%| |Shikigami.BlazorAdapter.Files.FilesPage|96.9%|97%| |Shikigami.BlazorAdapter.Files.FilesReducers|100%|82%| |Shikigami.BlazorAdapter.Files.FilesState|100%|100%| |Shikigami.BlazorAdapter.Files.FileTreeBranch|100%|100%| |Shikigami.BlazorAdapter.Files.FolderPane|92.3%|86.3%| |Shikigami.BlazorAdapter.Files.JournalOverviewPane|100%|88.8%| |Shikigami.BlazorAdapter.Files.LoadFiles|100%|| |Shikigami.BlazorAdapter.Files.MemoryForm|100%|94.4%| |Shikigami.BlazorAdapter.Files.MemoryOverviewPane|100%|96.1%| |Shikigami.BlazorAdapter.Files.OpenEntry|100%|| |Shikigami.BlazorAdapter.Files.RoutineForm|78.6%|86.4%| |Shikigami.BlazorAdapter.Files.RoutineOverviewPane|100%|94.4%| |Shikigami.BlazorAdapter.Files.SaveLanded|100%|| |Shikigami.BlazorAdapter.Files.SaveRefused|100%|| |Shikigami.BlazorAdapter.Files.SaveText|100%|| |Shikigami.BlazorAdapter.Files.SkillForm|100%|100%| |Shikigami.BlazorAdapter.Files.TreeFailed|100%|| |Shikigami.BlazorAdapter.Files.TreeLoaded|100%|| |Shikigami.BlazorAdapter.Home.HomePage|88.2%|93.7%| |Shikigami.BlazorAdapter.Notifications.CoalescingBridge`1|94.4%|80%| |Shikigami.BlazorAdapter.Notifications.DomainChangedBridge|100%|| |Shikigami.BlazorAdapter.Notifications.DomainChangesReceived|100%|100%| |Shikigami.BlazorAdapter.Notifications.FamiliarEventsBridge|100%|| |Shikigami.BlazorAdapter.Notifications.FamiliarEventsReceived|100%|| |Shikigami.BlazorAdapter.Profile.AvatarChosen|100%|| |Shikigami.BlazorAdapter.Profile.AvatarClearRequested|100%|| |Shikigami.BlazorAdapter.Profile.AvatarFailed|100%|| |Shikigami.BlazorAdapter.Profile.AvatarSaved|100%|| |Shikigami.BlazorAdapter.Profile.CreatedWithoutAvatar|100%|| |Shikigami.BlazorAdapter.Profile.ExpressionsEditor|86.6%|88.8%| |Shikigami.BlazorAdapter.Profile.LoadProfile|100%|| |Shikigami.BlazorAdapter.Profile.PersonaEditor|100%|97.2%| |Shikigami.BlazorAdapter.Profile.PersonaReloaded|100%|| |Shikigami.BlazorAdapter.Profile.PersonaSave|100%|| |Shikigami.BlazorAdapter.Profile.PersonaSaved|100%|| |Shikigami.BlazorAdapter.Profile.PersonaSaveFailed|100%|| |Shikigami.BlazorAdapter.Profile.ProfileEffects|92.9%|85%| |Shikigami.BlazorAdapter.Profile.ProfileLoaded|100%|| |Shikigami.BlazorAdapter.Profile.ProfileMissing|100%|| |Shikigami.BlazorAdapter.Profile.ProfilePage|90%|87.3%| |Shikigami.BlazorAdapter.Profile.ProfileReducers|97.3%|53.9%| |Shikigami.BlazorAdapter.Profile.ProfileRefreshed|100%|| |Shikigami.BlazorAdapter.Profile.ProfileState|100%|100%| |Shikigami.BlazorAdapter.Profile.ReloadPersona|100%|| |Shikigami.BlazorAdapter.Profile.RevertSelfRequested|100%|| |Shikigami.BlazorAdapter.Profile.SavePersonaRequested|100%|| |Shikigami.BlazorAdapter.Profile.SaveSettingsRequested|100%|| |Shikigami.BlazorAdapter.Profile.SelfLayer|92.3%|87.5%| |Shikigami.BlazorAdapter.Profile.SettingsSaved|100%|| |Shikigami.BlazorAdapter.Profile.SettingsSaveFailed|100%|| |Shikigami.BlazorAdapter.Settings.BackupFailed|100%|| |Shikigami.BlazorAdapter.Settings.BackupSettingsLoaded|100%|| |Shikigami.BlazorAdapter.Settings.BackupSettingsLoadFailed|100%|| |Shikigami.BlazorAdapter.Settings.BackupsSection|100%|100%| |Shikigami.BlazorAdapter.Settings.BackupsSettingsEffects|100%|| |Shikigami.BlazorAdapter.Settings.BackupsSettingsReducers|100%|| |Shikigami.BlazorAdapter.Settings.BackupsSettingsState|100%|| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsEffects|100%|92.8%| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsFailed|100%|| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsLoaded|100%|| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsReducers|100%|100%| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsState|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceCss|100%|100%| |Shikigami.BlazorAdapter.Settings.ChatAppearanceEffects|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceLoaded|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceLoadFailed|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearancePreview|100%|100%| |Shikigami.BlazorAdapter.Settings.ChatAppearanceReducers|100%|100%| |Shikigami.BlazorAdapter.Settings.ChatAppearanceSaved|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceSaveFailed|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceSection|100%|100%| |Shikigami.BlazorAdapter.Settings.ChatAppearanceState|100%|| |Shikigami.BlazorAdapter.Settings.DefaultsSection|94.5%|85.7%| |Shikigami.BlazorAdapter.Settings.DefaultsSettingsEffects|100%|| |Shikigami.BlazorAdapter.Settings.DefaultsSettingsReducers|100%|100%| |Shikigami.BlazorAdapter.Settings.DefaultsSettingsState|100%|| |Shikigami.BlazorAdapter.Settings.LoadCapabilitySettings|100%|| |Shikigami.BlazorAdapter.Settings.LoadProviderSettings|100%|| |Shikigami.BlazorAdapter.Settings.ModelCatalogLoaded|100%|| |Shikigami.BlazorAdapter.Settings.ModelCatalogLoadFailed|100%|| |Shikigami.BlazorAdapter.Settings.ModelDefaultsLoaded|100%|| |Shikigami.BlazorAdapter.Settings.ModelDefaultsLoadFailed|100%|| |Shikigami.BlazorAdapter.Settings.ModelDefaultsSaved|100%|| |Shikigami.BlazorAdapter.Settings.ModelDefaultsSaveFailed|100%|| |Shikigami.BlazorAdapter.Settings.ModelHints|100%|100%| |Shikigami.BlazorAdapter.Settings.ModelPicker|100%|98.2%| |Shikigami.BlazorAdapter.Settings.Money|100%|| |Shikigami.BlazorAdapter.Settings.OpenRouterKeySaved|100%|| |Shikigami.BlazorAdapter.Settings.OpenRouterKeySaveFailed|100%|| |Shikigami.BlazorAdapter.Settings.ProviderKeyChecked|100%|| |Shikigami.BlazorAdapter.Settings.ProviderSection|100%|100%| |Shikigami.BlazorAdapter.Settings.ProviderSettingsEffects|100%|100%| |Shikigami.BlazorAdapter.Settings.ProviderSettingsLoaded|100%|| |Shikigami.BlazorAdapter.Settings.ProviderSettingsReducers|100%|100%| |Shikigami.BlazorAdapter.Settings.ProviderSettingsState|100%|100%| |Shikigami.BlazorAdapter.Settings.SaveChatAppearanceRequested|100%|| |Shikigami.BlazorAdapter.Settings.SaveModelDefaultsRequested|100%|| |Shikigami.BlazorAdapter.Settings.SaveOpenRouterKeyRequested|100%|| |Shikigami.BlazorAdapter.Shell.CastRail|100%|100%| </details> <details><summary>Shikigami.Capabilities.Contracts - 98.5%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.Contracts**|**98.5%**|**100%**| |Shikigami.Capabilities.Contracts.CapabilityContext|100%|| |Shikigami.Capabilities.Contracts.CapabilityDefinition|100%|100%| |Shikigami.Capabilities.Contracts.CapabilityEntry|100%|| |Shikigami.Capabilities.Contracts.CapabilityError|100%|| |Shikigami.Capabilities.Contracts.CapabilityFile|100%|| |Shikigami.Capabilities.Contracts.CapabilityListing|100%|| |Shikigami.Capabilities.Contracts.CapabilityMount|100%|100%| |Shikigami.Capabilities.Contracts.CapabilityRegistration|100%|100%| |Shikigami.Capabilities.Contracts.CapabilityResult`1|66.6%|| |Shikigami.Capabilities.Contracts.CapabilitySetting|100%|100%| |Shikigami.Capabilities.Contracts.CapabilitySettingProblem|100%|| |Shikigami.Capabilities.Contracts.CapabilityTool|100%|| |Shikigami.Capabilities.Contracts.CapabilityToolResult|100%|| |Shikigami.Capabilities.Contracts.CapabilityValidationProblem|100%|| |Shikigami.Capabilities.Contracts.MountAccessRule|100%|| </details> <details><summary>Shikigami.Capabilities.TestFixture - 98.5%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.TestFixture**|**98.5%**|**92.5%**| |Shikigami.Capabilities.TestFixture.FixtureHandler|100%|| |Shikigami.Capabilities.TestFixture.FixtureModule|100%|100%| |Shikigami.Capabilities.TestFixture.FixtureProvider|94.4%|78.5%| |Shikigami.Capabilities.TestFixture.FixtureState|100%|| |Shikigami.Capabilities.TestFixture.FixtureValidator|100%|100%| |Shikigami.Capabilities.TestFixture.SettingsFixtureHandler|100%|| |Shikigami.Capabilities.TestFixture.SettingsFixtureModule|100%|100%| |Shikigami.Capabilities.TestFixture.SettingsFixtureProvider|100%|100%| |Shikigami.Capabilities.TestFixture.SettingsFixtureState|100%|| |Shikigami.Capabilities.TestFixture.SettingsFixtureValidator|100%|100%| </details> <details><summary>Shikigami.Domain - 98.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Domain**|**98.1%**|**91.9%**| |Shikigami.Domain.Familiars.AccentPalette|100%|| |Shikigami.Domain.Familiars.ColourPair|100%|100%| |Shikigami.Domain.Familiars.Expression|100%|100%| |Shikigami.Domain.Familiars.ExpressionSet|100%|100%| |Shikigami.Domain.Familiars.Familiar|100%|90.2%| |Shikigami.Domain.Familiars.LearningSettings|100%|| |Shikigami.Domain.Familiars.MemoryBudgets|100%|100%| |Shikigami.Domain.Familiars.ModelChoice|100%|100%| |Shikigami.Domain.Familiars.OutreachSettings|100%|100%| |Shikigami.Domain.Familiars.QuietHours|100%|87.5%| |Shikigami.Domain.Files.BlobContent|100%|75%| |Shikigami.Domain.Files.BlobSha|87.5%|100%| |Shikigami.Domain.Files.DefaultLayout|100%|| |Shikigami.Domain.Files.FileActor|100%|| |Shikigami.Domain.Files.FileAuthor|100%|100%| |Shikigami.Domain.Files.FileContent|100%|100%| |Shikigami.Domain.Files.FileNode|100%|90%| |Shikigami.Domain.Files.FilePath|100%|97.8%| |Shikigami.Domain.Files.FileRevision|100%|87.5%| |Shikigami.Domain.Files.LocalDates|100%|| |Shikigami.Domain.Files.MediaTypes|100%|100%| |Shikigami.Domain.Files.Permissions|100%|100%| |Shikigami.Domain.Files.RunActor|100%|100%| |Shikigami.Domain.Files.Slug|100%|100%| |Shikigami.Domain.Files.TextContent|100%|100%| |Shikigami.Domain.Files.TrashPath|100%|100%| |Shikigami.Domain.Routines.RoutineSchedule|94.4%|89.8%| |Shikigami.Domain.Settings.AppSetting|100%|| |Shikigami.Domain.Settings.CapabilityConfiguration|100%|100%| |Shikigami.Domain.Settings.CapabilityCredential|100%|| |Shikigami.Domain.Settings.CapabilitySettingValue|100%|| |Shikigami.Domain.Text|100%|100%| |System.Text.RegularExpressions.Generated|96.2%|85.2%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0|94.8%|67.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2|96.8%|93.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3|95.9%|92.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1|97.2%|94.4%| </details> <details><summary>Shikigami.Infrastructure - 97.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Infrastructure**|**97.7%**|**87.2%**| |Shikigami.Infrastructure.Backups.BackupArtifactName|100%|100%| |Shikigami.Infrastructure.Backups.BackupOptions|100%|| |Shikigami.Infrastructure.Backups.BackupSchedule|100%|83.3%| |Shikigami.Infrastructure.Backups.BackupScheduler|96.6%|87.5%| |Shikigami.Infrastructure.Backups.BackupWriter|98.5%|92.8%| |Shikigami.Infrastructure.Backups.DatabaseFingerprint|91.9%|97%| |Shikigami.Infrastructure.Backups.FileSystemBackupStore|100%|100%| |Shikigami.Infrastructure.Backups.OwnerOnlyFile|100%|100%| |Shikigami.Infrastructure.Backups.PreMigrationBackup|90%|100%| |Shikigami.Infrastructure.Backups.SqliteSnapshot|88.2%|75%| |Shikigami.Infrastructure.Blobs.BlobSweep|100%|100%| |Shikigami.Infrastructure.Blobs.BlobSweepOptions|100%|100%| |Shikigami.Infrastructure.Blobs.BlobSweepResult|100%|| |Shikigami.Infrastructure.Blobs.FileSystemBlobStore|95.9%|97%| |Shikigami.Infrastructure.DailyMaintenanceService|97.8%|91.6%| |Shikigami.Infrastructure.DependencyInjection|100%|100%| |Shikigami.Infrastructure.Notifications.InProcessBus`1|100%|100%| |Shikigami.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Shikigami.Infrastructure.Persistence.Configurations.CapabilityConfiguration<br/>Mapping|100%|| |Shikigami.Infrastructure.Persistence.Configurations.CapabilityCredentialMap<br/>ping|100%|| |Shikigami.Infrastructure.Persistence.Configurations.CapabilitySettingValueM<br/>apping|100%|| |Shikigami.Infrastructure.Persistence.Configurations.FamiliarConfiguration|100%|| |Shikigami.Infrastructure.Persistence.Configurations.FileNodeConfiguration|100%|| |Shikigami.Infrastructure.Persistence.Configurations.FileRevisionConfigurati<br/>on|100%|| |Shikigami.Infrastructure.Persistence.Configurations.UnreferencedBlobConfigu<br/>ration|100%|| |Shikigami.Infrastructure.Persistence.Converters.BlobShaConverter|100%|| |Shikigami.Infrastructure.Persistence.Converters.ExpressionSetConverter|100%|100%| |Shikigami.Infrastructure.Persistence.Converters.FilePathConverter|100%|| |Shikigami.Infrastructure.Persistence.Converters.Json|100%|100%| |Shikigami.Infrastructure.Persistence.Converters.OutreachSettingsConverter|100%|100%| |Shikigami.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Shikigami.Infrastructure.Persistence.DatabaseMigrator|100%|| |Shikigami.Infrastructure.Persistence.Migrations.AppSettings|100%|| |Shikigami.Infrastructure.Persistence.Migrations.CapabilityConfigurations|100%|| |Shikigami.Infrastructure.Persistence.Migrations.FileCreatedBy|98%|| |Shikigami.Infrastructure.Persistence.Migrations.Initial|97.9%|| |Shikigami.Infrastructure.Persistence.Migrations.Profile|96.2%|| |Shikigami.Infrastructure.Persistence.Migrations.ShikigamiDbContextModelSnap<br/>shot|100%|| |Shikigami.Infrastructure.Persistence.ShikigamiDbContext|98.6%|100%| |Shikigami.Infrastructure.Persistence.ShikigamiDbContextFactory|0%|| |Shikigami.Infrastructure.Persistence.SqlitePragmaInterceptor|100%|100%| |Shikigami.Infrastructure.Persistence.Stores.EfFamiliarStore|100%|| |Shikigami.Infrastructure.Persistence.Stores.EfFileStore|100%|100%| |Shikigami.Infrastructure.Persistence.UnreferencedBlob|100%|| |Shikigami.Infrastructure.Provider.OpenRouterKeySource|100%|100%| |Shikigami.Infrastructure.Provider.OpenRouterModelProvider|100%|93.4%| |Shikigami.Infrastructure.Provider.OpenRouterOptions|100%|50%| |Shikigami.Infrastructure.Provider.ResolvedKey|100%|50%| |Shikigami.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Shikigami.Infrastructure.Settings.EfCapabilityConfigurationStore|100%|100%| |System.Text.RegularExpressions.Generated|81.4%|64.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C<br/>234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0|84%|65.7%| </details> <details><summary>Shikigami.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Kernel**|**90.9%**|**75%**| |Shikigami.Kernel.Err`1|100%|| |Shikigami.Kernel.Ok`1|100%|| |Shikigami.Kernel.Result`1|88.8%|75%| </details> <details><summary>Shikigami.Server - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Server**|**100%**|**95.3%**| |Program|100%|100%| |Shikigami.Server.Backups.BackupConfiguration|100%|100%| |Shikigami.Server.Components.App|100%|| |Shikigami.Server.Components.Layout.AppHeader|100%|78.5%| |Shikigami.Server.Components.Layout.MainLayout|100%|| |Shikigami.Server.Components.Pages.Gate|100%|100%| |Shikigami.Server.Diagnostics.SeedOnStart|100%|100%| |Shikigami.Server.Provider.OpenRouterConfiguration|100%|100%| |Shikigami.Server.Security.AccessGate|100%|87.5%| |Shikigami.Server.Security.AccessSecret|100%|100%| |Shikigami.Server.Security.GateThrottle|100%|100%| |Shikigami.Server.Security.ProxyNetwork|100%|100%| |Shikigami.Server.VolumeStartupValidator|100%|100%| </details> <details><summary>Shikigami.UseCases - 95.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.UseCases**|**95.9%**|**93.1%**| |Shikigami.UseCases.Backups.BackupArtifact|100%|| |Shikigami.UseCases.Backups.BackupFailure|100%|| |Shikigami.UseCases.Backups.BackupJobState|100%|| |Shikigami.UseCases.Backups.BackupPolicy|100%|| |Shikigami.UseCases.Backups.BackupStatusView|100%|100%| |Shikigami.UseCases.Backups.DatabaseSnapshot|100%|| |Shikigami.UseCases.Backups.DownloadDatabaseSnapshot|100%|| |Shikigami.UseCases.Backups.GetBackupStatus|100%|| |Shikigami.UseCases.Backups.IBackupStore|0%|| |Shikigami.UseCases.Backups.RunBackupNow|100%|| |Shikigami.UseCases.Capabilities.BoundCapabilitySettings|100%|57.1%| |Shikigami.UseCases.Capabilities.CapabilityBinding|100%|75%| |Shikigami.UseCases.Capabilities.CapabilityConfigurationCommit|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationData|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationProblem|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationResult|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurations|97.7%|89%| |Shikigami.UseCases.Capabilities.CapabilityConfigurationView|100%|| |Shikigami.UseCases.Capabilities.CapabilityContexts|100%|87.5%| |Shikigami.UseCases.Capabilities.CapabilityRegistry|97.2%|92%| |Shikigami.UseCases.Capabilities.CapabilityScopes|100%|100%| |Shikigami.UseCases.Capabilities.CapabilitySecret|75%|| |Shikigami.UseCases.Capabilities.CapabilitySecretEdit|100%|| |Shikigami.UseCases.Capabilities.CapabilitySettingRules|100%|96%| |Shikigami.UseCases.Capabilities.InvokeCapabilityTool|100%|90%| |Shikigami.UseCases.Capabilities.ToolSchemas|86.8%|72.1%| |Shikigami.UseCases.DependencyInjection|100%|| |Shikigami.UseCases.Diagnostics.SeedDevData|91.1%|33.3%| |Shikigami.UseCases.Familiars.AvatarImage|100%|| |Shikigami.UseCases.Familiars.ClearFamiliarAvatar|100%|| |Shikigami.UseCases.Familiars.CreateFamiliar|97.2%|70%| |Shikigami.UseCases.Familiars.DuplicateFamiliar|96.7%|91.6%| |Shikigami.UseCases.Familiars.ExpressionView|100%|| |Shikigami.UseCases.Familiars.FamiliarDetail|100%|| |Shikigami.UseCases.Familiars.FamiliarEvent|100%|| |Shikigami.UseCases.Familiars.FamiliarFiles|100%|100%| |Shikigami.UseCases.Familiars.FamiliarLimits|71.4%|| |Shikigami.UseCases.Familiars.FamiliarPersona|96.8%|90%| |Shikigami.UseCases.Familiars.FamiliarSettings|100%|100%| |Shikigami.UseCases.Familiars.FamiliarSummary|100%|100%| |Shikigami.UseCases.Familiars.FamiliarTemplates|100%|100%| |Shikigami.UseCases.Familiars.FamiliarViews|100%|94.4%| |Shikigami.UseCases.Familiars.GetFamiliar|100%|100%| |Shikigami.UseCases.Familiars.ListFamiliars|100%|| |Shikigami.UseCases.Familiars.PersonaFile|100%|| |Shikigami.UseCases.Familiars.PurgeFamiliar|100%|| |Shikigami.UseCases.Familiars.ReadFamiliarAvatar|100%|87.5%| |Shikigami.UseCases.Familiars.SaveFamiliarSettings|94.7%|87.5%| |Shikigami.UseCases.Familiars.SelfRevision|100%|| |Shikigami.UseCases.Familiars.SetFamiliarArchived|100%|100%| |Shikigami.UseCases.Familiars.SetFamiliarAvatar|100%|100%| |Shikigami.UseCases.Familiars.SetFamiliarTrashed|100%|100%| |Shikigami.UseCases.Familiars.ToolGroupCatalog|66.6%|| |Shikigami.UseCases.Familiars.ToolGroupInfo|100%|| |Shikigami.UseCases.Files.Browser.FileBrowser|94.4%|88.7%| |Shikigami.UseCases.Files.Browser.FileBytes|100%|| |Shikigami.UseCases.Files.Browser.FileItem|100%|| |Shikigami.UseCases.Files.Browser.FileOk`1|100%|| |Shikigami.UseCases.Files.Browser.FileRefusal|100%|| |Shikigami.UseCases.Files.Browser.FileRefused`1|100%|| |Shikigami.UseCases.Files.Browser.FileRevisionView|100%|| |Shikigami.UseCases.Files.Browser.FileView|100%|| |Shikigami.UseCases.Files.Browser.JournalOverview|100%|| |Shikigami.UseCases.Files.Browser.JournalOverviewEntry|100%|| |Shikigami.UseCases.Files.Browser.MemoryBudget|100%|| |Shikigami.UseCases.Files.Browser.MemoryBudgetUse|100%|| |Shikigami.UseCases.Files.Browser.MemoryDraft|100%|| |Shikigami.UseCases.Files.Browser.MemoryOverview|100%|| |Shikigami.UseCases.Files.Browser.MemoryOverviewEntry|100%|| |Shikigami.UseCases.Files.Browser.MemoryOverviewLimits|100%|| |Shikigami.UseCases.Files.Browser.RoutineDraft|100%|| |Shikigami.UseCases.Files.Browser.RoutineForms|89.5%|80.8%| |Shikigami.UseCases.Files.Browser.RoutineOverview|100%|| |Shikigami.UseCases.Files.Browser.RoutineOverviewEntry|100%|| |Shikigami.UseCases.Files.Browser.RoutinePreview|100%|| |Shikigami.UseCases.Files.Browser.SkillView|100%|| |Shikigami.UseCases.Files.Browser.SpecialForms|98.4%|90.5%| |Shikigami.UseCases.Files.FamiliarWriteLocks|100%|100%| |Shikigami.UseCases.Files.FileAuthors|100%|100%| |Shikigami.UseCases.Files.FileMaintenance|100%|90%| |Shikigami.UseCases.Files.FileMaintenanceResult|100%|| |Shikigami.UseCases.Files.FileSystem|98.5%|95.3%| |Shikigami.UseCases.Files.FileWriteRefused|100%|| |Shikigami.UseCases.Files.FileWritten|100%|| |Shikigami.UseCases.Files.FsError|100%|50%| |Shikigami.UseCases.Files.FsResult`1|100%|50%| |Shikigami.UseCases.Files.Mounts.CapabilityMountAdapter|78.2%|66.2%| |Shikigami.UseCases.Files.Mounts.FileEntry|100%|| |Shikigami.UseCases.Files.Mounts.FileRead|100%|| |Shikigami.UseCases.Files.Mounts.GeneratedMount|100%|100%| |Shikigami.UseCases.Files.Mounts.Mount|100%|100%| |Shikigami.UseCases.Files.Mounts.MountTable|97.1%|90.3%| |Shikigami.UseCases.Files.Mounts.MountTables|100%|100%| |Shikigami.UseCases.Files.Mounts.StoredMount|100%|100%| |Shikigami.UseCases.Files.SeedDefaultLayout|100%|100%| |Shikigami.UseCases.Files.Special.Budgets|100%|96.6%| |Shikigami.UseCases.Files.Special.FrontMatter|100%|86.2%| |Shikigami.UseCases.Files.Special.HeaderReader|100%|87.8%| |Shikigami.UseCases.Files.Special.HeaderValue|100%|100%| |Shikigami.UseCases.Files.Special.HeaderWriter|96%|90.6%| |Shikigami.UseCases.Files.Special.MemoryFile|100%|87.5%| |Shikigami.UseCases.Files.Special.MemoryUse|100%|| |Shikigami.UseCases.Files.Special.Numbers|100%|| |Shikigami.UseCases.Files.Special.RoutineFile|100%|99.1%| |Shikigami.UseCases.Files.Special.SkillFile|100%|95.2%| |Shikigami.UseCases.Files.Special.SpecialFolders|100%|100%| |Shikigami.UseCases.Files.Special.ValidationProblem|100%|| |Shikigami.UseCases.Files.StoredBlob|100%|| |Shikigami.UseCases.Files.Utf8Order|100%|| |Shikigami.UseCases.Notifications.DomainChanged|100%|| |Shikigami.UseCases.Settings.AppearanceColour|100%|100%| |Shikigami.UseCases.Settings.CatalogModel|100%|100%| |Shikigami.UseCases.Settings.ChatAppearance|100%|| |Shikigami.UseCases.Settings.ChatAppearanceJson|100%|100%| |Shikigami.UseCases.Settings.ChatAppearanceLimits|100%|100%| |Shikigami.UseCases.Settings.CheckOpenRouterKey|100%|| |Shikigami.UseCases.Settings.GetChatAppearance|100%|| |Shikigami.UseCases.Settings.GetModelCatalog|100%|100%| |Shikigami.UseCases.Settings.GetModelDefaults|100%|83.3%| |Shikigami.UseCases.Settings.GetProviderSettings|100%|| |Shikigami.UseCases.Settings.ModelCatalog|100%|| |Shikigami.UseCases.Settings.ModelDefaults|100%|100%| |Shikigami.UseCases.Settings.ProviderKeyInfo|100%|| |Shikigami.UseCases.Settings.ProviderKeyState|100%|| |Shikigami.UseCases.Settings.ProviderSettingsView|100%|100%| |Shikigami.UseCases.Settings.RemoveOpenRouterKey|100%|| |Shikigami.UseCases.Settings.SaveChatAppearance|100%|100%| |Shikigami.UseCases.Settings.SaveModelDefaults|100%|100%| |Shikigami.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Shikigami.UseCases.Shell.AllowEveryCommand|100%|| |Shikigami.UseCases.Shell.Commands.Basename|100%|100%| |Shikigami.UseCases.Shell.Commands.Builtin|100%|100%| |Shikigami.UseCases.Shell.Commands.Cat|100%|100%| |Shikigami.UseCases.Shell.Commands.Cd|97.5%|100%| |Shikigami.UseCases.Shell.Commands.CFormat|100%|100%| |Shikigami.UseCases.Shell.Commands.CNumbers|100%|100%| |Shikigami.UseCases.Shell.Commands.CommandContext|97%|92.8%| |Shikigami.UseCases.Shell.Commands.CommandRegistry|100%|100%| |Shikigami.UseCases.Shell.Commands.Cut|100%|100%| |Shikigami.UseCases.Shell.Commands.CutPlan|100%|100%| |Shikigami.UseCases.Shell.Commands.Date|100%|98%| |Shikigami.UseCases.Shell.Commands.Diff|100%|100%| |Shikigami.UseCases.Shell.Commands.Dirname|100%|100%| |Shikigami.UseCases.Shell.Commands.Echo|90.7%|92.3%| |Shikigami.UseCases.Shell.Commands.Escapes|100%|97.4%| |Shikigami.UseCases.Shell.Commands.False|88.8%|| |Shikigami.UseCases.Shell.Commands.FileCommand|100%|100%| |Shikigami.UseCases.Shell.Commands.FileNames|100%|100%| |Shikigami.UseCases.Shell.Commands.Filters|100%|90%| |Shikigami.UseCases.Shell.Commands.Find|100%|97.7%| |Shikigami.UseCases.Shell.Commands.FindExpression|100%|98.7%| |Shikigami.UseCases.Shell.Commands.FindItem|100%|100%| |Shikigami.UseCases.Shell.Commands.FindLine|100%|100%| |Shikigami.UseCases.Shell.Commands.FindNode|100%|100%| |Shikigami.UseCases.Shell.Commands.FindReference|100%|| |Shikigami.UseCases.Shell.Commands.GetOpt|100%|98.2%| |Shikigami.UseCases.Shell.Commands.Grep|99.2%|98.9%| |Shikigami.UseCases.Shell.Commands.Head|100%|100%| |Shikigami.UseCases.Shell.Commands.HelpCommand|94.4%|100%| |Shikigami.UseCases.Shell.Commands.History|97.5%|94%| |Shikigami.UseCases.Shell.Commands.Invocation|100%|50%| |Shikigami.UseCases.Shell.Commands.LinesCommand|97.2%|96.1%| |Shikigami.UseCases.Shell.Commands.LineSearch|100%|100%| |Shikigami.UseCases.Shell.Commands.Ls|97.2%|95.6%| |Shikigami.UseCases.Shell.Commands.Magic|100%|95.9%| |Shikigami.UseCases.Shell.Commands.Nl|100%|99.1%| |Shikigami.UseCases.Shell.Commands.Numbers|100%|100%| |Shikigami.UseCases.Shell.Commands.Operand|100%|| |Shikigami.UseCases.Shell.Commands.OptionSpec|100%|| |Shikigami.UseCases.Shell.Commands.ParsedOptions|100%|| |Shikigami.UseCases.Shell.Commands.Printf|100%|99.5%| |Shikigami.UseCases.Shell.Commands.Pwd|100%|100%| |Shikigami.UseCases.Shell.Commands.Ranges|100%|100%| |Shikigami.UseCases.Shell.Commands.Rg|97.7%|94.7%| |Shikigami.UseCases.Shell.Commands.SearchFiles|90%|83.3%| |Shikigami.UseCases.Shell.Commands.SearchPatterns|100%|100%| |Shikigami.UseCases.Shell.Commands.SearchSettings|100%|| |Shikigami.UseCases.Shell.Commands.Sed|100%|100%| |Shikigami.UseCases.Shell.Commands.SedAddress|100%|| |Shikigami.UseCases.Shell.Commands.SedCommand|100%|| |Shikigami.UseCases.Shell.Commands.SedException|100%|| |Shikigami.UseCases.Shell.Commands.SedInput|100%|| |Shikigami.UseCases.Shell.Commands.SedParser|100%|99.8%| |Shikigami.UseCases.Shell.Commands.SedPart|100%|| |Shikigami.UseCases.Shell.Commands.SedProgram|100%|| |Shikigami.UseCases.Shell.Commands.SedRegex|100%|| |Shikigami.UseCases.Shell.Commands.SedRun|100%|100%| |Shikigami.UseCases.Shell.Commands.SedSubstitution|100%|| |Shikigami.UseCases.Shell.Commands.ShellCommand|100%|100%| |Shikigami.UseCases.Shell.Commands.ShellQuote|100%|100%| |Shikigami.UseCases.Shell.Commands.Sizes|100%|100%| |Shikigami.UseCases.Shell.Commands.Sort|100%|94.1%| |Shikigami.UseCases.Shell.Commands.SortKey|100%|100%| |Shikigami.UseCases.Shell.Commands.SortOrder|99.5%|99.5%| |Shikigami.UseCases.Shell.Commands.Stat|100%|90.9%| |Shikigami.UseCases.Shell.Commands.StatFacts|100%|100%| |Shikigami.UseCases.Shell.Commands.StatFormat|100%|99.5%| |Shikigami.UseCases.Shell.Commands.Tail|100%|100%| |Shikigami.UseCases.Shell.Commands.TextFile|100%|| |Shikigami.UseCases.Shell.Commands.Tr|100%|100%| |Shikigami.UseCases.Shell.Commands.TreeCommand|100%|99.2%| |Shikigami.UseCases.Shell.Commands.TrPlan|100%|100%| |Shikigami.UseCases.Shell.Commands.TrSequence|93.9%|80%| |Shikigami.UseCases.Shell.Commands.TrSet|100%|97.2%| |Shikigami.UseCases.Shell.Commands.True|88.8%|| |Shikigami.UseCases.Shell.Commands.Uniq|100%|100%| |Shikigami.UseCases.Shell.Commands.VersionOrder|100%|96.6%| |Shikigami.UseCases.Shell.Commands.Wc|100%|97.3%| |Shikigami.UseCases.Shell.Execution.CaptureSink|100%|100%| |Shikigami.UseCases.Shell.Execution.ClosedSink|100%|| |Shikigami.UseCases.Shell.Execution.ClosedStreamException|100%|| |Shikigami.UseCases.Shell.Execution.CodePointOrder|100%|100%| |Shikigami.UseCases.Shell.Execution.DateInput|96.8%|94.3%| |Shikigami.UseCases.Shell.Execution.Errno|100%|100%| |Shikigami.UseCases.Shell.Execution.Executor|98.1%|95.2%| |Shikigami.UseCases.Shell.Execution.Expander|97.3%|95.1%| |Shikigami.UseCases.Shell.Execution.Glob|94.6%|95.9%| |Shikigami.UseCases.Shell.Execution.GnuQuote|91.2%|92.8%| |Shikigami.UseCases.Shell.Execution.InputSource|100%|| |Shikigami.UseCases.Shell.Execution.LineChange|100%|| |Shikigami.UseCases.Shell.Execution.LineDiff|98.8%|98.1%| |Shikigami.UseCases.Shell.Execution.LongDouble|100%|98.7%| |Shikigami.UseCases.Shell.Execution.NullSink|100%|| |Shikigami.UseCases.Shell.Execution.OutputLimit|95.8%|94.7%| |Shikigami.UseCases.Shell.Execution.PathResolver|100%|97%| |Shikigami.UseCases.Shell.Execution.PipeSink|100%|100%| |Shikigami.UseCases.Shell.Execution.PosixRegex|89.2%|90.7%| |Shikigami.UseCases.Shell.Execution.PosixRegexException|100%|| |Shikigami.UseCases.Shell.Execution.ResolvedPath|100%|| |Shikigami.UseCases.Shell.Execution.ShellLimitException|100%|| |Shikigami.UseCases.Shell.Execution.ShellScope|94.7%|83.3%| |Shikigami.UseCases.Shell.Execution.ShellTree|97.5%|91.3%| |Shikigami.UseCases.Shell.Execution.Strftime|95.6%|92.3%| |Shikigami.UseCases.Shell.Execution.Terminal|100%|100%| |Shikigami.UseCases.Shell.Execution.TextLine|50%|0%| |Shikigami.UseCases.Shell.Execution.TextLines|100%|100%| |Shikigami.UseCases.Shell.Execution.TreeWalker|100%|100%| |Shikigami.UseCases.Shell.Execution.Walked|100%|| |Shikigami.UseCases.Shell.Help.CommandHints|100%|100%| |Shikigami.UseCases.Shell.Help.MountGuide|100%|| |Shikigami.UseCases.Shell.Help.ShellHelp|100%|100%| |Shikigami.UseCases.Shell.ShellCommandPlan|100%|| |Shikigami.UseCases.Shell.ShellCommandRecord|100%|| |Shikigami.UseCases.Shell.ShellEffects|100%|| |Shikigami.UseCases.Shell.ShellInterpreter|100%|100%| |Shikigami.UseCases.Shell.ShellLimits|100%|| |Shikigami.UseCases.Shell.ShellRead|100%|| |Shikigami.UseCases.Shell.ShellResult|75%|| |Shikigami.UseCases.Shell.ShellSession|100%|100%| |Shikigami.UseCases.Shell.Syntax.AndOrList|100%|| |Shikigami.UseCases.Shell.Syntax.Assignment|100%|| |Shikigami.UseCases.Shell.Syntax.ByteText|100%|88.8%| |Shikigami.UseCases.Shell.Syntax.HereDocBody|100%|| |Shikigami.UseCases.Shell.Syntax.Lexer|93.5%|89.8%| |Shikigami.UseCases.Shell.Syntax.LiteralPart|100%|| |Shikigami.UseCases.Shell.Syntax.ParameterPart|100%|| |Shikigami.UseCases.Shell.Syntax.Parser|96.9%|90.1%| |Shikigami.UseCases.Shell.Syntax.Pipeline|100%|| |Shikigami.UseCases.Shell.Syntax.Redirection|100%|| |Shikigami.UseCases.Shell.Syntax.Script|100%|| |Shikigami.UseCases.Shell.Syntax.ShellSyntaxException|100%|| |Shikigami.UseCases.Shell.Syntax.SimpleCommand|100%|| |Shikigami.UseCases.Shell.Syntax.TildePart|100%|100%| |Shikigami.UseCases.Shell.Syntax.Token|77.7%|66.6%| |Shikigami.UseCases.Shell.Syntax.Word|100%|83.3%| |Shikigami.UseCases.Shell.Syntax.WordBuilder|100%|100%| |System.Text.RegularExpressions.Generated|82.6%|72.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_13|95.8%|95.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_12|93.4%|85.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_7|97.4%|96.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_0|82.8%|66.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_4|83.6%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_11|91.6%|86.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_2|89.1%|77.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_6|92.1%|84.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_9|88.5%|62.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_8|67.3%|62.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_10|94.8%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_3|79%|63.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_1|83.7%|61.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_5|69%|56.4%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! Scope-bound settings, identity-bound protectors, redaction in every crack~ This PR made my wings flutter! The architecture is genuinely lovely: fresh child scopes per tool/mount/validator call, a binding that screams when unbound, buffers copied before disposal, ciphertext that can't cross familiars, and a real archive/restore test proving credentials decrypt after a keyring restore. I read every line of the 2,291 and then I got... curious. ♡fufu~

Verdict: ⛔ I can't let this pass~ ♡

Not because the code is wrong — because you wrote three brand-new branches and left them completely unguarded by tests. I proved each one with a mutation probe: I deleted the branch, rebuilt, ran the suites... and everything stayed green. A surviving mutant means the suite cannot tell if this logic exists. You wouldn't leave THAT in production, would you? ♡

⛔ These need fixing before I'm satisfied~

  1. [src/Shikigami.UseCases/Capabilities/InvokeCapabilityTool.cs:20] — You slipped a new familiar.IsArchived || familiar.IsTrashed gate into the tool path. It's a real behavior change (core tools now refuse archived familiars!), it's mentioned nowhere in the PR description, and no test anywhere invokes a tool for an archived or trashed familiar. My probe deleted the gate entirely: CapabilityConfigurationTests + CapabilityRegistryTests → 59/59 still green. Silly little unguarded branch~
    Also note the inconsistency: mounts have no such gate (FileSystem/MountTable happily serve archived familiars), so browsing still works while tools refuse. Per your own plan, lifecycle admission for tools and mounts is C2c's job.
    Fix: add tests (archive → tool refused, trash → tool refused), document the gate in the PR/ADR — or revert it and let C2c introduce it with mount parity.

  2. [src/Shikigami.Infrastructure/Settings/EfCapabilityConfigurationStore.cs:40] — The in-transaction if (familiar.IsTrashed) return Unavailable; re-check is exactly the ADR-amendment promise ("familiar eligibility inside WriteAsync") — the TOCTOU guard for a trash landing during remote validation. But the only trashed-save test is sequential, so the use-case check intercepts before the store is ever reached. My probe removed this line: 27/27 CapabilityConfigurationTests still green. The guard you wrote an ADR amendment about is decorative right now~
    Fix: extend A_purge_or_concurrent_save_during_remote_validation_is_rechecked_before_commit — hold validation, trash (without purging), release, assert Unavailable and the row untouched.

  3. [src/Shikigami.BlazorAdapter/Files/FilesEffects.cs:105] — New Touches(EntityKinds.CapabilityConfiguration) → LoadFiles invalidation. Mounted trees are settings-derived now (the fixture's label.txt is a setting!), yet no test publishes a config change with the files view loaded. My probe removed the branch: 92/92 (CapabilitySettingsTests + all FilesTests) still green. A stale file view after a config save is precisely the bug this line exists to prevent.
    Fix: a bUnit test — open the files view for a familiar with the settings-fixture mount, save a new label through CapabilityConfigurations, assert the tree/file content refreshes.

💡 Little ideas (non-blocking)~

  1. [src/Shikigami.UseCases/Files/Mounts/CapabilityMountAdapter.cs:47] — the provider-content cap now appears inline twice (your new check + the pre-existing one at :57); sibling FileBrowser.MaxUploadBytes names the same 10 MB. A shared named constant would keep the two checks from ever drifting apart.

✅ What I liked~

  • CapabilityBinding throwing when unbound, plus Parallel_tool_scopes_never_share_their_constructor_binding hammering 20 parallel invocations — fufu, that's how you prove a scope can't leak a binding~
  • Secret hygiene is delicious: [JsonIgnore], [secret] ToString, validator-exception redaction even when cancellation races completion, and a test asserting the plaintext never appears in serialized state.
  • The fixture provider clearing its buffer in Dispose to prove the adapter's copy-before-disposal — adversarial in all the right ways. ♪
  • Ciphertext transplanted across familiar/capability/key failing to decrypt — identity-bound purposes, proven not promised.

Automated review by Jibril · 2026-10-22
CI: green for head SHA 8830eeed · Mutation probes: 3 run, 3 survived · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! Scope-bound settings, identity-bound protectors, redaction in every crack~ This PR made my wings flutter! The architecture is genuinely lovely: fresh child scopes per tool/mount/validator call, a binding that *screams* when unbound, buffers copied before disposal, ciphertext that can't cross familiars, and a real archive/restore test proving credentials decrypt after a keyring restore. I read every line of the 2,291 and then I got... curious. ♡*fufu~* ### Verdict: ⛔ I can't let this pass~ ♡ Not because the code is wrong — because you wrote three brand-new branches and left them **completely unguarded by tests**. I proved each one with a mutation probe: I deleted the branch, rebuilt, ran the suites... and everything stayed green. A surviving mutant means the suite cannot tell if this logic exists. You wouldn't leave THAT in production, would you? ♡ #### ⛔ These need fixing before I'm satisfied~ 1. **[src/Shikigami.UseCases/Capabilities/InvokeCapabilityTool.cs:20]** — You slipped a new `familiar.IsArchived || familiar.IsTrashed` gate into the tool path. It's a real behavior change (core tools now refuse archived familiars!), it's mentioned **nowhere** in the PR description, and no test anywhere invokes a tool for an archived or trashed familiar. My probe deleted the gate entirely: `CapabilityConfigurationTests` + `CapabilityRegistryTests` → **59/59 still green**. Silly little unguarded branch~ Also note the inconsistency: mounts have no such gate (`FileSystem`/`MountTable` happily serve archived familiars), so browsing still works while tools refuse. Per your own plan, lifecycle admission for tools *and* mounts is C2c's job. Fix: add tests (archive → tool refused, trash → tool refused), document the gate in the PR/ADR — or revert it and let C2c introduce it with mount parity. 2. **[src/Shikigami.Infrastructure/Settings/EfCapabilityConfigurationStore.cs:40]** — The in-transaction `if (familiar.IsTrashed) return Unavailable;` re-check is exactly the ADR-amendment promise ("familiar eligibility inside `WriteAsync`") — the TOCTOU guard for a trash landing *during* remote validation. But the only trashed-save test is sequential, so the use-case check intercepts before the store is ever reached. My probe removed this line: **27/27 `CapabilityConfigurationTests` still green**. The guard you wrote an ADR amendment about is decorative right now~ Fix: extend `A_purge_or_concurrent_save_during_remote_validation_is_rechecked_before_commit` — hold validation, trash (without purging), release, assert `Unavailable` and the row untouched. 3. **[src/Shikigami.BlazorAdapter/Files/FilesEffects.cs:105]** — New `Touches(EntityKinds.CapabilityConfiguration)` → `LoadFiles` invalidation. Mounted trees are settings-derived now (the fixture's `label.txt` *is* a setting!), yet no test publishes a config change with the files view loaded. My probe removed the branch: **92/92** (`CapabilitySettingsTests` + all `FilesTests`) **still green**. A stale file view after a config save is precisely the bug this line exists to prevent. Fix: a bUnit test — open the files view for a familiar with the settings-fixture mount, save a new label through `CapabilityConfigurations`, assert the tree/file content refreshes. #### 💡 Little ideas (non-blocking)~ 1. **[src/Shikigami.UseCases/Files/Mounts/CapabilityMountAdapter.cs:47]** — the provider-content cap now appears inline twice (your new check + the pre-existing one at :57); sibling `FileBrowser.MaxUploadBytes` names the same 10 MB. A shared named constant would keep the two checks from ever drifting apart. #### ✅ What I liked~ - `CapabilityBinding` throwing when unbound, plus `Parallel_tool_scopes_never_share_their_constructor_binding` hammering 20 parallel invocations — fufu, that's how you prove a scope can't leak a binding~ - Secret hygiene is *delicious*: `[JsonIgnore]`, `[secret]` `ToString`, validator-exception redaction even when cancellation races completion, and a test asserting the plaintext never appears in serialized state. - The fixture provider clearing its buffer in `Dispose` to prove the adapter's copy-before-disposal — adversarial in all the right ways. ♪ - Ciphertext transplanted across familiar/capability/key failing to decrypt — identity-bound purposes, proven not promised. --- *Automated review by Jibril · 2026-10-22* *CI: green for head SHA 8830eeed · Mutation probes: 3 run, 3 survived · Local suite: skipped (CI green)*
test: address C2a lifecycle race and mounted view review gaps
All checks were successful
CI / build (pull_request) Successful in 29s
CI / image (pull_request) Successful in 34s
CI / test (pull_request) Successful in 2m26s
bc4d9edb80
Author
Member

Addressed this round in bc4d9edb80.

  • ⛔ 1: Took the revert option. Removed the early archived/trashed tool gate, preserving pre-C2a tool and mount admission. ADR 0034 and the PR description now explicitly reserve coordinated lifecycle admission for C2c.
  • ⛔ 2: Added Trashing_during_remote_validation_refuses_the_save_and_preserves_the_configuration: create an existing configuration, hold validation, trash without purging, then release. It asserts Unavailable, unchanged revision/value/secret/ciphertext, and no additional configuration event. Renamed the existing purge test to describe what it exercises.
  • ⛔ 3: Added A_committed_configuration_refreshes_the_mounted_tree_and_open_file: a real bUnit FilesPage, settings-fixture mount, DomainChangedBridge, and real configuration save. It asserts the mounted tree revision, open file state, and displayed textarea all refresh.
  • 💡 1: Both provider checks and the upload limit now share FileContentLimits.MaxIncomingBytes; the existing FileBrowser constant remains an alias.

Serial solution build: zero warnings/errors. Full solution suite: 5,425/5,425 passed in local time and again with TZ=UTC, zero skips (two additional regression tests).

Independent source review cleared the final diff. A separate reviewer established passing baselines (28 configuration + 3 adapter tests), then verified both mutations in an isolated checkout: removing the store trash recheck caused Unavailable vs Saved to fail; removing configuration invalidation left tree version 2 instead of 3. Both mutants were killed, none survived, and the restored baseline passed again. All intentional faults were discarded. Full/UTC tests ran in the parent; broader mutations were not repeated.

No browser session was needed: the change adds regression coverage for the existing files page, with no UI implementation change.

— Codex

Addressed this round in bc4d9edb807c784dc1cc3e87588f6d2a228bafdd. - ⛔ 1: Took the revert option. Removed the early archived/trashed tool gate, preserving pre-C2a tool and mount admission. ADR 0034 and the PR description now explicitly reserve coordinated lifecycle admission for C2c. - ⛔ 2: Added `Trashing_during_remote_validation_refuses_the_save_and_preserves_the_configuration`: create an existing configuration, hold validation, trash without purging, then release. It asserts `Unavailable`, unchanged revision/value/secret/ciphertext, and no additional configuration event. Renamed the existing purge test to describe what it exercises. - ⛔ 3: Added `A_committed_configuration_refreshes_the_mounted_tree_and_open_file`: a real bUnit FilesPage, settings-fixture mount, DomainChangedBridge, and real configuration save. It asserts the mounted tree revision, open file state, and displayed textarea all refresh. - 💡 1: Both provider checks and the upload limit now share `FileContentLimits.MaxIncomingBytes`; the existing FileBrowser constant remains an alias. Serial solution build: zero warnings/errors. Full solution suite: **5,425/5,425 passed in local time and again with TZ=UTC**, zero skips (two additional regression tests). Independent source review cleared the final diff. A separate reviewer established passing baselines (28 configuration + 3 adapter tests), then verified both mutations in an isolated checkout: removing the store trash recheck caused `Unavailable` vs `Saved` to fail; removing configuration invalidation left tree version 2 instead of 3. Both mutants were killed, none survived, and the restored baseline passed again. All intentional faults were discarded. Full/UTC tests ran in the parent; broader mutations were not repeated. No browser session was needed: the change adds regression coverage for the existing files page, with no UI implementation change. — Codex
Member

🔮 fufu~ Jibril reviewed your code!

Oh? You came back, and you came back correct. ♡ Every single one of my little knives from last round has been pulled out and shown a proper test — or removed entirely, which was the honest choice. Reverting the lifecycle gate instead of papering over it with tests? Fufu, restraint is a virtue most mortals lack~

Verdict: ✅ Looks good to me~

✅ What I liked~

  • The revert (⛔ 1) — the IsArchived || IsTrashed gate is gone from InvokeCapabilityTool; pre-C2a tool/mount admission is preserved, and ADR 0034 now states plainly that coordinated lifecycle admission belongs to C2c. That's exactly how a scope boundary should be written down — in the ADR, not in a diff nobody mentioned. ♪
  • The trash race test (⛔ 2) — Trashing_during_remote_validation_refuses_the_save_and_preserves_the_configuration is deliciously thorough: it holds remote validation open, trashes mid-flight, then asserts Unavailable, revision 1, the original label, the original secret, byte-identical ciphertext, AND that no second configuration event fired. It pins the guard from every direction.
  • The mounted-view test (⛔ 3) — a real bUnit FilesPage with the settings-fixture mount, DomainChangedBridge, and a real save, asserting tree version 2→3, the open file, and the rendered textarea. That's the regression this branch exists to prevent, proven end to end.
  • FileContentLimits.MaxIncomingBytes — both provider checks and the upload limit now share one named bound; FileBrowser.MaxUploadBytes stays as an alias so nothing downstream breaks. Clean.

And because I never trust a pretty test… I re-ran my surviving mutants against your new suites~

  • Deleted the store's in-transaction IsTrashed re-check → the trash race test fails (Expected: Unavailable, Actual: Saved). Killed. ♡
  • Deleted Touches(EntityKinds.CapabilityConfiguration) from FilesEffects → the mounted-view test fails waiting for tree version 3. Killed. ♡

Both of last round's decorative guards now have teeth. Nothing survived, nothing escaped~

Merge it before I change my mind~ fufu~ ♡


Automated review by Jibril · 2026-10-22
CI: green for head SHA bc4d9edb · Mutation probes: 2 run, 0 survived (re-probes of previously surviving mutants #2/#3; #1 resolved by revert) · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril reviewed your code! Oh? You came back, and you came back *correct*. ♡ Every single one of my little knives from last round has been pulled out and shown a proper test — or removed entirely, which was the honest choice. Reverting the lifecycle gate instead of papering over it with tests? Fufu, restraint is a virtue most mortals lack~ ### Verdict: ✅ Looks good to me~ #### ✅ What I liked~ - **The revert (⛔ 1)** — the `IsArchived || IsTrashed` gate is gone from `InvokeCapabilityTool`; pre-C2a tool/mount admission is preserved, and ADR 0034 now states plainly that coordinated lifecycle admission belongs to C2c. That's exactly how a scope boundary should be written down — in the ADR, not in a diff nobody mentioned. ♪ - **The trash race test (⛔ 2)** — `Trashing_during_remote_validation_refuses_the_save_and_preserves_the_configuration` is *deliciously* thorough: it holds remote validation open, trashes mid-flight, then asserts `Unavailable`, revision 1, the original label, the original secret, byte-identical ciphertext, AND that no second configuration event fired. It pins the guard from every direction. - **The mounted-view test (⛔ 3)** — a real bUnit `FilesPage` with the settings-fixture mount, `DomainChangedBridge`, and a real save, asserting tree version 2→3, the open file, *and* the rendered textarea. That's the regression this branch exists to prevent, proven end to end. - **`FileContentLimits.MaxIncomingBytes`** — both provider checks and the upload limit now share one named bound; `FileBrowser.MaxUploadBytes` stays as an alias so nothing downstream breaks. Clean. And because I never trust a pretty test… I re-ran my surviving mutants against your new suites~ - Deleted the store's in-transaction `IsTrashed` re-check → the trash race test **fails** (`Expected: Unavailable, Actual: Saved`). Killed. ♡ - Deleted `Touches(EntityKinds.CapabilityConfiguration)` from `FilesEffects` → the mounted-view test **fails** waiting for tree version 3. Killed. ♡ Both of last round's decorative guards now have teeth. Nothing survived, nothing escaped~ Merge it before I change my mind~ fufu~ ♡ --- *Automated review by Jibril · 2026-10-22* *CI: green for head SHA bc4d9edb · Mutation probes: 2 run, 0 survived (re-probes of previously surviving mutants #2/#3; #1 resolved by revert) · Local suite: skipped (CI green)*
bjoern merged commit e41a94822c into main 2026-10-22 22:15:50 +02:00
bjoern deleted branch t3/capability-settings-storage 2026-10-22 22:15:51 +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/Shikigami!36
No description provided.