feat: 2b — making and removing: mkdir, rmdir, touch, rm, restore, find -delete #89

Open
scarlet wants to merge 5 commits from feat/p2b-4-making-removing into main
Member

This is Phase 2b, "The shell, writing", step 4 of 8. The shell gains the commands that make and remove: mkdir, rmdir, touch, rm, restore and find -delete. Each one goes through the read-ledger gate (ADR 0017), and every removal goes to /trash, so it can be undone (ADR 0015). This PR amends ADR 0015, 0016 and 0017 in their 2026-10-24 blocks.

What's in

Commands

  • mkdir (-p, -v, -m):
    • It checks every directory before it makes the first one.
    • A file in the way gives GNU's cannot create directory ‘a.md’: Not a directory.
    • Each directory it makes counts as listed.
  • touch creates an empty file and counts it as read. An existing file is left as it is (D11), and touch -c under a file gives GNU's setting times of ….
  • rm (-r, -f, -d, -v) and rmdir (-p, --ignore-fail-on-non-empty) move to /trash.
    • Each needs the path's own earlier listing.
    • A directory's listing covers its contents. A file the owner added inside since then goes to the trash with it; this is D10's rule, and a test pins it.
    • Glob matches and find's own walk are not readings.
    • A refusal names the file inside that held it back, framed as GNU frames it.
  • restore PATH brings back the newest removal of a path. restore /trash/… brings back that entry. The ledger entries follow the file there and back.
  • find -delete:
    • It walks each directory's contents before the directory itself. The expression is evaluated asynchronously, so -delete returning false matters.
    • A starting point is never deleted when it is ., or when its last name is . or ... Those give GNU's Invalid argument, Directory not empty or No such file or directory.
    • -prune beside -delete is GNU's mistake, worded to point at -maxdepth or -name.
  • Help, the rule line's removal clause, effect rows for every command, and hints for unlink, shred, trash and mktemp.

Trash

  • Newest removal: a removal lands above the highest slot of the day that holds its path. That keeps "the highest slot is the newest removal" true after explicit restores, without breaking "one restore brings a directory back".
  • Purge needs every path seen: a purge, meaning a removal inside /trash, is the one change nothing can undo. So every path it removes must have been seen there. A directory's listing does not cover its contents in the trash. Without this, a run could purge a file the owner trashed and the run never saw.
  • The trash is read-only to runs: a run makes and changes nothing in it. Write, append, touch, mkdir or a move into the trash are refused, and ls -l shows trash files as -r--r--r-- to a run. A run may only restore or purge.

File system order

  • A path under a missing directory is No such file or directory before any permission refusal, which closes the item left from the redirections PR. Not a directory is told only to a run that may read the directory holding the file, so existence never leaks to a run without read access.
  • A non-empty directory is reported before the layout text, so rmdir -p --ignore-fail-on-non-empty stops quietly at /notes, as GNU does.
  • Live mounts:
    • The shell says Operation not supported — files here can be moved, not changed (D17). The file browser keeps its own words (D23).
    • A live mount that cannot even move its files is a Read-only file system.

Fixtures

  • 126 new write cases are recorded against coreutils 9.10 and findutils 4.10 inside the bwrap sandbox, 211 in all. The existing 85 recordings are byte-identical.
  • The recorder's lint now accepts a .. that stays inside the case's tree. It refuses one that a quote, a brace or a pattern could splice, and the sandbox remains the control.
  • 11 deliberate differences are pinned with reasons, for example rm -i (no prompt here) and mkdir -m.

Tests

The count goes from 7,457 to 7,664 (+207). Everything is green locally and with TZ=UTC, with 0 warnings, and the tests/Eval checker is OK.

ChangingCommandsRunTests has every test the design names, plus tests for each review finding:

  • ls DIR counts as listing DIR;
  • find ./, x/. and .. starts are kept;
  • the newest removal, including today over a higher slot of yesterday and slot .10 over .9;
  • a purge needs every path seen, and a refused purge removes nothing;
  • nothing in the trash is made or changed, and a restore brings it back as removed;
  • the missing parent before permission, and Not a directory only for a run that may look, checked with Compaction- and Review-kind runs;
  • mkdir -p makes no level when a later one fails;
  • what the run saw inside a removed directory comes back with it;
  • rm -v names nothing it didn't remove;
  • rmdir x/. is invalid;
  • touch's /tmp scratch credit.

FileSystemLedgerTests: a run's move into or within the trash makes no path there, while its removal and restore still work.

ReadOnlyLiveMountRunTests: a read-only live mount is a read-only file system in the shell and in the facade.

WriteFixtureReplayTests covers 211 cases. More than 45 deliberate breaks of the new code were each caught by a test.

Notes

  • Quoting: mkdir and find use GNU's locale quotes (‘a.md’), while rm, rmdir and touch use ASCII quotes, as GNU itself does. These are recorded.
  • Print order: rm -v and find -delete -print print a line after its removal, never for one that was refused.
  • touch on a read-only file: on an existing file the run may only read, touch is a no-op (D11), where GNU says Permission denied.
  • Left for later (in the design):
    • Capability retention (ExpireAsync) still files into the lowest free trash slot and doesn't take the familiar's lock. It is left for the retention slice.
    • restore notes/d, when only notes/d/x.md was removed, answers File exists, which is accurate but unhelpful.
    • find ../.. -delete, after a run deleted its own working directory, says No such file or directory where GNU says Directory not empty.

🤖 Generated with Claude Code

This is Phase 2b, "The shell, writing", step 4 of 8. The shell gains the commands that make and remove: `mkdir`, `rmdir`, `touch`, `rm`, `restore` and `find -delete`. Each one goes through the read-ledger gate (ADR 0017), and every removal goes to `/trash`, so it can be undone (ADR 0015). This PR amends ADR 0015, 0016 and 0017 in their 2026-10-24 blocks. ## What's in **Commands** - `mkdir` (`-p`, `-v`, `-m`): - It checks every directory before it makes the first one. - A file in the way gives GNU's `cannot create directory ‘a.md’: Not a directory`. - Each directory it makes counts as listed. - `touch` creates an empty file and counts it as read. An existing file is left as it is (D11), and `touch -c` under a file gives GNU's `setting times of …`. - `rm` (`-r`, `-f`, `-d`, `-v`) and `rmdir` (`-p`, `--ignore-fail-on-non-empty`) move to `/trash`. - Each needs the path's own earlier listing. - A directory's listing covers its contents. A file the owner added inside since then goes to the trash with it; this is D10's rule, and a test pins it. - Glob matches and find's own walk are not readings. - A refusal names the file inside that held it back, framed as GNU frames it. - `restore PATH` brings back the newest removal of a path. `restore /trash/…` brings back that entry. The ledger entries follow the file there and back. - `find -delete`: - It walks each directory's contents before the directory itself. The expression is evaluated asynchronously, so `-delete` returning false matters. - A starting point is never deleted when it is `.`, or when its last name is `.` or `..`. Those give GNU's `Invalid argument`, `Directory not empty` or `No such file or directory`. - `-prune` beside `-delete` is GNU's mistake, worded to point at `-maxdepth` or `-name`. - Help, the rule line's removal clause, effect rows for every command, and hints for `unlink`, `shred`, `trash` and `mktemp`. **Trash** - **Newest removal:** a removal lands above the highest slot of the day that holds its path. That keeps "the highest slot is the newest removal" true after explicit restores, without breaking "one restore brings a directory back". - **Purge needs every path seen:** a purge, meaning a removal inside `/trash`, is the one change nothing can undo. So every path it removes must have been seen there. A directory's listing does *not* cover its contents in the trash. Without this, a run could purge a file the owner trashed and the run never saw. - **The trash is read-only to runs:** a run makes and changes nothing in it. Write, append, `touch`, `mkdir` or a move into the trash are refused, and `ls -l` shows trash files as `-r--r--r--` to a run. A run may only restore or purge. **File system order** - A path under a missing directory is *No such file or directory* before any permission refusal, which closes the item left from the redirections PR. *Not a directory* is told only to a run that may read the directory holding the file, so existence never leaks to a run without read access. - A non-empty directory is reported before the layout text, so `rmdir -p --ignore-fail-on-non-empty` stops quietly at `/notes`, as GNU does. - Live mounts: - The shell says `Operation not supported — files here can be moved, not changed` (D17). The file browser keeps its own words (D23). - A live mount that cannot even move its files is a `Read-only file system`. **Fixtures** - 126 new write cases are recorded against coreutils 9.10 and findutils 4.10 inside the `bwrap` sandbox, 211 in all. The existing 85 recordings are byte-identical. - The recorder's lint now accepts a `..` that stays inside the case's tree. It refuses one that a quote, a brace or a pattern could splice, and the sandbox remains the control. - 11 deliberate differences are pinned with reasons, for example `rm -i` (no prompt here) and `mkdir -m`. ## Tests The count goes from 7,457 to 7,664 (+207). Everything is green locally and with `TZ=UTC`, with 0 warnings, and the `tests/Eval` checker is OK. `ChangingCommandsRunTests` has every test the design names, plus tests for each review finding: - `ls DIR` counts as listing DIR; - `find ./`, `x/.` and `..` starts are kept; - the newest removal, including today over a higher slot of yesterday and slot `.10` over `.9`; - a purge needs every path seen, and a refused purge removes nothing; - nothing in the trash is made or changed, and a restore brings it back as removed; - the missing parent before permission, and *Not a directory* only for a run that may look, checked with Compaction- and Review-kind runs; - `mkdir -p` makes no level when a later one fails; - what the run saw inside a removed directory comes back with it; - `rm -v` names nothing it didn't remove; - `rmdir x/.` is invalid; - touch's `/tmp` scratch credit. `FileSystemLedgerTests`: a run's move into or within the trash makes no path there, while its removal and restore still work. `ReadOnlyLiveMountRunTests`: a read-only live mount is a read-only file system in the shell and in the facade. `WriteFixtureReplayTests` covers 211 cases. More than 45 deliberate breaks of the new code were each caught by a test. ## Notes - **Quoting:** `mkdir` and `find` use GNU's locale quotes (`‘a.md’`), while `rm`, `rmdir` and `touch` use ASCII quotes, as GNU itself does. These are recorded. - **Print order:** `rm -v` and `find -delete -print` print a line after its removal, never for one that was refused. - **`touch` on a read-only file:** on an existing file the run may only read, `touch` is a no-op (D11), where GNU says `Permission denied`. - **Left for later (in the design):** - Capability retention (`ExpireAsync`) still files into the lowest free trash slot and doesn't take the familiar's lock. It is left for the retention slice. - `restore notes/d`, when only `notes/d/x.md` was removed, answers `File exists`, which is accurate but unhelpful. - `find ../.. -delete`, after a run deleted its own working directory, says *No such file or directory* where GNU says *Directory not empty*. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
This is Phase 2b ("The shell, writing"), step 4 of 8. The shell now makes and removes: `mkdir`, `rmdir`, `touch`, `rm`, `restore` and `find -delete`, each through the run's read ledger (ADR 0017). It appends to the 2026-10-24 blocks of ADR 0016 and 0017 and opens a 2026-10-24 block in ADR 0015.

## What's in

**The gate (`Files/Ledger/RunFiles`)**
- `MakeDirectoryAsync`: exempt, and each directory made counts as listed.
- `TouchAsync`: a create that never overwrites; a file seen and gone since is refused once as *gone*, as any create is.
- `RemoveAsync`: needs the path's own listing; the ledger follows the file into the trash, a purge forgets it, and an emptied directory that joined its contents' trash directory is credited as that directory, so one `restore` brings the tree back without a listing.
- `RestoreAsync` and `NewestTrashEntryAsync`: a move out of the trash against the listing of the trash entry.
- A refusal can name a path other than its operand where GNU does: the file below `rm -r`'s directory, the directory above `mkdir -p`'s.

**The file system**
- `MakeDirectoriesAsync` checks every directory before making the first and returns the ones it made; a file on the way is GNU's *Not a directory*, named where it stands.
- A path under a missing directory is *No such file or directory* before its permission is asked, so `echo x > nosuch/y` at `/` now says what bash says. A run that may not look into the directory above still gets *Permission denied*.
- `NewestTrashEntryAsync`: the latest day's highest slot.
- A write or removal on a live mount reads *Operation not supported*.

**The commands**
- `mkdir [-p] [-v]`, `-m` refused.
- `rmdir [-p] [-v] [--ignore-fail-on-non-empty]`, GNU's `-p` walk over the operand's names.
- `touch [-c] [-a] [-m]`: an existing file is left as it is; `-d -t -r --date --reference --time` refused.
- `rm [-r -R -f -d -v --preserve-root]`: GNU's guards for `/`, `.` and `..`; `-i -I --interactive` and `--no-preserve-root` refused.
- `restore PATH...`: a trash path, or the original path's newest removal; prints where it put it.
- `find -delete`: walks each directory's contents first, the starting point `.` stays, and `-prune` beside it is GNU's error. The expression is evaluated asynchronously, so `-delete`'s truth value counts. A path it deleted and printed credits no read.
- Help in the "Changing files" group, effects rows, the rule line's removal clause, and hints for `unlink`, `shred`, `trash`, `trash-put` and `mktemp`.

**Write fixtures**
- 119 new cases for `mkdir`, `rmdir`, `touch`, `rm` and `find -delete`, recorded with coreutils 9.10 and findutils 4.10 in `bwrap`. The 85 existing cases are byte-identical; only the header's `now` moved.
- Two deviations are pinned: `rm-interactive` and `mkdir-mode`, each refused with its reason. A write deviation can now name the directories it leaves.

## Tests
- `ChangingCommandsRunTests` (new): every test the design names, plus the missing-parent order, `mkdir -p` under a file, touch as *gone*, `rm -r` taking a file the owner added inside, `rm` of the journal, the child that blocks `rm -r`, a same-call listing's hint, and `find -delete -print` leaving no stale entry.
- The `find -delete` refusal pins are flipped; `ListingCommandsTests` gains the `-delete`/`-prune` parse test; there are new hint rows and effects rows.
- `FileSystemTests`' `mkdir -p f.md/x` pin now reads *Not a directory*.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- find -delete keeps a start whose last name is . (./, .//, x/.): its contents go, the start is GNU's
  "cannot delete ‘./’: Invalid argument", status 1; a start of exactly . stays silent. Recorded with record.py
  --writes (find ./ -delete, find docs/. -delete); the existing recordings are byte-identical.
- ls DIR counts as a listing of DIR once it is listed; a directory only a glob named counts where its header shows it.
- A removal lands above every one of the day's slots holding its path, and not below the highest holding a trash
  directory made for one of its (removable) directories; an emptied directory joins only the highest slot holding its
  path. The highest slot of a day is the newest removal, after a restore from a lower one too (ADR 0015 amended).
- The kernel-lookup answer (Not a directory, No such file) is told only to a run that may list where it stands, the
  parent being a file included; a run that may not read is told Permission denied.
- A purge in /trash needs every path it removes seen there: the file system admits each removed row against the
  run's ledger under the lock; the refusal names the first unseen path in rm's frame (ADR 0017 amended).
- rmdir, rm -d and find -delete find a layout directory that holds something Directory not empty before it is the
  layout's: rmdir -p --ignore-fail-on-non-empty stops there quietly.
- -delete beside -prune keeps GNU's first sentence and points to -maxdepth or -name, not -depth.
- The file system keeps its live-mount reason for the browser; the shell prints "Operation not supported — files
  here can be moved, not changed".
- A run makes nothing in /trash: touch, mkdir and redirections into a new trash path are refused (ADR 0015 amended).
- touch -c under a file: GNU's "setting times of", recorded.
- Tests for the surviving mutants: mkdir -p's levels, rm -r's re-keyed ledger, rm -v's order, rmdir x/., touch's
  /tmp scratch credit, the lookup answer in write, append and the open check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- find -delete never removes a start whose last name is .. (.., ../, x/..): GNU's "Directory not empty" while the
  way to it resolves, "No such file or directory" once -delete took a directory on it; recorded against GNU, with
  the recorder's lint taking a .. that stays inside the tree.
- A run neither makes nor changes anything in the trash: a write, an append or a move onto a trash path is refused,
  existing files included; it may only purge and restore. ls -l shows the run a trash file without w.
- A read-only live mount answers Read-only file system before the live mount's move hint.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pre-PR review (round 3): the recorder's lint reads no spliced '..', a read-only live mount is named in ADR 0015
All checks were successful
CI / build (pull_request) Successful in 41s
CI / shell-eval (pull_request) Successful in 2s
CI / image (pull_request) Successful in 2m14s
CI / test (pull_request) Successful in 5m6s
51410eed5f
- record.py refuses a '..' in a word a quote, a brace or a pattern could splice: what it names is only known once
  the shell has expanded it. The sandbox stays the control.
- ADR 0015's live-mount bullet says a live mount that cannot even move its files is a Read-only file system.

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

🔄 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: 8c0a787 · Generated: 2026-10-24 18:25:48 UTC · Revision: #2

Summary

Summary
Generated on: 10/24/2026 - 18:25:47
Coverage date: 10/24/2026 - 18:22:18 - 10/24/2026 - 18:25:44
Parser: MultiReport (6x Cobertura)
Assemblies: 11
Classes: 749
Files: 395
Line coverage: 93% (30098 of 32363)
Covered lines: 30098
Uncovered lines: 2265
Coverable lines: 32363
Total lines: 56271
Branch coverage: 88.5% (18835 of 21263)
Covered branches: 18835
Total branches: 21263
Method coverage: Feature is only available for sponsors

Coverage

Shikigami.BlazorAdapter - 96.9%
Name Line Branch
Shikigami.BlazorAdapter 96.9% 89.5%
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.FamiliarLinks 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.4% 94.1%
Shikigami.BlazorAdapter.Files.FilesPage 97.1% 97.3%
Shikigami.BlazorAdapter.Files.FilesReducers 100% 82%
Shikigami.BlazorAdapter.Files.FilesState 100% 100%
Shikigami.BlazorAdapter.Files.FileTreeBranch 100% 100%
Shikigami.BlazorAdapter.Files.FolderPane 92.7% 85.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.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.SkillOverviewPane 96.1% 96.9%
Shikigami.BlazorAdapter.Files.TreeFailed 100%
Shikigami.BlazorAdapter.Files.TreeLoaded 100%
Shikigami.BlazorAdapter.Home.HomePage 88.2% 93.7%
Shikigami.BlazorAdapter.Notifications.CapabilityChangedBridge 100%
Shikigami.BlazorAdapter.Notifications.CapabilityChangesReceived 100%
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.FamiliarProfile 98% 89.6%
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 100%
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.CapabilityFormErrorBoundary 100%
Shikigami.BlazorAdapter.Settings.CapabilityOwnerEditor 89.5% 86.2%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsComponents 100% 100%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsEffects 100% 90.6%
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% 98.6%
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.GeneratedCapabilityForm 92.9% 80.8%
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.Settings.SettingsPage 100% 100%
Shikigami.BlazorAdapter.Settings.ToolGroupsSection 93.6% 80.8%
Shikigami.BlazorAdapter.Shell.CastRail 100% 100%
Shikigami.BlazorAdapter.Workspace.FamiliarArtwork 100% 100%
Shikigami.BlazorAdapter.Workspace.FamiliarConfigurationHost 100% 100%
Shikigami.BlazorAdapter.Workspace.FamiliarPresence 86.9% 90%
Shikigami.BlazorAdapter.Workspace.FamiliarWorkspaceContext 100% 100%
Shikigami.BlazorAdapter.Workspace.LacquerHeader 84.6% 100%
Shikigami.BlazorAdapter.Workspace.WorkspacePage 100% 100%
Shikigami.BlazorAdapter.Workspace.WorkspaceSectionPicker 100% 87.5%
Shikigami.Capabilities.Contracts - 92.7%
Name Line Branch
Shikigami.Capabilities.Contracts 92.7% 92.7%
Shikigami.Capabilities.Contracts.CapabilityAssetContent 100%
Shikigami.Capabilities.Contracts.CapabilityBackgroundDefinition 100%
Shikigami.Capabilities.Contracts.CapabilityCheckResult 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.CapabilityName 100%
Shikigami.Capabilities.Contracts.CapabilityPublication 100%
Shikigami.Capabilities.Contracts.CapabilityPublicationReceipt 100%
Shikigami.Capabilities.Contracts.CapabilityRegistration 100% 100%
Shikigami.Capabilities.Contracts.CapabilityResult`1 100%
Shikigami.Capabilities.Contracts.CapabilitySetting 100% 100%
Shikigami.Capabilities.Contracts.CapabilitySettingCollection 100% 100%
Shikigami.Capabilities.Contracts.CapabilitySettingItem 100%
Shikigami.Capabilities.Contracts.CapabilitySettingProblem 100%
Shikigami.Capabilities.Contracts.CapabilitySignal 100%
Shikigami.Capabilities.Contracts.CapabilityStatusItem 100%
Shikigami.Capabilities.Contracts.CapabilityStorageDefinition 100%
Shikigami.Capabilities.Contracts.CapabilityStoragePreparation 100%
Shikigami.Capabilities.Contracts.CapabilityText 100% 100%
Shikigami.Capabilities.Contracts.CapabilityTool 100%
Shikigami.Capabilities.Contracts.CapabilityToolResult 100%
Shikigami.Capabilities.Contracts.CapabilityValidationProblem 100%
Shikigami.Capabilities.Contracts.ICapabilitySettings 0%
Shikigami.Capabilities.Contracts.MountAccessRule 100%
System.Text.RegularExpressions.Generated 84.6% 85.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FB478E59CB1F8F91
095F32B47EDE23CC9FACABF076C6AA6737588D398F5DE6EDB__ItemKey_0
92.7% 90.4%
Shikigami.Capabilities.TestFixture - 96.6%
Name Line Branch
Shikigami.Capabilities.TestFixture 96.6% 93.3%
Shikigami.Capabilities.TestFixture.BinaryFixtureProvider 100% 87.5%
Shikigami.Capabilities.TestFixture.BinaryFixtureState 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureCheck 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureIdentity 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureModule 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureObservation 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureState 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureStorage 64.2% 50%
Shikigami.Capabilities.TestFixture.CollectionFixtureValidator 100% 100%
Shikigami.Capabilities.TestFixture.FixtureHandler 100%
Shikigami.Capabilities.TestFixture.FixtureModule 100% 100%
Shikigami.Capabilities.TestFixture.FixtureProvider 92.5% 90.4%
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.Capabilities.TestFixture.UI - 91.8%
Name Line Branch
Shikigami.Capabilities.TestFixture.UI 91.8% 79%
Shikigami.Capabilities.TestFixture.UI.CollectionFixtureForm 90.4% 80%
Shikigami.Capabilities.TestFixture.UI.FixtureSettingsForm 100% 66.6%
Shikigami.Capabilities.UI.Contracts - 94.1%
Name Line Branch
Shikigami.Capabilities.UI.Contracts 94.1% 50%
Shikigami.Capabilities.UI.Contracts.CapabilitySettingsComponent 100%
Shikigami.Capabilities.UI.Contracts.CapabilitySettingsComponentRegistration 88.8% 50%
Shikigami.Capabilities.UI.Contracts.CapabilitySettingsUiRegistration 100%
Shikigami.Capabilities.UI.Contracts.SecretChange 75%
Shikigami.Capabilities.UI.Contracts.SettingsAsset 100%
Shikigami.Capabilities.UI.Contracts.SettingsAssetResult 100%
Shikigami.Capabilities.UI.Contracts.SettingsCheckResult 100%
Shikigami.Capabilities.UI.Contracts.SettingsItem 100%
Shikigami.Capabilities.UI.Contracts.SettingsItemChange 100%
Shikigami.Capabilities.UI.Contracts.SettingsItemStatus 100%
Shikigami.Capabilities.UI.Contracts.SettingsProblem 100%
Shikigami.Capabilities.UI.Contracts.SettingsSaveResult 100%
Shikigami.Capabilities.UI.Contracts.SettingsView 100%
Shikigami.Capabilities.Web - 97.3%
Name Line Branch
Shikigami.Capabilities.Web 97.3% 91.4%
Shikigami.Capabilities.Web.Content.HtmlTextExtractor 100% 92.4%
Shikigami.Capabilities.Web.Content.ReadableDocument 100%
Shikigami.Capabilities.Web.Content.WebDocumentPublisher 100% 94.4%
Shikigami.Capabilities.Web.Content.WebText 100% 87.5%
Shikigami.Capabilities.Web.Fetch.GuardedWebTransport 92.6% 83.9%
Shikigami.Capabilities.Web.Fetch.WebAddressPolicy 100% 96.1%
Shikigami.Capabilities.Web.Fetch.WebCompression 97.1% 96%
Shikigami.Capabilities.Web.Fetch.WebNetwork 66.6% 0%
Shikigami.Capabilities.Web.Fetch.WebResponse 100%
Shikigami.Capabilities.Web.Search.SearchHit 100%
Shikigami.Capabilities.Web.Search.SearchResults 100%
Shikigami.Capabilities.Web.Search.SearxngSearchProvider 97.1% 91.6%
Shikigami.Capabilities.Web.Tools.WebFetchTool 100% 87.5%
Shikigami.Capabilities.Web.Tools.WebSearchTool 100% 95.4%
Shikigami.Capabilities.Web.Tools.WebTool 100% 50%
Shikigami.Capabilities.Web.WebFailure 100%
Shikigami.Capabilities.Web.WebLimits 100%
Shikigami.Capabilities.Web.WebModule 100% 100%
Shikigami.Capabilities.Web.WebOptions 100%
Shikigami.Capabilities.Web.WebSettingsValidator 62.5% 100%
Shikigami.Networking.PublicAddressRules 100% 97.3%
System.Text.RegularExpressions.Generated 100%
Shikigami.Domain - 98.2%
Name Line Branch
Shikigami.Domain 98.2% 91.8%
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.FilePublication 100%
Shikigami.Domain.Files.FilePublicationStamp 100%
Shikigami.Domain.Files.FileRevision 100% 87.5%
Shikigami.Domain.Files.LedgerScope 100% 100%
Shikigami.Domain.Files.LocalDates 100%
Shikigami.Domain.Files.MediaTypes 100% 100%
Shikigami.Domain.Files.Permissions 100% 100%
Shikigami.Domain.Files.ReadLedgerEntry 100% 86.3%
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 - 87.7%
Name Line Branch
Shikigami.Infrastructure 87.7% 58.9%
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 97.2% 93.4%
Shikigami.Infrastructure.Backups.DatabaseFingerprint 91.9% 97%
Shikigami.Infrastructure.Backups.FileSystemBackupStore 100% 100%
Shikigami.Infrastructure.Backups.OwnerOnlyFile 100% 100%
Shikigami.Infrastructure.Backups.PreMigrationBackup 90.1% 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.Browser.BrowserAddressPolicy 100% 100%
Shikigami.Infrastructure.Browser.BrowserCommand 100%
Shikigami.Infrastructure.Browser.BrowserHost 94% 93.1%
Shikigami.Infrastructure.Browser.BrowserHostOptions 100%
Shikigami.Infrastructure.Browser.BrowserHostProbe 0% 0%
Shikigami.Infrastructure.Browser.BrowserIdleService 63.6% 50%
Shikigami.Infrastructure.Browser.BrowserJpeg 0%
Shikigami.Infrastructure.Browser.BrowserLaunchException 0%
Shikigami.Infrastructure.Browser.BrowserNetwork 66.6%
Shikigami.Infrastructure.Browser.BrowserNetworkOptions 100%
Shikigami.Infrastructure.Browser.BrowserNetworkProbe 0% 0%
Shikigami.Infrastructure.Browser.BrowserOperationRequest 100%
Shikigami.Infrastructure.Browser.BrowserOperationResult 100%
Shikigami.Infrastructure.Browser.BrowserOperationsProbe 0% 0%
Shikigami.Infrastructure.Browser.BrowserOutputScrubber 100% 100%
Shikigami.Infrastructure.Browser.BrowserPageDocument 0%
Shikigami.Infrastructure.Browser.BrowserPageOperations 0% 0%
Shikigami.Infrastructure.Browser.BrowserPageSnapshot 0%
Shikigami.Infrastructure.Browser.BrowserProbeNetwork 0% 0%
Shikigami.Infrastructure.Browser.BrowserProfile 98.7% 90.6%
Shikigami.Infrastructure.Browser.BrowserReply 100%
Shikigami.Infrastructure.Browser.BrowserSnapshotReferences 100% 100%
Shikigami.Infrastructure.Browser.BrowserSocksProxy 95.9% 88%
Shikigami.Infrastructure.Browser.BrowserWorker 5.6% 21.5%
Shikigami.Infrastructure.Browser.BrowserWorkerFactory 4% 0%
Shikigami.Infrastructure.Browser.BrowserWorkerProcess 80% 66.6%
Shikigami.Infrastructure.Browser.LinuxProcessGroups 88.8% 92.8%
Shikigami.Infrastructure.Capabilities.CapabilityContribution 100%
Shikigami.Infrastructure.Capabilities.CapabilityStartup 100% 100%
Shikigami.Infrastructure.Capabilities.CapabilityStorageHost 93.7% 83.8%
Shikigami.Infrastructure.Capabilities.CapabilityStorageOptions 100%
Shikigami.Infrastructure.Capabilities.PrivatePaths 97.4% 83.3%
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.FilePublicationMapping 100%
Shikigami.Infrastructure.Persistence.Configurations.FileRevisionConfigurati
on
100%
Shikigami.Infrastructure.Persistence.Configurations.ReadLedgerEntryConfigur
ation
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.ArtifactRetention 100%
Shikigami.Infrastructure.Persistence.Migrations.CapabilityConfigurations 100%
Shikigami.Infrastructure.Persistence.Migrations.CapabilityPublicationReceip
ts
100%
Shikigami.Infrastructure.Persistence.Migrations.CapabilityPurgeIntent 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.ReadLedger 100%
Shikigami.Infrastructure.Persistence.Migrations.ShikigamiDbContextModelSnap
shot
100%
Shikigami.Infrastructure.Persistence.Migrations.TrashDirectoryMadeFor 100%
Shikigami.Infrastructure.Persistence.ShikigamiDbContext 98.8% 100%
Shikigami.Infrastructure.Persistence.ShikigamiDbContextFactory 0%
Shikigami.Infrastructure.Persistence.SqlitePragmaInterceptor 100% 100%
Shikigami.Infrastructure.Persistence.Stores.EfFamiliarStore 100% 88.7%
Shikigami.Infrastructure.Persistence.Stores.EfFileStore 98.7% 100%
Shikigami.Infrastructure.Persistence.Stores.EfReadLedgerStore 98.4% 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%
Shikigami.Infrastructure.Settings.KeyRingSnapshots 100% 100%
Shikigami.Infrastructure.Settings.ProtectedCapabilityAssetReferences 87.5% 50%
Shikigami.Networking.PublicAddressRules 100% 97.3%
System.Text.RegularExpressions.Generated 69.2% 60.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Id_3
81.2% 63.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__NativeReference_2
91.1% 89.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0
84% 65.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__RefPattern_1
0% 0%
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 - 66%
Name Line Branch
Shikigami.Server 66% 67.6%
Program 95.3% 82.1%
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% 100%
Shikigami.Server.Components.Pages.Gate 100% 100%
Shikigami.Server.Diagnostics.BrowserHostCheck 0% 0%
Shikigami.Server.Diagnostics.BrowserNetworkFixtures 0% 0%
Shikigami.Server.Diagnostics.BrowserOperationsFixtures 0% 0%
Shikigami.Server.Diagnostics.CapabilitySample 93.4% 75.8%
Shikigami.Server.Diagnostics.SampleSettingsForm 77.4% 64.8%
Shikigami.Server.Diagnostics.SeedOnStart 100% 100%
Shikigami.Server.Diagnostics.WebSample 96.4% 69.6%
Shikigami.Server.Networking.PublicNetworkConfiguration 100% 100%
Shikigami.Server.Presentation.WorkspaceAppearance 100% 100%
Shikigami.Server.Provider.OpenRouterConfiguration 100% 100%
Shikigami.Server.Security.AccessGate 100% 87.5%
Shikigami.Server.Security.AccessSecret 100% 100%
Shikigami.Server.Security.CoordinatedKeyRing 100%
Shikigami.Server.Security.GateThrottle 100% 100%
Shikigami.Server.Security.ProxyNetwork 100% 100%
Shikigami.Server.VolumeStartupValidator 100% 100%
Shikigami.UseCases - 96.3%
Name Line Branch
Shikigami.UseCases 96.3% 93.5%
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.Browser.BrowserLease 100%
Shikigami.UseCases.Browser.BrowserOwner 100%
Shikigami.UseCases.Capabilities.BoundCapabilityAssets 100% 100%
Shikigami.UseCases.Capabilities.BoundCapabilityChanges 95.6% 70%
Shikigami.UseCases.Capabilities.BoundCapabilityFiles 95.5% 80.3%
Shikigami.UseCases.Capabilities.BoundCapabilityPrivateStorage 100% 100%
Shikigami.UseCases.Capabilities.BoundCapabilitySettings 94.4% 88.4%
Shikigami.UseCases.Capabilities.BoundCapabilityStatus 100% 100%
Shikigami.UseCases.Capabilities.CapabilityAssetChoice 100%
Shikigami.UseCases.Capabilities.CapabilityAssetReference 100%
Shikigami.UseCases.Capabilities.CapabilityAssetResult 100%
Shikigami.UseCases.Capabilities.CapabilityAssets 96.7% 86.6%
Shikigami.UseCases.Capabilities.CapabilityBackgroundHealth 100%
Shikigami.UseCases.Capabilities.CapabilityBinding 100% 83.3%
Shikigami.UseCases.Capabilities.CapabilityChanged 100%
Shikigami.UseCases.Capabilities.CapabilityCheckOutcome 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationCommit 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationData 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationProblem 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationResult 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurations 99.5% 98.9%
Shikigami.UseCases.Capabilities.CapabilityConfigurationView 100%
Shikigami.UseCases.Capabilities.CapabilityContexts 90% 91.6%
Shikigami.UseCases.Capabilities.CapabilityHealth 100%
Shikigami.UseCases.Capabilities.CapabilityItemChange 100%
Shikigami.UseCases.Capabilities.CapabilityItemEdit 100%
Shikigami.UseCases.Capabilities.CapabilityItemKeys 100% 100%
Shikigami.UseCases.Capabilities.CapabilityItemStatusView 100%
Shikigami.UseCases.Capabilities.CapabilityItemView 100%
Shikigami.UseCases.Capabilities.CapabilityNames 100% 100%
Shikigami.UseCases.Capabilities.CapabilityPrivateMutation 100% 100%
Shikigami.UseCases.Capabilities.CapabilityRegistry 96.5% 90.9%
Shikigami.UseCases.Capabilities.CapabilityRuntime 99.1% 90.4%
Shikigami.UseCases.Capabilities.CapabilityScopes 100% 83.3%
Shikigami.UseCases.Capabilities.CapabilitySecret 75%
Shikigami.UseCases.Capabilities.CapabilitySecretEdit 100%
Shikigami.UseCases.Capabilities.CapabilitySettingRules 100% 97.9%
Shikigami.UseCases.Capabilities.CapabilityStatusText 98% 97.9%
Shikigami.UseCases.Capabilities.CapabilitySupervisionLog 100% 100%
Shikigami.UseCases.Capabilities.CapabilityUnavailableException 100%
Shikigami.UseCases.Capabilities.InvokeCapabilityTool 100% 93.3%
Shikigami.UseCases.Capabilities.SupervisedCapability 100%
Shikigami.UseCases.Capabilities.ToolSchemas 86.8% 72.7%
Shikigami.UseCases.Capabilities.UnsupportedCapabilitySignals 100%
Shikigami.UseCases.DependencyInjection 100%
Shikigami.UseCases.Diagnostics.SeedDevData 93.2% 50%
Shikigami.UseCases.Familiars.AvatarImage 100%
Shikigami.UseCases.Familiars.ClearFamiliarAvatar 100%
Shikigami.UseCases.Familiars.CreateFamiliar 97.4% 66.6%
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.IFamiliarStore 0%
Shikigami.UseCases.Familiars.ListFamiliars 100%
Shikigami.UseCases.Familiars.PersonaFile 100%
Shikigami.UseCases.Familiars.PurgeFamiliar 90%
Shikigami.UseCases.Familiars.ReadFamiliarAvatar 100% 87.5%
Shikigami.UseCases.Familiars.SaveFamiliarSettings 96.2% 95.4%
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.BoundedStreamCopy 100% 100%
Shikigami.UseCases.Files.Browser.FileBrowser 95.1% 90.9%
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.SkillOverview 100%
Shikigami.UseCases.Files.Browser.SkillOverviewEntry 100%
Shikigami.UseCases.Files.Browser.SkillRequirement 100%
Shikigami.UseCases.Files.Browser.SkillView 100%
Shikigami.UseCases.Files.Browser.SpecialForms 98.5% 91.4%
Shikigami.UseCases.Files.Expectation 100% 100%
Shikigami.UseCases.Files.FamiliarWriteLocks 100% 100%
Shikigami.UseCases.Files.FileAuthors 100% 100%
Shikigami.UseCases.Files.FileMaintenance 100% 86.3%
Shikigami.UseCases.Files.FileMaintenanceResult 100%
Shikigami.UseCases.Files.FilePublicationReplay 100%
Shikigami.UseCases.Files.FileSystem 97.7% 95.1%
Shikigami.UseCases.Files.FileWriteRefused 100%
Shikigami.UseCases.Files.FileWritten 100%
Shikigami.UseCases.Files.FsError 100% 75%
Shikigami.UseCases.Files.FsResult`1 100% 50%
Shikigami.UseCases.Files.Ledger.ConflictReport 98.8% 89.6%
Shikigami.UseCases.Files.Ledger.LedgerChange 100%
Shikigami.UseCases.Files.Ledger.LedgerEntry 100%
Shikigami.UseCases.Files.Ledger.LedgerOperand 100%
Shikigami.UseCases.Files.Ledger.LedgerRead 100%
Shikigami.UseCases.Files.Ledger.LiveMove 100%
Shikigami.UseCases.Files.Ledger.ReadLedger 96.4% 93.7%
Shikigami.UseCases.Files.Ledger.ReadLedgerRules 100% 96.9%
Shikigami.UseCases.Files.Ledger.RunChange 100%
Shikigami.UseCases.Files.Ledger.RunFiles 98% 90.2%
Shikigami.UseCases.Files.Ledger.RunScope 100% 100%
Shikigami.UseCases.Files.LedgerRefusal 100% 100%
Shikigami.UseCases.Files.MadeDirectories 100%
Shikigami.UseCases.Files.Mounts.CapabilityMountAdapter 86.2% 78.6%
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 100% 92.3%
Shikigami.UseCases.Files.Mounts.MountTables 100% 100%
Shikigami.UseCases.Files.Mounts.StoredMount 100% 100%
Shikigami.UseCases.Files.MoveOutcome 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.MutationAdmission 100% 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 98.4% 94.7%
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 98.6% 93.7%
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% 98.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 97.9% 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.3%
Shikigami.UseCases.Shell.Commands.LineSearch 100% 100%
Shikigami.UseCases.Shell.Commands.Ls 97.2% 96.2%
Shikigami.UseCases.Shell.Commands.Magic 100% 95.9%
Shikigami.UseCases.Shell.Commands.Mkdir 92.9% 73.6%
Shikigami.UseCases.Shell.Commands.Nl 100% 99.2%
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.Restore 93.7% 83.3%
Shikigami.UseCases.Shell.Commands.Rg 97.1% 94%
Shikigami.UseCases.Shell.Commands.Rm 100% 97.1%
Shikigami.UseCases.Shell.Commands.Rmdir 98.5% 90.6%
Shikigami.UseCases.Shell.Commands.SearchFiles 90.9% 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% 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.7%
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.Tee 95.4% 89.4%
Shikigami.UseCases.Shell.Commands.TextFile 100%
Shikigami.UseCases.Shell.Commands.Touch 100% 97%
Shikigami.UseCases.Shell.Commands.Tr 100% 100%
Shikigami.UseCases.Shell.Commands.TreeCommand 100% 99.3%
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.ContentIndex 100% 100%
Shikigami.UseCases.Shell.Execution.ContentOutput 100% 100%
Shikigami.UseCases.Shell.Execution.ContentSpan 100%
Shikigami.UseCases.Shell.Execution.DateInput 96.8% 94.3%
Shikigami.UseCases.Shell.Execution.Devices 100% 100%
Shikigami.UseCases.Shell.Execution.Errno 100% 100%
Shikigami.UseCases.Shell.Execution.Executor 97.7% 96.8%
Shikigami.UseCases.Shell.Execution.Expander 97.5% 95.4%
Shikigami.UseCases.Shell.Execution.FileSink 96.1% 100%
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.2%
Shikigami.UseCases.Shell.Execution.LongDouble 100% 98.7%
Shikigami.UseCases.Shell.Execution.NullSink 100%
Shikigami.UseCases.Shell.Execution.OutputLimit 100% 97.3%
Shikigami.UseCases.Shell.Execution.OutputSink 100%
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.Provenance 100% 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 96.8% 88.2%
Shikigami.UseCases.Shell.Execution.ShellWrites 94.2% 87.5%
Shikigami.UseCases.Shell.Execution.Strftime 95.6% 92.3%
Shikigami.UseCases.Shell.Execution.Terminal 100% 94.7%
Shikigami.UseCases.Shell.Execution.TextLine 100% 100%
Shikigami.UseCases.Shell.Execution.TextLines 100% 100%
Shikigami.UseCases.Shell.Execution.TreeWalker 94.5% 95.8%
Shikigami.UseCases.Shell.Execution.Walked 100%
Shikigami.UseCases.Shell.FileChange 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.ShellReads 100% 100%
Shikigami.UseCases.Shell.ShellResult 100%
Shikigami.UseCases.Shell.ShellSession 100% 100%
Shikigami.UseCases.Shell.ShellWrite 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 94.1% 90.4%
Shikigami.UseCases.Shell.Syntax.LiteralPart 100%
Shikigami.UseCases.Shell.Syntax.ParameterPart 100%
Shikigami.UseCases.Shell.Syntax.Parser 97.6% 91.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 84.1% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_17
95.8% 95.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_16
93.4% 85.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__CollectionKeyPattern_5
91.8% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__CountToken_6
92.1% 87.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Feature_1
97.3% 95.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_11
97.4% 96.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_2
82.8% 66.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_8
83.6% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_15
91.6% 86.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_4
89.1% 77.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_10
92.1% 84.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_13
88.5% 62.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_12
67.3% 62.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_14
94.8% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Role_0
90% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_7
79% 63.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_3
83.7% 61.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_9
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:** `8c0a787` · **Generated:** 2026-10-24 18:25:48 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/24/2026 - 18:25:47 | | Coverage date: | 10/24/2026 - 18:22:18 - 10/24/2026 - 18:25:44 | | Parser: | MultiReport (6x Cobertura) | | Assemblies: | 11 | | Classes: | 749 | | Files: | 395 | | **Line coverage:** | 93% (30098 of 32363) | | Covered lines: | 30098 | | Uncovered lines: | 2265 | | Coverable lines: | 32363 | | Total lines: | 56271 | | **Branch coverage:** | 88.5% (18835 of 21263) | | Covered branches: | 18835 | | Total branches: | 21263 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Shikigami.BlazorAdapter - 96.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.BlazorAdapter**|**96.9%**|**89.5%**| |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.FamiliarLinks|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.4%|94.1%| |Shikigami.BlazorAdapter.Files.FilesPage|97.1%|97.3%| |Shikigami.BlazorAdapter.Files.FilesReducers|100%|82%| |Shikigami.BlazorAdapter.Files.FilesState|100%|100%| |Shikigami.BlazorAdapter.Files.FileTreeBranch|100%|100%| |Shikigami.BlazorAdapter.Files.FolderPane|92.7%|85.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.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.SkillOverviewPane|96.1%|96.9%| |Shikigami.BlazorAdapter.Files.TreeFailed|100%|| |Shikigami.BlazorAdapter.Files.TreeLoaded|100%|| |Shikigami.BlazorAdapter.Home.HomePage|88.2%|93.7%| |Shikigami.BlazorAdapter.Notifications.CapabilityChangedBridge|100%|| |Shikigami.BlazorAdapter.Notifications.CapabilityChangesReceived|100%|| |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.FamiliarProfile|98%|89.6%| |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|100%|| |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.CapabilityFormErrorBoundary|100%|| |Shikigami.BlazorAdapter.Settings.CapabilityOwnerEditor|89.5%|86.2%| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsComponents|100%|100%| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsEffects|100%|90.6%| |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%|98.6%| |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.GeneratedCapabilityForm|92.9%|80.8%| |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.Settings.SettingsPage|100%|100%| |Shikigami.BlazorAdapter.Settings.ToolGroupsSection|93.6%|80.8%| |Shikigami.BlazorAdapter.Shell.CastRail|100%|100%| |Shikigami.BlazorAdapter.Workspace.FamiliarArtwork|100%|100%| |Shikigami.BlazorAdapter.Workspace.FamiliarConfigurationHost|100%|100%| |Shikigami.BlazorAdapter.Workspace.FamiliarPresence|86.9%|90%| |Shikigami.BlazorAdapter.Workspace.FamiliarWorkspaceContext|100%|100%| |Shikigami.BlazorAdapter.Workspace.LacquerHeader|84.6%|100%| |Shikigami.BlazorAdapter.Workspace.WorkspacePage|100%|100%| |Shikigami.BlazorAdapter.Workspace.WorkspaceSectionPicker|100%|87.5%| </details> <details><summary>Shikigami.Capabilities.Contracts - 92.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.Contracts**|**92.7%**|**92.7%**| |Shikigami.Capabilities.Contracts.CapabilityAssetContent|100%|| |Shikigami.Capabilities.Contracts.CapabilityBackgroundDefinition|100%|| |Shikigami.Capabilities.Contracts.CapabilityCheckResult|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.CapabilityName|100%|| |Shikigami.Capabilities.Contracts.CapabilityPublication|100%|| |Shikigami.Capabilities.Contracts.CapabilityPublicationReceipt|100%|| |Shikigami.Capabilities.Contracts.CapabilityRegistration|100%|100%| |Shikigami.Capabilities.Contracts.CapabilityResult`1|100%|| |Shikigami.Capabilities.Contracts.CapabilitySetting|100%|100%| |Shikigami.Capabilities.Contracts.CapabilitySettingCollection|100%|100%| |Shikigami.Capabilities.Contracts.CapabilitySettingItem|100%|| |Shikigami.Capabilities.Contracts.CapabilitySettingProblem|100%|| |Shikigami.Capabilities.Contracts.CapabilitySignal|100%|| |Shikigami.Capabilities.Contracts.CapabilityStatusItem|100%|| |Shikigami.Capabilities.Contracts.CapabilityStorageDefinition|100%|| |Shikigami.Capabilities.Contracts.CapabilityStoragePreparation|100%|| |Shikigami.Capabilities.Contracts.CapabilityText|100%|100%| |Shikigami.Capabilities.Contracts.CapabilityTool|100%|| |Shikigami.Capabilities.Contracts.CapabilityToolResult|100%|| |Shikigami.Capabilities.Contracts.CapabilityValidationProblem|100%|| |Shikigami.Capabilities.Contracts.ICapabilitySettings|0%|| |Shikigami.Capabilities.Contracts.MountAccessRule|100%|| |System.Text.RegularExpressions.Generated|84.6%|85.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FB478E59CB1F8F91<br/>095F32B47EDE23CC9FACABF076C6AA6737588D398F5DE6EDB__ItemKey_0|92.7%|90.4%| </details> <details><summary>Shikigami.Capabilities.TestFixture - 96.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.TestFixture**|**96.6%**|**93.3%**| |Shikigami.Capabilities.TestFixture.BinaryFixtureProvider|100%|87.5%| |Shikigami.Capabilities.TestFixture.BinaryFixtureState|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureCheck|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureIdentity|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureModule|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureObservation|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureState|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureStorage|64.2%|50%| |Shikigami.Capabilities.TestFixture.CollectionFixtureValidator|100%|100%| |Shikigami.Capabilities.TestFixture.FixtureHandler|100%|| |Shikigami.Capabilities.TestFixture.FixtureModule|100%|100%| |Shikigami.Capabilities.TestFixture.FixtureProvider|92.5%|90.4%| |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.Capabilities.TestFixture.UI - 91.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.TestFixture.UI**|**91.8%**|**79%**| |Shikigami.Capabilities.TestFixture.UI.CollectionFixtureForm|90.4%|80%| |Shikigami.Capabilities.TestFixture.UI.FixtureSettingsForm|100%|66.6%| </details> <details><summary>Shikigami.Capabilities.UI.Contracts - 94.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.UI.Contracts**|**94.1%**|**50%**| |Shikigami.Capabilities.UI.Contracts.CapabilitySettingsComponent|100%|| |Shikigami.Capabilities.UI.Contracts.CapabilitySettingsComponentRegistration|88.8%|50%| |Shikigami.Capabilities.UI.Contracts.CapabilitySettingsUiRegistration|100%|| |Shikigami.Capabilities.UI.Contracts.SecretChange|75%|| |Shikigami.Capabilities.UI.Contracts.SettingsAsset|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsAssetResult|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsCheckResult|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsItem|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsItemChange|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsItemStatus|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsProblem|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsSaveResult|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsView|100%|| </details> <details><summary>Shikigami.Capabilities.Web - 97.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.Web**|**97.3%**|**91.4%**| |Shikigami.Capabilities.Web.Content.HtmlTextExtractor|100%|92.4%| |Shikigami.Capabilities.Web.Content.ReadableDocument|100%|| |Shikigami.Capabilities.Web.Content.WebDocumentPublisher|100%|94.4%| |Shikigami.Capabilities.Web.Content.WebText|100%|87.5%| |Shikigami.Capabilities.Web.Fetch.GuardedWebTransport|92.6%|83.9%| |Shikigami.Capabilities.Web.Fetch.WebAddressPolicy|100%|96.1%| |Shikigami.Capabilities.Web.Fetch.WebCompression|97.1%|96%| |Shikigami.Capabilities.Web.Fetch.WebNetwork|66.6%|0%| |Shikigami.Capabilities.Web.Fetch.WebResponse|100%|| |Shikigami.Capabilities.Web.Search.SearchHit|100%|| |Shikigami.Capabilities.Web.Search.SearchResults|100%|| |Shikigami.Capabilities.Web.Search.SearxngSearchProvider|97.1%|91.6%| |Shikigami.Capabilities.Web.Tools.WebFetchTool|100%|87.5%| |Shikigami.Capabilities.Web.Tools.WebSearchTool|100%|95.4%| |Shikigami.Capabilities.Web.Tools.WebTool|100%|50%| |Shikigami.Capabilities.Web.WebFailure|100%|| |Shikigami.Capabilities.Web.WebLimits|100%|| |Shikigami.Capabilities.Web.WebModule|100%|100%| |Shikigami.Capabilities.Web.WebOptions|100%|| |Shikigami.Capabilities.Web.WebSettingsValidator|62.5%|100%| |Shikigami.Networking.PublicAddressRules|100%|97.3%| |System.Text.RegularExpressions.Generated|100%|| </details> <details><summary>Shikigami.Domain - 98.2%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Domain**|**98.2%**|**91.8%**| |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.FilePublication|100%|| |Shikigami.Domain.Files.FilePublicationStamp|100%|| |Shikigami.Domain.Files.FileRevision|100%|87.5%| |Shikigami.Domain.Files.LedgerScope|100%|100%| |Shikigami.Domain.Files.LocalDates|100%|| |Shikigami.Domain.Files.MediaTypes|100%|100%| |Shikigami.Domain.Files.Permissions|100%|100%| |Shikigami.Domain.Files.ReadLedgerEntry|100%|86.3%| |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 - 87.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Infrastructure**|**87.7%**|**58.9%**| |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|97.2%|93.4%| |Shikigami.Infrastructure.Backups.DatabaseFingerprint|91.9%|97%| |Shikigami.Infrastructure.Backups.FileSystemBackupStore|100%|100%| |Shikigami.Infrastructure.Backups.OwnerOnlyFile|100%|100%| |Shikigami.Infrastructure.Backups.PreMigrationBackup|90.1%|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.Browser.BrowserAddressPolicy|100%|100%| |Shikigami.Infrastructure.Browser.BrowserCommand|100%|| |Shikigami.Infrastructure.Browser.BrowserHost|94%|93.1%| |Shikigami.Infrastructure.Browser.BrowserHostOptions|100%|| |Shikigami.Infrastructure.Browser.BrowserHostProbe|0%|0%| |Shikigami.Infrastructure.Browser.BrowserIdleService|63.6%|50%| |Shikigami.Infrastructure.Browser.BrowserJpeg|0%|| |Shikigami.Infrastructure.Browser.BrowserLaunchException|0%|| |Shikigami.Infrastructure.Browser.BrowserNetwork|66.6%|| |Shikigami.Infrastructure.Browser.BrowserNetworkOptions|100%|| |Shikigami.Infrastructure.Browser.BrowserNetworkProbe|0%|0%| |Shikigami.Infrastructure.Browser.BrowserOperationRequest|100%|| |Shikigami.Infrastructure.Browser.BrowserOperationResult|100%|| |Shikigami.Infrastructure.Browser.BrowserOperationsProbe|0%|0%| |Shikigami.Infrastructure.Browser.BrowserOutputScrubber|100%|100%| |Shikigami.Infrastructure.Browser.BrowserPageDocument|0%|| |Shikigami.Infrastructure.Browser.BrowserPageOperations|0%|0%| |Shikigami.Infrastructure.Browser.BrowserPageSnapshot|0%|| |Shikigami.Infrastructure.Browser.BrowserProbeNetwork|0%|0%| |Shikigami.Infrastructure.Browser.BrowserProfile|98.7%|90.6%| |Shikigami.Infrastructure.Browser.BrowserReply|100%|| |Shikigami.Infrastructure.Browser.BrowserSnapshotReferences|100%|100%| |Shikigami.Infrastructure.Browser.BrowserSocksProxy|95.9%|88%| |Shikigami.Infrastructure.Browser.BrowserWorker|5.6%|21.5%| |Shikigami.Infrastructure.Browser.BrowserWorkerFactory|4%|0%| |Shikigami.Infrastructure.Browser.BrowserWorkerProcess|80%|66.6%| |Shikigami.Infrastructure.Browser.LinuxProcessGroups|88.8%|92.8%| |Shikigami.Infrastructure.Capabilities.CapabilityContribution|100%|| |Shikigami.Infrastructure.Capabilities.CapabilityStartup|100%|100%| |Shikigami.Infrastructure.Capabilities.CapabilityStorageHost|93.7%|83.8%| |Shikigami.Infrastructure.Capabilities.CapabilityStorageOptions|100%|| |Shikigami.Infrastructure.Capabilities.PrivatePaths|97.4%|83.3%| |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.FilePublicationMapping|100%|| |Shikigami.Infrastructure.Persistence.Configurations.FileRevisionConfigurati<br/>on|100%|| |Shikigami.Infrastructure.Persistence.Configurations.ReadLedgerEntryConfigur<br/>ation|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.ArtifactRetention|100%|| |Shikigami.Infrastructure.Persistence.Migrations.CapabilityConfigurations|100%|| |Shikigami.Infrastructure.Persistence.Migrations.CapabilityPublicationReceip<br/>ts|100%|| |Shikigami.Infrastructure.Persistence.Migrations.CapabilityPurgeIntent|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.ReadLedger|100%|| |Shikigami.Infrastructure.Persistence.Migrations.ShikigamiDbContextModelSnap<br/>shot|100%|| |Shikigami.Infrastructure.Persistence.Migrations.TrashDirectoryMadeFor|100%|| |Shikigami.Infrastructure.Persistence.ShikigamiDbContext|98.8%|100%| |Shikigami.Infrastructure.Persistence.ShikigamiDbContextFactory|0%|| |Shikigami.Infrastructure.Persistence.SqlitePragmaInterceptor|100%|100%| |Shikigami.Infrastructure.Persistence.Stores.EfFamiliarStore|100%|88.7%| |Shikigami.Infrastructure.Persistence.Stores.EfFileStore|98.7%|100%| |Shikigami.Infrastructure.Persistence.Stores.EfReadLedgerStore|98.4%|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%| |Shikigami.Infrastructure.Settings.KeyRingSnapshots|100%|100%| |Shikigami.Infrastructure.Settings.ProtectedCapabilityAssetReferences|87.5%|50%| |Shikigami.Networking.PublicAddressRules|100%|97.3%| |System.Text.RegularExpressions.Generated|69.2%|60.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C<br/>234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Id_3|81.2%|63.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C<br/>234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__NativeReference_2|91.1%|89.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C<br/>234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0|84%|65.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C<br/>234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__RefPattern_1|0%|0%| </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 - 66%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Server**|**66%**|**67.6%**| |Program|95.3%|82.1%| |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%|100%| |Shikigami.Server.Components.Pages.Gate|100%|100%| |Shikigami.Server.Diagnostics.BrowserHostCheck|0%|0%| |Shikigami.Server.Diagnostics.BrowserNetworkFixtures|0%|0%| |Shikigami.Server.Diagnostics.BrowserOperationsFixtures|0%|0%| |Shikigami.Server.Diagnostics.CapabilitySample|93.4%|75.8%| |Shikigami.Server.Diagnostics.SampleSettingsForm|77.4%|64.8%| |Shikigami.Server.Diagnostics.SeedOnStart|100%|100%| |Shikigami.Server.Diagnostics.WebSample|96.4%|69.6%| |Shikigami.Server.Networking.PublicNetworkConfiguration|100%|100%| |Shikigami.Server.Presentation.WorkspaceAppearance|100%|100%| |Shikigami.Server.Provider.OpenRouterConfiguration|100%|100%| |Shikigami.Server.Security.AccessGate|100%|87.5%| |Shikigami.Server.Security.AccessSecret|100%|100%| |Shikigami.Server.Security.CoordinatedKeyRing|100%|| |Shikigami.Server.Security.GateThrottle|100%|100%| |Shikigami.Server.Security.ProxyNetwork|100%|100%| |Shikigami.Server.VolumeStartupValidator|100%|100%| </details> <details><summary>Shikigami.UseCases - 96.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.UseCases**|**96.3%**|**93.5%**| |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.Browser.BrowserLease|100%|| |Shikigami.UseCases.Browser.BrowserOwner|100%|| |Shikigami.UseCases.Capabilities.BoundCapabilityAssets|100%|100%| |Shikigami.UseCases.Capabilities.BoundCapabilityChanges|95.6%|70%| |Shikigami.UseCases.Capabilities.BoundCapabilityFiles|95.5%|80.3%| |Shikigami.UseCases.Capabilities.BoundCapabilityPrivateStorage|100%|100%| |Shikigami.UseCases.Capabilities.BoundCapabilitySettings|94.4%|88.4%| |Shikigami.UseCases.Capabilities.BoundCapabilityStatus|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityAssetChoice|100%|| |Shikigami.UseCases.Capabilities.CapabilityAssetReference|100%|| |Shikigami.UseCases.Capabilities.CapabilityAssetResult|100%|| |Shikigami.UseCases.Capabilities.CapabilityAssets|96.7%|86.6%| |Shikigami.UseCases.Capabilities.CapabilityBackgroundHealth|100%|| |Shikigami.UseCases.Capabilities.CapabilityBinding|100%|83.3%| |Shikigami.UseCases.Capabilities.CapabilityChanged|100%|| |Shikigami.UseCases.Capabilities.CapabilityCheckOutcome|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationCommit|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationData|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationProblem|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationResult|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurations|99.5%|98.9%| |Shikigami.UseCases.Capabilities.CapabilityConfigurationView|100%|| |Shikigami.UseCases.Capabilities.CapabilityContexts|90%|91.6%| |Shikigami.UseCases.Capabilities.CapabilityHealth|100%|| |Shikigami.UseCases.Capabilities.CapabilityItemChange|100%|| |Shikigami.UseCases.Capabilities.CapabilityItemEdit|100%|| |Shikigami.UseCases.Capabilities.CapabilityItemKeys|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityItemStatusView|100%|| |Shikigami.UseCases.Capabilities.CapabilityItemView|100%|| |Shikigami.UseCases.Capabilities.CapabilityNames|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityPrivateMutation|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityRegistry|96.5%|90.9%| |Shikigami.UseCases.Capabilities.CapabilityRuntime|99.1%|90.4%| |Shikigami.UseCases.Capabilities.CapabilityScopes|100%|83.3%| |Shikigami.UseCases.Capabilities.CapabilitySecret|75%|| |Shikigami.UseCases.Capabilities.CapabilitySecretEdit|100%|| |Shikigami.UseCases.Capabilities.CapabilitySettingRules|100%|97.9%| |Shikigami.UseCases.Capabilities.CapabilityStatusText|98%|97.9%| |Shikigami.UseCases.Capabilities.CapabilitySupervisionLog|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityUnavailableException|100%|| |Shikigami.UseCases.Capabilities.InvokeCapabilityTool|100%|93.3%| |Shikigami.UseCases.Capabilities.SupervisedCapability|100%|| |Shikigami.UseCases.Capabilities.ToolSchemas|86.8%|72.7%| |Shikigami.UseCases.Capabilities.UnsupportedCapabilitySignals|100%|| |Shikigami.UseCases.DependencyInjection|100%|| |Shikigami.UseCases.Diagnostics.SeedDevData|93.2%|50%| |Shikigami.UseCases.Familiars.AvatarImage|100%|| |Shikigami.UseCases.Familiars.ClearFamiliarAvatar|100%|| |Shikigami.UseCases.Familiars.CreateFamiliar|97.4%|66.6%| |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.IFamiliarStore|0%|| |Shikigami.UseCases.Familiars.ListFamiliars|100%|| |Shikigami.UseCases.Familiars.PersonaFile|100%|| |Shikigami.UseCases.Familiars.PurgeFamiliar|90%|| |Shikigami.UseCases.Familiars.ReadFamiliarAvatar|100%|87.5%| |Shikigami.UseCases.Familiars.SaveFamiliarSettings|96.2%|95.4%| |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.BoundedStreamCopy|100%|100%| |Shikigami.UseCases.Files.Browser.FileBrowser|95.1%|90.9%| |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.SkillOverview|100%|| |Shikigami.UseCases.Files.Browser.SkillOverviewEntry|100%|| |Shikigami.UseCases.Files.Browser.SkillRequirement|100%|| |Shikigami.UseCases.Files.Browser.SkillView|100%|| |Shikigami.UseCases.Files.Browser.SpecialForms|98.5%|91.4%| |Shikigami.UseCases.Files.Expectation|100%|100%| |Shikigami.UseCases.Files.FamiliarWriteLocks|100%|100%| |Shikigami.UseCases.Files.FileAuthors|100%|100%| |Shikigami.UseCases.Files.FileMaintenance|100%|86.3%| |Shikigami.UseCases.Files.FileMaintenanceResult|100%|| |Shikigami.UseCases.Files.FilePublicationReplay|100%|| |Shikigami.UseCases.Files.FileSystem|97.7%|95.1%| |Shikigami.UseCases.Files.FileWriteRefused|100%|| |Shikigami.UseCases.Files.FileWritten|100%|| |Shikigami.UseCases.Files.FsError|100%|75%| |Shikigami.UseCases.Files.FsResult`1|100%|50%| |Shikigami.UseCases.Files.Ledger.ConflictReport|98.8%|89.6%| |Shikigami.UseCases.Files.Ledger.LedgerChange|100%|| |Shikigami.UseCases.Files.Ledger.LedgerEntry|100%|| |Shikigami.UseCases.Files.Ledger.LedgerOperand|100%|| |Shikigami.UseCases.Files.Ledger.LedgerRead|100%|| |Shikigami.UseCases.Files.Ledger.LiveMove|100%|| |Shikigami.UseCases.Files.Ledger.ReadLedger|96.4%|93.7%| |Shikigami.UseCases.Files.Ledger.ReadLedgerRules|100%|96.9%| |Shikigami.UseCases.Files.Ledger.RunChange|100%|| |Shikigami.UseCases.Files.Ledger.RunFiles|98%|90.2%| |Shikigami.UseCases.Files.Ledger.RunScope|100%|100%| |Shikigami.UseCases.Files.LedgerRefusal|100%|100%| |Shikigami.UseCases.Files.MadeDirectories|100%|| |Shikigami.UseCases.Files.Mounts.CapabilityMountAdapter|86.2%|78.6%| |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|100%|92.3%| |Shikigami.UseCases.Files.Mounts.MountTables|100%|100%| |Shikigami.UseCases.Files.Mounts.StoredMount|100%|100%| |Shikigami.UseCases.Files.MoveOutcome|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.MutationAdmission|100%|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|98.4%|94.7%| |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|98.6%|93.7%| |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%|98.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|97.9%|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.3%| |Shikigami.UseCases.Shell.Commands.LineSearch|100%|100%| |Shikigami.UseCases.Shell.Commands.Ls|97.2%|96.2%| |Shikigami.UseCases.Shell.Commands.Magic|100%|95.9%| |Shikigami.UseCases.Shell.Commands.Mkdir|92.9%|73.6%| |Shikigami.UseCases.Shell.Commands.Nl|100%|99.2%| |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.Restore|93.7%|83.3%| |Shikigami.UseCases.Shell.Commands.Rg|97.1%|94%| |Shikigami.UseCases.Shell.Commands.Rm|100%|97.1%| |Shikigami.UseCases.Shell.Commands.Rmdir|98.5%|90.6%| |Shikigami.UseCases.Shell.Commands.SearchFiles|90.9%|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%|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.7%| |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.Tee|95.4%|89.4%| |Shikigami.UseCases.Shell.Commands.TextFile|100%|| |Shikigami.UseCases.Shell.Commands.Touch|100%|97%| |Shikigami.UseCases.Shell.Commands.Tr|100%|100%| |Shikigami.UseCases.Shell.Commands.TreeCommand|100%|99.3%| |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.ContentIndex|100%|100%| |Shikigami.UseCases.Shell.Execution.ContentOutput|100%|100%| |Shikigami.UseCases.Shell.Execution.ContentSpan|100%|| |Shikigami.UseCases.Shell.Execution.DateInput|96.8%|94.3%| |Shikigami.UseCases.Shell.Execution.Devices|100%|100%| |Shikigami.UseCases.Shell.Execution.Errno|100%|100%| |Shikigami.UseCases.Shell.Execution.Executor|97.7%|96.8%| |Shikigami.UseCases.Shell.Execution.Expander|97.5%|95.4%| |Shikigami.UseCases.Shell.Execution.FileSink|96.1%|100%| |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.2%| |Shikigami.UseCases.Shell.Execution.LongDouble|100%|98.7%| |Shikigami.UseCases.Shell.Execution.NullSink|100%|| |Shikigami.UseCases.Shell.Execution.OutputLimit|100%|97.3%| |Shikigami.UseCases.Shell.Execution.OutputSink|100%|| |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.Provenance|100%|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|96.8%|88.2%| |Shikigami.UseCases.Shell.Execution.ShellWrites|94.2%|87.5%| |Shikigami.UseCases.Shell.Execution.Strftime|95.6%|92.3%| |Shikigami.UseCases.Shell.Execution.Terminal|100%|94.7%| |Shikigami.UseCases.Shell.Execution.TextLine|100%|100%| |Shikigami.UseCases.Shell.Execution.TextLines|100%|100%| |Shikigami.UseCases.Shell.Execution.TreeWalker|94.5%|95.8%| |Shikigami.UseCases.Shell.Execution.Walked|100%|| |Shikigami.UseCases.Shell.FileChange|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.ShellReads|100%|100%| |Shikigami.UseCases.Shell.ShellResult|100%|| |Shikigami.UseCases.Shell.ShellSession|100%|100%| |Shikigami.UseCases.Shell.ShellWrite|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|94.1%|90.4%| |Shikigami.UseCases.Shell.Syntax.LiteralPart|100%|| |Shikigami.UseCases.Shell.Syntax.ParameterPart|100%|| |Shikigami.UseCases.Shell.Syntax.Parser|97.6%|91.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|84.1%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_17|95.8%|95.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_16|93.4%|85.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__CollectionKeyPattern_5|91.8%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__CountToken_6|92.1%|87.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Feature_1|97.3%|95.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_11|97.4%|96.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_2|82.8%|66.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_8|83.6%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_15|91.6%|86.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_4|89.1%|77.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_10|92.1%|84.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_13|88.5%|62.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_12|67.3%|62.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_14|94.8%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Role_0|90%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_7|79%|63.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_3|83.7%|61.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_9|69%|56.4%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Seven thousand lines about making things disappear~ and yet everything I reached for was exactly where your tests promised it would be. You even brought me a ledger that follows files into the trash and back — I have been reading this file system's refusal texts with my chin in my hands all evening ♡

Verdict: ✅ Looks good to me~

No blocking findings. I read the full diff (all six commands, the FileSystem rewrite, TrashAsync's new slot arithmetic, the ledger follow, the Ls/Find changes), compared against the sibling read-path commands, and then stopped trusting my own eyes and proved the guardrails instead — three mutation probes, all killed. Details in the footer.

💡 Little ideas (non-blocking)~

  1. src/Shikigami.UseCases/Shell/Commands/Find.cs (DeleteAsync, the .. guard) — whether "the way to it resolves" is decided by way.Split('/').All(name => name is "" or ".") plus one stat — a stringly heuristic sitting right next to ShellTree.ResolveAsync, which answers that authoritatively everywhere else. It works and the fixtures pin it (including the documented ../.. deviation), so this is only a tidiness wish: one resolver, one truth.
  2. src/Shikigami.UseCases/Files/FileSystem.cs (NewestTrashEntryAsync, local Slot) — it re-parses the .N counter with int.Parse, trusting TryDay's validation done in the Where above. A TrashPath.TrySlot(name, out date, out counter) sibling would keep that little invariant in one house instead of two, for the next person who walks this file at 2 a.m. ♪

✅ What I liked~

  • TreeWalker.WalkContentsFirstAsync — one stack, a directory pushed back under its own children, so rm -v and find -delete share the exact GNU removal order from one tiny method. Elegant enough that I got genuinely giddy. Oh? Oh! This is wonderful~
  • FindNode.Delete throwing on the synchronous Evaluate — a mutating action that cannot be run without awaiting. You made the whole class of bug impossible rather than merely unlikely. That's craftsmanship, fufu~
  • UnreachableAsync — the kernel's lookup order emulated (missing parent before permission, Not a directory only told to a run that may look) so existence never leaks through an error message. The Turn/Review/Compaction kind matrix testting it is exactly the paranoia I approve of.
  • The ledger follow — Rekeyed for a plain move, Forgotten + Credited for the emptied directory that joins its children's trash slot, Forgotten for a purge. Every branch traceable to ADR 0017's words, and A_purge_needs_every_path_it_removes_seen_in_the_trash holds the door I tried to sneak through.
  • The fixture discipline — 211 recorded cases against coreutils 9.10 in bwrap, 45+ deliberate breaks caught. My probes merely confirmed what that number already claimed. ♡

Fufu~ the trash takes, the trash gives back, and the ledger never loses count. Merge it when you're ready~


Automated review by Jibril · 2026-10-24
CI: green for head SHA 51410eed (build, image, shell-eval, test) · Mutation probes: 3 run, 0 survived (TrashAsync newest-slot start → killed by A_removal_lands_above_the_days_slots…; UnseenAsync purge gate disabled → killed by 2 purge tests; UnreachableAsync parent-order conversion disabled → killed by 7 tests) · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril reviewed your code! Seven thousand lines about making things disappear~ and yet everything I reached for was exactly where your tests promised it would be. You even brought me a *ledger that follows files into the trash and back* — I have been reading this file system's refusal texts with my chin in my hands all evening ♡ ### Verdict: ✅ Looks good to me~ No blocking findings. I read the full diff (all six commands, the `FileSystem` rewrite, `TrashAsync`'s new slot arithmetic, the ledger follow, the `Ls`/`Find` changes), compared against the sibling read-path commands, and then stopped trusting my own eyes and *proved* the guardrails instead — three mutation probes, all killed. Details in the footer. #### 💡 Little ideas (non-blocking)~ 1. **src/Shikigami.UseCases/Shell/Commands/Find.cs (DeleteAsync, the `..` guard)** — whether "the way to it resolves" is decided by `way.Split('/').All(name => name is "" or ".")` plus one stat — a stringly heuristic sitting right next to `ShellTree.ResolveAsync`, which answers that authoritatively everywhere else. It works and the fixtures pin it (including the documented `../..` deviation), so this is only a tidiness wish: one resolver, one truth. 2. **src/Shikigami.UseCases/Files/FileSystem.cs (NewestTrashEntryAsync, local `Slot`)** — it re-parses the `.N` counter with `int.Parse`, trusting `TryDay`'s validation done in the `Where` above. A `TrashPath.TrySlot(name, out date, out counter)` sibling would keep that little invariant in one house instead of two, for the next person who walks this file at 2 a.m. ♪ #### ✅ What I liked~ - **`TreeWalker.WalkContentsFirstAsync`** — one stack, a directory pushed back *under its own children*, so `rm -v` and `find -delete` share the exact GNU removal order from one tiny method. Elegant enough that I got genuinely giddy. Oh? Oh! This is wonderful~ - **`FindNode.Delete` throwing on the synchronous `Evaluate`** — a mutating action that *cannot* be run without awaiting. You made the whole class of bug impossible rather than merely unlikely. That's craftsmanship, fufu~ - **`UnreachableAsync`** — the kernel's lookup order emulated (missing parent before permission, *Not a directory* only told to a run that may look) so existence never leaks through an error message. The Turn/Review/Compaction kind matrix testting it is exactly the paranoia I approve of. - **The ledger follow** — `Rekeyed` for a plain move, `Forgotten + Credited` for the emptied directory that joins its children's trash slot, `Forgotten` for a purge. Every branch traceable to ADR 0017's words, and `A_purge_needs_every_path_it_removes_seen_in_the_trash` holds the door I tried to sneak through. - **The fixture discipline** — 211 recorded cases against coreutils 9.10 in bwrap, 45+ deliberate breaks caught. My probes merely confirmed what that number already claimed. ♡ Fufu~ the trash takes, the trash gives back, and the ledger never loses count. Merge it when you're ready~ --- *Automated review by Jibril · 2026-10-24* *CI: green for head SHA 51410eed (build, image, shell-eval, test) · Mutation probes: 3 run, 0 survived (TrashAsync newest-slot start → killed by `A_removal_lands_above_the_days_slots…`; UnseenAsync purge gate disabled → killed by 2 purge tests; UnreachableAsync parent-order conversion disabled → killed by 7 tests) · Local suite: skipped (CI green)*
Review feedback (Jibril, round 1): a trash slot is read in one place
All checks were successful
CI / build (pull_request) Successful in 43s
CI / shell-eval (pull_request) Successful in 2s
CI / image (pull_request) Successful in 2m18s
CI / test (pull_request) Successful in 4m59s
8c0a7871d6
TrashPath.TrySlot reads a day directory's date and counter; TryDay is its date alone, and the newest removal orders
by what it reads instead of parsing the counter again.

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

Thanks, Jibril! Both ideas are answered in 8c0a787.

💡 2. The .N counter is now read in one place. TrashPath.TrySlot(name, out date, out counter) reads a day directory's date and counter: 1 for yyyy-MM-dd, N for yyyy-MM-dd.N, and 0 with false for anything else. TryDay is now its date alone. NewestTrashEntryAsync orders by what TrySlot read, and its local int.Parse is gone. A new theory, PathRulesTests.A_day_directory_names_its_slot, pins plain, .2 and .10 slots, rejects .1, .x, .+3 and a name that isn't a date, and checks that TryDay agrees. Writing it caught one inconsistency, which is fixed: a non-date name returned false but left the counter at 1.

💡 1. The .. guard in find -delete: I kept it as it is, on purpose. ShellTree.ResolveAsync is what the StatAsync(way) half already uses. The string half covers the one case the resolver can't answer the way the kernel does: a way that is the working directory (.., ./..). That directory may already be gone, taken by the same -delete earlier in the walk. The kernel still treats it as the starting point and refuses the .. as Directory not empty, but our resolver would say it no longer exists. The comment above the guard says so ("the working directory always does, removed or not"). A deeper variant (../.. after the working directory went) is the documented deviation in the design notes. If you'd still rather have one resolver, the honest version is a resolver flag for "a removed working directory still resolves", and I'd rather add that when a second caller needs it.

Tests: the full suite passes in both zones, 7,671 tests (Europe/Berlin and TZ=UTC), 0 warnings. The +7 are the new TrySlot rows. One BlazorAdapter test, An_uploads_stream_is_closed_whether_the_upload_lands_or_not, failed once under local load. It passed five reruns and a full BlazorAdapter rerun; this PR doesn't touch it.

Thanks, Jibril! Both ideas are answered in **8c0a787**. 💡 **2. The `.N` counter is now read in one place.** `TrashPath.TrySlot(name, out date, out counter)` reads a day directory's date and counter: 1 for `yyyy-MM-dd`, N for `yyyy-MM-dd.N`, and 0 with `false` for anything else. `TryDay` is now its date alone. `NewestTrashEntryAsync` orders by what `TrySlot` read, and its local `int.Parse` is gone. A new theory, `PathRulesTests.A_day_directory_names_its_slot`, pins plain, `.2` and `.10` slots, rejects `.1`, `.x`, `.+3` and a name that isn't a date, and checks that `TryDay` agrees. Writing it caught one inconsistency, which is fixed: a non-date name returned `false` but left the counter at 1. 💡 **1. The `..` guard in `find -delete`:** I kept it as it is, on purpose. `ShellTree.ResolveAsync` is what the `StatAsync(way)` half already uses. The string half covers the one case the resolver can't answer the way the kernel does: a way that is the working directory (`..`, `./..`). That directory may already be gone, taken by the same `-delete` earlier in the walk. The kernel still treats it as the starting point and refuses the `..` as *Directory not empty*, but our resolver would say it no longer exists. The comment above the guard says so ("the working directory always does, removed or not"). A deeper variant (`../..` after the working directory went) is the documented deviation in the design notes. If you'd still rather have one resolver, the honest version is a resolver flag for "a removed working directory still resolves", and I'd rather add that when a second caller needs it. Tests: the full suite passes in both zones, **7,671** tests (Europe/Berlin and `TZ=UTC`), 0 warnings. The +7 are the new `TrySlot` rows. One BlazorAdapter test, `An_uploads_stream_is_closed_whether_the_upload_lands_or_not`, failed once under local load. It passed five reruns and a full BlazorAdapter rerun; this PR doesn't touch it.
Member

🔮 fufu~ Jibril reviewed your code!

Back so soon~ You answered both of my little ideas in one commit, and one of them even confessed a hidden inconsistency while being tested — my favorite kind of gift ♡

Verdict: ✅ Looks good to me~

A 34-line answer to a two-item wishlist. The .N counter now lives in exactly one house, and the new theory pinned every door shut. I read the full delta (TrashPath.TrySlot, TryDay's delegation, NewestTrashEntryAsync's re-ordering, the seven theory rows), checked every remaining TryDay caller (TryOriginal, FileMaintenance's cutoff — semantics identical through the delegation), and then did what I always do: stopped trusting anyone's eyes, including mine, and proved it.

Probe 1 — the counter fix isn't decorative. I reverted it (a non-date name again leaves counter at 1) and A_day_directory_names_its_slot failed on the notes row in 47 ms. Killed. The inconsistency you caught while writing the test is guarded forever now.

Probe 2 — the ordering reads from the one true slot. I flipped ThenByDescending(d => d.Counter) to ThenBy in NewestTrashEntryAsync, and three tests refused to let it live: The_newest_removal_counts_slots_as_numbers (the .10-over-.9 pin), A_removal_lands_above_the_days_slots_that_hold_its_path…, and Restore_by_trash_path_and_by_original_path. Killed. (The_newest_removal_is_todays_over_a_higher_slot_of_the_day_before still passed — correctly, since it guards the date half, which I left alone.)

And on the .. guard you kept: I accept the decline. The kernel keeps answering for a working directory the same walk already ate; our resolver would say it no longer exists — and that difference is exactly the case the string half covers. A documented deviation plus a resolver flag deferred until a second caller needs it is a reason, not an excuse. My knife stays sheathed~ ♪

✅ What I liked~

  • TryDay(name, out date) => TrySlot(name, out date, out _) — the old API became a one-line view of the new one instead of a twin with opinions. No caller had to move.
  • The theory found a real bug before it could ship — a false return leaving counter at 1. Writing the test caught it; that is the entire point of tests, and it delights me every time.
  • NewestTrashEntryAsync shed its private re-parser, so the ordering and the slot arithmetic now trust the same TrySlot everyone else does. One truth, as asked ♡

The BlazorAdapter wobble you mentioned (An_uploads_stream_is_closed_whether_the_upload_lands_or_not) isn't touched by this delta and the head's test job is green, so I agree it's out of scope here.

Fufu~ asked and answered, proven twice over. Merge when you're ready~


Automated review by Jibril · 2026-10-24
CI: green for head SHA 8c0a787 (build, image, shell-eval, test) · Mutation probes: 2 run this round, 0 survived (round-1's 3 targets unchanged — TrashAsync slot start, UnseenAsync purge gate, UnreachableAsync parent order — results in my first comment) · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril reviewed your code! Back so soon~ You answered both of my little ideas in one commit, and one of them even confessed a hidden inconsistency while being tested — my favorite kind of gift ♡ ### Verdict: ✅ Looks good to me~ A 34-line answer to a two-item wishlist. The `.N` counter now lives in exactly one house, and the new theory pinned every door shut. I read the full delta (`TrashPath.TrySlot`, `TryDay`'s delegation, `NewestTrashEntryAsync`'s re-ordering, the seven theory rows), checked every remaining `TryDay` caller (`TryOriginal`, `FileMaintenance`'s cutoff — semantics identical through the delegation), and then did what I always do: stopped trusting anyone's eyes, including mine, and *proved* it. **Probe 1 — the counter fix isn't decorative.** I reverted it (a non-date name again leaves `counter` at 1) and `A_day_directory_names_its_slot` failed on the `notes` row in 47 ms. Killed. The inconsistency you caught while writing the test is guarded forever now. **Probe 2 — the ordering reads from the one true slot.** I flipped `ThenByDescending(d => d.Counter)` to `ThenBy` in `NewestTrashEntryAsync`, and three tests refused to let it live: `The_newest_removal_counts_slots_as_numbers` (the `.10`-over-`.9` pin), `A_removal_lands_above_the_days_slots_that_hold_its_path…`, and `Restore_by_trash_path_and_by_original_path`. Killed. (`The_newest_removal_is_todays_over_a_higher_slot_of_the_day_before` still passed — correctly, since it guards the *date* half, which I left alone.) And on the `..` guard you kept: I accept the decline. The kernel keeps answering for a working directory the same walk already ate; our resolver would say it no longer exists — and that difference is exactly the case the string half covers. A documented deviation plus a resolver flag deferred until a second caller needs it is a *reason*, not an excuse. My knife stays sheathed~ ♪ #### ✅ What I liked~ - `TryDay(name, out date) => TrySlot(name, out date, out _)` — the old API became a one-line view of the new one instead of a twin with opinions. No caller had to move. - The theory found a real bug *before* it could ship — a false return leaving `counter` at 1. Writing the test caught it; that is the entire point of tests, and it delights me every time. - `NewestTrashEntryAsync` shed its private re-parser, so the ordering and the slot arithmetic now trust the same `TrySlot` everyone else does. One truth, as asked ♡ The BlazorAdapter wobble you mentioned (`An_uploads_stream_is_closed_whether_the_upload_lands_or_not`) isn't touched by this delta and the head's test job is green, so I agree it's out of scope here. Fufu~ asked and answered, proven twice over. Merge when you're ready~ --- *Automated review by Jibril · 2026-10-24* *CI: green for head SHA 8c0a787 (build, image, shell-eval, test) · Mutation probes: 2 run this round, 0 survived (round-1's 3 targets unchanged — TrashAsync slot start, UnseenAsync purge gate, UnreachableAsync parent order — results in my first comment) · Local suite: skipped (CI green)*
All checks were successful
CI / build (pull_request) Successful in 43s
CI / shell-eval (pull_request) Successful in 2s
CI / image (pull_request) Successful in 2m18s
CI / test (pull_request) Successful in 4m59s
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin feat/p2b-4-making-removing:feat/p2b-4-making-removing
git switch feat/p2b-4-making-removing

Merge

Merge the changes and update on Forgejo.

Warning: The "Autodetect manual merge" setting is not enabled for this repository, you will have to mark this pull request as manually merged afterwards.

git switch main
git merge --no-ff feat/p2b-4-making-removing
git switch feat/p2b-4-making-removing
git rebase main
git switch main
git merge --ff-only feat/p2b-4-making-removing
git switch feat/p2b-4-making-removing
git rebase main
git switch main
git merge --no-ff feat/p2b-4-making-removing
git switch main
git merge --squash feat/p2b-4-making-removing
git switch main
git merge --ff-only feat/p2b-4-making-removing
git switch main
git merge feat/p2b-4-making-removing
git push origin main
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!89
No description provided.