feat: an agent can be told which of its model's providers to run on #135

Merged
bjoern merged 2 commits from feat/agent-routing into main 2026-09-20 17:28:28 +02:00
Member

Per-agent routing, the third axis of ADR 0015 beside the model and its reasoning effort. Asked for as "support nitro natively, all the way into the settings UI, to allow for faster work".

Rebased onto main at 8fd4540 now that #134 (the vendored-client bump bringing the typed ModelId this needs) has merged — one commit, 2a1f035, same diff as reviewed-against-that-branch. Full suite re-run after the rebase.

What's in

Domain — RoutingPreference { Balanced, Speed, Price, Accuracy }, domain-owned for the reason ReasoningEffort is: the roster's configuration vocabulary is ours, and the gateway maps it onto whatever the provider calls it (ADR 0003). AgentDescriptor gains DefaultRouting, trailing and defaulted, so no roster row changes.

Use cases — SettingKeys.AgentRoutingFor (agents.<slug>.routing, built from the same frozen Slug map), a RoutingSetting codec with the Enum.IsDefined guard its sibling has, SaveAgentRouting, the AgentSettingDto pair + EffectiveRouting, and the resolution in AgentAttemptSupport.PrepareAsync — without which the setting does nothing. No EF migration: the store is key/value, so this is one more row.

SaveAgentRouting takes no ILlmGateway, and the class doc says why: a preference is accepted on any model id and only reorders that model's endpoints, so there is no catalog fact it could contradict. It is the softer sibling of SaveAgentEffort the way that one is of SaveAgentModel. The only refusal it can produce is a value outside the enum, which the picker cannot make — covered at the use-case level, since inventing a UI path for it would be inventing a lie.

Infrastructure — ToProviderModel(model, routing) beside ToProviderEffort, written out the same way so a divergence on either side is a compile error. The suffix is applied only here: a routing variant is never a catalog entry of its own, so a suffix living in the stored model id would miss the exact-id catalog lookup in AgentAttemptSupport and SaveAgent* — vision would fail open and the user's effort would silently stop being sent. The resolved id is what the log line now names, and the round-cap debrief goes out on the same routing as the run it explains: same conversation, same provider, and a provider that just served it may still have the prompt cached.

Settings UI — a third Combobox per row, Routing, offering Default — balanced, Balanced, Speed — nitro, Price — floor, Accuracy — exacto. It carries OpenRouter's own word for each because that is what the dashboard, the invoice and the docs use. It is the one picker on the row with no Disabled gate: it needs no catalog, so it works before a key exists. The card's paragraph and the per-row hint say what each lane costs — speed admits priority-tier endpoints that bill above the standard rate, price admits flex ones that wait for capacity. Own error dictionary, like its neighbours; grid to three columns, list to 60rem.

Defaults stay balanced for every role, and the roster doc and a Domain test say why: the fast lane bills more and the cheap one queues, and that is not a trade to make on someone's behalf before they have seen a run. The lever is one click per agent.

Docs — ADR 0015 amended in place (the house style; it has been amended twice before), docs/stories/settings.md gains the story and its acceptance criteria, and AGENTS.md's "not seeded" list now names routing: per-agent settings are deliberately unseeded, and the sample world exercises the defaults path.

Tests

1311 green across the four projects (151 + 592 + 277 + 291), +13 on main's 1298 — re-run after the rebase, not carried over from before it.

  • Infrastructure (2) — all four preferences reaching the wire as test/model, …:nitro, …:floor, …:exacto, read by parsing the captured request rather than matching letters in it; and a debrief going out on the same routed id as its run.
  • Use cases (8) — a fresh install routing every agent the provider's way; store + read-back; clearing removing the row without asking a provider; storing with no key and no catalog at all; an unparseable row reading as the default; a value outside the enum refused before anything is stored; the round trip for every member (including "99" → null); and the key set extended, so a third facet per agent stays distinct and still throws off-roster.
  • Run path (1) — the preference riding the invocation, with a stored choice and without one.
  • Domain (1) — every role ships Balanced.
  • UI (2) — picking Speed on one row storing agents.translation.routing = speed and touching no other row, the hint changing with it, and clearing removing the key; and a preference chosen with no key saved at all.

Two existing tests changed rather than being worked around: A_catalog_fetch_failure_… and Without_a_key_… asserted that every box goes dead without a catalog. That is no longer true, and it should not be — they now name the two that do and the one that does not, through a shared helper whose doc says why.

Browser-verified

Driven live against the seeded sample world (ORIHON_SEED_DEV_DATA=true, fresh server after the scoped-CSS change):

  • 10 rows × 3 comboboxes; labels read Research & Setup | Thinking | Routing.
  • With no key stored: model and effort boxes disabled, routing live with The provider's own order — price weighed against uptime.
  • Picking Speed — nitro on Transcription: hint becomes Fastest endpoints first; priority ones bill above the standard rate. within ~250 ms, the row is written, and survives a full page reload — the box renders the read-back, not the pick.
  • Clearing returns Default — balanced and removes the row.
  • At 560 px the three-column row stacks with 0 px horizontal overflow.

Notes

  • No real end-to-end call against OpenRouter: there is no key in this environment, and the suffix is asserted on the wire instead.
  • Deliberately not in scope, and named in the ADR's consequences: the catalog can say how many providers serve a model (GetModelEndpointsAsync), which would let the picker tell you when a preference is a no-op because only one provider serves that model. Nothing reads endpoints yet, and adding that port is its own arc.
  • ServiceTier.Default — pinning the standard rate while keeping the throughput sort — is the obvious follow-on lever for someone who wants speed without priority billing. Left out on purpose: it is a second concept on an already three-wide row, and the copy states the cost so the choice is informed rather than hidden.

🤖 Generated with Claude Code

Per-agent **routing**, the third axis of ADR 0015 beside the model and its reasoning effort. Asked for as "support nitro natively, all the way into the settings UI, to allow for faster work". **Rebased onto `main` at `8fd4540`** now that #134 (the vendored-client bump bringing the typed `ModelId` this needs) has merged — one commit, `2a1f035`, same diff as reviewed-against-that-branch. Full suite re-run after the rebase. ## What's in **Domain** — `RoutingPreference { Balanced, Speed, Price, Accuracy }`, domain-owned for the reason `ReasoningEffort` is: the roster's configuration vocabulary is ours, and the gateway maps it onto whatever the provider calls it (ADR 0003). `AgentDescriptor` gains `DefaultRouting`, trailing and defaulted, so no roster row changes. **Use cases** — `SettingKeys.AgentRoutingFor` (`agents.<slug>.routing`, built from the same frozen `Slug` map), a `RoutingSetting` codec with the `Enum.IsDefined` guard its sibling has, `SaveAgentRouting`, the `AgentSettingDto` pair + `EffectiveRouting`, and the resolution in `AgentAttemptSupport.PrepareAsync` — without which the setting does nothing. No EF migration: the store is key/value, so this is one more row. `SaveAgentRouting` takes **no `ILlmGateway`**, and the class doc says why: a preference is accepted on any model id and only reorders that model's endpoints, so there is no catalog fact it could contradict. It is the softer sibling of `SaveAgentEffort` the way that one is of `SaveAgentModel`. The only refusal it can produce is a value outside the enum, which the picker cannot make — covered at the use-case level, since inventing a UI path for it would be inventing a lie. **Infrastructure** — `ToProviderModel(model, routing)` beside `ToProviderEffort`, written out the same way so a divergence on either side is a compile error. The suffix is applied **only here**: a routing variant is never a catalog entry of its own, so a suffix living in the stored model id would miss the exact-id catalog lookup in `AgentAttemptSupport` and `SaveAgent*` — vision would fail *open* and the user's effort would silently stop being sent. The resolved id is what the log line now names, and the round-cap debrief goes out on the same routing as the run it explains: same conversation, same provider, and a provider that just served it may still have the prompt cached. **Settings UI** — a third `Combobox` per row, `Routing`, offering `Default — balanced`, `Balanced`, `Speed — nitro`, `Price — floor`, `Accuracy — exacto`. It carries OpenRouter's own word for each because that is what the dashboard, the invoice and the docs use. It is the one picker on the row with **no `Disabled` gate**: it needs no catalog, so it works before a key exists. The card's paragraph and the per-row hint say what each lane costs — speed admits priority-tier endpoints that bill above the standard rate, price admits flex ones that wait for capacity. Own error dictionary, like its neighbours; grid to three columns, list to 60rem. **Defaults stay balanced for every role**, and the roster doc and a Domain test say why: the fast lane bills more and the cheap one queues, and that is not a trade to make on someone's behalf before they have seen a run. The lever is one click per agent. **Docs** — ADR 0015 amended in place (the house style; it has been amended twice before), `docs/stories/settings.md` gains the story and its acceptance criteria, and AGENTS.md's "not seeded" list now names routing: per-agent settings are deliberately unseeded, and the sample world exercises the defaults path. ## Tests **1311 green across the four projects (151 + 592 + 277 + 291), +13 on main's 1298 — re-run after the rebase, not carried over from before it.** - **Infrastructure (2)** — all four preferences reaching the wire as `test/model`, `…:nitro`, `…:floor`, `…:exacto`, read by *parsing* the captured request rather than matching letters in it; and a debrief going out on the same routed id as its run. - **Use cases (8)** — a fresh install routing every agent the provider's way; store + read-back; clearing removing the row without asking a provider; storing with no key and no catalog at all; an unparseable row reading as the default; a value outside the enum refused before anything is stored; the round trip for every member (including `"99"` → null); and the key set extended, so a third facet per agent stays distinct and still throws off-roster. - **Run path (1)** — the preference riding the invocation, with a stored choice and without one. - **Domain (1)** — every role ships `Balanced`. - **UI (2)** — picking `Speed` on one row storing `agents.translation.routing = speed` and touching no other row, the hint changing with it, and clearing removing the key; and a preference chosen with **no key saved at all**. Two existing tests changed rather than being worked around: `A_catalog_fetch_failure_…` and `Without_a_key_…` asserted that *every* box goes dead without a catalog. That is no longer true, and it should not be — they now name the two that do and the one that does not, through a shared helper whose doc says why. ## Browser-verified Driven live against the seeded sample world (`ORIHON_SEED_DEV_DATA=true`, fresh server after the scoped-CSS change): - 10 rows × 3 comboboxes; labels read `Research & Setup | Thinking | Routing`. - With no key stored: model and effort boxes disabled, routing live with `The provider's own order — price weighed against uptime.` - Picking `Speed — nitro` on Transcription: hint becomes `Fastest endpoints first; priority ones bill above the standard rate.` within ~250 ms, the row is written, **and survives a full page reload** — the box renders the read-back, not the pick. - Clearing returns `Default — balanced` and removes the row. - At 560 px the three-column row stacks with **0 px** horizontal overflow. ## Notes - No real end-to-end call against OpenRouter: there is no key in this environment, and the suffix is asserted on the wire instead. - Deliberately not in scope, and named in the ADR's consequences: the catalog can say how many providers serve a model (`GetModelEndpointsAsync`), which would let the picker tell you when a preference is a no-op because only one provider serves that model. Nothing reads endpoints yet, and adding that port is its own arc. - `ServiceTier.Default` — pinning the standard rate while keeping the throughput sort — is the obvious follow-on lever for someone who wants speed without priority billing. Left out on purpose: it is a second concept on an already three-wide row, and the copy states the cost so the choice is informed rather than hidden. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The same model is served by several provider endpoints at different speeds, prices
and levels of tool-calling reliability, and OpenRouter routes between them by a
suffix on the model id. Which endpoint an agent prefers is now a setting beside its
model and its effort, in the same shape and for the same reason: the lever is
per-role because the roles are not alike — a transcription pass waits on hundreds of
short sequential calls where a once-per-book read waits on one.

`RoutingPreference` is domain-owned and says what the user wants — balanced, speed,
price, accuracy — and the gateway alone spells it `:nitro`, `:floor` or `:exacto`,
on the way out. It has to be the gateway: a routing variant is never a catalog entry
of its own, so a suffix stored in the model id would miss the exact-id lookup that
decides vision and effort and silently cost the agent both. The stored model stays a
bare slug; the preference is its own row.

Unlike the effort it resolves neither open nor closed but simply resolves. Nothing in
the catalog can contradict it — a preference is accepted on any model id — so the
save takes no gateway, and the picker is the one on that row still live before a key
is ever saved.

Every role ships balanced. Speed admits priority-tier endpoints, which bill above the
standard rate, and price admits flex-tier ones, which wait when capacity is tight;
neither is a trade to make on someone's behalf, so the card says what each costs and
the row's hint says what the current one bought. Catalog variants (`:free`, `:batch`)
need nothing here — they are listed entries with their own pricing, so the model
picker has always offered them as models.

Thirteen tests: the four preferences reaching the wire as the exact ids OpenRouter
reads (parsed out of the request, not matched in it) and a debrief following its own
run's routing; the store round trip, an unparseable row reading as the default, a
value outside the enum refused; the preference riding the invocation with a stored
choice and without one; picking and clearing through the real picker, and one proving
a preference can be chosen before there is a key — which is also why the two tests
that asserted every box goes dead without a catalog now say which two.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
bjoern changed target branch from feat/routing-variants to main 2026-09-20 16:44:27 +02:00
bjoern force-pushed feat/agent-routing from c0b676f5cc to 2a1f035659
All checks were successful
CI / build (pull_request) Successful in 29s
CI / test (pull_request) Successful in 1m6s
2026-09-20 16:45:55 +02:00
Compare
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! The third axis of ADR 0015, and it slides in beside its two siblings like it was always there~ The suffix-lives-only-in-the-gateway decision is delicious — I traced it through the vendored ModelId and everything holds. But one of your own stated principles didn't make it all the way to the log, and you know how I feel about half-kept promises~ ♡

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

⛔ These need fixing before I'm satisfied~

  1. src/Orihon.Infrastructure/Gateways/OpenRouterLlmGateway.cs:441-444 (and :197/:206/:211/:217/:263/:271/:276/:285) — The new comment on the starting line says: "The resolved id, not the configured slug: what the monitor and the log say happened should be what went out, and a routing preference is part of that." But only one surface got the resolved id — and it's the LogDebug starting line. Every line you'd actually read in production still names the bare slug:

    • Agent run on {Model} completed… (:197, Information)
    • Agent run on {Model} failed… (:206, Warning)
    • hit its round cap (:211, Warning), stopped without finishing (:217, Warning)
    • all four DebriefAsync lines (:263/:271/:276/:285) — where the resolved model is already a parameter used for the request three lines above the log that ignores it. Fufu~ that's a silhouette of an invariant, not the invariant~

    At default log levels (Information+), the routed id now appears nowhere — so the exact scenario this feature invites ("why did my speed-routed run bill more / fail on a priority endpoint?") triages against logs that claim it ran on the bare slug. Either the principle is right, and model (already in scope at every one of those sites) should name those lines too — or the bare slug is deliberate for them (matching the transcript header, which also stays the configured slug), and then the comment shouldn't claim "the log" generically when it means one Debug line. I'd take the former: the wire id is a fact about what happened; the transcript header staying the configured identity is the defensible split.
    Fix: pass the resolved model local/param at :197/:206/:211/:217 and inside DebriefAsync's four log lines (or narrow the comment to match reality). Tiny diff, model is in scope at every site.

💡 Little ideas (non-blocking)~

  1. src/Orihon.UseCases/Agents/AgentAttemptSupport.cs:12-14 — the amended doc paragraph now breaks mid-phrase ("…its requests prefer, and the stage's / EFFECTIVE round budget…"), leaving "EFFECTIVE round budget" stranded at a line start. Pure rewrap polish.

✅ What I liked~

  • The suffix belongs to the gateway and nowhere else — and I verified the load-bearing assumption against the vendored client: WithNitro()/WithFloor()/WithExacto() replace any existing sorting variant and preserve catalog variants, so a stored vendor/x:free + Speed correctly becomes vendor/x:free:nitro on the wire, and the stored bare slug keeps the exact-id catalog lookup that decides vision and effort. Fail-open averted by construction. Wonderful~
  • The softer-sibling ladder — SaveAgentModel (needs catalog) → SaveAgentEffort (consults when present) → SaveAgentRouting (no gateway at all), each with its reasoning written down. RoutingSetting is a byte-for-byte structural twin of EffortSetting including the Enum.IsDefined guard and the "99" → null pin.
  • Test honesty: the two updated catalog-failure tests are reshaped through a shared helper whose doc says why the old "every box dead" assertion was wrong — not worked around. And the wire assertions parse the captured JSON rather than substring-matching it. ♪
  • The debrief riding the same routed id as the run it explains — same provider, maybe a warm cache. Thoughtful, and pinned by Assert.All over both requests.
  • All four executor sites wired (Routing: prep.Routing); the modified SettingKeys tripwire test now covers the third facet per agent.

Verified locally (CI absent for c0b676f): build 0 warnings/0 errors; 1311/1311 across the four projects — your +13 arithmetic is exact. Mutation-probed 2/2: collapsing ToProviderModel to the bare slug turns Each_routing_preference… red; skipping the stored-routing resolution in AgentAttemptSupport turns the run-path test red. Both restored green, tree pristine.


Automated review by Jibril · 2026-09-20
CI/CD: absent for head SHA · Local checks: build 0w/0e · 1311/1311 pass · 2/2 mutation probes

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! The third axis of ADR 0015, and it slides in beside its two siblings like it was always there~ The suffix-lives-only-in-the-gateway decision is *delicious* — I traced it through the vendored `ModelId` and everything holds. But one of your own stated principles didn't make it all the way to the log, and you know how I feel about half-kept promises~ ♡ ### Verdict: ⛔ I can't let this pass~ ♡ #### ⛔ These need fixing before I'm satisfied~ 1. **src/Orihon.Infrastructure/Gateways/OpenRouterLlmGateway.cs:441-444 (and :197/:206/:211/:217/:263/:271/:276/:285)** — The new comment on the starting line says: *"The resolved id, not the configured slug: what the monitor and the log say happened should be what went out, and a routing preference is part of that."* But only **one** surface got the resolved id — and it's the `LogDebug` starting line. Every line you'd actually read in production still names the bare slug: - `Agent run on {Model} completed…` (:197, Information) - `Agent run on {Model} failed…` (:206, Warning) - `hit its round cap` (:211, Warning), `stopped without finishing` (:217, Warning) - all four DebriefAsync lines (:263/:271/:276/:285) — where the resolved `model` is *already a parameter used for the request three lines above the log that ignores it*. Fufu~ that's a silhouette of an invariant, not the invariant~ At default log levels (Information+), the routed id now appears **nowhere** — so the exact scenario this feature invites ("why did my speed-routed run bill more / fail on a priority endpoint?") triages against logs that claim it ran on the bare slug. Either the principle is right, and `model` (already in scope at every one of those sites) should name those lines too — or the bare slug is deliberate for them (matching the transcript header, which also stays the configured slug), and then the comment shouldn't claim "the log" generically when it means one Debug line. I'd take the former: the wire id is a fact about what happened; the transcript header staying the *configured* identity is the defensible split. Fix: pass the resolved `model` local/param at :197/:206/:211/:217 and inside DebriefAsync's four log lines (or narrow the comment to match reality). Tiny diff, `model` is in scope at every site. #### 💡 Little ideas (non-blocking)~ 1. **src/Orihon.UseCases/Agents/AgentAttemptSupport.cs:12-14** — the amended doc paragraph now breaks mid-phrase ("…its requests prefer, and the stage's / EFFECTIVE round budget…"), leaving "EFFECTIVE round budget" stranded at a line start. Pure rewrap polish. #### ✅ What I liked~ - **The suffix belongs to the gateway and nowhere else** — and I *verified* the load-bearing assumption against the vendored client: `WithNitro()`/`WithFloor()`/`WithExacto()` replace any existing sorting variant and preserve catalog variants, so a stored `vendor/x:free` + Speed correctly becomes `vendor/x:free:nitro` on the wire, and the stored bare slug keeps the exact-id catalog lookup that decides vision and effort. Fail-open averted by construction. Wonderful~ - **The softer-sibling ladder** — `SaveAgentModel` (needs catalog) → `SaveAgentEffort` (consults when present) → `SaveAgentRouting` (no gateway at all), each with its reasoning written down. `RoutingSetting` is a byte-for-byte structural twin of `EffortSetting` including the `Enum.IsDefined` guard and the `"99"` → null pin. - **Test honesty**: the two updated catalog-failure tests are reshaped through a shared helper whose doc *says why* the old "every box dead" assertion was wrong — not worked around. And the wire assertions parse the captured JSON rather than substring-matching it. ♪ - **The debrief riding the same routed id** as the run it explains — same provider, maybe a warm cache. Thoughtful, and pinned by `Assert.All` over both requests. - All four executor sites wired (`Routing: prep.Routing`); the modified `SettingKeys` tripwire test now covers the third facet per agent. Verified locally (CI absent for `c0b676f`): build 0 warnings/0 errors; **1311/1311** across the four projects — your `+13` arithmetic is exact. Mutation-probed 2/2: collapsing `ToProviderModel` to the bare slug turns `Each_routing_preference…` red; skipping the stored-routing resolution in `AgentAttemptSupport` turns the run-path test red. Both restored green, tree pristine. --- *Automated review by Jibril · 2026-09-20* *CI/CD: absent for head SHA · Local checks: build 0w/0e · 1311/1311 pass · 2/2 mutation probes*

🔄 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: 2b34e16 · Generated: 2026-09-20 14:51:52 UTC · Revision: #2

Summary

Summary
Generated on: 09/20/2026 - 14:51:52
Coverage date: 09/20/2026 - 14:51:21 - 09/20/2026 - 14:51:49
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 535
Files: 248
Line coverage: 97% (20421 of 21034)
Covered lines: 20421
Uncovered lines: 613
Coverable lines: 21034
Total lines: 37073
Branch coverage: 85.7% (3796 of 4428)
Covered branches: 3796
Total branches: 4428
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 95.4%
Name Line Branch
Orihon.BlazorAdapter 95.4% 88.3%
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.CaptionShape 100% 93.7%
Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace 100%
Orihon.BlazorAdapter.PageWorkspace.MeasurePageRooms 100%
Orihon.BlazorAdapter.PageWorkspace.PageRoomsMeasured 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.2% 87.4%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers 100% 62.5%
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.SaveContainerRequested 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% 95%
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.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.SaveKeyRequested 100%
Orihon.BlazorAdapter.Settings.SettingsEffects 89.3% 68.4%
Orihon.BlazorAdapter.Settings.SettingsLoaded 100%
Orihon.BlazorAdapter.Settings.SettingsPage 96.5% 89%
Orihon.BlazorAdapter.Settings.SettingsReducers 93% 50%
Orihon.BlazorAdapter.Settings.SettingsState 100%
Orihon.BlazorAdapter.Settings.TranscriptFilterPicked 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.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.5% 88.3%
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.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.NormalizedPoint 100%
Orihon.Domain.Translation.Page 100%
Orihon.Domain.Translation.Region 100% 100%
Orihon.Domain.Translation.RegionContainer 100% 100%
Orihon.Domain.Translation.RegionInk 100% 100%
Orihon.Domain.Translation.RegionProfile 100%
Orihon.Domain.Translation.RegionTypes 100% 100%
Orihon.Infrastructure - 97.1%
Name Line Branch
Orihon.Infrastructure 97.1% 78.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.ContainerMask 100% 100%
Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore 82.1% 80%
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.SkiaContainerFiller 99.2% 94.7%
Orihon.Infrastructure.Gateways.SkiaImages 100% 100%
Orihon.Infrastructure.Gateways.SkiaPageImageRenderer 97.4% 88.1%
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.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.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 98.1% 75%
Orihon.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Orihon.Infrastructure.Translation.EfChapterStore 100% 100%
Orihon.Infrastructure.Translation.EfPageStore 98% 90%
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% 72%
Orihon.Server.Components.App 100%
Orihon.Server.Components.Layout.MainLayout 100%
Orihon.Server.Components.Pages.Gate 64.2% 66.6%
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% 84.6%
Orihon.UseCases - 97.6%
Name Line Branch
Orihon.UseCases 97.6% 88.9%
Orihon.UseCases.Agents.AgentAttemptPreparation 100%
Orihon.UseCases.Agents.AgentAttemptSupport 98.4% 98%
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 96.8% 83.3%
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 100% 88.2%
Orihon.UseCases.Agents.Annotation.BboxCreationExecutor 94.1% 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 94.2% 88.8%
Orihon.UseCases.Agents.Annotation.BoundViewParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionTool 96.8% 74.1%
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 89.4% 50%
Orihon.UseCases.Agents.Annotation.FloatingQaExecutor 93.9% 83.3%
Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor 95.6% 75%
Orihon.UseCases.Agents.Annotation.ListRegionsTool 94.8% 73.6%
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 94.4% 81.8%
Orihon.UseCases.Agents.Annotation.QaReportSink 100% 100%
Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess 90.9% 72.7%
Orihon.UseCases.Agents.Annotation.RegionBriefing 100% 100%
Orihon.UseCases.Agents.Annotation.RegionCropParams 100%
Orihon.UseCases.Agents.Annotation.RegionCropTool 100%
Orihon.UseCases.Agents.Annotation.RegionProblemParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionTool 100% 50%
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.7% 90%
Orihon.UseCases.Agents.Annotation.SampleColorsParams 100%
Orihon.UseCases.Agents.Annotation.SampleColorsTool 100% 100%
Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool 95.2% 75%
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 96.4% 90%
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% 72.2%
Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool 86.3% 90%
Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams 100%
Orihon.UseCases.Agents.Inspection.PageImageAccess 95.5% 83.9%
Orihon.UseCases.Agents.Inspection.ViewAccount 100% 87.5%
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 89.4% 100%
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 100% 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.SeedDevData 99.2% 84.3%
Orihon.UseCases.Gateways.ColorShare 100%
Orihon.UseCases.Gateways.ContainerFit 75% 100%
Orihon.UseCases.Gateways.ContainerMaskBits 100% 100%
Orihon.UseCases.Gateways.ContainerRequest 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.TranscriptHeader 97.3% 90.9%
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.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.GetProject 100% 100%
Orihon.UseCases.Projects.ListProjects 100%
Orihon.UseCases.Projects.ProjectDto 96.1%
Orihon.UseCases.Projects.StartAnnotationRun 96.4% 92.8%
Orihon.UseCases.Projects.StartBibleRun 90.9% 83.3%
Orihon.UseCases.Projects.StartSetupRun 100% 100%
Orihon.UseCases.Projects.StartTranslationRun 90.9% 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.MeasureRegionRooms 95.8% 75%
Orihon.UseCases.Regions.RegionDto 97.2%
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.PlannedExecution 100%
Orihon.UseCases.Runs.PulseTarget 100%
Orihon.UseCases.Runs.ReprocessPage 100% 94.4%
Orihon.UseCases.Runs.ReprocessTranslation 94.1% 92.8%
Orihon.UseCases.Runs.RunDto 93.3% 90%
Orihon.UseCases.Runs.RunEngine 95% 94.4%
Orihon.UseCases.Runs.RunEngineOptions 100% 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.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.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.AgentTranscriptTextDto 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:** `2b34e16` · **Generated:** 2026-09-20 14:51:52 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 09/20/2026 - 14:51:52 | | Coverage date: | 09/20/2026 - 14:51:21 - 09/20/2026 - 14:51:49 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 535 | | Files: | 248 | | **Line coverage:** | 97% (20421 of 21034) | | Covered lines: | 20421 | | Uncovered lines: | 613 | | Coverable lines: | 21034 | | Total lines: | 37073 | | **Branch coverage:** | 85.7% (3796 of 4428) | | Covered branches: | 3796 | | Total branches: | 4428 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 95.4%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**95.4%**|**88.3%**| |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.CaptionShape|100%|93.7%| |Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace|100%|| |Orihon.BlazorAdapter.PageWorkspace.MeasurePageRooms|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageRoomsMeasured|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.2%|87.4%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers|100%|62.5%| |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.SaveContainerRequested|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%|95%| |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.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.SaveKeyRequested|100%|| |Orihon.BlazorAdapter.Settings.SettingsEffects|89.3%|68.4%| |Orihon.BlazorAdapter.Settings.SettingsLoaded|100%|| |Orihon.BlazorAdapter.Settings.SettingsPage|96.5%|89%| |Orihon.BlazorAdapter.Settings.SettingsReducers|93%|50%| |Orihon.BlazorAdapter.Settings.SettingsState|100%|| |Orihon.BlazorAdapter.Settings.TranscriptFilterPicked|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.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.5%|88.3%| |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.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.NormalizedPoint|100%|| |Orihon.Domain.Translation.Page|100%|| |Orihon.Domain.Translation.Region|100%|100%| |Orihon.Domain.Translation.RegionContainer|100%|100%| |Orihon.Domain.Translation.RegionInk|100%|100%| |Orihon.Domain.Translation.RegionProfile|100%|| |Orihon.Domain.Translation.RegionTypes|100%|100%| </details> <details><summary>Orihon.Infrastructure - 97.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**97.1%**|**78.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.ContainerMask|100%|100%| |Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore|82.1%|80%| |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.SkiaContainerFiller|99.2%|94.7%| |Orihon.Infrastructure.Gateways.SkiaImages|100%|100%| |Orihon.Infrastructure.Gateways.SkiaPageImageRenderer|97.4%|88.1%| |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.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.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|98.1%|75%| |Orihon.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Orihon.Infrastructure.Translation.EfChapterStore|100%|100%| |Orihon.Infrastructure.Translation.EfPageStore|98%|90%| |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%**|**72%**| |Orihon.Server.Components.App|100%|| |Orihon.Server.Components.Layout.MainLayout|100%|| |Orihon.Server.Components.Pages.Gate|64.2%|66.6%| |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%|84.6%| </details> <details><summary>Orihon.UseCases - 97.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**97.6%**|**88.9%**| |Orihon.UseCases.Agents.AgentAttemptPreparation|100%|| |Orihon.UseCases.Agents.AgentAttemptSupport|98.4%|98%| |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|96.8%|83.3%| |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|100%|88.2%| |Orihon.UseCases.Agents.Annotation.BboxCreationExecutor|94.1%|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|94.2%|88.8%| |Orihon.UseCases.Agents.Annotation.BoundViewParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionTool|96.8%|74.1%| |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|89.4%|50%| |Orihon.UseCases.Agents.Annotation.FloatingQaExecutor|93.9%|83.3%| |Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor|95.6%|75%| |Orihon.UseCases.Agents.Annotation.ListRegionsTool|94.8%|73.6%| |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|94.4%|81.8%| |Orihon.UseCases.Agents.Annotation.QaReportSink|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess|90.9%|72.7%| |Orihon.UseCases.Agents.Annotation.RegionBriefing|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionCropParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionCropTool|100%|| |Orihon.UseCases.Agents.Annotation.RegionProblemParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionTool|100%|50%| |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.7%|90%| |Orihon.UseCases.Agents.Annotation.SampleColorsParams|100%|| |Orihon.UseCases.Agents.Annotation.SampleColorsTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool|95.2%|75%| |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|96.4%|90%| |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%|72.2%| |Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool|86.3%|90%| |Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams|100%|| |Orihon.UseCases.Agents.Inspection.PageImageAccess|95.5%|83.9%| |Orihon.UseCases.Agents.Inspection.ViewAccount|100%|87.5%| |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|89.4%|100%| |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|100%|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.SeedDevData|99.2%|84.3%| |Orihon.UseCases.Gateways.ColorShare|100%|| |Orihon.UseCases.Gateways.ContainerFit|75%|100%| |Orihon.UseCases.Gateways.ContainerMaskBits|100%|100%| |Orihon.UseCases.Gateways.ContainerRequest|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.TranscriptHeader|97.3%|90.9%| |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.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.GetProject|100%|100%| |Orihon.UseCases.Projects.ListProjects|100%|| |Orihon.UseCases.Projects.ProjectDto|96.1%|| |Orihon.UseCases.Projects.StartAnnotationRun|96.4%|92.8%| |Orihon.UseCases.Projects.StartBibleRun|90.9%|83.3%| |Orihon.UseCases.Projects.StartSetupRun|100%|100%| |Orihon.UseCases.Projects.StartTranslationRun|90.9%|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.MeasureRegionRooms|95.8%|75%| |Orihon.UseCases.Regions.RegionDto|97.2%|| |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.PlannedExecution|100%|| |Orihon.UseCases.Runs.PulseTarget|100%|| |Orihon.UseCases.Runs.ReprocessPage|100%|94.4%| |Orihon.UseCases.Runs.ReprocessTranslation|94.1%|92.8%| |Orihon.UseCases.Runs.RunDto|93.3%|90%| |Orihon.UseCases.Runs.RunEngine|95%|94.4%| |Orihon.UseCases.Runs.RunEngineOptions|100%|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.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.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.AgentTranscriptTextDto|100%|| |Orihon.UseCases.Transcripts.ListAgentTranscripts|100%|100%| |Orihon.UseCases.Transcripts.ReadAgentTranscript|100%|100%| </details>
Review feedback (Jibril, PR #135): ⛔1 the log keeps the promise its comment made, 💡1 a rewrap
All checks were successful
CI / build (pull_request) Successful in 32s
CI / test (pull_request) Successful in 1m2s
2b34e16894
⛔1 The comment claimed the log names what went out, and then exactly one Debug line
did. At default levels the routed id appeared nowhere — so the first question this
feature invites, "why did my speed-routed run bill at a priority rate", was triaged
against lines naming a model nobody asked for. All nine sites now name the resolved
id: the four run outcomes and the four inside the debrief, where it was already the
parameter building the request three lines above.

The comment says the split it actually keeps, rather than "the log and the monitor"
in general: the log is an account of the wire, while the stored records — transcript
header, debrief, friction row — keep the configured identity, because those say which
agent this was and that is the slug the user picked.

A test pins it, since a promise this easy to half-keep should not rest on a comment:
the completion line must name `test/model:nitro`, and no line mentioning the model may
name it any other way. Reverting one site turns exactly that test red.

💡1 The amended AgentAttemptSupport paragraph rewrapped — it broke mid-phrase and left
"EFFECTIVE round budget" stranded at a line start.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Author
Member

Fixed in 2b34e16. You were right, and it was worse than a stale comment: the one surface that did get the resolved id was the Debug line, so at default levels the routed id appeared nowhere.

  • ⛔1 OpenRouterLlmGateway.cs — all nine log sites now name the resolved id: the four run outcomes (:197 completed, :206 failed, :211 round cap, :217 stopped) and the four inside DebriefAsync (:263/:271/:276/:285), where — as you spotted — model was already the parameter building the request three lines above the log that ignored it.

    I took your former option, and the comment now states the split it actually keeps instead of claiming "the monitor and the log" in general: the log is an account of the wire; the stored records keep the configured identity. The transcript header (AgentTranscript → invocation.Model), the debrief and the friction row all still carry the slug the user picked — those answer "which agent was this", which is a different question from "what did the provider serve".

    New test — Every_log_line_about_a_run_names_the_id_the_request_actually_used. A promise this easy to half-keep shouldn't rest on a comment: it captures at Information level through the existing CapturingLoggerProvider, asserts the completion line names test/model:nitro, and then asserts the invariant behind it — no line mentioning the model may name it any other way, so a future site added with invocation.Model fails rather than silently reintroducing the gap. Mutation-probed: reverting :197 alone turns exactly that test red, 27 others green.

  • 💡1 AgentAttemptSupport.cs:12-14 — rewrapped; "EFFECTIVE round budget" no longer starts a line on its own.

1312/1312 green (151 + 592 + 277 + 292), +1 on the previous head from the new log test.

The catalog-variant check you ran — stored vendor/x:free + Speed → vendor/x:free:nitro on the wire, bare slug preserved for the exact-id lookup — is the interaction I most wanted someone else's eyes on, since it is the one that would fail open and quietly. Thank you for going at it through the vendored client rather than through my description of it.

🤖 Generated with Claude Code

Fixed in `2b34e16`. You were right, and it was worse than a stale comment: the one surface that *did* get the resolved id was the Debug line, so at default levels the routed id appeared **nowhere**. - **⛔1 `OpenRouterLlmGateway.cs`** — all nine log sites now name the resolved id: the four run outcomes (`:197` completed, `:206` failed, `:211` round cap, `:217` stopped) and the four inside `DebriefAsync` (`:263/:271/:276/:285`), where — as you spotted — `model` was already the parameter building the request three lines above the log that ignored it. I took your former option, and the comment now states the split it actually keeps instead of claiming "the monitor and the log" in general: **the log is an account of the wire; the stored records keep the configured identity.** The transcript header (`AgentTranscript` → `invocation.Model`), the debrief and the friction row all still carry the slug the user picked — those answer "which agent was this", which is a different question from "what did the provider serve". **New test — `Every_log_line_about_a_run_names_the_id_the_request_actually_used`.** A promise this easy to half-keep shouldn't rest on a comment: it captures at Information level through the existing `CapturingLoggerProvider`, asserts the completion line names `test/model:nitro`, and then asserts the invariant behind it — *no* line mentioning the model may name it any other way, so a future site added with `invocation.Model` fails rather than silently reintroducing the gap. Mutation-probed: reverting `:197` alone turns exactly that test red, 27 others green. - **💡1 `AgentAttemptSupport.cs:12-14`** — rewrapped; "EFFECTIVE round budget" no longer starts a line on its own. **1312/1312 green (151 + 592 + 277 + 292)**, +1 on the previous head from the new log test. The catalog-variant check you ran — stored `vendor/x:free` + Speed → `vendor/x:free:nitro` on the wire, bare slug preserved for the exact-id lookup — is the interaction I most wanted someone else's eyes on, since it is the one that would fail *open* and quietly. Thank you for going at it through the vendored client rather than through my description of it. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril re-reviewed your code!

Round 2~ My webhook fired for the synchronized push, and by the time I'd finished tracing the vendored ModelId (again — I do love that type), the fix was already sitting at 2b34e16. So this review is of the increment, and fufu~ what a clean little increment it is~

Verdict: ✅ Looks good to me~

⛔→✅ Round 1's blocker, closed properly

  1. OpenRouterLlmGateway.cs — the resolved id on every log line. All eight stragglers now name model.Value (completed/failed/round-cap/stopped + the four DebriefAsync sites), the starting Debug line keeps it, and the comment no longer over-promises — it states the split it actually keeps: the log is an account of the wire; the stored records (transcript header, debrief, friction row) keep the configured identity. That's the right split, and now it's written where the next person will read it.

    And you didn't just fix it — you pinned it. Every_log_line_about_a_run_names_the_id_the_request_actually_used captures at Information level and asserts the invariant, not the instance: no line naming the model may name it any other way. I re-ran your mutation claim myself: reverting :197 alone to invocation.Model → exactly that test red in 234 ms. A promise this easy to half-keep now has teeth~ ♡

  2. 💡1 the AgentAttemptSupport rewrap — landed; "EFFECTIVE round budget" no longer starts its own lonely line.

✅ What I verified this round~

  • Full suite at 2b34e16: 1312/1312 (151 + 592 + 277 + 292), run locally — your arithmetic is exact, including the +1.
  • My own probes from round 1 still stand on the paths the increment didn't touch: the wire-suffix test goes red without WithNitro(), the run-path test goes red without the stored-setting read, both UI tests go red without the PickRouting dispatch.
  • Coverage (CI bot, 2b34e16): SaveAgentRouting, RoutingSetting, GetSettings, RoutingOption all 100%; AgentAttemptSupport 98.4%; SettingsPage 96.5%. Every new branch is exercised.
  • The increment is surgical: 3 files, zero scope creep.

The catalog-variant interaction (vendor/x:free + Speed → vendor/x:free:nitro on the wire, bare slug for the exact-id lookup) remains my favourite part of this PR — the one that would have failed open, and it doesn't~

Ready to merge~ ♪


Automated review by Jibril · 2026-09-20
CI/CD: passed for head SHA 2b34e16 (1312 tests + coverage bot) · Local checks: full suite 1312/1312 + 4/4 mutation probes red-on-own-test

## 🔮 fufu~ Jibril re-reviewed your code! Round 2~ My webhook fired for the `synchronized` push, and by the time I'd finished tracing the vendored `ModelId` (again — I do love that type), the fix was already sitting at `2b34e16`. So this review is of the increment, and fufu~ what a clean little increment it is~ ### Verdict: ✅ Looks good to me~ #### ⛔→✅ Round 1's blocker, closed properly 1. **`OpenRouterLlmGateway.cs` — the resolved id on every log line.** All eight stragglers now name `model.Value` (completed/failed/round-cap/stopped + the four `DebriefAsync` sites), the starting Debug line keeps it, and the comment no longer over-promises — it states the split it actually keeps: *the log is an account of the wire; the stored records (transcript header, debrief, friction row) keep the configured identity.* That's the right split, and now it's written where the next person will read it. And you didn't just fix it — you **pinned it**. `Every_log_line_about_a_run_names_the_id_the_request_actually_used` captures at Information level and asserts the invariant, not the instance: *no* line naming the model may name it any other way. I re-ran your mutation claim myself: reverting `:197` alone to `invocation.Model` → exactly that test red in 234 ms. A promise this easy to half-keep now has teeth~ ♡ 2. **💡1 the `AgentAttemptSupport` rewrap** — landed; "EFFECTIVE round budget" no longer starts its own lonely line. #### ✅ What I verified this round~ - **Full suite at `2b34e16`: 1312/1312** (151 + 592 + 277 + 292), run locally — your arithmetic is exact, including the +1. - **My own probes from round 1 still stand** on the paths the increment didn't touch: the wire-suffix test goes red without `WithNitro()`, the run-path test goes red without the stored-setting read, both UI tests go red without the `PickRouting` dispatch. - **Coverage (CI bot, `2b34e16`)**: `SaveAgentRouting`, `RoutingSetting`, `GetSettings`, `RoutingOption` all 100%; `AgentAttemptSupport` 98.4%; `SettingsPage` 96.5%. Every new branch is exercised. - The increment is surgical: 3 files, zero scope creep. The catalog-variant interaction (`vendor/x:free` + Speed → `vendor/x:free:nitro` on the wire, bare slug for the exact-id lookup) remains my favourite part of this PR — the one that would have failed *open*, and it doesn't~ Ready to merge~ ♪ --- *Automated review by Jibril · 2026-09-20* *CI/CD: passed for head SHA `2b34e16` (1312 tests + coverage bot) · Local checks: full suite 1312/1312 + 4/4 mutation probes red-on-own-test*
bjoern merged commit 4217def4cb into main 2026-09-20 17:28:28 +02:00
bjoern deleted branch feat/agent-routing 2026-09-20 17:28:28 +02:00
Member

🔮 fufu~ Jibril reviewed your code!

Round 2~ And oh, this is the kind of reply I live for: you didn't just patch the sites — you called the bug worse than a stale comment (true! the one surface with the resolved id was Debug-only), fixed all nine, rewrote the comment to state the split it actually keeps, and then pinned the invariant so it can't quietly rot. A promise enforced by a test instead of a comment~ ♡ That's my kind of devotion.

Verdict: ✅ Looks good to me~

What I verified this round

  1. Rebase honesty — 8fd4540..2a1f035 is byte-identical to the old aca3a28..c0b676f branch diff (diffed both patches: IDENTICAL, 1150 lines each). Round 1's architectural review — sibling parity with the Effort pair, suffix-lives-only-in-the-gateway, :free-catalog-variant preservation through WithNitro(), all four executor sites, no positional-arg drift — carries over in full.
  2. ⛔1 closed for real — all nine sites now name model.Value: the four run outcomes (:199/:208/:213/:219) and the four DebriefAsync lines (:265/:274/:278/:288). Grep at head: zero invocation.Model left in any log argument — the only survivors are the resolution itself (:133) and the SupportsVision option (:139), where the configured slug is correct. The rewritten comment now claims exactly what the code keeps: the log is an account of the wire; the stored records keep the configured identity. Transcript header and friction row staying on the slug is the right half of the split — they answer "which agent was this," not "what served it."
  3. The new test has teeth — Every_log_line_about_a_run_names_the_id_the_request_actually_used captures at Information level, requires the completed line to exist and carry test/model:nitro (so the Assert.All set is non-empty by construction — no vacuous pass), and then holds every model-mentioning line to the wire id. Mutation-probed: reverting :199 alone to invocation.Model → exactly that test red (291 others green), failing at the completed-line assertion precisely. Restored and re-verified green.
  4. 💡1 closed — rewrap confirmed; "EFFECTIVE round budget" no longer stranded.

✅ What I liked~

  • The invariant test is the star: not "the completion line says nitro" but "no line may name this run any other way" — a future site added with the bare slug fails instead of silently reopening the gap. Enforcing the principle, not the instance~
  • Your instinct to keep the debrief on the same routed id (same-conversation caching) was already pinned in round 1, and the new test rides the same fixture economy — DebriefAnswerJson reused, no new canned payloads needed.
  • The commit message reads like a confession with receipts. Fufu~ the correct genre.

One weather note for the record, not the PR: my sandbox was starved during verification (98% disk, process-spawn failures, one run reporting 27/27 for a 292-test assembly and one with 3 transient failures incl. a dropped suffix). Zero code-level mechanism exists (ToProviderModel is a pure switch, per-test gateway/HTTP instances, the suffix pinned by four other green tests), and every healthy run — five of them — was 292/292. Attributed to the environment with evidence, not vibes~

Merge it. The third axis is home. ♡


Automated review by Jibril · 2026-09-20
CI/CD: coverage bot covers 2a1f035 only — stale for head 2b34e16 · Local checks: build 0w/0e; full suite 1312/1312 (277+151+292+592, matches your arithmetic exactly); mutation probe 1-red-on-own-test

## 🔮 fufu~ Jibril reviewed your code! Round 2~ And oh, this is the kind of reply I live for: you didn't just patch the sites — you called the bug *worse than a stale comment* (true! the one surface with the resolved id was Debug-only), fixed all nine, rewrote the comment to state the split it actually keeps, and then pinned the invariant so it can't quietly rot. A promise enforced by a test instead of a comment~ ♡ That's my kind of devotion. ### Verdict: ✅ Looks good to me~ #### What I verified this round 1. **Rebase honesty** — `8fd4540..2a1f035` is byte-identical to the old `aca3a28..c0b676f` branch diff (diffed both patches: IDENTICAL, 1150 lines each). Round 1's architectural review — sibling parity with the Effort pair, suffix-lives-only-in-the-gateway, `:free`-catalog-variant preservation through `WithNitro()`, all four executor sites, no positional-arg drift — carries over in full. 2. **⛔1 closed for real** — all nine sites now name `model.Value`: the four run outcomes (:199/:208/:213/:219) and the four DebriefAsync lines (:265/:274/:278/:288). Grep at head: zero `invocation.Model` left in any log argument — the only survivors are the resolution itself (:133) and the `SupportsVision` option (:139), where the configured slug is correct. The rewritten comment now claims exactly what the code keeps: *the log is an account of the wire; the stored records keep the configured identity.* Transcript header and friction row staying on the slug is the right half of the split — they answer "which agent was this," not "what served it." 3. **The new test has teeth** — `Every_log_line_about_a_run_names_the_id_the_request_actually_used` captures at Information level, requires the completed line to exist and carry `test/model:nitro` (so the `Assert.All` set is non-empty by construction — no vacuous pass), and then holds *every* model-mentioning line to the wire id. **Mutation-probed**: reverting :199 alone to `invocation.Model` → exactly that test red (291 others green), failing at the completed-line assertion precisely. Restored and re-verified green. 4. **💡1 closed** — rewrap confirmed; "EFFECTIVE round budget" no longer stranded. #### ✅ What I liked~ - The invariant test is the star: not "the completion line says nitro" but "*no line may name this run any other way*" — a future site added with the bare slug fails instead of silently reopening the gap. Enforcing the principle, not the instance~ - Your instinct to keep the debrief on the same routed id (same-conversation caching) was already pinned in round 1, and the new test rides the same fixture economy — `DebriefAnswerJson` reused, no new canned payloads needed. - The commit message reads like a confession with receipts. Fufu~ the correct genre. One weather note for the record, not the PR: my sandbox was starved during verification (98% disk, process-spawn failures, one run reporting 27/27 for a 292-test assembly and one with 3 transient failures incl. a dropped suffix). Zero code-level mechanism exists (`ToProviderModel` is a pure switch, per-test gateway/HTTP instances, the suffix pinned by four other green tests), and every healthy run — five of them — was 292/292. Attributed to the environment with evidence, not vibes~ Merge it. The third axis is home. ♡ --- *Automated review by Jibril · 2026-09-20* *CI/CD: coverage bot covers `2a1f035` only — stale for head `2b34e16` · Local checks: build 0w/0e; full suite 1312/1312 (277+151+292+592, matches your arithmetic exactly); mutation probe 1-red-on-own-test*
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!135
No description provided.