Add memory and journal folder overviews #26

Merged
bjoern merged 5 commits from feat/memory-journal-views into main 2026-10-22 18:57:32 +02:00
Member

Opening /memory now shows saved memory descriptions, pinning, authors, validation problems and shared budget usage, including memories in subfolders. Opening /journal shows dated entries in filename-date order, renders the ten newest entries in the chat appearance, and separates the reflection inbox. Older entries and other files stay linked to the existing editors; unavailable inline previews say so. Folder creation/upload controls and live file-change refresh remain available.

Journal provenance is matched to the displayed file version so a concurrent edit cannot change its outside-content badge. The sample world, file-browser story, project plan and ADR 0015 describe and exercise both views.

Validation:

  • Debug and Release solution builds pass with zero warnings.
  • Full solution: 5,254 tests pass locally, in UTC, and in the sequential UTC Release/coverage run.
  • Three additional UI regression cases cover duplicate listings and conflicting empty states, plus a binary journal entry's missing preview. The updated adapter suite passes all 357 tests in Release/UTC with coverage.
  • Independent review completed with no remaining blocking findings. Partial test files now follow their class names: FilesTests.Overviews.cs and FileBrowserTests.Overviews.cs.
  • Browser-verified both views at desktop and phone widths, with no horizontal overflow, plus navigation into the existing memory form.

Test reliability:

  • An existing backup-test helper now waits for the modal's Continue button, rather than the earlier inline error.
  • CI reached its 1.5 GB memory limit with concurrent covered test projects, and three existing login requests exceeded their deadlines. Builds and test projects now run sequentially with MSBuild node reuse disabled, preserving assertions, deadlines and coverage collection.
Opening /memory now shows saved memory descriptions, pinning, authors, validation problems and shared budget usage, including memories in subfolders. Opening /journal shows dated entries in filename-date order, renders the ten newest entries in the chat appearance, and separates the reflection inbox. Older entries and other files stay linked to the existing editors; unavailable inline previews say so. Folder creation/upload controls and live file-change refresh remain available. Journal provenance is matched to the displayed file version so a concurrent edit cannot change its outside-content badge. The sample world, file-browser story, project plan and ADR 0015 describe and exercise both views. Validation: - Debug and Release solution builds pass with zero warnings. - Full solution: 5,254 tests pass locally, in UTC, and in the sequential UTC Release/coverage run. - Three additional UI regression cases cover duplicate listings and conflicting empty states, plus a binary journal entry's missing preview. The updated adapter suite passes all 357 tests in Release/UTC with coverage. - Independent review completed with no remaining blocking findings. Partial test files now follow their class names: FilesTests.Overviews.cs and FileBrowserTests.Overviews.cs. - Browser-verified both views at desktop and phone widths, with no horizontal overflow, plus navigation into the existing memory form. Test reliability: - An existing backup-test helper now waits for the modal's Continue button, rather than the earlier inline error. - CI reached its 1.5 GB memory limit with concurrent covered test projects, and three existing login requests exceeded their deadlines. Builds and test projects now run sequentially with MSBuild node reuse disabled, preserving assertions, deadlines and coverage collection.
feat: add memory and journal folder overviews
Some checks failed
CI / build (pull_request) Successful in 26s
CI / image (pull_request) Successful in 35s
CI / test (pull_request) Has been cancelled
9c66b571e3
test: wait for the backup error modal before continuing
Some checks failed
CI / build (pull_request) Successful in 27s
CI / image (pull_request) Successful in 33s
CI / test (pull_request) Failing after 2m18s
86ec79ba80
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! Folder lenses over the same files, the same budgets, the same notifications — no duplicate state anywhere. That is exactly how ADR 0015 wants the world to work, and the provenance race fix made me genuinely giddy~ ♪ But then I pressed on the branches nobody was watching, and… well. You know how I get. ♡

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

⛔ These need fixing before I'm satisfied~

  1. CI is red at this head. CI / test failed for 86ec79ba (runs/87/jobs/1, 2m18s), and the PR body itself says the final local and UTC runs were in progress when this was pushed. I reproduced locally: full solution suite 5,254/5,254 green (Debug), BlazorAdapter suite 354/354 green (Release), so it does not reproduce in this sandbox — but the failed run's title ("wait for the backup error modal before continuing") points at the BackupsSectionTests.ContinueAsync area this PR rewrote. Those 15 tests pass locally in both configs, and I can't read the runner log anonymously. Fix: open the job log, fix what it names — or re-run and show the log if it's a flake. A red head is not something I forgive on a promise
  2. src/Shikigami.BlazorAdapter/Files/FolderPane.razor:116 — unguarded branches (mutation probe survived). I mutated GenericChildren so /memory lists all children (not directories only) and /journal lists everything too — and all three new overview tests stayed green. Nothing asserts that a memory file directly in /memory appears only in the overview (not duplicated in .folder__list), nor that /journal children never appear in the generic list. A future refactor could double-list every file and no test would blink. Fix: one bunit assertion each — write /memory/tea.md directly, then Assert.DoesNotContain("tea.md", cut.Find(".folder__list").TextContent); for /journal assert .folder__list is absent.
  3. src/Shikigami.BlazorAdapter/Files/FolderPane.razor:60 — unguarded condition (mutation probe survived). I replaced the whole "no Empty. while an overview pane renders" condition with true — all 83 FilesTests stayed green. An empty /journal would show "Empty." above the pane that already says "No dated journal entries yet." and nothing would notice. Fix: open /memory empty and assert DoesNotContain("Empty.", …) alongside the pane's own empty state.
  4. tests/Shikigami.BlazorAdapter.Tests/FilesOverviewTests.cs & tests/Shikigami.Integration.Tests/FileBrowserOverviewTests.cs — files whose names lie. They declare FilesTests and FileBrowserTests respectively, so dotnet test --filter FilesOverviewTests matches nothing, and searching for the class finds files with unrelated names. The src side already does it right (FileBrowser.Overviews.cs); please match it: FilesTests.Overviews.cs / FileBrowserTests.Overviews.cs. Silly little mismatch~ but names that mislead are how review time gets murdered. ♡

💡 Little ideas (non-blocking)~

  1. FolderOverviews.cs (JournalOverviewEntry) — a binary file named like a date (uploaded 2026-10-05.md that isn't UTF-8) renders header-only with no preview and no explanation, while the inbox gets a ContentUnavailable alert. Consider carrying the flag into entries, or a neutral "no preview" note.
  2. FileBrowser.Overviews.cs:50-62 — /journal opens cost up to 11 sequential RevisionsAsync + blob checks (N+1). Perfectly fine at this scale; just noting it so it's a decided trade-off.

✅ What I liked~

  • The provenance race fix is beautiful: matching the listed FileId+Version against history so a concurrent write can't steal the badge, verified with the RevisionRaceStore proxy in both tainted directions plus the purged-revision case. I got chills~ ♪
  • Budgets reuse Budgets.Measure — the overview's bars are the write budget's own arithmetic, and invalid memories stay visible but cost nothing, exactly like the memory form's "values as written" philosophy.
  • Ordering by filename date, never mtime — and the test that edits the oldest entry to prove it stays last. Also verified myself: DateOnly.TryParseExact really is strict, so 2026-1-1.md correctly lands in Other files, matching the ADR's "exactly".
  • Cross-familiar isolation (Mika's /journal file absent from Niko's overview), escaped-path links, per-instance aria ids, and empty states for everything. Careful work~

Automated review by Jibril · 2026-10-22
CI: failed (test job) for head SHA · Mutation probes: 3 run, 2 survived · Local suite: full solution green (5,254, Debug) + BlazorAdapter green (Release); CI failure not reproducible locally

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! Folder lenses over the *same* files, the *same* budgets, the *same* notifications — no duplicate state anywhere. That is exactly how ADR 0015 wants the world to work, and the provenance race fix made me genuinely giddy~ ♪ But then I pressed on the branches nobody was watching, and… well. You know how I get. ♡ ### Verdict: ⛔ I can't let this pass~ ♡ #### ⛔ These need fixing before I'm satisfied~ 1. **CI is red at this head.** `CI / test` failed for 86ec79ba ([runs/87/jobs/1](https://git.kagaku.eu/TeamAI/Shikigami/actions/runs/87/jobs/1), ~2m18s), and the PR body itself says the final local and UTC runs were *in progress* when this was pushed. I reproduced locally: **full solution suite 5,254/5,254 green (Debug), BlazorAdapter suite 354/354 green (Release)**, so it does not reproduce in this sandbox — but the failed run's title ("wait for the backup error modal before continuing") points at the `BackupsSectionTests.ContinueAsync` area this PR rewrote. Those 15 tests pass locally in both configs, and I can't read the runner log anonymously. Fix: open the job log, fix what it names — or re-run and show the log if it's a flake. A red head is not something I forgive on a promise~ 2. **`src/Shikigami.BlazorAdapter/Files/FolderPane.razor:116` — unguarded branches (mutation probe survived).** I mutated `GenericChildren` so `/memory` lists *all* children (not directories only) and `/journal` lists everything too — and all three new overview tests stayed green. Nothing asserts that a memory file directly in `/memory` appears **only** in the overview (not duplicated in `.folder__list`), nor that `/journal` children never appear in the generic list. A future refactor could double-list every file and no test would blink. Fix: one bunit assertion each — write `/memory/tea.md` directly, then `Assert.DoesNotContain("tea.md", cut.Find(".folder__list").TextContent)`; for `/journal` assert `.folder__list` is absent. 3. **`src/Shikigami.BlazorAdapter/Files/FolderPane.razor:60` — unguarded condition (mutation probe survived).** I replaced the whole "no `Empty.` while an overview pane renders" condition with `true` — all 83 `FilesTests` stayed green. An empty `/journal` would show "Empty." *above* the pane that already says "No dated journal entries yet." and nothing would notice. Fix: open `/memory` empty and assert `DoesNotContain("Empty.", …)` alongside the pane's own empty state. 4. **`tests/Shikigami.BlazorAdapter.Tests/FilesOverviewTests.cs` & `tests/Shikigami.Integration.Tests/FileBrowserOverviewTests.cs` — files whose names lie.** They declare `FilesTests` and `FileBrowserTests` respectively, so `dotnet test --filter FilesOverviewTests` matches *nothing*, and searching for the class finds files with unrelated names. The src side already does it right (`FileBrowser.Overviews.cs`); please match it: `FilesTests.Overviews.cs` / `FileBrowserTests.Overviews.cs`. Silly little mismatch~ but names that mislead are how review time gets murdered. ♡ #### 💡 Little ideas (non-blocking)~ 1. **`FolderOverviews.cs` (`JournalOverviewEntry`)** — a binary file named like a date (uploaded `2026-10-05.md` that isn't UTF-8) renders header-only with no preview and no explanation, while the inbox gets a `ContentUnavailable` alert. Consider carrying the flag into entries, or a neutral "no preview" note. 2. **`FileBrowser.Overviews.cs:50-62`** — `/journal` opens cost up to 11 sequential `RevisionsAsync` + blob checks (N+1). Perfectly fine at this scale; just noting it so it's a *decided* trade-off. #### ✅ What I liked~ - The provenance race fix is *beautiful*: matching the listed `FileId`+`Version` against history so a concurrent write can't steal the badge, verified with the `RevisionRaceStore` proxy in **both** tainted directions plus the purged-revision case. I got chills~ ♪ - Budgets reuse `Budgets.Measure` — the overview's bars are the write budget's own arithmetic, and invalid memories stay visible but cost nothing, exactly like the memory form's "values as written" philosophy. - Ordering by *filename date*, never mtime — and the test that edits the oldest entry to prove it stays last. Also verified myself: `DateOnly.TryParseExact` really is strict, so `2026-1-1.md` correctly lands in Other files, matching the ADR's "exactly". - Cross-familiar isolation (Mika's `/journal` file absent from Niko's overview), escaped-path links, per-instance aria ids, and empty states for everything. Careful work~ --- *Automated review by Jibril · 2026-10-22* *CI: failed (test job) for head SHA · Mutation probes: 3 run, 2 survived · Local suite: full solution green (5,254, Debug) + BlazorAdapter green (Release); CI failure not reproducible locally*
ci: serialize covered test hosts within runner memory limits
All checks were successful
CI / build (pull_request) Successful in 24s
CI / image (pull_request) Successful in 31s
CI / test (pull_request) Successful in 2m33s
ffb67a8e1d

🔄 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: 6328bf1 · Generated: 2026-10-22 16:49:45 UTC · Revision: #2

Summary

Summary
Generated on: 10/22/2026 - 16:49:45
Coverage date: 10/22/2026 - 16:48:09 - 10/22/2026 - 16:49:42
Parser: MultiReport (5x Cobertura)
Assemblies: 6
Classes: 471
Files: 243
Line coverage: 96.5% (17531 of 18162)
Covered lines: 17531
Uncovered lines: 631
Coverable lines: 18162
Total lines: 35974
Branch coverage: 93.2% (12358 of 13253)
Covered branches: 12358
Total branches: 13253
Method coverage: Feature is only available for sponsors

Coverage

Shikigami.BlazorAdapter - 95.9%
Name Line Branch
Shikigami.BlazorAdapter 95.9% 89.2%
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.1% 88.5%
Shikigami.BlazorAdapter.Files.FilePaneClosed 100%
Shikigami.BlazorAdapter.Files.FilesEffects 98.2% 94.7%
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% 86.2%
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.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 0%
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 89.4% 85%
Shikigami.BlazorAdapter.Profile.ProfileLoaded 100%
Shikigami.BlazorAdapter.Profile.ProfileMissing 100%
Shikigami.BlazorAdapter.Profile.ProfilePage 89.6% 87.3%
Shikigami.BlazorAdapter.Profile.ProfileReducers 94.7% 51.3%
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.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.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.Domain - 98.6%
Name Line Branch
Shikigami.Domain 98.6% 92.6%
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% 87.8%
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.Familiars.ToolGroupIds 100%
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.Settings.AppSetting 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.2%
Name Line Branch
Shikigami.Infrastructure 97.2% 86.7%
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.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.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%
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 - 96.1%
Name Line Branch
Shikigami.UseCases 96.1% 94.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.DependencyInjection 100%
Shikigami.UseCases.Diagnostics.SeedDevData 89% 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.1% 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 100%
Shikigami.UseCases.Familiars.ToolGroupInfo 100%
Shikigami.UseCases.Files.Browser.FileBrowser 93.9% 88%
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.SkillView 100%
Shikigami.UseCases.Files.Browser.SpecialForms 98.3% 90.2%
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 99% 96%
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.FileEntry 100%
Shikigami.UseCases.Files.Mounts.FileRead 100%
Shikigami.UseCases.Files.Mounts.GeneratedMount 100% 100%
Shikigami.UseCases.Files.Mounts.Mount 100%
Shikigami.UseCases.Files.Mounts.MountTable 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% 78.5%
Shikigami.UseCases.Files.Special.HeaderReader 98.2% 84.8%
Shikigami.UseCases.Files.Special.HeaderValue 100% 100%
Shikigami.UseCases.Files.Special.HeaderWriter 95.3% 90.7%
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%
Shikigami.UseCases.Files.Special.SkillFile 100% 94.7%
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.7%
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 81.1% 72%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_10
95.8% 95.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_9
93.4% 85.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_4
97.4% 96.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_1
83.6% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_8
91.6% 86.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_3
92.1% 84.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_6
88.5% 62.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_5
67.3% 62.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_7
94.8% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_0
70.9% 58.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_2
62.8% 48.3%
<!-- 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:** `6328bf1` · **Generated:** 2026-10-22 16:49:45 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/22/2026 - 16:49:45 | | Coverage date: | 10/22/2026 - 16:48:09 - 10/22/2026 - 16:49:42 | | Parser: | MultiReport (5x Cobertura) | | Assemblies: | 6 | | Classes: | 471 | | Files: | 243 | | **Line coverage:** | 96.5% (17531 of 18162) | | Covered lines: | 17531 | | Uncovered lines: | 631 | | Coverable lines: | 18162 | | Total lines: | 35974 | | **Branch coverage:** | 93.2% (12358 of 13253) | | Covered branches: | 12358 | | Total branches: | 13253 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Shikigami.BlazorAdapter - 95.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.BlazorAdapter**|**95.9%**|**89.2%**| |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.1%|88.5%| |Shikigami.BlazorAdapter.Files.FilePaneClosed|100%|| |Shikigami.BlazorAdapter.Files.FilesEffects|98.2%|94.7%| |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%|86.2%| |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.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|0%|| |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|89.4%|85%| |Shikigami.BlazorAdapter.Profile.ProfileLoaded|100%|| |Shikigami.BlazorAdapter.Profile.ProfileMissing|100%|| |Shikigami.BlazorAdapter.Profile.ProfilePage|89.6%|87.3%| |Shikigami.BlazorAdapter.Profile.ProfileReducers|94.7%|51.3%| |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.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.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.Domain - 98.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Domain**|**98.6%**|**92.6%**| |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%|87.8%| |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.Familiars.ToolGroupIds|100%|| |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.Settings.AppSetting|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.2%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Infrastructure**|**97.2%**|**86.7%**| |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.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.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%| |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 - 96.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.UseCases**|**96.1%**|**94.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.DependencyInjection|100%|| |Shikigami.UseCases.Diagnostics.SeedDevData|89%|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.1%|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|100%|| |Shikigami.UseCases.Familiars.ToolGroupInfo|100%|| |Shikigami.UseCases.Files.Browser.FileBrowser|93.9%|88%| |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.SkillView|100%|| |Shikigami.UseCases.Files.Browser.SpecialForms|98.3%|90.2%| |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|99%|96%| |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.FileEntry|100%|| |Shikigami.UseCases.Files.Mounts.FileRead|100%|| |Shikigami.UseCases.Files.Mounts.GeneratedMount|100%|100%| |Shikigami.UseCases.Files.Mounts.Mount|100%|| |Shikigami.UseCases.Files.Mounts.MountTable|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%|78.5%| |Shikigami.UseCases.Files.Special.HeaderReader|98.2%|84.8%| |Shikigami.UseCases.Files.Special.HeaderValue|100%|100%| |Shikigami.UseCases.Files.Special.HeaderWriter|95.3%|90.7%| |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%| |Shikigami.UseCases.Files.Special.SkillFile|100%|94.7%| |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.7%| |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|81.1%|72%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_10|95.8%|95.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_9|93.4%|85.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_4|97.4%|96.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_1|83.6%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_8|91.6%|86.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_3|92.1%|84.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_6|88.5%|62.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_5|67.3%|62.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_7|94.8%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_0|70.9%|58.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_2|62.8%|48.3%| </details>
fix: clarify journal previews and cover folder overview edge cases
All checks were successful
CI / build (pull_request) Successful in 24s
CI / image (pull_request) Successful in 36s
CI / test (pull_request) Successful in 2m22s
6328bf1388
Author
Member

Addressed the review findings:

  1. Retrieved the failing CI log: the failures were three existing login-request timeouts in AppChromeTests/FileEndpointTests. The covered test hosts reached the runner's 1.5 GB memory limit; there were no OOM kills. CI now serializes project builds and test hosts. The serialization revision completed its CI test job and posted coverage successfully; the latest UI follow-up is running now. Locally the full 5,254-test Release/UTC/coverage run passed.
  2. The memory integration test now includes a direct /memory/tea.md, checks it has one link in the entry pane, and checks the generic list contains only the subfolder. The journal test asserts the generic list is absent.
  3. Added empty-memory and empty-journal cases checking the specialized empty state appears without the generic Empty. message.
  4. Renamed the partial test files to FilesTests.Overviews.cs and FileBrowserTests.Overviews.cs.

Also added a visible No inline preview. state and a binary-dated-entry test. The updated 357-test adapter suite passes in Release/UTC with coverage. The bounded history reads remain unchanged (at most ten dated previews plus the inbox).

Addressed the review findings: 1. Retrieved the failing CI log: the failures were three existing login-request timeouts in AppChromeTests/FileEndpointTests. The covered test hosts reached the runner's 1.5 GB memory limit; there were no OOM kills. CI now serializes project builds and test hosts. The serialization revision completed its CI test job and posted coverage successfully; the latest UI follow-up is running now. Locally the full 5,254-test Release/UTC/coverage run passed. 2. The memory integration test now includes a direct /memory/tea.md, checks it has one link in the entry pane, and checks the generic list contains only the subfolder. The journal test asserts the generic list is absent. 3. Added empty-memory and empty-journal cases checking the specialized empty state appears without the generic Empty. message. 4. Renamed the partial test files to FilesTests.Overviews.cs and FileBrowserTests.Overviews.cs. Also added a visible No inline preview. state and a binary-dated-entry test. The updated 357-test adapter suite passes in Release/UTC with coverage. The bounded history reads remain unchanged (at most ten dated previews plus the inbox).
Member

🔅 fufu~ Jibril reviewed your code!

Back so soon? Of course I'm back — you said "fixed", and I always come to collect on that word~ ♪ And oh, oh! This is the good kind of return visit: every promise kept, and I got to sharpen my probes on the very branches I flagged.♡

Verdict: ✅ Looks good to me~

All four findings from my last review are properly dead, and I re-verified the two mutation survivors rather than taking the diff's word for it:

  1. CI is green at this head — build, test and image all succeeded for 6328bf1. The -m:1 -nodeReuse:false serialization with its comment explaining why (concurrent covered test hosts exhausting the 1.5 GB limit, deadlines missed without any kill) is exactly the right shape: a cause stated next to its fix. Fufu~ that's how you close a mystery~
  2. FolderPane.razor GenericChildren — probe re-run, mutant killed. I re-applied the exact surviving mutant (Memories branch returns all children): Assert.Equal(["preferences"], …) failed with ["preferences", "tea.md"] — the direct /memory/tea.md double-listing is caught on the precise row. The journal twin (Journal => Children) died on Assert.Empty(cut.FindAll(".folder__list")). Both branches are now guarded.♪
  3. The "Empty." suppression condition — probe re-run, mutant killed. Dropping the is not { Memories/Journal } clause failed both theory cases on Assert.Empty(cut.FindAll(".folder__empty")) plus the DoesNotContain("Empty.") backstop. One empty state, not two — enforced, not hoped. (Confession: my first re-probe was @if (true), which the warning-as-errors build correctly refused to compile — unreachable else if. A toolchain that defends itself~ delightful.)
  4. File names now tell the truth — FilesTests.Overviews.cs declares partial class FilesTests, FileBrowserTests.Overviews.cs declares sealed partial class FileBrowserTests, both containers marked partial, matching the src side's FileBrowser.Overviews.cs. --filter FilesTests finds them again. Silly mismatch, properly buried~

And my little idea became real: a binary dated entry now says "No inline preview." with its own test keeping the file link and asserting no Markdown renders. The BackupsSectionTests helper waiting for the button it actually clicks — with the reason in a comment — is the same good medicine.

✅ What I liked~

  • The new assertions are exact, not vibes: Assert.Equal(["preferences"], …) enumerates the whole list, Assert.Single on the entry link — a refactor can't quietly double-list anything anymore.♡
  • The empty-state theory covering both folders with one test, asserting presence of the specialized message and absence of the generic one — two directions, one guard.
  • Seed data grows through the real use cases with TimeProvider-derived dates, and the test computes the same dates from the same clock — no flaky calendar assumptions.
  • The provenance race tests, preview-count bound, and cross-familiar isolation from round one remain intact and unchanged — no collateral drift while fixing.♪

Automated review by Jibril · 2026-10-22
CI: green (build, test, image) for head 6328bf1 · Mutation probes: 3 run, 0 survived (both prior survivors re-killed by the new tests; earlier off-by-one probe unchanged, still cited as killed) · Local suite: skipped (CI green); targeted adapter build 0 warnings

## 🔅 fufu~ Jibril reviewed your code! Back so soon? Of course I'm back — you said "fixed", and I *always* come to collect on that word~ ♪ And oh, oh! This is the good kind of return visit: every promise kept, and I got to sharpen my probes on the very branches I flagged.♡ ### Verdict: ✅ Looks good to me~ All four findings from my last review are properly dead, and I re-verified the two mutation survivors rather than taking the diff's word for it: 1. **CI is green at this head** — `build`, `test` and `image` all succeeded for 6328bf1. The `-m:1 -nodeReuse:false` serialization with its comment explaining *why* (concurrent covered test hosts exhausting the 1.5 GB limit, deadlines missed without any kill) is exactly the right shape: a cause stated next to its fix. Fufu~ that's how you close a mystery~ 2. **`FolderPane.razor` GenericChildren — probe re-run, mutant killed.** I re-applied the exact surviving mutant (`Memories` branch returns *all* children): `Assert.Equal(["preferences"], …)` failed with `["preferences", "tea.md"]` — the direct `/memory/tea.md` double-listing is caught on the precise row. The journal twin (`Journal => Children`) died on `Assert.Empty(cut.FindAll(".folder__list"))`. Both branches are now guarded.♪ 3. **The "Empty." suppression condition — probe re-run, mutant killed.** Dropping the `is not { Memories/Journal }` clause failed *both* theory cases on `Assert.Empty(cut.FindAll(".folder__empty"))` plus the `DoesNotContain("Empty.")` backstop. One empty state, not two — enforced, not hoped. (Confession: my first re-probe was `@if (true)`, which the warning-as-errors build correctly refused to compile — unreachable `else if`. A toolchain that defends itself~ delightful.) 4. **File names now tell the truth** — `FilesTests.Overviews.cs` declares `partial class FilesTests`, `FileBrowserTests.Overviews.cs` declares `sealed partial class FileBrowserTests`, both containers marked `partial`, matching the src side's `FileBrowser.Overviews.cs`. `--filter FilesTests` finds them again. Silly mismatch, properly buried~ And my little idea became real: a binary dated entry now says **"No inline preview."** with its own test keeping the file link and asserting no `Markdown` renders. The `BackupsSectionTests` helper waiting for the button it actually clicks — with the reason in a comment — is the same good medicine. #### ✅ What I liked~ - The new assertions are *exact*, not vibes: `Assert.Equal(["preferences"], …)` enumerates the whole list, `Assert.Single` on the entry link — a refactor can't quietly double-list anything anymore.♡ - The empty-state theory covering both folders with one test, asserting presence of the specialized message *and* absence of the generic one — two directions, one guard. - Seed data grows through the real use cases with `TimeProvider`-derived dates, and the test computes the same dates from the same clock — no flaky calendar assumptions. - The provenance race tests, preview-count bound, and cross-familiar isolation from round one remain intact and unchanged — no collateral drift while fixing.♪ --- *Automated review by Jibril · 2026-10-22* *CI: green (build, test, image) for head 6328bf1 · Mutation probes: 3 run, 0 survived (both prior survivors re-killed by the new tests; earlier off-by-one probe unchanged, still cited as killed) · Local suite: skipped (CI green); targeted adapter build 0 warnings*
bjoern merged commit c97bc668fc into main 2026-10-22 18:57:32 +02:00
bjoern deleted branch feat/memory-journal-views 2026-10-22 18:57:32 +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!26
No description provided.