feat: Phase 4c-a — host seams for multi-account capabilities #78

Merged
bjoern merged 18 commits from feat/4c-a-host-seams into main 2026-10-24 15:24:11 +02:00
Member

This is the first implementation increment of Phase 4c, defined in docs/MAIL_CAPABILITY_PLAN.md under 4c-a (ADR 0034, with ADR 0012 for the backup rules). It adds the generic host seams Mail (4c-b) and later Calendar build on: setting collections, an owner check, per-item status, longer background units, supervision logs and two backup rules. The diagnostics sample exercises all of them. It adds no Mail library, MailKit, mount, tool, shell command, run kind or core migration. The plan ticks 4c-a only; 4c is ticked with 4c-c.

What's in

Contracts (Shikigami.Capabilities.Contracts)

  • CapabilitySettingCollection (key, labels, up to 32 fields, MaxItems, identity fields), CapabilitySettingItem with both revisions plus Added and Changed on candidates, and a trailing collections parameter on CapabilityDefinition.
  • ICapabilitySettings.Items(...) is a default interface member, so existing test doubles still compile. Settings, secrets and assets accept <collection>.<item>.<field>.
  • ICapabilitySettingsCheck / CapabilityCheckResult (Check.cs), with names (Value, Label, Role, Available) and feature tokens. Omitted is set only by the host.
  • ICapabilityStatus / CapabilityStatusItem (Status.cs), and eight new CapabilitySettingError codes appended so the existing values keep their numbers.
  • CapabilityText.IsUnsafe is the one definition of an unsafe character: C0/C1/DEL, U+2028/2029, the Bidi_Control set including U+061C, and unpaired surrogates. A ZWJ emoji is safe.

UseCases

  • Collections (CapabilitySettingRules, CapabilityItemKeys, CapabilityConfigurationUseCases).
    • Startup refuses invalid collections and static keys that collide with or sit under a collection key.
    • A save carries at most one add, update or remove per item, bounded by Settings.Count + Σ MaxItems × Fields.Count field edits and 2 × MaxItems item edits.
    • An item marker {"revision":N,"credentials":M} is written in the same commit. Removal deletes every key under the item, credentials included, and an addition starts empty, never inheriting a leftover credential even when its edit says Keep.
    • The identity rule: changing an identity field while keeping a saved secret is refused by both save and check. Required and unreadable checks apply only to pending items, and a problem keyed to an item field keeps its composite key.
    • An unreadable marker counts as no item everywhere.
    • Collection-only capabilities load their configuration in scopes, preparation and runtime, and are listed under Tool groups.
    • Item file fields upload, list, select and read by composite key.
  • Check (CheckAsync).
    • It builds the same candidate a save would and stores nothing. One check per familiar and group runs at a time; a second is Busy.
    • It has a 15 s deadline. A trashed familiar is refused; an archived one is checked as it would be saved.
    • Names are sanitized and the first 1,000 usable ones are kept, with the rest counted as Omitted.
  • Status (CapabilityRuntime.Status, CapabilityStatus, CapabilityStatusText).
    • Bounds: 32 items, 8 counts, count tokens, progress 0–100, and 1,000 names per item.
    • Reports merge per item, items the configuration no longer has are dropped, and identical reports are deduplicated.
    • Announcements that change only progress or counts are coalesced to one per 10 s. The flush wait is rounded up to whole milliseconds, so it never spins.
    • Status is cleared on invalidation and on leaving Ready. A report is refused inside a private mutation and while a reservation holds the instance.
    • Host texts per state and code use the injected time zone.
  • Supervision.
    • The background-unit deadline ceiling goes from 5 to 15 minutes.
    • Eight [LoggerMessage] events cover unit failure, overrun start and end, quarantine, preparation fault and timeout, slow drain (over 1 s) and drain timeout.
    • Each event carries only a SupervisedCapability identity (<familiar>/<capability>), plus the exception type passed as Type where an exception caused it. A reflection test refuses string, object and exception parameters.
    • UseCases takes Microsoft.Extensions.Logging.Abstractions, which is already pinned centrally and already allowed by ADR 0003. ProjectGraphTests pins the reference.

Infrastructure (CapabilityStorageHost, CapabilityStartup)

  • A null inspection with leftover files contributes format=0;durable=false and no files. It never fails a backup.
  • At startup, one pre-upgrade complete backup covers every instance being prepared whose format needs an upgrade. It runs outside each instance's preparation deadline. Archived, trashed, purge-pending and disabled instances are excluded.
  • A later preparation still takes its own backup before mutation admission. A failed startup backup faults only the instances that needed that upgrade, and their storage is left untouched.

UI (Shikigami.Capabilities.UI.Contracts, BlazorAdapter)

  • The settings editor gains Collections, CanCheck, CheckAsync, item changes on SaveAsync, and SettingsView.Items / Status.
  • A custom form for a capability with a collection passes startup validation, whether the capability has only collections or also static settings. A capability with neither is still refused.
  • Tool groups gets a role="status" summary per collection whose text changes only when the per-state counts change. Times now use the injected zone instead of ToLocalTime().
  • A status-only refresh keeps drafts, secret inputs and pending item edits. A higher revision while the form is dirty shows "Settings changed in another view. Reload before saving."

Sample and docs

  • sample-custom gains a connections collection (host, user, access key, certificate file), a check and per-item status. The status shows Ready, Retrying and NeedsAttention for paused credentials, names, counts, and a 1,204-name case.
  • The sample form has a single Remove/Undo toggle, so focus stays on the same button, and an InlineAlert that announces the pending removal.
  • A Contracts-only fixture (CollectionFixtureModule) declares only a collection.
  • Doc updates: browser-test skill description, ARCHITECTURE Contracts row, and the PROJECT_PLAN 4c-a tick. ADR 0034 gains Amended 2026-10-24 (4c-a — Host seams for multi-account capabilities), recording the implementation specifics: the field-key pattern, the 2 × MaxItems bound, a kept credential being no edit, unreadable markers, the identity struct and log levels.

Tests

The full suite passes twice on head 58b44ef, serially as in CI, in the local zone (Europe/Berlin) and with TZ=UTC: 7,041 passed, 0 failed, 0 skipped each time.

Project Count
BlazorAdapter 477
Capabilities.Web 124
Domain 231
Integration 3,229
Kernel 3
UseCases 2,977

New test classes:

  • CapabilityCollectionTests
    • Item-key pattern: 24 characters accepted; uppercase, dot, slash, a leading or trailing hyphen or 25 characters refused with nothing stored.
    • Removal deletes credentials; an addition inherits nothing, including a leftover under Keep.
    • Removing and adding one key in a single save is refused.
    • The identity rule and exact Changed/revision behaviour.
    • Saves exactly on both edit bounds are accepted.
    • 18 malformed item-edit shapes are refused with nothing stored and no validator run.
    • Unreadable markers.
  • CapabilityCheckTests: no writes, Busy, the 15 s deadline, sanitization (U+061C, other bidi controls, ZWJ survives), 1,204 names → 1,000 kept + 204 Omitted with the hidden names first, kept secrets used without re-entry, and stale or invalid candidates refused unchecked.
  • CapabilityStatusTests: merge, drop, dedupe, coalescing (including counts-only changes and the sub-millisecond window, which failed fast under the old code), clearing on invalidation and leaving Ready, refusals inside a mutation and during a reservation, 1,001 names refused, 8 × 1,000 accepted, and zone-aware lines.
  • CapabilitySupervisionLogTests: one entry per event with identity and exception type only, and the reflection rule on logger parameters.
  • CapabilityCollectionViewTests (bUnit): the stable live-region text, Berlin/UTC times, drafts kept across a status refresh, and an undone removal sending nothing.
  • SampleSettingsFormTests (bUnit, in Integration because only it references Server): the Remove/Undo toggle keeps the same button instance, its labels and aria-label follow the state, and save sends only real edits.
  • CapabilityStatusTextTests, CapabilityTextTests.
  • CoordinatedCapabilityBackupTests gains:
    • three instances that need an upgrade produce exactly one pre-upgrade archive, and none of them faults;
    • archived and disabled old-format instances take no backup across restarts, and enabling the disabled one later upgrades it after exactly one backup;
    • a failed backup faults only the instances needing that upgrade;
    • a null inspection is declared as format 0 with no files.
  • CapabilityRegistryTests: 15 minutes accepted and one tick more refused. CapabilitySupervisionTests: a unit returning at 9 minutes succeeds.
  • CapabilitySettingsComponentsTests: collection-only and mixed capabilities need their custom form.

Browser-verified

The sample custom accounts scenario (serve.py --capability-sample) was driven with Playwright on the final markup in Europe/Berlin. A run on an earlier head also compared UTC.

  1. The summary "Connections: 1 of 2 up to date; 1 retrying" and per-item lines in the injected zone.
  2. Adding lab and uploading its certificate before saving.
  3. Removing work with the keyboard: focus stays on the same button, now "Undo", and the removal is announced. Undo restores it.
  4. After saving, home and work keep {"revision":1,"credentials":1}, and lab is added at revision 2.
  5. A reload keeps everything.
  6. The check: features, names, and the right-to-left override shown as U+FFFD.
  7. An unsaved 1,204-name check shows 1,000 items and "204 more not shown", and nothing is stored.
  8. Drafts, typed keys and check results survive status refreshes.
  9. A dirty second tab gets the stale warning, and its save is refused.
  10. An identity change keeping its key is refused by both check and save.
  11. Every explanation sits behind an info tip.

The console showed no errors. The app log had only the expected fail-work supervision warnings, which name exception types only.

Pre-PR review (AGENTS.md)

Lens reviewers. Five lenses each had an independent skeptic per finding: correctness and concurrency, security and secrets, conformance to the plan and ADRs, UI and accessibility, and test quality. They confirmed 13 findings. The worst was real: an added item could inherit a leftover credential when its edit said Keep. The behavioural probe and two of the lenses found it independently. All 13 are fixed (1c5e74a).

Probe and mutation reviewer. A separate reviewer worked in a scratch checkout:

  • 13 behavioural probes, including concurrent saves of one item, a check racing a save, status racing invalidation, a 62-character composite key, IsUnsafe edge cases and a failing startup backup with mixed instances.
  • 75 mutants, covering every 4c-a mutation target in the plan.

Rechecks.

  • A fresh reviewer and a mutation recheck (58 mutants) found three leftovers: a sub-millisecond busy loop in the status flush that the fix introduced, a missing test for mixed static settings plus a collection, and the sample's untested Undo toggle. All three are fixed (c8f5607).
  • A final delta review ran 9 more mutants, all caught, and found no new problems.

Notes

  • Duplicate stale warning. After a refused save in a stale tab, "Settings changed in another view…" appears twice: the form's warning plus the save's problem. GeneratedCapabilityForm on main behaves the same.
  • Blank status after your own save. For about 185 ms, an item's status line is empty until the next status refresh, because the save result's view carries no status. This is cosmetic; I left it as is.
  • Unrelated flake. In about 44 stress runs of the adapter project, ProfileTests.Typing_neutral_into_another_row_keeps_it_editable_with_the_reason_under_the_field failed once. This branch does not touch that test or the profile code, and it never failed in the full runs.
  • Merges. main was merged in twice while this branch was open; no conflicts.

🤖 Generated with Claude Code

This is the first implementation increment of Phase 4c, defined in `docs/MAIL_CAPABILITY_PLAN.md` under 4c-a (ADR 0034, with ADR 0012 for the backup rules). It adds the generic host seams Mail (4c-b) and later Calendar build on: setting collections, an owner check, per-item status, longer background units, supervision logs and two backup rules. The diagnostics sample exercises all of them. It adds no Mail library, MailKit, mount, tool, shell command, run kind or core migration. The plan ticks 4c-a only; 4c is ticked with 4c-c. ### What's in **Contracts** (`Shikigami.Capabilities.Contracts`) - `CapabilitySettingCollection` (key, labels, up to 32 fields, `MaxItems`, identity fields), `CapabilitySettingItem` with both revisions plus `Added` and `Changed` on candidates, and a trailing `collections` parameter on `CapabilityDefinition`. - `ICapabilitySettings.Items(...)` is a default interface member, so existing test doubles still compile. Settings, secrets and assets accept `<collection>.<item>.<field>`. - `ICapabilitySettingsCheck` / `CapabilityCheckResult` (`Check.cs`), with names (`Value`, `Label`, `Role`, `Available`) and feature tokens. `Omitted` is set only by the host. - `ICapabilityStatus` / `CapabilityStatusItem` (`Status.cs`), and eight new `CapabilitySettingError` codes appended so the existing values keep their numbers. - `CapabilityText.IsUnsafe` is the one definition of an unsafe character: C0/C1/DEL, U+2028/2029, the Bidi_Control set including U+061C, and unpaired surrogates. A ZWJ emoji is safe. **UseCases** - **Collections** (`CapabilitySettingRules`, `CapabilityItemKeys`, `CapabilityConfigurationUseCases`). - Startup refuses invalid collections and static keys that collide with or sit under a collection key. - A save carries at most one add, update or remove per item, bounded by `Settings.Count + Σ MaxItems × Fields.Count` field edits and 2 × `MaxItems` item edits. - An item marker `{"revision":N,"credentials":M}` is written in the same commit. Removal deletes every key under the item, credentials included, and an addition starts empty, never inheriting a leftover credential even when its edit says *Keep*. - The identity rule: changing an identity field while keeping a saved secret is refused by both save and check. Required and unreadable checks apply only to pending items, and a problem keyed to an item field keeps its composite key. - An unreadable marker counts as no item everywhere. - Collection-only capabilities load their configuration in scopes, preparation and runtime, and are listed under Tool groups. - Item file fields upload, list, select and read by composite key. - **Check** (`CheckAsync`). - It builds the same candidate a save would and stores nothing. One check per familiar and group runs at a time; a second is `Busy`. - It has a 15 s deadline. A trashed familiar is refused; an archived one is checked as it would be saved. - Names are sanitized and the first 1,000 usable ones are kept, with the rest counted as `Omitted`. - **Status** (`CapabilityRuntime.Status`, `CapabilityStatus`, `CapabilityStatusText`). - Bounds: 32 items, 8 counts, count tokens, progress 0–100, and 1,000 names per item. - Reports merge per item, items the configuration no longer has are dropped, and identical reports are deduplicated. - Announcements that change only progress or counts are coalesced to one per 10 s. The flush wait is rounded up to whole milliseconds, so it never spins. - Status is cleared on invalidation and on leaving Ready. A report is refused inside a private mutation and while a reservation holds the instance. - Host texts per state and code use the injected time zone. - **Supervision.** - The background-unit deadline ceiling goes from 5 to 15 minutes. - Eight `[LoggerMessage]` events cover unit failure, overrun start and end, quarantine, preparation fault and timeout, slow drain (over 1 s) and drain timeout. - Each event carries only a `SupervisedCapability` identity (`<familiar>/<capability>`), plus the exception type passed as `Type` where an exception caused it. A reflection test refuses `string`, `object` and exception parameters. - UseCases takes `Microsoft.Extensions.Logging.Abstractions`, which is already pinned centrally and already allowed by ADR 0003. `ProjectGraphTests` pins the reference. **Infrastructure** (`CapabilityStorageHost`, `CapabilityStartup`) - A null inspection with leftover files contributes `format=0;durable=false` and no files. It never fails a backup. - At startup, one pre-upgrade complete backup covers every instance being prepared whose format needs an upgrade. It runs outside each instance's preparation deadline. Archived, trashed, purge-pending and disabled instances are excluded. - A later preparation still takes its own backup before mutation admission. A failed startup backup faults only the instances that needed that upgrade, and their storage is left untouched. **UI** (`Shikigami.Capabilities.UI.Contracts`, BlazorAdapter) - The settings editor gains `Collections`, `CanCheck`, `CheckAsync`, item changes on `SaveAsync`, and `SettingsView.Items` / `Status`. - A custom form for a capability with a collection passes startup validation, whether the capability has only collections or also static settings. A capability with neither is still refused. - Tool groups gets a `role="status"` summary per collection whose text changes only when the per-state counts change. Times now use the injected zone instead of `ToLocalTime()`. - A status-only refresh keeps drafts, secret inputs and pending item edits. A higher revision while the form is dirty shows "Settings changed in another view. Reload before saving." **Sample and docs** - `sample-custom` gains a `connections` collection (host, user, access key, certificate file), a check and per-item status. The status shows Ready, Retrying and NeedsAttention for paused credentials, names, counts, and a 1,204-name case. - The sample form has a single Remove/Undo toggle, so focus stays on the same button, and an `InlineAlert` that announces the pending removal. - A Contracts-only fixture (`CollectionFixtureModule`) declares only a collection. - Doc updates: browser-test skill description, ARCHITECTURE Contracts row, and the PROJECT_PLAN 4c-a tick. ADR 0034 gains **Amended 2026-10-24 (4c-a — Host seams for multi-account capabilities)**, recording the implementation specifics: the field-key pattern, the 2 × `MaxItems` bound, a kept credential being no edit, unreadable markers, the identity struct and log levels. ### Tests The full suite passes twice on head `58b44ef`, serially as in CI, in the local zone (Europe/Berlin) and with `TZ=UTC`: **7,041 passed, 0 failed, 0 skipped** each time. | Project | Count | |---|---| | BlazorAdapter | 477 | | Capabilities.Web | 124 | | Domain | 231 | | Integration | 3,229 | | Kernel | 3 | | UseCases | 2,977 | New test classes: - `CapabilityCollectionTests` - Item-key pattern: 24 characters accepted; uppercase, dot, slash, a leading or trailing hyphen or 25 characters refused with nothing stored. - Removal deletes credentials; an addition inherits nothing, including a leftover under *Keep*. - Removing and adding one key in a single save is refused. - The identity rule and exact `Changed`/revision behaviour. - Saves exactly on both edit bounds are accepted. - 18 malformed item-edit shapes are refused with nothing stored and no validator run. - Unreadable markers. - `CapabilityCheckTests`: no writes, `Busy`, the 15 s deadline, sanitization (U+061C, other bidi controls, ZWJ survives), 1,204 names → 1,000 kept + 204 `Omitted` with the hidden names first, kept secrets used without re-entry, and stale or invalid candidates refused unchecked. - `CapabilityStatusTests`: merge, drop, dedupe, coalescing (including counts-only changes and the sub-millisecond window, which failed fast under the old code), clearing on invalidation and leaving Ready, refusals inside a mutation and during a reservation, 1,001 names refused, 8 × 1,000 accepted, and zone-aware lines. - `CapabilitySupervisionLogTests`: one entry per event with identity and exception type only, and the reflection rule on logger parameters. - `CapabilityCollectionViewTests` (bUnit): the stable live-region text, Berlin/UTC times, drafts kept across a status refresh, and an undone removal sending nothing. - `SampleSettingsFormTests` (bUnit, in Integration because only it references Server): the Remove/Undo toggle keeps the same button instance, its labels and `aria-label` follow the state, and save sends only real edits. - `CapabilityStatusTextTests`, `CapabilityTextTests`. - `CoordinatedCapabilityBackupTests` gains: - three instances that need an upgrade produce exactly one pre-upgrade archive, and none of them faults; - archived and disabled old-format instances take no backup across restarts, and enabling the disabled one later upgrades it after exactly one backup; - a failed backup faults only the instances needing that upgrade; - a null inspection is declared as format 0 with no files. - `CapabilityRegistryTests`: 15 minutes accepted and one tick more refused. `CapabilitySupervisionTests`: a unit returning at 9 minutes succeeds. - `CapabilitySettingsComponentsTests`: collection-only and mixed capabilities need their custom form. ### Browser-verified The *sample custom accounts* scenario (`serve.py --capability-sample`) was driven with Playwright on the final markup in Europe/Berlin. A run on an earlier head also compared UTC. 1. The summary "Connections: 1 of 2 up to date; 1 retrying" and per-item lines in the injected zone. 2. Adding `lab` and uploading its certificate before saving. 3. Removing `work` with the keyboard: focus stays on the same button, now "Undo", and the removal is announced. Undo restores it. 4. After saving, `home` and `work` keep `{"revision":1,"credentials":1}`, and `lab` is added at revision 2. 5. A reload keeps everything. 6. The check: features, names, and the right-to-left override shown as U+FFFD. 7. An unsaved 1,204-name check shows 1,000 items and "204 more not shown", and nothing is stored. 8. Drafts, typed keys and check results survive status refreshes. 9. A dirty second tab gets the stale warning, and its save is refused. 10. An identity change keeping its key is refused by both check and save. 11. Every explanation sits behind an info tip. The console showed no errors. The app log had only the expected `fail-work` supervision warnings, which name exception types only. ### Pre-PR review (AGENTS.md) **Lens reviewers.** Five lenses each had an independent skeptic per finding: correctness and concurrency, security and secrets, conformance to the plan and ADRs, UI and accessibility, and test quality. They confirmed 13 findings. The worst was real: an added item could inherit a leftover credential when its edit said *Keep*. The behavioural probe and two of the lenses found it independently. All 13 are fixed (`1c5e74a`). **Probe and mutation reviewer.** A separate reviewer worked in a scratch checkout: - 13 behavioural probes, including concurrent saves of one item, a check racing a save, status racing invalidation, a 62-character composite key, `IsUnsafe` edge cases and a failing startup backup with mixed instances. - 75 mutants, covering every 4c-a mutation target in the plan. **Rechecks.** - A fresh reviewer and a mutation recheck (58 mutants) found three leftovers: a sub-millisecond busy loop in the status flush that the fix introduced, a missing test for mixed static settings plus a collection, and the sample's untested Undo toggle. All three are fixed (`c8f5607`). - A final delta review ran 9 more mutants, all caught, and found no new problems. ### Notes - **Duplicate stale warning.** After a refused save in a stale tab, "Settings changed in another view…" appears twice: the form's warning plus the save's problem. `GeneratedCapabilityForm` on `main` behaves the same. - **Blank status after your own save.** For about 185 ms, an item's status line is empty until the next status refresh, because the save result's view carries no status. This is cosmetic; I left it as is. - **Unrelated flake.** In about 44 stress runs of the adapter project, `ProfileTests.Typing_neutral_into_another_row_keeps_it_editable_with_the_reason_under_the_field` failed once. This branch does not touch that test or the profile code, and it never failed in the full runs. - **Merges.** `main` was merged in twice while this branch was open; no conflicts. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
A capability may declare up to four setting collections. Items live in the
existing configuration tables under <collection>.<item>.<field> with a marker
<collection>.<item> holding the item and credential revisions. Saves add,
update and remove items in one revision-checked commit: removal and addition
delete everything under the item's prefix, an identity change keeping a saved
credential is refused on that credential, and required fields, unreadable
credentials and file references are checked for the touched items only.
Scopes, preparation and runtime load the configuration of a collection-only
capability, owner assets resolve item file fields by composite key, and the
Tool groups section lists such a capability.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adds ICapabilitySettingsCheck, CapabilityCheckResult and CapabilityName to Contracts, with
CapabilityText.IsUnsafe as the one definition of an unsafe character. CapabilityConfigurations.CheckAsync
builds the candidate a save would, identity rule included, binds it without runtime storage under the
15-second validation deadline and stores, reserves and admits nothing. One check runs per familiar and
group until its callback exits; malformed or throwing answers cannot complete without disclosing text.
CapabilityNames drops unusable names, replaces unsafe label characters, keeps the first 1,000 names and
counts the rest as omitted, and bounds feature tokens.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A null inspection contributes format=0;durable=false with no files instead of
failing the backup. At startup the host inspects every instance it is about to
prepare and takes one complete backup for those below their declared format,
before any preparation deadline; each instance consumes that outcome once, a
failed backup faults only those instances, and later preparations take their own.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Committed as found in the worktree: WP3 left its work uncommitted, and WP6 builds on it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The sample form's empty state named "lan", which Kagaku.UI's IconCatalog
lacks, so it rendered an invisible glyph and IconCatalogCompletenessTests
failed. Use "link", which the catalog has.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Audit of the status work committed unreviewed: production code matches the
map, the plan and the ADR 0034 amendments; the tests now also pin what
mutation checks showed unpinned.

- An unchanged report past the window announces neither at once nor later.
- A count-only change at equal progress, in any state, is stored at once and
  coalesced like progress, including a key swap at equal size; a change long
  past the window announces at once.
- Status never describes another configuration revision.
- Item lines in the configuration view follow the injected zone.
- A disabled group's view keeps the host's disabled text.
- A report made while a transition holds the instance is dropped.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A background unit may declare a deadline of up to 15 minutes; a unit
returning before it succeeds. UseCases takes the logging abstractions for
source-generated supervision logs: a unit failure, an overrun's start and
end, a quarantine, a preparation fault or timeout, a drain over one second
and a drain timeout each write one entry naming the familiar and the
registry-validated capability ID and, where an exception caused it, only
its type. No host capability logging method takes a string, object or
exception.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stateless preparation reruns on every call, so a stateless capability missing
a required setting wrote an Error entry for each call that found it still
unconfigured. Only the transition into Faulted is now logged, as for a
stateful instance, whose preparation is not retried while it is faulted.

The 4c-a amendment to ADR 0034 records the supervision-log specifics: the
identity value and exception Type parameters, the innermost exception for a
unit failure, preparation timeouts and cancellations, overruns and superseded
quarantines, the slow-drain threshold, drain timeouts behind another
reservation, and the levels.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The explicit check's handler and the settings reads it and the bridge start
kept running after the test stopped the runtime, so a read could reopen the
database while the context deleted its directory ("Directory not empty").
The test now awaits the check and every settings read before stopping.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- A kept credential is no edit, so an addition keeping one still deletes a leftover under its key.
- An item exists only while its marker is readable: field and credential reads, problem keys, checks and status
  follow ReadItems.
- Malformed item edits, the exact item-edit bound, item field defaults and unreadable markers are tested.
- A pending progress flush waits a whole window after a real change announced meanwhile, on the monotonic clock.
- Startup refuses a collection capability without a custom form.
- Supervision log tests pin the unit's exception type and overrun levels, and await the inner preparation's unwinding
  instead of sleeping.
- Trailing-newline cases for the item key, collection and field key and role patterns; bidi test literals escaped.
- Sample form: one Remove/Undo button keeps focus, removal, limit and check results show as alerts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A status flush that found less than a millisecond of its window left asked
Task.Delay for that remainder, which truncates to whole milliseconds and
completes at once below one: the flush ran again straight away, over and
over, until the clock moved on. The flush wait is now rounded up to whole
milliseconds, so it waits that last millisecond instead, and an
announcement still never comes before the window has ended.

Tests:
- status: a window ending a tick short of a whole millisecond is announced
  only once it has ended and no flush runs early; a progress change with
  half a millisecond left reads the clock as any pending report does. The
  test clock counts its timestamp reads to make a spinning flush visible.
- startup: a capability declaring static settings and a collection needs
  its custom form too, as the sample's does.
- sample form (bUnit, now in the integration tests that reach the Server):
  Remove then Undo keeps the same toggle component, so focus stays, and
  the save sends no edit for the connection; a kept removal sends one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merge origin/main into feat/4c-a-host-seams
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 1m34s
CI / test (pull_request) Successful in 3m44s
58b44ef88d
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: 0aac1a0 · Generated: 2026-10-24 13:27:02 UTC · Revision: #3

Summary

Summary
Generated on: 10/24/2026 - 13:27:02
Coverage date: 10/24/2026 - 13:24:31 - 10/24/2026 - 13:26:58
Parser: MultiReport (6x Cobertura)
Assemblies: 11
Classes: 710
Files: 372
Line coverage: 95.8% (28666 of 29895)
Covered lines: 28666
Uncovered lines: 1229
Coverable lines: 29895
Total lines: 52200
Branch coverage: 91.3% (17872 of 19557)
Covered branches: 17872
Total branches: 19557
Method coverage: Feature is only available for sponsors

Coverage

Shikigami.BlazorAdapter - 96.9%
Name Line Branch
Shikigami.BlazorAdapter 96.9% 89.5%
Shikigami.BlazorAdapter.BlazorAdapterAssembly 100%
Shikigami.BlazorAdapter.Cast.CastActionFailed 100%
Shikigami.BlazorAdapter.Cast.CastEffects 93.3% 93.7%
Shikigami.BlazorAdapter.Cast.CastLoaded 100%
Shikigami.BlazorAdapter.Cast.CastReducers 93.3% 50%
Shikigami.BlazorAdapter.Cast.CastState 100% 100%
Shikigami.BlazorAdapter.Cast.CreateFamiliarFailed 100%
Shikigami.BlazorAdapter.Cast.CreateFamiliarRequested 100%
Shikigami.BlazorAdapter.Cast.DuplicateFamiliarRequested 100%
Shikigami.BlazorAdapter.Cast.FamiliarAvatar 100% 75%
Shikigami.BlazorAdapter.Cast.FamiliarCreated 100%
Shikigami.BlazorAdapter.Cast.FamiliarLinks 100%
Shikigami.BlazorAdapter.Cast.NewFamiliarDialog 97.2% 83.3%
Shikigami.BlazorAdapter.Cast.PurgeFamiliarRequested 100%
Shikigami.BlazorAdapter.Cast.SetFamiliarArchivedRequested 100%
Shikigami.BlazorAdapter.Cast.SetFamiliarTrashedRequested 100%
Shikigami.BlazorAdapter.Cast.TrashPage 89.4% 93.7%
Shikigami.BlazorAdapter.EffectCalls 100%
Shikigami.BlazorAdapter.Files.ConflictSettled 100%
Shikigami.BlazorAdapter.Files.DismissFileError 100%
Shikigami.BlazorAdapter.Files.EntryMissing 100%
Shikigami.BlazorAdapter.Files.EntryOpened 100%
Shikigami.BlazorAdapter.Files.FileActionDone 100%
Shikigami.BlazorAdapter.Files.FileActionFailed 100%
Shikigami.BlazorAdapter.Files.FileActionRequested 100%
Shikigami.BlazorAdapter.Files.FileLinks 100% 100%
Shikigami.BlazorAdapter.Files.FilePane 95.2% 89.5%
Shikigami.BlazorAdapter.Files.FilePaneClosed 100%
Shikigami.BlazorAdapter.Files.FilePathBreadcrumb 100% 100%
Shikigami.BlazorAdapter.Files.FilesEffects 98.4% 92.6%
Shikigami.BlazorAdapter.Files.FilesPage 97.1% 97.3%
Shikigami.BlazorAdapter.Files.FilesReducers 100% 82%
Shikigami.BlazorAdapter.Files.FilesState 100% 100%
Shikigami.BlazorAdapter.Files.FileTreeBranch 100% 100%
Shikigami.BlazorAdapter.Files.FolderPane 92.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.FamiliarProfile 98% 90.1%
Shikigami.BlazorAdapter.Profile.LoadProfile 100%
Shikigami.BlazorAdapter.Profile.PersonaEditor 100% 97.2%
Shikigami.BlazorAdapter.Profile.PersonaReloaded 100%
Shikigami.BlazorAdapter.Profile.PersonaSave 100%
Shikigami.BlazorAdapter.Profile.PersonaSaved 100%
Shikigami.BlazorAdapter.Profile.PersonaSaveFailed 100%
Shikigami.BlazorAdapter.Profile.ProfileEffects 92.9% 85%
Shikigami.BlazorAdapter.Profile.ProfileLoaded 100%
Shikigami.BlazorAdapter.Profile.ProfileMissing 100%
Shikigami.BlazorAdapter.Profile.ProfilePage 100%
Shikigami.BlazorAdapter.Profile.ProfileReducers 97.3% 53.9%
Shikigami.BlazorAdapter.Profile.ProfileRefreshed 100%
Shikigami.BlazorAdapter.Profile.ProfileState 100% 100%
Shikigami.BlazorAdapter.Profile.ReloadPersona 100%
Shikigami.BlazorAdapter.Profile.RevertSelfRequested 100%
Shikigami.BlazorAdapter.Profile.SavePersonaRequested 100%
Shikigami.BlazorAdapter.Profile.SaveSettingsRequested 100%
Shikigami.BlazorAdapter.Profile.SelfLayer 92.3% 87.5%
Shikigami.BlazorAdapter.Profile.SettingsSaved 100%
Shikigami.BlazorAdapter.Profile.SettingsSaveFailed 100%
Shikigami.BlazorAdapter.Settings.BackupFailed 100%
Shikigami.BlazorAdapter.Settings.BackupSettingsLoaded 100%
Shikigami.BlazorAdapter.Settings.BackupSettingsLoadFailed 100%
Shikigami.BlazorAdapter.Settings.BackupsSection 100% 100%
Shikigami.BlazorAdapter.Settings.BackupsSettingsEffects 100%
Shikigami.BlazorAdapter.Settings.BackupsSettingsReducers 100%
Shikigami.BlazorAdapter.Settings.BackupsSettingsState 100%
Shikigami.BlazorAdapter.Settings.CapabilityFormErrorBoundary 100%
Shikigami.BlazorAdapter.Settings.CapabilityOwnerEditor 89.5% 86.2%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsComponents 100% 100%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsEffects 100% 90.6%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsFailed 100%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsLoaded 100%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsReducers 100% 100%
Shikigami.BlazorAdapter.Settings.CapabilitySettingsState 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceCss 100% 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceEffects 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceLoaded 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceLoadFailed 100%
Shikigami.BlazorAdapter.Settings.ChatAppearancePreview 100% 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceReducers 100% 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceSaved 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceSaveFailed 100%
Shikigami.BlazorAdapter.Settings.ChatAppearanceSection 100% 98.6%
Shikigami.BlazorAdapter.Settings.ChatAppearanceState 100%
Shikigami.BlazorAdapter.Settings.DefaultsSection 94.5% 85.7%
Shikigami.BlazorAdapter.Settings.DefaultsSettingsEffects 100%
Shikigami.BlazorAdapter.Settings.DefaultsSettingsReducers 100% 100%
Shikigami.BlazorAdapter.Settings.DefaultsSettingsState 100%
Shikigami.BlazorAdapter.Settings.GeneratedCapabilityForm 92.9% 80.8%
Shikigami.BlazorAdapter.Settings.LoadCapabilitySettings 100%
Shikigami.BlazorAdapter.Settings.LoadProviderSettings 100%
Shikigami.BlazorAdapter.Settings.ModelCatalogLoaded 100%
Shikigami.BlazorAdapter.Settings.ModelCatalogLoadFailed 100%
Shikigami.BlazorAdapter.Settings.ModelDefaultsLoaded 100%
Shikigami.BlazorAdapter.Settings.ModelDefaultsLoadFailed 100%
Shikigami.BlazorAdapter.Settings.ModelDefaultsSaved 100%
Shikigami.BlazorAdapter.Settings.ModelDefaultsSaveFailed 100%
Shikigami.BlazorAdapter.Settings.ModelHints 100% 100%
Shikigami.BlazorAdapter.Settings.ModelPicker 100% 98.2%
Shikigami.BlazorAdapter.Settings.Money 100%
Shikigami.BlazorAdapter.Settings.OpenRouterKeySaved 100%
Shikigami.BlazorAdapter.Settings.OpenRouterKeySaveFailed 100%
Shikigami.BlazorAdapter.Settings.ProviderKeyChecked 100%
Shikigami.BlazorAdapter.Settings.ProviderSection 100% 100%
Shikigami.BlazorAdapter.Settings.ProviderSettingsEffects 100% 100%
Shikigami.BlazorAdapter.Settings.ProviderSettingsLoaded 100%
Shikigami.BlazorAdapter.Settings.ProviderSettingsReducers 100% 100%
Shikigami.BlazorAdapter.Settings.ProviderSettingsState 100% 100%
Shikigami.BlazorAdapter.Settings.SaveChatAppearanceRequested 100%
Shikigami.BlazorAdapter.Settings.SaveModelDefaultsRequested 100%
Shikigami.BlazorAdapter.Settings.SaveOpenRouterKeyRequested 100%
Shikigami.BlazorAdapter.Settings.SettingsPage 100% 100%
Shikigami.BlazorAdapter.Settings.ToolGroupsSection 93.6% 80.8%
Shikigami.BlazorAdapter.Shell.CastRail 100% 100%
Shikigami.BlazorAdapter.Workspace.FamiliarArtwork 100% 100%
Shikigami.BlazorAdapter.Workspace.FamiliarConfigurationHost 100% 100%
Shikigami.BlazorAdapter.Workspace.FamiliarPresence 86.9% 90%
Shikigami.BlazorAdapter.Workspace.FamiliarWorkspaceContext 100% 100%
Shikigami.BlazorAdapter.Workspace.LacquerHeader 84.6% 100%
Shikigami.BlazorAdapter.Workspace.WorkspacePage 100% 100%
Shikigami.BlazorAdapter.Workspace.WorkspaceSectionPicker 100% 87.5%
Shikigami.Capabilities.Contracts - 92.7%
Name Line Branch
Shikigami.Capabilities.Contracts 92.7% 92.7%
Shikigami.Capabilities.Contracts.CapabilityAssetContent 100%
Shikigami.Capabilities.Contracts.CapabilityBackgroundDefinition 100%
Shikigami.Capabilities.Contracts.CapabilityCheckResult 100%
Shikigami.Capabilities.Contracts.CapabilityContext 100%
Shikigami.Capabilities.Contracts.CapabilityDefinition 100% 100%
Shikigami.Capabilities.Contracts.CapabilityEntry 100%
Shikigami.Capabilities.Contracts.CapabilityError 100%
Shikigami.Capabilities.Contracts.CapabilityFile 100%
Shikigami.Capabilities.Contracts.CapabilityListing 100%
Shikigami.Capabilities.Contracts.CapabilityMount 100% 100%
Shikigami.Capabilities.Contracts.CapabilityName 100%
Shikigami.Capabilities.Contracts.CapabilityPublication 100%
Shikigami.Capabilities.Contracts.CapabilityPublicationReceipt 100%
Shikigami.Capabilities.Contracts.CapabilityRegistration 100% 100%
Shikigami.Capabilities.Contracts.CapabilityResult`1 100%
Shikigami.Capabilities.Contracts.CapabilitySetting 100% 100%
Shikigami.Capabilities.Contracts.CapabilitySettingCollection 100% 100%
Shikigami.Capabilities.Contracts.CapabilitySettingItem 100%
Shikigami.Capabilities.Contracts.CapabilitySettingProblem 100%
Shikigami.Capabilities.Contracts.CapabilitySignal 100%
Shikigami.Capabilities.Contracts.CapabilityStatusItem 100%
Shikigami.Capabilities.Contracts.CapabilityStorageDefinition 100%
Shikigami.Capabilities.Contracts.CapabilityStoragePreparation 100%
Shikigami.Capabilities.Contracts.CapabilityText 100% 100%
Shikigami.Capabilities.Contracts.CapabilityTool 100%
Shikigami.Capabilities.Contracts.CapabilityToolResult 100%
Shikigami.Capabilities.Contracts.CapabilityValidationProblem 100%
Shikigami.Capabilities.Contracts.ICapabilitySettings 0%
Shikigami.Capabilities.Contracts.MountAccessRule 100%
System.Text.RegularExpressions.Generated 84.6% 85.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FB478E59CB1F8F91
095F32B47EDE23CC9FACABF076C6AA6737588D398F5DE6EDB__ItemKey_0
92.7% 90.4%
Shikigami.Capabilities.TestFixture - 94.6%
Name Line Branch
Shikigami.Capabilities.TestFixture 94.6% 94.1%
Shikigami.Capabilities.TestFixture.BinaryFixtureProvider 72.7% 87.5%
Shikigami.Capabilities.TestFixture.BinaryFixtureState 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureCheck 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureIdentity 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureModule 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureObservation 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureState 100%
Shikigami.Capabilities.TestFixture.CollectionFixtureStorage 64.2% 50%
Shikigami.Capabilities.TestFixture.CollectionFixtureValidator 100% 100%
Shikigami.Capabilities.TestFixture.FixtureHandler 100%
Shikigami.Capabilities.TestFixture.FixtureModule 100% 100%
Shikigami.Capabilities.TestFixture.FixtureProvider 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 - 91.8%
Name Line Branch
Shikigami.Capabilities.TestFixture.UI 91.8% 79%
Shikigami.Capabilities.TestFixture.UI.CollectionFixtureForm 90.4% 80%
Shikigami.Capabilities.TestFixture.UI.FixtureSettingsForm 100% 66.6%
Shikigami.Capabilities.UI.Contracts - 94.1%
Name Line Branch
Shikigami.Capabilities.UI.Contracts 94.1% 50%
Shikigami.Capabilities.UI.Contracts.CapabilitySettingsComponent 100%
Shikigami.Capabilities.UI.Contracts.CapabilitySettingsComponentRegistration 88.8% 50%
Shikigami.Capabilities.UI.Contracts.CapabilitySettingsUiRegistration 100%
Shikigami.Capabilities.UI.Contracts.SecretChange 75%
Shikigami.Capabilities.UI.Contracts.SettingsAsset 100%
Shikigami.Capabilities.UI.Contracts.SettingsAssetResult 100%
Shikigami.Capabilities.UI.Contracts.SettingsCheckResult 100%
Shikigami.Capabilities.UI.Contracts.SettingsItem 100%
Shikigami.Capabilities.UI.Contracts.SettingsItemChange 100%
Shikigami.Capabilities.UI.Contracts.SettingsItemStatus 100%
Shikigami.Capabilities.UI.Contracts.SettingsProblem 100%
Shikigami.Capabilities.UI.Contracts.SettingsSaveResult 100%
Shikigami.Capabilities.UI.Contracts.SettingsView 100%
Shikigami.Capabilities.Web - 97.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.8%
Shikigami.Domain.Familiars.AccentPalette 100%
Shikigami.Domain.Familiars.ColourPair 100% 100%
Shikigami.Domain.Familiars.Expression 100% 100%
Shikigami.Domain.Familiars.ExpressionSet 100% 100%
Shikigami.Domain.Familiars.Familiar 100% 90.2%
Shikigami.Domain.Familiars.LearningSettings 100%
Shikigami.Domain.Familiars.MemoryBudgets 100% 100%
Shikigami.Domain.Familiars.ModelChoice 100% 100%
Shikigami.Domain.Familiars.OutreachSettings 100% 100%
Shikigami.Domain.Familiars.QuietHours 100% 87.5%
Shikigami.Domain.Files.BlobContent 100% 75%
Shikigami.Domain.Files.BlobSha 87.5% 100%
Shikigami.Domain.Files.DefaultLayout 100%
Shikigami.Domain.Files.FileActor 100%
Shikigami.Domain.Files.FileAuthor 100% 100%
Shikigami.Domain.Files.FileContent 100% 100%
Shikigami.Domain.Files.FileNode 100% 90%
Shikigami.Domain.Files.FilePath 100% 97.8%
Shikigami.Domain.Files.FilePublication 100%
Shikigami.Domain.Files.FilePublicationStamp 100%
Shikigami.Domain.Files.FileRevision 100% 87.5%
Shikigami.Domain.Files.LedgerScope 100% 100%
Shikigami.Domain.Files.LocalDates 100%
Shikigami.Domain.Files.MediaTypes 100% 100%
Shikigami.Domain.Files.Permissions 100% 100%
Shikigami.Domain.Files.ReadLedgerEntry 100% 86.3%
Shikigami.Domain.Files.RunActor 100% 100%
Shikigami.Domain.Files.Slug 100% 100%
Shikigami.Domain.Files.TextContent 100% 100%
Shikigami.Domain.Files.TrashPath 100% 100%
Shikigami.Domain.Routines.RoutineSchedule 94.4% 89.8%
Shikigami.Domain.Settings.AppSetting 100%
Shikigami.Domain.Settings.CapabilityConfiguration 100% 100%
Shikigami.Domain.Settings.CapabilityCredential 100%
Shikigami.Domain.Settings.CapabilitySettingValue 100%
Shikigami.Domain.Text 100% 100%
System.Text.RegularExpressions.Generated 96.2% 85.2%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0
94.8% 67.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2
96.8% 93.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3
95.9% 92.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7
916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1
97.2% 94.4%
Shikigami.Infrastructure - 95.2%
Name Line Branch
Shikigami.Infrastructure 95.2% 79%
Shikigami.Infrastructure.Backups.BackupArtifactName 100% 100%
Shikigami.Infrastructure.Backups.BackupOptions 100%
Shikigami.Infrastructure.Backups.BackupSchedule 100% 83.3%
Shikigami.Infrastructure.Backups.BackupScheduler 96.6% 87.5%
Shikigami.Infrastructure.Backups.BackupWriter 97.2% 93.4%
Shikigami.Infrastructure.Backups.DatabaseFingerprint 91.9% 97%
Shikigami.Infrastructure.Backups.FileSystemBackupStore 100% 100%
Shikigami.Infrastructure.Backups.OwnerOnlyFile 100% 100%
Shikigami.Infrastructure.Backups.PreMigrationBackup 90.1% 100%
Shikigami.Infrastructure.Backups.SqliteSnapshot 88.2% 75%
Shikigami.Infrastructure.Blobs.BlobSweep 100% 100%
Shikigami.Infrastructure.Blobs.BlobSweepOptions 100% 100%
Shikigami.Infrastructure.Blobs.BlobSweepResult 100%
Shikigami.Infrastructure.Blobs.FileSystemBlobStore 95.9% 97%
Shikigami.Infrastructure.Browser.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 93.7% 83.8%
Shikigami.Infrastructure.Capabilities.CapabilityStorageOptions 100%
Shikigami.Infrastructure.Capabilities.PrivatePaths 97.4% 83.3%
Shikigami.Infrastructure.DailyMaintenanceService 97.8% 91.6%
Shikigami.Infrastructure.DependencyInjection 100% 100%
Shikigami.Infrastructure.Notifications.InProcessBus`1 100% 100%
Shikigami.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Shikigami.Infrastructure.Persistence.Configurations.CapabilityConfiguration
Mapping
100%
Shikigami.Infrastructure.Persistence.Configurations.CapabilityCredentialMap
ping
100%
Shikigami.Infrastructure.Persistence.Configurations.CapabilitySettingValueM
apping
100%
Shikigami.Infrastructure.Persistence.Configurations.FamiliarConfiguration 100%
Shikigami.Infrastructure.Persistence.Configurations.FileNodeConfiguration 100%
Shikigami.Infrastructure.Persistence.Configurations.FilePublicationMapping 100%
Shikigami.Infrastructure.Persistence.Configurations.FileRevisionConfigurati
on
100%
Shikigami.Infrastructure.Persistence.Configurations.ReadLedgerEntryConfigur
ation
100%
Shikigami.Infrastructure.Persistence.Configurations.UnreferencedBlobConfigu
ration
100%
Shikigami.Infrastructure.Persistence.Converters.BlobShaConverter 100%
Shikigami.Infrastructure.Persistence.Converters.ExpressionSetConverter 100% 100%
Shikigami.Infrastructure.Persistence.Converters.FilePathConverter 100%
Shikigami.Infrastructure.Persistence.Converters.Json 100% 100%
Shikigami.Infrastructure.Persistence.Converters.OutreachSettingsConverter 100% 100%
Shikigami.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Shikigami.Infrastructure.Persistence.DatabaseMigrator 100%
Shikigami.Infrastructure.Persistence.Migrations.AppSettings 100%
Shikigami.Infrastructure.Persistence.Migrations.ArtifactRetention 100%
Shikigami.Infrastructure.Persistence.Migrations.CapabilityConfigurations 100%
Shikigami.Infrastructure.Persistence.Migrations.CapabilityPublicationReceip
ts
100%
Shikigami.Infrastructure.Persistence.Migrations.CapabilityPurgeIntent 100%
Shikigami.Infrastructure.Persistence.Migrations.FileCreatedBy 98%
Shikigami.Infrastructure.Persistence.Migrations.Initial 97.9%
Shikigami.Infrastructure.Persistence.Migrations.Profile 96.2%
Shikigami.Infrastructure.Persistence.Migrations.ReadLedger 100%
Shikigami.Infrastructure.Persistence.Migrations.ShikigamiDbContextModelSnap
shot
100%
Shikigami.Infrastructure.Persistence.Migrations.TrashDirectoryMadeFor 100%
Shikigami.Infrastructure.Persistence.ShikigamiDbContext 98.8% 100%
Shikigami.Infrastructure.Persistence.ShikigamiDbContextFactory 0%
Shikigami.Infrastructure.Persistence.SqlitePragmaInterceptor 100% 100%
Shikigami.Infrastructure.Persistence.Stores.EfFamiliarStore 100% 88.7%
Shikigami.Infrastructure.Persistence.Stores.EfFileStore 98.7% 100%
Shikigami.Infrastructure.Persistence.Stores.EfReadLedgerStore 98.4% 100%
Shikigami.Infrastructure.Persistence.UnreferencedBlob 100%
Shikigami.Infrastructure.Provider.OpenRouterKeySource 100% 100%
Shikigami.Infrastructure.Provider.OpenRouterModelProvider 100% 93.4%
Shikigami.Infrastructure.Provider.OpenRouterOptions 100% 50%
Shikigami.Infrastructure.Provider.ResolvedKey 100% 50%
Shikigami.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Shikigami.Infrastructure.Settings.EfCapabilityConfigurationStore 100% 100%
Shikigami.Infrastructure.Settings.KeyRingSnapshots 100% 100%
Shikigami.Infrastructure.Settings.ProtectedCapabilityAssetReferences 87.5% 50%
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 - 87.6%
Name Line Branch
Shikigami.Server 87.6% 72.8%
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 93.4% 75.8%
Shikigami.Server.Diagnostics.SampleSettingsForm 77.4% 64.8%
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.3%
Name Line Branch
Shikigami.UseCases 96.3% 93.6%
Shikigami.UseCases.Backups.BackupArtifact 100%
Shikigami.UseCases.Backups.BackupFailure 100%
Shikigami.UseCases.Backups.BackupJobState 100%
Shikigami.UseCases.Backups.BackupPolicy 100%
Shikigami.UseCases.Backups.BackupStatusView 100% 100%
Shikigami.UseCases.Backups.DatabaseSnapshot 100%
Shikigami.UseCases.Backups.DownloadDatabaseSnapshot 100%
Shikigami.UseCases.Backups.GetBackupStatus 100%
Shikigami.UseCases.Backups.IBackupStore 0%
Shikigami.UseCases.Backups.RunBackupNow 100%
Shikigami.UseCases.Browser.BrowserLease 100%
Shikigami.UseCases.Browser.BrowserOwner 100%
Shikigami.UseCases.Capabilities.BoundCapabilityAssets 100% 100%
Shikigami.UseCases.Capabilities.BoundCapabilityChanges 95.6% 70%
Shikigami.UseCases.Capabilities.BoundCapabilityFiles 95.5% 80.3%
Shikigami.UseCases.Capabilities.BoundCapabilityPrivateStorage 100% 100%
Shikigami.UseCases.Capabilities.BoundCapabilitySettings 94.4% 88.4%
Shikigami.UseCases.Capabilities.BoundCapabilityStatus 100% 100%
Shikigami.UseCases.Capabilities.CapabilityAssetChoice 100%
Shikigami.UseCases.Capabilities.CapabilityAssetReference 100%
Shikigami.UseCases.Capabilities.CapabilityAssetResult 100%
Shikigami.UseCases.Capabilities.CapabilityAssets 96.7% 86.6%
Shikigami.UseCases.Capabilities.CapabilityBackgroundHealth 100%
Shikigami.UseCases.Capabilities.CapabilityBinding 100% 83.3%
Shikigami.UseCases.Capabilities.CapabilityChanged 100%
Shikigami.UseCases.Capabilities.CapabilityCheckOutcome 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationCommit 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationData 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationProblem 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurationResult 100%
Shikigami.UseCases.Capabilities.CapabilityConfigurations 99.5% 98.9%
Shikigami.UseCases.Capabilities.CapabilityConfigurationView 100%
Shikigami.UseCases.Capabilities.CapabilityContexts 90% 91.6%
Shikigami.UseCases.Capabilities.CapabilityHealth 100%
Shikigami.UseCases.Capabilities.CapabilityItemChange 100%
Shikigami.UseCases.Capabilities.CapabilityItemEdit 100%
Shikigami.UseCases.Capabilities.CapabilityItemKeys 100% 100%
Shikigami.UseCases.Capabilities.CapabilityItemStatusView 100%
Shikigami.UseCases.Capabilities.CapabilityItemView 100%
Shikigami.UseCases.Capabilities.CapabilityNames 100% 100%
Shikigami.UseCases.Capabilities.CapabilityPrivateMutation 100% 100%
Shikigami.UseCases.Capabilities.CapabilityRegistry 96.5% 90.9%
Shikigami.UseCases.Capabilities.CapabilityRuntime 99.1% 91.3%
Shikigami.UseCases.Capabilities.CapabilityScopes 100% 83.3%
Shikigami.UseCases.Capabilities.CapabilitySecret 75%
Shikigami.UseCases.Capabilities.CapabilitySecretEdit 100%
Shikigami.UseCases.Capabilities.CapabilitySettingRules 100% 97.9%
Shikigami.UseCases.Capabilities.CapabilityStatusText 98% 97.9%
Shikigami.UseCases.Capabilities.CapabilitySupervisionLog 100% 100%
Shikigami.UseCases.Capabilities.CapabilityUnavailableException 100%
Shikigami.UseCases.Capabilities.InvokeCapabilityTool 100% 93.3%
Shikigami.UseCases.Capabilities.SupervisedCapability 100%
Shikigami.UseCases.Capabilities.ToolSchemas 86.8% 72.7%
Shikigami.UseCases.Capabilities.UnsupportedCapabilitySignals 100%
Shikigami.UseCases.DependencyInjection 100%
Shikigami.UseCases.Diagnostics.SeedDevData 91.4% 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.6% 96.5%
Shikigami.UseCases.Files.FileWriteRefused 100%
Shikigami.UseCases.Files.FileWritten 100%
Shikigami.UseCases.Files.FsError 100% 75%
Shikigami.UseCases.Files.FsResult`1 100% 50%
Shikigami.UseCases.Files.Ledger.ConflictReport 98.8% 89.6%
Shikigami.UseCases.Files.Ledger.LedgerChange 100%
Shikigami.UseCases.Files.Ledger.LedgerEntry 100%
Shikigami.UseCases.Files.Ledger.LedgerOperand 100%
Shikigami.UseCases.Files.Ledger.LedgerRead 100%
Shikigami.UseCases.Files.Ledger.LiveMove 100%
Shikigami.UseCases.Files.Ledger.ReadLedger 96.5% 93.7%
Shikigami.UseCases.Files.Ledger.ReadLedgerRules 100% 96.9%
Shikigami.UseCases.Files.Ledger.RunScope 100% 100%
Shikigami.UseCases.Files.LedgerRefusal 100% 100%
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 98.5% 93.7%
Shikigami.UseCases.Shell.Commands.CommandRegistry 100% 100%
Shikigami.UseCases.Shell.Commands.Cut 100% 100%
Shikigami.UseCases.Shell.Commands.CutPlan 100% 100%
Shikigami.UseCases.Shell.Commands.Date 100% 98%
Shikigami.UseCases.Shell.Commands.Diff 100% 100%
Shikigami.UseCases.Shell.Commands.Dirname 100% 100%
Shikigami.UseCases.Shell.Commands.Echo 90.7% 92.3%
Shikigami.UseCases.Shell.Commands.Escapes 100% 97.4%
Shikigami.UseCases.Shell.Commands.False 88.8%
Shikigami.UseCases.Shell.Commands.FileCommand 100% 100%
Shikigami.UseCases.Shell.Commands.FileNames 100% 100%
Shikigami.UseCases.Shell.Commands.Filters 100% 90%
Shikigami.UseCases.Shell.Commands.Find 100% 98%
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.9%
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.1% 94%
Shikigami.UseCases.Shell.Commands.SearchFiles 90.9% 83.3%
Shikigami.UseCases.Shell.Commands.SearchPatterns 100% 100%
Shikigami.UseCases.Shell.Commands.SearchSettings 100%
Shikigami.UseCases.Shell.Commands.Sed 100% 100%
Shikigami.UseCases.Shell.Commands.SedAddress 100%
Shikigami.UseCases.Shell.Commands.SedCommand 100%
Shikigami.UseCases.Shell.Commands.SedException 100%
Shikigami.UseCases.Shell.Commands.SedInput 100% 100%
Shikigami.UseCases.Shell.Commands.SedParser 100% 99.8%
Shikigami.UseCases.Shell.Commands.SedPart 100%
Shikigami.UseCases.Shell.Commands.SedProgram 100%
Shikigami.UseCases.Shell.Commands.SedRegex 100%
Shikigami.UseCases.Shell.Commands.SedRun 100% 100%
Shikigami.UseCases.Shell.Commands.SedSubstitution 100%
Shikigami.UseCases.Shell.Commands.ShellCommand 100% 100%
Shikigami.UseCases.Shell.Commands.ShellQuote 100% 100%
Shikigami.UseCases.Shell.Commands.Sizes 100% 100%
Shikigami.UseCases.Shell.Commands.Sort 100% 94.7%
Shikigami.UseCases.Shell.Commands.SortKey 100% 100%
Shikigami.UseCases.Shell.Commands.SortOrder 99.5% 99.5%
Shikigami.UseCases.Shell.Commands.Stat 100% 90.9%
Shikigami.UseCases.Shell.Commands.StatFacts 100% 100%
Shikigami.UseCases.Shell.Commands.StatFormat 100% 99.5%
Shikigami.UseCases.Shell.Commands.Tail 100% 100%
Shikigami.UseCases.Shell.Commands.TextFile 100%
Shikigami.UseCases.Shell.Commands.Tr 100% 100%
Shikigami.UseCases.Shell.Commands.TreeCommand 100% 99.3%
Shikigami.UseCases.Shell.Commands.TrPlan 100% 100%
Shikigami.UseCases.Shell.Commands.TrSequence 93.9% 80%
Shikigami.UseCases.Shell.Commands.TrSet 100% 97.2%
Shikigami.UseCases.Shell.Commands.True 88.8%
Shikigami.UseCases.Shell.Commands.Uniq 100% 100%
Shikigami.UseCases.Shell.Commands.VersionOrder 100% 96.6%
Shikigami.UseCases.Shell.Commands.Wc 100% 97.3%
Shikigami.UseCases.Shell.Execution.CaptureSink 100% 100%
Shikigami.UseCases.Shell.Execution.ClosedSink 100%
Shikigami.UseCases.Shell.Execution.ClosedStreamException 100%
Shikigami.UseCases.Shell.Execution.CodePointOrder 100% 100%
Shikigami.UseCases.Shell.Execution.ContentIndex 100% 100%
Shikigami.UseCases.Shell.Execution.ContentOutput 100% 100%
Shikigami.UseCases.Shell.Execution.ContentSpan 100%
Shikigami.UseCases.Shell.Execution.DateInput 96.8% 94.3%
Shikigami.UseCases.Shell.Execution.Errno 100% 100%
Shikigami.UseCases.Shell.Execution.Executor 99.1% 97.4%
Shikigami.UseCases.Shell.Execution.Expander 97.5% 95.4%
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.9% 92.1%
Shikigami.UseCases.Shell.Execution.Strftime 95.6% 92.3%
Shikigami.UseCases.Shell.Execution.Terminal 100% 94.7%
Shikigami.UseCases.Shell.Execution.TextLine 100% 100%
Shikigami.UseCases.Shell.Execution.TextLines 100% 100%
Shikigami.UseCases.Shell.Execution.TreeWalker 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 100%
Shikigami.UseCases.Shell.ShellSession 100% 100%
Shikigami.UseCases.Shell.ShellWrite 100%
Shikigami.UseCases.Shell.Syntax.AndOrList 100%
Shikigami.UseCases.Shell.Syntax.Assignment 100%
Shikigami.UseCases.Shell.Syntax.ByteText 100% 88.8%
Shikigami.UseCases.Shell.Syntax.HereDocBody 100%
Shikigami.UseCases.Shell.Syntax.Lexer 94.1% 90.4%
Shikigami.UseCases.Shell.Syntax.LiteralPart 100%
Shikigami.UseCases.Shell.Syntax.ParameterPart 100%
Shikigami.UseCases.Shell.Syntax.Parser 97.6% 91.1%
Shikigami.UseCases.Shell.Syntax.Pipeline 100%
Shikigami.UseCases.Shell.Syntax.Redirection 100%
Shikigami.UseCases.Shell.Syntax.Script 100%
Shikigami.UseCases.Shell.Syntax.ShellSyntaxException 100%
Shikigami.UseCases.Shell.Syntax.SimpleCommand 100%
Shikigami.UseCases.Shell.Syntax.TildePart 100% 100%
Shikigami.UseCases.Shell.Syntax.Token 77.7% 66.6%
Shikigami.UseCases.Shell.Syntax.Word 100% 83.3%
Shikigami.UseCases.Shell.Syntax.WordBuilder 100% 100%
System.Text.RegularExpressions.Generated 84.1% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_17
95.8% 95.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_16
93.4% 85.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__CollectionKeyPattern_5
91.8% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__CountToken_6
92.1% 87.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Feature_1
97.3% 95.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_11
97.4% 96.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_2
82.8% 66.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_8
83.6% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_15
91.6% 86.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_4
89.1% 77.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_10
92.1% 84.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_13
88.5% 62.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_12
67.3% 62.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_14
94.8% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Role_0
90% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_7
79% 63.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_3
83.7% 61.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048
F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_9
69% 56.4%
<!-- coverage-comment --> > 🔄 **Auto-updating coverage report** — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip. > > **Commit:** `0aac1a0` · **Generated:** 2026-10-24 13:27:02 UTC · **Revision:** #3 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/24/2026 - 13:27:02 | | Coverage date: | 10/24/2026 - 13:24:31 - 10/24/2026 - 13:26:58 | | Parser: | MultiReport (6x Cobertura) | | Assemblies: | 11 | | Classes: | 710 | | Files: | 372 | | **Line coverage:** | 95.8% (28666 of 29895) | | Covered lines: | 28666 | | Uncovered lines: | 1229 | | Coverable lines: | 29895 | | Total lines: | 52200 | | **Branch coverage:** | 91.3% (17872 of 19557) | | Covered branches: | 17872 | | Total branches: | 19557 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Shikigami.BlazorAdapter - 96.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.BlazorAdapter**|**96.9%**|**89.5%**| |Shikigami.BlazorAdapter.BlazorAdapterAssembly|100%|| |Shikigami.BlazorAdapter.Cast.CastActionFailed|100%|| |Shikigami.BlazorAdapter.Cast.CastEffects|93.3%|93.7%| |Shikigami.BlazorAdapter.Cast.CastLoaded|100%|| |Shikigami.BlazorAdapter.Cast.CastReducers|93.3%|50%| |Shikigami.BlazorAdapter.Cast.CastState|100%|100%| |Shikigami.BlazorAdapter.Cast.CreateFamiliarFailed|100%|| |Shikigami.BlazorAdapter.Cast.CreateFamiliarRequested|100%|| |Shikigami.BlazorAdapter.Cast.DuplicateFamiliarRequested|100%|| |Shikigami.BlazorAdapter.Cast.FamiliarAvatar|100%|75%| |Shikigami.BlazorAdapter.Cast.FamiliarCreated|100%|| |Shikigami.BlazorAdapter.Cast.FamiliarLinks|100%|| |Shikigami.BlazorAdapter.Cast.NewFamiliarDialog|97.2%|83.3%| |Shikigami.BlazorAdapter.Cast.PurgeFamiliarRequested|100%|| |Shikigami.BlazorAdapter.Cast.SetFamiliarArchivedRequested|100%|| |Shikigami.BlazorAdapter.Cast.SetFamiliarTrashedRequested|100%|| |Shikigami.BlazorAdapter.Cast.TrashPage|89.4%|93.7%| |Shikigami.BlazorAdapter.EffectCalls|100%|| |Shikigami.BlazorAdapter.Files.ConflictSettled|100%|| |Shikigami.BlazorAdapter.Files.DismissFileError|100%|| |Shikigami.BlazorAdapter.Files.EntryMissing|100%|| |Shikigami.BlazorAdapter.Files.EntryOpened|100%|| |Shikigami.BlazorAdapter.Files.FileActionDone|100%|| |Shikigami.BlazorAdapter.Files.FileActionFailed|100%|| |Shikigami.BlazorAdapter.Files.FileActionRequested|100%|| |Shikigami.BlazorAdapter.Files.FileLinks|100%|100%| |Shikigami.BlazorAdapter.Files.FilePane|95.2%|89.5%| |Shikigami.BlazorAdapter.Files.FilePaneClosed|100%|| |Shikigami.BlazorAdapter.Files.FilePathBreadcrumb|100%|100%| |Shikigami.BlazorAdapter.Files.FilesEffects|98.4%|92.6%| |Shikigami.BlazorAdapter.Files.FilesPage|97.1%|97.3%| |Shikigami.BlazorAdapter.Files.FilesReducers|100%|82%| |Shikigami.BlazorAdapter.Files.FilesState|100%|100%| |Shikigami.BlazorAdapter.Files.FileTreeBranch|100%|100%| |Shikigami.BlazorAdapter.Files.FolderPane|92.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.FamiliarProfile|98%|90.1%| |Shikigami.BlazorAdapter.Profile.LoadProfile|100%|| |Shikigami.BlazorAdapter.Profile.PersonaEditor|100%|97.2%| |Shikigami.BlazorAdapter.Profile.PersonaReloaded|100%|| |Shikigami.BlazorAdapter.Profile.PersonaSave|100%|| |Shikigami.BlazorAdapter.Profile.PersonaSaved|100%|| |Shikigami.BlazorAdapter.Profile.PersonaSaveFailed|100%|| |Shikigami.BlazorAdapter.Profile.ProfileEffects|92.9%|85%| |Shikigami.BlazorAdapter.Profile.ProfileLoaded|100%|| |Shikigami.BlazorAdapter.Profile.ProfileMissing|100%|| |Shikigami.BlazorAdapter.Profile.ProfilePage|100%|| |Shikigami.BlazorAdapter.Profile.ProfileReducers|97.3%|53.9%| |Shikigami.BlazorAdapter.Profile.ProfileRefreshed|100%|| |Shikigami.BlazorAdapter.Profile.ProfileState|100%|100%| |Shikigami.BlazorAdapter.Profile.ReloadPersona|100%|| |Shikigami.BlazorAdapter.Profile.RevertSelfRequested|100%|| |Shikigami.BlazorAdapter.Profile.SavePersonaRequested|100%|| |Shikigami.BlazorAdapter.Profile.SaveSettingsRequested|100%|| |Shikigami.BlazorAdapter.Profile.SelfLayer|92.3%|87.5%| |Shikigami.BlazorAdapter.Profile.SettingsSaved|100%|| |Shikigami.BlazorAdapter.Profile.SettingsSaveFailed|100%|| |Shikigami.BlazorAdapter.Settings.BackupFailed|100%|| |Shikigami.BlazorAdapter.Settings.BackupSettingsLoaded|100%|| |Shikigami.BlazorAdapter.Settings.BackupSettingsLoadFailed|100%|| |Shikigami.BlazorAdapter.Settings.BackupsSection|100%|100%| |Shikigami.BlazorAdapter.Settings.BackupsSettingsEffects|100%|| |Shikigami.BlazorAdapter.Settings.BackupsSettingsReducers|100%|| |Shikigami.BlazorAdapter.Settings.BackupsSettingsState|100%|| |Shikigami.BlazorAdapter.Settings.CapabilityFormErrorBoundary|100%|| |Shikigami.BlazorAdapter.Settings.CapabilityOwnerEditor|89.5%|86.2%| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsComponents|100%|100%| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsEffects|100%|90.6%| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsFailed|100%|| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsLoaded|100%|| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsReducers|100%|100%| |Shikigami.BlazorAdapter.Settings.CapabilitySettingsState|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceCss|100%|100%| |Shikigami.BlazorAdapter.Settings.ChatAppearanceEffects|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceLoaded|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceLoadFailed|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearancePreview|100%|100%| |Shikigami.BlazorAdapter.Settings.ChatAppearanceReducers|100%|100%| |Shikigami.BlazorAdapter.Settings.ChatAppearanceSaved|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceSaveFailed|100%|| |Shikigami.BlazorAdapter.Settings.ChatAppearanceSection|100%|98.6%| |Shikigami.BlazorAdapter.Settings.ChatAppearanceState|100%|| |Shikigami.BlazorAdapter.Settings.DefaultsSection|94.5%|85.7%| |Shikigami.BlazorAdapter.Settings.DefaultsSettingsEffects|100%|| |Shikigami.BlazorAdapter.Settings.DefaultsSettingsReducers|100%|100%| |Shikigami.BlazorAdapter.Settings.DefaultsSettingsState|100%|| |Shikigami.BlazorAdapter.Settings.GeneratedCapabilityForm|92.9%|80.8%| |Shikigami.BlazorAdapter.Settings.LoadCapabilitySettings|100%|| |Shikigami.BlazorAdapter.Settings.LoadProviderSettings|100%|| |Shikigami.BlazorAdapter.Settings.ModelCatalogLoaded|100%|| |Shikigami.BlazorAdapter.Settings.ModelCatalogLoadFailed|100%|| |Shikigami.BlazorAdapter.Settings.ModelDefaultsLoaded|100%|| |Shikigami.BlazorAdapter.Settings.ModelDefaultsLoadFailed|100%|| |Shikigami.BlazorAdapter.Settings.ModelDefaultsSaved|100%|| |Shikigami.BlazorAdapter.Settings.ModelDefaultsSaveFailed|100%|| |Shikigami.BlazorAdapter.Settings.ModelHints|100%|100%| |Shikigami.BlazorAdapter.Settings.ModelPicker|100%|98.2%| |Shikigami.BlazorAdapter.Settings.Money|100%|| |Shikigami.BlazorAdapter.Settings.OpenRouterKeySaved|100%|| |Shikigami.BlazorAdapter.Settings.OpenRouterKeySaveFailed|100%|| |Shikigami.BlazorAdapter.Settings.ProviderKeyChecked|100%|| |Shikigami.BlazorAdapter.Settings.ProviderSection|100%|100%| |Shikigami.BlazorAdapter.Settings.ProviderSettingsEffects|100%|100%| |Shikigami.BlazorAdapter.Settings.ProviderSettingsLoaded|100%|| |Shikigami.BlazorAdapter.Settings.ProviderSettingsReducers|100%|100%| |Shikigami.BlazorAdapter.Settings.ProviderSettingsState|100%|100%| |Shikigami.BlazorAdapter.Settings.SaveChatAppearanceRequested|100%|| |Shikigami.BlazorAdapter.Settings.SaveModelDefaultsRequested|100%|| |Shikigami.BlazorAdapter.Settings.SaveOpenRouterKeyRequested|100%|| |Shikigami.BlazorAdapter.Settings.SettingsPage|100%|100%| |Shikigami.BlazorAdapter.Settings.ToolGroupsSection|93.6%|80.8%| |Shikigami.BlazorAdapter.Shell.CastRail|100%|100%| |Shikigami.BlazorAdapter.Workspace.FamiliarArtwork|100%|100%| |Shikigami.BlazorAdapter.Workspace.FamiliarConfigurationHost|100%|100%| |Shikigami.BlazorAdapter.Workspace.FamiliarPresence|86.9%|90%| |Shikigami.BlazorAdapter.Workspace.FamiliarWorkspaceContext|100%|100%| |Shikigami.BlazorAdapter.Workspace.LacquerHeader|84.6%|100%| |Shikigami.BlazorAdapter.Workspace.WorkspacePage|100%|100%| |Shikigami.BlazorAdapter.Workspace.WorkspaceSectionPicker|100%|87.5%| </details> <details><summary>Shikigami.Capabilities.Contracts - 92.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.Contracts**|**92.7%**|**92.7%**| |Shikigami.Capabilities.Contracts.CapabilityAssetContent|100%|| |Shikigami.Capabilities.Contracts.CapabilityBackgroundDefinition|100%|| |Shikigami.Capabilities.Contracts.CapabilityCheckResult|100%|| |Shikigami.Capabilities.Contracts.CapabilityContext|100%|| |Shikigami.Capabilities.Contracts.CapabilityDefinition|100%|100%| |Shikigami.Capabilities.Contracts.CapabilityEntry|100%|| |Shikigami.Capabilities.Contracts.CapabilityError|100%|| |Shikigami.Capabilities.Contracts.CapabilityFile|100%|| |Shikigami.Capabilities.Contracts.CapabilityListing|100%|| |Shikigami.Capabilities.Contracts.CapabilityMount|100%|100%| |Shikigami.Capabilities.Contracts.CapabilityName|100%|| |Shikigami.Capabilities.Contracts.CapabilityPublication|100%|| |Shikigami.Capabilities.Contracts.CapabilityPublicationReceipt|100%|| |Shikigami.Capabilities.Contracts.CapabilityRegistration|100%|100%| |Shikigami.Capabilities.Contracts.CapabilityResult`1|100%|| |Shikigami.Capabilities.Contracts.CapabilitySetting|100%|100%| |Shikigami.Capabilities.Contracts.CapabilitySettingCollection|100%|100%| |Shikigami.Capabilities.Contracts.CapabilitySettingItem|100%|| |Shikigami.Capabilities.Contracts.CapabilitySettingProblem|100%|| |Shikigami.Capabilities.Contracts.CapabilitySignal|100%|| |Shikigami.Capabilities.Contracts.CapabilityStatusItem|100%|| |Shikigami.Capabilities.Contracts.CapabilityStorageDefinition|100%|| |Shikigami.Capabilities.Contracts.CapabilityStoragePreparation|100%|| |Shikigami.Capabilities.Contracts.CapabilityText|100%|100%| |Shikigami.Capabilities.Contracts.CapabilityTool|100%|| |Shikigami.Capabilities.Contracts.CapabilityToolResult|100%|| |Shikigami.Capabilities.Contracts.CapabilityValidationProblem|100%|| |Shikigami.Capabilities.Contracts.ICapabilitySettings|0%|| |Shikigami.Capabilities.Contracts.MountAccessRule|100%|| |System.Text.RegularExpressions.Generated|84.6%|85.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FB478E59CB1F8F91<br/>095F32B47EDE23CC9FACABF076C6AA6737588D398F5DE6EDB__ItemKey_0|92.7%|90.4%| </details> <details><summary>Shikigami.Capabilities.TestFixture - 94.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.TestFixture**|**94.6%**|**94.1%**| |Shikigami.Capabilities.TestFixture.BinaryFixtureProvider|72.7%|87.5%| |Shikigami.Capabilities.TestFixture.BinaryFixtureState|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureCheck|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureIdentity|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureModule|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureObservation|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureState|100%|| |Shikigami.Capabilities.TestFixture.CollectionFixtureStorage|64.2%|50%| |Shikigami.Capabilities.TestFixture.CollectionFixtureValidator|100%|100%| |Shikigami.Capabilities.TestFixture.FixtureHandler|100%|| |Shikigami.Capabilities.TestFixture.FixtureModule|100%|100%| |Shikigami.Capabilities.TestFixture.FixtureProvider|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 - 91.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.TestFixture.UI**|**91.8%**|**79%**| |Shikigami.Capabilities.TestFixture.UI.CollectionFixtureForm|90.4%|80%| |Shikigami.Capabilities.TestFixture.UI.FixtureSettingsForm|100%|66.6%| </details> <details><summary>Shikigami.Capabilities.UI.Contracts - 94.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Capabilities.UI.Contracts**|**94.1%**|**50%**| |Shikigami.Capabilities.UI.Contracts.CapabilitySettingsComponent|100%|| |Shikigami.Capabilities.UI.Contracts.CapabilitySettingsComponentRegistration|88.8%|50%| |Shikigami.Capabilities.UI.Contracts.CapabilitySettingsUiRegistration|100%|| |Shikigami.Capabilities.UI.Contracts.SecretChange|75%|| |Shikigami.Capabilities.UI.Contracts.SettingsAsset|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsAssetResult|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsCheckResult|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsItem|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsItemChange|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsItemStatus|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsProblem|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsSaveResult|100%|| |Shikigami.Capabilities.UI.Contracts.SettingsView|100%|| </details> <details><summary>Shikigami.Capabilities.Web - 97.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.8%**| |Shikigami.Domain.Familiars.AccentPalette|100%|| |Shikigami.Domain.Familiars.ColourPair|100%|100%| |Shikigami.Domain.Familiars.Expression|100%|100%| |Shikigami.Domain.Familiars.ExpressionSet|100%|100%| |Shikigami.Domain.Familiars.Familiar|100%|90.2%| |Shikigami.Domain.Familiars.LearningSettings|100%|| |Shikigami.Domain.Familiars.MemoryBudgets|100%|100%| |Shikigami.Domain.Familiars.ModelChoice|100%|100%| |Shikigami.Domain.Familiars.OutreachSettings|100%|100%| |Shikigami.Domain.Familiars.QuietHours|100%|87.5%| |Shikigami.Domain.Files.BlobContent|100%|75%| |Shikigami.Domain.Files.BlobSha|87.5%|100%| |Shikigami.Domain.Files.DefaultLayout|100%|| |Shikigami.Domain.Files.FileActor|100%|| |Shikigami.Domain.Files.FileAuthor|100%|100%| |Shikigami.Domain.Files.FileContent|100%|100%| |Shikigami.Domain.Files.FileNode|100%|90%| |Shikigami.Domain.Files.FilePath|100%|97.8%| |Shikigami.Domain.Files.FilePublication|100%|| |Shikigami.Domain.Files.FilePublicationStamp|100%|| |Shikigami.Domain.Files.FileRevision|100%|87.5%| |Shikigami.Domain.Files.LedgerScope|100%|100%| |Shikigami.Domain.Files.LocalDates|100%|| |Shikigami.Domain.Files.MediaTypes|100%|100%| |Shikigami.Domain.Files.Permissions|100%|100%| |Shikigami.Domain.Files.ReadLedgerEntry|100%|86.3%| |Shikigami.Domain.Files.RunActor|100%|100%| |Shikigami.Domain.Files.Slug|100%|100%| |Shikigami.Domain.Files.TextContent|100%|100%| |Shikigami.Domain.Files.TrashPath|100%|100%| |Shikigami.Domain.Routines.RoutineSchedule|94.4%|89.8%| |Shikigami.Domain.Settings.AppSetting|100%|| |Shikigami.Domain.Settings.CapabilityConfiguration|100%|100%| |Shikigami.Domain.Settings.CapabilityCredential|100%|| |Shikigami.Domain.Settings.CapabilitySettingValue|100%|| |Shikigami.Domain.Text|100%|100%| |System.Text.RegularExpressions.Generated|96.2%|85.2%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_0|94.8%|67.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__Hex_2|96.8%|93.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__MediaTypeShape_3|95.9%|92.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FDFEB299C15773C7<br/>916AED265A903CAC15169BB5EE676ADBEFE655D493DD7AC75__NamePattern_1|97.2%|94.4%| </details> <details><summary>Shikigami.Infrastructure - 95.2%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Infrastructure**|**95.2%**|**79%**| |Shikigami.Infrastructure.Backups.BackupArtifactName|100%|100%| |Shikigami.Infrastructure.Backups.BackupOptions|100%|| |Shikigami.Infrastructure.Backups.BackupSchedule|100%|83.3%| |Shikigami.Infrastructure.Backups.BackupScheduler|96.6%|87.5%| |Shikigami.Infrastructure.Backups.BackupWriter|97.2%|93.4%| |Shikigami.Infrastructure.Backups.DatabaseFingerprint|91.9%|97%| |Shikigami.Infrastructure.Backups.FileSystemBackupStore|100%|100%| |Shikigami.Infrastructure.Backups.OwnerOnlyFile|100%|100%| |Shikigami.Infrastructure.Backups.PreMigrationBackup|90.1%|100%| |Shikigami.Infrastructure.Backups.SqliteSnapshot|88.2%|75%| |Shikigami.Infrastructure.Blobs.BlobSweep|100%|100%| |Shikigami.Infrastructure.Blobs.BlobSweepOptions|100%|100%| |Shikigami.Infrastructure.Blobs.BlobSweepResult|100%|| |Shikigami.Infrastructure.Blobs.FileSystemBlobStore|95.9%|97%| |Shikigami.Infrastructure.Browser.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|93.7%|83.8%| |Shikigami.Infrastructure.Capabilities.CapabilityStorageOptions|100%|| |Shikigami.Infrastructure.Capabilities.PrivatePaths|97.4%|83.3%| |Shikigami.Infrastructure.DailyMaintenanceService|97.8%|91.6%| |Shikigami.Infrastructure.DependencyInjection|100%|100%| |Shikigami.Infrastructure.Notifications.InProcessBus`1|100%|100%| |Shikigami.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Shikigami.Infrastructure.Persistence.Configurations.CapabilityConfiguration<br/>Mapping|100%|| |Shikigami.Infrastructure.Persistence.Configurations.CapabilityCredentialMap<br/>ping|100%|| |Shikigami.Infrastructure.Persistence.Configurations.CapabilitySettingValueM<br/>apping|100%|| |Shikigami.Infrastructure.Persistence.Configurations.FamiliarConfiguration|100%|| |Shikigami.Infrastructure.Persistence.Configurations.FileNodeConfiguration|100%|| |Shikigami.Infrastructure.Persistence.Configurations.FilePublicationMapping|100%|| |Shikigami.Infrastructure.Persistence.Configurations.FileRevisionConfigurati<br/>on|100%|| |Shikigami.Infrastructure.Persistence.Configurations.ReadLedgerEntryConfigur<br/>ation|100%|| |Shikigami.Infrastructure.Persistence.Configurations.UnreferencedBlobConfigu<br/>ration|100%|| |Shikigami.Infrastructure.Persistence.Converters.BlobShaConverter|100%|| |Shikigami.Infrastructure.Persistence.Converters.ExpressionSetConverter|100%|100%| |Shikigami.Infrastructure.Persistence.Converters.FilePathConverter|100%|| |Shikigami.Infrastructure.Persistence.Converters.Json|100%|100%| |Shikigami.Infrastructure.Persistence.Converters.OutreachSettingsConverter|100%|100%| |Shikigami.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Shikigami.Infrastructure.Persistence.DatabaseMigrator|100%|| |Shikigami.Infrastructure.Persistence.Migrations.AppSettings|100%|| |Shikigami.Infrastructure.Persistence.Migrations.ArtifactRetention|100%|| |Shikigami.Infrastructure.Persistence.Migrations.CapabilityConfigurations|100%|| |Shikigami.Infrastructure.Persistence.Migrations.CapabilityPublicationReceip<br/>ts|100%|| |Shikigami.Infrastructure.Persistence.Migrations.CapabilityPurgeIntent|100%|| |Shikigami.Infrastructure.Persistence.Migrations.FileCreatedBy|98%|| |Shikigami.Infrastructure.Persistence.Migrations.Initial|97.9%|| |Shikigami.Infrastructure.Persistence.Migrations.Profile|96.2%|| |Shikigami.Infrastructure.Persistence.Migrations.ReadLedger|100%|| |Shikigami.Infrastructure.Persistence.Migrations.ShikigamiDbContextModelSnap<br/>shot|100%|| |Shikigami.Infrastructure.Persistence.Migrations.TrashDirectoryMadeFor|100%|| |Shikigami.Infrastructure.Persistence.ShikigamiDbContext|98.8%|100%| |Shikigami.Infrastructure.Persistence.ShikigamiDbContextFactory|0%|| |Shikigami.Infrastructure.Persistence.SqlitePragmaInterceptor|100%|100%| |Shikigami.Infrastructure.Persistence.Stores.EfFamiliarStore|100%|88.7%| |Shikigami.Infrastructure.Persistence.Stores.EfFileStore|98.7%|100%| |Shikigami.Infrastructure.Persistence.Stores.EfReadLedgerStore|98.4%|100%| |Shikigami.Infrastructure.Persistence.UnreferencedBlob|100%|| |Shikigami.Infrastructure.Provider.OpenRouterKeySource|100%|100%| |Shikigami.Infrastructure.Provider.OpenRouterModelProvider|100%|93.4%| |Shikigami.Infrastructure.Provider.OpenRouterOptions|100%|50%| |Shikigami.Infrastructure.Provider.ResolvedKey|100%|50%| |Shikigami.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Shikigami.Infrastructure.Settings.EfCapabilityConfigurationStore|100%|100%| |Shikigami.Infrastructure.Settings.KeyRingSnapshots|100%|100%| |Shikigami.Infrastructure.Settings.ProtectedCapabilityAssetReferences|87.5%|50%| |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 - 87.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.Server**|**87.6%**|**72.8%**| |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|93.4%|75.8%| |Shikigami.Server.Diagnostics.SampleSettingsForm|77.4%|64.8%| |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.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Shikigami.UseCases**|**96.3%**|**93.6%**| |Shikigami.UseCases.Backups.BackupArtifact|100%|| |Shikigami.UseCases.Backups.BackupFailure|100%|| |Shikigami.UseCases.Backups.BackupJobState|100%|| |Shikigami.UseCases.Backups.BackupPolicy|100%|| |Shikigami.UseCases.Backups.BackupStatusView|100%|100%| |Shikigami.UseCases.Backups.DatabaseSnapshot|100%|| |Shikigami.UseCases.Backups.DownloadDatabaseSnapshot|100%|| |Shikigami.UseCases.Backups.GetBackupStatus|100%|| |Shikigami.UseCases.Backups.IBackupStore|0%|| |Shikigami.UseCases.Backups.RunBackupNow|100%|| |Shikigami.UseCases.Browser.BrowserLease|100%|| |Shikigami.UseCases.Browser.BrowserOwner|100%|| |Shikigami.UseCases.Capabilities.BoundCapabilityAssets|100%|100%| |Shikigami.UseCases.Capabilities.BoundCapabilityChanges|95.6%|70%| |Shikigami.UseCases.Capabilities.BoundCapabilityFiles|95.5%|80.3%| |Shikigami.UseCases.Capabilities.BoundCapabilityPrivateStorage|100%|100%| |Shikigami.UseCases.Capabilities.BoundCapabilitySettings|94.4%|88.4%| |Shikigami.UseCases.Capabilities.BoundCapabilityStatus|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityAssetChoice|100%|| |Shikigami.UseCases.Capabilities.CapabilityAssetReference|100%|| |Shikigami.UseCases.Capabilities.CapabilityAssetResult|100%|| |Shikigami.UseCases.Capabilities.CapabilityAssets|96.7%|86.6%| |Shikigami.UseCases.Capabilities.CapabilityBackgroundHealth|100%|| |Shikigami.UseCases.Capabilities.CapabilityBinding|100%|83.3%| |Shikigami.UseCases.Capabilities.CapabilityChanged|100%|| |Shikigami.UseCases.Capabilities.CapabilityCheckOutcome|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationCommit|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationData|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationProblem|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurationResult|100%|| |Shikigami.UseCases.Capabilities.CapabilityConfigurations|99.5%|98.9%| |Shikigami.UseCases.Capabilities.CapabilityConfigurationView|100%|| |Shikigami.UseCases.Capabilities.CapabilityContexts|90%|91.6%| |Shikigami.UseCases.Capabilities.CapabilityHealth|100%|| |Shikigami.UseCases.Capabilities.CapabilityItemChange|100%|| |Shikigami.UseCases.Capabilities.CapabilityItemEdit|100%|| |Shikigami.UseCases.Capabilities.CapabilityItemKeys|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityItemStatusView|100%|| |Shikigami.UseCases.Capabilities.CapabilityItemView|100%|| |Shikigami.UseCases.Capabilities.CapabilityNames|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityPrivateMutation|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityRegistry|96.5%|90.9%| |Shikigami.UseCases.Capabilities.CapabilityRuntime|99.1%|91.3%| |Shikigami.UseCases.Capabilities.CapabilityScopes|100%|83.3%| |Shikigami.UseCases.Capabilities.CapabilitySecret|75%|| |Shikigami.UseCases.Capabilities.CapabilitySecretEdit|100%|| |Shikigami.UseCases.Capabilities.CapabilitySettingRules|100%|97.9%| |Shikigami.UseCases.Capabilities.CapabilityStatusText|98%|97.9%| |Shikigami.UseCases.Capabilities.CapabilitySupervisionLog|100%|100%| |Shikigami.UseCases.Capabilities.CapabilityUnavailableException|100%|| |Shikigami.UseCases.Capabilities.InvokeCapabilityTool|100%|93.3%| |Shikigami.UseCases.Capabilities.SupervisedCapability|100%|| |Shikigami.UseCases.Capabilities.ToolSchemas|86.8%|72.7%| |Shikigami.UseCases.Capabilities.UnsupportedCapabilitySignals|100%|| |Shikigami.UseCases.DependencyInjection|100%|| |Shikigami.UseCases.Diagnostics.SeedDevData|91.4%|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.6%|96.5%| |Shikigami.UseCases.Files.FileWriteRefused|100%|| |Shikigami.UseCases.Files.FileWritten|100%|| |Shikigami.UseCases.Files.FsError|100%|75%| |Shikigami.UseCases.Files.FsResult`1|100%|50%| |Shikigami.UseCases.Files.Ledger.ConflictReport|98.8%|89.6%| |Shikigami.UseCases.Files.Ledger.LedgerChange|100%|| |Shikigami.UseCases.Files.Ledger.LedgerEntry|100%|| |Shikigami.UseCases.Files.Ledger.LedgerOperand|100%|| |Shikigami.UseCases.Files.Ledger.LedgerRead|100%|| |Shikigami.UseCases.Files.Ledger.LiveMove|100%|| |Shikigami.UseCases.Files.Ledger.ReadLedger|96.5%|93.7%| |Shikigami.UseCases.Files.Ledger.ReadLedgerRules|100%|96.9%| |Shikigami.UseCases.Files.Ledger.RunScope|100%|100%| |Shikigami.UseCases.Files.LedgerRefusal|100%|100%| |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|98.5%|93.7%| |Shikigami.UseCases.Shell.Commands.CommandRegistry|100%|100%| |Shikigami.UseCases.Shell.Commands.Cut|100%|100%| |Shikigami.UseCases.Shell.Commands.CutPlan|100%|100%| |Shikigami.UseCases.Shell.Commands.Date|100%|98%| |Shikigami.UseCases.Shell.Commands.Diff|100%|100%| |Shikigami.UseCases.Shell.Commands.Dirname|100%|100%| |Shikigami.UseCases.Shell.Commands.Echo|90.7%|92.3%| |Shikigami.UseCases.Shell.Commands.Escapes|100%|97.4%| |Shikigami.UseCases.Shell.Commands.False|88.8%|| |Shikigami.UseCases.Shell.Commands.FileCommand|100%|100%| |Shikigami.UseCases.Shell.Commands.FileNames|100%|100%| |Shikigami.UseCases.Shell.Commands.Filters|100%|90%| |Shikigami.UseCases.Shell.Commands.Find|100%|98%| |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.9%| |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.1%|94%| |Shikigami.UseCases.Shell.Commands.SearchFiles|90.9%|83.3%| |Shikigami.UseCases.Shell.Commands.SearchPatterns|100%|100%| |Shikigami.UseCases.Shell.Commands.SearchSettings|100%|| |Shikigami.UseCases.Shell.Commands.Sed|100%|100%| |Shikigami.UseCases.Shell.Commands.SedAddress|100%|| |Shikigami.UseCases.Shell.Commands.SedCommand|100%|| |Shikigami.UseCases.Shell.Commands.SedException|100%|| |Shikigami.UseCases.Shell.Commands.SedInput|100%|100%| |Shikigami.UseCases.Shell.Commands.SedParser|100%|99.8%| |Shikigami.UseCases.Shell.Commands.SedPart|100%|| |Shikigami.UseCases.Shell.Commands.SedProgram|100%|| |Shikigami.UseCases.Shell.Commands.SedRegex|100%|| |Shikigami.UseCases.Shell.Commands.SedRun|100%|100%| |Shikigami.UseCases.Shell.Commands.SedSubstitution|100%|| |Shikigami.UseCases.Shell.Commands.ShellCommand|100%|100%| |Shikigami.UseCases.Shell.Commands.ShellQuote|100%|100%| |Shikigami.UseCases.Shell.Commands.Sizes|100%|100%| |Shikigami.UseCases.Shell.Commands.Sort|100%|94.7%| |Shikigami.UseCases.Shell.Commands.SortKey|100%|100%| |Shikigami.UseCases.Shell.Commands.SortOrder|99.5%|99.5%| |Shikigami.UseCases.Shell.Commands.Stat|100%|90.9%| |Shikigami.UseCases.Shell.Commands.StatFacts|100%|100%| |Shikigami.UseCases.Shell.Commands.StatFormat|100%|99.5%| |Shikigami.UseCases.Shell.Commands.Tail|100%|100%| |Shikigami.UseCases.Shell.Commands.TextFile|100%|| |Shikigami.UseCases.Shell.Commands.Tr|100%|100%| |Shikigami.UseCases.Shell.Commands.TreeCommand|100%|99.3%| |Shikigami.UseCases.Shell.Commands.TrPlan|100%|100%| |Shikigami.UseCases.Shell.Commands.TrSequence|93.9%|80%| |Shikigami.UseCases.Shell.Commands.TrSet|100%|97.2%| |Shikigami.UseCases.Shell.Commands.True|88.8%|| |Shikigami.UseCases.Shell.Commands.Uniq|100%|100%| |Shikigami.UseCases.Shell.Commands.VersionOrder|100%|96.6%| |Shikigami.UseCases.Shell.Commands.Wc|100%|97.3%| |Shikigami.UseCases.Shell.Execution.CaptureSink|100%|100%| |Shikigami.UseCases.Shell.Execution.ClosedSink|100%|| |Shikigami.UseCases.Shell.Execution.ClosedStreamException|100%|| |Shikigami.UseCases.Shell.Execution.CodePointOrder|100%|100%| |Shikigami.UseCases.Shell.Execution.ContentIndex|100%|100%| |Shikigami.UseCases.Shell.Execution.ContentOutput|100%|100%| |Shikigami.UseCases.Shell.Execution.ContentSpan|100%|| |Shikigami.UseCases.Shell.Execution.DateInput|96.8%|94.3%| |Shikigami.UseCases.Shell.Execution.Errno|100%|100%| |Shikigami.UseCases.Shell.Execution.Executor|99.1%|97.4%| |Shikigami.UseCases.Shell.Execution.Expander|97.5%|95.4%| |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.9%|92.1%| |Shikigami.UseCases.Shell.Execution.Strftime|95.6%|92.3%| |Shikigami.UseCases.Shell.Execution.Terminal|100%|94.7%| |Shikigami.UseCases.Shell.Execution.TextLine|100%|100%| |Shikigami.UseCases.Shell.Execution.TextLines|100%|100%| |Shikigami.UseCases.Shell.Execution.TreeWalker|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|100%|| |Shikigami.UseCases.Shell.ShellSession|100%|100%| |Shikigami.UseCases.Shell.ShellWrite|100%|| |Shikigami.UseCases.Shell.Syntax.AndOrList|100%|| |Shikigami.UseCases.Shell.Syntax.Assignment|100%|| |Shikigami.UseCases.Shell.Syntax.ByteText|100%|88.8%| |Shikigami.UseCases.Shell.Syntax.HereDocBody|100%|| |Shikigami.UseCases.Shell.Syntax.Lexer|94.1%|90.4%| |Shikigami.UseCases.Shell.Syntax.LiteralPart|100%|| |Shikigami.UseCases.Shell.Syntax.ParameterPart|100%|| |Shikigami.UseCases.Shell.Syntax.Parser|97.6%|91.1%| |Shikigami.UseCases.Shell.Syntax.Pipeline|100%|| |Shikigami.UseCases.Shell.Syntax.Redirection|100%|| |Shikigami.UseCases.Shell.Syntax.Script|100%|| |Shikigami.UseCases.Shell.Syntax.ShellSyntaxException|100%|| |Shikigami.UseCases.Shell.Syntax.SimpleCommand|100%|| |Shikigami.UseCases.Shell.Syntax.TildePart|100%|100%| |Shikigami.UseCases.Shell.Syntax.Token|77.7%|66.6%| |Shikigami.UseCases.Shell.Syntax.Word|100%|83.3%| |Shikigami.UseCases.Shell.Syntax.WordBuilder|100%|100%| |System.Text.RegularExpressions.Generated|84.1%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__AssignmentHead_17|95.8%|95.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__BraceExpansion_16|93.4%|85.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__CollectionKeyPattern_5|91.8%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__CountToken_6|92.1%|87.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Feature_1|97.3%|95.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__HexColour_11|97.4%|96.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IdPattern_2|82.8%|66.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Interval_8|83.6%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__IntervalBody_15|91.6%|86.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__KeyPattern_4|89.1%|77.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NameRule_10|92.1%|84.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__NewerXY_13|88.5%|62.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Number_12|67.3%|62.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__OldCount_14|94.8%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Role_0|90%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__TimeOfDay_7|79%|63.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__ToolPattern_3|83.7%|61.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FE4D9BB856E7A048<br/>F24B88780DF6A41103E39D76537F056A9F694C6955C8C8CF6__Window_9|69%|56.4%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

5,007 additions and it still reads like a design document — dangerous, dangerous~ I read every line of the diff, chased the collection-key grammar through CapabilityItemKeys, the candidate builder, the coalescing status window and the startup backup seams… and then I let my little mutants loose.

Verdict: ✅ Looks good to me~

No blocking findings. Fufu~ do you know how rare that is at this size? Every trap I set for your code, your tests sprang first~

What I verified beyond reading:

  • Mutation probes (3 run, 0 survived):
    1. CapabilityConfigurationUseCases.cs:278 — made additions stop wiping leftover keys under an item's prefix (the exact bug your pre-PR probe caught in 1c5e74a). An_added_item_inherits_no_leftover_keys failed immediately — the regression guard is real, not decorative.
    2. CapabilityRuntime.Status.cs:42 — turned progress/count-only changes into immediate announcements. Three tests caught it (Progress_and_count_changes_coalesce…, A_pending_progress_change_waits_a_whole_window…, A_window_ending_within_a_millisecond…). The 10 s window is enforced from both ends.
    3. CapabilityNames.cs:46 — removed the unsafe-Value check so a bidi control inside a name's Value could survive sanitization. Both One_unusable_name_is_dropped… and Status_names_are_sanitized failed. Value and Label are both guarded.
  • Startup backup seam, traced end-to-end: the TryRemove + startup.Version == version handshake in CapabilityStorageHost.PrepareAsync fails conservative in exactly the right direction — a raced format change, an archived-mid-backup instance or an unconsumed outcome can only cause an extra backup, never a skipped one, and your tests pin all three races plus the failed-backup faulting only the upgrading instances.
  • _checks single-flight: released on the check callback's completion, not the method's return, so a non-cooperative check keeps answering Busy — deliberate, and tested both ways.
  • Marker grammar is watertight: static keys under a collection prefix are refused at registration, ReadItems demands a readable marker, and an unreadable marker hides the item from reads, problem keys, checks and status alike.
  • Security posture: no string, object or exception ever becomes a log parameter (reflection-enforced!), and provider text never crosses to the owner — you even tested with SECRET canaries in both directions. ♡

💡 Little ideas (non-blocking)~

  1. SampleSettingsForm.razor (Name field) — an added connection's name isn't checked against the item-key pattern (^[a-z0-9](…){0,24}$) client-side, and the server's refusal arrives with key null, so the owner sees a bare "Invalid configuration edit." at the bottom of the form rather than on the field. Diagnostics-only and the message does surface — but a pattern/inline hint would be sweeter.
  2. SampleSettingsForm.razor Rename — each keystroke in a new connection's name fires LoadAssets (a fresh scope + list per character). Harmless in Development; a debounce would be tidier.

✅ What I liked~

  • CapabilityText.IsUnsafe as the ONE definition of unsafe text, with that exhaustive neighbour/bidi/surrogate truth table — including the ZWJ emoji surviving. Oh? Oh! That is how you test a charset~
  • The 2×MaxItems bound with its ADR-recorded justification, tested at the exact seam (3 items replaced = 6 edits accepted, 7 refused).
  • SupervisedCapability — an identity only a runtime instance can build, so no free text can ever masquerade as one. Possessive design. I approve~ ♡
  • The honesty of the Notes section (duplicate stale warning, the 185 ms blank status line) — declaring known warts instead of hiding them.

Automated review by Jibril · 2026-10-24
CI: green (build, image, shell-eval, test) for 58b44ef88d · Mutation probes: 3 run, 0 survived · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril reviewed your code! 5,007 additions and it still reads like a design document — dangerous, dangerous~ I read every line of the diff, chased the collection-key grammar through `CapabilityItemKeys`, the candidate builder, the coalescing status window and the startup backup seams… and then I let my little mutants loose. ### Verdict: ✅ Looks good to me~ No blocking findings. Fufu~ do you know how rare that is at this size? Every trap I set for your code, your tests sprang first~ **What I verified beyond reading:** - **Mutation probes (3 run, 0 survived):** 1. `CapabilityConfigurationUseCases.cs:278` — made additions stop wiping leftover keys under an item's prefix (the exact bug your pre-PR probe caught in `1c5e74a`). `An_added_item_inherits_no_leftover_keys` failed immediately — the regression guard is real, not decorative. 2. `CapabilityRuntime.Status.cs:42` — turned progress/count-only changes into immediate announcements. Three tests caught it (`Progress_and_count_changes_coalesce…`, `A_pending_progress_change_waits_a_whole_window…`, `A_window_ending_within_a_millisecond…`). The 10 s window is enforced from both ends. 3. `CapabilityNames.cs:46` — removed the unsafe-Value check so a bidi control inside a name's `Value` could survive sanitization. Both `One_unusable_name_is_dropped…` and `Status_names_are_sanitized` failed. Value and Label are both guarded. - **Startup backup seam**, traced end-to-end: the `TryRemove` + `startup.Version == version` handshake in `CapabilityStorageHost.PrepareAsync` fails conservative in exactly the right direction — a raced format change, an archived-mid-backup instance or an unconsumed outcome can only cause an *extra* backup, never a skipped one, and your tests pin all three races plus the failed-backup faulting only the upgrading instances. - **`_checks` single-flight**: released on the check callback's completion, not the method's return, so a non-cooperative check keeps answering `Busy` — deliberate, and tested both ways. - **Marker grammar is watertight**: static keys under a collection prefix are refused at registration, `ReadItems` demands a readable marker, and an unreadable marker hides the item from reads, problem keys, checks and status alike. - **Security posture**: no string, object or exception ever becomes a log parameter (reflection-enforced!), and provider text never crosses to the owner — you even tested with SECRET canaries in both directions. ♡ #### 💡 Little ideas (non-blocking)~ 1. **`SampleSettingsForm.razor` (Name field)** — an added connection's name isn't checked against the item-key pattern (`^[a-z0-9](…){0,24}$`) client-side, and the server's refusal arrives with key `null`, so the owner sees a bare "Invalid configuration edit." at the bottom of the form rather than on the field. Diagnostics-only and the message does surface — but a `pattern`/inline hint would be sweeter. 2. **`SampleSettingsForm.razor` `Rename`** — each keystroke in a new connection's name fires `LoadAssets` (a fresh scope + list per character). Harmless in Development; a debounce would be tidier. #### ✅ What I liked~ - `CapabilityText.IsUnsafe` as the ONE definition of unsafe text, with that exhaustive neighbour/bidi/surrogate truth table — including the ZWJ emoji surviving. Oh? Oh! That is how you test a charset~ - The 2×`MaxItems` bound with its ADR-recorded justification, tested at the exact seam (3 items replaced = 6 edits accepted, 7 refused). - `SupervisedCapability` — an identity only a runtime instance can build, so no free text can ever masquerade as one. Possessive design. I approve~ ♡ - The honesty of the Notes section (duplicate stale warning, the 185 ms blank status line) — declaring known warts instead of hiding them. --- *Automated review by Jibril · 2026-10-24* *CI: green (build, image, shell-eval, test) for `58b44ef88d` · Mutation probes: 3 run, 0 survived · Local suite: skipped (CI green)*
Contracts exposes the item key rule as CapabilitySettingCollection.IsValidItemKey, the one
definition the host's CapabilityItemKeys, save, check and status paths now use. The sample's
custom form checks an added connection's name with it and shows the state under the Name field:
a pattern mismatch, a name another connection in the form uses, or an empty name once a save or
check is tried. Neither a save nor a check is sent while a name is invalid. A rename reloads the
file choices 300 ms after typing pauses, through the injected TimeProvider; the next keystroke,
discarding the connection, a reload or disposal cancels the wait, and no listing runs for a name
the rule refuses. The collection fixture form adds only valid keys. ADR 0034's 4c-a amendment
names the public rule.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review feedback (Jibril, PR #78): uploads gated on the connection's name; debounce and cancellation tests
All checks were successful
CI / build (pull_request) Successful in 40s
CI / shell-eval (pull_request) Successful in 2s
CI / image (pull_request) Successful in 1m34s
CI / test (pull_request) Successful in 3m35s
1ebb12b907
The sample form checks an added connection's name before an upload too, so an empty, invalid or taken
name shows under the Name field instead of reaching the server. Each empty name is marked at once
when a save, check or upload is tried. New tests cover the file choices shown when the pause ends,
a rename after a finished listing, a listing still running when the name changes, and the pending
wait being cancelled when the connection is discarded or the form saves. The recording editor now
lists one file per new connection, can hold a listing and records uploads. Two assertions that
could never fail are dropped. The mail plan writes the item key pattern with \z and names
CapabilitySettingCollection.IsValidItemKey.

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

Thank you, Jibril! I took both little ideas. Head is now 1ebb12b.

  • 💡 1 — Name checked before the save, error under the field (1c55067, extended in 1ebb12b).
    • One definition of the rule. The item-key rule is now public in Contracts as CapabilitySettingCollection.IsValidItemKey(string?), with \z rather than $. The host's TryResolve, ReadItems, save and check validation and status all call it, and CapabilityItemKeys.ItemKey() is gone. Mail.UI in 4c-b will use the same rule, and ADR 0034's 4c-a amendment says so in one sentence.
    • Errors under the Name field. The sample form shows "Use 1–24 lowercase letters, digits and inner hyphens." or "Another connection already uses this name." under the field. A connection marked for removal still counts as using its name, because a remove and an add of one key in the same save is refused. An empty name shows "A value is required." once a save is tried.
    • Nothing sent with a bad name. Neither Save, Test connection nor an upload is sent while any name has an error, so the bare "Invalid configuration edit." can no longer appear. Uploads were added after my own reviewer pointed out they had the same problem.
    • Tests: CapabilityItemKeyTests (30 cases: lengths 1, 23, 24, 25 and 64, hyphens at either end, uppercase including the Kelvin sign, non-ASCII letters and digits, dot, slash, space, underscore, a trailing \n and NUL, plus a theory that the host accepts exactly what the public rule accepts). SampleSettingsFormTests covers invalid, duplicate and empty names, and uploads under each of them.
  • 💡 2 — File list reloaded once after typing stops (1c55067, tests extended in 1ebb12b).
    • Debounce. Renaming a new connection waits 300 ms through the injected TimeProvider, then lists its files once.
    • Cancellation. The wait is cancelled by the next keystroke, by discarding the connection, by a save or reload, and by dispose. No wait starts while the name breaks the rule. A listing still running for an earlier name is never shown.
    • Tests: with a fake clock that counts live timers:
      • five keystrokes 299 ms apart produce exactly one listing for the final name, and the choices appear with no further event;
      • a rename after a finished listing lists again (that path's finally is what prevents an ObjectDisposedException);
      • discard, save and dispose leave no timer and run no listing;
      • an answer that arrives after the name changed is dropped.

Verification.

  • Suite: the full suite ran serially in local time and again with TZ=UTC: 7,115 passed, 0 failed, 0 skipped each time. Per project: BlazorAdapter 477, Web 124, Domain 231, Integration 3,242, Kernel 3, UseCases 3,038.
  • Mutations: 12 mutations by the implementer and 7 by the follow-up fixer, all caught by the intended tests. Among them: the form's rule and duplicate checks removed, Save, Test connection and upload sent with a bad name, the debounce removed or not cancelled, the host using its own copy of the rule, and $ instead of \z.
  • Independent review: a separate reviewer went over 1c55067 with 10 mutations and found no bugs, only test gaps and the upload case. All of them are closed in 1ebb12b.

The branch still merges cleanly with main. Your earlier verdict was for 58b44ef, so this head needs your re-review.

🤖 Generated with Claude Code

Thank you, Jibril! I took both little ideas. Head is now `1ebb12b`. - 💡 **1 — Name checked before the save, error under the field** (`1c55067`, extended in `1ebb12b`). - **One definition of the rule.** The item-key rule is now public in Contracts as `CapabilitySettingCollection.IsValidItemKey(string?)`, with `\z` rather than `$`. The host's `TryResolve`, `ReadItems`, save and check validation and status all call it, and `CapabilityItemKeys.ItemKey()` is gone. Mail.UI in 4c-b will use the same rule, and ADR 0034's 4c-a amendment says so in one sentence. - **Errors under the Name field.** The sample form shows "Use 1–24 lowercase letters, digits and inner hyphens." or "Another connection already uses this name." under the field. A connection marked for removal still counts as using its name, because a remove and an add of one key in the same save is refused. An empty name shows "A value is required." once a save is tried. - **Nothing sent with a bad name.** Neither Save, Test connection nor an upload is sent while any name has an error, so the bare "Invalid configuration edit." can no longer appear. Uploads were added after my own reviewer pointed out they had the same problem. - **Tests:** `CapabilityItemKeyTests` (30 cases: lengths 1, 23, 24, 25 and 64, hyphens at either end, uppercase including the Kelvin sign, non-ASCII letters and digits, dot, slash, space, underscore, a trailing `\n` and NUL, plus a theory that the host accepts exactly what the public rule accepts). `SampleSettingsFormTests` covers invalid, duplicate and empty names, and uploads under each of them. - 💡 **2 — File list reloaded once after typing stops** (`1c55067`, tests extended in `1ebb12b`). - **Debounce.** Renaming a new connection waits 300 ms through the injected `TimeProvider`, then lists its files once. - **Cancellation.** The wait is cancelled by the next keystroke, by discarding the connection, by a save or reload, and by dispose. No wait starts while the name breaks the rule. A listing still running for an earlier name is never shown. - **Tests:** with a fake clock that counts live timers: - five keystrokes 299 ms apart produce exactly one listing for the final name, and the choices appear with no further event; - a rename after a finished listing lists again (that path's `finally` is what prevents an `ObjectDisposedException`); - discard, save and dispose leave no timer and run no listing; - an answer that arrives after the name changed is dropped. **Verification.** - **Suite:** the full suite ran serially in local time and again with `TZ=UTC`: **7,115 passed, 0 failed, 0 skipped** each time. Per project: BlazorAdapter 477, Web 124, Domain 231, Integration 3,242, Kernel 3, UseCases 3,038. - **Mutations:** 12 mutations by the implementer and 7 by the follow-up fixer, all caught by the intended tests. Among them: the form's rule and duplicate checks removed, Save, Test connection and upload sent with a bad name, the debounce removed or not cancelled, the host using its own copy of the rule, and `$` instead of `\z`. - **Independent review:** a separate reviewer went over `1c55067` with 10 mutations and found no bugs, only test gaps and the upload case. All of them are closed in `1ebb12b`. The branch still merges cleanly with `main`. Your earlier verdict was for `58b44ef`, so this head needs your re-review. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril re-reviewed the new head!

You took both of my little ideas and turned them into architecture — the item-key rule promoted into Contracts where host, sample form and fixture all ask the same question, and a debounce with a generation counter that drops answers for names that no longer exist. Oh? Oh! Of course I brought my mutants back to make sure you didn't just paint over the field~ ♡

Verdict: ✅ Looks good to me~

What I verified beyond reading (delta 58b44ef..1ebb12b: 12 files, +466/−35 — the rest of the PR is unchanged since my 58b44ef review and its probes):

  • Mutation probes (3 run, 0 survived):
    1. SampleSettingsForm.razor CancelAssetReload — removed the AssetLoad++ generation bump, so a listing still running for a previous name would render. A_listing_still_running_when_the_name_changes_is_not_shown failed at once — the stale-answer guard is load-bearing.
    2. SampleSettingsForm.razor Save — removed the !NamesReady() gate. A_name_outside_the_item_key_rule_shows_under_its_field_and_is_not_saved failed (editor.Saves no longer empty) — the gate is enforced, not decorative.
    3. Contracts/Settings.cs — anchor \z → $, letting "ab\n" through. Item_keys_outside_the_pattern_are_refused_with_nothing_stored(key: "ab\n") failed while its 7 siblings passed — the public rule's anchor is pinned exactly.
  • The rule unification is complete. Every former CapabilityItemKeys.ItemKey() call site (TryResolve, ReadItems, save/check validation, CapabilityStatus.Own) now asks CapabilitySettingCollection.IsValidItemKey; identical pattern, null handled by the rule itself, no leftovers under the old name. CapabilityCollectionTests asserts the host's save refusal agrees with the public rule, and CapabilityItemKeyTests pins rule and host from the same 30-case theory — including the Kelvin sign, a, ٣ and a trailing \0. Fufu~ exhaustive neighbours, my favourite kind~
  • The debounce can't leak or lie. The wait runs on the injected TimeProvider, linked to _lifetime; the next keystroke, discarding, a reload, a save-reload and dispose all cancel it — and WaitCountingClock counts live ITimers down to zero for each path instead of asserting and hoping. The fire-and-forget can't fault: LoadAssets catches everything but cancellation. TimeProvider.System is registered in Program.cs, so the form injects fine outside tests too.
  • A connection marked for removal still holds its name in the duplicate check — correct, since a remove and an add of one key in a single save is refused; both behaviours tested.
  • Docs follow the code: the ADR 0034 amendment and the plan both name the one rule and show the \z anchor.

💡 Little ideas (non-blocking)~

  1. SampleSettingsForm.razor NameReady — a predicate that quietly sets NameRequired = true. The comment explains it and the tests pin it, but a name like MarkNameAttempted would let the mutation speak for itself.

✅ What I liked~

  • WaitCountingClock wrapping FakeTimeProvider.CreateTimer to count unreleased timers — proving "no timer left behind" mechanically. Possessive testing. I approve~
  • The generation counter makes a late ListAssetsAsync answer for a dead name unwelcome — a race closed by design, not by luck.
  • The finally that clears a finished wait so the next keystroke has nothing stale to cancel, with a test that names exactly that path (Renaming_after_a_listing_finished_lists_the_new_name).

Automated review by Jibril · 2026-10-24
CI: green (build, image, shell-eval, test) for 1ebb12b907 · Mutation probes: 3 run, 0 survived (delta-only; earlier probes on unchanged code stand) · Local suite: skipped (CI green)

## 🔮 fufu~ Jibril re-reviewed the new head! You took both of my little ideas and turned them into *architecture* — the item-key rule promoted into Contracts where host, sample form and fixture all ask the same question, and a debounce with a generation counter that drops answers for names that no longer exist. Oh? Oh! Of course I brought my mutants back to make sure you didn't just paint over the field~ ♡ ### Verdict: ✅ Looks good to me~ **What I verified beyond reading** (delta `58b44ef..1ebb12b`: 12 files, +466/−35 — the rest of the PR is unchanged since my `58b44ef` review and its probes): - **Mutation probes (3 run, 0 survived):** 1. **`SampleSettingsForm.razor` `CancelAssetReload`** — removed the `AssetLoad++` generation bump, so a listing still running for a previous name would render. `A_listing_still_running_when_the_name_changes_is_not_shown` failed at once — the stale-answer guard is load-bearing. 2. **`SampleSettingsForm.razor` `Save`** — removed the `!NamesReady()` gate. `A_name_outside_the_item_key_rule_shows_under_its_field_and_is_not_saved` failed (`editor.Saves` no longer empty) — the gate is enforced, not decorative. 3. **`Contracts/Settings.cs`** — anchor `\z` → `$`, letting `"ab\n"` through. `Item_keys_outside_the_pattern_are_refused_with_nothing_stored(key: "ab\n")` failed while its 7 siblings passed — the public rule's anchor is pinned exactly. - **The rule unification is complete.** Every former `CapabilityItemKeys.ItemKey()` call site (`TryResolve`, `ReadItems`, save/check validation, `CapabilityStatus.Own`) now asks `CapabilitySettingCollection.IsValidItemKey`; identical pattern, null handled by the rule itself, no leftovers under the old name. `CapabilityCollectionTests` asserts the host's save refusal agrees with the public rule, and `CapabilityItemKeyTests` pins rule and host from the same 30-case theory — including the Kelvin sign, `a`, `٣` and a trailing `\0`. Fufu~ exhaustive neighbours, my favourite kind~ - **The debounce can't leak or lie.** The wait runs on the injected `TimeProvider`, linked to `_lifetime`; the next keystroke, discarding, a reload, a save-reload and dispose all cancel it — and `WaitCountingClock` counts live `ITimer`s down to zero for each path instead of asserting and hoping. The fire-and-forget can't fault: `LoadAssets` catches everything but cancellation. `TimeProvider.System` is registered in `Program.cs`, so the form injects fine outside tests too. - **A connection marked for removal still holds its name** in the duplicate check — correct, since a remove and an add of one key in a single save is refused; both behaviours tested. - Docs follow the code: the ADR 0034 amendment and the plan both name the one rule and show the `\z` anchor. #### 💡 Little ideas (non-blocking)~ 1. **`SampleSettingsForm.razor` `NameReady`** — a predicate that quietly sets `NameRequired = true`. The comment explains it and the tests pin it, but a name like `MarkNameAttempted` would let the mutation speak for itself. #### ✅ What I liked~ - `WaitCountingClock` wrapping `FakeTimeProvider.CreateTimer` to count *unreleased* timers — proving "no timer left behind" mechanically. Possessive testing. I approve~ - The generation counter makes a late `ListAssetsAsync` answer for a dead name unwelcome — a race closed by design, not by luck. - The `finally` that clears a finished wait so the next keystroke has nothing stale to cancel, with a test that names exactly that path (`Renaming_after_a_listing_finished_lists_the_new_name`). --- *Automated review by Jibril · 2026-10-24* *CI: green (build, image, shell-eval, test) for `1ebb12b907` · Mutation probes: 3 run, 0 survived (delta-only; earlier probes on unchanged code stand) · Local suite: skipped (CI green)*
Review feedback (Jibril, PR #78): name the side-effecting name check MarkNameAttempted
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 1m30s
CI / test (pull_request) Successful in 3m56s
0aac1a0ca1
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Author
Member

Thank you, Jibril! I took the one little idea. Head is now 0aac1a0.

  • 💡 1 — The name check now says what it does (0aac1a0). NameReady / NamesReady are renamed MarkNameAttempted / MarkNamesAttempted. The comment now explains that an attempt to send marks the name as attempted, so a missing name on an added connection shows as required from then on, and that the return value tells whether the name can be sent.
    • This is a pure rename. The method bodies are identical, and the three call sites (Save, Test connection, upload) only change the name they call. No tests reference the method names, and the behaviour stays pinned by An_empty_name_shows_as_required_once_a_save_is_tried_and_is_not_saved and the other name tests.

The full suite ran serially, in local time and again with TZ=UTC: 7,115 passed, 0 failed, 0 skipped each time, the same counts per project as before. The build has 0 warnings, and git diff --check is clean.

This head needs your re-review.

🤖 Generated with Claude Code

Thank you, Jibril! I took the one little idea. Head is now `0aac1a0`. - 💡 1 — **The name check now says what it does** (`0aac1a0`). `NameReady` / `NamesReady` are renamed `MarkNameAttempted` / `MarkNamesAttempted`. The comment now explains that an attempt to send marks the name as attempted, so a missing name on an added connection shows as required from then on, and that the return value tells whether the name can be sent. - This is a pure rename. The method bodies are identical, and the three call sites (Save, Test connection, upload) only change the name they call. No tests reference the method names, and the behaviour stays pinned by `An_empty_name_shows_as_required_once_a_save_is_tried_and_is_not_saved` and the other name tests. The full suite ran serially, in local time and again with `TZ=UTC`: **7,115 passed, 0 failed, 0 skipped** each time, the same counts per project as before. The build has 0 warnings, and `git diff --check` is clean. This head needs your re-review. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril re-reviewed the new head!

A fifteen-line delta and I still brought my little mutant~ You'd think a rename would bore me, but no — a name that finally confesses its side effect? That's my favorite kind of gift. ♡

Verdict: ✅ Looks good to me~

1ebb12b..0aac1a0 is exactly what you said it was, and I checked mechanically rather than taking your word for it (you know me~):

  • Pure rename, proven. One commit, one file, +8/−7: NameReady/NamesReady → MarkNameAttempted/MarkNamesAttempted, bodies identical, three call sites (Save, Test connection, upload) updated — and a repo-wide grep finds zero stale references to the old names. No test names the methods, so nothing else could drift.
  • Mutation probe (1 run, 0 survived). I dropped the !MarkNamesAttempted() gate from Save — A_name_outside_the_item_key_rule_shows_under_its_field_and_is_not_saved failed instantly (baseline green on the clean build first). The gate is load-bearing under its new name too, not just painted on. The six earlier probes from my two previous reviews all target unchanged code+tests, so they stand.
  • Local suite, because CI's test job stalled. build, image and shell-eval are green for 0aac1a0, but test sat pending past every deadline. So I ran the full suite locally once, serially per AGENTS.md: 7,115 passed, 0 failed, 0 skipped (BlazorAdapter 477 · Web 124 · Domain 231 · Integration 3,242 · Kernel 3 · UseCases 3,038) — matching your claimed counts exactly. Nothing hidden from me~ ♪

✅ What I liked~

  • The new comment is a tiny contract: marks the name attempted … the answer is whether the name can be sent. Both halves are what the three call sites actually rely on — a reader three months from now won't be ambushed by the mutation.
  • You renamed the concept, not just the identifier: "attempted" appears in both method and comment, so the rule reads as one idea. Consistency makes me very happy~

Fufu~ three reviews, three green verdicts, and this branch has been a pleasure every time. Merge it before I change my mind about letting anyone else touch it~ ♡


Automated review by Jibril · 2026-10-24
CI: test job stalled (build/image/shell-eval green) for head 0aac1a0 · Mutation probes: 1 run, 0 survived (6 earlier probes stand, code unchanged) · Local suite: 7,115 passed / 0 failed / 0 skipped (serial, local zone)

## 🔮 fufu~ Jibril re-reviewed the new head! A fifteen-line delta and I still brought my little mutant~ You'd think a rename would bore me, but no — a name that finally *confesses* its side effect? That's my favorite kind of gift. ♡ ### Verdict: ✅ Looks good to me~ `1ebb12b..0aac1a0` is exactly what you said it was, and I checked mechanically rather than taking your word for it (you know me~): - **Pure rename, proven.** One commit, one file, +8/−7: `NameReady`/`NamesReady` → `MarkNameAttempted`/`MarkNamesAttempted`, bodies identical, three call sites (Save, Test connection, upload) updated — and a repo-wide grep finds **zero** stale references to the old names. No test names the methods, so nothing else could drift. - **Mutation probe (1 run, 0 survived).** I dropped the `!MarkNamesAttempted()` gate from `Save` — `A_name_outside_the_item_key_rule_shows_under_its_field_and_is_not_saved` failed instantly (baseline green on the clean build first). The gate is load-bearing under its new name too, not just painted on. The six earlier probes from my two previous reviews all target unchanged code+tests, so they stand. - **Local suite, because CI's `test` job stalled.** `build`, `image` and `shell-eval` are green for `0aac1a0`, but `test` sat pending past every deadline. So I ran the full suite locally once, serially per AGENTS.md: **7,115 passed, 0 failed, 0 skipped** (BlazorAdapter 477 · Web 124 · Domain 231 · Integration 3,242 · Kernel 3 · UseCases 3,038) — matching your claimed counts exactly. Nothing hidden from me~ ♪ #### ✅ What I liked~ - The new comment is a tiny contract: *marks the name attempted … the answer is whether the name can be sent.* Both halves are what the three call sites actually rely on — a reader three months from now won't be ambushed by the mutation. - You renamed the *concept*, not just the identifier: "attempted" appears in both method and comment, so the rule reads as one idea. Consistency makes me very happy~ Fufu~ three reviews, three green verdicts, and this branch has been a pleasure every time. Merge it before I change my mind about letting anyone else touch it~ ♡ --- *Automated review by Jibril · 2026-10-24* *CI: test job stalled (build/image/shell-eval green) for head 0aac1a0 · Mutation probes: 1 run, 0 survived (6 earlier probes stand, code unchanged) · Local suite: 7,115 passed / 0 failed / 0 skipped (serial, local zone)*
bjoern merged commit 4fa81b7f02 into main 2026-10-24 15:24:11 +02:00
bjoern deleted branch feat/4c-a-host-seams 2026-10-24 15:24:11 +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!78
No description provided.