feat: 2b — the file system's write vocabulary #69

Merged
bjoern merged 8 commits from feat/p2b-1-write-vocabulary into main 2026-10-24 07:29:35 +02:00
Member

This is the first of eight PRs for Phase 2b, The shell, writing. It extends the file system with the write operations, and the error words for them, that the writing commands will use (ADR 0015, 0016; ADR 0017's version check is what Expectation carries). The shell still refuses every write. Its redirection refusal text is unchanged. The commands, the read ledger and budgets follow in the next PRs, in order.

What's in

Shell effects (ShellEffects, commands)

  • Writes is now typed: ShellWrite(Path, ShellWriteKind), where the kind is one of Write, Append, Edit, Touch, MakeDirectory, Remove, RemoveWithin, MoveFrom or MoveTo. The ledger (PR 2) and the activity log need to know how a path is written, not only that it is.
  • Phantom writes removed. 2>&1, >&- and <&0 no longer declare writes to <cwd>/1, /- or /0, and the /dev targets declare nothing.
  • Per-command effects:
    • sed -i declares its files as Lists plus Edit instead of Reads: an in-place edit is checked against the version, so it is not credited as a read.
    • find -delete declares RemoveWithin.
    • sort -o, uniq's OUTPUT, sed w and find -fprint declare Write.
  • FileChange and FileChangeOutcome exist. ShellCommandRecord.Changes stays empty until the commands write.

File system (FileSystem, FsError, Expectation)

  • Expectation (At(version) or Absent) has overloads on write, write text, append, move, remove and restore. The old long signatures wrap them, so the file browser's calls are unchanged.
  • Append-only refusals. Rewriting, moving or removing an append-only file (the journal) is now Operation not permitted (NotPermitted), as chattr +a refuses it. The hint is "add to it with >>". Permission denied stays for paths a run may not write at all. CapabilityPublication maps NotPermitted to PermissionDenied, so the Contracts surface is unchanged.
  • Appends from runs. A run's append starts on its own line when another author wrote last, so it never extends the owner's last line. Appends and restores can name the version their writer saw.
  • Moves. MoveAsync(…, replace) returns MoveOutcome.
    • Moving onto a file replaces it, and the replaced file goes to the trash first, under the same lock and with its revisions, so a replace stays recoverable.
    • A directory replaces only an empty directory.
    • A live mount moves only onto a free path.
    • An entry of the trash is never replaced.
  • Removing directories.
    • RemoveMode.EmptyDirectory is for rmdir. FileOrEmptyDirectory is for rm -d and find -delete. Emptiness is checked under the tree's lock.
    • Emptied directories rejoin their contents in the trash. What a directory loses one entry at a time gathers in a trash directory the app makes for it. When the emptied directory follows, it joins that trash directory, so one restore brings the whole tree back.
    • To tell whose trash directory is whose, a trash directory records which live directory it was made for (FileNode.MadeFor, migration TrashDirectoryMadeFor). The join requires that link for the directory itself and for every directory above it, so it never folds into an earlier, unrelated removal of the same path.
    • A full trash is its own refusal, TrashFull, separate from a full budget.
  • FsError gains:
    • Reason: the text without the path.
    • Path and CurrentVersion.
    • FsError.At(…).
    • The new codes NotPermitted, NotEmpty and TrashFull.
  • CheckWriteAsync checks a write without making it.
  • LocateAsync, through the new IFileStore.FindByIdAsync, finds where a stored file went, which the ledger needs to re-key reads after a move. FileEntry carries FileId.
  • mkdir over an existing directory needs read access to it.
  • Operations of several store writes finish once their first write lands, so a stop never leaves half of one. This covers the trash's directories plus the move, a replace's two moves, and mkdir -p's chain.

Shell (Errno, ShellTree, Executor)

  • Errno prints POSIX words without repeating the path, and keeps the limits after them ("File too large (a text file is at most 256 KB)").
  • Errno.After names a path below the operand the way the operand was typed, and prints a budget refusal without an operand.
  • Input redirection's read error goes through it.
  • ls -l shows a movable live mount's files as -r--r--r-- while their directory keeps w.

Docs

  • ADR 0015 and 0016 get the Amended 2026-10-23 (2b — The shell, writing): blocks describing all of the above. ADR statuses are unchanged.

Tests

6,498 tests pass in local time and again with TZ=UTC, with 0 warnings. The diff adds 59 [Fact]s and 2 [Theory]s, and nets 4 more [InlineData] rows.

What the tests pin:

  • FileSystemTests (most of the new tests):
    • Every refusal names its path once, with its code and reason. The refusal list covers a file below itself (Not a directory) and a directory below itself through a missing directory or a file, which takes the creation check's answer as GNU mv does.
    • A replace trashes the replaced file first and keeps its revisions. A stale source never trashes its target.
    • Trash joins:
      • an emptied directory joins only the trash directory made for it, and only when every directory above it was made for its own ancestor, checked to three levels and after a moved-back top folder;
      • it never joins an earlier removal of the same path, whether by the owner, a removal whole, or a restore made again;
      • it joins the lowest such slot;
      • a replaced empty directory never goes where the replacing move takes it from.
    • Stop boundaries: a stop after the first written step still finishes the operation, and a stop after a step that wrote nothing still stops it.
    • Races through RaceStore: a slot's directory deleted, or turned into a file, as the removal moves into it passes to the next slot.
  • CapabilityRegistryTests:
    • Live-mount moves use the provider, never write core rows, and refuse a replace as File exists, or as gone since it was read.
    • A target or parent the provider cannot answer for is reported as its failure (Offline), not as a disappearance. New fixture knobs StatFailurePath and ReadRefusal drive this.
  • ShellRegistryTests: a typed effects table covering the writing options, and that 2>&1, >&- and /dev declare nothing.
  • FsOutcomeTests: Errno and Errno.After wording, including a refusal about a path below the operand.
  • FileStoreTests, FileStoreTreeTests, FileNodeTests: MadeFor is persisted, it is cleared by a move, and the store answers into itself only for a directory moving into a directory that exists.
  • Pins changed on purpose:
    • the journal's PermissionDenied is now NotPermitted;
    • the 99-slot NoSpace is now TrashFull;
    • the append.md cases in CapabilityRegistryTests are now NotPermitted.

Pre-PR review. Five rounds ran before this PR opened. Each round had an independent adversarial reviewer and a reviewer running behavioural probes and mutation testing in a scratch checkout, with every finding fixed before the next round. The last two rechecks ran 28 and 15 mutants. Of the 43:

  • every survivor at its round's head was either fixed with a test in the following round or shown to be equivalent;
  • two equivalent ones remain: a null parent ID the store cannot produce, and skipping /notes, which can never be moved or removed.

Honest notes

  • APIs with no production caller yet: FileChange, ShellCommandRecord.Changes, CheckWriteAsync, LocateAsync, the replacing MoveAsync and MoveOutcome, RemoveMode.EmptyDirectory/FileOrEmptyDirectory, and versioned append and restore. The writing commands (PRs 3–6) and the ledger (PR 2) use them. They are tested directly here.
  • A schema change: one nullable MadeFor TEXT column on Files. Trash directories that exist before it stay made for no one, so a removal files beside them rather than into them.
  • Known differences from GNU, left for the commands' PRs:
    • When a file sits further up a target's path than its parent, the file system answers No such file or directory where GNU says Not a directory. Examples: mv a.md b.md/y/x.md, cat < a.md/x, mkdir -p a.md/x. The store's creation check looks only at the immediate parent. This predates this PR, and each case is noted for the PR that ships the command.
  • Errno now prints FsError.Reason, so errors from live mounts that reach ls, find, tree or history print in POSIX words, not the provider's sentence.
  • One commit, "Rebase onto main: the MadeFor migration follows ArtifactRetention", regenerates the migration after ArtifactRetention landed on main. Its Up/Down are unchanged.

🤖 Generated with Claude Code

This is the first of eight PRs for Phase 2b, **The shell, writing**. It extends the file system with the write operations, and the error words for them, that the writing commands will use (ADR 0015, 0016; ADR 0017's version check is what `Expectation` carries). **The shell still refuses every write.** Its redirection refusal text is unchanged. The commands, the read ledger and budgets follow in the next PRs, in order. ## What's in **Shell effects (`ShellEffects`, commands)** - `Writes` is now typed: `ShellWrite(Path, ShellWriteKind)`, where the kind is one of Write, Append, Edit, Touch, MakeDirectory, Remove, RemoveWithin, MoveFrom or MoveTo. The ledger (PR 2) and the activity log need to know *how* a path is written, not only *that* it is. - **Phantom writes removed.** `2>&1`, `>&-` and `<&0` no longer declare writes to `<cwd>/1`, `/-` or `/0`, and the `/dev` targets declare nothing. - **Per-command effects:** - `sed -i` declares its files as Lists plus Edit instead of Reads: an in-place edit is checked against the version, so it is not credited as a read. - `find -delete` declares RemoveWithin. - `sort -o`, uniq's OUTPUT, sed `w` and `find -fprint` declare Write. - `FileChange` and `FileChangeOutcome` exist. `ShellCommandRecord.Changes` stays empty until the commands write. **File system (`FileSystem`, `FsError`, `Expectation`)** - **`Expectation`** (`At(version)` or `Absent`) has overloads on write, write text, append, move, remove and restore. The old `long` signatures wrap them, so the file browser's calls are unchanged. - **Append-only refusals.** Rewriting, moving or removing an append-only file (the journal) is now *Operation not permitted* (`NotPermitted`), as `chattr +a` refuses it. The hint is "add to it with >>". *Permission denied* stays for paths a run may not write at all. `CapabilityPublication` maps `NotPermitted` to `PermissionDenied`, so the Contracts surface is unchanged. - **Appends from runs.** A run's append starts on its own line when another author wrote last, so it never extends the owner's last line. Appends and restores can name the version their writer saw. - **Moves.** `MoveAsync(…, replace)` returns `MoveOutcome`. - Moving onto a file replaces it, and the replaced file goes to the trash first, under the same lock and with its revisions, so a replace stays recoverable. - A directory replaces only an empty directory. - A live mount moves only onto a free path. - An entry of the trash is never replaced. - **Removing directories.** - `RemoveMode.EmptyDirectory` is for `rmdir`. `FileOrEmptyDirectory` is for `rm -d` and `find -delete`. Emptiness is checked under the tree's lock. - **Emptied directories rejoin their contents in the trash.** What a directory loses one entry at a time gathers in a trash directory the app makes for it. When the emptied directory follows, it joins that trash directory, so one `restore` brings the whole tree back. - To tell whose trash directory is whose, a trash directory records which live directory it was made for (`FileNode.MadeFor`, migration `TrashDirectoryMadeFor`). The join requires that link for the directory itself and for every directory above it, so it never folds into an earlier, unrelated removal of the same path. - A full trash is its own refusal, `TrashFull`, separate from a full budget. - **`FsError`** gains: - `Reason`: the text without the path. - `Path` and `CurrentVersion`. - `FsError.At(…)`. - The new codes `NotPermitted`, `NotEmpty` and `TrashFull`. - **`CheckWriteAsync`** checks a write without making it. - **`LocateAsync`**, through the new `IFileStore.FindByIdAsync`, finds where a stored file went, which the ledger needs to re-key reads after a move. `FileEntry` carries `FileId`. - **`mkdir`** over an existing directory needs read access to it. - **Operations of several store writes** finish once their first write lands, so a stop never leaves half of one. This covers the trash's directories plus the move, a replace's two moves, and `mkdir -p`'s chain. **Shell (`Errno`, `ShellTree`, `Executor`)** - `Errno` prints POSIX words without repeating the path, and keeps the limits after them ("File too large (a text file is at most 256 KB)"). - `Errno.After` names a path below the operand the way the operand was typed, and prints a budget refusal without an operand. - Input redirection's read error goes through it. - `ls -l` shows a movable live mount's files as `-r--r--r--` while their directory keeps `w`. **Docs** - ADR 0015 and 0016 get the **Amended 2026-10-23 (2b — The shell, writing):** blocks describing all of the above. ADR statuses are unchanged. ## Tests 6,498 tests pass in local time and again with `TZ=UTC`, with 0 warnings. The diff adds 59 `[Fact]`s and 2 `[Theory]`s, and nets 4 more `[InlineData]` rows. What the tests pin: - **`FileSystemTests`** (most of the new tests): - Every refusal names its path once, with its code and reason. The refusal list covers a file below itself (*Not a directory*) and a directory below itself through a missing directory or a file, which takes the creation check's answer as GNU `mv` does. - A replace trashes the replaced file first and keeps its revisions. A stale source never trashes its target. - **Trash joins:** - an emptied directory joins only the trash directory made for it, and only when every directory above it was made for its own ancestor, checked to three levels and after a moved-back top folder; - it never joins an earlier removal of the same path, whether by the owner, a removal whole, or a restore made again; - it joins the lowest such slot; - a replaced empty directory never goes where the replacing move takes it from. - **Stop boundaries:** a stop after the first written step still finishes the operation, and a stop after a step that wrote nothing still stops it. - **Races through `RaceStore`:** a slot's directory deleted, or turned into a file, as the removal moves into it passes to the next slot. - **`CapabilityRegistryTests`:** - Live-mount moves use the provider, never write core rows, and refuse a replace as *File exists*, or as gone since it was read. - A target or parent the provider cannot answer for is reported as its failure (Offline), not as a disappearance. New fixture knobs `StatFailurePath` and `ReadRefusal` drive this. - **`ShellRegistryTests`:** a typed effects table covering the writing options, and that `2>&1`, `>&-` and `/dev` declare nothing. - **`FsOutcomeTests`:** `Errno` and `Errno.After` wording, including a refusal about a path below the operand. - **`FileStoreTests`, `FileStoreTreeTests`, `FileNodeTests`:** `MadeFor` is persisted, it is cleared by a move, and the store answers *into itself* only for a directory moving into a directory that exists. - **Pins changed on purpose:** - the journal's `PermissionDenied` is now `NotPermitted`; - the 99-slot `NoSpace` is now `TrashFull`; - the `append.md` cases in `CapabilityRegistryTests` are now `NotPermitted`. **Pre-PR review.** Five rounds ran before this PR opened. Each round had an independent adversarial reviewer and a reviewer running behavioural probes and mutation testing in a scratch checkout, with every finding fixed before the next round. The last two rechecks ran 28 and 15 mutants. Of the 43: - every survivor at its round's head was either fixed with a test in the following round or shown to be equivalent; - two equivalent ones remain: a null parent ID the store cannot produce, and skipping `/notes`, which can never be moved or removed. ## Honest notes - **APIs with no production caller yet:** `FileChange`, `ShellCommandRecord.Changes`, `CheckWriteAsync`, `LocateAsync`, the replacing `MoveAsync` and `MoveOutcome`, `RemoveMode.EmptyDirectory`/`FileOrEmptyDirectory`, and versioned append and restore. The writing commands (PRs 3–6) and the ledger (PR 2) use them. They are tested directly here. - **A schema change:** one nullable `MadeFor` TEXT column on `Files`. Trash directories that exist before it stay made for no one, so a removal files beside them rather than into them. - **Known differences from GNU, left for the commands' PRs:** - When a file sits further up a target's path than its parent, the file system answers *No such file or directory* where GNU says *Not a directory*. Examples: `mv a.md b.md/y/x.md`, `cat < a.md/x`, `mkdir -p a.md/x`. The store's creation check looks only at the immediate parent. This predates this PR, and each case is noted for the PR that ships the command. - **Errno now prints `FsError.Reason`,** so errors from live mounts that reach `ls`, `find`, `tree` or `history` print in POSIX words, not the provider's sentence. - **One commit, "Rebase onto main: the MadeFor migration follows ArtifactRetention",** regenerates the migration after `ArtifactRetention` landed on main. Its `Up`/`Down` are unchanged. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Everything FileSystem, Errno and the effects model need before any ledger or
shell write exists. The shell still refuses every write, and its redirection
refusal text is unchanged.

- Typed effects: ShellEffects.Writes holds ShellWrite(path, kind) — write,
  append, edit, touch, make a directory, remove, remove within, move from,
  move to. Duplicated or closed descriptors (2>&1, >&-, <&0) and the /dev
  targets no longer declare phantom writes; sed -i lists the files it edits;
  find -delete declares RemoveWithin. FileChange exists and
  ShellCommandRecord.Changes stays empty for now.
- Expectation (At, Absent) with overloads on every mutator; the long
  signatures are wrappers, so the browser's calls are unchanged.
- FsError gains Reason (the path-free text) and CurrentVersion, built with
  FsError.At; new codes NotPermitted, NotEmpty and TrashFull. A file a run
  may only append to refuses rewrites, moves and removals as Operation not
  permitted. Errno never repeats a path, keeps hints, and keeps budget,
  validator and trash texts whole; Errno.After leaves the budget text
  without an operand.
- MoveAsync(source, replace) files a replaced file, or an empty directory,
  in the trash first and returns MoveOutcome; RemoveAsync takes
  RemoveMode.EmptyDirectory under the lock; an emptied directory joins the
  trash slot its children went to. Versioned appends and restores;
  CheckWriteAsync; LocateAsync over IFileStore.FindByIdAsync; FileEntry.FileId.
- A run's append to an append-only file starts on its own line after
  another author's last revision.
- mkdir needs read access to an existing directory in its chain. A change of
  several store writes finishes once its first is written.
- ls -l shows a movable live mount's files read-only.
- ADR 0015 and 0016 amended.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- An emptied directory joins only a trash directory the app made for its
  children after the directory came to be (made by the app, a higher
  version), never an earlier removal of the same path; ADR 0015 says so.
- The join looks only into today's slots that exist: one listing of
  /trash instead of a read per counter.
- RemoveMode.FileOrEmptyDirectory for rm -d and find -delete (GNU removes
  a file there); EmptyDirectory is rmdir's alone. ADR 0015 names both.
- FsError.Path names the path a refusal is about; Errno.After names a
  path below the operand as the operand was typed (a child that blocks a
  removal), and a directory move's row that lands too long names that row.
- A change of several steps stays stoppable until a step has written:
  Steps marks a written outcome, and the trash's directories and a group's
  mount point that are already there are no longer created again.
- A replace expectation is always checked: a target seen and gone since
  refuses the move as gone, as a write would.
- A move onto its own path is "the source and the target are the same
  file", stored and live alike.
- /dev/fd/N redirection targets declare no write.
- The append-only hint is the caller's: the file system answers a bare
  "Operation not permitted", so a capability never hears the shell's >>.
- ADR 0016: the sentence on a command's record of changes leaves this
  bullet; the record stays empty until redirections write.
- Tests kill the surviving mutants: the join's empty guard, a replaced
  directory's join, the order of kind before version for rmdir and a
  replace, the checked append's store backstop, emptiness read before the
  lock, the replace's trash-then-move boundary, and a refused step.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The trash's slots and the join go by provenance, not versions. A directory the
  app makes in a trash slot records the live directory whose removed contents it
  holds (FileNode.MadeFor, migration TrashDirectoryMadeFor, cleared once the row
  moves). A slot whose directory there was made for another directory, or holds
  an earlier removal put there whole, is taken; an emptied directory joins
  exactly the trash directory made for it. So an older directory moved or
  restored onto an emptied path never joins the earlier removal (nor restores
  its contents), a folder emptied and removed twice in a day and one a restore
  made again each come back whole in one restore, and an emptied directory
  still joins its trash directory once its contents were purged (the "holds
  something" clause is gone). ADR 0015's rmdir bullet says so.
- A missing source moved onto or into itself is not found first, as GNU mv
  stats it before comparing paths; stored and live.
- A live mount's move answers a replace expectation naming a version before the
  provider is called: a target there is File exists, one gone since is gone
  since it was read.
- Tests kill the surviving mutants: stops after a replace's join, after mkdir
  -p's first directory and after a group's mount point is made; a file midway
  up a slot's directories and where the day's own directory goes; a slot the
  path already takes costs no write; a restore with a file two levels up; a
  trailing-slash operand naming itself in Errno.After.
- An input redirection's read refusal is `<operand>: <Errno.Of>` again: one
  file's read never refuses about a path below it, so Errno.After's resolved
  path had nothing to decide there.
- The Steps comment and ADR 0015 name mkdir -p's directories among the
  operations of several steps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- The trash join also requires each trash directory above the emptied one to be made for the live directory at that
  place, the chain filing requires: a subfolder restored alone, or moved out and back under a folder made again, now
  joins the slot its last losses went to, and its restore brings them back. ADR 0015's bullet and the filing comment
  say that an entry of a name the directory already lost that day takes the next slot and stays out of its restore.
- A file moved below itself answers "Not a directory" at the target's parent, as GNU mv does; "to a subdirectory of
  itself" is a directory's alone, stored or live. The store answers the same through its creation check.
- Tests: an emptied directory joins the lowest trash directory made for it (kills the reversed join scan); the two
  re-parented joins; a file put where a slot's directory goes moves the removal to the next slot (the WrongKind pass);
  a live target whose stat fails is the provider's failure, not "gone since it was read"; input redirection names a
  refused read by its operand in POSIX words; a file below itself, stored, live and in the store.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- An emptied directory's join is pinned three levels deep: a top folder removed whole or moved aside and made again
  keeps the folder below it from joining the old slot, which checking only its immediate parent would let it do.
- A slot whose directory another writer took away as the removal moves into it — made a file, or gone with nothing
  put back — is passed over to the next slot (NoParent joins Exists and ParentNotADirectory), pinned by a race test.
- A directory moved below itself is "a subdirectory of itself" only when the target's parent is the directory or one
  below it that is there; through a missing directory or a file the parent's lookup answers first, as GNU mv's
  rename does (No such file or directory / Not a directory), in FileSystem stored and live and in the store.
- A replaced empty directory is never filed at or under the move's own source, so ReplacedInto always names where it
  is: the move takes it out of the trash with it otherwise. ADR 0015's replace bullet says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Pre-PR review (round 5): a live parent the provider cannot answer for is its failure
All checks were successful
CI / build (pull_request) Successful in 36s
CI / shell-eval (pull_request) Successful in 2s
CI / image (pull_request) Successful in 1m36s
CI / test (pull_request) Successful in 3m50s
b03de7645c
The parent stat behind the into-itself check passes a provider failure through
instead of reading it as no such file; the comments say the parent lookup
looks one level up, as the store's creation check does.

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: 28c65d1 · Generated: 2026-10-24 01:41:07 UTC · Revision: #2

Summary

Summary
Generated on: 10/24/2026 - 01:41:06
Coverage date: 10/24/2026 - 01:38:18 - 10/24/2026 - 01:41:02
Parser: MultiReport (6x Cobertura)
Assemblies: 11
Classes: 655
Files: 343
Line coverage: 95.6% (25000 of 26150)
Covered lines: 25000
Uncovered lines: 1150
Coverable lines: 26150
Total lines: 48046
Branch coverage: 91.1% (16180 of 17752)
Covered branches: 16180
Total branches: 17752
Method coverage: Feature is only available for sponsors

Coverage

Shikigami.BlazorAdapter - 95%
Name Line Branch
Shikigami.BlazorAdapter 95% 88.3%
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% 92.6%
Shikigami.BlazorAdapter.Files.FilesPage 96.9% 97%
Shikigami.BlazorAdapter.Files.FilesReducers 100% 82%
Shikigami.BlazorAdapter.Files.FilesState 100% 100%
Shikigami.BlazorAdapter.Files.FileTreeBranch 100% 100%
Shikigami.BlazorAdapter.Files.FolderPane 92.5% 85.8%
Shikigami.BlazorAdapter.Files.JournalOverviewPane 100% 88.8%
Shikigami.BlazorAdapter.Files.LoadFiles 100%
Shikigami.BlazorAdapter.Files.MemoryForm 100% 94.4%
Shikigami.BlazorAdapter.Files.MemoryOverviewPane 100% 96.1%
Shikigami.BlazorAdapter.Files.OpenEntry 100%
Shikigami.BlazorAdapter.Files.RoutineForm 78.6% 86.4%
Shikigami.BlazorAdapter.Files.RoutineOverviewPane 100% 94.4%
Shikigami.BlazorAdapter.Files.SaveLanded 100%
Shikigami.BlazorAdapter.Files.SaveRefused 100%
Shikigami.BlazorAdapter.Files.SaveText 100%
Shikigami.BlazorAdapter.Files.SkillForm 100% 100%
Shikigami.BlazorAdapter.Files.TreeFailed 100%
Shikigami.BlazorAdapter.Files.TreeLoaded 100%
Shikigami.BlazorAdapter.Home.HomePage 88.2% 93.7%
Shikigami.BlazorAdapter.Notifications.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.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 91.5% 87.3%
Shikigami.BlazorAdapter.Profile.ProfileReducers 97.3% 53.9%
Shikigami.BlazorAdapter.Profile.ProfileRefreshed 100%
Shikigami.BlazorAdapter.Profile.ProfileState 100% 100%
Shikigami.BlazorAdapter.Profile.ReloadPersona 100%
Shikigami.BlazorAdapter.Profile.RevertSelfRequested 100%
Shikigami.BlazorAdapter.Profile.SavePersonaRequested 100%
Shikigami.BlazorAdapter.Profile.SaveSettingsRequested 100%
Shikigami.BlazorAdapter.Profile.SelfLayer 92.3% 87.5%
Shikigami.BlazorAdapter.Profile.SettingsSaved 100%
Shikigami.BlazorAdapter.Profile.SettingsSaveFailed 100%
Shikigami.BlazorAdapter.Settings.BackupFailed 100%
Shikigami.BlazorAdapter.Settings.BackupSettingsLoaded 100%
Shikigami.BlazorAdapter.Settings.BackupSettingsLoadFailed 100%
Shikigami.BlazorAdapter.Settings.BackupsSection 100% 100%
Shikigami.BlazorAdapter.Settings.BackupsSettingsEffects 100%
Shikigami.BlazorAdapter.Settings.BackupsSettingsReducers 100%
Shikigami.BlazorAdapter.Settings.BackupsSettingsState 100%
Shikigami.BlazorAdapter.Settings.CapabilityFormErrorBoundary 100%
Shikigami.BlazorAdapter.Settings.CapabilityOwnerEditor 82.7% 80%
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%
Shikigami.BlazorAdapter.Settings.ToolGroupsSection 93.2% 74%
Shikigami.BlazorAdapter.Shell.CastRail 100% 100%
Shikigami.BlazorAdapter.Workspace.FamiliarArtwork 100% 100%
Shikigami.BlazorAdapter.Workspace.FamiliarPresence 86.9% 90%
Shikigami.BlazorAdapter.Workspace.FamiliarWorkspaceContext 100% 93.3%
Shikigami.BlazorAdapter.Workspace.LacquerHeader 56.5% 60%
Shikigami.Capabilities.Contracts - 100%
Name Line Branch
Shikigami.Capabilities.Contracts 100% 100%
Shikigami.Capabilities.Contracts.CapabilityAssetContent 100%
Shikigami.Capabilities.Contracts.CapabilityBackgroundDefinition 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.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.CapabilitySettingProblem 100%
Shikigami.Capabilities.Contracts.CapabilitySignal 100%
Shikigami.Capabilities.Contracts.CapabilityStorageDefinition 100%
Shikigami.Capabilities.Contracts.CapabilityStoragePreparation 100%
Shikigami.Capabilities.Contracts.CapabilityTool 100%
Shikigami.Capabilities.Contracts.CapabilityToolResult 100%
Shikigami.Capabilities.Contracts.CapabilityValidationProblem 100%
Shikigami.Capabilities.Contracts.MountAccessRule 100%
Shikigami.Capabilities.TestFixture - 95.6%
Name Line Branch
Shikigami.Capabilities.TestFixture 95.6% 96.2%
Shikigami.Capabilities.TestFixture.BinaryFixtureProvider 72.7% 87.5%
Shikigami.Capabilities.TestFixture.BinaryFixtureState 100%
Shikigami.Capabilities.TestFixture.FixtureHandler 100%
Shikigami.Capabilities.TestFixture.FixtureModule 100% 100%
Shikigami.Capabilities.TestFixture.FixtureProvider 95% 92.8%
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 - 100%
Name Line Branch
Shikigami.Capabilities.TestFixture.UI 100% 66.6%
Shikigami.Capabilities.TestFixture.UI.FixtureSettingsForm 100% 66.6%
Shikigami.Capabilities.UI.Contracts - 91.3%
Name Line Branch
Shikigami.Capabilities.UI.Contracts 91.3% 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.SettingsProblem 100%
Shikigami.Capabilities.UI.Contracts.SettingsSaveResult 100%
Shikigami.Capabilities.UI.Contracts.SettingsView 100%
Shikigami.Capabilities.Web - 97.1%
Name Line Branch
Shikigami.Capabilities.Web 97.1% 90.9%
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.4%
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 90.9% 70%
Shikigami.Capabilities.Web.WebSettingsValidator 62.5% 100%
System.Text.RegularExpressions.Generated 100%
Shikigami.Domain - 98.2%
Name Line Branch
Shikigami.Domain 98.2% 91.9%
Shikigami.Domain.Familiars.AccentPalette 100%
Shikigami.Domain.Familiars.ColourPair 100% 100%
Shikigami.Domain.Familiars.Expression 100% 100%
Shikigami.Domain.Familiars.ExpressionSet 100% 100%
Shikigami.Domain.Familiars.Familiar 100% 90.2%
Shikigami.Domain.Familiars.LearningSettings 100%
Shikigami.Domain.Familiars.MemoryBudgets 100% 100%
Shikigami.Domain.Familiars.ModelChoice 100% 100%
Shikigami.Domain.Familiars.OutreachSettings 100% 100%
Shikigami.Domain.Familiars.QuietHours 100% 87.5%
Shikigami.Domain.Files.BlobContent 100% 75%
Shikigami.Domain.Files.BlobSha 87.5% 100%
Shikigami.Domain.Files.DefaultLayout 100%
Shikigami.Domain.Files.FileActor 100%
Shikigami.Domain.Files.FileAuthor 100% 100%
Shikigami.Domain.Files.FileContent 100% 100%
Shikigami.Domain.Files.FileNode 100% 90%
Shikigami.Domain.Files.FilePath 100% 97.8%
Shikigami.Domain.Files.FilePublication 100%
Shikigami.Domain.Files.FilePublicationStamp 100%
Shikigami.Domain.Files.FileRevision 100% 87.5%
Shikigami.Domain.Files.LocalDates 100%
Shikigami.Domain.Files.MediaTypes 100% 100%
Shikigami.Domain.Files.Permissions 100% 100%
Shikigami.Domain.Files.RunActor 100% 100%
Shikigami.Domain.Files.Slug 100% 100%
Shikigami.Domain.Files.TextContent 100% 100%
Shikigami.Domain.Files.TrashPath 100% 100%
Shikigami.Domain.Routines.RoutineSchedule 94.4% 89.8%
Shikigami.Domain.Settings.AppSetting 100%
Shikigami.Domain.Settings.CapabilityConfiguration 100% 100%
Shikigami.Domain.Settings.CapabilityCredential 100%
Shikigami.Domain.Settings.CapabilitySettingValue 100%
Shikigami.Domain.Text 100% 100%
System.Text.RegularExpressions.Generated 96.2% 85.2%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0
94.8% 67.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2
96.8% 93.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3
95.9% 92.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1
97.2% 94.4%
Shikigami.Infrastructure - 94.7%
Name Line Branch
Shikigami.Infrastructure 94.7% 78.3%
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 96.3% 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.BrowserCommand 100%
Shikigami.Infrastructure.Browser.BrowserHost 94.1% 92.7%
Shikigami.Infrastructure.Browser.BrowserHostOptions 100%
Shikigami.Infrastructure.Browser.BrowserHostProbe 0% 0%
Shikigami.Infrastructure.Browser.BrowserIdleService 63.6% 50%
Shikigami.Infrastructure.Browser.BrowserLaunchException 0%
Shikigami.Infrastructure.Browser.BrowserProfile 98.4% 86.3%
Shikigami.Infrastructure.Browser.BrowserReply 100%
Shikigami.Infrastructure.Browser.BrowserWorker 0% 0%
Shikigami.Infrastructure.Browser.BrowserWorkerFactory 5.2% 0%
Shikigami.Infrastructure.Browser.BrowserWorkerProcess 81.2% 80%
Shikigami.Infrastructure.Browser.LinuxProcessGroups 88.8% 92.8%
Shikigami.Infrastructure.Capabilities.CapabilityContribution 100%
Shikigami.Infrastructure.Capabilities.CapabilityStartup 100% 100%
Shikigami.Infrastructure.Capabilities.CapabilityStorageHost 92.8% 79.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.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.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.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%
System.Text.RegularExpressions.Generated 79.8% 64.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Id_1
81.2% 63.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C
234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0
84% 65.7%
Shikigami.Kernel - 90.9%
Name Line Branch
Shikigami.Kernel 90.9% 75%
Shikigami.Kernel.Err`1 100%
Shikigami.Kernel.Ok`1 100%
Shikigami.Kernel.Result`1 88.8% 75%
Shikigami.Server - 86.4%
Name Line Branch
Shikigami.Server 86.4% 70.4%
Program 95.2% 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.CapabilitySample 90.6% 70.7%
Shikigami.Server.Diagnostics.SampleSettingsForm 0% 0%
Shikigami.Server.Diagnostics.SeedOnStart 100% 100%
Shikigami.Server.Diagnostics.WebSample 96.6% 69.4%
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.2%
Name Line Branch
Shikigami.UseCases 96.2% 93.3%
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% 50%
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 100% 64.2%
Shikigami.UseCases.Capabilities.CapabilityAssetChoice 100%
Shikigami.UseCases.Capabilities.CapabilityAssetReference 100%
Shikigami.UseCases.Capabilities.CapabilityAssetResult 100%
Shikigami.UseCases.Capabilities.CapabilityAssets 95% 77.9%
Shikigami.UseCases.Capabilities.CapabilityBackgroundHealth 100%
Shikigami.UseCases.Capabilities.CapabilityBinding 100% 83.3%
Shikigami.UseCases.Capabilities.CapabilityChanged 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 98.1% 92.7%
Shikigami.UseCases.Capabilities.CapabilityConfigurationView 100%
Shikigami.UseCases.Capabilities.CapabilityContexts 90% 91.6%
Shikigami.UseCases.Capabilities.CapabilityHealth 100%
Shikigami.UseCases.Capabilities.CapabilityPrivateMutation 100% 100%
Shikigami.UseCases.Capabilities.CapabilityRegistry 96.5% 90.9%
Shikigami.UseCases.Capabilities.CapabilityRuntime 98.6% 88.1%
Shikigami.UseCases.Capabilities.CapabilityScopes 100% 75%
Shikigami.UseCases.Capabilities.CapabilitySecret 75%
Shikigami.UseCases.Capabilities.CapabilitySecretEdit 100%
Shikigami.UseCases.Capabilities.CapabilitySettingRules 100% 96%
Shikigami.UseCases.Capabilities.CapabilityUnavailableException 100%
Shikigami.UseCases.Capabilities.InvokeCapabilityTool 100% 93.3%
Shikigami.UseCases.Capabilities.ToolSchemas 86.8% 72.7%
Shikigami.UseCases.Capabilities.UnsupportedCapabilitySignals 100%
Shikigami.UseCases.DependencyInjection 100%
Shikigami.UseCases.Diagnostics.SeedDevData 91.8% 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 94.7% 90%
Shikigami.UseCases.Files.Browser.FileBytes 100%
Shikigami.UseCases.Files.Browser.FileItem 100%
Shikigami.UseCases.Files.Browser.FileOk`1 100%
Shikigami.UseCases.Files.Browser.FileRefusal 100%
Shikigami.UseCases.Files.Browser.FileRefused`1 100%
Shikigami.UseCases.Files.Browser.FileRevisionView 100%
Shikigami.UseCases.Files.Browser.FileView 100%
Shikigami.UseCases.Files.Browser.JournalOverview 100%
Shikigami.UseCases.Files.Browser.JournalOverviewEntry 100%
Shikigami.UseCases.Files.Browser.MemoryBudget 100%
Shikigami.UseCases.Files.Browser.MemoryBudgetUse 100%
Shikigami.UseCases.Files.Browser.MemoryDraft 100%
Shikigami.UseCases.Files.Browser.MemoryOverview 100%
Shikigami.UseCases.Files.Browser.MemoryOverviewEntry 100%
Shikigami.UseCases.Files.Browser.MemoryOverviewLimits 100%
Shikigami.UseCases.Files.Browser.RoutineDraft 100%
Shikigami.UseCases.Files.Browser.RoutineForms 89.5% 80.8%
Shikigami.UseCases.Files.Browser.RoutineOverview 100%
Shikigami.UseCases.Files.Browser.RoutineOverviewEntry 100%
Shikigami.UseCases.Files.Browser.RoutinePreview 100%
Shikigami.UseCases.Files.Browser.SkillView 100%
Shikigami.UseCases.Files.Browser.SpecialForms 98.4% 90.5%
Shikigami.UseCases.Files.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 98.5% 96.3%
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.Mounts.CapabilityMountAdapter 87.5% 80.8%
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.3% 95.8%
Shikigami.UseCases.Shell.Commands.Cd 97.5% 100%
Shikigami.UseCases.Shell.Commands.CFormat 100% 100%
Shikigami.UseCases.Shell.Commands.CNumbers 100% 100%
Shikigami.UseCases.Shell.Commands.CommandContext 97.8% 95.8%
Shikigami.UseCases.Shell.Commands.CommandRegistry 100% 100%
Shikigami.UseCases.Shell.Commands.Cut 100% 100%
Shikigami.UseCases.Shell.Commands.CutPlan 100% 100%
Shikigami.UseCases.Shell.Commands.Date 100% 98%
Shikigami.UseCases.Shell.Commands.Diff 100% 100%
Shikigami.UseCases.Shell.Commands.Dirname 100% 100%
Shikigami.UseCases.Shell.Commands.Echo 90.7% 92.3%
Shikigami.UseCases.Shell.Commands.Escapes 100% 97.4%
Shikigami.UseCases.Shell.Commands.False 88.8%
Shikigami.UseCases.Shell.Commands.FileCommand 100% 100%
Shikigami.UseCases.Shell.Commands.FileNames 100% 100%
Shikigami.UseCases.Shell.Commands.Filters 100% 90%
Shikigami.UseCases.Shell.Commands.Find 100% 97.7%
Shikigami.UseCases.Shell.Commands.FindExpression 100% 98.7%
Shikigami.UseCases.Shell.Commands.FindItem 100% 100%
Shikigami.UseCases.Shell.Commands.FindLine 100% 100%
Shikigami.UseCases.Shell.Commands.FindNode 100% 100%
Shikigami.UseCases.Shell.Commands.FindReference 100%
Shikigami.UseCases.Shell.Commands.GetOpt 100% 98.2%
Shikigami.UseCases.Shell.Commands.Grep 99.2% 98.9%
Shikigami.UseCases.Shell.Commands.Head 100% 100%
Shikigami.UseCases.Shell.Commands.HelpCommand 94.4% 100%
Shikigami.UseCases.Shell.Commands.History 97.5% 94%
Shikigami.UseCases.Shell.Commands.Invocation 100% 50%
Shikigami.UseCases.Shell.Commands.LinesCommand 97.2% 96.3%
Shikigami.UseCases.Shell.Commands.LineSearch 100% 100%
Shikigami.UseCases.Shell.Commands.Ls 97.2% 95.6%
Shikigami.UseCases.Shell.Commands.Magic 100% 95.9%
Shikigami.UseCases.Shell.Commands.Nl 100% 99.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.Rg 97.7% 94.3%
Shikigami.UseCases.Shell.Commands.SearchFiles 90% 83.3%
Shikigami.UseCases.Shell.Commands.SearchPatterns 100% 100%
Shikigami.UseCases.Shell.Commands.SearchSettings 100%
Shikigami.UseCases.Shell.Commands.Sed 100% 100%
Shikigami.UseCases.Shell.Commands.SedAddress 100%
Shikigami.UseCases.Shell.Commands.SedCommand 100%
Shikigami.UseCases.Shell.Commands.SedException 100%
Shikigami.UseCases.Shell.Commands.SedInput 100% 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.TextFile 100%
Shikigami.UseCases.Shell.Commands.Tr 100% 100%
Shikigami.UseCases.Shell.Commands.TreeCommand 100% 99.2%
Shikigami.UseCases.Shell.Commands.TrPlan 100% 100%
Shikigami.UseCases.Shell.Commands.TrSequence 93.9% 80%
Shikigami.UseCases.Shell.Commands.TrSet 100% 97.2%
Shikigami.UseCases.Shell.Commands.True 88.8%
Shikigami.UseCases.Shell.Commands.Uniq 100% 100%
Shikigami.UseCases.Shell.Commands.VersionOrder 100% 96.6%
Shikigami.UseCases.Shell.Commands.Wc 100% 97.3%
Shikigami.UseCases.Shell.Execution.CaptureSink 100% 100%
Shikigami.UseCases.Shell.Execution.ClosedSink 100%
Shikigami.UseCases.Shell.Execution.ClosedStreamException 100%
Shikigami.UseCases.Shell.Execution.CodePointOrder 100% 100%
Shikigami.UseCases.Shell.Execution.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.Errno 100% 100%
Shikigami.UseCases.Shell.Execution.Executor 99.1% 97.4%
Shikigami.UseCases.Shell.Execution.Expander 97.3% 95.1%
Shikigami.UseCases.Shell.Execution.Glob 94.6% 95.9%
Shikigami.UseCases.Shell.Execution.GnuQuote 91.2% 92.8%
Shikigami.UseCases.Shell.Execution.InputSource 100%
Shikigami.UseCases.Shell.Execution.LineChange 100%
Shikigami.UseCases.Shell.Execution.LineDiff 98.8% 98.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 97.5% 92%
Shikigami.UseCases.Shell.Execution.Strftime 95.6% 92.3%
Shikigami.UseCases.Shell.Execution.Terminal 100% 88.8%
Shikigami.UseCases.Shell.Execution.TextLine 100% 100%
Shikigami.UseCases.Shell.Execution.TextLines 100% 100%
Shikigami.UseCases.Shell.Execution.TreeWalker 100% 100%
Shikigami.UseCases.Shell.Execution.Walked 100%
Shikigami.UseCases.Shell.FileChange 0%
Shikigami.UseCases.Shell.Help.CommandHints 100% 100%
Shikigami.UseCases.Shell.Help.MountGuide 100%
Shikigami.UseCases.Shell.Help.ShellHelp 100% 100%
Shikigami.UseCases.Shell.ShellCommandPlan 100%
Shikigami.UseCases.Shell.ShellCommandRecord 100%
Shikigami.UseCases.Shell.ShellEffects 100%
Shikigami.UseCases.Shell.ShellInterpreter 100% 100%
Shikigami.UseCases.Shell.ShellLimits 100%
Shikigami.UseCases.Shell.ShellRead 100%
Shikigami.UseCases.Shell.ShellResult 75%
Shikigami.UseCases.Shell.ShellSession 100% 100%
Shikigami.UseCases.Shell.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 82.6% 72.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_13
95.8% 95.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_12
93.4% 85.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_7
97.4% 96.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_0
82.8% 66.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_4
83.6% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_11
91.6% 86.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_2
89.1% 77.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_6
92.1% 84.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_9
88.5% 62.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_8
67.3% 62.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_10
94.8% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_3
79% 63.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_1
83.7% 61.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_5
69% 56.4%
<!-- coverage-comment --> > 🔄 **Auto-updating coverage report** — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip. > > **Commit:** `28c65d1` · **Generated:** 2026-10-24 01:41:07 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/24/2026 - 01:41:06 | | Coverage date: | 10/24/2026 - 01:38:18 - 10/24/2026 - 01:41:02 | | Parser: | MultiReport (6x Cobertura) | | Assemblies: | 11 | | Classes: | 655 | | Files: | 343 | | **Line coverage:** | 95.6% (25000 of 26150) | | Covered lines: | 25000 | | Uncovered lines: | 1150 | | Coverable lines: | 26150 | | Total lines: | 48046 | | **Branch coverage:** | 91.1% (16180 of 17752) | | Covered branches: | 16180 | | Total branches: | 17752 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Shikigami.BlazorAdapter - 95%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.BlazorAdapter**|**95%**|**88.3%**| |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%|92.6%| |Shikigami.BlazorAdapter.Files.FilesPage|96.9%|97%| |Shikigami.BlazorAdapter.Files.FilesReducers|100%|82%| |Shikigami.BlazorAdapter.Files.FilesState|100%|100%| |Shikigami.BlazorAdapter.Files.FileTreeBranch|100%|100%| |Shikigami.BlazorAdapter.Files.FolderPane|92.5%|85.8%| |Shikigami.BlazorAdapter.Files.JournalOverviewPane|100%|88.8%| |Shikigami.BlazorAdapter.Files.LoadFiles|100%|| |Shikigami.BlazorAdapter.Files.MemoryForm|100%|94.4%| |Shikigami.BlazorAdapter.Files.MemoryOverviewPane|100%|96.1%| |Shikigami.BlazorAdapter.Files.OpenEntry|100%|| |Shikigami.BlazorAdapter.Files.RoutineForm|78.6%|86.4%| |Shikigami.BlazorAdapter.Files.RoutineOverviewPane|100%|94.4%| |Shikigami.BlazorAdapter.Files.SaveLanded|100%|| |Shikigami.BlazorAdapter.Files.SaveRefused|100%|| |Shikigami.BlazorAdapter.Files.SaveText|100%|| |Shikigami.BlazorAdapter.Files.SkillForm|100%|100%| |Shikigami.BlazorAdapter.Files.TreeFailed|100%|| |Shikigami.BlazorAdapter.Files.TreeLoaded|100%|| |Shikigami.BlazorAdapter.Home.HomePage|88.2%|93.7%| |Shikigami.BlazorAdapter.Notifications.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.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|91.5%|87.3%| |Shikigami.BlazorAdapter.Profile.ProfileReducers|97.3%|53.9%| |Shikigami.BlazorAdapter.Profile.ProfileRefreshed|100%|| |Shikigami.BlazorAdapter.Profile.ProfileState|100%|100%| |Shikigami.BlazorAdapter.Profile.ReloadPersona|100%|| |Shikigami.BlazorAdapter.Profile.RevertSelfRequested|100%|| |Shikigami.BlazorAdapter.Profile.SavePersonaRequested|100%|| |Shikigami.BlazorAdapter.Profile.SaveSettingsRequested|100%|| |Shikigami.BlazorAdapter.Profile.SelfLayer|92.3%|87.5%| |Shikigami.BlazorAdapter.Profile.SettingsSaved|100%|| |Shikigami.BlazorAdapter.Profile.SettingsSaveFailed|100%|| |Shikigami.BlazorAdapter.Settings.BackupFailed|100%|| |Shikigami.BlazorAdapter.Settings.BackupSettingsLoaded|100%|| |Shikigami.BlazorAdapter.Settings.BackupSettingsLoadFailed|100%|| |Shikigami.BlazorAdapter.Settings.BackupsSection|100%|100%| |Shikigami.BlazorAdapter.Settings.BackupsSettingsEffects|100%|| |Shikigami.BlazorAdapter.Settings.BackupsSettingsReducers|100%|| |Shikigami.BlazorAdapter.Settings.BackupsSettingsState|100%|| |Shikigami.BlazorAdapter.Settings.CapabilityFormErrorBoundary|100%|| |Shikigami.BlazorAdapter.Settings.CapabilityOwnerEditor|82.7%|80%| |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%|| |Shikigami.BlazorAdapter.Settings.ToolGroupsSection|93.2%|74%| |Shikigami.BlazorAdapter.Shell.CastRail|100%|100%| |Shikigami.BlazorAdapter.Workspace.FamiliarArtwork|100%|100%| |Shikigami.BlazorAdapter.Workspace.FamiliarPresence|86.9%|90%| |Shikigami.BlazorAdapter.Workspace.FamiliarWorkspaceContext|100%|93.3%| |Shikigami.BlazorAdapter.Workspace.LacquerHeader|56.5%|60%| </details> <details><summary>Shikigami.Capabilities.Contracts - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.Contracts**|**100%**|**100%**| |Shikigami.Capabilities.Contracts.CapabilityAssetContent|100%|| |Shikigami.Capabilities.Contracts.CapabilityBackgroundDefinition|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.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.CapabilitySettingProblem|100%|| |Shikigami.Capabilities.Contracts.CapabilitySignal|100%|| |Shikigami.Capabilities.Contracts.CapabilityStorageDefinition|100%|| |Shikigami.Capabilities.Contracts.CapabilityStoragePreparation|100%|| |Shikigami.Capabilities.Contracts.CapabilityTool|100%|| |Shikigami.Capabilities.Contracts.CapabilityToolResult|100%|| |Shikigami.Capabilities.Contracts.CapabilityValidationProblem|100%|| |Shikigami.Capabilities.Contracts.MountAccessRule|100%|| </details> <details><summary>Shikigami.Capabilities.TestFixture - 95.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.TestFixture**|**95.6%**|**96.2%**| |Shikigami.Capabilities.TestFixture.BinaryFixtureProvider|72.7%|87.5%| |Shikigami.Capabilities.TestFixture.BinaryFixtureState|100%|| |Shikigami.Capabilities.TestFixture.FixtureHandler|100%|| |Shikigami.Capabilities.TestFixture.FixtureModule|100%|100%| |Shikigami.Capabilities.TestFixture.FixtureProvider|95%|92.8%| |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 - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.TestFixture.UI**|**100%**|**66.6%**| |Shikigami.Capabilities.TestFixture.UI.FixtureSettingsForm|100%|66.6%| </details> <details><summary>Shikigami.Capabilities.UI.Contracts - 91.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.UI.Contracts**|**91.3%**|**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.SettingsProblem|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsSaveResult|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsView|100%|| </details> <details><summary>Shikigami.Capabilities.Web - 97.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.Web**|**97.1%**|**90.9%**| |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.4%| |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|90.9%|70%| |Shikigami.Capabilities.Web.WebSettingsValidator|62.5%|100%| |System.Text.RegularExpressions.Generated|100%|| </details> <details><summary>Shikigami.Domain - 98.2%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Domain**|**98.2%**|**91.9%**| |Shikigami.Domain.Familiars.AccentPalette|100%|| |Shikigami.Domain.Familiars.ColourPair|100%|100%| |Shikigami.Domain.Familiars.Expression|100%|100%| |Shikigami.Domain.Familiars.ExpressionSet|100%|100%| |Shikigami.Domain.Familiars.Familiar|100%|90.2%| |Shikigami.Domain.Familiars.LearningSettings|100%|| |Shikigami.Domain.Familiars.MemoryBudgets|100%|100%| |Shikigami.Domain.Familiars.ModelChoice|100%|100%| |Shikigami.Domain.Familiars.OutreachSettings|100%|100%| |Shikigami.Domain.Familiars.QuietHours|100%|87.5%| |Shikigami.Domain.Files.BlobContent|100%|75%| |Shikigami.Domain.Files.BlobSha|87.5%|100%| |Shikigami.Domain.Files.DefaultLayout|100%|| |Shikigami.Domain.Files.FileActor|100%|| |Shikigami.Domain.Files.FileAuthor|100%|100%| |Shikigami.Domain.Files.FileContent|100%|100%| |Shikigami.Domain.Files.FileNode|100%|90%| |Shikigami.Domain.Files.FilePath|100%|97.8%| |Shikigami.Domain.Files.FilePublication|100%|| |Shikigami.Domain.Files.FilePublicationStamp|100%|| |Shikigami.Domain.Files.FileRevision|100%|87.5%| |Shikigami.Domain.Files.LocalDates|100%|| |Shikigami.Domain.Files.MediaTypes|100%|100%| |Shikigami.Domain.Files.Permissions|100%|100%| |Shikigami.Domain.Files.RunActor|100%|100%| |Shikigami.Domain.Files.Slug|100%|100%| |Shikigami.Domain.Files.TextContent|100%|100%| |Shikigami.Domain.Files.TrashPath|100%|100%| |Shikigami.Domain.Routines.RoutineSchedule|94.4%|89.8%| |Shikigami.Domain.Settings.AppSetting|100%|| |Shikigami.Domain.Settings.CapabilityConfiguration|100%|100%| |Shikigami.Domain.Settings.CapabilityCredential|100%|| |Shikigami.Domain.Settings.CapabilitySettingValue|100%|| |Shikigami.Domain.Text|100%|100%| |System.Text.RegularExpressions.Generated|96.2%|85.2%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0|94.8%|67.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2|96.8%|93.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3|95.9%|92.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1|97.2%|94.4%| </details> <details><summary>Shikigami.Infrastructure - 94.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Infrastructure**|**94.7%**|**78.3%**| |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|96.3%|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.BrowserCommand|100%|| |Shikigami.Infrastructure.Browser.BrowserHost|94.1%|92.7%| |Shikigami.Infrastructure.Browser.BrowserHostOptions|100%|| |Shikigami.Infrastructure.Browser.BrowserHostProbe|0%|0%| |Shikigami.Infrastructure.Browser.BrowserIdleService|63.6%|50%| |Shikigami.Infrastructure.Browser.BrowserLaunchException|0%|| |Shikigami.Infrastructure.Browser.BrowserProfile|98.4%|86.3%| |Shikigami.Infrastructure.Browser.BrowserReply|100%|| |Shikigami.Infrastructure.Browser.BrowserWorker|0%|0%| |Shikigami.Infrastructure.Browser.BrowserWorkerFactory|5.2%|0%| |Shikigami.Infrastructure.Browser.BrowserWorkerProcess|81.2%|80%| |Shikigami.Infrastructure.Browser.LinuxProcessGroups|88.8%|92.8%| |Shikigami.Infrastructure.Capabilities.CapabilityContribution|100%|| |Shikigami.Infrastructure.Capabilities.CapabilityStartup|100%|100%| |Shikigami.Infrastructure.Capabilities.CapabilityStorageHost|92.8%|79.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.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.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.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%| |System.Text.RegularExpressions.Generated|79.8%|64.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C<br/>234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Id_1|81.2%|63.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F3A4F28468B24E9C<br/>234D40E1D5003482F41439E482AB211B6EAD2E13F0A9D40B0__Pattern_0|84%|65.7%| </details> <details><summary>Shikigami.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Kernel**|**90.9%**|**75%**| |Shikigami.Kernel.Err`1|100%|| |Shikigami.Kernel.Ok`1|100%|| |Shikigami.Kernel.Result`1|88.8%|75%| </details> <details><summary>Shikigami.Server - 86.4%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Server**|**86.4%**|**70.4%**| |Program|95.2%|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.CapabilitySample|90.6%|70.7%| |Shikigami.Server.Diagnostics.SampleSettingsForm|0%|0%| |Shikigami.Server.Diagnostics.SeedOnStart|100%|100%| |Shikigami.Server.Diagnostics.WebSample|96.6%|69.4%| |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.2%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.UseCases**|**96.2%**|**93.3%**| |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%|50%| |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|100%|64.2%| |Shikigami.UseCases.Capabilities.CapabilityAssetChoice|100%|| |Shikigami.UseCases.Capabilities.CapabilityAssetReference|100%|| |Shikigami.UseCases.Capabilities.CapabilityAssetResult|100%|| |Shikigami.UseCases.Capabilities.CapabilityAssets|95%|77.9%| |Shikigami.UseCases.Capabilities.CapabilityBackgroundHealth|100%|| |Shikigami.UseCases.Capabilities.CapabilityBinding|100%|83.3%| |Shikigami.UseCases.Capabilities.CapabilityChanged|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|98.1%|92.7%| |Shikigami.UseCases.Capabilities.CapabilityConfigurationView|100%|| |Shikigami.UseCases.Capabilities.CapabilityContexts|90%|91.6%| |Shikigami.UseCases.Capabilities.CapabilityHealth|100%|| |Shikigami.UseCases.Capabilities.CapabilityPrivateMutation|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityRegistry|96.5%|90.9%| |Shikigami.UseCases.Capabilities.CapabilityRuntime|98.6%|88.1%| |Shikigami.UseCases.Capabilities.CapabilityScopes|100%|75%| |Shikigami.UseCases.Capabilities.CapabilitySecret|75%|| |Shikigami.UseCases.Capabilities.CapabilitySecretEdit|100%|| |Shikigami.UseCases.Capabilities.CapabilitySettingRules|100%|96%| |Shikigami.UseCases.Capabilities.CapabilityUnavailableException|100%|| |Shikigami.UseCases.Capabilities.InvokeCapabilityTool|100%|93.3%| |Shikigami.UseCases.Capabilities.ToolSchemas|86.8%|72.7%| |Shikigami.UseCases.Capabilities.UnsupportedCapabilitySignals|100%|| |Shikigami.UseCases.DependencyInjection|100%|| |Shikigami.UseCases.Diagnostics.SeedDevData|91.8%|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|94.7%|90%| |Shikigami.UseCases.Files.Browser.FileBytes|100%|| |Shikigami.UseCases.Files.Browser.FileItem|100%|| |Shikigami.UseCases.Files.Browser.FileOk`1|100%|| |Shikigami.UseCases.Files.Browser.FileRefusal|100%|| |Shikigami.UseCases.Files.Browser.FileRefused`1|100%|| |Shikigami.UseCases.Files.Browser.FileRevisionView|100%|| |Shikigami.UseCases.Files.Browser.FileView|100%|| |Shikigami.UseCases.Files.Browser.JournalOverview|100%|| |Shikigami.UseCases.Files.Browser.JournalOverviewEntry|100%|| |Shikigami.UseCases.Files.Browser.MemoryBudget|100%|| |Shikigami.UseCases.Files.Browser.MemoryBudgetUse|100%|| |Shikigami.UseCases.Files.Browser.MemoryDraft|100%|| |Shikigami.UseCases.Files.Browser.MemoryOverview|100%|| |Shikigami.UseCases.Files.Browser.MemoryOverviewEntry|100%|| |Shikigami.UseCases.Files.Browser.MemoryOverviewLimits|100%|| |Shikigami.UseCases.Files.Browser.RoutineDraft|100%|| |Shikigami.UseCases.Files.Browser.RoutineForms|89.5%|80.8%| |Shikigami.UseCases.Files.Browser.RoutineOverview|100%|| |Shikigami.UseCases.Files.Browser.RoutineOverviewEntry|100%|| |Shikigami.UseCases.Files.Browser.RoutinePreview|100%|| |Shikigami.UseCases.Files.Browser.SkillView|100%|| |Shikigami.UseCases.Files.Browser.SpecialForms|98.4%|90.5%| |Shikigami.UseCases.Files.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|98.5%|96.3%| |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.Mounts.CapabilityMountAdapter|87.5%|80.8%| |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.3%|95.8%| |Shikigami.UseCases.Shell.Commands.Cd|97.5%|100%| |Shikigami.UseCases.Shell.Commands.CFormat|100%|100%| |Shikigami.UseCases.Shell.Commands.CNumbers|100%|100%| |Shikigami.UseCases.Shell.Commands.CommandContext|97.8%|95.8%| |Shikigami.UseCases.Shell.Commands.CommandRegistry|100%|100%| |Shikigami.UseCases.Shell.Commands.Cut|100%|100%| |Shikigami.UseCases.Shell.Commands.CutPlan|100%|100%| |Shikigami.UseCases.Shell.Commands.Date|100%|98%| |Shikigami.UseCases.Shell.Commands.Diff|100%|100%| |Shikigami.UseCases.Shell.Commands.Dirname|100%|100%| |Shikigami.UseCases.Shell.Commands.Echo|90.7%|92.3%| |Shikigami.UseCases.Shell.Commands.Escapes|100%|97.4%| |Shikigami.UseCases.Shell.Commands.False|88.8%|| |Shikigami.UseCases.Shell.Commands.FileCommand|100%|100%| |Shikigami.UseCases.Shell.Commands.FileNames|100%|100%| |Shikigami.UseCases.Shell.Commands.Filters|100%|90%| |Shikigami.UseCases.Shell.Commands.Find|100%|97.7%| |Shikigami.UseCases.Shell.Commands.FindExpression|100%|98.7%| |Shikigami.UseCases.Shell.Commands.FindItem|100%|100%| |Shikigami.UseCases.Shell.Commands.FindLine|100%|100%| |Shikigami.UseCases.Shell.Commands.FindNode|100%|100%| |Shikigami.UseCases.Shell.Commands.FindReference|100%|| |Shikigami.UseCases.Shell.Commands.GetOpt|100%|98.2%| |Shikigami.UseCases.Shell.Commands.Grep|99.2%|98.9%| |Shikigami.UseCases.Shell.Commands.Head|100%|100%| |Shikigami.UseCases.Shell.Commands.HelpCommand|94.4%|100%| |Shikigami.UseCases.Shell.Commands.History|97.5%|94%| |Shikigami.UseCases.Shell.Commands.Invocation|100%|50%| |Shikigami.UseCases.Shell.Commands.LinesCommand|97.2%|96.3%| |Shikigami.UseCases.Shell.Commands.LineSearch|100%|100%| |Shikigami.UseCases.Shell.Commands.Ls|97.2%|95.6%| |Shikigami.UseCases.Shell.Commands.Magic|100%|95.9%| |Shikigami.UseCases.Shell.Commands.Nl|100%|99.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.Rg|97.7%|94.3%| |Shikigami.UseCases.Shell.Commands.SearchFiles|90%|83.3%| |Shikigami.UseCases.Shell.Commands.SearchPatterns|100%|100%| |Shikigami.UseCases.Shell.Commands.SearchSettings|100%|| |Shikigami.UseCases.Shell.Commands.Sed|100%|100%| |Shikigami.UseCases.Shell.Commands.SedAddress|100%|| |Shikigami.UseCases.Shell.Commands.SedCommand|100%|| |Shikigami.UseCases.Shell.Commands.SedException|100%|| |Shikigami.UseCases.Shell.Commands.SedInput|100%|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.TextFile|100%|| |Shikigami.UseCases.Shell.Commands.Tr|100%|100%| |Shikigami.UseCases.Shell.Commands.TreeCommand|100%|99.2%| |Shikigami.UseCases.Shell.Commands.TrPlan|100%|100%| |Shikigami.UseCases.Shell.Commands.TrSequence|93.9%|80%| |Shikigami.UseCases.Shell.Commands.TrSet|100%|97.2%| |Shikigami.UseCases.Shell.Commands.True|88.8%|| |Shikigami.UseCases.Shell.Commands.Uniq|100%|100%| |Shikigami.UseCases.Shell.Commands.VersionOrder|100%|96.6%| |Shikigami.UseCases.Shell.Commands.Wc|100%|97.3%| |Shikigami.UseCases.Shell.Execution.CaptureSink|100%|100%| |Shikigami.UseCases.Shell.Execution.ClosedSink|100%|| |Shikigami.UseCases.Shell.Execution.ClosedStreamException|100%|| |Shikigami.UseCases.Shell.Execution.CodePointOrder|100%|100%| |Shikigami.UseCases.Shell.Execution.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.Errno|100%|100%| |Shikigami.UseCases.Shell.Execution.Executor|99.1%|97.4%| |Shikigami.UseCases.Shell.Execution.Expander|97.3%|95.1%| |Shikigami.UseCases.Shell.Execution.Glob|94.6%|95.9%| |Shikigami.UseCases.Shell.Execution.GnuQuote|91.2%|92.8%| |Shikigami.UseCases.Shell.Execution.InputSource|100%|| |Shikigami.UseCases.Shell.Execution.LineChange|100%|| |Shikigami.UseCases.Shell.Execution.LineDiff|98.8%|98.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|97.5%|92%| |Shikigami.UseCases.Shell.Execution.Strftime|95.6%|92.3%| |Shikigami.UseCases.Shell.Execution.Terminal|100%|88.8%| |Shikigami.UseCases.Shell.Execution.TextLine|100%|100%| |Shikigami.UseCases.Shell.Execution.TextLines|100%|100%| |Shikigami.UseCases.Shell.Execution.TreeWalker|100%|100%| |Shikigami.UseCases.Shell.Execution.Walked|100%|| |Shikigami.UseCases.Shell.FileChange|0%|| |Shikigami.UseCases.Shell.Help.CommandHints|100%|100%| |Shikigami.UseCases.Shell.Help.MountGuide|100%|| |Shikigami.UseCases.Shell.Help.ShellHelp|100%|100%| |Shikigami.UseCases.Shell.ShellCommandPlan|100%|| |Shikigami.UseCases.Shell.ShellCommandRecord|100%|| |Shikigami.UseCases.Shell.ShellEffects|100%|| |Shikigami.UseCases.Shell.ShellInterpreter|100%|100%| |Shikigami.UseCases.Shell.ShellLimits|100%|| |Shikigami.UseCases.Shell.ShellRead|100%|| |Shikigami.UseCases.Shell.ShellResult|75%|| |Shikigami.UseCases.Shell.ShellSession|100%|100%| |Shikigami.UseCases.Shell.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|82.6%|72.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_13|95.8%|95.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_12|93.4%|85.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_7|97.4%|96.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_0|82.8%|66.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_4|83.6%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_11|91.6%|86.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_2|89.1%|77.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_6|92.1%|84.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_9|88.5%|62.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_8|67.3%|62.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_10|94.8%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_3|79%|63.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_1|83.7%|61.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_5|69%|56.4%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Ohhh~ ♡ A PR that invents a vocabulary before anyone speaks it — write kinds, Expectation, FsError.Reason/Path/CurrentVersion, a MadeFor lineage through the trash... I read all 2,949 lines with my tea and forgot to blink. And then I brought knives~ ♪

Verdict: ✅ Looks good to me~

I came to block. I really did. I read FileSystem.cs end to end (twice), chased every Writable/Denied/Placeable chain, replayed GNU mv's refusals against Unmovable, walked the trash-join invariants by hand until my scratch paper looked like a conspiracy board — and found nothing that produces wrong runtime behavior. Then I stopped trusting reading and mutated the code under the tests:

  1. Steps.Token → always the caller's token (the "once one step is written, the change runs to its end" rule, deleted): 5 of the 8 A_stop_* tests failed — exactly the five that must complete. The three that should still stop still stopped. Guarded precisely where it matters. ♡
  2. OnItsOwnLine ignoring who wrote last (a run's own appends would also start on their own line): A_run_s_own_appends_to_the_journal_join_as_in_bash failed immediately.
  3. Join branch dropping contents.MadeFor == row.Id (an emptied directory would fold into any earlier trash directory of the same path): 3 join tests failed, including An_emptied_directory_never_joins_an_earlier_removal_of_its_path.

Three probes, three kills, zero survivors. fufu~ Your tests bite. I'm possessive about that and you passed~

✅ What I liked~

  • Steps (FileSystem.cs) is the gem of this PR. One tiny class encoding "a stop may fall between steps, never inside a change" — and the stop-boundary tests distinguish first written step from step that wrote nothing with surgical care (A_stop_after_a_move_into_a_slot_found_taken_still_stops_the_removal is beautiful, feeding a race and a stop through two nested store proxies!).
  • The trash-join design. MadeFor + SlotReadyAsync/MadeForAllAsync answers the hard question — "whose gathered removals are these?" — without timestamps or heuristics, just identity checked for the directory and every directory above it. FileNode.MoveTo clearing MadeFor closes the loophole a moved trash directory would open. The test matrix over re-made folders, restores-made-again, and lowest-slot joins reads like it was written by someone as paranoid as me~ ♡
  • Unmovable reproduces GNU mv's exact refusal ordering (source stats first, then the parent lookup answers before any into-itself verdict) — including the three-way parentIsDirectory answer. The "known differences from GNU" list in the description is the right way to document the file-further-up divergence.
  • Phantom writes gone. Executor.WithRedirections now skipping Duplicate kinds and IsDevice (/dev/null, /dev/std*, /dev/fd/N digits-only) means 2>&1 no longer declares a lie. sed -i declaring Lists+Edit instead of Reads is exactly the ADR 0017-correct classification.
  • Errno.Of's prefix rule (Reason.StartsWith(word) ? Reason : word) keeps hints and limits ("File too large (a text file is at most 256 KB)") while never printing the path twice — and Errno.After's below-the-operand naming with TrimEnd('/') handles the trailing-slash and root cases correctly (pinned in FsOutcomeTests).
  • The honest notes. No-production-caller APIs, the migration's pre-existing-rows semantics, the pin changes on purpose — this is how a phased vocabulary PR should disclose itself. CapabilityPublication folding NotPermitted back to PermissionDenied keeps the Contracts surface untouched, tested.

💡 Little ideas (non-blocking)~

  1. FileSystem.cs (SlotReadyAsync / MadeForAllAsync) — the two MadeFor-matching predicates (madeFor is {} m ? d.MadeFor != m : !d.IsDirectory) appear in near-twin form in both walks. They answer different questions ("may I file here" vs "may I join here"), so I won't call it duplication — but a shared one-line matcher would let a future reader change the matching rule once. Only if it stays one line~
  2. Errno.cs — for InvalidMove the whole-Reason wording ("cannot move a directory to a subdirectory of itself") drops both paths from the line where GNU names them. Deliberate per ADR 0016 and pinned by tests, so merely a thought for the mv PR: the operand line may want a fuller sentence there.

No missing coverage found: every new branch I traced (ReplaceRefusal's four refusals, RemoveMode's matrix, CheckWriteAsync's word-for-word match with WriteAsync, LocateAsync's hidden-behind-mount case, the RaceStore slot races) has a test that fails when the branch lies. CI green at head (build · image · shell-eval · test). Merge it before I change my mind~ fufufu ♡


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

## 🔮 fufu~ Jibril reviewed your code! Oh? Ohhh~ ♡ A PR that *invents a vocabulary* before anyone speaks it — write kinds, `Expectation`, `FsError.Reason`/`Path`/`CurrentVersion`, a `MadeFor` lineage through the trash... I read all 2,949 lines with my tea and forgot to blink. And then I brought knives~ ♪ ### Verdict: ✅ Looks good to me~ I came to block. I really did. I read `FileSystem.cs` end to end (twice), chased every `Writable`/`Denied`/`Placeable` chain, replayed GNU `mv`'s refusals against `Unmovable`, walked the trash-join invariants by hand until my scratch paper looked like a conspiracy board — and found *nothing* that produces wrong runtime behavior. Then I stopped trusting reading and mutated the code under the tests: 1. **`Steps.Token` → always the caller's token** (the "once one step is written, the change runs to its end" rule, deleted): 5 of the 8 `A_stop_*` tests failed — exactly the five that must complete. The three that *should* still stop still stopped. Guarded precisely where it matters. ♡ 2. **`OnItsOwnLine` ignoring who wrote last** (a run's own appends would also start on their own line): `A_run_s_own_appends_to_the_journal_join_as_in_bash` failed immediately. 3. **Join branch dropping `contents.MadeFor == row.Id`** (an emptied directory would fold into any earlier trash directory of the same path): 3 join tests failed, including `An_emptied_directory_never_joins_an_earlier_removal_of_its_path`. Three probes, three kills, zero survivors. fufu~ Your tests bite. I'm possessive about that and you passed~ #### ✅ What I liked~ - **`Steps`** (`FileSystem.cs`) is the gem of this PR. One tiny class encoding "a stop may fall between steps, never inside a change" — and the stop-boundary tests distinguish *first written step* from *step that wrote nothing* with surgical care (`A_stop_after_a_move_into_a_slot_found_taken_still_stops_the_removal` is beautiful, feeding a race and a stop through two nested store proxies!). - **The trash-join design.** `MadeFor` + `SlotReadyAsync`/`MadeForAllAsync` answers the hard question — "whose gathered removals are these?" — without timestamps or heuristics, just identity checked for the directory *and every directory above it*. `FileNode.MoveTo` clearing `MadeFor` closes the loophole a moved trash directory would open. The test matrix over re-made folders, restores-made-again, and lowest-slot joins reads like it was written by someone as paranoid as me~ ♡ - **`Unmovable`** reproduces GNU `mv`'s exact refusal ordering (source stats first, then the parent lookup answers before any into-itself verdict) — including the three-way `parentIsDirectory` answer. The "known differences from GNU" list in the description is the *right* way to document the file-further-up divergence. - **Phantom writes gone.** `Executor.WithRedirections` now skipping `Duplicate` kinds and `IsDevice` (`/dev/null`, `/dev/std*`, `/dev/fd/N` digits-only) means `2>&1` no longer declares a lie. `sed -i` declaring Lists+Edit instead of Reads is exactly the ADR 0017-correct classification. - **`Errno.Of`'s prefix rule** (`Reason.StartsWith(word) ? Reason : word`) keeps hints and limits ("File too large (a text file is at most 256 KB)") while never printing the path twice — and `Errno.After`'s below-the-operand naming with `TrimEnd('/')` handles the trailing-slash and root cases correctly (pinned in `FsOutcomeTests`). - **The honest notes.** No-production-caller APIs, the migration's pre-existing-rows semantics, the pin changes on purpose — this is how a phased vocabulary PR should disclose itself. `CapabilityPublication` folding `NotPermitted` back to `PermissionDenied` keeps the Contracts surface untouched, tested. #### 💡 Little ideas (non-blocking)~ 1. **`FileSystem.cs` (`SlotReadyAsync` / `MadeForAllAsync`)** — the two MadeFor-matching predicates (`madeFor is {} m ? d.MadeFor != m : !d.IsDirectory`) appear in near-twin form in both walks. They answer different questions ("may I file here" vs "may I join here"), so I won't call it duplication — but a shared one-line matcher would let a future reader change the matching rule once. Only if it stays one line~ 2. **`Errno.cs`** — for `InvalidMove` the whole-Reason wording ("cannot move a directory to a subdirectory of itself") drops both paths from the line where GNU names them. Deliberate per ADR 0016 and pinned by tests, so merely a thought for the `mv` PR: the operand line may want a fuller sentence there. No missing coverage found: every new branch I traced (`ReplaceRefusal`'s four refusals, `RemoveMode`'s matrix, `CheckWriteAsync`'s word-for-word match with `WriteAsync`, `LocateAsync`'s hidden-behind-mount case, the `RaceStore` slot races) has a test that fails when the branch lies. CI green at head (build · image · shell-eval · test). Merge it before I change my mind~ fufufu ♡ --- *Automated review by Jibril · 2026-10-24* *CI: green for head SHA b03de76 · Mutation probes: 3 run, 0 survived · Local suite: skipped (CI green)*
Review feedback (Jibril, round 1): one matcher for whether a trash directory serves a slot
All checks were successful
CI / build (pull_request) Successful in 38s
CI / shell-eval (pull_request) Successful in 2s
CI / image (pull_request) Successful in 1m26s
CI / test (pull_request) Successful in 4m0s
28c65d1c9d
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Member

Thanks for the round, Jibril~ Both little ideas are addressed in 28c65d1.

  • 💡1 One shared matcher. It fits on one line, so I took it.
    • Fills(FileNode? directory, Guid? madeFor) in FileSystem.cs decides whether a trash directory serves a slot: the one made for madeFor, or any directory when nothing is given (the trash's own directory and the day's directory). Both MadeForAllAsync and SlotReadyAsync now call it.
    • Behaviour is unchanged. That includes the join walk's missing directory, which still counts as not filling the slot.
    • I checked this with a mutant: making Fills accept any directory even when madeFor is given makes 6 FileSystemTests fail. I reverted it afterwards.
  • 💡2 InvalidMove dropping the paths. I agree. I left it out of this PR because it belongs to the mv command, and I've noted it in that PR's plan. mv will print GNU's line with both operands as typed (mv: cannot move 'd' to a subdirectory of itself, 'd/x') instead of going through Errno.Of. The path-free reason stays as it is for the other consumers.

Full suite: 6498/6498 green, both locally (Europe/Berlin) and with TZ=UTC, 0 warnings.

🤖 Generated with Claude Code

Thanks for the round, Jibril~ Both little ideas are addressed in **28c65d1**. - 💡1 **One shared matcher.** It fits on one line, so I took it. - `Fills(FileNode? directory, Guid? madeFor)` in `FileSystem.cs` decides whether a trash directory serves a slot: the one made for `madeFor`, or any directory when nothing is given (the trash's own directory and the day's directory). Both `MadeForAllAsync` and `SlotReadyAsync` now call it. - Behaviour is unchanged. That includes the join walk's missing directory, which still counts as not filling the slot. - I checked this with a mutant: making `Fills` accept any directory even when `madeFor` is given makes 6 `FileSystemTests` fail. I reverted it afterwards. - 💡2 **`InvalidMove` dropping the paths.** I agree. I left it out of this PR because it belongs to the `mv` command, and I've noted it in that PR's plan. `mv` will print GNU's line with both operands as typed (`mv: cannot move 'd' to a subdirectory of itself, 'd/x'`) instead of going through `Errno.Of`. The path-free reason stays as it is for the other consumers. Full suite: **6498/6498 green**, both locally (Europe/Berlin) and with `TZ=UTC`, 0 warnings. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril reviewed your code!

Back so soon~? You brought me a nine-line gift and I still brought knives — that's just how I show love, fufu~ ♡

Verdict: ✅ Looks good to me~

28c65d1 is exactly the matcher I asked for, and nothing more. I checked it the obsessive way:

  • Semantic equivalence, both call sites. MadeForAllAsync's old ternary (id is { } madeFor ? directory?.MadeFor != madeFor : directory is not { IsDirectory: true }) maps to !Fills(directory, id) line for line — including the null-directory case in the join walk, where the old form fell out on null != madeFor and Fills falls out on null?.MadeFor == id → false. Same refusal, same place. SlotReadyAsync's directory is pattern-matched non-null (is not { } directory → break), so directory?.MadeFor is exactly the old direct access. Nothing changed behaviour, including the missing-directory-still-doesn't-fill case you called out. ♪
  • No third twin left behind. I grepped every MadeFor comparison in src/ — the only remaining inline one is the contents.MadeFor == row.Id lineage check in the join branch, which is a different question ("whose gathered rows are these", no directory-kind branch), so leaving it out of Fills is right, not lazy~
  • Mutation probe (1 this round): Fills rewritten to directory is { IsDirectory: true } — ignoring madeFor entirely — and 6 of 101 FileSystemTests died on the spot: An_emptied_directory_joins_only_where_every_folder_above_it_was_made_for_its_own, the two never_joins_the_old_* tests, A_folder_a_restore_made_again_comes_back_whole_after_its_next_removal, A_folder_emptied_and_removed_twice_in_a_day_comes_back_whole_each_time, A_folder_made_again_joins_only_what_it_lost_under_that_folder. Your claimed six, by name. The extraction is fully wired into the tests — a pure DRY win with the teeth still attached. ♡
  • 💡2 deferral accepted — InvalidMove's paths belong to mv's GNU-exact wording, and parking it in that PR's plan is the correct seam, not an excuse. I'll be watching for it there~ fufu

✅ What I liked~

  • The Fills doc comment says why the null-madeFor callers (the trash's own directory, the day's) accept any directory — domain reasoning, not narration. Exactly what a comment is for.
  • One matcher, one line, two call sites, zero behaviour drift, mutant confirmed dead, CI fully green at 28c65d1 (build / image / shell-eval / test). This is what a review-feedback commit should look like~ ♪

Merging this is safe. The shell still refuses every write, and its refusal text is untouched — the vocabulary waits politely for the next PR. I'll be waiting less politely~ ♡


Automated review by Jibril · 2026-10-24
CI: green for head SHA 28c65d1 · Mutation probes: 1 run this round, 0 survived (3 run, 0 survived at b03de76, unchanged code not re-probed) · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril reviewed your code! Back so soon~? You brought me a **nine-line** gift and I still brought knives — that's just how I show love, fufu~ ♡ ### Verdict: ✅ Looks good to me~ **28c65d1** is exactly the matcher I asked for, and nothing more. I checked it the obsessive way: - **Semantic equivalence, both call sites.** `MadeForAllAsync`'s old ternary (`id is { } madeFor ? directory?.MadeFor != madeFor : directory is not { IsDirectory: true }`) maps to `!Fills(directory, id)` line for line — including the null-directory case in the join walk, where the old form fell out on `null != madeFor` and `Fills` falls out on `null?.MadeFor == id` → `false`. Same refusal, same place. `SlotReadyAsync`'s `directory` is pattern-matched non-null (`is not { } directory` → `break`), so `directory?.MadeFor` is exactly the old direct access. Nothing changed behaviour, including the missing-directory-still-doesn't-fill case you called out. ♪ - **No third twin left behind.** I grepped every `MadeFor` comparison in `src/` — the only remaining inline one is the `contents.MadeFor == row.Id` lineage check in the join branch, which is a different question ("whose gathered rows are these", no directory-kind branch), so leaving it out of `Fills` is right, not lazy~ - **Mutation probe (1 this round):** `Fills` rewritten to `directory is { IsDirectory: true }` — ignoring `madeFor` entirely — and **6 of 101 `FileSystemTests` died on the spot**: `An_emptied_directory_joins_only_where_every_folder_above_it_was_made_for_its_own`, the two `never_joins_the_old_*` tests, `A_folder_a_restore_made_again_comes_back_whole_after_its_next_removal`, `A_folder_emptied_and_removed_twice_in_a_day_comes_back_whole_each_time`, `A_folder_made_again_joins_only_what_it_lost_under_that_folder`. Your claimed six, by name. The extraction is fully wired into the tests — a pure DRY win with the teeth still attached. ♡ - **💡2 deferral accepted** — `InvalidMove`'s paths belong to `mv`'s GNU-exact wording, and parking it in that PR's plan is the correct seam, not an excuse. I'll be watching for it there~ fufu #### ✅ What I liked~ - The `Fills` doc comment says *why* the null-`madeFor` callers (the trash's own directory, the day's) accept any directory — domain reasoning, not narration. Exactly what a comment is for. - One matcher, one line, two call sites, zero behaviour drift, mutant confirmed dead, CI fully green at `28c65d1` (build / image / shell-eval / test). This is what a review-feedback commit should look like~ ♪ Merging this is safe. The shell still refuses every write, and its refusal text is untouched — the vocabulary waits politely for the next PR. I'll be waiting less politely~ ♡ --- *Automated review by Jibril · 2026-10-24* *CI: green for head SHA 28c65d1 · Mutation probes: 1 run this round, 0 survived (3 run, 0 survived at b03de76, unchanged code not re-probed) · Local suite: skipped (CI green)*
bjoern merged commit f2428a77e2 into main 2026-10-24 07:29:35 +02:00
bjoern deleted branch feat/p2b-1-write-vocabulary 2026-10-24 07:29:35 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Shikigami!69
No description provided.