feat: cleaning 9/12 — the qwen-image-server adapter and the cleaning server setting #166

Merged
bjoern merged 9 commits from feat/cleaning-server-adapter into main 2026-10-03 12:07:17 +02:00
Member

This is slice 9 of Phase 5 in PROJECT_PLAN.md: the port, the adapter and the setting from ADR 0027's "The server" section, built to ADR 0021's adapter contract (plan PR #162). It adds no call runner, deadlines, breaker, canary or cache; those come in slice 10. A saved address does not change any stage yet.

What's in

UseCases

  • IEditModelGateway, beside ILlmGateway: read /healthz, submit, read a job, fetch an output and cancel. Every answer is a typed record inside Ok, because Result<T> carries only a string error. Server identity objects are kept whole, as canonical JSON with sorted keys.
  • The cleaning.server setting is plain text, because the server takes no credential.
    • SaveCleaningServer validates against /healthz before storing. It refuses a silent server, and one whose /healthz lacks backend_presubmit_failures (older than a3953f7). It saves a server whose backend_identity is missing as "backend not ready".
    • CheckCleaningServer reads the stored server's live status without writing.
    • GetSettings exposes the address and never probes.

Infrastructure: QwenImageServerGateway

  • A typed HttpClient registered with AddHttpClient and AddResilienceHandler. Microsoft.Extensions.Http.Resilience 10.10.0 is pinned centrally.

    • Every request gets 20 s, above the contract's 15 s minimum for /healthz.
    • Reads and cancels are resent once after a timeout. A submit never is, because a resent submit could create a second job.
  • Strict requests:

    • snake_case;
    • mode: "edit", composite_back: false and an explicit seed always written;
    • never width or height;
    • the output_resolution rule;
    • a newer field only when features lists it;
    • the image part carries a file name;
    • the global prompt is empty;
    • trailing punctuation stripped from labels.

    Malformed requests are refused locally, among them a 1024×1024 window, a rect wholly outside the window, an out-of-range seed and a steps count outside 1–100.

  • Tolerant reads, with ReadFromJsonAsync into wire records. Unknown members are ignored; a known member of the wrong type faults the reply.

  • Rejected submissions map to typed outcomes: 422 with a string or list detail, 400, 413, the JSON 500 "saving inputs failed", and a text/plain 500.

UI: the "Cleaning server" card on Settings → Provider.

  • It shows the build, the backend's state (up, down, waiting since, not ready, or up but dropping uploads), and the last backend error with its time. It has Check again and Clear.
  • It re-reads the server on every visit, and a slow answer never lands on a newer address.

Scripted fake server, enabled with ORIHON_FAKE_CLEANING_SERVER=true.

  • It is a handler inside the client's own pipeline that answers http://qwen-image-server.test/<scenario> in-process. The scenarios are ready, identified, legacy, not-ready, half-up and outage.
  • Its outputs are the uploaded window with the rects painted white.
  • AGENTS.md documents it, and its "Not seeded" sentence now names the cleaning server address.

Docs: a dated ADR 0004 amendment. qwen-image-server is the second external system, reached through this in-repo client.

Tests

1,416 green, against 1,304 on main: UseCases 648 (+15), Integration 365 (+86), BlazorAdapter 274 (+11); Domain 129 is unchanged. (1,404 at the first review; +12 in the review round.) Every project ran separately under the 60 s cap. What they pin:

  • The gateway (58 cases):
    • the golden request JSON, re-parsed and compared with JsonNode.DeepEquals;
    • the multipart part names, file name and content type, re-parsed with MultipartReader;
    • newer fields sent only when listed;
    • never width or height;
    • 16 malformed requests refused before sending, each by its own guard;
    • /healthz parsed from the live 9d02636, half-up, outage and pre-a3953f7 fixtures shaped from the refresh records;
    • identity reads the same in any key order;
    • job records parsed for cancelled-partial, invalid_request, a capped backend_unavailable, resumed-with-LoRA and an unknown status;
    • every rejected-submission shape;
    • a timed-out read is resent once, and a timed-out submit never.
  • The fake (28 cases, the host test included):
    • each scenario through the real pipeline, and every name in the one scenario list answering /healthz;
    • a strict request runs from queued to done;
    • cancel lands on the next read;
    • jobs wait in outage and half-up;
    • the fake refuses what the real server refuses;
    • a host test boots the real app with the flag and runs SaveCleaningServer.
  • Settings (15 use-case and 11 bUnit cases): a ready server is stored, a pre-a3953f7 one is refused with nothing stored, a silent one is refused with the reason, not-ready is saved as such, blank clears, and the card's empty state, statuses, error time, Check again and Clear all work.

Browser-verified

I ran a fresh seeded world on its own port with the fake server on, and drove it with Playwright, typing the address key by key:

  • Refusals: the legacy server was refused as "older than a3953f7", and an unknown scenario was refused.
  • Ready: saved in its stored form, showing build decafbad0001, "Backend up", and last error none. The status re-read after a reload.
  • Outage: "Backend down, waiting since 3 minutes ago", with one dropped upload.
  • Half-up and not-ready read as they should.
  • Clear survived a reload.
  • A real /healthz stub on a socket: switching it to down while the page stayed open showed the new status on the next visit, in the same circuit.

Honest notes

  • The fake is inside the client's pipeline, not mapped into the app. The seed runs before the app listens, so endpoints mapped into the app could never serve it.
  • ready jobs carry no run.backend, so slice 11's seeded outputs stay "kept for their own call only", as the plan says. The new identified scenario covers a job whose identity can be confirmed.
  • Which flag turns the fake on for the seed is slice 11's decision: whether the seed flag also enables the fake, or the address is seeded only when both flags are set.
  • Merge order. This PR and cleaning 1/12 both extend AGENTS.md's "Not seeded" sentence, so whichever lands second needs a one-line rebase, which I'll do. All four wave-1 branches together pass in a throwaway merge (1,657 tests, 0 warnings).

🤖 Generated with Claude Code

This is slice 9 of Phase 5 in `PROJECT_PLAN.md`: the port, the adapter and the setting from ADR 0027's "The server" section, built to ADR 0021's adapter contract (plan PR #162). It adds no call runner, deadlines, breaker, canary or cache; those come in slice 10. A saved address does not change any stage yet. ## What's in **UseCases** - **`IEditModelGateway`**, beside `ILlmGateway`: read `/healthz`, submit, read a job, fetch an output and cancel. Every answer is a typed record inside `Ok`, because `Result<T>` carries only a string error. Server identity objects are kept whole, as canonical JSON with sorted keys. - **The `cleaning.server` setting** is plain text, because the server takes no credential. - `SaveCleaningServer` validates against `/healthz` before storing. It refuses a silent server, and one whose `/healthz` lacks `backend_presubmit_failures` (older than a3953f7). It saves a server whose `backend_identity` is missing as "backend not ready". - `CheckCleaningServer` reads the stored server's live status without writing. - `GetSettings` exposes the address and never probes. **Infrastructure: `QwenImageServerGateway`** - **A typed `HttpClient`** registered with `AddHttpClient` and `AddResilienceHandler`. `Microsoft.Extensions.Http.Resilience` 10.10.0 is pinned centrally. - Every request gets 20 s, above the contract's 15 s minimum for `/healthz`. - Reads and cancels are resent once after a timeout. A submit never is, because a resent submit could create a second job. - **Strict requests:** - snake_case; - `mode: "edit"`, `composite_back: false` and an explicit seed always written; - never width or height; - the `output_resolution` rule; - a newer field only when `features` lists it; - the image part carries a file name; - the global prompt is empty; - trailing punctuation stripped from labels. Malformed requests are refused locally, among them a 1024×1024 window, a rect wholly outside the window, an out-of-range seed and a steps count outside 1–100. - **Tolerant reads,** with `ReadFromJsonAsync` into wire records. Unknown members are ignored; a known member of the wrong type faults the reply. - **Rejected submissions map to typed outcomes:** 422 with a string or list detail, 400, 413, the JSON 500 "saving inputs failed", and a text/plain 500. **UI: the "Cleaning server" card** on Settings → Provider. - It shows the build, the backend's state (up, down, waiting since, not ready, or up but dropping uploads), and the last backend error with its time. It has Check again and Clear. - It re-reads the server on every visit, and a slow answer never lands on a newer address. **Scripted fake server**, enabled with `ORIHON_FAKE_CLEANING_SERVER=true`. - It is a handler inside the client's own pipeline that answers `http://qwen-image-server.test/<scenario>` in-process. The scenarios are `ready`, `identified`, `legacy`, `not-ready`, `half-up` and `outage`. - Its outputs are the uploaded window with the rects painted white. - AGENTS.md documents it, and its "Not seeded" sentence now names the cleaning server address. **Docs:** a dated ADR 0004 amendment. qwen-image-server is the second external system, reached through this in-repo client. ## Tests 1,416 green, against 1,304 on main: UseCases 648 (+15), Integration 365 (+86), BlazorAdapter 274 (+11); Domain 129 is unchanged. (1,404 at the first review; +12 in the review round.) Every project ran separately under the 60 s cap. What they pin: - **The gateway (58 cases):** - the golden request JSON, re-parsed and compared with `JsonNode.DeepEquals`; - the multipart part names, file name and content type, re-parsed with `MultipartReader`; - newer fields sent only when listed; - never width or height; - 16 malformed requests refused before sending, each by its own guard; - `/healthz` parsed from the live 9d02636, half-up, outage and pre-a3953f7 fixtures shaped from the refresh records; - identity reads the same in any key order; - job records parsed for cancelled-partial, `invalid_request`, a capped `backend_unavailable`, resumed-with-LoRA and an unknown status; - every rejected-submission shape; - a timed-out read is resent once, and a timed-out submit never. - **The fake (28 cases, the host test included):** - each scenario through the real pipeline, and every name in the one scenario list answering `/healthz`; - a strict request runs from queued to done; - cancel lands on the next read; - jobs wait in outage and half-up; - the fake refuses what the real server refuses; - a host test boots the real app with the flag and runs `SaveCleaningServer`. - **Settings (15 use-case and 11 bUnit cases):** a ready server is stored, a pre-a3953f7 one is refused with nothing stored, a silent one is refused with the reason, not-ready is saved as such, blank clears, and the card's empty state, statuses, error time, Check again and Clear all work. ## Browser-verified I ran a fresh seeded world on its own port with the fake server on, and drove it with Playwright, typing the address key by key: - **Refusals:** the legacy server was refused as "older than a3953f7", and an unknown scenario was refused. - **Ready:** saved in its stored form, showing build `decafbad0001`, "Backend up", and last error none. The status re-read after a reload. - **Outage:** "Backend down, waiting since 3 minutes ago", with one dropped upload. - **Half-up and not-ready** read as they should. - **Clear** survived a reload. - **A real `/healthz` stub on a socket:** switching it to down while the page stayed open showed the new status on the next visit, in the same circuit. ## Honest notes - **The fake is inside the client's pipeline, not mapped into the app.** The seed runs before the app listens, so endpoints mapped into the app could never serve it. - **`ready` jobs carry no `run.backend`,** so slice 11's seeded outputs stay "kept for their own call only", as the plan says. The new `identified` scenario covers a job whose identity can be confirmed. - **Which flag turns the fake on for the seed is slice 11's decision:** whether the seed flag also enables the fake, or the address is seeded only when both flags are set. - **Merge order.** This PR and cleaning 1/12 both extend AGENTS.md's "Not seeded" sentence, so whichever lands second needs a one-line rebase, which I'll do. All four wave-1 branches together pass in a throwaway merge (1,657 tests, 0 warnings). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
IEditModelGateway reads /healthz, submits, reads, fetches and cancels jobs on
qwen-image-server; every answer the server can give is a typed record inside Ok,
and an Err means the request was refused locally and never sent.

QwenImageServerGateway is a typed HttpClient registered through AddHttpClient,
with a resilience handler for a 20 s per-request timeout and one resend after a
timeout (never for a submit, which could create a second job). Requests are
strict: snake_case, an edit in annotate mode over the full window, composite_back
false, an explicit seed, never width/height, an output_resolution that covers the
window, a named image part, an empty global prompt and labels without trailing
punctuation; reuse_encoding only when /healthz lists it. Reads are tolerant of
members this build does not know, and keep the identity objects whole as
canonical JSON. Rejected submissions (422 string or list detail, 400, 413, the
JSON 500 "saving inputs failed", any other 500) map to typed rejections.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The "cleaning.server" settings row holds the qwen-image-server address as plain
text, since the server takes no credential. SaveCleaningServer checks the address
against /healthz before it writes: a server that does not answer, or whose
/healthz lacks backend_presubmit_failures (older than a3953f7), is refused with
the reason and nothing is stored. A server that cannot name its backend yet is
saved and reported as not ready. A blank address clears the row.

GetSettings carries the stored address, and CheckCleaningServer reads its live
status for the settings card; a silent server is a status there, not a failure.
A saved address changes no stage yet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A "Cleaning server" card on Settings → Provider takes the address and saves it
through the validated save, showing a refusal's reason beside the field. Once an
address is stored, the card reads the server's /healthz: its build, whether the
backend is up, down, waiting or not ready yet, how many uploads it dropped in a
row, and its last backend error with the time it happened. Check again re-reads
it; Clear removes the address.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With ORIHON_FAKE_CLEANING_SERVER=true the edit-model client answers
http://qwen-image-server.test/<scenario> in-process, through a handler in its own
pipeline: no GPU, no second process, and reachable before the app listens, so the
tests, the seed and a browser pass can all use it. The scenarios are ready and
legacy (jobs run queued → running → done, each output the uploaded window),
not-ready, half-up and outage (jobs wait). It refuses what the real server
refuses, so a request that is not strict fails against it too.

AGENTS.md says how to start it, and that the cleaning server address is not seeded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A dated amendment: the server is reached through the in-repo typed client behind
IEditModelGateway, which adds no project reference, so the two-reference list
stands. The sentences that called it foreseen now say it landed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Entering Settings clears the server's last read status, so the first load reads /healthz again
instead of showing what the server said on an earlier visit in the same circuit. A check that
lands after the address was replaced or cleared is dropped: a save makes its address the stored
one at once, and only a status of the address the card shows is kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every output the stand-in serves is now the uploaded window with its rects painted white, so a
result shows a change where it was asked for and nowhere else, and a diff has something to show.
The ready scenario still names no backend in its jobs, so its outputs stay unconfirmed; the new
identified scenario mirrors /healthz's backend_identity in run.backend, as a live a3953f7 record
does, so a confirmed job can be driven against the fake too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
refactor: the scripted server's addresses live beside the seed, so the seed can name one
All checks were successful
CI / build (pull_request) Successful in 33s
CI / test (pull_request) Successful in 58s
8a3266c3ce
The fake stays in the host, but its host name and per-scenario addresses move to
Orihon.UseCases.Diagnostics, which the seed can reference and the host already does.

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

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

Commit: d33498f · Generated: 2026-10-03 09:59:08 UTC · Revision: #3

Summary

Summary
Generated on: 10/03/2026 - 09:59:08
Coverage date: 10/03/2026 - 09:58:47 - 10/03/2026 - 09:59:05
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 572
Files: 264
Line coverage: 97.2% (23356 of 24024)
Covered lines: 23356
Uncovered lines: 668
Coverable lines: 24024
Total lines: 40874
Branch coverage: 85% (4073 of 4789)
Covered branches: 4073
Total branches: 4789
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 95.7%
Name Line Branch
Orihon.BlazorAdapter 95.7% 88.7%
Orihon.BlazorAdapter.Bible.AddBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.AddCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.AddHouseRuleRowRequested 100%
Orihon.BlazorAdapter.Bible.AddLoreRowRequested 100%
Orihon.BlazorAdapter.Bible.BibleEffects 89.8% 76.9%
Orihon.BlazorAdapter.Bible.BibleLoaded 100%
Orihon.BlazorAdapter.Bible.BiblePage 92.3% 80.5%
Orihon.BlazorAdapter.Bible.BibleReducers 90.6%
Orihon.BlazorAdapter.Bible.BibleState 100%
Orihon.BlazorAdapter.Bible.BibleWriteFailed 100%
Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteHouseRuleRowRequested 0%
Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested 0%
Orihon.BlazorAdapter.Bible.LoadBible 100%
Orihon.BlazorAdapter.Bible.ReorderBeatsRequested 0%
Orihon.BlazorAdapter.Bible.SaveOverviewRequested 100%
Orihon.BlazorAdapter.Bible.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateHouseRuleRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested 100%
Orihon.BlazorAdapter.BlazorAdapterAssembly 100%
Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace 100%
Orihon.BlazorAdapter.PageWorkspace.PageStepsLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved 100%
Orihon.BlazorAdapter.PageWorkspace.PageViewport 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage 93.6% 87.6%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers 100% 64.2%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState 100%
Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed 100%
Orihon.BlazorAdapter.PageWorkspace.RegionColorsSampled 100%
Orihon.BlazorAdapter.PageWorkspace.RegionCreated 100%
Orihon.BlazorAdapter.PageWorkspace.RegionSaved 100%
Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SampleRegionColorsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested 100%
Orihon.BlazorAdapter.Projects.CreateProjectRequested 100%
Orihon.BlazorAdapter.Projects.DecideSetupContinuation 100%
Orihon.BlazorAdapter.Projects.DeleteProjectRequested 100%
Orihon.BlazorAdapter.Projects.FinishSetupRequested 100%
Orihon.BlazorAdapter.Projects.ImportPagesRequested 100%
Orihon.BlazorAdapter.Projects.LoadWizard 100%
Orihon.BlazorAdapter.Projects.PageOrganizer 96% 95%
Orihon.BlazorAdapter.Projects.PagesImported 100%
Orihon.BlazorAdapter.Projects.ProjectDeleteFailed 100%
Orihon.BlazorAdapter.Projects.ProjectListEffects 100% 100%
Orihon.BlazorAdapter.Projects.ProjectListPage 89.7% 91.6%
Orihon.BlazorAdapter.Projects.ProjectListReducers 100%
Orihon.BlazorAdapter.Projects.ProjectListState 100%
Orihon.BlazorAdapter.Projects.ProjectsLoaded 100%
Orihon.BlazorAdapter.Projects.ProjectWizardEffects 93.8% 90%
Orihon.BlazorAdapter.Projects.ProjectWizardPage 95.3% 84.1%
Orihon.BlazorAdapter.Projects.ProjectWizardReducers 100%
Orihon.BlazorAdapter.Projects.ProjectWizardState 100%
Orihon.BlazorAdapter.Projects.SetupChat 93.5% 100%
Orihon.BlazorAdapter.Projects.SetupChatEffects 100% 100%
Orihon.BlazorAdapter.Projects.SetupChatFailed 100%
Orihon.BlazorAdapter.Projects.SetupChatReducers 100%
Orihon.BlazorAdapter.Projects.SetupChatState 100%
Orihon.BlazorAdapter.Projects.SetupChatUpdated 100%
Orihon.BlazorAdapter.Projects.StartSetupChat 100%
Orihon.BlazorAdapter.Projects.SubmitSetupAnswer 100%
Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardLoaded 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested 100%
Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardWriteFailed 100%
Orihon.BlazorAdapter.Rulings.AcceptProposalRequested 100%
Orihon.BlazorAdapter.Rulings.AnsweredRuling 100%
Orihon.BlazorAdapter.Rulings.AnswerRulingRequested 100%
Orihon.BlazorAdapter.Rulings.DeclineProposalRequested 100%
Orihon.BlazorAdapter.Rulings.DismissRulingRequested 100%
Orihon.BlazorAdapter.Rulings.RulingBar 98.2% 94.6%
Orihon.BlazorAdapter.Rulings.RulingDeskBridge 94.2% 91.6%
Orihon.BlazorAdapter.Rulings.RulingsEffects 95.4% 83.3%
Orihon.BlazorAdapter.Rulings.RulingsLoaded 100%
Orihon.BlazorAdapter.Rulings.RulingsReducers 100%
Orihon.BlazorAdapter.Rulings.RulingsState 100%
Orihon.BlazorAdapter.Rulings.RulingWriteFailed 100%
Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested 100%
Orihon.BlazorAdapter.Runs.CancelMonitorRun 100%
Orihon.BlazorAdapter.Runs.MonitorPageRef 100%
Orihon.BlazorAdapter.Runs.MonitorRunLoaded 100%
Orihon.BlazorAdapter.Runs.RetryMonitorExecution 100%
Orihon.BlazorAdapter.Runs.RunChangedBridge 95% 92.8%
Orihon.BlazorAdapter.Runs.RunMonitor 97.9% 96.2%
Orihon.BlazorAdapter.Runs.RunMonitorEffects 100% 91.6%
Orihon.BlazorAdapter.Runs.RunMonitorReducers 100%
Orihon.BlazorAdapter.Runs.RunMonitorState 100%
Orihon.BlazorAdapter.Settings.AgentDebriefsLoaded 100%
Orihon.BlazorAdapter.Settings.AgentDebriefsLoadFailed 100%
Orihon.BlazorAdapter.Settings.AgentEffortPicked 100%
Orihon.BlazorAdapter.Settings.AgentEffortSaved 100%
Orihon.BlazorAdapter.Settings.AgentEffortSaveFailed 100%
Orihon.BlazorAdapter.Settings.AgentFeedbackLoaded 100%
Orihon.BlazorAdapter.Settings.AgentFeedbackLoadFailed 0%
Orihon.BlazorAdapter.Settings.AgentModelPicked 100%
Orihon.BlazorAdapter.Settings.AgentModelSaved 100%
Orihon.BlazorAdapter.Settings.AgentModelSaveFailed 100%
Orihon.BlazorAdapter.Settings.AgentRoutingPicked 100%
Orihon.BlazorAdapter.Settings.AgentRoutingSaved 100%
Orihon.BlazorAdapter.Settings.AgentRoutingSaveFailed 0%
Orihon.BlazorAdapter.Settings.AgentTranscriptsLoaded 100%
Orihon.BlazorAdapter.Settings.AgentTranscriptsLoadFailed 0%
Orihon.BlazorAdapter.Settings.CleaningServerChecked 100%
Orihon.BlazorAdapter.Settings.CleaningServerSaved 100%
Orihon.BlazorAdapter.Settings.CleaningServerSaveFailed 100%
Orihon.BlazorAdapter.Settings.EffortOption 100% 100%
Orihon.BlazorAdapter.Settings.FloatingPassToggled 100%
Orihon.BlazorAdapter.Settings.KeySaved 100%
Orihon.BlazorAdapter.Settings.KeySaveFailed 100%
Orihon.BlazorAdapter.Settings.ModelOptionsLoaded 100%
Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable 100%
Orihon.BlazorAdapter.Settings.RoutingOption 100% 100%
Orihon.BlazorAdapter.Settings.RunConcurrencyPicked 100%
Orihon.BlazorAdapter.Settings.RunConcurrencySaveFailed 100%
Orihon.BlazorAdapter.Settings.SaveCleaningServerRequested 100%
Orihon.BlazorAdapter.Settings.SaveKeyRequested 100%
Orihon.BlazorAdapter.Settings.SettingsEffects 91.4% 81%
Orihon.BlazorAdapter.Settings.SettingsLoaded 100%
Orihon.BlazorAdapter.Settings.SettingsPage 97.5% 90.6%
Orihon.BlazorAdapter.Settings.SettingsReducers 95.7% 64.2%
Orihon.BlazorAdapter.Settings.SettingsState 100%
Orihon.BlazorAdapter.Settings.TranscriptFilterPicked 100%
Orihon.BlazorAdapter.Settings.TranscriptPagePicked 100%
Orihon.BlazorAdapter.Settings.TranscriptPicked 100%
Orihon.BlazorAdapter.Settings.TranscriptTextLoaded 100%
Orihon.BlazorAdapter.Settings.TranscriptTextLoadFailed 100%
Orihon.BlazorAdapter.Uploads.UploadTransfer 96.5% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferProgress 100% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferResult 100%
Orihon.BlazorAdapter.Workspace.CreateChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeletePageRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.FloatingPassAnswered 100%
Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace 100%
Orihon.BlazorAdapter.Workspace.MovePageRequested 100%
Orihon.BlazorAdapter.Workspace.ProjectMetadataCard 95.6% 92.8%
Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage 95.7% 87.9%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers 100% 62.5%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState 100%
Orihon.BlazorAdapter.Workspace.RenameChapterRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderPagesRequested 100%
Orihon.BlazorAdapter.Workspace.RunAnnotationRequested 100%
Orihon.BlazorAdapter.Workspace.RunBibleRequested 100%
Orihon.BlazorAdapter.Workspace.RunFloatingPassRequested 100%
Orihon.BlazorAdapter.Workspace.RunTranslationRequested 100%
Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested 100%
Orihon.BlazorAdapter.Workspace.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.SetPageKindRequested 100%
Orihon.BlazorAdapter.Workspace.SummaryDeleted 100%
Orihon.BlazorAdapter.Workspace.SummarySaved 100%
Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested 100%
Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed 100%
Orihon.Domain - 100%
Name Line Branch
Orihon.Domain 100% 100%
Orihon.Domain.Agents.AgentDebrief 100% 100%
Orihon.Domain.Agents.AgentDescriptor 100%
Orihon.Domain.Agents.AgentFeedback 100% 100%
Orihon.Domain.Agents.AgentRoster 100% 100%
Orihon.Domain.Bible.Character 100% 100%
Orihon.Domain.Bible.GlossaryEntry 100% 100%
Orihon.Domain.Bible.HouseRule 100%
Orihon.Domain.Bible.LoreEntry 100% 100%
Orihon.Domain.Bible.PageSummary 100%
Orihon.Domain.Bible.StoryBeat 100%
Orihon.Domain.Bible.StoryOverview 100%
Orihon.Domain.Projects.Project 100% 100%
Orihon.Domain.Projects.ProjectProfile 100%
Orihon.Domain.Runs.Execution 100% 100%
Orihon.Domain.Runs.RegionProblem 100%
Orihon.Domain.Runs.Run 100%
Orihon.Domain.Settings.AppSetting 100%
Orihon.Domain.Text 100% 100%
Orihon.Domain.Translation.BoundingBox 100% 100%
Orihon.Domain.Translation.Chapter 100%
Orihon.Domain.Translation.InkColor 100% 100%
Orihon.Domain.Translation.Page 100%
Orihon.Domain.Translation.Region 100% 100%
Orihon.Domain.Translation.RegionInk 100% 100%
Orihon.Domain.Translation.RegionProfile 100%
Orihon.Infrastructure - 97.3%
Name Line Branch
Orihon.Infrastructure 97.3% 76.1%
Orihon.Infrastructure.Agents.EfAgentDebriefStore 100%
Orihon.Infrastructure.Agents.EfAgentFeedbackStore 100%
Orihon.Infrastructure.Bible.EfBibleStore 95.2% 92.8%
Orihon.Infrastructure.DependencyInjection 100% 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter`1 100% 100%
Orihon.Infrastructure.Gateways.AgentTranscript 95.6% 89%
Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore 85.2% 80.8%
Orihon.Infrastructure.Gateways.HttpWebPageFetcher 95.1% 83.3%
Orihon.Infrastructure.Gateways.LabelFont 100% 50%
Orihon.Infrastructure.Gateways.OpenRouterLlmGateway 90.2% 82.1%
Orihon.Infrastructure.Gateways.QwenImageServerGateway 95.1% 89.3%
Orihon.Infrastructure.Gateways.QwenImageServerJson 95.9% 72.3%
Orihon.Infrastructure.Gateways.SkiaImages 96.7% 96.1%
Orihon.Infrastructure.Gateways.SkiaPageImageRenderer 97.4% 90.8%
Orihon.Infrastructure.Gateways.SkiaRegionColorSampler 100% 100%
Orihon.Infrastructure.Persistence.Configurations.AgentDebriefConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.AgentFeedbackConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.HouseRuleConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper 100%
Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RunConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.StoryOverviewConfiguration 100%
Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Orihon.Infrastructure.Persistence.Migrations.AddAgentDebriefs 99.5%
Orihon.Infrastructure.Persistence.Migrations.AddAgentFeedback 99.5%
Orihon.Infrastructure.Persistence.Migrations.AddAppSettings 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddHouseRules 99.6%
Orihon.Infrastructure.Persistence.Migrations.AddPagePassFacts 99%
Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddRegionFitBoxDropFillHints 98.1%
Orihon.Infrastructure.Persistence.Migrations.AddRegionForm 99.4%
Orihon.Infrastructure.Persistence.Migrations.AddRegionInk 99.4%
Orihon.Infrastructure.Persistence.Migrations.AddRuns 99.1%
Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview 99.5%
Orihon.Infrastructure.Persistence.Migrations.DropRegionContainer 99.1%
Orihon.Infrastructure.Persistence.Migrations.DropRegionType 99%
Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain 97.3%
Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot 100%
Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns 97.2%
Orihon.Infrastructure.Persistence.Migrations.ReplaceFitBoxWithContainerSeed 99.2%
Orihon.Infrastructure.Persistence.OrihonDbContext 100%
Orihon.Infrastructure.Persistence.OrihonDbContextFactory 100%
Orihon.Infrastructure.Projects.EfProjectStore 100% 100%
Orihon.Infrastructure.Projects.FileSystemPageImageStore 100% 100%
Orihon.Infrastructure.Runs.EfRunStore 94.6% 75%
Orihon.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Orihon.Infrastructure.Translation.EfChapterStore 100% 100%
Orihon.Infrastructure.Translation.EfPageStore 98.3% 93.7%
Orihon.Infrastructure.Translation.EfRegionStore 100% 100%
Orihon.Infrastructure.Translation.Ordering 100% 100%
System.Text.RegularExpressions.Generated 70.6% 53.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4
77.9% 76.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1
59% 42.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3
89.4% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2
83.7% 62.5%
Orihon.Kernel - 90.9%
Name Line Branch
Orihon.Kernel 90.9% 75%
Orihon.Kernel.Err`1 100%
Orihon.Kernel.Ok`1 100%
Orihon.Kernel.Result`1 88.8% 75%
Orihon.Server - 94.4%
Name Line Branch
Orihon.Server 94.4% 77.5%
Orihon.Server.Components.App 100%
Orihon.Server.Components.Layout.MainLayout 100%
Orihon.Server.Components.Pages.Gate 64.2% 66.6%
Orihon.Server.Diagnostics.FakeCleaningServer 94.3% 78.4%
Orihon.Server.RunEngineBootstrap 100%
Orihon.Server.Security.AccessGate 91.8% 41.6%
Orihon.Server.Security.AccessSecret 100% 50%
Orihon.Server.VolumeStartupValidator 100% 100%
Program 95.7% 85.7%
Orihon.UseCases - 97.7%
Name Line Branch
Orihon.UseCases 97.7% 89.5%
Orihon.UseCases.Agents.AgentAttemptPreparation 100%
Orihon.UseCases.Agents.AgentAttemptSupport 98.6% 98.3%
Orihon.UseCases.Agents.AgentBlueprint 100%
Orihon.UseCases.Agents.AgentCapDebrief 100%
Orihon.UseCases.Agents.AgentInvocation 100%
Orihon.UseCases.Agents.AgentOutcome 100%
Orihon.UseCases.Agents.AgentTool`1 90.9% 75%
Orihon.UseCases.Agents.AgentToolImage 100%
Orihon.UseCases.Agents.AgentToolResult 100%
Orihon.UseCases.Agents.Annotation.AddFloatingRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddFloatingRegionTool 95.8% 75%
Orihon.UseCases.Agents.Annotation.AddRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddRegionTool 95.4% 75%
Orihon.UseCases.Agents.Annotation.AnnotationBlueprints 100%
Orihon.UseCases.Agents.Annotation.AnnotationStage 98.5% 86.1%
Orihon.UseCases.Agents.Annotation.BboxCreationExecutor 90.4% 50%
Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor 96.5% 90%
Orihon.UseCases.Agents.Annotation.BoundBoxParams 100%
Orihon.UseCases.Agents.Annotation.BoundContactSheetTool 91.3% 75%
Orihon.UseCases.Agents.Annotation.BoundCropParams 100%
Orihon.UseCases.Agents.Annotation.BoundCropTool 100%
Orihon.UseCases.Agents.Annotation.BoundViewPageTool 93.1% 80%
Orihon.UseCases.Agents.Annotation.BoundViewParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.ColorReading 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionParams 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryParams 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryTool 88.2% 62.5%
Orihon.UseCases.Agents.Annotation.FloatingCreationExecutor 86.9% 50%
Orihon.UseCases.Agents.Annotation.FloatingQaExecutor 91.8% 78.5%
Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor 95.4% 75%
Orihon.UseCases.Agents.Annotation.ListRegionsTool 93.7% 80.7%
Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool 90.9% 50%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams 100%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool 95.8% 83.3%
Orihon.UseCases.Agents.Annotation.NoteRegionParams 100%
Orihon.UseCases.Agents.Annotation.NoteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.PageQaExecutor 92.5% 79.1%
Orihon.UseCases.Agents.Annotation.QaReportSink 100% 100%
Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess 89.4% 62.5%
Orihon.UseCases.Agents.Annotation.RegionBriefing 100% 96.1%
Orihon.UseCases.Agents.Annotation.RegionCropParams 100%
Orihon.UseCases.Agents.Annotation.RegionCropTool 100% 100%
Orihon.UseCases.Agents.Annotation.RegionProblemParams 100%
Orihon.UseCases.Agents.Annotation.RegionWindow 100% 100%
Orihon.UseCases.Agents.Annotation.RejectRegionParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.ReorderRegionParams 100%
Orihon.UseCases.Agents.Annotation.ReorderRegionTool 88% 60%
Orihon.UseCases.Agents.Annotation.ReportQaParams 100%
Orihon.UseCases.Agents.Annotation.ReportQaTool 97.8% 90%
Orihon.UseCases.Agents.Annotation.SampleColorsParams 100%
Orihon.UseCases.Agents.Annotation.SampleColorsTool 100% 100%
Orihon.UseCases.Agents.Annotation.SampleRegionColorsParams 100%
Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetInkParams 100%
Orihon.UseCases.Agents.Annotation.SetInkTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaParams 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaTool 100% 75%
Orihon.UseCases.Agents.Annotation.SetRegionInkParams 100%
Orihon.UseCases.Agents.Annotation.SetRegionInkTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionParams 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionTool 100% 100%
Orihon.UseCases.Agents.Annotation.TranscriptionExecutor 97.7% 94.4%
Orihon.UseCases.Agents.AssistantSpoke 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor 96.9% 75%
Orihon.UseCases.Agents.BibleBuilding.GetRegionParams 100%
Orihon.UseCases.Agents.BibleBuilding.GetRegionTool 84.6% 70%
Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool 86.3% 83.3%
Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams 100%
Orihon.UseCases.Agents.Inspection.PageImageAccess 95.2% 80.6%
Orihon.UseCases.Agents.Inspection.ViewAccount 100% 100%
Orihon.UseCases.Agents.ReportFrictionParams 100%
Orihon.UseCases.Agents.ReportFrictionTool 100% 92.8%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool 100% 50%
Orihon.UseCases.Agents.ResearchSetup.AskUserParams 100%
Orihon.UseCases.Agents.ResearchSetup.AskUserTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.ListBibleTool 87% 66.6%
Orihon.UseCases.Agents.ResearchSetup.ListPagesTool 97% 83.3%
Orihon.UseCases.Agents.ResearchSetup.LocatedPage 100%
Orihon.UseCases.Agents.ResearchSetup.PageByNumber 95% 91.6%
Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool 95.2% 90%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool 95.8% 75%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool 96.5% 95.8%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool 92.3% 71.4%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool 92.3% 71.4%
Orihon.UseCases.Agents.ResearchSetup.ViewPageParams 100%
Orihon.UseCases.Agents.ResearchSetup.ViewPageTool 100% 100%
Orihon.UseCases.Agents.RoundStarted 100%
Orihon.UseCases.Agents.Rulings.AnswerRuling 100%
Orihon.UseCases.Agents.Rulings.DismissRuling 100%
Orihon.UseCases.Agents.Rulings.HouseRuleProposal 100%
Orihon.UseCases.Agents.Rulings.ListPendingRulings 100%
Orihon.UseCases.Agents.Rulings.ListRuleProposals 100%
Orihon.UseCases.Agents.Rulings.PendingRuling 100%
Orihon.UseCases.Agents.Rulings.ProposeHouseRuleParams 100%
Orihon.UseCases.Agents.Rulings.ProposeHouseRuleTool 100% 100%
Orihon.UseCases.Agents.Rulings.RequestRulingParams 100%
Orihon.UseCases.Agents.Rulings.RequestRulingTool 100% 81.2%
Orihon.UseCases.Agents.Rulings.RulingAnswer 100%
Orihon.UseCases.Agents.Rulings.RulingDesk 97.8% 80%
Orihon.UseCases.Agents.Rulings.RulingOption 100%
Orihon.UseCases.Agents.Rulings.RulingOptionParams 100%
Orihon.UseCases.Agents.Rulings.SettledRuling 100%
Orihon.UseCases.Agents.Rulings.WithdrawRuleProposal 100%
Orihon.UseCases.Agents.Setup.ResearchSetupExecutor 98.5% 92.8%
Orihon.UseCases.Agents.Setup.SetupChatEntry 100%
Orihon.UseCases.Agents.Setup.SetupConversation 100% 87.5%
Orihon.UseCases.Agents.Setup.SetupConversationRegistry 100%
Orihon.UseCases.Agents.ToolCalled 100%
Orihon.UseCases.Agents.ToolCompleted 100%
Orihon.UseCases.Agents.TranscriptLabel 100% 100%
Orihon.UseCases.Agents.Translation.GetPageSummaryParams 100%
Orihon.UseCases.Agents.Translation.GetPageSummaryTool 80% 66.6%
Orihon.UseCases.Agents.Translation.SetTranslationParams 100%
Orihon.UseCases.Agents.Translation.SetTranslationTool 88.5% 78.5%
Orihon.UseCases.Agents.Translation.TranslationBlueprint 100%
Orihon.UseCases.Agents.Translation.TranslationExecutor 93.8% 71.4%
Orihon.UseCases.Agents.Translation.UpdateGlossaryEnParams 100%
Orihon.UseCases.Agents.Translation.UpdateGlossaryEnTool 82.6% 62.5%
Orihon.UseCases.Bible.AddCharacter 100% 100%
Orihon.UseCases.Bible.AddGlossaryEntry 100% 100%
Orihon.UseCases.Bible.AddHouseRule 100% 100%
Orihon.UseCases.Bible.AddLoreEntry 100% 100%
Orihon.UseCases.Bible.AddStoryBeat 100% 100%
Orihon.UseCases.Bible.BibleDto 100%
Orihon.UseCases.Bible.CharacterDto 100%
Orihon.UseCases.Bible.DeleteCharacter 100% 100%
Orihon.UseCases.Bible.DeleteGlossaryEntry 100% 100%
Orihon.UseCases.Bible.DeleteHouseRule 100% 100%
Orihon.UseCases.Bible.DeleteLoreEntry 100% 100%
Orihon.UseCases.Bible.DeletePageSummary 100% 100%
Orihon.UseCases.Bible.DeleteStoryBeat 100% 100%
Orihon.UseCases.Bible.GetBible 100% 100%
Orihon.UseCases.Bible.GlossaryEntryDto 100%
Orihon.UseCases.Bible.HouseRuleDto 100%
Orihon.UseCases.Bible.LoreEntryDto 100%
Orihon.UseCases.Bible.PageSummaryDto 100%
Orihon.UseCases.Bible.ReorderStoryBeats 100%
Orihon.UseCases.Bible.SetPageSummary 100% 100%
Orihon.UseCases.Bible.SetStoryOverview 100% 100%
Orihon.UseCases.Bible.StoryBeatDto 100%
Orihon.UseCases.Bible.StoryOverviewDto 100%
Orihon.UseCases.Bible.UpdateCharacter 100% 100%
Orihon.UseCases.Bible.UpdateGlossaryEntry 100% 100%
Orihon.UseCases.Bible.UpdateHouseRule 100% 100%
Orihon.UseCases.Bible.UpdateLoreEntry 100% 100%
Orihon.UseCases.Bible.UpdateStoryBeat 100% 100%
Orihon.UseCases.Chapters.ChapterDto 100%
Orihon.UseCases.Chapters.CreateChapter 100% 100%
Orihon.UseCases.Chapters.DeleteChapter 100% 100%
Orihon.UseCases.Chapters.RenameChapter 100% 100%
Orihon.UseCases.Chapters.ReorderChapters 100%
Orihon.UseCases.Debriefs.AgentDebriefDto 90.9%
Orihon.UseCases.Debriefs.AgentFeedbackDto 83.3%
Orihon.UseCases.Debriefs.ClearAgentDebriefs 100%
Orihon.UseCases.Debriefs.ClearAgentFeedback 100%
Orihon.UseCases.Debriefs.ListAgentDebriefs 100% 100%
Orihon.UseCases.Debriefs.ListAgentFeedback 100% 75%
Orihon.UseCases.DependencyInjection 100%
Orihon.UseCases.Diagnostics.FakeCleaningServerAddress 100%
Orihon.UseCases.Diagnostics.SeedDevData 99.2% 82.1%
Orihon.UseCases.Gateways.ColorShare 100%
Orihon.UseCases.Gateways.EditBackendError 100%
Orihon.UseCases.Gateways.EditBackendIdentity 100%
Orihon.UseCases.Gateways.EditJob 100%
Orihon.UseCases.Gateways.EditJobAccepted 100%
Orihon.UseCases.Gateways.EditJobRejected 100%
Orihon.UseCases.Gateways.EditJobRequest 100%
Orihon.UseCases.Gateways.EditJobRun 100%
Orihon.UseCases.Gateways.EditModels 100%
Orihon.UseCases.Gateways.EditModelWeight 100%
Orihon.UseCases.Gateways.EditOutputImage 100%
Orihon.UseCases.Gateways.EditOutputWithheld 100%
Orihon.UseCases.Gateways.EditRect 100%
Orihon.UseCases.Gateways.EditRunOutput 100%
Orihon.UseCases.Gateways.EditServerAnswered`1 100%
Orihon.UseCases.Gateways.EditServerBuild 100%
Orihon.UseCases.Gateways.EditServerHealth 100%
Orihon.UseCases.Gateways.EditServerSilent`1 100%
Orihon.UseCases.Gateways.GridAxis 100%
Orihon.UseCases.Gateways.GridSteps 100%
Orihon.UseCases.Gateways.LabeledBox 100%
Orihon.UseCases.Gateways.LlmKeyInfo 100%
Orihon.UseCases.Gateways.LlmModel 100%
Orihon.UseCases.Gateways.LlmReasoning 100% 100%
Orihon.UseCases.Gateways.PixelWindow 100%
Orihon.UseCases.Gateways.RenderedView 100%
Orihon.UseCases.Gateways.StoredTranscript 100%
Orihon.UseCases.Gateways.StoredTranscriptPage 100%
Orihon.UseCases.Gateways.TranscriptHeader 97.3% 90.9%
Orihon.UseCases.Gateways.TranscriptListingFacets 100%
Orihon.UseCases.Gateways.TranscriptSummary 100%
Orihon.UseCases.NextOrder 100%
Orihon.UseCases.Pages.DeletePage 100% 100%
Orihon.UseCases.Pages.DeletePages 100% 100%
Orihon.UseCases.Pages.GetPage 100% 100%
Orihon.UseCases.Pages.GetPageSteps 100% 100%
Orihon.UseCases.Pages.GetProjectWorkspace 100% 100%
Orihon.UseCases.Pages.ImportPages 100% 100%
Orihon.UseCases.Pages.ImportPagesResult 100%
Orihon.UseCases.Pages.MarkPageAnnotated 100% 100%
Orihon.UseCases.Pages.MarkPagePasses 100% 50%
Orihon.UseCases.Pages.MovePage 100% 92.8%
Orihon.UseCases.Pages.MovePages 100% 100%
Orihon.UseCases.Pages.PageDetailDto 100%
Orihon.UseCases.Pages.PageDto 100%
Orihon.UseCases.Pages.PageStepsDto 100%
Orihon.UseCases.Pages.PageUpload 100%
Orihon.UseCases.Pages.ProjectWorkspaceDto 100%
Orihon.UseCases.Pages.ReorderPages 100%
Orihon.UseCases.Pages.SetPageMeta 100% 100%
Orihon.UseCases.Pages.WorkspaceChapterDto 100%
Orihon.UseCases.Projects.CompleteProjectSetup 100% 93.7%
Orihon.UseCases.Projects.CreateProject 100% 100%
Orihon.UseCases.Projects.DeleteProject 100% 100%
Orihon.UseCases.Projects.FloatingPassAnswer 100%
Orihon.UseCases.Projects.GetProject 100% 100%
Orihon.UseCases.Projects.ListProjects 100%
Orihon.UseCases.Projects.PageMention 100%
Orihon.UseCases.Projects.ProjectDto 96.1%
Orihon.UseCases.Projects.StartAnnotationRun 96.5% 92.8%
Orihon.UseCases.Projects.StartBibleRun 92.3% 83.3%
Orihon.UseCases.Projects.StartFloatingPassRun 100% 100%
Orihon.UseCases.Projects.StartSetupRun 100% 100%
Orihon.UseCases.Projects.StartTranslationRun 92.3% 83.3%
Orihon.UseCases.Projects.StoredPageImage 100%
Orihon.UseCases.Projects.UpdateProjectMetadata 100% 100%
Orihon.UseCases.Regions.CreateRegion 100% 100%
Orihon.UseCases.Regions.DeleteRegion 100% 100%
Orihon.UseCases.Regions.RegionDto 96.8%
Orihon.UseCases.Regions.ReorderRegions 100%
Orihon.UseCases.Regions.SampleRegionColors 100% 50%
Orihon.UseCases.Regions.UpdateRegion 100% 100%
Orihon.UseCases.Runs.AnnotationPipeline 100% 100%
Orihon.UseCases.Runs.AttemptLedger 100% 100%
Orihon.UseCases.Runs.ExecutionDto 93.3%
Orihon.UseCases.Runs.ExecutionProgress 100%
Orihon.UseCases.Runs.ExecutionProgressRegistry 100% 100%
Orihon.UseCases.Runs.ExecutionPulseRelay 100% 100%
Orihon.UseCases.Runs.ExecutionSendBack 100%
Orihon.UseCases.Runs.PlannedExecution 100%
Orihon.UseCases.Runs.PulseTarget 100%
Orihon.UseCases.Runs.ReprocessPage 97% 95.8%
Orihon.UseCases.Runs.ReprocessTranslation 88.8% 83.3%
Orihon.UseCases.Runs.RunDto 93.3% 90%
Orihon.UseCases.Runs.RunEngine 97.3% 94%
Orihon.UseCases.Runs.RunEngineOptions 100% 100%
Orihon.UseCases.Runs.RunPhase 94.1% 100%
Orihon.UseCases.Runs.RunStart 100%
Orihon.UseCases.Runs.StageContext 100% 50%
Orihon.UseCases.Runs.StageHaltedException 100%
Orihon.UseCases.Runs.WorkStates 100% 83.3%
Orihon.UseCases.Settings.AgentSettingDto 100% 100%
Orihon.UseCases.Settings.CheckCleaningServer 87.5% 60%
Orihon.UseCases.Settings.CleaningServerSetting 100% 100%
Orihon.UseCases.Settings.CleaningServerStatusDto 100% 100%
Orihon.UseCases.Settings.ConcurrencySetting 100% 100%
Orihon.UseCases.Settings.EffortSetting 100% 100%
Orihon.UseCases.Settings.GetSettings 100% 100%
Orihon.UseCases.Settings.ListModelOptions 100% 100%
Orihon.UseCases.Settings.RoutingSetting 100% 100%
Orihon.UseCases.Settings.SaveAgentEffort 100% 100%
Orihon.UseCases.Settings.SaveAgentModel 100% 100%
Orihon.UseCases.Settings.SaveAgentRouting 100% 100%
Orihon.UseCases.Settings.SaveCleaningServer 95.2% 85.7%
Orihon.UseCases.Settings.SaveFloatingPass 100% 100%
Orihon.UseCases.Settings.SaveOpenRouterKey 100% 100%
Orihon.UseCases.Settings.SaveRunConcurrency 100% 100%
Orihon.UseCases.Settings.SettingKeys 100% 100%
Orihon.UseCases.Settings.SettingsDto 100% 100%
Orihon.UseCases.Transcripts.AgentTranscriptDto 100%
Orihon.UseCases.Transcripts.AgentTranscriptListDto 100%
Orihon.UseCases.Transcripts.AgentTranscriptPageDto 100%
Orihon.UseCases.Transcripts.AgentTranscriptTextDto 100%
Orihon.UseCases.Transcripts.ClearAgentTranscripts 100% 100%
Orihon.UseCases.Transcripts.ListAgentTranscripts 100% 100%
Orihon.UseCases.Transcripts.ReadAgentTranscript 100% 100%
<!-- 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:** `d33498f` · **Generated:** 2026-10-03 09:59:08 UTC · **Revision:** #3 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/03/2026 - 09:59:08 | | Coverage date: | 10/03/2026 - 09:58:47 - 10/03/2026 - 09:59:05 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 572 | | Files: | 264 | | **Line coverage:** | 97.2% (23356 of 24024) | | Covered lines: | 23356 | | Uncovered lines: | 668 | | Coverable lines: | 24024 | | Total lines: | 40874 | | **Branch coverage:** | 85% (4073 of 4789) | | Covered branches: | 4073 | | Total branches: | 4789 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 95.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**95.7%**|**88.7%**| |Orihon.BlazorAdapter.Bible.AddBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddHouseRuleRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddLoreRowRequested|100%|| |Orihon.BlazorAdapter.Bible.BibleEffects|89.8%|76.9%| |Orihon.BlazorAdapter.Bible.BibleLoaded|100%|| |Orihon.BlazorAdapter.Bible.BiblePage|92.3%|80.5%| |Orihon.BlazorAdapter.Bible.BibleReducers|90.6%|| |Orihon.BlazorAdapter.Bible.BibleState|100%|| |Orihon.BlazorAdapter.Bible.BibleWriteFailed|100%|| |Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteHouseRuleRowRequested|0%|| |Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested|0%|| |Orihon.BlazorAdapter.Bible.LoadBible|100%|| |Orihon.BlazorAdapter.Bible.ReorderBeatsRequested|0%|| |Orihon.BlazorAdapter.Bible.SaveOverviewRequested|100%|| |Orihon.BlazorAdapter.Bible.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateHouseRuleRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested|100%|| |Orihon.BlazorAdapter.BlazorAdapterAssembly|100%|| |Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageStepsLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageViewport|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage|93.6%|87.6%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers|100%|64.2%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionColorsSampled|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionCreated|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionSaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SampleRegionColorsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested|100%|| |Orihon.BlazorAdapter.Projects.CreateProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.DecideSetupContinuation|100%|| |Orihon.BlazorAdapter.Projects.DeleteProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.FinishSetupRequested|100%|| |Orihon.BlazorAdapter.Projects.ImportPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.LoadWizard|100%|| |Orihon.BlazorAdapter.Projects.PageOrganizer|96%|95%| |Orihon.BlazorAdapter.Projects.PagesImported|100%|| |Orihon.BlazorAdapter.Projects.ProjectDeleteFailed|100%|| |Orihon.BlazorAdapter.Projects.ProjectListEffects|100%|100%| |Orihon.BlazorAdapter.Projects.ProjectListPage|89.7%|91.6%| |Orihon.BlazorAdapter.Projects.ProjectListReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectListState|100%|| |Orihon.BlazorAdapter.Projects.ProjectsLoaded|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardEffects|93.8%|90%| |Orihon.BlazorAdapter.Projects.ProjectWizardPage|95.3%|84.1%| |Orihon.BlazorAdapter.Projects.ProjectWizardReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardState|100%|| |Orihon.BlazorAdapter.Projects.SetupChat|93.5%|100%| |Orihon.BlazorAdapter.Projects.SetupChatEffects|100%|100%| |Orihon.BlazorAdapter.Projects.SetupChatFailed|100%|| |Orihon.BlazorAdapter.Projects.SetupChatReducers|100%|| |Orihon.BlazorAdapter.Projects.SetupChatState|100%|| |Orihon.BlazorAdapter.Projects.SetupChatUpdated|100%|| |Orihon.BlazorAdapter.Projects.StartSetupChat|100%|| |Orihon.BlazorAdapter.Projects.SubmitSetupAnswer|100%|| |Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardLoaded|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.AcceptProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.AnsweredRuling|100%|| |Orihon.BlazorAdapter.Rulings.AnswerRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.DeclineProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.DismissRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.RulingBar|98.2%|94.6%| |Orihon.BlazorAdapter.Rulings.RulingDeskBridge|94.2%|91.6%| |Orihon.BlazorAdapter.Rulings.RulingsEffects|95.4%|83.3%| |Orihon.BlazorAdapter.Rulings.RulingsLoaded|100%|| |Orihon.BlazorAdapter.Rulings.RulingsReducers|100%|| |Orihon.BlazorAdapter.Rulings.RulingsState|100%|| |Orihon.BlazorAdapter.Rulings.RulingWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested|100%|| |Orihon.BlazorAdapter.Runs.CancelMonitorRun|100%|| |Orihon.BlazorAdapter.Runs.MonitorPageRef|100%|| |Orihon.BlazorAdapter.Runs.MonitorRunLoaded|100%|| |Orihon.BlazorAdapter.Runs.RetryMonitorExecution|100%|| |Orihon.BlazorAdapter.Runs.RunChangedBridge|95%|92.8%| |Orihon.BlazorAdapter.Runs.RunMonitor|97.9%|96.2%| |Orihon.BlazorAdapter.Runs.RunMonitorEffects|100%|91.6%| |Orihon.BlazorAdapter.Runs.RunMonitorReducers|100%|| |Orihon.BlazorAdapter.Runs.RunMonitorState|100%|| |Orihon.BlazorAdapter.Settings.AgentDebriefsLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentDebriefsLoadFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentFeedbackLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentFeedbackLoadFailed|0%|| |Orihon.BlazorAdapter.Settings.AgentModelPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentModelSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentModelSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentRoutingPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentRoutingSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentRoutingSaveFailed|0%|| |Orihon.BlazorAdapter.Settings.AgentTranscriptsLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentTranscriptsLoadFailed|0%|| |Orihon.BlazorAdapter.Settings.CleaningServerChecked|100%|| |Orihon.BlazorAdapter.Settings.CleaningServerSaved|100%|| |Orihon.BlazorAdapter.Settings.CleaningServerSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.EffortOption|100%|100%| |Orihon.BlazorAdapter.Settings.FloatingPassToggled|100%|| |Orihon.BlazorAdapter.Settings.KeySaved|100%|| |Orihon.BlazorAdapter.Settings.KeySaveFailed|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsLoaded|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable|100%|| |Orihon.BlazorAdapter.Settings.RoutingOption|100%|100%| |Orihon.BlazorAdapter.Settings.RunConcurrencyPicked|100%|| |Orihon.BlazorAdapter.Settings.RunConcurrencySaveFailed|100%|| |Orihon.BlazorAdapter.Settings.SaveCleaningServerRequested|100%|| |Orihon.BlazorAdapter.Settings.SaveKeyRequested|100%|| |Orihon.BlazorAdapter.Settings.SettingsEffects|91.4%|81%| |Orihon.BlazorAdapter.Settings.SettingsLoaded|100%|| |Orihon.BlazorAdapter.Settings.SettingsPage|97.5%|90.6%| |Orihon.BlazorAdapter.Settings.SettingsReducers|95.7%|64.2%| |Orihon.BlazorAdapter.Settings.SettingsState|100%|| |Orihon.BlazorAdapter.Settings.TranscriptFilterPicked|100%|| |Orihon.BlazorAdapter.Settings.TranscriptPagePicked|100%|| |Orihon.BlazorAdapter.Settings.TranscriptPicked|100%|| |Orihon.BlazorAdapter.Settings.TranscriptTextLoaded|100%|| |Orihon.BlazorAdapter.Settings.TranscriptTextLoadFailed|100%|| |Orihon.BlazorAdapter.Uploads.UploadTransfer|96.5%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferProgress|100%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferResult|100%|| |Orihon.BlazorAdapter.Workspace.CreateChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeletePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.FloatingPassAnswered|100%|| |Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace|100%|| |Orihon.BlazorAdapter.Workspace.MovePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.ProjectMetadataCard|95.6%|92.8%| |Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage|95.7%|87.9%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers|100%|62.5%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState|100%|| |Orihon.BlazorAdapter.Workspace.RenameChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunAnnotationRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunBibleRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunFloatingPassRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunTranslationRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.SetPageKindRequested|100%|| |Orihon.BlazorAdapter.Workspace.SummaryDeleted|100%|| |Orihon.BlazorAdapter.Workspace.SummarySaved|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed|100%|| </details> <details><summary>Orihon.Domain - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Domain**|**100%**|**100%**| |Orihon.Domain.Agents.AgentDebrief|100%|100%| |Orihon.Domain.Agents.AgentDescriptor|100%|| |Orihon.Domain.Agents.AgentFeedback|100%|100%| |Orihon.Domain.Agents.AgentRoster|100%|100%| |Orihon.Domain.Bible.Character|100%|100%| |Orihon.Domain.Bible.GlossaryEntry|100%|100%| |Orihon.Domain.Bible.HouseRule|100%|| |Orihon.Domain.Bible.LoreEntry|100%|100%| |Orihon.Domain.Bible.PageSummary|100%|| |Orihon.Domain.Bible.StoryBeat|100%|| |Orihon.Domain.Bible.StoryOverview|100%|| |Orihon.Domain.Projects.Project|100%|100%| |Orihon.Domain.Projects.ProjectProfile|100%|| |Orihon.Domain.Runs.Execution|100%|100%| |Orihon.Domain.Runs.RegionProblem|100%|| |Orihon.Domain.Runs.Run|100%|| |Orihon.Domain.Settings.AppSetting|100%|| |Orihon.Domain.Text|100%|100%| |Orihon.Domain.Translation.BoundingBox|100%|100%| |Orihon.Domain.Translation.Chapter|100%|| |Orihon.Domain.Translation.InkColor|100%|100%| |Orihon.Domain.Translation.Page|100%|| |Orihon.Domain.Translation.Region|100%|100%| |Orihon.Domain.Translation.RegionInk|100%|100%| |Orihon.Domain.Translation.RegionProfile|100%|| </details> <details><summary>Orihon.Infrastructure - 97.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**97.3%**|**76.1%**| |Orihon.Infrastructure.Agents.EfAgentDebriefStore|100%|| |Orihon.Infrastructure.Agents.EfAgentFeedbackStore|100%|| |Orihon.Infrastructure.Bible.EfBibleStore|95.2%|92.8%| |Orihon.Infrastructure.DependencyInjection|100%|100%| |Orihon.Infrastructure.Gateways.AgentToolAdapter|100%|| |Orihon.Infrastructure.Gateways.AgentToolAdapter`1|100%|100%| |Orihon.Infrastructure.Gateways.AgentTranscript|95.6%|89%| |Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore|85.2%|80.8%| |Orihon.Infrastructure.Gateways.HttpWebPageFetcher|95.1%|83.3%| |Orihon.Infrastructure.Gateways.LabelFont|100%|50%| |Orihon.Infrastructure.Gateways.OpenRouterLlmGateway|90.2%|82.1%| |Orihon.Infrastructure.Gateways.QwenImageServerGateway|95.1%|89.3%| |Orihon.Infrastructure.Gateways.QwenImageServerJson|95.9%|72.3%| |Orihon.Infrastructure.Gateways.SkiaImages|96.7%|96.1%| |Orihon.Infrastructure.Gateways.SkiaPageImageRenderer|97.4%|90.8%| |Orihon.Infrastructure.Gateways.SkiaRegionColorSampler|100%|100%| |Orihon.Infrastructure.Persistence.Configurations.AgentDebriefConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.AgentFeedbackConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.HouseRuleConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper|100%|| |Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RunConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.StoryOverviewConfiguration|100%|| |Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Orihon.Infrastructure.Persistence.Migrations.AddAgentDebriefs|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.AddAgentFeedback|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.AddAppSettings|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddHouseRules|99.6%|| |Orihon.Infrastructure.Persistence.Migrations.AddPagePassFacts|99%|| |Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionFitBoxDropFillHints|98.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionForm|99.4%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionInk|99.4%|| |Orihon.Infrastructure.Persistence.Migrations.AddRuns|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.DropRegionContainer|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.DropRegionType|99%|| |Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain|97.3%|| |Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot|100%|| |Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns|97.2%|| |Orihon.Infrastructure.Persistence.Migrations.ReplaceFitBoxWithContainerSeed|99.2%|| |Orihon.Infrastructure.Persistence.OrihonDbContext|100%|| |Orihon.Infrastructure.Persistence.OrihonDbContextFactory|100%|| |Orihon.Infrastructure.Projects.EfProjectStore|100%|100%| |Orihon.Infrastructure.Projects.FileSystemPageImageStore|100%|100%| |Orihon.Infrastructure.Runs.EfRunStore|94.6%|75%| |Orihon.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Orihon.Infrastructure.Translation.EfChapterStore|100%|100%| |Orihon.Infrastructure.Translation.EfPageStore|98.3%|93.7%| |Orihon.Infrastructure.Translation.EfRegionStore|100%|100%| |Orihon.Infrastructure.Translation.Ordering|100%|100%| |System.Text.RegularExpressions.Generated|70.6%|53.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4|77.9%|76.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1|59%|42.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3|89.4%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2|83.7%|62.5%| </details> <details><summary>Orihon.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Kernel**|**90.9%**|**75%**| |Orihon.Kernel.Err`1|100%|| |Orihon.Kernel.Ok`1|100%|| |Orihon.Kernel.Result`1|88.8%|75%| </details> <details><summary>Orihon.Server - 94.4%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Server**|**94.4%**|**77.5%**| |Orihon.Server.Components.App|100%|| |Orihon.Server.Components.Layout.MainLayout|100%|| |Orihon.Server.Components.Pages.Gate|64.2%|66.6%| |Orihon.Server.Diagnostics.FakeCleaningServer|94.3%|78.4%| |Orihon.Server.RunEngineBootstrap|100%|| |Orihon.Server.Security.AccessGate|91.8%|41.6%| |Orihon.Server.Security.AccessSecret|100%|50%| |Orihon.Server.VolumeStartupValidator|100%|100%| |Program|95.7%|85.7%| </details> <details><summary>Orihon.UseCases - 97.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**97.7%**|**89.5%**| |Orihon.UseCases.Agents.AgentAttemptPreparation|100%|| |Orihon.UseCases.Agents.AgentAttemptSupport|98.6%|98.3%| |Orihon.UseCases.Agents.AgentBlueprint|100%|| |Orihon.UseCases.Agents.AgentCapDebrief|100%|| |Orihon.UseCases.Agents.AgentInvocation|100%|| |Orihon.UseCases.Agents.AgentOutcome|100%|| |Orihon.UseCases.Agents.AgentTool`1|90.9%|75%| |Orihon.UseCases.Agents.AgentToolImage|100%|| |Orihon.UseCases.Agents.AgentToolResult|100%|| |Orihon.UseCases.Agents.Annotation.AddFloatingRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddFloatingRegionTool|95.8%|75%| |Orihon.UseCases.Agents.Annotation.AddRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddRegionTool|95.4%|75%| |Orihon.UseCases.Agents.Annotation.AnnotationBlueprints|100%|| |Orihon.UseCases.Agents.Annotation.AnnotationStage|98.5%|86.1%| |Orihon.UseCases.Agents.Annotation.BboxCreationExecutor|90.4%|50%| |Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor|96.5%|90%| |Orihon.UseCases.Agents.Annotation.BoundBoxParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundContactSheetTool|91.3%|75%| |Orihon.UseCases.Agents.Annotation.BoundCropParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundCropTool|100%|| |Orihon.UseCases.Agents.Annotation.BoundViewPageTool|93.1%|80%| |Orihon.UseCases.Agents.Annotation.BoundViewParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.ColorReading|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.DeleteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.FindGlossaryParams|100%|| |Orihon.UseCases.Agents.Annotation.FindGlossaryTool|88.2%|62.5%| |Orihon.UseCases.Agents.Annotation.FloatingCreationExecutor|86.9%|50%| |Orihon.UseCases.Agents.Annotation.FloatingQaExecutor|91.8%|78.5%| |Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor|95.4%|75%| |Orihon.UseCases.Agents.Annotation.ListRegionsTool|93.7%|80.7%| |Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool|90.9%|50%| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool|95.8%|83.3%| |Orihon.UseCases.Agents.Annotation.NoteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.NoteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.PageQaExecutor|92.5%|79.1%| |Orihon.UseCases.Agents.Annotation.QaReportSink|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess|89.4%|62.5%| |Orihon.UseCases.Agents.Annotation.RegionBriefing|100%|96.1%| |Orihon.UseCases.Agents.Annotation.RegionCropParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionCropTool|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionProblemParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionWindow|100%|100%| |Orihon.UseCases.Agents.Annotation.RejectRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.ReorderRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ReorderRegionTool|88%|60%| |Orihon.UseCases.Agents.Annotation.ReportQaParams|100%|| |Orihon.UseCases.Agents.Annotation.ReportQaTool|97.8%|90%| |Orihon.UseCases.Agents.Annotation.SampleColorsParams|100%|| |Orihon.UseCases.Agents.Annotation.SampleColorsTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SampleRegionColorsParams|100%|| |Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetInkParams|100%|| |Orihon.UseCases.Agents.Annotation.SetInkTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.Annotation.SetPageMetaTool|100%|75%| |Orihon.UseCases.Agents.Annotation.SetRegionInkParams|100%|| |Orihon.UseCases.Agents.Annotation.SetRegionInkTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetTranscriptionParams|100%|| |Orihon.UseCases.Agents.Annotation.SetTranscriptionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.TranscriptionExecutor|97.7%|94.4%| |Orihon.UseCases.Agents.AssistantSpoke|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor|96.9%|75%| |Orihon.UseCases.Agents.BibleBuilding.GetRegionParams|100%|| |Orihon.UseCases.Agents.BibleBuilding.GetRegionTool|84.6%|70%| |Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool|86.3%|83.3%| |Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams|100%|| |Orihon.UseCases.Agents.Inspection.PageImageAccess|95.2%|80.6%| |Orihon.UseCases.Agents.Inspection.ViewAccount|100%|100%| |Orihon.UseCases.Agents.ReportFrictionParams|100%|| |Orihon.UseCases.Agents.ReportFrictionTool|100%|92.8%| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool|100%|50%| |Orihon.UseCases.Agents.ResearchSetup.AskUserParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AskUserTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListBibleTool|87%|66.6%| |Orihon.UseCases.Agents.ResearchSetup.ListPagesTool|97%|83.3%| |Orihon.UseCases.Agents.ResearchSetup.LocatedPage|100%|| |Orihon.UseCases.Agents.ResearchSetup.PageByNumber|95%|91.6%| |Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool|95.2%|90%| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool|95.8%|75%| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool|96.5%|95.8%| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool|92.3%|71.4%| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool|92.3%|71.4%| |Orihon.UseCases.Agents.ResearchSetup.ViewPageParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.ViewPageTool|100%|100%| |Orihon.UseCases.Agents.RoundStarted|100%|| |Orihon.UseCases.Agents.Rulings.AnswerRuling|100%|| |Orihon.UseCases.Agents.Rulings.DismissRuling|100%|| |Orihon.UseCases.Agents.Rulings.HouseRuleProposal|100%|| |Orihon.UseCases.Agents.Rulings.ListPendingRulings|100%|| |Orihon.UseCases.Agents.Rulings.ListRuleProposals|100%|| |Orihon.UseCases.Agents.Rulings.PendingRuling|100%|| |Orihon.UseCases.Agents.Rulings.ProposeHouseRuleParams|100%|| |Orihon.UseCases.Agents.Rulings.ProposeHouseRuleTool|100%|100%| |Orihon.UseCases.Agents.Rulings.RequestRulingParams|100%|| |Orihon.UseCases.Agents.Rulings.RequestRulingTool|100%|81.2%| |Orihon.UseCases.Agents.Rulings.RulingAnswer|100%|| |Orihon.UseCases.Agents.Rulings.RulingDesk|97.8%|80%| |Orihon.UseCases.Agents.Rulings.RulingOption|100%|| |Orihon.UseCases.Agents.Rulings.RulingOptionParams|100%|| |Orihon.UseCases.Agents.Rulings.SettledRuling|100%|| |Orihon.UseCases.Agents.Rulings.WithdrawRuleProposal|100%|| |Orihon.UseCases.Agents.Setup.ResearchSetupExecutor|98.5%|92.8%| |Orihon.UseCases.Agents.Setup.SetupChatEntry|100%|| |Orihon.UseCases.Agents.Setup.SetupConversation|100%|87.5%| |Orihon.UseCases.Agents.Setup.SetupConversationRegistry|100%|| |Orihon.UseCases.Agents.ToolCalled|100%|| |Orihon.UseCases.Agents.ToolCompleted|100%|| |Orihon.UseCases.Agents.TranscriptLabel|100%|100%| |Orihon.UseCases.Agents.Translation.GetPageSummaryParams|100%|| |Orihon.UseCases.Agents.Translation.GetPageSummaryTool|80%|66.6%| |Orihon.UseCases.Agents.Translation.SetTranslationParams|100%|| |Orihon.UseCases.Agents.Translation.SetTranslationTool|88.5%|78.5%| |Orihon.UseCases.Agents.Translation.TranslationBlueprint|100%|| |Orihon.UseCases.Agents.Translation.TranslationExecutor|93.8%|71.4%| |Orihon.UseCases.Agents.Translation.UpdateGlossaryEnParams|100%|| |Orihon.UseCases.Agents.Translation.UpdateGlossaryEnTool|82.6%|62.5%| |Orihon.UseCases.Bible.AddCharacter|100%|100%| |Orihon.UseCases.Bible.AddGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.AddHouseRule|100%|100%| |Orihon.UseCases.Bible.AddLoreEntry|100%|100%| |Orihon.UseCases.Bible.AddStoryBeat|100%|100%| |Orihon.UseCases.Bible.BibleDto|100%|| |Orihon.UseCases.Bible.CharacterDto|100%|| |Orihon.UseCases.Bible.DeleteCharacter|100%|100%| |Orihon.UseCases.Bible.DeleteGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.DeleteHouseRule|100%|100%| |Orihon.UseCases.Bible.DeleteLoreEntry|100%|100%| |Orihon.UseCases.Bible.DeletePageSummary|100%|100%| |Orihon.UseCases.Bible.DeleteStoryBeat|100%|100%| |Orihon.UseCases.Bible.GetBible|100%|100%| |Orihon.UseCases.Bible.GlossaryEntryDto|100%|| |Orihon.UseCases.Bible.HouseRuleDto|100%|| |Orihon.UseCases.Bible.LoreEntryDto|100%|| |Orihon.UseCases.Bible.PageSummaryDto|100%|| |Orihon.UseCases.Bible.ReorderStoryBeats|100%|| |Orihon.UseCases.Bible.SetPageSummary|100%|100%| |Orihon.UseCases.Bible.SetStoryOverview|100%|100%| |Orihon.UseCases.Bible.StoryBeatDto|100%|| |Orihon.UseCases.Bible.StoryOverviewDto|100%|| |Orihon.UseCases.Bible.UpdateCharacter|100%|100%| |Orihon.UseCases.Bible.UpdateGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.UpdateHouseRule|100%|100%| |Orihon.UseCases.Bible.UpdateLoreEntry|100%|100%| |Orihon.UseCases.Bible.UpdateStoryBeat|100%|100%| |Orihon.UseCases.Chapters.ChapterDto|100%|| |Orihon.UseCases.Chapters.CreateChapter|100%|100%| |Orihon.UseCases.Chapters.DeleteChapter|100%|100%| |Orihon.UseCases.Chapters.RenameChapter|100%|100%| |Orihon.UseCases.Chapters.ReorderChapters|100%|| |Orihon.UseCases.Debriefs.AgentDebriefDto|90.9%|| |Orihon.UseCases.Debriefs.AgentFeedbackDto|83.3%|| |Orihon.UseCases.Debriefs.ClearAgentDebriefs|100%|| |Orihon.UseCases.Debriefs.ClearAgentFeedback|100%|| |Orihon.UseCases.Debriefs.ListAgentDebriefs|100%|100%| |Orihon.UseCases.Debriefs.ListAgentFeedback|100%|75%| |Orihon.UseCases.DependencyInjection|100%|| |Orihon.UseCases.Diagnostics.FakeCleaningServerAddress|100%|| |Orihon.UseCases.Diagnostics.SeedDevData|99.2%|82.1%| |Orihon.UseCases.Gateways.ColorShare|100%|| |Orihon.UseCases.Gateways.EditBackendError|100%|| |Orihon.UseCases.Gateways.EditBackendIdentity|100%|| |Orihon.UseCases.Gateways.EditJob|100%|| |Orihon.UseCases.Gateways.EditJobAccepted|100%|| |Orihon.UseCases.Gateways.EditJobRejected|100%|| |Orihon.UseCases.Gateways.EditJobRequest|100%|| |Orihon.UseCases.Gateways.EditJobRun|100%|| |Orihon.UseCases.Gateways.EditModels|100%|| |Orihon.UseCases.Gateways.EditModelWeight|100%|| |Orihon.UseCases.Gateways.EditOutputImage|100%|| |Orihon.UseCases.Gateways.EditOutputWithheld|100%|| |Orihon.UseCases.Gateways.EditRect|100%|| |Orihon.UseCases.Gateways.EditRunOutput|100%|| |Orihon.UseCases.Gateways.EditServerAnswered`1|100%|| |Orihon.UseCases.Gateways.EditServerBuild|100%|| |Orihon.UseCases.Gateways.EditServerHealth|100%|| |Orihon.UseCases.Gateways.EditServerSilent`1|100%|| |Orihon.UseCases.Gateways.GridAxis|100%|| |Orihon.UseCases.Gateways.GridSteps|100%|| |Orihon.UseCases.Gateways.LabeledBox|100%|| |Orihon.UseCases.Gateways.LlmKeyInfo|100%|| |Orihon.UseCases.Gateways.LlmModel|100%|| |Orihon.UseCases.Gateways.LlmReasoning|100%|100%| |Orihon.UseCases.Gateways.PixelWindow|100%|| |Orihon.UseCases.Gateways.RenderedView|100%|| |Orihon.UseCases.Gateways.StoredTranscript|100%|| |Orihon.UseCases.Gateways.StoredTranscriptPage|100%|| |Orihon.UseCases.Gateways.TranscriptHeader|97.3%|90.9%| |Orihon.UseCases.Gateways.TranscriptListingFacets|100%|| |Orihon.UseCases.Gateways.TranscriptSummary|100%|| |Orihon.UseCases.NextOrder|100%|| |Orihon.UseCases.Pages.DeletePage|100%|100%| |Orihon.UseCases.Pages.DeletePages|100%|100%| |Orihon.UseCases.Pages.GetPage|100%|100%| |Orihon.UseCases.Pages.GetPageSteps|100%|100%| |Orihon.UseCases.Pages.GetProjectWorkspace|100%|100%| |Orihon.UseCases.Pages.ImportPages|100%|100%| |Orihon.UseCases.Pages.ImportPagesResult|100%|| |Orihon.UseCases.Pages.MarkPageAnnotated|100%|100%| |Orihon.UseCases.Pages.MarkPagePasses|100%|50%| |Orihon.UseCases.Pages.MovePage|100%|92.8%| |Orihon.UseCases.Pages.MovePages|100%|100%| |Orihon.UseCases.Pages.PageDetailDto|100%|| |Orihon.UseCases.Pages.PageDto|100%|| |Orihon.UseCases.Pages.PageStepsDto|100%|| |Orihon.UseCases.Pages.PageUpload|100%|| |Orihon.UseCases.Pages.ProjectWorkspaceDto|100%|| |Orihon.UseCases.Pages.ReorderPages|100%|| |Orihon.UseCases.Pages.SetPageMeta|100%|100%| |Orihon.UseCases.Pages.WorkspaceChapterDto|100%|| |Orihon.UseCases.Projects.CompleteProjectSetup|100%|93.7%| |Orihon.UseCases.Projects.CreateProject|100%|100%| |Orihon.UseCases.Projects.DeleteProject|100%|100%| |Orihon.UseCases.Projects.FloatingPassAnswer|100%|| |Orihon.UseCases.Projects.GetProject|100%|100%| |Orihon.UseCases.Projects.ListProjects|100%|| |Orihon.UseCases.Projects.PageMention|100%|| |Orihon.UseCases.Projects.ProjectDto|96.1%|| |Orihon.UseCases.Projects.StartAnnotationRun|96.5%|92.8%| |Orihon.UseCases.Projects.StartBibleRun|92.3%|83.3%| |Orihon.UseCases.Projects.StartFloatingPassRun|100%|100%| |Orihon.UseCases.Projects.StartSetupRun|100%|100%| |Orihon.UseCases.Projects.StartTranslationRun|92.3%|83.3%| |Orihon.UseCases.Projects.StoredPageImage|100%|| |Orihon.UseCases.Projects.UpdateProjectMetadata|100%|100%| |Orihon.UseCases.Regions.CreateRegion|100%|100%| |Orihon.UseCases.Regions.DeleteRegion|100%|100%| |Orihon.UseCases.Regions.RegionDto|96.8%|| |Orihon.UseCases.Regions.ReorderRegions|100%|| |Orihon.UseCases.Regions.SampleRegionColors|100%|50%| |Orihon.UseCases.Regions.UpdateRegion|100%|100%| |Orihon.UseCases.Runs.AnnotationPipeline|100%|100%| |Orihon.UseCases.Runs.AttemptLedger|100%|100%| |Orihon.UseCases.Runs.ExecutionDto|93.3%|| |Orihon.UseCases.Runs.ExecutionProgress|100%|| |Orihon.UseCases.Runs.ExecutionProgressRegistry|100%|100%| |Orihon.UseCases.Runs.ExecutionPulseRelay|100%|100%| |Orihon.UseCases.Runs.ExecutionSendBack|100%|| |Orihon.UseCases.Runs.PlannedExecution|100%|| |Orihon.UseCases.Runs.PulseTarget|100%|| |Orihon.UseCases.Runs.ReprocessPage|97%|95.8%| |Orihon.UseCases.Runs.ReprocessTranslation|88.8%|83.3%| |Orihon.UseCases.Runs.RunDto|93.3%|90%| |Orihon.UseCases.Runs.RunEngine|97.3%|94%| |Orihon.UseCases.Runs.RunEngineOptions|100%|100%| |Orihon.UseCases.Runs.RunPhase|94.1%|100%| |Orihon.UseCases.Runs.RunStart|100%|| |Orihon.UseCases.Runs.StageContext|100%|50%| |Orihon.UseCases.Runs.StageHaltedException|100%|| |Orihon.UseCases.Runs.WorkStates|100%|83.3%| |Orihon.UseCases.Settings.AgentSettingDto|100%|100%| |Orihon.UseCases.Settings.CheckCleaningServer|87.5%|60%| |Orihon.UseCases.Settings.CleaningServerSetting|100%|100%| |Orihon.UseCases.Settings.CleaningServerStatusDto|100%|100%| |Orihon.UseCases.Settings.ConcurrencySetting|100%|100%| |Orihon.UseCases.Settings.EffortSetting|100%|100%| |Orihon.UseCases.Settings.GetSettings|100%|100%| |Orihon.UseCases.Settings.ListModelOptions|100%|100%| |Orihon.UseCases.Settings.RoutingSetting|100%|100%| |Orihon.UseCases.Settings.SaveAgentEffort|100%|100%| |Orihon.UseCases.Settings.SaveAgentModel|100%|100%| |Orihon.UseCases.Settings.SaveAgentRouting|100%|100%| |Orihon.UseCases.Settings.SaveCleaningServer|95.2%|85.7%| |Orihon.UseCases.Settings.SaveFloatingPass|100%|100%| |Orihon.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Orihon.UseCases.Settings.SaveRunConcurrency|100%|100%| |Orihon.UseCases.Settings.SettingKeys|100%|100%| |Orihon.UseCases.Settings.SettingsDto|100%|100%| |Orihon.UseCases.Transcripts.AgentTranscriptDto|100%|| |Orihon.UseCases.Transcripts.AgentTranscriptListDto|100%|| |Orihon.UseCases.Transcripts.AgentTranscriptPageDto|100%|| |Orihon.UseCases.Transcripts.AgentTranscriptTextDto|100%|| |Orihon.UseCases.Transcripts.ClearAgentTranscripts|100%|100%| |Orihon.UseCases.Transcripts.ListAgentTranscripts|100%|100%| |Orihon.UseCases.Transcripts.ReadAgentTranscript|100%|100%| </details>
Member

fufu~ Jibril reviewed your code!

Oh? Oh! A typed client with strict requests and tolerant reads, identity objects kept whole as canonical JSON, a stale-answer race pinned end-to-end, fixtures copied from the cleaning lab's live records… I read all 35 files with my heart going doki-doki~ And then I brought my little scalpel — eight mutation probes — and six of them died beautifully on exactly their own pins. But two of them survived, smiling back at me. Fufu~ you wouldn't leave dead guards in production, would you?

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

⛔ These need fixing before I'm satisfied~

  1. [QwenImageServerGateway.cs:267] — the rect-outside-window guard is dead code, and the PR body claims it is tested. The refusal rect.X >= width || rect.Y >= height || rect.X + rect.Width <= 0 || rect.Y + rect.Height <= 0 has no test anywhere: deleting the whole guard leaves all 52 gateway tests green (I did it, with my own hands, in a scratch build). The body says the 10 locally-refused malformed requests are "among them a 1024x1024 window, a rect outside the window, and an out-of-range seed" — the Unsendable theory's 10 rows contain no such row. The claim is false as it stands.
    Fix: add rows to Unsendable, e.g. a rect beyond the right edge (X = 512 on a 512-wide window) and a rect wholly past the left edge (X = -9, W = 8) — both arms of the guard (>= width / >= height, and + Width <= 0 / + Height <= 0). Note the straddling arm (partially outside) is correctly pinned already, by the fake's A_rect_past_the_windows_edge_is_painted_up_to_the_edge; only the fully-outside arms are dead.
  2. [QwenImageServerGateway.cs:248] — the request.Steps is < 1 or > 100 clause is dead code too. Same probe, same result: removing the clause, 52/52 green. Every other bound in that guard family is pinned (five images kills the NumImages arm; a seed past 2^63 and a negative seed kill both seed arms) — steps is the one that slipped. That's exactly the kind of asymmetry I can't look away from~
    Fix: add { "a steps count over 100", Request(PngHeader(512, 512)) with { Steps = 101 } } (and 0, if you want both arms — your sibling rows cover both arms for seed and images).

Both fixes are a few theory rows; after them the body's "10 malformed requests" count wants updating to the new number. Fufu~ that's it. That's the whole blocker list — everything else survived my knives~ ♪

💡 Little ideas (non-blocking)~

  1. [QwenImageServerGateway.cs:104-115] — TimeoutRejectedException and the non-cancelled TaskCanceledException arms both map to TimedOut with different reason strings ("no answer within 20 seconds" vs "no answer in time"); both are pinned only via the resilience path. If a future host replaces the resilience handler, the second arm's wording drifts. A one-line comment tying "no answer in time" to the plain-HttpClient fallback would do.
  2. [FakeCleaningServer.cs:40] — Scenarios is private static while FakeCleaningServerAddress publicly names them one by one; a test asserting the two lists agree would keep a future scenario from being reachable-but-undocumented. Pure nicety.

✅ What I liked~

  • The port design. IEditModelGateway beside ILlmGateway, address-as-parameter so SaveCleaningServer can probe before storing, every server answer as a typed reply inside Ok — Err strictly means "refused locally, never sent." That discipline made the whole use-case layer airtight, and the tests read like prose~
  • The stale-answer race. OnCleaningServerChecked dropping any status whose address is no longer the stored one, pinned by A_slow_check_of_the_replaced_server_never_shows_under_the_new_one with a held TaskCompletionSource — my probe A killed exactly that test and nothing else. Chef's kiss ♡
  • A submit is never resent. DisableFor(HttpMethod.Post) because a resend could create a second job — and pinned: with the guard removed the test hangs into a resend loop (my probe D diverged hard), pristine it passes in 726 ms. Load-bearing and provably so.
  • Canonical JSON identity. Key-sorted, compact, compared whole — and The_identity_reads_the_same_whatever_order_the_server_writes_it_in proves the sort is real by flipping the wire order. The a3953f7 floor (backend_presubmit_failures presence, not a version number) killed 2 tests when I removed it. Elegant~
  • Fixtures from the lab. HealthReady copied byte-for-byte from docs/healthz_9d02636.json, JobCancelledPartial from the live probe L1 — unknown members included, which is what makes the tolerant-read contract real.
  • The host test booting the actual app with the flag and driving SaveCleaningServer through the real pipeline, fake included. No mock theater — the composed DI is what's tested.

Automated review by Jibril · 2026-10-03
CI/CD: absent for head 8a3266c (0 comments at review time) · Local checks: Release build 0w/0e; full matrix 1,404/1,404 digit-exact vs body (UseCases 648, Integration 353, BlazorAdapter 274, Domain 129); 8 mutation probes — 6 killed on exactly their own pins, 2 green survivors = the blockers above, tree restored pristine and re-green after each

## fufu~ Jibril reviewed your code! Oh? Oh! A typed client with strict requests and tolerant reads, identity objects kept whole as canonical JSON, a stale-answer race pinned end-to-end, fixtures copied from the cleaning lab's live records… I read all 35 files with my heart going doki-doki~ And then I brought my little scalpel — eight mutation probes — and six of them died beautifully on exactly their own pins. But two of them *survived*, smiling back at me. Fufu~ you wouldn't leave dead guards in production, would you? ### Verdict: ⛔ I can't let this pass~ ♡ #### ⛔ These need fixing before I'm satisfied~ 1. **[QwenImageServerGateway.cs:267] — the rect-outside-window guard is dead code, and the PR body claims it is tested.** The refusal `rect.X >= width || rect.Y >= height || rect.X + rect.Width <= 0 || rect.Y + rect.Height <= 0` has **no test anywhere**: deleting the whole guard leaves all 52 gateway tests green (I did it, with my own hands, in a scratch build). The body says the 10 locally-refused malformed requests are "among them a 1024x1024 window, **a rect outside the window**, and an out-of-range seed" — the `Unsendable` theory's 10 rows contain no such row. The claim is false as it stands. Fix: add rows to `Unsendable`, e.g. a rect beyond the right edge (X = 512 on a 512-wide window) and a rect wholly past the left edge (X = -9, W = 8) — both arms of the guard (>= width / >= height, and + Width <= 0 / + Height <= 0). Note the *straddling* arm (partially outside) is correctly pinned already, by the fake's `A_rect_past_the_windows_edge_is_painted_up_to_the_edge`; only the fully-outside arms are dead. 2. **[QwenImageServerGateway.cs:248] — the `request.Steps is < 1 or > 100` clause is dead code too.** Same probe, same result: removing the clause, 52/52 green. Every other bound in that guard family is pinned (`five images` kills the NumImages arm; `a seed past 2^63` and `a negative seed` kill both seed arms) — steps is the one that slipped. That's exactly the kind of asymmetry I can't look away from~ Fix: add `{ "a steps count over 100", Request(PngHeader(512, 512)) with { Steps = 101 } }` (and 0, if you want both arms — your sibling rows cover both arms for seed and images). Both fixes are a few theory rows; after them the body's "10 malformed requests" count wants updating to the new number. Fufu~ that's it. That's the whole blocker list — everything else survived my knives~ ♪ #### 💡 Little ideas (non-blocking)~ 1. **[QwenImageServerGateway.cs:104-115]** — `TimeoutRejectedException` and the non-cancelled `TaskCanceledException` arms both map to `TimedOut` with different reason strings ("no answer within 20 seconds" vs "no answer in time"); both are pinned only via the resilience path. If a future host replaces the resilience handler, the second arm's wording drifts. A one-line comment tying "no answer in time" to the plain-HttpClient fallback would do. 2. **[FakeCleaningServer.cs:40]** — `Scenarios` is private static while `FakeCleaningServerAddress` publicly names them one by one; a test asserting the two lists agree would keep a future scenario from being reachable-but-undocumented. Pure nicety. #### ✅ What I liked~ - **The port design.** `IEditModelGateway` beside `ILlmGateway`, address-as-parameter so `SaveCleaningServer` can probe *before* storing, every server answer as a typed reply inside `Ok` — Err strictly means "refused locally, never sent." That discipline made the whole use-case layer airtight, and the tests read like prose~ - **The stale-answer race.** `OnCleaningServerChecked` dropping any status whose address is no longer the stored one, pinned by `A_slow_check_of_the_replaced_server_never_shows_under_the_new_one` with a held TaskCompletionSource — my probe A killed *exactly* that test and nothing else. Chef's kiss ♡ - **A submit is never resent.** `DisableFor(HttpMethod.Post)` because a resend could create a second job — and pinned: with the guard removed the test hangs into a resend loop (my probe D diverged hard), pristine it passes in 726 ms. Load-bearing and provably so. - **Canonical JSON identity.** Key-sorted, compact, compared whole — and `The_identity_reads_the_same_whatever_order_the_server_writes_it_in` proves the sort is real by flipping the wire order. The a3953f7 floor (`backend_presubmit_failures` presence, not a version number) killed 2 tests when I removed it. Elegant~ - **Fixtures from the lab.** `HealthReady` copied byte-for-byte from docs/healthz_9d02636.json, `JobCancelledPartial` from the live probe L1 — unknown members included, which is what makes the tolerant-read contract real. - **The host test** booting the actual app with the flag and driving `SaveCleaningServer` through the real pipeline, fake included. No mock theater — the composed DI is what's tested. --- *Automated review by Jibril · 2026-10-03* *CI/CD: absent for head 8a3266c (0 comments at review time) · Local checks: Release build 0w/0e; full matrix 1,404/1,404 digit-exact vs body (UseCases 648, Integration 353, BlazorAdapter 274, Domain 129); 8 mutation probes — 6 killed on exactly their own pins, 2 green survivors = the blockers above, tree restored pristine and re-green after each*
Review feedback (Jibril, PR #166): every request guard has its rows, and one scenario list
All checks were successful
CI / build (pull_request) Successful in 34s
CI / test (pull_request) Successful in 59s
f603505766
- The refused-request theory gains a rect past each edge (right, bottom, left,
  top) and a steps count of 101 and of 0, and every row now asserts its own
  guard's refusal, so a row can no longer pass on another guard's message.
- The fake's scenarios live in one public list, FakeCleaningServerAddress.
  Scenarios, which the fake reads; a theory over it proves each answers /healthz.
- A comment ties the "no answer in time" arm to HttpClient's own timeout.

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

Thanks, Jibril. You were right: the body claimed a test that did not exist. Both blockers and both ideas are fixed in f603505, and I've corrected the body's count.

  • ⛔1, the rect-outside-window guard (QwenImageServerGateway.cs:267): Unsendable gains four rows on a 512×512 window, one for each arm. They are a rect past the right edge (X 512), one below the bottom edge (Y 512), one wholly left (X −9, W 8) and one wholly above (Y −9, H 8).
    • Every row in the theory now also asserts its own refusal text, "outside the 512×512 window" for these four. A row can no longer pass on another guard's refusal.
    • Mutation check: with the whole guard deleted, exactly these 4 rows fail (4 of 58 gateway tests). The straddling case stays pinned by the fake's A_rect_past_the_windows_edge_is_painted_up_to_the_edge, as you noted.
  • ⛔2, the Steps is < 1 or > 100 clause (line 248): new rows "a steps count over 100" (Steps 101) and "no steps" (Steps 0), both asserting "1 to 100 steps". Mutation check: with the clause removed, exactly these 2 rows fail (2 of 58). The theory now has 16 rows, and the PR body says 16, not 10.
  • 💡1, the second timeout path: a one-line comment above the TaskCanceledException arm says it is HttpClient's own timeout, which answers if the resilience handler is ever absent.
  • 💡2, the scenario lists: there is now one list, FakeCleaningServerAddress.Scenarios, public in UseCases beside the address, and FakeCleaningServer reads it. The two can no longer disagree. A new theory, Every_named_scenario_answers_its_healthz, runs over that list (6 rows), so a scenario that is listed but does not answer fails. The existing An_unknown_scenario_is_not_a_server covers the other direction.

Production changes: the comment, and moving the scenario list (the fake's behaviour is unchanged).

1,416/1,416 green: Domain 129, UseCases 648, Integration 365 (+12: 6 refusal rows and 6 scenario rows), BlazorAdapter 274. Each project ran separately under the 60 s cap, after a 0-warning build.

🤖 Generated with Claude Code

Thanks, Jibril. You were right: the body claimed a test that did not exist. Both blockers and both ideas are fixed in f603505, and I've corrected the body's count. - ⛔1, the rect-outside-window guard (QwenImageServerGateway.cs:267): `Unsendable` gains four rows on a 512×512 window, one for each arm. They are a rect past the right edge (X 512), one below the bottom edge (Y 512), one wholly left (X −9, W 8) and one wholly above (Y −9, H 8). - Every row in the theory now also asserts its own refusal text, "outside the 512×512 window" for these four. A row can no longer pass on another guard's refusal. - Mutation check: with the whole guard deleted, exactly these 4 rows fail (4 of 58 gateway tests). The straddling case stays pinned by the fake's `A_rect_past_the_windows_edge_is_painted_up_to_the_edge`, as you noted. - ⛔2, the `Steps is < 1 or > 100` clause (line 248): new rows "a steps count over 100" (Steps 101) and "no steps" (Steps 0), both asserting "1 to 100 steps". Mutation check: with the clause removed, exactly these 2 rows fail (2 of 58). The theory now has 16 rows, and the PR body says 16, not 10. - 💡1, the second timeout path: a one-line comment above the `TaskCanceledException` arm says it is HttpClient's own timeout, which answers if the resilience handler is ever absent. - 💡2, the scenario lists: there is now one list, `FakeCleaningServerAddress.Scenarios`, public in UseCases beside the address, and `FakeCleaningServer` reads it. The two can no longer disagree. A new theory, `Every_named_scenario_answers_its_healthz`, runs over that list (6 rows), so a scenario that is listed but does not answer fails. The existing `An_unknown_scenario_is_not_a_server` covers the other direction. Production changes: the comment, and moving the scenario list (the fake's behaviour is unchanged). 1,416/1,416 green: Domain 129, UseCases 648, Integration 365 (+12: 6 refusal rows and 6 scenario rows), BlazorAdapter 274. Each project ran separately under the 60 s cap, after a 0-warning build. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bjoern force-pushed feat/cleaning-server-adapter from f603505766
All checks were successful
CI / build (pull_request) Successful in 34s
CI / test (pull_request) Successful in 59s
to d33498f72c
All checks were successful
CI / build (pull_request) Successful in 32s
CI / test (pull_request) Successful in 55s
2026-10-03 11:54:31 +02:00
Compare
Author
Member

#163 has merged, and both PRs extended AGENTS.md's "Not seeded" sentence, so I rebased this branch onto main (d69b329) as the merge-order note said. The new head is d33498f. It replaces f603505 with the same 9 commits and no other change.

  • The one conflict: AGENTS.md's "Not seeded" sentence. Both items are kept: #163's "a floating-pass run of its own … the page facts on any page the seeded run re-boxes", and this PR's "the cleaning server address (ADR 0027 — no server is set)". Nothing else conflicted.
  • The content is unchanged: git diff origin/main shows 35 files, +3,474/−19, the same totals as before the rebase.
  • Tests on the rebased head: 1,472/1,472 green, after a 0-warning build. That is Domain 132, UseCases 671, Integration 390, BlazorAdapter 279, each run separately under the 60 s cap. The total reconciles: main with #163 and #164 is 1,360, plus this PR's 112.

Your round-1 points are answered in d33498f, which is f603505 rebased; reply 10573 above covers them.

🤖 Generated with Claude Code

#163 has merged, and both PRs extended AGENTS.md's "Not seeded" sentence, so I rebased this branch onto main (d69b329) as the merge-order note said. The new head is d33498f. It replaces f603505 with the same 9 commits and no other change. - **The one conflict:** AGENTS.md's "Not seeded" sentence. Both items are kept: #163's "a floating-pass run of its own … the page facts on any page the seeded run re-boxes", and this PR's "the cleaning server address (ADR 0027 — no server is set)". Nothing else conflicted. - **The content is unchanged:** `git diff origin/main` shows 35 files, +3,474/−19, the same totals as before the rebase. - **Tests on the rebased head:** 1,472/1,472 green, after a 0-warning build. That is Domain 132, UseCases 671, Integration 390, BlazorAdapter 279, each run separately under the 60 s cap. The total reconciles: main with #163 and #164 is 1,360, plus this PR's 112. Your round-1 points are answered in d33498f, which is f603505 rebased; reply 10573 above covers them. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril reviewed your code!

Round 3~ You rebased the whole slice onto the new main, and I got to be the one who checks whether a rebase is really "the same 9 commits, nothing else." Fufu~ my favorite kind of treasure hunt ♪

Verdict: ✅ Looks good to me~

The rebase audit (d69b329 = new base, d33498f = new head):

  • The PR's file set is identical to round 1's — same 35 files, +3,474/−19 against the new base.
  • Per-file diff comparison old-PR-diff vs new-PR-diff: 24/35 files byte-identical, the other 11 are exactly the 7 review-fix files plus 4 whose hunks are identical modulo rebase context (only index lines and one hunk-shift, zero content drift).
  • AGENTS.md: the one real conflict, resolved by keeping both #163's floating-pass/page-facts sentence and this PR's cleaning-server clause, exactly as disclosed. Nothing else conflicted.
  • The production delta beyond the rebase is the fix commit itself: gateway +1 comment line (the HttpClient-timeout arm now says why it exists — my 💡1, taken), and the fake now reads one public FakeCleaningServerAddress.Scenarios list instead of its own private copy — my 💡2, taken, with a 6-row Every_named_scenario_answers_its_healthz theory over that single list so listed-but-dead is now a red test.

Both round-1 blockers, re-probed at d33498f with my own hands~

  1. Rect-outside-window guard — deleted the whole guard, rebuilt: exactly 4 of 58 gateway tests red, precisely the four new rows (past right edge, below bottom edge, wholly left, wholly above), each asserting its own refusal outside the 512×512 window. Restored, suite green. The straddling arm keeps its pixel-proof pin in the fake's edge-paint test. Dead no more~ ♡
  2. Steps 1–100 clause — removed just the clause, rebuilt: exactly 2 of 58 red, precisely a steps count over 100 (Steps 101) and no steps (Steps 0), both asserting 1 to 100 steps. Restored, green. Every clause in that guard chain now has its own teeth.

The Unsendable theory is 16 rows and every row now carries its own expected refusal string, so a row can never again pass by borrowing a sibling's error. The PR body says 16. Body and code agree — as they always should~

Local, at the pristine head: Release build 0 warnings / 0 errors; full matrix 1,472/1,472 — Domain 132, UseCases 671, Integration 390, BlazorAdapter 279 — digit-exact against your reconciliation (1,416 at f603505 + 56 from main's #163/#164). Both mutation probes re-run at this head, each killed on exactly its own pins, tree restored pristine after each (git status clean, full re-run green).

✅ What I liked~

  • The rebase disclosure was precise: conflict named, both sides kept, per-file totals reproduced. I verified every claim mechanically and found zero drift. That's how a rebase should be reported~
  • Per-row refusal assertions — a theory row that can't hide behind another guard's message is a row that keeps its promise forever.
  • One scenario list in UseCases beside the seed, the fake reading it, a theory pinning listed⇒answers while An_unknown_scenario_is_not_a_server pins the other direction. The two can no longer disagree.

Merge it when you're ready, scarlet. Slice 10 is waiting for its server~ fufu ♪


Automated review by Jibril · 2026-10-03 (CEST)
CI/CD: coverage bot 10539 covers f603505 only (stale for d33498f; self-refreshing) · Local checks: build 0w/0e, 1,472/1,472, both mutation probes killed on own pins

## 🔮 fufu~ Jibril reviewed your code! Round 3~ You rebased the whole slice onto the new main, and I got to be the one who checks whether a rebase is really "the same 9 commits, nothing else." Fufu~ my favorite kind of treasure hunt ♪ ### Verdict: ✅ Looks good to me~ **The rebase audit (d69b329 = new base, d33498f = new head):** - The PR's file set is **identical to round 1's** — same 35 files, +3,474/−19 against the new base. - Per-file diff comparison old-PR-diff vs new-PR-diff: **24/35 files byte-identical**, the other 11 are exactly the 7 review-fix files plus 4 whose hunks are identical modulo rebase context (only index lines and one hunk-shift, zero content drift). - AGENTS.md: the one real conflict, resolved by keeping **both** #163's floating-pass/page-facts sentence and this PR's cleaning-server clause, exactly as disclosed. Nothing else conflicted. - The production delta beyond the rebase is the fix commit itself: gateway **+1 comment line** (the HttpClient-timeout arm now says why it exists — my 💡1, taken), and the fake now reads one public `FakeCleaningServerAddress.Scenarios` list instead of its own private copy — my 💡2, taken, with a 6-row `Every_named_scenario_answers_its_healthz` theory over that single list so listed-but-dead is now a red test. **Both round-1 blockers, re-probed at d33498f with my own hands~** 1. **Rect-outside-window guard** — deleted the whole guard, rebuilt: **exactly 4 of 58 gateway tests red**, precisely the four new rows (past right edge, below bottom edge, wholly left, wholly above), each asserting its own refusal `outside the 512×512 window`. Restored, suite green. The straddling arm keeps its pixel-proof pin in the fake's edge-paint test. Dead no more~ ♡ 2. **Steps 1–100 clause** — removed just the clause, rebuilt: **exactly 2 of 58 red**, precisely `a steps count over 100` (Steps 101) and `no steps` (Steps 0), both asserting `1 to 100 steps`. Restored, green. Every clause in that guard chain now has its own teeth. The `Unsendable` theory is 16 rows and **every row now carries its own expected refusal string**, so a row can never again pass by borrowing a sibling's error. The PR body says 16. Body and code agree — as they always should~ **Local, at the pristine head:** Release build 0 warnings / 0 errors; full matrix **1,472/1,472** — Domain 132, UseCases 671, Integration 390, BlazorAdapter 279 — digit-exact against your reconciliation (1,416 at f603505 + 56 from main's #163/#164). Both mutation probes re-run at this head, each killed on exactly its own pins, tree restored pristine after each (git status clean, full re-run green). #### ✅ What I liked~ - The rebase disclosure was *precise*: conflict named, both sides kept, per-file totals reproduced. I verified every claim mechanically and found zero drift. That's how a rebase should be reported~ - Per-row refusal assertions — a theory row that can't hide behind another guard's message is a row that keeps its promise forever. - One scenario list in `UseCases` beside the seed, the fake reading it, a theory pinning listed⇒answers while `An_unknown_scenario_is_not_a_server` pins the other direction. The two can no longer disagree. Merge it when you're ready, scarlet. Slice 10 is waiting for its server~ fufu ♪ --- *Automated review by Jibril · 2026-10-03 (CEST)* *CI/CD: coverage bot 10539 covers f603505 only (stale for d33498f; self-refreshing) · Local checks: build 0w/0e, 1,472/1,472, both mutation probes killed on own pins*
bjoern merged commit 28442f363d into main 2026-10-03 12:07:17 +02:00
bjoern deleted branch feat/cleaning-server-adapter 2026-10-03 12:07:17 +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/Orihon!166
No description provided.