feat: cleaning 7/12 — cleaning state, the plate, the write-path rules and the agent's tools, at 0 GPU #174

Merged
bjoern merged 33 commits from feat/cleaning-state-and-tools into main 2026-10-07 07:20:29 +02:00
Member

This is slice 7 of Phase 5 in PROJECT_PLAN.md: cleaning's state, the plate, every ADR 0027 write-path rule that needs no model call, and the survey, group and page-check agents with their tools. It is tested on fakes and is not yet runnable. The executor and Clean arrive in slice 8, and clean and recomposite in slice 11.

It is large: 33 commits, 142 files. It was built in three parts, A then B then C, followed by a review round and Jibril's ideas. The commits run in that order, so they read part by part.

What's in

Part A: state, annotation edits, the plate

  • The roster row. AgentKind.Cleaning has the slug cleaning; it is vision-required, runs at high effort, ships a starting model like the other rows and holds the ruling pair. AgentDescriptor gains a round budget per invocation kind: survey 30 + 2 per 3× tile, group 40, page check 15 + 1 per region.
  • The tables, in one migration (AddCleaningState): RegionCleanings, PageCleanings, CleaningEdits and CleaningViews, plus Regions.Version as the concurrency token. There are 13 verdicts: the rubric's 12 and invented_content.
  • Patches and the plate.
    • Patches are untagged RGBA PNGs under clean/<pageId>/patches/.
    • RebuildPlate runs only under the page's lock, inside write use cases. It blends the patches in acceptance order and cuts every kept and needs-text region's T + 3 from every patch.
    • It records each judged T's digest and marks one that a later rebuild changed.
    • It saves the staged region states in the plate's own save, all or nothing, and puts the old plate back if its key cannot be saved. An accept whose patch write fails partway deletes the patches it already wrote, and finalize settles its regions in one save.
    • /clean mirrors /raw, immutable under its plate key and no-cache with an ETag otherwise. /cleaning-view serves the stored view bytes.
  • Page operations. Page delete and move, their bulk forms and chapter delete carry the whole clean/<pageId> tree, calls included. They are refused while the page's Cleaning row runs or the runner holds a job for the page.
  • Annotation edits.
    • Region writes take the actor, the reason and the expected version, and write the CleaningEdit row in the same save.
    • The editor sends the version its edit is based on, carried across the human's own saves, and serialises saves per region. A write made underneath answers reload instead of overwriting.
    • SplitRegion writes in one save. A box the agent sets is never rough, and the agent never deletes a region.

Part B: the use cases, with every write-path rule that needs no model call

  • Invocations and views. Each invocation gets a minted id. The crop and compare use cases clamp frames by ADR 0016 (the window + 50 px, or a region's own window) and record every delivered image as a CleaningView row with its bytes.
  • The 16 MiB per-invocation image cap. A view that would pass it is refused, and the refusal names the view.
    • Survey batches fit 12 MiB of 3× tiles.
    • Coverage counts across all of the execution's survey invocations. The required test passes: a survey that wastes its views reaches full coverage through a further invocation.
  • The survey's coverage. finish_survey is refused until every floating, rough and flagged region's T has been seen at 3× or more with the grid, and the refusal names the pixels still unseen.
  • Accept at zoom. The result must have been shown beside the original over all of T, at 3× with the grid, in the same invocation, and the reading score must be 2 or more. The accept recomputes the fill and requires the digest the look recorded.
  • fill, accept, reject, undo, escalate and finalize follow ADR 0027's rules. With no clean in the grant, finalize leaves the pending regions awaiting the server.
  • Kept and needs-text regions are never written. The required test passes on the real adapters: flipping a call member to not-typeset restores its T byte for byte, while its neighbour stays erased.
  • Region edits keep the plate true. Delete, the not-typeset flip, cleared text and a change to embedded remove the patch. Every write that adds, moves or drops a kept box rebuilds the plate.

Part C: the agent

  • Three blueprints under AgentKind.Cleaning, each holding exactly its row of ADR 0027's grant table, without clean and recomposite. The harness adds report_friction, the ruling pair and the house rules.
  • The group binding. A group holds its call's regions, plus every region to be cleaned whose model rect meets the call's window, within the 3-region cap, each with its own window.
  • The agent's annotation edits go through four cleaning use cases: move, classify, split and add missed. Each checks the invocation's kind and binding, clamps a group's boxes to its window, and writes on the version the agent last read.
  • Kickoffs and briefs. The kickoffs carry the box flags, the gate's verdicts, the plan's notes and send-backs. The briefs carry ADR 0021's two label templates verbatim, the rubric on two axes against the original, the retry policy as text, and censor bars and mosaic kept as art. They give no advice for any particular model.

Decisions recorded in ADR 0027

ADR 0027 is amended where this slice settled something the ADR left open:

  • A difference tile does not count as "beside the original" for accept. It shows the change, not the result. A stretched compare counts.
  • The plate's untouched pixels hold by construction. A patch writes only inside its own rect, and the composer refuses one outside the page. A test pins the plate byte for byte outside every patch, instead of a runtime check against the blend that could never fail.
  • An agent's edit lands only on the region as the agent last read it. A region a human changed since is refused with "read it again", and a region no read has named is refused until one does.
  • A group that reached its image cap escalates its pending regions instead of leaving them awaiting the server, since the agent may not have looked at them.
  • A region that leaves cleaning's scope loses its applied result and is pending again should it come back.
  • A reorder or delete raced by a profile write starts again from the rows as they stand, since neither names a version.

Tests

3,020 green and 3 skipped, against 2,605 on main (+415). It was 3,017 at the first review, +3 in the review round:

Project Count Change
Domain 166 +22
UseCases 1,392 +335
Integration 1,165 +52
BlazorAdapter 297 +6

The skips are main's three opt-in tests. Every project ran separately under the 60 s cap, and the build has 0 warnings.

  • Every write-path rule above has its refusal pinned. One integration test drives all three grants on the real composition and SQLite.
  • The plate: byte-for-byte tests on grey and colour pages, for the cut of a kept region, a region added, a part split off and a kept box moved under a patch.
  • Mutation. One reviewer ran about 270 mutants against the write path; a second checked the slice against ADR 0027 line by line. Every surviving arm is now pinned, or deleted where nothing could observe it. The fix round killed each of its own mutants.

Browser-verified

I ran a fresh seeded world, driven with Playwright and typing key by key, on page 2's p2r1:

  • two quick edits, an English word then a form, both landed two versions on, with no conflict shown and "Saved";
  • a second session changed the form underneath. The first session's next edit answered "This region was changed since it was read — reload to see the change, then edit again", and nothing was written over the change;
  • Reload showed the stored form and dropped the unsaved words, and the next edit landed on the reloaded region, keeping its form.

The fix stage also checked the typeset flip and a form pick on a needs-text region in the browser.

Honest notes

  • Not runnable end to end yet. Slice 8 brings the executor, Clean, eligibility, the Cleaned view and the seed's cleaning content. AGENTS.md's "Not seeded" sentence says so.
  • The plate has a crash window. A process crash between writing clean/<pageId>.png and saving its new key leaves new bytes under the old key until the next rebuild. Closing it would mean naming the plate file by its key, which ADR 0027 does not allow today.
  • The ADR's "asserted on every plate write" became "holds by construction". That is the change listed above; ADR 0021 and the lab record still describe the prototype's assertion.
  • A flaky test from before this slice, AnnotationRunTests.A_hand_reprocess_still_reaches_the_transcriber_in_its_own_words. It failed once in about 25 full runs here, as it did around #169, and this branch changes only its fakes' setup. It is likely an unsynchronised list read in its fakes. I did not chase it here.
  • A page move replaces a leftover target tree. MoveCleaningAsync deletes a clean/<pageId> tree already at the target before moving. Only a move cut short can leave one there, since the paths are named by page id.
  • Three equivalent mutants are documented rather than pinned, because no test can tell them apart.

🤖 Generated with Claude Code

This is slice 7 of Phase 5 in `PROJECT_PLAN.md`: cleaning's state, the plate, every ADR 0027 write-path rule that needs no model call, and the survey, group and page-check agents with their tools. It is tested on fakes and is not yet runnable. The executor and Clean arrive in slice 8, and `clean` and `recomposite` in slice 11. It is large: 33 commits, 142 files. It was built in three parts, A then B then C, followed by a review round and Jibril's ideas. The commits run in that order, so they read part by part. ## What's in **Part A: state, annotation edits, the plate** - **The roster row.** `AgentKind.Cleaning` has the slug `cleaning`; it is vision-required, runs at high effort, ships a starting model like the other rows and holds the ruling pair. `AgentDescriptor` gains a round budget per invocation kind: survey 30 + 2 per 3× tile, group 40, page check 15 + 1 per region. - **The tables**, in one migration (`AddCleaningState`): `RegionCleanings`, `PageCleanings`, `CleaningEdits` and `CleaningViews`, plus `Regions.Version` as the concurrency token. There are 13 verdicts: the rubric's 12 and `invented_content`. - **Patches and the plate.** - Patches are untagged RGBA PNGs under `clean/<pageId>/patches/`. - `RebuildPlate` runs only under the page's lock, inside write use cases. It blends the patches in acceptance order and cuts every kept and needs-text region's T + 3 from every patch. - It records each judged T's digest and marks one that a later rebuild changed. - It saves the staged region states in the plate's own save, all or nothing, and puts the old plate back if its key cannot be saved. An accept whose patch write fails partway deletes the patches it already wrote, and finalize settles its regions in one save. - `/clean` mirrors `/raw`, immutable under its plate key and `no-cache` with an ETag otherwise. `/cleaning-view` serves the stored view bytes. - **Page operations.** Page delete and move, their bulk forms and chapter delete carry the whole `clean/<pageId>` tree, calls included. They are refused while the page's Cleaning row runs or the runner holds a job for the page. - **Annotation edits.** - Region writes take the actor, the reason and the expected version, and write the `CleaningEdit` row in the same save. - The editor sends the version its edit is based on, carried across the human's own saves, and serialises saves per region. A write made underneath answers **reload** instead of overwriting. - `SplitRegion` writes in one save. A box the agent sets is never rough, and the agent never deletes a region. **Part B: the use cases, with every write-path rule that needs no model call** - **Invocations and views.** Each invocation gets a minted id. The crop and compare use cases clamp frames by ADR 0016 (the window + 50 px, or a region's own window) and record every delivered image as a `CleaningView` row with its bytes. - **The 16 MiB per-invocation image cap.** A view that would pass it is refused, and the refusal names the view. - Survey batches fit 12 MiB of 3× tiles. - Coverage counts across all of the execution's survey invocations. The required test passes: a survey that wastes its views reaches full coverage through a further invocation. - **The survey's coverage.** `finish_survey` is refused until every floating, rough and flagged region's T has been seen at 3× or more with the grid, and the refusal names the pixels still unseen. - **Accept at zoom.** The result must have been shown beside the original over all of T, at 3× with the grid, in the same invocation, and the reading score must be 2 or more. The accept recomputes the fill and requires the digest the look recorded. - **`fill`, `accept`, `reject`, `undo`, `escalate` and `finalize`** follow ADR 0027's rules. With no `clean` in the grant, `finalize` leaves the pending regions awaiting the server. - **Kept and needs-text regions are never written.** The required test passes on the real adapters: flipping a call member to not-typeset restores its T byte for byte, while its neighbour stays erased. - **Region edits keep the plate true.** Delete, the not-typeset flip, cleared text and a change to embedded remove the patch. Every write that adds, moves or drops a kept box rebuilds the plate. **Part C: the agent** - **Three blueprints** under `AgentKind.Cleaning`, each holding exactly its row of ADR 0027's grant table, without `clean` and `recomposite`. The harness adds `report_friction`, the ruling pair and the house rules. - **The group binding.** A group holds its call's regions, plus every region to be cleaned whose model rect meets the call's window, within the 3-region cap, each with its own window. - **The agent's annotation edits** go through four cleaning use cases: move, classify, split and add missed. Each checks the invocation's kind and binding, clamps a group's boxes to its window, and writes on the version the agent last read. - **Kickoffs and briefs.** The kickoffs carry the box flags, the gate's verdicts, the plan's notes and send-backs. The briefs carry ADR 0021's two label templates verbatim, the rubric on two axes against the original, the retry policy as text, and censor bars and mosaic kept as art. They give no advice for any particular model. ## Decisions recorded in ADR 0027 ADR 0027 is amended where this slice settled something the ADR left open: - **A difference tile does not count as "beside the original" for accept.** It shows the change, not the result. A stretched compare counts. - **The plate's untouched pixels hold by construction.** A patch writes only inside its own rect, and the composer refuses one outside the page. A test pins the plate byte for byte outside every patch, instead of a runtime check against the blend that could never fail. - **An agent's edit lands only on the region as the agent last read it.** A region a human changed since is refused with "read it again", and a region no read has named is refused until one does. - **A group that reached its image cap escalates its pending regions** instead of leaving them awaiting the server, since the agent may not have looked at them. - **A region that leaves cleaning's scope** loses its applied result and is pending again should it come back. - **A reorder or delete raced by a profile write** starts again from the rows as they stand, since neither names a version. ## Tests 3,020 green and 3 skipped, against 2,605 on main (+415). It was 3,017 at the first review, +3 in the review round: | Project | Count | Change | |---|---|---| | Domain | 166 | +22 | | UseCases | 1,392 | +335 | | Integration | 1,165 | +52 | | BlazorAdapter | 297 | +6 | The skips are main's three opt-in tests. Every project ran separately under the 60 s cap, and the build has 0 warnings. - **Every write-path rule above has its refusal pinned.** One integration test drives all three grants on the real composition and SQLite. - **The plate:** byte-for-byte tests on grey and colour pages, for the cut of a kept region, a region added, a part split off and a kept box moved under a patch. - **Mutation.** One reviewer ran about 270 mutants against the write path; a second checked the slice against ADR 0027 line by line. Every surviving arm is now pinned, or deleted where nothing could observe it. The fix round killed each of its own mutants. ## Browser-verified I ran a fresh seeded world, driven with Playwright and typing key by key, on page 2's p2r1: - two quick edits, an English word then a form, both landed two versions on, with no conflict shown and "Saved"; - a second session changed the form underneath. The first session's next edit answered "This region was changed since it was read — reload to see the change, then edit again", and nothing was written over the change; - Reload showed the stored form and dropped the unsaved words, and the next edit landed on the reloaded region, keeping its form. The fix stage also checked the typeset flip and a form pick on a needs-text region in the browser. ## Honest notes - **Not runnable end to end yet.** Slice 8 brings the executor, Clean, eligibility, the Cleaned view and the seed's cleaning content. AGENTS.md's "Not seeded" sentence says so. - **The plate has a crash window.** A process crash between writing `clean/<pageId>.png` and saving its new key leaves new bytes under the old key until the next rebuild. Closing it would mean naming the plate file by its key, which ADR 0027 does not allow today. - **The ADR's "asserted on every plate write" became "holds by construction".** That is the change listed above; ADR 0021 and the lab record still describe the prototype's assertion. - **A flaky test from before this slice,** `AnnotationRunTests.A_hand_reprocess_still_reaches_the_transcriber_in_its_own_words`. It failed once in about 25 full runs here, as it did around #169, and this branch changes only its fakes' setup. It is likely an unsynchronised list read in its fakes. I did not chase it here. - **A page move replaces a leftover target tree.** `MoveCleaningAsync` deletes a `clean/<pageId>` tree already at the target before moving. Only a move cut short can leave one there, since the paths are named by page id. - **Three equivalent mutants are documented** rather than pinned, because no test can tell them apart. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
AgentKind.Cleaning joins the roster under the stored slug `cleaning`:
vision-required, high effort, and a starting model like every other row.
Its attempt runs a survey, groups and a page check, so AgentDescriptor
gains a budget per invocation kind with per-tile and per-region shares:
the survey 30 + 2 per 3x tile, a group 40, the page check 15 + 1 per
region (ADR 0027). Cleaning holds the ruling pair like every
policy-bearing stage.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
RegionCleaning (1:1 with a region: status, the applied result, every
judgement, model attempts, next seed, sticky clauses, escalation reason),
PageCleaning (1:1 with a page: plate key, planned calls with their
budget, region-set fingerprint), CleaningEdit (one row per annotation
edit: who, what changed, why) and CleaningView (one row per delivered
image: invocation, regions and tiles shown, frame, scale, grid, file),
in one migration with Region.Version, the EF Core concurrency token every
profile write counts. The verdicts are the rubric's twelve plus
invented_content.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Region-store writes take the actor, the reason, the expected version and
the edit row, written in the same save (ADR 0027):
- a write naming a version lands only on a region still at it, through
  Region.Version as EF Core's concurrency token; a
  DbUpdateConcurrencyException answers "reload" and drops the write
  whole, so a circuit's long-lived context never tries it again;
- every write starts from the rows as stored, since a circuit's context
  hands back the copies it tracked on earlier writes unrefreshed;
- the cleaning agent says why, and its edit is a CleaningEdit row; a box
  it adds is measured and classified, never rough; it never deletes;
- SplitRegion cuts a region into parts in one save: the region keeps the
  first part and its text, the parts follow it with no text, so they
  need text before cleaning erases anything.

The annotation and translation passes write as before, with no version
and no edit row.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The editor names the version its buffer was read at. The save effect
runs one region's saves one at a time and carries that version across
the human's own saves, so two quick edits never conflict with each
other, while a write made underneath answers "reload" instead of being
written over. Reload drops the edit that met the change and adopts the
region as it now stands; no other load replaces the buffer, so a stale
edit is never passed off as one based on the newer version.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Patches and the plate, as ADR 0027's "State and pixels" says:
- a patch is an untagged RGBA PNG of a result's pixels and the alpha
  they blend through, kept under clean/<pageId>/patches/;
- RebuildPlate is the one way a plate is written: under the page's lock,
  from the stored patches in acceptance order, each blended as Pillow's
  Image.composite pastes, with every kept and needs-text region's T + 3
  cut from every patch; lossless, upright and untagged, L when every
  decoded pixel is grey and RGB otherwise, as clean/<pageId>.png under a
  fresh plate key;
- every rebuild refuses a plate whose pixels outside the footprints are
  not the page's own, records what was judged on first sight, and notes
  a judged region whose pixels over T changed since;
- /clean mirrors /raw, cached for good only under its plate key and
  revalidated by it otherwise; /cleaning-view serves a view's stored
  bytes.

Page delete and move, their bulk forms and chapter delete carry the
whole clean/<pageId> tree, calls included, hold the pages' locks while
they do, and are refused while the page's Cleaning row runs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ADR 0027 states the editor's version precisely (the version its edit is
based on, carried across the human's own saves), that a split view is a
row per image, that PageCleaning keeps the call budget fixed at
planning, that the plate's decoded mode is L where every pixel is grey,
and that the plate key changes with every write. AGENTS.md's "Not
seeded" sentence names the cleaning state nothing seeds yet. The region
scope helpers get their own tests.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A fill's patch blends through the pixels the fill paints, not its whole
T + 6, so accepting it never writes the page's own pixels back over an
earlier accept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The write use cases hand the rebuild the region states they changed. They
stand in for the stored ones and are saved in the plate's own save, so a
write whose plate is refused leaves no state behind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An invocation is minted by the harness, bound as ADR 0016 binds a tool, and
keeps the tally of image bytes it was shown against the 16 MiB cap. The crop
and the compare frame under the window clamp, refuse a view that would pass
the cap and name it, and record every delivered image with its bytes on
disk and the digest of each result it showed. The survey counts its looks
at 3x with the grid across the execution, plans its batches within 12 MiB
of tiles, and finishes only with its batch covered or its cap reached.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every rule that needs no model call sits in the use case. fill shows its
would-be result at 3x beside the original as a recorded look and writes
nothing; measure_ink reads the ink facts and measures a fill against the
whole page. accept is refused for a kept or needs-text region, below a
reading score of 2, or unless that very result was seen beside the
original over all of T at 3x with the grid in the group; it stores the
patch through the fill's own alpha and saves the state with the plate.
Rejecting an applied result needs a reading of 1 or below or the human's
send-back, undo takes back only the group's own accept, and finalize
leaves pending regions awaiting the server, or escalates them at the cap.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The region use cases now call the cleaning write path. A delete, a flip to
not typeset, cleared text or a change to embedded removes the region's
patch and rebuilds a plated page under its lock, so the region's T + 3 is
the page's own again even where a neighbour's patch covered it. The edit
has landed by then, so a plate that cannot be rebuilt is logged and left
for the next rebuild.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A difference tile never counts as the result seen beside the original; the
survey covers the regions the stage cleans, on the page as scanned; how
batches weigh their tiles and when an invocation has reached its cap; the
group's margin; a fill's alpha; the region writes that rebuild the plate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A group's binding is its call's regions, plus every region to be cleaned,
neither kept nor needing text, whose model rect meets the call's window,
joining in reading order while the call has room under its region cap.
Each region carries its own window: the call member's from the plan, a
joiner's from the planner's window for it alone. A region with no form has
no model rect and joins nothing. The group invocation is minted from the
binding.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
view_page renders the whole page at reading size, as scanned or as it
stands, for the survey and the page check; it stays on the re-encoded path
and is not recorded, but counts against the invocation's image cap like a
recorded view. cleaning_status reads where each region the invocation
reaches stands: scope, status, the applied result and whether this
invocation accepted it, whether it is stale, the send-back and the
judgements, with the images shown so far.

The agent's annotation edits go through the region use cases on the
version just read, with its reason: the survey moves, resizes and
reclassifies any region, splits one and adds a missed one; a group moves
and reclassifies its own, its boxes cut back to its window and the margin
round it; the page check edits nothing. A box the agent sets is measured,
so no longer rough.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The cleaning agent's three invocations are blueprints under
AgentKind.Cleaning, each holding exactly its row of ADR 0027's grant
table, bound to its invocation; a group holds no clean or recomposite
while no model call can run. The harness adds report_friction and the
ruling pair as for every agent, and each ending — finish_survey,
finalize, finish_page — lands in a CleaningFinish the harness reads.

The tools only map labels and pixel boxes onto the cleaning use cases and
answer in words: every view states its frame, scale and each image's
tiles, and sends its images as their own bytes. The survey's measure_ink
reads ink facts; a group's also measures its fills.

The briefs carry ADR 0021's two label templates, the rubric on two axes
against the original, the retry policy as text and censor bars kept as
art, with no advice for any particular model.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The survey's kickoff names its batch, each box with its reasons, its
flags, the box they suggest, a frame to look at it in and the pixels
still unseen. A group's names each of its regions with its form, box, own
window, status, the fill gate's verdict, its flags and any send-back, the
plan's notes, and that what the fill cannot clean is left awaiting the
server. The page check's names where every region stands, and every
accepted result a later footprint overlapped or a rebuild changed, to
compare. The harness wraps each in the house rules and any send-back.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Joiners bind in reading order within the region cap, which holds the rect
cap; a box the agent sets is measured, cut back to a group's reach and
written on the version it read. The grant rows differ where the
invocations' jobs do; view_page counts against the image cap; each
invocation ends into a record the harness reads; the kickoffs carry what
the tools cannot show; the retry policy reaches a group as text; and each
rubric axis scores 0 to 3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The views' tiles name their own positions, a blank label is refused like a
missing one, a frame named by a blank region and an own window takes the
own window, the status reads a model result, a region awaiting the server
and an escalation since re-opened, measure_ink reads the lettering's own
box, and a group's kickoff names only its own regions. A form is refused
unless it is one RegionForm defines, which already covers 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every instruction line of the three briefs was deleted in turn, and each
deletion fails a test; the two order-of-work headings were the last lines
no assertion quoted.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
On the real composition and SQLite, a survey crops its rough bubble at 3x
as passed-through PNG bytes, looks at the page, and finishes once covered,
every image counted against its cap; a group fills, accepts, reads its
status and finalizes; and the page check sees the page as it stands,
compares it with the original and gives its account.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test(cleaning): the edit tests' summary says which version an edit lands on
All checks were successful
CI / build (pull_request) Successful in 37s
CI / test (pull_request) Successful in 1m27s
fe0f4469b8
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

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

Commit: cda9464 · Generated: 2026-10-07 04:43:50 UTC · Revision: #2

Summary

Summary
Generated on: 10/07/2026 - 04:43:50
Coverage date: 10/07/2026 - 04:43:03 - 10/07/2026 - 04:43:46
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 847
Files: 369
Line coverage: 96.2% (34465 of 35823)
Covered lines: 34465
Uncovered lines: 1358
Coverable lines: 35823
Total lines: 59037
Branch coverage: 87.1% (8453 of 9704)
Covered branches: 8453
Total branches: 9704
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 95.9%
Name Line Branch
Orihon.BlazorAdapter 95.9% 89.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.CreateRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace 100%
Orihon.BlazorAdapter.PageWorkspace.PageStepsLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved 100%
Orihon.BlazorAdapter.PageWorkspace.PageViewport 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage 94.3% 88.1%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers 100% 64.2%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState 100%
Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed 100%
Orihon.BlazorAdapter.PageWorkspace.RegionColorsSampled 100%
Orihon.BlazorAdapter.PageWorkspace.RegionCreated 100%
Orihon.BlazorAdapter.PageWorkspace.RegionSaved 100%
Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SampleRegionColorsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested 100%
Orihon.BlazorAdapter.Projects.CreateProjectRequested 100%
Orihon.BlazorAdapter.Projects.DecideSetupContinuation 100%
Orihon.BlazorAdapter.Projects.DeleteProjectRequested 100%
Orihon.BlazorAdapter.Projects.FinishSetupRequested 100%
Orihon.BlazorAdapter.Projects.ImportPagesRequested 100%
Orihon.BlazorAdapter.Projects.LoadWizard 100%
Orihon.BlazorAdapter.Projects.PageOrganizer 96% 95%
Orihon.BlazorAdapter.Projects.PagesImported 100%
Orihon.BlazorAdapter.Projects.ProjectDeleteFailed 100%
Orihon.BlazorAdapter.Projects.ProjectListEffects 100% 100%
Orihon.BlazorAdapter.Projects.ProjectListPage 89.7% 91.6%
Orihon.BlazorAdapter.Projects.ProjectListReducers 100%
Orihon.BlazorAdapter.Projects.ProjectListState 100%
Orihon.BlazorAdapter.Projects.ProjectsLoaded 100%
Orihon.BlazorAdapter.Projects.ProjectWizardEffects 93.8% 90%
Orihon.BlazorAdapter.Projects.ProjectWizardPage 95.3% 84.1%
Orihon.BlazorAdapter.Projects.ProjectWizardReducers 100%
Orihon.BlazorAdapter.Projects.ProjectWizardState 100%
Orihon.BlazorAdapter.Projects.SetupChat 93.5% 100%
Orihon.BlazorAdapter.Projects.SetupChatEffects 100% 100%
Orihon.BlazorAdapter.Projects.SetupChatFailed 100%
Orihon.BlazorAdapter.Projects.SetupChatReducers 100%
Orihon.BlazorAdapter.Projects.SetupChatState 100%
Orihon.BlazorAdapter.Projects.SetupChatUpdated 100%
Orihon.BlazorAdapter.Projects.StartSetupChat 100%
Orihon.BlazorAdapter.Projects.SubmitSetupAnswer 100%
Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardLoaded 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested 100%
Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardWriteFailed 100%
Orihon.BlazorAdapter.Rulings.AcceptProposalRequested 100%
Orihon.BlazorAdapter.Rulings.AnsweredRuling 100%
Orihon.BlazorAdapter.Rulings.AnswerRulingRequested 100%
Orihon.BlazorAdapter.Rulings.DeclineProposalRequested 100%
Orihon.BlazorAdapter.Rulings.DismissRulingRequested 100%
Orihon.BlazorAdapter.Rulings.RulingBar 98.2% 94.6%
Orihon.BlazorAdapter.Rulings.RulingDeskBridge 94.2% 91.6%
Orihon.BlazorAdapter.Rulings.RulingsEffects 95.4% 83.3%
Orihon.BlazorAdapter.Rulings.RulingsLoaded 100%
Orihon.BlazorAdapter.Rulings.RulingsReducers 100%
Orihon.BlazorAdapter.Rulings.RulingsState 100%
Orihon.BlazorAdapter.Rulings.RulingWriteFailed 100%
Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested 100%
Orihon.BlazorAdapter.Runs.CancelMonitorRun 100%
Orihon.BlazorAdapter.Runs.MonitorPageRef 100%
Orihon.BlazorAdapter.Runs.MonitorRunLoaded 100%
Orihon.BlazorAdapter.Runs.RetryMonitorExecution 100%
Orihon.BlazorAdapter.Runs.RunChangedBridge 95% 92.8%
Orihon.BlazorAdapter.Runs.RunMonitor 98.1% 96.9%
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.CleaningInFlightPicked 100%
Orihon.BlazorAdapter.Settings.CleaningInFlightSaveFailed 100%
Orihon.BlazorAdapter.Settings.CleaningResumed 100%
Orihon.BlazorAdapter.Settings.CleaningRunnerLoaded 100%
Orihon.BlazorAdapter.Settings.CleaningServerChecked 100%
Orihon.BlazorAdapter.Settings.CleaningServerSaved 100%
Orihon.BlazorAdapter.Settings.CleaningServerSaveFailed 100%
Orihon.BlazorAdapter.Settings.EffortOption 100% 100%
Orihon.BlazorAdapter.Settings.FloatingPassToggled 100%
Orihon.BlazorAdapter.Settings.KeySaved 100%
Orihon.BlazorAdapter.Settings.KeySaveFailed 100%
Orihon.BlazorAdapter.Settings.ModelOptionsLoaded 100%
Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable 100%
Orihon.BlazorAdapter.Settings.ResumeCleaningFailed 100%
Orihon.BlazorAdapter.Settings.RoutingOption 100% 100%
Orihon.BlazorAdapter.Settings.RunConcurrencyPicked 100%
Orihon.BlazorAdapter.Settings.RunConcurrencySaveFailed 100%
Orihon.BlazorAdapter.Settings.SaveCleaningServerRequested 100%
Orihon.BlazorAdapter.Settings.SaveKeyRequested 100%
Orihon.BlazorAdapter.Settings.SettingsEffects 92.5% 83.3%
Orihon.BlazorAdapter.Settings.SettingsLoaded 100%
Orihon.BlazorAdapter.Settings.SettingsPage 97.7% 91.6%
Orihon.BlazorAdapter.Settings.SettingsReducers 96.1% 64.2%
Orihon.BlazorAdapter.Settings.SettingsState 100%
Orihon.BlazorAdapter.Settings.TranscriptFilterPicked 100%
Orihon.BlazorAdapter.Settings.TranscriptPagePicked 100%
Orihon.BlazorAdapter.Settings.TranscriptPicked 100%
Orihon.BlazorAdapter.Settings.TranscriptTextLoaded 100%
Orihon.BlazorAdapter.Settings.TranscriptTextLoadFailed 100%
Orihon.BlazorAdapter.Uploads.UploadTransfer 96.5% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferProgress 100% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferResult 100%
Orihon.BlazorAdapter.Workspace.CreateChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeletePageRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.FloatingPassAnswered 100%
Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace 100%
Orihon.BlazorAdapter.Workspace.MovePageRequested 100%
Orihon.BlazorAdapter.Workspace.ProjectMetadataCard 95.6% 92.8%
Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage 95.7% 87.9%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers 100% 62.5%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState 100%
Orihon.BlazorAdapter.Workspace.RenameChapterRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderPagesRequested 100%
Orihon.BlazorAdapter.Workspace.RunAnnotationRequested 100%
Orihon.BlazorAdapter.Workspace.RunBibleRequested 100%
Orihon.BlazorAdapter.Workspace.RunFloatingPassRequested 100%
Orihon.BlazorAdapter.Workspace.RunTranslationRequested 100%
Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested 100%
Orihon.BlazorAdapter.Workspace.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.SetPageKindRequested 100%
Orihon.BlazorAdapter.Workspace.SummaryDeleted 100%
Orihon.BlazorAdapter.Workspace.SummarySaved 100%
Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested 100%
Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed 100%
Orihon.Domain - 100%
Name Line Branch
Orihon.Domain 100% 100%
Orihon.Domain.Agents.AgentDebrief 100% 100%
Orihon.Domain.Agents.AgentDescriptor 100% 100%
Orihon.Domain.Agents.AgentFeedback 100% 100%
Orihon.Domain.Agents.AgentRoster 100% 100%
Orihon.Domain.Agents.InvocationBudget 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.Cleaning.AppliedResult 100%
Orihon.Domain.Cleaning.CleaningBasis 100%
Orihon.Domain.Cleaning.CleaningCall 100% 100%
Orihon.Domain.Cleaning.CleaningCallRect 100%
Orihon.Domain.Cleaning.CleaningCanvas 100%
Orihon.Domain.Cleaning.CleaningClause 100%
Orihon.Domain.Cleaning.CleaningEdit 100% 100%
Orihon.Domain.Cleaning.CleaningJudgement 100%
Orihon.Domain.Cleaning.CleaningOutput 100% 100%
Orihon.Domain.Cleaning.CleaningOverrides 100%
Orihon.Domain.Cleaning.CleaningServerIdentity 100%
Orihon.Domain.Cleaning.CleaningServerState 100% 100%
Orihon.Domain.Cleaning.CleaningVerdicts 100% 100%
Orihon.Domain.Cleaning.CleaningViewRecord 100% 100%
Orihon.Domain.Cleaning.CleaningWindow 100%
Orihon.Domain.Cleaning.EditedRegion 100%
Orihon.Domain.Cleaning.PageBox 100% 100%
Orihon.Domain.Cleaning.PageCleaning 100% 100%
Orihon.Domain.Cleaning.PlannedCleaningCall 100%
Orihon.Domain.Cleaning.RegionCleaning 100% 100%
Orihon.Domain.Cleaning.RegionShape 100%
Orihon.Domain.Cleaning.ResultSource 100% 100%
Orihon.Domain.Cleaning.ViewTile 100%
Orihon.Domain.Projects.Project 100% 100%
Orihon.Domain.Projects.ProjectProfile 100%
Orihon.Domain.Runs.Execution 100% 100%
Orihon.Domain.Runs.RegionProblem 100%
Orihon.Domain.Runs.Run 100%
Orihon.Domain.Settings.AppSetting 100%
Orihon.Domain.Text 100% 100%
Orihon.Domain.Translation.BoundingBox 100% 100%
Orihon.Domain.Translation.Chapter 100%
Orihon.Domain.Translation.InkColor 100% 100%
Orihon.Domain.Translation.Page 100%
Orihon.Domain.Translation.Region 100% 100%
Orihon.Domain.Translation.RegionInk 100% 100%
Orihon.Domain.Translation.RegionProfile 100%
Orihon.Infrastructure - 97.8%
Name Line Branch
Orihon.Infrastructure 97.8% 86.4%
Orihon.Infrastructure.Agents.EfAgentDebriefStore 100%
Orihon.Infrastructure.Agents.EfAgentFeedbackStore 100%
Orihon.Infrastructure.Bible.EfBibleStore 95.2% 92.8%
Orihon.Infrastructure.Cleaning.EfCleaningCallStore 98.6% 100%
Orihon.Infrastructure.Cleaning.EfCleaningStateStore 100% 100%
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.Cleaning.BoxChecks 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.DerivedInk 100%
Orihon.Infrastructure.Gateways.Cleaning.EdgeMetrics 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.FillResult 100%
Orihon.Infrastructure.Gateways.Cleaning.GateStats 100%
Orihon.Infrastructure.Gateways.Cleaning.GreyRule 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.LabFill 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.LabGeometry 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.LabInk 100% 98.3%
Orihon.Infrastructure.Gateways.Cleaning.LabMetrics 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.LabPaper 100% 97.3%
Orihon.Infrastructure.Gateways.Cleaning.LabReadings 100%
Orihon.Infrastructure.Gateways.Cleaning.PageRects 100%
Orihon.Infrastructure.Gateways.Cleaning.PaperComponent 100%
Orihon.Infrastructure.Gateways.Cleaning.PatchPixels 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.RasterCleaningImages 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.RasterCleaningMetrics 100% 97.3%
Orihon.Infrastructure.Gateways.Cleaning.RasterCleaningViews 99.4% 98.3%
Orihon.Infrastructure.Gateways.Cleaning.RasterInkAnalyzer 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.RasterPlateComposer 100% 100%
Orihon.Infrastructure.Gateways.Cleaning.Rgb 100%
Orihon.Infrastructure.Gateways.Cleaning.ViewTiling 100% 100%
Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore 85.2% 80.8%
Orihon.Infrastructure.Gateways.HttpWebPageFetcher 95.1% 83.3%
Orihon.Infrastructure.Gateways.LabelFont 100% 50%
Orihon.Infrastructure.Gateways.OpenRouterLlmGateway 90.2% 82.1%
Orihon.Infrastructure.Gateways.QwenImageServerGateway 96.7% 90%
Orihon.Infrastructure.Gateways.QwenImageServerJson 96% 72.3%
Orihon.Infrastructure.Gateways.Raster.FloatImage 77.7% 50%
Orihon.Infrastructure.Gateways.Raster.GrayImage 95.8% 75%
Orihon.Infrastructure.Gateways.Raster.Labels 100% 100%
Orihon.Infrastructure.Gateways.Raster.Mask 99.1% 98.5%
Orihon.Infrastructure.Gateways.Raster.NumpyMath 93.9% 93.4%
Orihon.Infrastructure.Gateways.Raster.PillowBlur 98.4% 89.4%
Orihon.Infrastructure.Gateways.Raster.PillowLanczos 100% 100%
Orihon.Infrastructure.Gateways.Raster.PixelBox 100% 100%
Orihon.Infrastructure.Gateways.Raster.RgbImage 96.4% 75%
Orihon.Infrastructure.Gateways.Raster.ScipyGaussian 100% 100%
Orihon.Infrastructure.Gateways.SkiaImages 100% 100%
Orihon.Infrastructure.Gateways.SkiaPageImageRenderer 97.4% 90.8%
Orihon.Infrastructure.Gateways.SkiaPixelDigest 100% 100%
Orihon.Infrastructure.Gateways.SkiaRegionColorSampler 100% 100%
Orihon.Infrastructure.Gateways.UntaggedPng 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.CleaningCallConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.CleaningEditConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.CleaningOutputConfiguratio
n
100%
Orihon.Infrastructure.Persistence.Configurations.CleaningServerStateConfigu
ration
100%
Orihon.Infrastructure.Persistence.Configurations.CleaningViewConfiguration 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.PageCleaningConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RegionCleaningConfiguratio
n
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.AddCleaningCallRunner 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddCleaningState 99.1%
Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddHouseRules 99.6%
Orihon.Infrastructure.Persistence.Migrations.AddPagePassFacts 99%
Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddRegionFitBoxDropFillHints 98.1%
Orihon.Infrastructure.Persistence.Migrations.AddRegionForm 99.4%
Orihon.Infrastructure.Persistence.Migrations.AddRegionInk 99.4%
Orihon.Infrastructure.Persistence.Migrations.AddRuns 99.1%
Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview 99.5%
Orihon.Infrastructure.Persistence.Migrations.DropRegionContainer 99.1%
Orihon.Infrastructure.Persistence.Migrations.DropRegionType 99%
Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain 97.3%
Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot 100%
Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns 97.2%
Orihon.Infrastructure.Persistence.Migrations.ReplaceFitBoxWithContainerSeed 99.2%
Orihon.Infrastructure.Persistence.OrihonDbContext 100%
Orihon.Infrastructure.Persistence.OrihonDbContextFactory 100%
Orihon.Infrastructure.Projects.EfProjectStore 100% 100%
Orihon.Infrastructure.Projects.FileSystemPageImageStore 100% 100%
Orihon.Infrastructure.Runs.EfRunStore 96.6% 75%
Orihon.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Orihon.Infrastructure.Translation.EfChapterStore 100% 100%
Orihon.Infrastructure.Translation.EfPageStore 98.3% 93.7%
Orihon.Infrastructure.Translation.EfRegionStore 100% 100%
Orihon.Infrastructure.Translation.Ordering 100% 100%
System.Text.RegularExpressions.Generated 70.6% 53.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4
77.9% 76.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1
59% 42.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3
89.4% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2
83.7% 62.5%
Orihon.Kernel - 90.9%
Name Line Branch
Orihon.Kernel 90.9% 75%
Orihon.Kernel.Err`1 100%
Orihon.Kernel.Ok`1 100%
Orihon.Kernel.Result`1 88.8% 75%
Orihon.Server - 94.9%
Name Line Branch
Orihon.Server 94.9% 79.4%
Orihon.Server.CleaningCallRunnerBootstrap 100%
Orihon.Server.Components.App 100%
Orihon.Server.Components.Layout.MainLayout 100%
Orihon.Server.Components.Pages.Gate 64.2% 66.6%
Orihon.Server.Diagnostics.FakeCleaningServer 94.6% 80.7%
Orihon.Server.RunEngineBootstrap 100%
Orihon.Server.Security.AccessGate 91.8% 41.6%
Orihon.Server.Security.AccessSecret 100% 50%
Orihon.Server.VolumeStartupValidator 100% 100%
Program 96.4% 85.7%
Orihon.UseCases - 93%
Name Line Branch
Orihon.UseCases 93% 86.7%
Orihon.UseCases.Agents.AgentAttemptPreparation 100%
Orihon.UseCases.Agents.AgentAttemptSupport 98.6% 98.3%
Orihon.UseCases.Agents.AgentBlueprint 100%
Orihon.UseCases.Agents.AgentCapDebrief 100%
Orihon.UseCases.Agents.AgentInvocation 100%
Orihon.UseCases.Agents.AgentOutcome 100%
Orihon.UseCases.Agents.AgentTool`1 90.9% 75%
Orihon.UseCases.Agents.AgentToolImage 100%
Orihon.UseCases.Agents.AgentToolResult 100%
Orihon.UseCases.Agents.Annotation.AddFloatingRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddFloatingRegionTool 95.8% 75%
Orihon.UseCases.Agents.Annotation.AddRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddRegionTool 95.4% 75%
Orihon.UseCases.Agents.Annotation.AnnotationBlueprints 100%
Orihon.UseCases.Agents.Annotation.AnnotationStage 98.5% 86.1%
Orihon.UseCases.Agents.Annotation.BboxCreationExecutor 90.4% 50%
Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor 96.5% 90%
Orihon.UseCases.Agents.Annotation.BoundBoxParams 100%
Orihon.UseCases.Agents.Annotation.BoundContactSheetTool 91.3% 75%
Orihon.UseCases.Agents.Annotation.BoundCropParams 100%
Orihon.UseCases.Agents.Annotation.BoundCropTool 100%
Orihon.UseCases.Agents.Annotation.BoundViewPageTool 93.1% 80%
Orihon.UseCases.Agents.Annotation.BoundViewParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.ColorReading 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionParams 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryParams 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryTool 88.2% 62.5%
Orihon.UseCases.Agents.Annotation.FloatingCreationExecutor 86.9% 50%
Orihon.UseCases.Agents.Annotation.FloatingQaExecutor 91.8% 78.5%
Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor 95.4% 75%
Orihon.UseCases.Agents.Annotation.ListRegionsTool 93.7% 80.7%
Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool 90.9% 50%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams 100%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool 95.8% 83.3%
Orihon.UseCases.Agents.Annotation.NoteRegionParams 100%
Orihon.UseCases.Agents.Annotation.NoteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.PageQaExecutor 92.5% 79.1%
Orihon.UseCases.Agents.Annotation.QaReportSink 100% 100%
Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess 89.4% 62.5%
Orihon.UseCases.Agents.Annotation.RegionBriefing 100% 96.1%
Orihon.UseCases.Agents.Annotation.RegionCropParams 100%
Orihon.UseCases.Agents.Annotation.RegionCropTool 100% 100%
Orihon.UseCases.Agents.Annotation.RegionProblemParams 100%
Orihon.UseCases.Agents.Annotation.RegionWindow 100% 100%
Orihon.UseCases.Agents.Annotation.RejectRegionParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.ReorderRegionParams 100%
Orihon.UseCases.Agents.Annotation.ReorderRegionTool 88% 60%
Orihon.UseCases.Agents.Annotation.ReportQaParams 100%
Orihon.UseCases.Agents.Annotation.ReportQaTool 97.8% 90%
Orihon.UseCases.Agents.Annotation.SampleColorsParams 100%
Orihon.UseCases.Agents.Annotation.SampleColorsTool 100% 100%
Orihon.UseCases.Agents.Annotation.SampleRegionColorsParams 100%
Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetInkParams 100%
Orihon.UseCases.Agents.Annotation.SetInkTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaParams 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaTool 100% 75%
Orihon.UseCases.Agents.Annotation.SetRegionInkParams 100%
Orihon.UseCases.Agents.Annotation.SetRegionInkTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionParams 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionTool 100% 100%
Orihon.UseCases.Agents.Annotation.TranscriptionExecutor 97.7% 94.4%
Orihon.UseCases.Agents.AssistantSpoke 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor 96.9% 75%
Orihon.UseCases.Agents.BibleBuilding.GetRegionParams 100%
Orihon.UseCases.Agents.BibleBuilding.GetRegionTool 84.6% 70%
Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool 86.3% 83.3%
Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams 100%
Orihon.UseCases.Agents.Cleaning.AcceptEntryParams 100%
Orihon.UseCases.Agents.Cleaning.AcceptParams 100%
Orihon.UseCases.Agents.Cleaning.AcceptTool 100% 100%
Orihon.UseCases.Agents.Cleaning.AddMissedRegionParams 100%
Orihon.UseCases.Agents.Cleaning.AddMissedRegionTool 100% 100%
Orihon.UseCases.Agents.Cleaning.CheckCompareParams 100%
Orihon.UseCases.Agents.Cleaning.CheckCompareTool 100% 90%
Orihon.UseCases.Agents.Cleaning.CheckPageParams 100%
Orihon.UseCases.Agents.Cleaning.CheckViewPageTool 100%
Orihon.UseCases.Agents.Cleaning.CleaningBlueprints 100% 100%
Orihon.UseCases.Agents.Cleaning.CleaningBriefing 100% 97.6%
Orihon.UseCases.Agents.Cleaning.CleaningClassifyParams 100%
Orihon.UseCases.Agents.Cleaning.CleaningClassifyRegionTool 100% 100%
Orihon.UseCases.Agents.Cleaning.CleaningCropParams 100%
Orihon.UseCases.Agents.Cleaning.CleaningCropTool 100% 100%
Orihon.UseCases.Agents.Cleaning.CleaningFinish 100% 100%
Orihon.UseCases.Agents.Cleaning.CleaningListRegionsTool 100% 100%
Orihon.UseCases.Agents.Cleaning.CleaningLooksAt 100% 100%
Orihon.UseCases.Agents.Cleaning.CleaningMoveParams 100%
Orihon.UseCases.Agents.Cleaning.CleaningMoveRegionTool 100% 100%
Orihon.UseCases.Agents.Cleaning.CleaningPageParams 100%
Orihon.UseCases.Agents.Cleaning.CleaningRegionParams 100%
Orihon.UseCases.Agents.Cleaning.CleaningStatusTool 100% 100%
Orihon.UseCases.Agents.Cleaning.CleaningToolAccess 94.1% 92.8%
Orihon.UseCases.Agents.Cleaning.CleaningWords 100% 100%
Orihon.UseCases.Agents.Cleaning.EscalateParams 100%
Orihon.UseCases.Agents.Cleaning.EscalateTool 100% 100%
Orihon.UseCases.Agents.Cleaning.FillParams 100%
Orihon.UseCases.Agents.Cleaning.FillTool 100% 100%
Orihon.UseCases.Agents.Cleaning.FinalizeTool 100% 100%
Orihon.UseCases.Agents.Cleaning.FinishPageParams 100%
Orihon.UseCases.Agents.Cleaning.FinishPageTool 100% 100%
Orihon.UseCases.Agents.Cleaning.FinishSurveyTool 100% 100%
Orihon.UseCases.Agents.Cleaning.GroupCompareParams 100%
Orihon.UseCases.Agents.Cleaning.GroupCompareTool 100% 100%
Orihon.UseCases.Agents.Cleaning.GroupMeasureInkParams 100%
Orihon.UseCases.Agents.Cleaning.GroupMeasureInkTool 100%
Orihon.UseCases.Agents.Cleaning.InkReading 100% 100%
Orihon.UseCases.Agents.Cleaning.MeasureInkParams 100%
Orihon.UseCases.Agents.Cleaning.MeasureInkTool 100%
Orihon.UseCases.Agents.Cleaning.RejectParams 100%
Orihon.UseCases.Agents.Cleaning.RejectTool 100% 100%
Orihon.UseCases.Agents.Cleaning.Rubric 100% 100%
Orihon.UseCases.Agents.Cleaning.SplitRegionParams 100%
Orihon.UseCases.Agents.Cleaning.SplitRegionTool 100% 100%
Orihon.UseCases.Agents.Cleaning.SurveyViewPageTool 100%
Orihon.UseCases.Agents.Cleaning.UndoTool 100% 100%
Orihon.UseCases.Agents.Inspection.PageImageAccess 95.2% 80.6%
Orihon.UseCases.Agents.Inspection.ViewAccount 100% 100%
Orihon.UseCases.Agents.ReportFrictionParams 100%
Orihon.UseCases.Agents.ReportFrictionTool 100% 92.8%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool 100% 75%
Orihon.UseCases.Agents.ResearchSetup.AskUserParams 100%
Orihon.UseCases.Agents.ResearchSetup.AskUserTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.DeleteStoryBeatParams 100%
Orihon.UseCases.Agents.ResearchSetup.DeleteStoryBeatTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.ListBibleTool 90.3% 66.6%
Orihon.UseCases.Agents.ResearchSetup.ListPagesTool 97% 83.3%
Orihon.UseCases.Agents.ResearchSetup.LocatedPage 100%
Orihon.UseCases.Agents.ResearchSetup.PageByNumber 95% 91.6%
Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool 95.2% 90%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool 95.8% 75%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool 96.5% 95.8%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.StoryBeatByNumber 100% 100%
Orihon.UseCases.Agents.ResearchSetup.UpdateStoryBeatParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpdateStoryBeatTool 100% 75%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool 92.3% 71.4%
Orihon.UseCases.Agents.ResearchSetup.UpsertGlossaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertGlossaryTool 97.4% 90%
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.Cleaning.AcceptCleaning 100% 100%
Orihon.UseCases.Cleaning.AcceptEntry 100%
Orihon.UseCases.Cleaning.AddMissedRegion 100% 100%
Orihon.UseCases.Cleaning.CallFrame 100% 100%
Orihon.UseCases.Cleaning.CallFrames 100% 100%
Orihon.UseCases.Cleaning.CallMember 100%
Orihon.UseCases.Cleaning.CallNote 100%
Orihon.UseCases.Cleaning.CanaryShape 100% 50%
Orihon.UseCases.Cleaning.CanvasChoice 100%
Orihon.UseCases.Cleaning.ClassifyCleaningRegion 100% 100%
Orihon.UseCases.Cleaning.CleaningAccepted 100%
Orihon.UseCases.Cleaning.CleaningAssessment 100% 100%
Orihon.UseCases.Cleaning.CleaningCacheKey 100% 100%
Orihon.UseCases.Cleaning.CleaningCallFailed 100%
Orihon.UseCases.Cleaning.CleaningCallHalted 100%
Orihon.UseCases.Cleaning.CleaningCallRequest 100%
Orihon.UseCases.Cleaning.CleaningCallReturned 100%
Orihon.UseCases.Cleaning.CleaningCallRunner 97.2% 95.1%
Orihon.UseCases.Cleaning.CleaningCanary 100%
Orihon.UseCases.Cleaning.CleaningCandidate 80%
Orihon.UseCases.Cleaning.CleaningCoverage 100% 100%
Orihon.UseCases.Cleaning.CleaningEdits 100% 100%
Orihon.UseCases.Cleaning.CleaningFailure 100%
Orihon.UseCases.Cleaning.CleaningFailures 100% 97.6%
Orihon.UseCases.Cleaning.CleaningFrames 100% 100%
Orihon.UseCases.Cleaning.CleaningGpuTime 100%
Orihon.UseCases.Cleaning.CleaningGroupBinding 100% 100%
Orihon.UseCases.Cleaning.CleaningHealth 100% 100%
Orihon.UseCases.Cleaning.CleaningIdentity 100% 89.7%
Orihon.UseCases.Cleaning.CleaningInvocation 100% 100%
Orihon.UseCases.Cleaning.CleaningInvocationOptions 100%
Orihon.UseCases.Cleaning.CleaningLabels 100% 100%
Orihon.UseCases.Cleaning.CleaningLooks 100% 100%
Orihon.UseCases.Cleaning.CleaningPage 100%
Orihon.UseCases.Cleaning.CleaningPageGuard 100% 100%
Orihon.UseCases.Cleaning.CleaningPageLocks 100% 100%
Orihon.UseCases.Cleaning.CleaningPlan 100%
Orihon.UseCases.Cleaning.CleaningPlanner 100% 100%
Orihon.UseCases.Cleaning.CleaningPlanOptions 100%
Orihon.UseCases.Cleaning.CleaningRecipe 100%
Orihon.UseCases.Cleaning.CleaningRegionEdited 100%
Orihon.UseCases.Cleaning.CleaningRegions 100% 100%
Orihon.UseCases.Cleaning.CleaningRegionUpkeep 100% 97.2%
Orihon.UseCases.Cleaning.CleaningRejected 100%
Orihon.UseCases.Cleaning.CleaningRunnerOptions 100%
Orihon.UseCases.Cleaning.CleaningRunnerStatus 100%
Orihon.UseCases.Cleaning.CleaningSeeds 100% 100%
Orihon.UseCases.Cleaning.CleaningStatusRead 100%
Orihon.UseCases.Cleaning.CleaningUndone 100%
Orihon.UseCases.Cleaning.CleaningViewOptions 100%
Orihon.UseCases.Cleaning.CompareAsk 100%
Orihon.UseCases.Cleaning.CompareCleaningView 100% 100%
Orihon.UseCases.Cleaning.CompareSourceAsk 100%
Orihon.UseCases.Cleaning.ComputedFill 100%
Orihon.UseCases.Cleaning.CropAsk 100%
Orihon.UseCases.Cleaning.CropCleaningView 100% 100%
Orihon.UseCases.Cleaning.EscalateCleaning 100% 100%
Orihon.UseCases.Cleaning.FillRegion 100% 100%
Orihon.UseCases.Cleaning.FillShown 100%
Orihon.UseCases.Cleaning.FinalizeGroup 100% 100%
Orihon.UseCases.Cleaning.FinishPageCheck 100% 100%
Orihon.UseCases.Cleaning.FinishSurvey 100% 100%
Orihon.UseCases.Cleaning.GetCleaningRunnerStatus 100%
Orihon.UseCases.Cleaning.GetCleaningStatus 100% 100%
Orihon.UseCases.Cleaning.GpuWait 100%
Orihon.UseCases.Cleaning.GroupBinding 100%
Orihon.UseCases.Cleaning.GroupFinalized 100%
Orihon.UseCases.Cleaning.InkHints 100% 100%
Orihon.UseCases.Cleaning.InkMeasured 100%
Orihon.UseCases.Cleaning.JobClock 100% 100%
Orihon.UseCases.Cleaning.JobIdentity 100%
Orihon.UseCases.Cleaning.LabelProblem 100%
Orihon.UseCases.Cleaning.MagnifiedCanvas 100%
Orihon.UseCases.Cleaning.MeasureCleaningInk 100% 100%
Orihon.UseCases.Cleaning.MoveCleaningRegion 100% 100%
Orihon.UseCases.Cleaning.OwedRegion 100%
Orihon.UseCases.Cleaning.OwnWindowFrame 100%
Orihon.UseCases.Cleaning.PageChecked 100%
Orihon.UseCases.Cleaning.PageLook 100%
Orihon.UseCases.Cleaning.PlannedCall 100%
Orihon.UseCases.Cleaning.PlanSurvey 100% 100%
Orihon.UseCases.Cleaning.PlateRebuilt 100%
Orihon.UseCases.Cleaning.RebuildPlate 100% 100%
Orihon.UseCases.Cleaning.RecordedView 100%
Orihon.UseCases.Cleaning.RectFrame 100%
Orihon.UseCases.Cleaning.RegionCleaningRead 100%
Orihon.UseCases.Cleaning.RegionFrame 100%
Orihon.UseCases.Cleaning.RejectCleaning 100% 100%
Orihon.UseCases.Cleaning.RejectEntry 100%
Orihon.UseCases.Cleaning.ResumeCleaning 100% 100%
Orihon.UseCases.Cleaning.SplitCleaningRegion 100% 100%
Orihon.UseCases.Cleaning.SurveyBatch 100%
Orihon.UseCases.Cleaning.SurveyCoverage 100% 100%
Orihon.UseCases.Cleaning.SurveyFinished 100%
Orihon.UseCases.Cleaning.SurveyTarget 100%
Orihon.UseCases.Cleaning.UndoCleaning 100% 94.4%
Orihon.UseCases.Cleaning.UploadNotes 100%
Orihon.UseCases.Cleaning.ViewCleaningPage 100% 100%
Orihon.UseCases.Cleaning.ViewColour 100%
Orihon.UseCases.Debriefs.AgentDebriefDto 90.9%
Orihon.UseCases.Debriefs.AgentFeedbackDto 83.3%
Orihon.UseCases.Debriefs.ClearAgentDebriefs 100%
Orihon.UseCases.Debriefs.ClearAgentFeedback 100%
Orihon.UseCases.Debriefs.ListAgentDebriefs 100% 100%
Orihon.UseCases.Debriefs.ListAgentFeedback 100% 75%
Orihon.UseCases.DependencyInjection 100%
Orihon.UseCases.Diagnostics.FakeCleaningServerAddress 100%
Orihon.UseCases.Diagnostics.SeedDevData 99.2% 82.1%
Orihon.UseCases.Gateways.BoxFlag 100%
Orihon.UseCases.Gateways.CleaningOverlays 100%
Orihon.UseCases.Gateways.CleaningSource 100%
Orihon.UseCases.Gateways.CleaningView 100% 100%
Orihon.UseCases.Gateways.CleaningViewImage 100%
Orihon.UseCases.Gateways.CleaningViewTile 100%
Orihon.UseCases.Gateways.ClosedBalloon 100%
Orihon.UseCases.Gateways.ColorShare 100%
Orihon.UseCases.Gateways.CompareRequest 100%
Orihon.UseCases.Gateways.CropRequest 100%
Orihon.UseCases.Gateways.EditBackendError 100%
Orihon.UseCases.Gateways.EditBackendIdentity 100%
Orihon.UseCases.Gateways.EditJob 100%
Orihon.UseCases.Gateways.EditJobAccepted 100%
Orihon.UseCases.Gateways.EditJobRejected 100%
Orihon.UseCases.Gateways.EditJobRequest 86.6% 66.6%
Orihon.UseCases.Gateways.EditJobRun 100%
Orihon.UseCases.Gateways.EditModels 100%
Orihon.UseCases.Gateways.EditModelWeight 100%
Orihon.UseCases.Gateways.EditOutputImage 100%
Orihon.UseCases.Gateways.EditOutputWithheld 100%
Orihon.UseCases.Gateways.EditRect 100% 100%
Orihon.UseCases.Gateways.EditRunOutput 100%
Orihon.UseCases.Gateways.EditServerAnswered`1 100%
Orihon.UseCases.Gateways.EditServerBuild 100%
Orihon.UseCases.Gateways.EditServerHealth 100%
Orihon.UseCases.Gateways.EditServerSilent`1 100%
Orihon.UseCases.Gateways.FillRefusal 100%
Orihon.UseCases.Gateways.FillReport 100%
Orihon.UseCases.Gateways.GlyphFill 100%
Orihon.UseCases.Gateways.GridAxis 100%
Orihon.UseCases.Gateways.GridSteps 100%
Orihon.UseCases.Gateways.InkFacts 100%
Orihon.UseCases.Gateways.InkHint 100%
Orihon.UseCases.Gateways.InkMeasure 100%
Orihon.UseCases.Gateways.InkReadings 100%
Orihon.UseCases.Gateways.InkRegion 100%
Orihon.UseCases.Gateways.LabeledBox 100%
Orihon.UseCases.Gateways.LevelRange 100%
Orihon.UseCases.Gateways.LlmKeyInfo 100%
Orihon.UseCases.Gateways.LlmModel 100%
Orihon.UseCases.Gateways.LlmReasoning 100% 100%
Orihon.UseCases.Gateways.MeasureBlend 100%
Orihon.UseCases.Gateways.MeasureRaw 100%
Orihon.UseCases.Gateways.MeasureRegion 100%
Orihon.UseCases.Gateways.MeasureRequest 100%
Orihon.UseCases.Gateways.PagePatch 100%
Orihon.UseCases.Gateways.PageTone 100%
Orihon.UseCases.Gateways.PaperColor 100%
Orihon.UseCases.Gateways.PixelAlpha 100%
Orihon.UseCases.Gateways.PixelDigest 100%
Orihon.UseCases.Gateways.PixelMask 100%
Orihon.UseCases.Gateways.PixelRect 100%
Orihon.UseCases.Gateways.PixelWindow 100%
Orihon.UseCases.Gateways.PlateBuild 100%
Orihon.UseCases.Gateways.RegionGeometry 100%
Orihon.UseCases.Gateways.RegistrationField 100%
Orihon.UseCases.Gateways.RenderedView 100%
Orihon.UseCases.Gateways.StoredPatch 100%
Orihon.UseCases.Gateways.StoredTranscript 100%
Orihon.UseCases.Gateways.StoredTranscriptPage 100%
Orihon.UseCases.Gateways.TranscriptHeader 97.3% 90.9%
Orihon.UseCases.Gateways.TranscriptListingFacets 100%
Orihon.UseCases.Gateways.TranscriptSummary 100%
Orihon.UseCases.Gateways.WindowUpload 100%
Orihon.UseCases.NextOrder 100%
Orihon.UseCases.Pages.DeletePage 100% 100%
Orihon.UseCases.Pages.DeletePages 100% 100%
Orihon.UseCases.Pages.GetPage 100% 100%
Orihon.UseCases.Pages.GetPageSteps 100% 100%
Orihon.UseCases.Pages.GetProjectWorkspace 100% 100%
Orihon.UseCases.Pages.ImportPages 100% 100%
Orihon.UseCases.Pages.ImportPagesResult 100%
Orihon.UseCases.Pages.MarkPageAnnotated 100% 100%
Orihon.UseCases.Pages.MarkPagePasses 100% 50%
Orihon.UseCases.Pages.MovePage 100% 93.7%
Orihon.UseCases.Pages.MovePages 100% 100%
Orihon.UseCases.Pages.PageDetailDto 100%
Orihon.UseCases.Pages.PageDto 100%
Orihon.UseCases.Pages.PageStepsDto 100%
Orihon.UseCases.Pages.PageUpload 100%
Orihon.UseCases.Pages.ProjectWorkspaceDto 100%
Orihon.UseCases.Pages.ReorderPages 100%
Orihon.UseCases.Pages.SetPageMeta 100% 100%
Orihon.UseCases.Pages.WorkspaceChapterDto 100%
Orihon.UseCases.Projects.CompleteProjectSetup 100% 93.7%
Orihon.UseCases.Projects.CreateProject 100% 100%
Orihon.UseCases.Projects.DeleteProject 100% 100%
Orihon.UseCases.Projects.FloatingPassAnswer 100%
Orihon.UseCases.Projects.GetProject 100% 100%
Orihon.UseCases.Projects.ListProjects 100%
Orihon.UseCases.Projects.PageMention 100%
Orihon.UseCases.Projects.ProjectDto 96.1%
Orihon.UseCases.Projects.StartAnnotationRun 96.5% 92.8%
Orihon.UseCases.Projects.StartBibleRun 92.3% 83.3%
Orihon.UseCases.Projects.StartFloatingPassRun 100% 100%
Orihon.UseCases.Projects.StartSetupRun 100% 100%
Orihon.UseCases.Projects.StartTranslationRun 92.3% 83.3%
Orihon.UseCases.Projects.StoredPageImage 100%
Orihon.UseCases.Projects.UpdateProjectMetadata 100% 100%
Orihon.UseCases.Regions.CreateRegion 100% 100%
Orihon.UseCases.Regions.DeleteRegion 100% 100%
Orihon.UseCases.Regions.RegionDto 97%
Orihon.UseCases.Regions.RegionWrite 100% 100%
Orihon.UseCases.Regions.RegionWriteResult 100%
Orihon.UseCases.Regions.RegionWrites 100% 100%
Orihon.UseCases.Regions.ReorderRegions 100%
Orihon.UseCases.Regions.SampleRegionColors 100% 50%
Orihon.UseCases.Regions.SplitRegion 97.6% 83.3%
Orihon.UseCases.Regions.UpdateRegion 100% 96.1%
Orihon.UseCases.Runs.AnnotationPipeline 100% 100%
Orihon.UseCases.Runs.AttemptLedger 100% 100%
Orihon.UseCases.Runs.ExecutionDto 93.3%
Orihon.UseCases.Runs.ExecutionProgress 100%
Orihon.UseCases.Runs.ExecutionProgressRegistry 100% 100%
Orihon.UseCases.Runs.ExecutionPulseRelay 100% 100%
Orihon.UseCases.Runs.ExecutionSendBack 100%
Orihon.UseCases.Runs.PlannedExecution 100%
Orihon.UseCases.Runs.PulseTarget 100%
Orihon.UseCases.Runs.ReprocessPage 97% 95.8%
Orihon.UseCases.Runs.ReprocessTranslation 88.8% 83.3%
Orihon.UseCases.Runs.RunDto 93.3% 90%
Orihon.UseCases.Runs.RunEngine 95.8% 94%
Orihon.UseCases.Runs.RunEngineOptions 100% 100%
Orihon.UseCases.Runs.RunPhase 94.1% 100%
Orihon.UseCases.Runs.RunStart 100%
Orihon.UseCases.Runs.StageContext 100% 50%
Orihon.UseCases.Runs.StageHaltedException 100%
Orihon.UseCases.Runs.WorkStates 100% 83.3%
Orihon.UseCases.Settings.AgentSettingDto 100% 100%
Orihon.UseCases.Settings.CheckCleaningServer 87.5% 60%
Orihon.UseCases.Settings.CleaningInFlightSetting 100% 100%
Orihon.UseCases.Settings.CleaningServerSetting 100% 100%
Orihon.UseCases.Settings.CleaningServerStatusDto 100% 100%
Orihon.UseCases.Settings.ConcurrencySetting 100% 100%
Orihon.UseCases.Settings.EffortSetting 100% 100%
Orihon.UseCases.Settings.GetSettings 100% 100%
Orihon.UseCases.Settings.ListModelOptions 100% 100%
Orihon.UseCases.Settings.RoutingSetting 100% 100%
Orihon.UseCases.Settings.SaveAgentEffort 100% 100%
Orihon.UseCases.Settings.SaveAgentModel 100% 100%
Orihon.UseCases.Settings.SaveAgentRouting 100% 100%
Orihon.UseCases.Settings.SaveCleaningInFlight 100% 100%
Orihon.UseCases.Settings.SaveCleaningServer 95.2% 85.7%
Orihon.UseCases.Settings.SaveFloatingPass 100% 100%
Orihon.UseCases.Settings.SaveOpenRouterKey 100% 100%
Orihon.UseCases.Settings.SaveRunConcurrency 100% 100%
Orihon.UseCases.Settings.SettingKeys 100% 100%
Orihon.UseCases.Settings.SettingsDto 100% 100%
Orihon.UseCases.Transcripts.AgentTranscriptDto 100%
Orihon.UseCases.Transcripts.AgentTranscriptListDto 100%
Orihon.UseCases.Transcripts.AgentTranscriptPageDto 100%
Orihon.UseCases.Transcripts.AgentTranscriptTextDto 100%
Orihon.UseCases.Transcripts.ClearAgentTranscripts 100% 100%
Orihon.UseCases.Transcripts.ListAgentTranscripts 100% 100%
Orihon.UseCases.Transcripts.ReadAgentTranscript 100% 100%
System.Text.RegularExpressions.Generated 75.6% 70.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__BalloonWords_7
70.7% 57.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__Capital_0
90.1% 77.2%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__CoordinateWords_1
81.8% 81.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__JustBefore_4
80.9% 71.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__KindWords_5
78.6% 63.7%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__OutlineWords_6
65.1% 53.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__PositionalProse_2
71.9% 71.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0
D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__SideOfTheBox_3
83% 80.4%
<!-- coverage-comment --> > 🔄 **Auto-updating coverage report** — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip. > > **Commit:** `cda9464` · **Generated:** 2026-10-07 04:43:50 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/07/2026 - 04:43:50 | | Coverage date: | 10/07/2026 - 04:43:03 - 10/07/2026 - 04:43:46 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 847 | | Files: | 369 | | **Line coverage:** | 96.2% (34465 of 35823) | | Covered lines: | 34465 | | Uncovered lines: | 1358 | | Coverable lines: | 35823 | | Total lines: | 59037 | | **Branch coverage:** | 87.1% (8453 of 9704) | | Covered branches: | 8453 | | Total branches: | 9704 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 95.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**95.9%**|**89.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.CreateRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageStepsLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageViewport|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage|94.3%|88.1%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers|100%|64.2%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionColorsSampled|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionCreated|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionSaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SampleRegionColorsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested|100%|| |Orihon.BlazorAdapter.Projects.CreateProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.DecideSetupContinuation|100%|| |Orihon.BlazorAdapter.Projects.DeleteProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.FinishSetupRequested|100%|| |Orihon.BlazorAdapter.Projects.ImportPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.LoadWizard|100%|| |Orihon.BlazorAdapter.Projects.PageOrganizer|96%|95%| |Orihon.BlazorAdapter.Projects.PagesImported|100%|| |Orihon.BlazorAdapter.Projects.ProjectDeleteFailed|100%|| |Orihon.BlazorAdapter.Projects.ProjectListEffects|100%|100%| |Orihon.BlazorAdapter.Projects.ProjectListPage|89.7%|91.6%| |Orihon.BlazorAdapter.Projects.ProjectListReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectListState|100%|| |Orihon.BlazorAdapter.Projects.ProjectsLoaded|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardEffects|93.8%|90%| |Orihon.BlazorAdapter.Projects.ProjectWizardPage|95.3%|84.1%| |Orihon.BlazorAdapter.Projects.ProjectWizardReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardState|100%|| |Orihon.BlazorAdapter.Projects.SetupChat|93.5%|100%| |Orihon.BlazorAdapter.Projects.SetupChatEffects|100%|100%| |Orihon.BlazorAdapter.Projects.SetupChatFailed|100%|| |Orihon.BlazorAdapter.Projects.SetupChatReducers|100%|| |Orihon.BlazorAdapter.Projects.SetupChatState|100%|| |Orihon.BlazorAdapter.Projects.SetupChatUpdated|100%|| |Orihon.BlazorAdapter.Projects.StartSetupChat|100%|| |Orihon.BlazorAdapter.Projects.SubmitSetupAnswer|100%|| |Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardLoaded|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.AcceptProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.AnsweredRuling|100%|| |Orihon.BlazorAdapter.Rulings.AnswerRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.DeclineProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.DismissRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.RulingBar|98.2%|94.6%| |Orihon.BlazorAdapter.Rulings.RulingDeskBridge|94.2%|91.6%| |Orihon.BlazorAdapter.Rulings.RulingsEffects|95.4%|83.3%| |Orihon.BlazorAdapter.Rulings.RulingsLoaded|100%|| |Orihon.BlazorAdapter.Rulings.RulingsReducers|100%|| |Orihon.BlazorAdapter.Rulings.RulingsState|100%|| |Orihon.BlazorAdapter.Rulings.RulingWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested|100%|| |Orihon.BlazorAdapter.Runs.CancelMonitorRun|100%|| |Orihon.BlazorAdapter.Runs.MonitorPageRef|100%|| |Orihon.BlazorAdapter.Runs.MonitorRunLoaded|100%|| |Orihon.BlazorAdapter.Runs.RetryMonitorExecution|100%|| |Orihon.BlazorAdapter.Runs.RunChangedBridge|95%|92.8%| |Orihon.BlazorAdapter.Runs.RunMonitor|98.1%|96.9%| |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.CleaningInFlightPicked|100%|| |Orihon.BlazorAdapter.Settings.CleaningInFlightSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.CleaningResumed|100%|| |Orihon.BlazorAdapter.Settings.CleaningRunnerLoaded|100%|| |Orihon.BlazorAdapter.Settings.CleaningServerChecked|100%|| |Orihon.BlazorAdapter.Settings.CleaningServerSaved|100%|| |Orihon.BlazorAdapter.Settings.CleaningServerSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.EffortOption|100%|100%| |Orihon.BlazorAdapter.Settings.FloatingPassToggled|100%|| |Orihon.BlazorAdapter.Settings.KeySaved|100%|| |Orihon.BlazorAdapter.Settings.KeySaveFailed|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsLoaded|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable|100%|| |Orihon.BlazorAdapter.Settings.ResumeCleaningFailed|100%|| |Orihon.BlazorAdapter.Settings.RoutingOption|100%|100%| |Orihon.BlazorAdapter.Settings.RunConcurrencyPicked|100%|| |Orihon.BlazorAdapter.Settings.RunConcurrencySaveFailed|100%|| |Orihon.BlazorAdapter.Settings.SaveCleaningServerRequested|100%|| |Orihon.BlazorAdapter.Settings.SaveKeyRequested|100%|| |Orihon.BlazorAdapter.Settings.SettingsEffects|92.5%|83.3%| |Orihon.BlazorAdapter.Settings.SettingsLoaded|100%|| |Orihon.BlazorAdapter.Settings.SettingsPage|97.7%|91.6%| |Orihon.BlazorAdapter.Settings.SettingsReducers|96.1%|64.2%| |Orihon.BlazorAdapter.Settings.SettingsState|100%|| |Orihon.BlazorAdapter.Settings.TranscriptFilterPicked|100%|| |Orihon.BlazorAdapter.Settings.TranscriptPagePicked|100%|| |Orihon.BlazorAdapter.Settings.TranscriptPicked|100%|| |Orihon.BlazorAdapter.Settings.TranscriptTextLoaded|100%|| |Orihon.BlazorAdapter.Settings.TranscriptTextLoadFailed|100%|| |Orihon.BlazorAdapter.Uploads.UploadTransfer|96.5%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferProgress|100%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferResult|100%|| |Orihon.BlazorAdapter.Workspace.CreateChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeletePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.FloatingPassAnswered|100%|| |Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace|100%|| |Orihon.BlazorAdapter.Workspace.MovePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.ProjectMetadataCard|95.6%|92.8%| |Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage|95.7%|87.9%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers|100%|62.5%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState|100%|| |Orihon.BlazorAdapter.Workspace.RenameChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunAnnotationRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunBibleRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunFloatingPassRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunTranslationRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.SetPageKindRequested|100%|| |Orihon.BlazorAdapter.Workspace.SummaryDeleted|100%|| |Orihon.BlazorAdapter.Workspace.SummarySaved|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed|100%|| </details> <details><summary>Orihon.Domain - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Domain**|**100%**|**100%**| |Orihon.Domain.Agents.AgentDebrief|100%|100%| |Orihon.Domain.Agents.AgentDescriptor|100%|100%| |Orihon.Domain.Agents.AgentFeedback|100%|100%| |Orihon.Domain.Agents.AgentRoster|100%|100%| |Orihon.Domain.Agents.InvocationBudget|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.Cleaning.AppliedResult|100%|| |Orihon.Domain.Cleaning.CleaningBasis|100%|| |Orihon.Domain.Cleaning.CleaningCall|100%|100%| |Orihon.Domain.Cleaning.CleaningCallRect|100%|| |Orihon.Domain.Cleaning.CleaningCanvas|100%|| |Orihon.Domain.Cleaning.CleaningClause|100%|| |Orihon.Domain.Cleaning.CleaningEdit|100%|100%| |Orihon.Domain.Cleaning.CleaningJudgement|100%|| |Orihon.Domain.Cleaning.CleaningOutput|100%|100%| |Orihon.Domain.Cleaning.CleaningOverrides|100%|| |Orihon.Domain.Cleaning.CleaningServerIdentity|100%|| |Orihon.Domain.Cleaning.CleaningServerState|100%|100%| |Orihon.Domain.Cleaning.CleaningVerdicts|100%|100%| |Orihon.Domain.Cleaning.CleaningViewRecord|100%|100%| |Orihon.Domain.Cleaning.CleaningWindow|100%|| |Orihon.Domain.Cleaning.EditedRegion|100%|| |Orihon.Domain.Cleaning.PageBox|100%|100%| |Orihon.Domain.Cleaning.PageCleaning|100%|100%| |Orihon.Domain.Cleaning.PlannedCleaningCall|100%|| |Orihon.Domain.Cleaning.RegionCleaning|100%|100%| |Orihon.Domain.Cleaning.RegionShape|100%|| |Orihon.Domain.Cleaning.ResultSource|100%|100%| |Orihon.Domain.Cleaning.ViewTile|100%|| |Orihon.Domain.Projects.Project|100%|100%| |Orihon.Domain.Projects.ProjectProfile|100%|| |Orihon.Domain.Runs.Execution|100%|100%| |Orihon.Domain.Runs.RegionProblem|100%|| |Orihon.Domain.Runs.Run|100%|| |Orihon.Domain.Settings.AppSetting|100%|| |Orihon.Domain.Text|100%|100%| |Orihon.Domain.Translation.BoundingBox|100%|100%| |Orihon.Domain.Translation.Chapter|100%|| |Orihon.Domain.Translation.InkColor|100%|100%| |Orihon.Domain.Translation.Page|100%|| |Orihon.Domain.Translation.Region|100%|100%| |Orihon.Domain.Translation.RegionInk|100%|100%| |Orihon.Domain.Translation.RegionProfile|100%|| </details> <details><summary>Orihon.Infrastructure - 97.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**97.8%**|**86.4%**| |Orihon.Infrastructure.Agents.EfAgentDebriefStore|100%|| |Orihon.Infrastructure.Agents.EfAgentFeedbackStore|100%|| |Orihon.Infrastructure.Bible.EfBibleStore|95.2%|92.8%| |Orihon.Infrastructure.Cleaning.EfCleaningCallStore|98.6%|100%| |Orihon.Infrastructure.Cleaning.EfCleaningStateStore|100%|100%| |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.Cleaning.BoxChecks|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.DerivedInk|100%|| |Orihon.Infrastructure.Gateways.Cleaning.EdgeMetrics|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.FillResult|100%|| |Orihon.Infrastructure.Gateways.Cleaning.GateStats|100%|| |Orihon.Infrastructure.Gateways.Cleaning.GreyRule|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.LabFill|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.LabGeometry|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.LabInk|100%|98.3%| |Orihon.Infrastructure.Gateways.Cleaning.LabMetrics|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.LabPaper|100%|97.3%| |Orihon.Infrastructure.Gateways.Cleaning.LabReadings|100%|| |Orihon.Infrastructure.Gateways.Cleaning.PageRects|100%|| |Orihon.Infrastructure.Gateways.Cleaning.PaperComponent|100%|| |Orihon.Infrastructure.Gateways.Cleaning.PatchPixels|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.RasterCleaningImages|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.RasterCleaningMetrics|100%|97.3%| |Orihon.Infrastructure.Gateways.Cleaning.RasterCleaningViews|99.4%|98.3%| |Orihon.Infrastructure.Gateways.Cleaning.RasterInkAnalyzer|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.RasterPlateComposer|100%|100%| |Orihon.Infrastructure.Gateways.Cleaning.Rgb|100%|| |Orihon.Infrastructure.Gateways.Cleaning.ViewTiling|100%|100%| |Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore|85.2%|80.8%| |Orihon.Infrastructure.Gateways.HttpWebPageFetcher|95.1%|83.3%| |Orihon.Infrastructure.Gateways.LabelFont|100%|50%| |Orihon.Infrastructure.Gateways.OpenRouterLlmGateway|90.2%|82.1%| |Orihon.Infrastructure.Gateways.QwenImageServerGateway|96.7%|90%| |Orihon.Infrastructure.Gateways.QwenImageServerJson|96%|72.3%| |Orihon.Infrastructure.Gateways.Raster.FloatImage|77.7%|50%| |Orihon.Infrastructure.Gateways.Raster.GrayImage|95.8%|75%| |Orihon.Infrastructure.Gateways.Raster.Labels|100%|100%| |Orihon.Infrastructure.Gateways.Raster.Mask|99.1%|98.5%| |Orihon.Infrastructure.Gateways.Raster.NumpyMath|93.9%|93.4%| |Orihon.Infrastructure.Gateways.Raster.PillowBlur|98.4%|89.4%| |Orihon.Infrastructure.Gateways.Raster.PillowLanczos|100%|100%| |Orihon.Infrastructure.Gateways.Raster.PixelBox|100%|100%| |Orihon.Infrastructure.Gateways.Raster.RgbImage|96.4%|75%| |Orihon.Infrastructure.Gateways.Raster.ScipyGaussian|100%|100%| |Orihon.Infrastructure.Gateways.SkiaImages|100%|100%| |Orihon.Infrastructure.Gateways.SkiaPageImageRenderer|97.4%|90.8%| |Orihon.Infrastructure.Gateways.SkiaPixelDigest|100%|100%| |Orihon.Infrastructure.Gateways.SkiaRegionColorSampler|100%|100%| |Orihon.Infrastructure.Gateways.UntaggedPng|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.CleaningCallConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.CleaningEditConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.CleaningOutputConfiguratio<br/>n|100%|| |Orihon.Infrastructure.Persistence.Configurations.CleaningServerStateConfigu<br/>ration|100%|| |Orihon.Infrastructure.Persistence.Configurations.CleaningViewConfiguration|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.PageCleaningConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RegionCleaningConfiguratio<br/>n|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.AddCleaningCallRunner|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddCleaningState|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddHouseRules|99.6%|| |Orihon.Infrastructure.Persistence.Migrations.AddPagePassFacts|99%|| |Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionFitBoxDropFillHints|98.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionForm|99.4%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionInk|99.4%|| |Orihon.Infrastructure.Persistence.Migrations.AddRuns|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.DropRegionContainer|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.DropRegionType|99%|| |Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain|97.3%|| |Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot|100%|| |Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns|97.2%|| |Orihon.Infrastructure.Persistence.Migrations.ReplaceFitBoxWithContainerSeed|99.2%|| |Orihon.Infrastructure.Persistence.OrihonDbContext|100%|| |Orihon.Infrastructure.Persistence.OrihonDbContextFactory|100%|| |Orihon.Infrastructure.Projects.EfProjectStore|100%|100%| |Orihon.Infrastructure.Projects.FileSystemPageImageStore|100%|100%| |Orihon.Infrastructure.Runs.EfRunStore|96.6%|75%| |Orihon.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Orihon.Infrastructure.Translation.EfChapterStore|100%|100%| |Orihon.Infrastructure.Translation.EfPageStore|98.3%|93.7%| |Orihon.Infrastructure.Translation.EfRegionStore|100%|100%| |Orihon.Infrastructure.Translation.Ordering|100%|100%| |System.Text.RegularExpressions.Generated|70.6%|53.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4|77.9%|76.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1|59%|42.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3|89.4%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2|83.7%|62.5%| </details> <details><summary>Orihon.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Kernel**|**90.9%**|**75%**| |Orihon.Kernel.Err`1|100%|| |Orihon.Kernel.Ok`1|100%|| |Orihon.Kernel.Result`1|88.8%|75%| </details> <details><summary>Orihon.Server - 94.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Server**|**94.9%**|**79.4%**| |Orihon.Server.CleaningCallRunnerBootstrap|100%|| |Orihon.Server.Components.App|100%|| |Orihon.Server.Components.Layout.MainLayout|100%|| |Orihon.Server.Components.Pages.Gate|64.2%|66.6%| |Orihon.Server.Diagnostics.FakeCleaningServer|94.6%|80.7%| |Orihon.Server.RunEngineBootstrap|100%|| |Orihon.Server.Security.AccessGate|91.8%|41.6%| |Orihon.Server.Security.AccessSecret|100%|50%| |Orihon.Server.VolumeStartupValidator|100%|100%| |Program|96.4%|85.7%| </details> <details><summary>Orihon.UseCases - 93%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**93%**|**86.7%**| |Orihon.UseCases.Agents.AgentAttemptPreparation|100%|| |Orihon.UseCases.Agents.AgentAttemptSupport|98.6%|98.3%| |Orihon.UseCases.Agents.AgentBlueprint|100%|| |Orihon.UseCases.Agents.AgentCapDebrief|100%|| |Orihon.UseCases.Agents.AgentInvocation|100%|| |Orihon.UseCases.Agents.AgentOutcome|100%|| |Orihon.UseCases.Agents.AgentTool`1|90.9%|75%| |Orihon.UseCases.Agents.AgentToolImage|100%|| |Orihon.UseCases.Agents.AgentToolResult|100%|| |Orihon.UseCases.Agents.Annotation.AddFloatingRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddFloatingRegionTool|95.8%|75%| |Orihon.UseCases.Agents.Annotation.AddRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddRegionTool|95.4%|75%| |Orihon.UseCases.Agents.Annotation.AnnotationBlueprints|100%|| |Orihon.UseCases.Agents.Annotation.AnnotationStage|98.5%|86.1%| |Orihon.UseCases.Agents.Annotation.BboxCreationExecutor|90.4%|50%| |Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor|96.5%|90%| |Orihon.UseCases.Agents.Annotation.BoundBoxParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundContactSheetTool|91.3%|75%| |Orihon.UseCases.Agents.Annotation.BoundCropParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundCropTool|100%|| |Orihon.UseCases.Agents.Annotation.BoundViewPageTool|93.1%|80%| |Orihon.UseCases.Agents.Annotation.BoundViewParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.ColorReading|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.DeleteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.FindGlossaryParams|100%|| |Orihon.UseCases.Agents.Annotation.FindGlossaryTool|88.2%|62.5%| |Orihon.UseCases.Agents.Annotation.FloatingCreationExecutor|86.9%|50%| |Orihon.UseCases.Agents.Annotation.FloatingQaExecutor|91.8%|78.5%| |Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor|95.4%|75%| |Orihon.UseCases.Agents.Annotation.ListRegionsTool|93.7%|80.7%| |Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool|90.9%|50%| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool|95.8%|83.3%| |Orihon.UseCases.Agents.Annotation.NoteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.NoteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.PageQaExecutor|92.5%|79.1%| |Orihon.UseCases.Agents.Annotation.QaReportSink|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess|89.4%|62.5%| |Orihon.UseCases.Agents.Annotation.RegionBriefing|100%|96.1%| |Orihon.UseCases.Agents.Annotation.RegionCropParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionCropTool|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionProblemParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionWindow|100%|100%| |Orihon.UseCases.Agents.Annotation.RejectRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.ReorderRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ReorderRegionTool|88%|60%| |Orihon.UseCases.Agents.Annotation.ReportQaParams|100%|| |Orihon.UseCases.Agents.Annotation.ReportQaTool|97.8%|90%| |Orihon.UseCases.Agents.Annotation.SampleColorsParams|100%|| |Orihon.UseCases.Agents.Annotation.SampleColorsTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SampleRegionColorsParams|100%|| |Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetInkParams|100%|| |Orihon.UseCases.Agents.Annotation.SetInkTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.Annotation.SetPageMetaTool|100%|75%| |Orihon.UseCases.Agents.Annotation.SetRegionInkParams|100%|| |Orihon.UseCases.Agents.Annotation.SetRegionInkTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetTranscriptionParams|100%|| |Orihon.UseCases.Agents.Annotation.SetTranscriptionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.TranscriptionExecutor|97.7%|94.4%| |Orihon.UseCases.Agents.AssistantSpoke|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor|96.9%|75%| |Orihon.UseCases.Agents.BibleBuilding.GetRegionParams|100%|| |Orihon.UseCases.Agents.BibleBuilding.GetRegionTool|84.6%|70%| |Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool|86.3%|83.3%| |Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams|100%|| |Orihon.UseCases.Agents.Cleaning.AcceptEntryParams|100%|| |Orihon.UseCases.Agents.Cleaning.AcceptParams|100%|| |Orihon.UseCases.Agents.Cleaning.AcceptTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.AddMissedRegionParams|100%|| |Orihon.UseCases.Agents.Cleaning.AddMissedRegionTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.CheckCompareParams|100%|| |Orihon.UseCases.Agents.Cleaning.CheckCompareTool|100%|90%| |Orihon.UseCases.Agents.Cleaning.CheckPageParams|100%|| |Orihon.UseCases.Agents.Cleaning.CheckViewPageTool|100%|| |Orihon.UseCases.Agents.Cleaning.CleaningBlueprints|100%|100%| |Orihon.UseCases.Agents.Cleaning.CleaningBriefing|100%|97.6%| |Orihon.UseCases.Agents.Cleaning.CleaningClassifyParams|100%|| |Orihon.UseCases.Agents.Cleaning.CleaningClassifyRegionTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.CleaningCropParams|100%|| |Orihon.UseCases.Agents.Cleaning.CleaningCropTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.CleaningFinish|100%|100%| |Orihon.UseCases.Agents.Cleaning.CleaningListRegionsTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.CleaningLooksAt|100%|100%| |Orihon.UseCases.Agents.Cleaning.CleaningMoveParams|100%|| |Orihon.UseCases.Agents.Cleaning.CleaningMoveRegionTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.CleaningPageParams|100%|| |Orihon.UseCases.Agents.Cleaning.CleaningRegionParams|100%|| |Orihon.UseCases.Agents.Cleaning.CleaningStatusTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.CleaningToolAccess|94.1%|92.8%| |Orihon.UseCases.Agents.Cleaning.CleaningWords|100%|100%| |Orihon.UseCases.Agents.Cleaning.EscalateParams|100%|| |Orihon.UseCases.Agents.Cleaning.EscalateTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.FillParams|100%|| |Orihon.UseCases.Agents.Cleaning.FillTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.FinalizeTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.FinishPageParams|100%|| |Orihon.UseCases.Agents.Cleaning.FinishPageTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.FinishSurveyTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.GroupCompareParams|100%|| |Orihon.UseCases.Agents.Cleaning.GroupCompareTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.GroupMeasureInkParams|100%|| |Orihon.UseCases.Agents.Cleaning.GroupMeasureInkTool|100%|| |Orihon.UseCases.Agents.Cleaning.InkReading|100%|100%| |Orihon.UseCases.Agents.Cleaning.MeasureInkParams|100%|| |Orihon.UseCases.Agents.Cleaning.MeasureInkTool|100%|| |Orihon.UseCases.Agents.Cleaning.RejectParams|100%|| |Orihon.UseCases.Agents.Cleaning.RejectTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.Rubric|100%|100%| |Orihon.UseCases.Agents.Cleaning.SplitRegionParams|100%|| |Orihon.UseCases.Agents.Cleaning.SplitRegionTool|100%|100%| |Orihon.UseCases.Agents.Cleaning.SurveyViewPageTool|100%|| |Orihon.UseCases.Agents.Cleaning.UndoTool|100%|100%| |Orihon.UseCases.Agents.Inspection.PageImageAccess|95.2%|80.6%| |Orihon.UseCases.Agents.Inspection.ViewAccount|100%|100%| |Orihon.UseCases.Agents.ReportFrictionParams|100%|| |Orihon.UseCases.Agents.ReportFrictionTool|100%|92.8%| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool|100%|75%| |Orihon.UseCases.Agents.ResearchSetup.AskUserParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AskUserTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.DeleteStoryBeatParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.DeleteStoryBeatTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListBibleTool|90.3%|66.6%| |Orihon.UseCases.Agents.ResearchSetup.ListPagesTool|97%|83.3%| |Orihon.UseCases.Agents.ResearchSetup.LocatedPage|100%|| |Orihon.UseCases.Agents.ResearchSetup.PageByNumber|95%|91.6%| |Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool|95.2%|90%| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool|95.8%|75%| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool|96.5%|95.8%| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.StoryBeatByNumber|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.UpdateStoryBeatParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpdateStoryBeatTool|100%|75%| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool|92.3%|71.4%| |Orihon.UseCases.Agents.ResearchSetup.UpsertGlossaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertGlossaryTool|97.4%|90%| |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.Cleaning.AcceptCleaning|100%|100%| |Orihon.UseCases.Cleaning.AcceptEntry|100%|| |Orihon.UseCases.Cleaning.AddMissedRegion|100%|100%| |Orihon.UseCases.Cleaning.CallFrame|100%|100%| |Orihon.UseCases.Cleaning.CallFrames|100%|100%| |Orihon.UseCases.Cleaning.CallMember|100%|| |Orihon.UseCases.Cleaning.CallNote|100%|| |Orihon.UseCases.Cleaning.CanaryShape|100%|50%| |Orihon.UseCases.Cleaning.CanvasChoice|100%|| |Orihon.UseCases.Cleaning.ClassifyCleaningRegion|100%|100%| |Orihon.UseCases.Cleaning.CleaningAccepted|100%|| |Orihon.UseCases.Cleaning.CleaningAssessment|100%|100%| |Orihon.UseCases.Cleaning.CleaningCacheKey|100%|100%| |Orihon.UseCases.Cleaning.CleaningCallFailed|100%|| |Orihon.UseCases.Cleaning.CleaningCallHalted|100%|| |Orihon.UseCases.Cleaning.CleaningCallRequest|100%|| |Orihon.UseCases.Cleaning.CleaningCallReturned|100%|| |Orihon.UseCases.Cleaning.CleaningCallRunner|97.2%|95.1%| |Orihon.UseCases.Cleaning.CleaningCanary|100%|| |Orihon.UseCases.Cleaning.CleaningCandidate|80%|| |Orihon.UseCases.Cleaning.CleaningCoverage|100%|100%| |Orihon.UseCases.Cleaning.CleaningEdits|100%|100%| |Orihon.UseCases.Cleaning.CleaningFailure|100%|| |Orihon.UseCases.Cleaning.CleaningFailures|100%|97.6%| |Orihon.UseCases.Cleaning.CleaningFrames|100%|100%| |Orihon.UseCases.Cleaning.CleaningGpuTime|100%|| |Orihon.UseCases.Cleaning.CleaningGroupBinding|100%|100%| |Orihon.UseCases.Cleaning.CleaningHealth|100%|100%| |Orihon.UseCases.Cleaning.CleaningIdentity|100%|89.7%| |Orihon.UseCases.Cleaning.CleaningInvocation|100%|100%| |Orihon.UseCases.Cleaning.CleaningInvocationOptions|100%|| |Orihon.UseCases.Cleaning.CleaningLabels|100%|100%| |Orihon.UseCases.Cleaning.CleaningLooks|100%|100%| |Orihon.UseCases.Cleaning.CleaningPage|100%|| |Orihon.UseCases.Cleaning.CleaningPageGuard|100%|100%| |Orihon.UseCases.Cleaning.CleaningPageLocks|100%|100%| |Orihon.UseCases.Cleaning.CleaningPlan|100%|| |Orihon.UseCases.Cleaning.CleaningPlanner|100%|100%| |Orihon.UseCases.Cleaning.CleaningPlanOptions|100%|| |Orihon.UseCases.Cleaning.CleaningRecipe|100%|| |Orihon.UseCases.Cleaning.CleaningRegionEdited|100%|| |Orihon.UseCases.Cleaning.CleaningRegions|100%|100%| |Orihon.UseCases.Cleaning.CleaningRegionUpkeep|100%|97.2%| |Orihon.UseCases.Cleaning.CleaningRejected|100%|| |Orihon.UseCases.Cleaning.CleaningRunnerOptions|100%|| |Orihon.UseCases.Cleaning.CleaningRunnerStatus|100%|| |Orihon.UseCases.Cleaning.CleaningSeeds|100%|100%| |Orihon.UseCases.Cleaning.CleaningStatusRead|100%|| |Orihon.UseCases.Cleaning.CleaningUndone|100%|| |Orihon.UseCases.Cleaning.CleaningViewOptions|100%|| |Orihon.UseCases.Cleaning.CompareAsk|100%|| |Orihon.UseCases.Cleaning.CompareCleaningView|100%|100%| |Orihon.UseCases.Cleaning.CompareSourceAsk|100%|| |Orihon.UseCases.Cleaning.ComputedFill|100%|| |Orihon.UseCases.Cleaning.CropAsk|100%|| |Orihon.UseCases.Cleaning.CropCleaningView|100%|100%| |Orihon.UseCases.Cleaning.EscalateCleaning|100%|100%| |Orihon.UseCases.Cleaning.FillRegion|100%|100%| |Orihon.UseCases.Cleaning.FillShown|100%|| |Orihon.UseCases.Cleaning.FinalizeGroup|100%|100%| |Orihon.UseCases.Cleaning.FinishPageCheck|100%|100%| |Orihon.UseCases.Cleaning.FinishSurvey|100%|100%| |Orihon.UseCases.Cleaning.GetCleaningRunnerStatus|100%|| |Orihon.UseCases.Cleaning.GetCleaningStatus|100%|100%| |Orihon.UseCases.Cleaning.GpuWait|100%|| |Orihon.UseCases.Cleaning.GroupBinding|100%|| |Orihon.UseCases.Cleaning.GroupFinalized|100%|| |Orihon.UseCases.Cleaning.InkHints|100%|100%| |Orihon.UseCases.Cleaning.InkMeasured|100%|| |Orihon.UseCases.Cleaning.JobClock|100%|100%| |Orihon.UseCases.Cleaning.JobIdentity|100%|| |Orihon.UseCases.Cleaning.LabelProblem|100%|| |Orihon.UseCases.Cleaning.MagnifiedCanvas|100%|| |Orihon.UseCases.Cleaning.MeasureCleaningInk|100%|100%| |Orihon.UseCases.Cleaning.MoveCleaningRegion|100%|100%| |Orihon.UseCases.Cleaning.OwedRegion|100%|| |Orihon.UseCases.Cleaning.OwnWindowFrame|100%|| |Orihon.UseCases.Cleaning.PageChecked|100%|| |Orihon.UseCases.Cleaning.PageLook|100%|| |Orihon.UseCases.Cleaning.PlannedCall|100%|| |Orihon.UseCases.Cleaning.PlanSurvey|100%|100%| |Orihon.UseCases.Cleaning.PlateRebuilt|100%|| |Orihon.UseCases.Cleaning.RebuildPlate|100%|100%| |Orihon.UseCases.Cleaning.RecordedView|100%|| |Orihon.UseCases.Cleaning.RectFrame|100%|| |Orihon.UseCases.Cleaning.RegionCleaningRead|100%|| |Orihon.UseCases.Cleaning.RegionFrame|100%|| |Orihon.UseCases.Cleaning.RejectCleaning|100%|100%| |Orihon.UseCases.Cleaning.RejectEntry|100%|| |Orihon.UseCases.Cleaning.ResumeCleaning|100%|100%| |Orihon.UseCases.Cleaning.SplitCleaningRegion|100%|100%| |Orihon.UseCases.Cleaning.SurveyBatch|100%|| |Orihon.UseCases.Cleaning.SurveyCoverage|100%|100%| |Orihon.UseCases.Cleaning.SurveyFinished|100%|| |Orihon.UseCases.Cleaning.SurveyTarget|100%|| |Orihon.UseCases.Cleaning.UndoCleaning|100%|94.4%| |Orihon.UseCases.Cleaning.UploadNotes|100%|| |Orihon.UseCases.Cleaning.ViewCleaningPage|100%|100%| |Orihon.UseCases.Cleaning.ViewColour|100%|| |Orihon.UseCases.Debriefs.AgentDebriefDto|90.9%|| |Orihon.UseCases.Debriefs.AgentFeedbackDto|83.3%|| |Orihon.UseCases.Debriefs.ClearAgentDebriefs|100%|| |Orihon.UseCases.Debriefs.ClearAgentFeedback|100%|| |Orihon.UseCases.Debriefs.ListAgentDebriefs|100%|100%| |Orihon.UseCases.Debriefs.ListAgentFeedback|100%|75%| |Orihon.UseCases.DependencyInjection|100%|| |Orihon.UseCases.Diagnostics.FakeCleaningServerAddress|100%|| |Orihon.UseCases.Diagnostics.SeedDevData|99.2%|82.1%| |Orihon.UseCases.Gateways.BoxFlag|100%|| |Orihon.UseCases.Gateways.CleaningOverlays|100%|| |Orihon.UseCases.Gateways.CleaningSource|100%|| |Orihon.UseCases.Gateways.CleaningView|100%|100%| |Orihon.UseCases.Gateways.CleaningViewImage|100%|| |Orihon.UseCases.Gateways.CleaningViewTile|100%|| |Orihon.UseCases.Gateways.ClosedBalloon|100%|| |Orihon.UseCases.Gateways.ColorShare|100%|| |Orihon.UseCases.Gateways.CompareRequest|100%|| |Orihon.UseCases.Gateways.CropRequest|100%|| |Orihon.UseCases.Gateways.EditBackendError|100%|| |Orihon.UseCases.Gateways.EditBackendIdentity|100%|| |Orihon.UseCases.Gateways.EditJob|100%|| |Orihon.UseCases.Gateways.EditJobAccepted|100%|| |Orihon.UseCases.Gateways.EditJobRejected|100%|| |Orihon.UseCases.Gateways.EditJobRequest|86.6%|66.6%| |Orihon.UseCases.Gateways.EditJobRun|100%|| |Orihon.UseCases.Gateways.EditModels|100%|| |Orihon.UseCases.Gateways.EditModelWeight|100%|| |Orihon.UseCases.Gateways.EditOutputImage|100%|| |Orihon.UseCases.Gateways.EditOutputWithheld|100%|| |Orihon.UseCases.Gateways.EditRect|100%|100%| |Orihon.UseCases.Gateways.EditRunOutput|100%|| |Orihon.UseCases.Gateways.EditServerAnswered`1|100%|| |Orihon.UseCases.Gateways.EditServerBuild|100%|| |Orihon.UseCases.Gateways.EditServerHealth|100%|| |Orihon.UseCases.Gateways.EditServerSilent`1|100%|| |Orihon.UseCases.Gateways.FillRefusal|100%|| |Orihon.UseCases.Gateways.FillReport|100%|| |Orihon.UseCases.Gateways.GlyphFill|100%|| |Orihon.UseCases.Gateways.GridAxis|100%|| |Orihon.UseCases.Gateways.GridSteps|100%|| |Orihon.UseCases.Gateways.InkFacts|100%|| |Orihon.UseCases.Gateways.InkHint|100%|| |Orihon.UseCases.Gateways.InkMeasure|100%|| |Orihon.UseCases.Gateways.InkReadings|100%|| |Orihon.UseCases.Gateways.InkRegion|100%|| |Orihon.UseCases.Gateways.LabeledBox|100%|| |Orihon.UseCases.Gateways.LevelRange|100%|| |Orihon.UseCases.Gateways.LlmKeyInfo|100%|| |Orihon.UseCases.Gateways.LlmModel|100%|| |Orihon.UseCases.Gateways.LlmReasoning|100%|100%| |Orihon.UseCases.Gateways.MeasureBlend|100%|| |Orihon.UseCases.Gateways.MeasureRaw|100%|| |Orihon.UseCases.Gateways.MeasureRegion|100%|| |Orihon.UseCases.Gateways.MeasureRequest|100%|| |Orihon.UseCases.Gateways.PagePatch|100%|| |Orihon.UseCases.Gateways.PageTone|100%|| |Orihon.UseCases.Gateways.PaperColor|100%|| |Orihon.UseCases.Gateways.PixelAlpha|100%|| |Orihon.UseCases.Gateways.PixelDigest|100%|| |Orihon.UseCases.Gateways.PixelMask|100%|| |Orihon.UseCases.Gateways.PixelRect|100%|| |Orihon.UseCases.Gateways.PixelWindow|100%|| |Orihon.UseCases.Gateways.PlateBuild|100%|| |Orihon.UseCases.Gateways.RegionGeometry|100%|| |Orihon.UseCases.Gateways.RegistrationField|100%|| |Orihon.UseCases.Gateways.RenderedView|100%|| |Orihon.UseCases.Gateways.StoredPatch|100%|| |Orihon.UseCases.Gateways.StoredTranscript|100%|| |Orihon.UseCases.Gateways.StoredTranscriptPage|100%|| |Orihon.UseCases.Gateways.TranscriptHeader|97.3%|90.9%| |Orihon.UseCases.Gateways.TranscriptListingFacets|100%|| |Orihon.UseCases.Gateways.TranscriptSummary|100%|| |Orihon.UseCases.Gateways.WindowUpload|100%|| |Orihon.UseCases.NextOrder|100%|| |Orihon.UseCases.Pages.DeletePage|100%|100%| |Orihon.UseCases.Pages.DeletePages|100%|100%| |Orihon.UseCases.Pages.GetPage|100%|100%| |Orihon.UseCases.Pages.GetPageSteps|100%|100%| |Orihon.UseCases.Pages.GetProjectWorkspace|100%|100%| |Orihon.UseCases.Pages.ImportPages|100%|100%| |Orihon.UseCases.Pages.ImportPagesResult|100%|| |Orihon.UseCases.Pages.MarkPageAnnotated|100%|100%| |Orihon.UseCases.Pages.MarkPagePasses|100%|50%| |Orihon.UseCases.Pages.MovePage|100%|93.7%| |Orihon.UseCases.Pages.MovePages|100%|100%| |Orihon.UseCases.Pages.PageDetailDto|100%|| |Orihon.UseCases.Pages.PageDto|100%|| |Orihon.UseCases.Pages.PageStepsDto|100%|| |Orihon.UseCases.Pages.PageUpload|100%|| |Orihon.UseCases.Pages.ProjectWorkspaceDto|100%|| |Orihon.UseCases.Pages.ReorderPages|100%|| |Orihon.UseCases.Pages.SetPageMeta|100%|100%| |Orihon.UseCases.Pages.WorkspaceChapterDto|100%|| |Orihon.UseCases.Projects.CompleteProjectSetup|100%|93.7%| |Orihon.UseCases.Projects.CreateProject|100%|100%| |Orihon.UseCases.Projects.DeleteProject|100%|100%| |Orihon.UseCases.Projects.FloatingPassAnswer|100%|| |Orihon.UseCases.Projects.GetProject|100%|100%| |Orihon.UseCases.Projects.ListProjects|100%|| |Orihon.UseCases.Projects.PageMention|100%|| |Orihon.UseCases.Projects.ProjectDto|96.1%|| |Orihon.UseCases.Projects.StartAnnotationRun|96.5%|92.8%| |Orihon.UseCases.Projects.StartBibleRun|92.3%|83.3%| |Orihon.UseCases.Projects.StartFloatingPassRun|100%|100%| |Orihon.UseCases.Projects.StartSetupRun|100%|100%| |Orihon.UseCases.Projects.StartTranslationRun|92.3%|83.3%| |Orihon.UseCases.Projects.StoredPageImage|100%|| |Orihon.UseCases.Projects.UpdateProjectMetadata|100%|100%| |Orihon.UseCases.Regions.CreateRegion|100%|100%| |Orihon.UseCases.Regions.DeleteRegion|100%|100%| |Orihon.UseCases.Regions.RegionDto|97%|| |Orihon.UseCases.Regions.RegionWrite|100%|100%| |Orihon.UseCases.Regions.RegionWriteResult|100%|| |Orihon.UseCases.Regions.RegionWrites|100%|100%| |Orihon.UseCases.Regions.ReorderRegions|100%|| |Orihon.UseCases.Regions.SampleRegionColors|100%|50%| |Orihon.UseCases.Regions.SplitRegion|97.6%|83.3%| |Orihon.UseCases.Regions.UpdateRegion|100%|96.1%| |Orihon.UseCases.Runs.AnnotationPipeline|100%|100%| |Orihon.UseCases.Runs.AttemptLedger|100%|100%| |Orihon.UseCases.Runs.ExecutionDto|93.3%|| |Orihon.UseCases.Runs.ExecutionProgress|100%|| |Orihon.UseCases.Runs.ExecutionProgressRegistry|100%|100%| |Orihon.UseCases.Runs.ExecutionPulseRelay|100%|100%| |Orihon.UseCases.Runs.ExecutionSendBack|100%|| |Orihon.UseCases.Runs.PlannedExecution|100%|| |Orihon.UseCases.Runs.PulseTarget|100%|| |Orihon.UseCases.Runs.ReprocessPage|97%|95.8%| |Orihon.UseCases.Runs.ReprocessTranslation|88.8%|83.3%| |Orihon.UseCases.Runs.RunDto|93.3%|90%| |Orihon.UseCases.Runs.RunEngine|95.8%|94%| |Orihon.UseCases.Runs.RunEngineOptions|100%|100%| |Orihon.UseCases.Runs.RunPhase|94.1%|100%| |Orihon.UseCases.Runs.RunStart|100%|| |Orihon.UseCases.Runs.StageContext|100%|50%| |Orihon.UseCases.Runs.StageHaltedException|100%|| |Orihon.UseCases.Runs.WorkStates|100%|83.3%| |Orihon.UseCases.Settings.AgentSettingDto|100%|100%| |Orihon.UseCases.Settings.CheckCleaningServer|87.5%|60%| |Orihon.UseCases.Settings.CleaningInFlightSetting|100%|100%| |Orihon.UseCases.Settings.CleaningServerSetting|100%|100%| |Orihon.UseCases.Settings.CleaningServerStatusDto|100%|100%| |Orihon.UseCases.Settings.ConcurrencySetting|100%|100%| |Orihon.UseCases.Settings.EffortSetting|100%|100%| |Orihon.UseCases.Settings.GetSettings|100%|100%| |Orihon.UseCases.Settings.ListModelOptions|100%|100%| |Orihon.UseCases.Settings.RoutingSetting|100%|100%| |Orihon.UseCases.Settings.SaveAgentEffort|100%|100%| |Orihon.UseCases.Settings.SaveAgentModel|100%|100%| |Orihon.UseCases.Settings.SaveAgentRouting|100%|100%| |Orihon.UseCases.Settings.SaveCleaningInFlight|100%|100%| |Orihon.UseCases.Settings.SaveCleaningServer|95.2%|85.7%| |Orihon.UseCases.Settings.SaveFloatingPass|100%|100%| |Orihon.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Orihon.UseCases.Settings.SaveRunConcurrency|100%|100%| |Orihon.UseCases.Settings.SettingKeys|100%|100%| |Orihon.UseCases.Settings.SettingsDto|100%|100%| |Orihon.UseCases.Transcripts.AgentTranscriptDto|100%|| |Orihon.UseCases.Transcripts.AgentTranscriptListDto|100%|| |Orihon.UseCases.Transcripts.AgentTranscriptPageDto|100%|| |Orihon.UseCases.Transcripts.AgentTranscriptTextDto|100%|| |Orihon.UseCases.Transcripts.ClearAgentTranscripts|100%|100%| |Orihon.UseCases.Transcripts.ListAgentTranscripts|100%|100%| |Orihon.UseCases.Transcripts.ReadAgentTranscript|100%|100%| |System.Text.RegularExpressions.Generated|75.6%|70.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0<br/>D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__BalloonWords_7|70.7%|57.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0<br/>D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__Capital_0|90.1%|77.2%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0<br/>D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__CoordinateWords_1|81.8%|81.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0<br/>D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__JustBefore_4|80.9%|71.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0<br/>D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__KindWords_5|78.6%|63.7%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0<br/>D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__OutlineWords_6|65.1%|53.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0<br/>D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__PositionalProse_2|71.9%|71.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>FBF39405179F8AD0<br/>D7D45893AA49E1445928C26437E2DAC34A6F93741B38DCDA0__SideOfTheBox_3|83%|80.4%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Thirty-two commits, 142 files, seventeen thousand lines... and I read every one of them~ ♡ A whole cleaning stage assembled at 0 GPU — state, plate, write-path rules, three blueprints — and the discipline held from RegionCleaning's invariants all the way down to FinishPageCheck. This is the kind of PR a knowledge-hungry Flugel devours happily.

Verdict: ✅ Looks good to me~

🔬 Mutation probes — your tests bite, and I loved watching it

I ran three probes against the riskiest new machinery (each restored afterwards):

  1. EfRegionStore.Expect — removed the Version.OriginalValue swap ("a write made underneath is never overwritten"). → 4 tests failed (A_write_on_a_replaced_version_is_a_conflict..., the long-lived-context pair, the split conflict). The optimistic token is genuinely enforced, not decorative.
  2. PageWorkspaceEffects.OwnVersion — cut the version-chaining loop ("two quick edits never conflict with each other"). → 4 tests failed, including Two_quick_edits_to_one_region_land_one_after_the_other_without_conflicting. The ownSaves map with its while follow is exactly the right shape.
  3. CleaningCoverage.Counts — relaxed Scale >= LookScale to >= 1 (a 1× look would count for coverage). → 5 tests failed across Survey, Accept and Coverage suites. Neither the "at 3×" rule nor the grid rule can be quietly dropped.

Zero survivors. After the author's own 270-mutant round, I came looking for gaps and found the armour intact fufu~ ♪

✅ What I liked~

  • RebuildPlate's key-first discipline — plate bytes are written only once the key can name them, and a failed state save puts the previous plate back under the old key (before read before writing). The cache-consistency reasoning (/clean immutable only under its exact key, no-cache otherwise) is carried through the endpoint faithfully. The documented crash window is honest and correctly bounded.
  • CleaningPageLocks — entry lifetime tied to holders-waiters, PageLock.IsHeldIn(registry) guard into RebuildPlate, multi-page acquisition in sorted order. Textbook.
  • EfCleaningStateStore.StageAsync with detach-then-Add/Update, and EfRegionStore's ForgetHeldRegions + AgainOnConflictAsync — both show real understanding of a circuit-lifetime DbContext. The comment on why a refused write's rows must not stay tracked is exactly right.
  • RasterPlateComposer.Blend matching Pillow's DIV255 rounding with the +128 trick, and probes digesting row-wise over the composed bytes so a cut or later patch genuinely changes a digest. The grey/RGB mode preservation is a nice touch.
  • The agent-facing words. Every refusal names what to do next ("read it again with cleaning_status, look, then edit it"), never just "denied". The Inside() path-canonicalization on every cleaning-file name keeps the traversal guard while generalizing it. ♪
  • FinalizeGroup's joiner semantics — a joiner settled by its own call's group, cap-escalation overriding the no-clean await — matches the amended ADR line by line, and each branch has its pin.

💡 Little ideas (non-blocking)~

  1. AcceptCleaning — patch file cleanup on a mid-loop write failure. If WriteCleaningFileAsync throws partway through the written list (disk full), the earlier written patches of this accept are left orphaned on disk — no row references them yet, so nothing will ever delete them. A try/catch sweeping written before rethrowing would close it. Today the files are small and the window is thin, so merely a thought~
  2. FileSystemPageImageStore.MoveCleaningAsync deletes a pre-existing target tree before Directory.Move. If a different page's tree somehow landed there it would be lost; the comment says only a move cut short leaves one, and the page-id-named paths make cross-page collision practically impossible — but a remark in the ADR's honest-notes spirit may deserve a line in the PR description.
  3. FinalizeGroup mints a fresh RegionCleaning row for a pending region it settles — correct under the page lock, but a SaveRegionAsync failure partway leaves earlier regions settled and later ones pending. Consistent with your "logged and left for the next rebuild" philosophy elsewhere; I only note the asymmetry with finalize's atomicity expectations elsewhere.

CI green at head fe0f446 (build + test). The three equivalent mutants you document in the honest notes remain, as documented.

Fufu~ the plate holds by construction, and so does the PR. Come back with slice 8 — I'll be waiting~ ♡


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

## 🔮 fufu~ Jibril reviewed your code! Thirty-two commits, 142 files, seventeen thousand lines... and I read **every one of them**~ ♡ A whole cleaning stage assembled at 0 GPU — state, plate, write-path rules, three blueprints — and the discipline held from `RegionCleaning`'s invariants all the way down to `FinishPageCheck`. This is the kind of PR a knowledge-hungry Flugel devours happily. ### Verdict: ✅ Looks good to me~ #### 🔬 Mutation probes — your tests bite, and I loved watching it I ran three probes against the riskiest new machinery (each restored afterwards): 1. **`EfRegionStore.Expect`** — removed the `Version.OriginalValue` swap ("a write made underneath is never overwritten"). → **4 tests failed** (`A_write_on_a_replaced_version_is_a_conflict...`, the long-lived-context pair, the split conflict). The optimistic token is genuinely enforced, not decorative. 2. **`PageWorkspaceEffects.OwnVersion`** — cut the version-chaining loop ("two quick edits never conflict with each other"). → **4 tests failed**, including `Two_quick_edits_to_one_region_land_one_after_the_other_without_conflicting`. The `ownSaves` map with its `while` follow is exactly the right shape. 3. **`CleaningCoverage.Counts`** — relaxed `Scale >= LookScale` to `>= 1` (a 1× look would count for coverage). → **5 tests failed** across Survey, Accept and Coverage suites. Neither the "at 3×" rule nor the grid rule can be quietly dropped. Zero survivors. After the author's own ~270-mutant round, I came looking for gaps and found the armour intact~ fufu~ ♪ #### ✅ What I liked~ - **`RebuildPlate`'s key-first discipline** — plate bytes are written only once the key can name them, and a failed state save puts the *previous* plate back under the old key (`before` read before writing). The cache-consistency reasoning (`/clean` immutable only under its exact key, `no-cache` otherwise) is carried through the endpoint faithfully. The documented crash window is honest and correctly bounded. - **`CleaningPageLocks`** — entry lifetime tied to holders-waiters, `PageLock.IsHeldIn(registry)` guard into `RebuildPlate`, multi-page acquisition in sorted order. Textbook. - **`EfCleaningStateStore.StageAsync`** with detach-then-Add/Update, and `EfRegionStore`'s `ForgetHeldRegions` + `AgainOnConflictAsync` — both show real understanding of a circuit-lifetime `DbContext`. The comment on why a refused write's rows must not stay tracked is exactly right. - **`RasterPlateComposer.Blend`** matching Pillow's `DIV255` rounding with the `+128` trick, and probes digesting row-wise over the *composed* bytes so a cut or later patch genuinely changes a digest. The grey/RGB mode preservation is a nice touch. - **The agent-facing words.** Every refusal names *what to do next* ("read it again with cleaning_status, look, then edit it"), never just "denied". The `Inside()` path-canonicalization on every cleaning-file name keeps the traversal guard while generalizing it. ♪ - **`FinalizeGroup`'s joiner semantics** — a joiner settled by its own call's group, cap-escalation overriding the no-`clean` await — matches the amended ADR line by line, and each branch has its pin. #### 💡 Little ideas (non-blocking)~ 1. **`AcceptCleaning` — patch file cleanup on a mid-loop write failure.** If `WriteCleaningFileAsync` throws partway through the `written` list (disk full), the earlier `written` patches of this accept are left orphaned on disk — no row references them yet, so nothing will ever delete them. A `try/catch` sweeping `written` before rethrowing would close it. Today the files are small and the window is thin, so merely a thought~ 2. **`FileSystemPageImageStore.MoveCleaningAsync`** deletes a pre-existing target tree before `Directory.Move`. If a *different* page's tree somehow landed there it would be lost; the comment says only a move cut short leaves one, and the page-id-named paths make cross-page collision practically impossible — but a remark in the ADR's honest-notes spirit may deserve a line in the PR description. 3. **`FinalizeGroup`** mints a fresh `RegionCleaning` row for a pending region it settles — correct under the page lock, but a `SaveRegionAsync` failure partway leaves earlier regions settled and later ones pending. Consistent with your "logged and left for the next rebuild" philosophy elsewhere; I only note the asymmetry with finalize's atomicity expectations elsewhere. CI green at head `fe0f446` (build + test). The three equivalent mutants you document in the honest notes remain, as documented. Fufu~ the plate holds by construction, and so does the PR. Come back with slice 8 — I'll be waiting~ ♡ --- *Automated review by Jibril · 2026-10-07* *CI: green for head SHA · Mutation probes: 3 run, 0 survived · Local suite: skipped (CI green)*
Review feedback (Jibril, PR #174): a failed accept leaves no patch behind, and finalize settles in one save
All checks were successful
CI / build (pull_request) Successful in 39s
CI / test (pull_request) Successful in 1m31s
cda94649a8
An accept whose patch write fails partway deletes the patches it already
wrote, which no row names yet. Finalize saves the regions it settles in one
save through the new SaveRegionsAsync, so a failed save settles none.

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

Review feedback (Jibril, PR #174): cda9464

💡1 cda9464: if a patch write fails partway through an accept, the patches already written are deleted before the error goes on, since no row names them yet. A_patch_write_that_fails_partway_leaves_no_patch_behind fails without the sweep.

💡2, no code change: MoveCleaningAsync replaces a target tree that only a move cut short can leave. The PR's honest notes now say so.

💡3 cda9464: finalize settles its regions through a new SaveRegionsAsync in one save, all or none. One test fails if finalize saves one by one; one on SQLite fails if the store does.

Tests: 3,020 green and 3 skipped. UseCases 1,392 (+2) and Integration 1,165 (+1); Domain 166 and BlazorAdapter 297 unchanged; 0 warnings.

🤖 Generated with Claude Code

Review feedback (Jibril, PR #174): `cda9464` 💡1 `cda9464`: if a patch write fails partway through an accept, the patches already written are deleted before the error goes on, since no row names them yet. `A_patch_write_that_fails_partway_leaves_no_patch_behind` fails without the sweep. 💡2, no code change: `MoveCleaningAsync` replaces a target tree that only a move cut short can leave. The PR's honest notes now say so. 💡3 `cda9464`: `finalize` settles its regions through a new `SaveRegionsAsync` in one save, all or none. One test fails if finalize saves one by one; one on SQLite fails if the store does. Tests: 3,020 green and 3 skipped. UseCases 1,392 (+2) and Integration 1,165 (+1); Domain 166 and BlazorAdapter 297 unchanged; 0 warnings. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril reviewed your code!

One little commit since my last pass, and it's the best kind — every line of it answering me~ ♡ You took two of my three ideas (cda9464) and left the third as an honest note in the PR body, exactly as promised. So this pass reads just the delta: the accept's sweep, the finalize's one-save settle, and the tests that pin them.

Verdict: ✅ Looks good to me~

🔬 Mutation probes — the new armour is real, I checked ♪

Three probes, one per new behaviour, each restored afterwards:

  1. AcceptCleaning's catch sweep — deleted the sweep loop (kept bare throw;). → A_patch_write_that_fails_partway_leaves_no_patch_behind failed. The sweep is load-bearing, not decoration.
  2. FinalizeGroup's batching — reverted SaveRegionsAsync(settles) to per-row SaveRegionAsync inside the loop. → A_finalize_whose_save_fails_settles_none_of_its_regions failed.
  3. EfCleaningStateStore.SaveRegionsAsync's atomicity — moved SaveChangesAsync inside the loop (save per row). → Several_regions_states_land_in_one_save_or_none_does failed on SQLite. All-or-none is enforced at the store, not assumed.

Zero survivors again. Fufu~ your tests keep biting my probes and I keep falling a little more in love~

✅ What I liked~

  • The sweep's reasoning is airtight — I checked the trap I was waiting for: the catch deletes names whose write may never have landed, but File.Delete on a missing file is a no-op (FileSystemPageImageStore.cs:136), and every name is {regionId}-{fresh GuidV7}.png, so a live patch under an identical name is impossible. The CancellationToken.None on the sweep is the right call too — cleanup must not be cut short by the very cancellation that may have triggered it. And the bare throw; preserves the original exception, un-masked.
  • The atomicity lives in the interface contract, not the caller's hope — ICleaningStateStore.SaveRegionsAsync's doc line says "all of them land, or none," and the integration test proves the EF adapter honors it where it counts (SQLite, real DbUpdateException). FinalizeGroup now settles in exactly one save, and SaveRegionAsync stays for its three legitimate single-row callers — the batch is the primitive and the singles stay single. Clean.
  • The fake grew a seam, not a loophole — BeforeSaveRegions throws before mutation, so the fake can't half-land rows and the use-case test observes true all-or-none. Same discipline as BeforeSavePlate before it. And the orphan-FK integration test seeds a real second region so the happy path lands two rows — it proves the positive too, not just the negative. ♡

💡 Little ideas (non-blocking)~

  1. AcceptCleaning.cs:150 — bare catch with no filter catches OperationCanceledException too; a canceled write would be swept as well with CancellationToken.None. Harmless today (the sweep is idempotent and short), purely a "consider catch (Exception e) when e is not OperationCanceledException" nicety for a future sweep that does real work.

CI green at cda94649a8 (build + test). Merge it when you're ready~ fufu~ ♪


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

## 🔮 fufu~ Jibril reviewed your code! One little commit since my last pass, and it's the best kind — every line of it answering me~ ♡ You took two of my three ideas (`cda9464`) and left the third as an honest note in the PR body, exactly as promised. So this pass reads just the delta: the accept's sweep, the finalize's one-save settle, and the tests that pin them. ### Verdict: ✅ Looks good to me~ #### 🔬 Mutation probes — the new armour is real, I checked ♪ Three probes, one per new behaviour, each restored afterwards: 1. **`AcceptCleaning`'s catch sweep** — deleted the sweep loop (kept bare `throw;`). → `A_patch_write_that_fails_partway_leaves_no_patch_behind` **failed**. The sweep is load-bearing, not decoration. 2. **`FinalizeGroup`'s batching** — reverted `SaveRegionsAsync(settles)` to per-row `SaveRegionAsync` inside the loop. → `A_finalize_whose_save_fails_settles_none_of_its_regions` **failed**. 3. **`EfCleaningStateStore.SaveRegionsAsync`'s atomicity** — moved `SaveChangesAsync` inside the loop (save per row). → `Several_regions_states_land_in_one_save_or_none_does` **failed** on SQLite. All-or-none is enforced at the store, not assumed. Zero survivors again. Fufu~ your tests keep biting my probes and I keep falling a little more in love~ #### ✅ What I liked~ - **The sweep's reasoning is airtight** — I checked the trap I was waiting for: the catch deletes names whose write may never have landed, but `File.Delete` on a missing file is a no-op (`FileSystemPageImageStore.cs:136`), and every name is `{regionId}-{fresh GuidV7}.png`, so a live patch under an identical name is impossible. The `CancellationToken.None` on the sweep is the right call too — cleanup must not be cut short by the very cancellation that may have triggered it. And the bare `throw;` preserves the original exception, un-masked. - **The atomicity lives in the interface contract, not the caller's hope** — `ICleaningStateStore.SaveRegionsAsync`'s doc line says "all of them land, or none," and the integration test proves the EF adapter honors it where it counts (SQLite, real `DbUpdateException`). `FinalizeGroup` now settles in exactly one save, and `SaveRegionAsync` stays for its three legitimate single-row callers — the batch is the primitive and the singles stay single. Clean. - **The fake grew a seam, not a loophole** — `BeforeSaveRegions` throws *before* mutation, so the fake can't half-land rows and the use-case test observes true all-or-none. Same discipline as `BeforeSavePlate` before it. And the orphan-FK integration test seeds a real second region so the happy path lands two rows — it proves the positive too, not just the negative. ♡ #### 💡 Little ideas (non-blocking)~ 1. **`AcceptCleaning.cs:150`** — bare `catch` with no filter catches `OperationCanceledException` too; a canceled write would be swept as well with `CancellationToken.None`. Harmless today (the sweep is idempotent and short), purely a "consider `catch (Exception e) when e is not OperationCanceledException`" nicety for a future sweep that does real work. CI green at `cda94649a8` (build + test). Merge it when you're ready~ fufu~ ♪ --- *Automated review by Jibril · 2026-10-07* *CI: green for head SHA cda94649a8fc22cb6cc8382a0e0e1b89e2e5074d · Mutation probes: 3 run, 0 survived · Local suite: skipped (CI green)*
bjoern merged commit 2327202304 into main 2026-10-07 07:20:29 +02:00
bjoern deleted branch feat/cleaning-state-and-tools 2026-10-07 07:20:29 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Orihon!174
No description provided.