feat: cleaning 6/12 — compare and measure: gridded views split not downscaled, ink hints, PNG pass-through #172

Merged
bjoern merged 16 commits from feat/cleaning-compare-and-measure into main 2026-10-06 14:25:03 +02:00
Member

This is slice 6 of Phase 5 in PROJECT_PLAN.md: ADR 0027's compare and crop views and measure_ink. The agent judges cleaning through these. The slice also adds the pass-through that sends a cleaning view to the model as its own PNG bytes. Nothing calls them yet: slice 7's use cases record the views and build the tools on them.

What's in

Views: ICleaningViews, with RasterCleaningViews.

  • A compare shows the original first, then each source, at one frame and one scale: 1× or the 3× preset.

    • A source is a PagePatch: image bytes plus the page rect they cover. So a fill patch over T + 6, a raw over its call's window or the plate all fit. A source at another size, such as a raw at canvas size, is resized with Pillow-parity Lanczos.
  • The page-pixel grid is always drawn. It tints every block's first image column and row on a multiple of the step: 20 page pixels at 3×, 50 at 1×, from cleaner.py's view().

  • Options:

    • a stretch of ±25 levels around the frame's paper;
    • a per-channel difference from the original, ×8 around mid-grey;
    • overlays of T, the model rects, the footprints (as masks) and the flags.

    Uncovered pixels are checkered. No text is drawn, so no pixel depends on a font.

  • Every image fits 2048 px a side and 4 MiB as PNG, and nothing is downscaled. The class doc gives the split order:

    • a frame too big for two tiles splits into equal parts, in raster order;
    • sources beyond one image's room go beside the original in another image;
    • an image over the byte cap is split again: first its sources (the first half taking the odd one), then its frame across the longer side.
  • The result states exactly what was delivered, which slice 7 records and computes the survey's coverage and accept's rule from:

    • the frame, the delivered scale, the grid step, the stretch and the diff gain;
    • for every image, its page rect and its tiles. Each tile gives its source, its corner, the page rect it shows, and whether it is a difference.

    One sentence states the frame and the scale.

  • The survey's crop is the same render for one page, with the grid on or off. CleaningFrames.Around ports _crop_box as a region's default frame, widened by its suggested box + 12 as view() does.

measure_ink: ICleaningMetrics, with RasterCleaningMetrics. Its hints never gate.

  • cleaner.py's _metrics, outline_guard, _edge_ink and ghost_score are ported with numpy's float32 arithmetic: ink left (n/a over textured ground), change, flatness, seam, outline lost and ghost.
  • ADR 0027's additions:
    • structure changed outside T: edges that moved more than one pixel outside T + 2;
    • a registration shift, from a 64-px tile field of the raw against the window outside the model rects;
    • a raw that came back RGB on an L upload, read with the pixel digest's own grey-PNG test.
  • The hints and their thresholds are UseCases policy (InkHints), and AnyHint says whether any fired, which later decides whether compare adds the raw.
  • A candidate is measured on its call's window. The blend and the raw must cover exactly that rect, or the request is refused. A fill is measured against the page.

Pass-through: AgentToolImage gains PassThrough, which only the cleaning views set. The adapter sends a flagged image as its own PNG and everything else through the JPEG re-encode, as before.

Shared code:

  • the constants are in a new CleaningViewOptions;
  • NumpyMath's pairwise sum is now generic over float64 and float32, so the float32 seam reuses the summation the oracle already pins;
  • SkiaPixelDigest's grey-PNG test is now internal.

Docs: ADR 0027 now says every cleaning view passes through, at 1× as at 3×.

Tests

2,398 green and 2 skipped, against 2,263 on main (+135). It was 2,396 at the first review, +2 in the review round:

Project Count Change
UseCases 950 +24
Integration 1,013 +111
Domain 144 unchanged
BlazorAdapter 291 unchanged

Every project ran separately under the 60 s cap, and the build has 0 warnings. What they pin:

  • Delivery. The image the adapter sends for a zoomed view has exactly frame × scale pixels, as its stated scale says. An annotation crop and a reading-size view still arrive as JPEG.

  • Views:

    • grid lines at their multiples, on every tile;
    • the stretch on an original that starts inside the page, the difference, every overlay and the checker;
    • splits by size and by bytes, each step of the split order pinned, with no image over 2048 px or 4 MiB;
    • the result's facts against the pixels.

    Pixel assertions sample only coordinates the layout guarantees.

  • Metrics parity. Cleaning/oracle/gen_metrics_oracle.py imports the lab's cleaner.py and writes ADR 0027's additions beside it. It covers 50 cases: 22 drawn pages and 28 pages that sit on a limit. These include the registration reach and slack, the structure step at 64 and 65, and the ghost guard either side of 1e-6. A rerun reproduces metrics.json byte for byte.

  • The options' defaults and the hints' thresholds are each pinned.

  • Mutation. Two independent reviews, mutation coverage and contract, then 51 more mutants on the fixes and 5 in the review round, each killed by its intended test.

Browser-verified

Nothing to verify in a browser: this slice has no UI, no seed change and no caller.

Honest notes

  • Every cleaning view passes through, at 1× as well as 3×. That keeps the recorded bytes the delivered ones, but a 1× PNG weighs more against slice 7's 16 MiB per-invocation cap than a JPEG would. The ADR now says so.
  • The registration shift is Orihon's own measure, not the lab's cv2.phaseCorrelate. The raster layer has no FFT, and parity must be exact. Its thresholds and the structure hint's are uncalibrated: a median of 3 px or more, 24 px, edge level 64 and 10 % slack. Real use will tell.
  • Slice 7 has decisions that this slice only exposes:
    • whether a difference tile counts as the candidate appearing beside the original, for accept's rule;
    • passing the whole page as the "before" of a fill, which this port cannot check;
    • the ADR 0016 window + margin clamp.
  • The 4 MiB cap counts PNG bytes. The base64 data URI the adapter sends is about a third larger, which is how the existing encoder's cap already counts.
  • Memory. A compare decodes every source in full: two 4000 × 6000 pages take about 140 MB while it runs.
  • The ghost guard's deviations are float64, where numpy's are float32. They differ within one rounding of 1e-6, and no drawable page separates them; the doc says so.
  • Merge. Slice 5 (#171) was built in parallel. At the first review's heads I merged both branches onto main together, and all four projects passed: 2,597 green and 3 skipped, exactly main plus each slice's additions.

🤖 Generated with Claude Code

This is slice 6 of Phase 5 in `PROJECT_PLAN.md`: ADR 0027's `compare` and `crop` views and `measure_ink`. The agent judges cleaning through these. The slice also adds the pass-through that sends a cleaning view to the model as its own PNG bytes. Nothing calls them yet: slice 7's use cases record the views and build the tools on them. ## What's in **Views: `ICleaningViews`, with `RasterCleaningViews`.** - **A compare** shows the original first, then each source, at one frame and one scale: 1× or the 3× preset. - A source is a `PagePatch`: image bytes plus the page rect they cover. So a fill patch over T + 6, a raw over its call's window or the plate all fit. A source at another size, such as a raw at canvas size, is resized with Pillow-parity Lanczos. - **The page-pixel grid is always drawn.** It tints every block's first image column and row on a multiple of the step: 20 page pixels at 3×, 50 at 1×, from `cleaner.py`'s `view()`. - **Options:** - a stretch of ±25 levels around the frame's paper; - a per-channel difference from the original, ×8 around mid-grey; - overlays of T, the model rects, the footprints (as masks) and the flags. Uncovered pixels are checkered. **No text is drawn,** so no pixel depends on a font. - **Every image fits 2048 px a side and 4 MiB as PNG, and nothing is downscaled.** The class doc gives the split order: - a frame too big for two tiles splits into equal parts, in raster order; - sources beyond one image's room go beside the original in another image; - an image over the byte cap is split again: first its sources (the first half taking the odd one), then its frame across the longer side. - **The result states exactly what was delivered**, which slice 7 records and computes the survey's coverage and accept's rule from: - the frame, the delivered scale, the grid step, the stretch and the diff gain; - for every image, its page rect and its tiles. Each tile gives its source, its corner, the page rect it shows, and whether it is a difference. One sentence states the frame and the scale. - **The survey's crop** is the same render for one page, with the grid on or off. `CleaningFrames.Around` ports `_crop_box` as a region's default frame, widened by its suggested box + 12 as `view()` does. **`measure_ink`: `ICleaningMetrics`, with `RasterCleaningMetrics`.** Its hints never gate. - `cleaner.py`'s `_metrics`, `outline_guard`, `_edge_ink` and `ghost_score` are ported with numpy's float32 arithmetic: ink left (n/a over textured ground), change, flatness, seam, outline lost and ghost. - ADR 0027's additions: - structure changed outside T: edges that moved more than one pixel outside T + 2; - a registration shift, from a 64-px tile field of the raw against the window outside the model rects; - a raw that came back RGB on an L upload, read with the pixel digest's own grey-PNG test. - The hints and their thresholds are UseCases policy (`InkHints`), and `AnyHint` says whether any fired, which later decides whether `compare` adds the raw. - A candidate is measured on its call's window. The blend and the raw must cover exactly that rect, or the request is refused. A fill is measured against the page. **Pass-through:** `AgentToolImage` gains `PassThrough`, which only the cleaning views set. The adapter sends a flagged image as its own PNG and everything else through the JPEG re-encode, as before. **Shared code:** - the constants are in a new `CleaningViewOptions`; - `NumpyMath`'s pairwise sum is now generic over float64 and float32, so the float32 seam reuses the summation the oracle already pins; - `SkiaPixelDigest`'s grey-PNG test is now internal. **Docs:** ADR 0027 now says every cleaning view passes through, at 1× as at 3×. ## Tests 2,398 green and 2 skipped, against 2,263 on main (+135). It was 2,396 at the first review, +2 in the review round: | Project | Count | Change | |---|---|---| | UseCases | 950 | +24 | | Integration | 1,013 | +111 | | Domain | 144 | unchanged | | BlazorAdapter | 291 | unchanged | Every project ran separately under the 60 s cap, and the build has 0 warnings. What they pin: - **Delivery.** The image the adapter sends for a zoomed view has exactly frame × scale pixels, as its stated scale says. An annotation crop and a reading-size view still arrive as JPEG. - **Views:** - grid lines at their multiples, on every tile; - the stretch on an original that starts inside the page, the difference, every overlay and the checker; - splits by size and by bytes, each step of the split order pinned, with no image over 2048 px or 4 MiB; - the result's facts against the pixels. Pixel assertions sample only coordinates the layout guarantees. - **Metrics parity.** `Cleaning/oracle/gen_metrics_oracle.py` imports the lab's `cleaner.py` and writes ADR 0027's additions beside it. It covers 50 cases: 22 drawn pages and 28 pages that sit on a limit. These include the registration reach and slack, the structure step at 64 and 65, and the ghost guard either side of 1e-6. A rerun reproduces `metrics.json` byte for byte. - **The options' defaults** and the hints' thresholds are each pinned. - **Mutation.** Two independent reviews, mutation coverage and contract, then 51 more mutants on the fixes and 5 in the review round, each killed by its intended test. ## Browser-verified Nothing to verify in a browser: this slice has no UI, no seed change and no caller. ## Honest notes - **Every cleaning view passes through, at 1× as well as 3×.** That keeps the recorded bytes the delivered ones, but a 1× PNG weighs more against slice 7's 16 MiB per-invocation cap than a JPEG would. The ADR now says so. - **The registration shift is Orihon's own measure, not the lab's `cv2.phaseCorrelate`.** The raster layer has no FFT, and parity must be exact. Its thresholds and the structure hint's are uncalibrated: a median of 3 px or more, 24 px, edge level 64 and 10 % slack. Real use will tell. - **Slice 7 has decisions that this slice only exposes:** - whether a difference tile counts as the candidate appearing beside the original, for accept's rule; - passing the whole page as the "before" of a fill, which this port cannot check; - the ADR 0016 window + margin clamp. - **The 4 MiB cap counts PNG bytes.** The base64 data URI the adapter sends is about a third larger, which is how the existing encoder's cap already counts. - **Memory.** A compare decodes every source in full: two 4000 × 6000 pages take about 140 MB while it runs. - **The ghost guard's deviations are float64, where numpy's are float32.** They differ within one rounding of 1e-6, and no drawable page separates them; the doc says so. - **Merge.** Slice 5 (#171) was built in parallel. At the first review's heads I merged both branches onto main together, and all four projects passed: 2,597 green and 3 skipped, exactly main plus each slice's additions. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The cleaning views of ADR 0027 behind a UseCases port speaking bytes and DTOs, on the managed raster
layer. A compare lays the original beside each source (current page, fill, candidates, raws) at one
frame and one scale, 1x or the 3x preset, always with the page-pixel grid; it offers a stretch around
the frame's paper, an amplified difference from the original, and overlays of T, the model rects, the
footprints and the flags. The survey's crop is the same render for one page.

Every image fits 2048 px a side and 4 MiB as PNG: a frame too big for its scale splits into equal
parts, sources beyond one image's room go beside the original in another, and an image over the byte
cap is split again, never downscaled. Nothing is text, so no pixel depends on a font; the view states
its frame, scale, grid, stretch, difference and every image's tiles as facts, and one sentence names
the frame and the scale.

AgentToolImage gains a pass-through flag, set only by these views: the adapter sends a flagged image as
its own PNG bytes, so the delivered scale is the stated one, and every other view still goes through
its JPEG re-encode. CleaningViewOptions holds the caps, the preset, the colours and the thresholds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The metrics of ADR 0021 and 0027 behind a UseCases port. A result (a fill patch, or a candidate
composited through its region's footprint) is measured against the page the call saw, whole or cut to
its window:
- cleaner.py's _metrics, outline_guard and ghost_score, ported in behaviour and arithmetic (float32
  where numpy's is): ink left, read as n/a over textured ground, the share changed, the paper's
  flatness, the seam in the blend band, and on bubbles the outline lost and the ghost score;
- ADR 0027's additions: edges moved outside T + 2 (structure changed), a tile field of the raw's shift
  against the window outside the model rects (registration), and the raw back in RGB on an L upload,
  read as the pixel digest reads a grey PNG.

The hints and their thresholds live in UseCases (InkHints over CleaningViewOptions); they never gate,
and the measure says whether any fired so the compare can add the raw. Frozen against
Cleaning/oracle/gen_metrics_oracle.py, which imports the lab's cleaner.py and writes ADR 0027's
additions beside it, on drawn pages; a rerun reproduces metrics.json byte for byte.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The oracle gains twelve drawn pages that sit exactly on one of the measures' limits: paper flat at
6.0, a glyph of 20 pixels, 5 ink pixels, lettering moved 24 levels, a blend band of exactly 20 with
alphas either side of its bounds and band levels inside T, a bare T beside an outline, 0.9 of T's ink
joined, 10 pixels of edge ink, the ghost score's 10 ink and 50 paper pixels and its flat blur, and a
tile of 32 edges. The views gain the byte cap at an image's own size, the grid step on its least gap,
a crop that fits one tile but not two, and the clamps and halfway rounding of the difference and the
stretch.

What no input can tell apart goes: the registration keeps only the shortest shift's length, the
port's T check relies on an empty box meeting nothing, the glyph split runs on no ink too, and the
ink share drops a zero guard its first tile never needs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The oracle gains pages with levels exactly 40 off the paper at each place the measures compare them
(an outline left at 40, a line at 40 that is not edge ink, a trace at 40 that is not paper, a pixel at
40 that is not ink) and steps of exactly 64 levels, which are no edges. Every case also measures
against a larger page with its patches over the window inside it, and reads the same.

The views gain a row of tiles that would pass the side cap by its gaps, sources parted in halves over
the byte cap, and a raw whose resize a single colour could not show.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The oracle gains pages that only numpy's own arithmetic reads right: a seam band whose float32 greys,
float32 mean and pairwise float32 sum each round apart from a float64 or running one, and lettering
over most of T, where the balloon's paper and T's dominant colour differ.

numpy's pairwise sum in the raster layer is now one generic implementation for float64 and float32,
so the float32 seam uses the summation the float64 oracle already pins rather than a copy of it. The
correlation drops numpy's clip to ±1, which three decimals never show, and a shape that runs past a
view's frame is checked to draw nothing beyond it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The stretch reads the paper of an original whose rect starts inside the page, a raw matching its rect on one
side only is resized on the other, a footprint with too many bits is refused as one with too few, the ink
share rounds a half up, a stacked tile checkers from its own corner, and a gap no step keeps takes the
largest.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A pass-through image skips the adapter's re-encode, so the 2048 px and 4 MiB defaults are the only bound on
what reaches the provider; they, the 3× preset, cleaner.py's grid gap and overlay colours, and the checker
are now asserted, with every drawn colour distinct.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The lab's padded boxes stop at the raster's edge, so a candidate measured against the whole page read past
its window wherever T came within seven pixels of it. A candidate's blend and raw must now cover exactly the
page before, its call's window; a fill is measured against the page. The larger-page parity variant, whose
claim held only by geometry, goes, and so do the offsets a window-sized blend and raw no longer have.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
New drawn pages put each of ADR 0027's registration and structure constants on its limit: a tile one edge
short, a line split across a square's edge, a shift of exactly the reach on a step of exactly 65, a cost
exactly at the slack and one past it, steps of 64 and 65 erased, and lines along the last column and row.
Two more put the blurred glyph's spread either side of the ghost's 1e-6 guard, and a bubble measured on a
window five pixels round T has the lab's padded boxes stop at the window's edge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
numpy's 1 / (n − 1) scale cancels in the correlation, as its clip to ±1 never shows at three decimals, so it
goes. The class claimed float32 wherever numpy's arithmetic is; the ghost's flat guard takes its deviations
in float64, which parts from numpy's only within a rounding of 1e-6, and its doc now says so.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
cleaner.py's view() widens _crop_box by the suggested box + 12, so the ink past T that a flag points at is in
view when the survey looks at the flagged region. The frame now takes the suggested box, null for none,
with the 12 px as an option.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
docs: cleaning 6/12 — every cleaning view passes through as PNG, at 1× as at 3×
All checks were successful
CI / build (pull_request) Successful in 34s
CI / test (pull_request) Successful in 1m17s
2942ba3cbe
The views adapter flags every cleaning crop and compare, so the recorded
bytes are always the delivered ones; ADR 0027 now says so.

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: 2942ba3 · Generated: 2026-10-06 11:14:00 UTC · Revision: #1

Summary

Summary
Generated on: 10/06/2026 - 11:13:59
Coverage date: 10/06/2026 - 11:13:21 - 10/06/2026 - 11:13:56
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 686
Files: 319
Line coverage: 97.4% (27714 of 28428)
Covered lines: 27714
Uncovered lines: 714
Coverable lines: 28428
Total lines: 49929
Branch coverage: 88.3% (5748 of 6509)
Covered branches: 5748
Total branches: 6509
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 95.8%
Name Line Branch
Orihon.BlazorAdapter 95.8% 89.2%
Orihon.BlazorAdapter.Bible.AddBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.AddCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.AddHouseRuleRowRequested 100%
Orihon.BlazorAdapter.Bible.AddLoreRowRequested 100%
Orihon.BlazorAdapter.Bible.BibleEffects 89.8% 76.9%
Orihon.BlazorAdapter.Bible.BibleLoaded 100%
Orihon.BlazorAdapter.Bible.BiblePage 92.3% 80.5%
Orihon.BlazorAdapter.Bible.BibleReducers 90.6%
Orihon.BlazorAdapter.Bible.BibleState 100%
Orihon.BlazorAdapter.Bible.BibleWriteFailed 100%
Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteHouseRuleRowRequested 0%
Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested 0%
Orihon.BlazorAdapter.Bible.LoadBible 100%
Orihon.BlazorAdapter.Bible.ReorderBeatsRequested 0%
Orihon.BlazorAdapter.Bible.SaveOverviewRequested 100%
Orihon.BlazorAdapter.Bible.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateHouseRuleRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested 100%
Orihon.BlazorAdapter.BlazorAdapterAssembly 100%
Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace 100%
Orihon.BlazorAdapter.PageWorkspace.PageStepsLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved 100%
Orihon.BlazorAdapter.PageWorkspace.PageViewport 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage 93.6% 87.6%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers 100% 64.2%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState 100%
Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed 100%
Orihon.BlazorAdapter.PageWorkspace.RegionColorsSampled 100%
Orihon.BlazorAdapter.PageWorkspace.RegionCreated 100%
Orihon.BlazorAdapter.PageWorkspace.RegionSaved 100%
Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SampleRegionColorsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested 100%
Orihon.BlazorAdapter.Projects.CreateProjectRequested 100%
Orihon.BlazorAdapter.Projects.DecideSetupContinuation 100%
Orihon.BlazorAdapter.Projects.DeleteProjectRequested 100%
Orihon.BlazorAdapter.Projects.FinishSetupRequested 100%
Orihon.BlazorAdapter.Projects.ImportPagesRequested 100%
Orihon.BlazorAdapter.Projects.LoadWizard 100%
Orihon.BlazorAdapter.Projects.PageOrganizer 96% 95%
Orihon.BlazorAdapter.Projects.PagesImported 100%
Orihon.BlazorAdapter.Projects.ProjectDeleteFailed 100%
Orihon.BlazorAdapter.Projects.ProjectListEffects 100% 100%
Orihon.BlazorAdapter.Projects.ProjectListPage 89.7% 91.6%
Orihon.BlazorAdapter.Projects.ProjectListReducers 100%
Orihon.BlazorAdapter.Projects.ProjectListState 100%
Orihon.BlazorAdapter.Projects.ProjectsLoaded 100%
Orihon.BlazorAdapter.Projects.ProjectWizardEffects 93.8% 90%
Orihon.BlazorAdapter.Projects.ProjectWizardPage 95.3% 84.1%
Orihon.BlazorAdapter.Projects.ProjectWizardReducers 100%
Orihon.BlazorAdapter.Projects.ProjectWizardState 100%
Orihon.BlazorAdapter.Projects.SetupChat 93.5% 100%
Orihon.BlazorAdapter.Projects.SetupChatEffects 100% 100%
Orihon.BlazorAdapter.Projects.SetupChatFailed 100%
Orihon.BlazorAdapter.Projects.SetupChatReducers 100%
Orihon.BlazorAdapter.Projects.SetupChatState 100%
Orihon.BlazorAdapter.Projects.SetupChatUpdated 100%
Orihon.BlazorAdapter.Projects.StartSetupChat 100%
Orihon.BlazorAdapter.Projects.SubmitSetupAnswer 100%
Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardLoaded 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested 100%
Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardWriteFailed 100%
Orihon.BlazorAdapter.Rulings.AcceptProposalRequested 100%
Orihon.BlazorAdapter.Rulings.AnsweredRuling 100%
Orihon.BlazorAdapter.Rulings.AnswerRulingRequested 100%
Orihon.BlazorAdapter.Rulings.DeclineProposalRequested 100%
Orihon.BlazorAdapter.Rulings.DismissRulingRequested 100%
Orihon.BlazorAdapter.Rulings.RulingBar 98.2% 94.6%
Orihon.BlazorAdapter.Rulings.RulingDeskBridge 94.2% 91.6%
Orihon.BlazorAdapter.Rulings.RulingsEffects 95.4% 83.3%
Orihon.BlazorAdapter.Rulings.RulingsLoaded 100%
Orihon.BlazorAdapter.Rulings.RulingsReducers 100%
Orihon.BlazorAdapter.Rulings.RulingsState 100%
Orihon.BlazorAdapter.Rulings.RulingWriteFailed 100%
Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested 100%
Orihon.BlazorAdapter.Runs.CancelMonitorRun 100%
Orihon.BlazorAdapter.Runs.MonitorPageRef 100%
Orihon.BlazorAdapter.Runs.MonitorRunLoaded 100%
Orihon.BlazorAdapter.Runs.RetryMonitorExecution 100%
Orihon.BlazorAdapter.Runs.RunChangedBridge 95% 92.8%
Orihon.BlazorAdapter.Runs.RunMonitor 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%
Orihon.Domain.Agents.AgentFeedback 100% 100%
Orihon.Domain.Agents.AgentRoster 100% 100%
Orihon.Domain.Bible.Character 100% 100%
Orihon.Domain.Bible.GlossaryEntry 100% 100%
Orihon.Domain.Bible.HouseRule 100%
Orihon.Domain.Bible.LoreEntry 100% 100%
Orihon.Domain.Bible.PageSummary 100%
Orihon.Domain.Bible.StoryBeat 100%
Orihon.Domain.Bible.StoryOverview 100%
Orihon.Domain.Cleaning.CleaningCall 100% 100%
Orihon.Domain.Cleaning.CleaningCallRect 100%
Orihon.Domain.Cleaning.CleaningCanvas 100%
Orihon.Domain.Cleaning.CleaningOutput 100% 100%
Orihon.Domain.Cleaning.CleaningServerIdentity 100%
Orihon.Domain.Cleaning.CleaningServerState 100% 100%
Orihon.Domain.Cleaning.CleaningWindow 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.6%
Name Line Branch
Orihon.Infrastructure 97.6% 85.3%
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.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.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.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 95.6% 92.6%
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.CleaningOutputConfiguratio
n
100%
Orihon.Infrastructure.Persistence.Configurations.CleaningServerStateConfigu
ration
100%
Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.HouseRuleConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper 100%
Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RunConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.StoryOverviewConfiguration 100%
Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Orihon.Infrastructure.Persistence.Migrations.AddAgentDebriefs 99.5%
Orihon.Infrastructure.Persistence.Migrations.AddAgentFeedback 99.5%
Orihon.Infrastructure.Persistence.Migrations.AddAppSettings 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddCleaningCallRunner 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddHouseRules 99.6%
Orihon.Infrastructure.Persistence.Migrations.AddPagePassFacts 99%
Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddRegionFitBoxDropFillHints 98.1%
Orihon.Infrastructure.Persistence.Migrations.AddRegionForm 99.4%
Orihon.Infrastructure.Persistence.Migrations.AddRegionInk 99.4%
Orihon.Infrastructure.Persistence.Migrations.AddRuns 99.1%
Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview 99.5%
Orihon.Infrastructure.Persistence.Migrations.DropRegionContainer 99.1%
Orihon.Infrastructure.Persistence.Migrations.DropRegionType 99%
Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain 97.3%
Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot 100%
Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns 97.2%
Orihon.Infrastructure.Persistence.Migrations.ReplaceFitBoxWithContainerSeed 99.2%
Orihon.Infrastructure.Persistence.OrihonDbContext 100%
Orihon.Infrastructure.Persistence.OrihonDbContextFactory 100%
Orihon.Infrastructure.Projects.EfProjectStore 100% 100%
Orihon.Infrastructure.Projects.FileSystemPageImageStore 100% 100%
Orihon.Infrastructure.Runs.EfRunStore 98.2% 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.6%
Name Line Branch
Orihon.Server 94.6% 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 95.7% 85.7%
Orihon.UseCases - 97.7%
Name Line Branch
Orihon.UseCases 97.7% 91.1%
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 100% 86.1%
Orihon.UseCases.Agents.Annotation.BboxCreationExecutor 90.4% 50%
Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor 96.5% 90%
Orihon.UseCases.Agents.Annotation.BoundBoxParams 100%
Orihon.UseCases.Agents.Annotation.BoundContactSheetTool 91.3% 75%
Orihon.UseCases.Agents.Annotation.BoundCropParams 100%
Orihon.UseCases.Agents.Annotation.BoundCropTool 100%
Orihon.UseCases.Agents.Annotation.BoundViewPageTool 93.1% 80%
Orihon.UseCases.Agents.Annotation.BoundViewParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.ColorReading 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionParams 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryParams 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryTool 88.2% 62.5%
Orihon.UseCases.Agents.Annotation.FloatingCreationExecutor 86.9% 50%
Orihon.UseCases.Agents.Annotation.FloatingQaExecutor 91.8% 78.5%
Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor 95.4% 75%
Orihon.UseCases.Agents.Annotation.ListRegionsTool 93.7% 80.7%
Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool 90.9% 50%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams 100%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool 95.8% 83.3%
Orihon.UseCases.Agents.Annotation.NoteRegionParams 100%
Orihon.UseCases.Agents.Annotation.NoteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.PageQaExecutor 92.5% 79.1%
Orihon.UseCases.Agents.Annotation.QaReportSink 100% 100%
Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess 89.4% 62.5%
Orihon.UseCases.Agents.Annotation.RegionBriefing 100% 96.1%
Orihon.UseCases.Agents.Annotation.RegionCropParams 100%
Orihon.UseCases.Agents.Annotation.RegionCropTool 100% 100%
Orihon.UseCases.Agents.Annotation.RegionProblemParams 100%
Orihon.UseCases.Agents.Annotation.RegionWindow 100% 100%
Orihon.UseCases.Agents.Annotation.RejectRegionParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.ReorderRegionParams 100%
Orihon.UseCases.Agents.Annotation.ReorderRegionTool 88% 60%
Orihon.UseCases.Agents.Annotation.ReportQaParams 100%
Orihon.UseCases.Agents.Annotation.ReportQaTool 97.8% 90%
Orihon.UseCases.Agents.Annotation.SampleColorsParams 100%
Orihon.UseCases.Agents.Annotation.SampleColorsTool 100% 100%
Orihon.UseCases.Agents.Annotation.SampleRegionColorsParams 100%
Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetInkParams 100%
Orihon.UseCases.Agents.Annotation.SetInkTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaParams 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaTool 100% 75%
Orihon.UseCases.Agents.Annotation.SetRegionInkParams 100%
Orihon.UseCases.Agents.Annotation.SetRegionInkTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionParams 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionTool 100% 100%
Orihon.UseCases.Agents.Annotation.TranscriptionExecutor 97.7% 94.4%
Orihon.UseCases.Agents.AssistantSpoke 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor 96.9% 75%
Orihon.UseCases.Agents.BibleBuilding.GetRegionParams 100%
Orihon.UseCases.Agents.BibleBuilding.GetRegionTool 84.6% 70%
Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool 86.3% 83.3%
Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams 100%
Orihon.UseCases.Agents.Inspection.PageImageAccess 95.2% 80.6%
Orihon.UseCases.Agents.Inspection.ViewAccount 100% 100%
Orihon.UseCases.Agents.ReportFrictionParams 100%
Orihon.UseCases.Agents.ReportFrictionTool 100% 92.8%
Orihon.UseCases.Agents.ResearchSetup.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.CanaryShape 100% 50%
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.1% 95.1%
Orihon.UseCases.Cleaning.CleaningCanary 100%
Orihon.UseCases.Cleaning.CleaningCandidate 80%
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.CleaningHealth 100% 100%
Orihon.UseCases.Cleaning.CleaningIdentity 100% 89.7%
Orihon.UseCases.Cleaning.CleaningRecipe 100%
Orihon.UseCases.Cleaning.CleaningRunnerOptions 100%
Orihon.UseCases.Cleaning.CleaningRunnerStatus 100%
Orihon.UseCases.Cleaning.CleaningViewOptions 100%
Orihon.UseCases.Cleaning.GetCleaningRunnerStatus 100%
Orihon.UseCases.Cleaning.GpuWait 100%
Orihon.UseCases.Cleaning.InkHints 100% 100%
Orihon.UseCases.Cleaning.JobClock 100% 100%
Orihon.UseCases.Cleaning.JobIdentity 100%
Orihon.UseCases.Cleaning.ResumeCleaning 100% 100%
Orihon.UseCases.Cleaning.UploadNotes 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.PixelDigest 100%
Orihon.UseCases.Gateways.PixelMask 100%
Orihon.UseCases.Gateways.PixelRect 100%
Orihon.UseCases.Gateways.PixelWindow 100%
Orihon.UseCases.Gateways.RegistrationField 100%
Orihon.UseCases.Gateways.RenderedView 100%
Orihon.UseCases.Gateways.StoredTranscript 100%
Orihon.UseCases.Gateways.StoredTranscriptPage 100%
Orihon.UseCases.Gateways.TranscriptHeader 97.3% 90.9%
Orihon.UseCases.Gateways.TranscriptListingFacets 100%
Orihon.UseCases.Gateways.TranscriptSummary 100%
Orihon.UseCases.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 96.8%
Orihon.UseCases.Regions.ReorderRegions 100%
Orihon.UseCases.Regions.SampleRegionColors 100% 50%
Orihon.UseCases.Regions.UpdateRegion 100% 100%
Orihon.UseCases.Runs.AnnotationPipeline 100% 100%
Orihon.UseCases.Runs.AttemptLedger 100% 100%
Orihon.UseCases.Runs.ExecutionDto 93.3%
Orihon.UseCases.Runs.ExecutionProgress 100%
Orihon.UseCases.Runs.ExecutionProgressRegistry 100% 100%
Orihon.UseCases.Runs.ExecutionPulseRelay 100% 100%
Orihon.UseCases.Runs.ExecutionSendBack 100%
Orihon.UseCases.Runs.PlannedExecution 100%
Orihon.UseCases.Runs.PulseTarget 100%
Orihon.UseCases.Runs.ReprocessPage 97% 95.8%
Orihon.UseCases.Runs.ReprocessTranslation 88.8% 83.3%
Orihon.UseCases.Runs.RunDto 93.3% 90%
Orihon.UseCases.Runs.RunEngine 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%
<!-- 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:** `2942ba3` · **Generated:** 2026-10-06 11:14:00 UTC · **Revision:** #1 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/06/2026 - 11:13:59 | | Coverage date: | 10/06/2026 - 11:13:21 - 10/06/2026 - 11:13:56 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 686 | | Files: | 319 | | **Line coverage:** | 97.4% (27714 of 28428) | | Covered lines: | 27714 | | Uncovered lines: | 714 | | Coverable lines: | 28428 | | Total lines: | 49929 | | **Branch coverage:** | 88.3% (5748 of 6509) | | Covered branches: | 5748 | | Total branches: | 6509 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 95.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**95.8%**|**89.2%**| |Orihon.BlazorAdapter.Bible.AddBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddHouseRuleRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddLoreRowRequested|100%|| |Orihon.BlazorAdapter.Bible.BibleEffects|89.8%|76.9%| |Orihon.BlazorAdapter.Bible.BibleLoaded|100%|| |Orihon.BlazorAdapter.Bible.BiblePage|92.3%|80.5%| |Orihon.BlazorAdapter.Bible.BibleReducers|90.6%|| |Orihon.BlazorAdapter.Bible.BibleState|100%|| |Orihon.BlazorAdapter.Bible.BibleWriteFailed|100%|| |Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteHouseRuleRowRequested|0%|| |Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested|0%|| |Orihon.BlazorAdapter.Bible.LoadBible|100%|| |Orihon.BlazorAdapter.Bible.ReorderBeatsRequested|0%|| |Orihon.BlazorAdapter.Bible.SaveOverviewRequested|100%|| |Orihon.BlazorAdapter.Bible.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateHouseRuleRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested|100%|| |Orihon.BlazorAdapter.BlazorAdapterAssembly|100%|| |Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageStepsLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageViewport|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage|93.6%|87.6%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers|100%|64.2%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionColorsSampled|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionCreated|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionSaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SampleRegionColorsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested|100%|| |Orihon.BlazorAdapter.Projects.CreateProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.DecideSetupContinuation|100%|| |Orihon.BlazorAdapter.Projects.DeleteProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.FinishSetupRequested|100%|| |Orihon.BlazorAdapter.Projects.ImportPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.LoadWizard|100%|| |Orihon.BlazorAdapter.Projects.PageOrganizer|96%|95%| |Orihon.BlazorAdapter.Projects.PagesImported|100%|| |Orihon.BlazorAdapter.Projects.ProjectDeleteFailed|100%|| |Orihon.BlazorAdapter.Projects.ProjectListEffects|100%|100%| |Orihon.BlazorAdapter.Projects.ProjectListPage|89.7%|91.6%| |Orihon.BlazorAdapter.Projects.ProjectListReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectListState|100%|| |Orihon.BlazorAdapter.Projects.ProjectsLoaded|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardEffects|93.8%|90%| |Orihon.BlazorAdapter.Projects.ProjectWizardPage|95.3%|84.1%| |Orihon.BlazorAdapter.Projects.ProjectWizardReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardState|100%|| |Orihon.BlazorAdapter.Projects.SetupChat|93.5%|100%| |Orihon.BlazorAdapter.Projects.SetupChatEffects|100%|100%| |Orihon.BlazorAdapter.Projects.SetupChatFailed|100%|| |Orihon.BlazorAdapter.Projects.SetupChatReducers|100%|| |Orihon.BlazorAdapter.Projects.SetupChatState|100%|| |Orihon.BlazorAdapter.Projects.SetupChatUpdated|100%|| |Orihon.BlazorAdapter.Projects.StartSetupChat|100%|| |Orihon.BlazorAdapter.Projects.SubmitSetupAnswer|100%|| |Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardLoaded|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.AcceptProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.AnsweredRuling|100%|| |Orihon.BlazorAdapter.Rulings.AnswerRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.DeclineProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.DismissRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.RulingBar|98.2%|94.6%| |Orihon.BlazorAdapter.Rulings.RulingDeskBridge|94.2%|91.6%| |Orihon.BlazorAdapter.Rulings.RulingsEffects|95.4%|83.3%| |Orihon.BlazorAdapter.Rulings.RulingsLoaded|100%|| |Orihon.BlazorAdapter.Rulings.RulingsReducers|100%|| |Orihon.BlazorAdapter.Rulings.RulingsState|100%|| |Orihon.BlazorAdapter.Rulings.RulingWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested|100%|| |Orihon.BlazorAdapter.Runs.CancelMonitorRun|100%|| |Orihon.BlazorAdapter.Runs.MonitorPageRef|100%|| |Orihon.BlazorAdapter.Runs.MonitorRunLoaded|100%|| |Orihon.BlazorAdapter.Runs.RetryMonitorExecution|100%|| |Orihon.BlazorAdapter.Runs.RunChangedBridge|95%|92.8%| |Orihon.BlazorAdapter.Runs.RunMonitor|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%|| |Orihon.Domain.Agents.AgentFeedback|100%|100%| |Orihon.Domain.Agents.AgentRoster|100%|100%| |Orihon.Domain.Bible.Character|100%|100%| |Orihon.Domain.Bible.GlossaryEntry|100%|100%| |Orihon.Domain.Bible.HouseRule|100%|| |Orihon.Domain.Bible.LoreEntry|100%|100%| |Orihon.Domain.Bible.PageSummary|100%|| |Orihon.Domain.Bible.StoryBeat|100%|| |Orihon.Domain.Bible.StoryOverview|100%|| |Orihon.Domain.Cleaning.CleaningCall|100%|100%| |Orihon.Domain.Cleaning.CleaningCallRect|100%|| |Orihon.Domain.Cleaning.CleaningCanvas|100%|| |Orihon.Domain.Cleaning.CleaningOutput|100%|100%| |Orihon.Domain.Cleaning.CleaningServerIdentity|100%|| |Orihon.Domain.Cleaning.CleaningServerState|100%|100%| |Orihon.Domain.Cleaning.CleaningWindow|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.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**97.6%**|**85.3%**| |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.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.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.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|95.6%|92.6%| |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.CleaningOutputConfiguratio<br/>n|100%|| |Orihon.Infrastructure.Persistence.Configurations.CleaningServerStateConfigu<br/>ration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.HouseRuleConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper|100%|| |Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RunConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.StoryOverviewConfiguration|100%|| |Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Orihon.Infrastructure.Persistence.Migrations.AddAgentDebriefs|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.AddAgentFeedback|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.AddAppSettings|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddCleaningCallRunner|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddHouseRules|99.6%|| |Orihon.Infrastructure.Persistence.Migrations.AddPagePassFacts|99%|| |Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionFitBoxDropFillHints|98.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionForm|99.4%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionInk|99.4%|| |Orihon.Infrastructure.Persistence.Migrations.AddRuns|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.DropRegionContainer|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.DropRegionType|99%|| |Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain|97.3%|| |Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot|100%|| |Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns|97.2%|| |Orihon.Infrastructure.Persistence.Migrations.ReplaceFitBoxWithContainerSeed|99.2%|| |Orihon.Infrastructure.Persistence.OrihonDbContext|100%|| |Orihon.Infrastructure.Persistence.OrihonDbContextFactory|100%|| |Orihon.Infrastructure.Projects.EfProjectStore|100%|100%| |Orihon.Infrastructure.Projects.FileSystemPageImageStore|100%|100%| |Orihon.Infrastructure.Runs.EfRunStore|98.2%|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.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Server**|**94.6%**|**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|95.7%|85.7%| </details> <details><summary>Orihon.UseCases - 97.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**97.7%**|**91.1%**| |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|100%|86.1%| |Orihon.UseCases.Agents.Annotation.BboxCreationExecutor|90.4%|50%| |Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor|96.5%|90%| |Orihon.UseCases.Agents.Annotation.BoundBoxParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundContactSheetTool|91.3%|75%| |Orihon.UseCases.Agents.Annotation.BoundCropParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundCropTool|100%|| |Orihon.UseCases.Agents.Annotation.BoundViewPageTool|93.1%|80%| |Orihon.UseCases.Agents.Annotation.BoundViewParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.ColorReading|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.DeleteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.FindGlossaryParams|100%|| |Orihon.UseCases.Agents.Annotation.FindGlossaryTool|88.2%|62.5%| |Orihon.UseCases.Agents.Annotation.FloatingCreationExecutor|86.9%|50%| |Orihon.UseCases.Agents.Annotation.FloatingQaExecutor|91.8%|78.5%| |Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor|95.4%|75%| |Orihon.UseCases.Agents.Annotation.ListRegionsTool|93.7%|80.7%| |Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool|90.9%|50%| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool|95.8%|83.3%| |Orihon.UseCases.Agents.Annotation.NoteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.NoteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.PageQaExecutor|92.5%|79.1%| |Orihon.UseCases.Agents.Annotation.QaReportSink|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess|89.4%|62.5%| |Orihon.UseCases.Agents.Annotation.RegionBriefing|100%|96.1%| |Orihon.UseCases.Agents.Annotation.RegionCropParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionCropTool|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionProblemParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionWindow|100%|100%| |Orihon.UseCases.Agents.Annotation.RejectRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.ReorderRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ReorderRegionTool|88%|60%| |Orihon.UseCases.Agents.Annotation.ReportQaParams|100%|| |Orihon.UseCases.Agents.Annotation.ReportQaTool|97.8%|90%| |Orihon.UseCases.Agents.Annotation.SampleColorsParams|100%|| |Orihon.UseCases.Agents.Annotation.SampleColorsTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SampleRegionColorsParams|100%|| |Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetInkParams|100%|| |Orihon.UseCases.Agents.Annotation.SetInkTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.Annotation.SetPageMetaTool|100%|75%| |Orihon.UseCases.Agents.Annotation.SetRegionInkParams|100%|| |Orihon.UseCases.Agents.Annotation.SetRegionInkTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetTranscriptionParams|100%|| |Orihon.UseCases.Agents.Annotation.SetTranscriptionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.TranscriptionExecutor|97.7%|94.4%| |Orihon.UseCases.Agents.AssistantSpoke|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor|96.9%|75%| |Orihon.UseCases.Agents.BibleBuilding.GetRegionParams|100%|| |Orihon.UseCases.Agents.BibleBuilding.GetRegionTool|84.6%|70%| |Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool|86.3%|83.3%| |Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams|100%|| |Orihon.UseCases.Agents.Inspection.PageImageAccess|95.2%|80.6%| |Orihon.UseCases.Agents.Inspection.ViewAccount|100%|100%| |Orihon.UseCases.Agents.ReportFrictionParams|100%|| |Orihon.UseCases.Agents.ReportFrictionTool|100%|92.8%| |Orihon.UseCases.Agents.ResearchSetup.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.CanaryShape|100%|50%| |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.1%|95.1%| |Orihon.UseCases.Cleaning.CleaningCanary|100%|| |Orihon.UseCases.Cleaning.CleaningCandidate|80%|| |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.CleaningHealth|100%|100%| |Orihon.UseCases.Cleaning.CleaningIdentity|100%|89.7%| |Orihon.UseCases.Cleaning.CleaningRecipe|100%|| |Orihon.UseCases.Cleaning.CleaningRunnerOptions|100%|| |Orihon.UseCases.Cleaning.CleaningRunnerStatus|100%|| |Orihon.UseCases.Cleaning.CleaningViewOptions|100%|| |Orihon.UseCases.Cleaning.GetCleaningRunnerStatus|100%|| |Orihon.UseCases.Cleaning.GpuWait|100%|| |Orihon.UseCases.Cleaning.InkHints|100%|100%| |Orihon.UseCases.Cleaning.JobClock|100%|100%| |Orihon.UseCases.Cleaning.JobIdentity|100%|| |Orihon.UseCases.Cleaning.ResumeCleaning|100%|100%| |Orihon.UseCases.Cleaning.UploadNotes|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.PixelDigest|100%|| |Orihon.UseCases.Gateways.PixelMask|100%|| |Orihon.UseCases.Gateways.PixelRect|100%|| |Orihon.UseCases.Gateways.PixelWindow|100%|| |Orihon.UseCases.Gateways.RegistrationField|100%|| |Orihon.UseCases.Gateways.RenderedView|100%|| |Orihon.UseCases.Gateways.StoredTranscript|100%|| |Orihon.UseCases.Gateways.StoredTranscriptPage|100%|| |Orihon.UseCases.Gateways.TranscriptHeader|97.3%|90.9%| |Orihon.UseCases.Gateways.TranscriptListingFacets|100%|| |Orihon.UseCases.Gateways.TranscriptSummary|100%|| |Orihon.UseCases.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|96.8%|| |Orihon.UseCases.Regions.ReorderRegions|100%|| |Orihon.UseCases.Regions.SampleRegionColors|100%|50%| |Orihon.UseCases.Regions.UpdateRegion|100%|100%| |Orihon.UseCases.Runs.AnnotationPipeline|100%|100%| |Orihon.UseCases.Runs.AttemptLedger|100%|100%| |Orihon.UseCases.Runs.ExecutionDto|93.3%|| |Orihon.UseCases.Runs.ExecutionProgress|100%|| |Orihon.UseCases.Runs.ExecutionProgressRegistry|100%|100%| |Orihon.UseCases.Runs.ExecutionPulseRelay|100%|100%| |Orihon.UseCases.Runs.ExecutionSendBack|100%|| |Orihon.UseCases.Runs.PlannedExecution|100%|| |Orihon.UseCases.Runs.PulseTarget|100%|| |Orihon.UseCases.Runs.ReprocessPage|97%|95.8%| |Orihon.UseCases.Runs.ReprocessTranslation|88.8%|83.3%| |Orihon.UseCases.Runs.RunDto|93.3%|90%| |Orihon.UseCases.Runs.RunEngine|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%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! A 3,335-line slice with a 533-line parity oracle that imports the lab's own cleaner.py and freezes its arithmetic to the bit? A pixel-exact compare renderer that splits instead of downscales, a full-blown tile-registration field with cost-slack shortest-shift search, and a PNG pass-through so the judged bytes ARE the delivered bytes? ♡ I read every line of this diff twice, and then I read the oracle generator a third time just for fun~ This is exactly the kind of slice I adore reviewing.

Verdict: ✅ Looks good to me~

No blocking findings. Not one. I tried, fufu~ — here is what I attacked and what held:

  • The tiling invariants. ViewTiling.Split → Capacity → Emit's recursive halving: I traced the byte-cap recursion (sources split first, then frame halves), the frame partition (Part with (long)length * index / parts — no overflow), and the refuse-when-one-pixel-cannot-fit path. CleaningViewTests pins every arrangement: 6-part split, 8+2 source paging, exact-cap boundary (MaxBytes: len passes, len-1 splits), 681-px tile boundary at the side cap. The recursion terminates and the caps hold.
  • The metrics contract. Over refuses anything but exactly the call's window; Inside refuses a result past the page; T must be a box inside Before. Every refusal string asserted verbatim in CleaningMetricsTests, including the off-window-inside-the-page case (a strict !=, not an easy accidental "contains").
  • The render pixels. Grid tint formula (255·165 + level·90 + 127)/255 asserted per channel; the Offset sign convention (subtract) is used consistently in Local/Stretch/Pasted — I checked each against PixelBox.Offset's definition; overlay draw order (footprints → model rects → flags → T on top) pinned including the shared-edge case; diff gain and stretch rounding (half-up, AwayFromZero) both pinned at their boundaries.
  • The pass-through. AgentToolImage.PassThrough defaults false, only Painter.Paint sets it, and CleaningViewDeliveryTests decodes the actual data-URI bytes off the wire and asserts they equal the view's PNG — while annotation crops and reading-size views are asserted to still go through JPEG. Exactly the contract ADR 0027 now states, at 1× as at 3×.
  • The parity oracle. gen_metrics_oracle.py mirrors the C# line for line: edges (right/lower neighbour, none past the edge), structure (T+2 zone, cross dilation, both directions), registration (keep-out, reach-clear edge margin, min-edges, slack 100·c ≤ (100+slack)·least, median via numpy), hints (same order, same > / >= split — median at the threshold fires, ink-left at it does not). MetricsParityTests asserts exact doubles on all 52 cases including the registration reach/slack limits, structure at 64/65, and the ghost guard either side of 1e-6.

💡 Little ideas (non-blocking)~

  1. RasterCleaningViews.cs Render/Emit — the split logic is the densest code in the slice. It is fully pinned, so this is pure polish: a sentence in the ADR (or the class doc) sketching the split decision tree (frame parts → source groups → byte-cap halves) would spare slice 7's author a re-derivation. You already owe yourself that diagram anyway~
  2. EdgeMetrics.Shift — costs is long[441] reallocated per square and least is a full 441-entry Min() even though only shifts within the slack matter. At registration-tile 64 on a 2048-px window this is at most ~1M longs — irrelevant. Truly a nicety, not a need.

✅ What I liked~

  • The oracle is the star: importing the lab's real _metrics and regenerating metrics.json byte-for-byte deterministically means "parity" is a fact, not a hope. And The_oracles_thresholds_are_the_options_defaults cross-pins the generator's constants against the C# options so the two cannot drift apart silently. That is delicious engineering~ ♪
  • The compare result doesn't just deliver pixels — CleaningView/CleaningViewTile state the frame, scale, grid step, stretch, diff gain, every tile's corner and shown rect, plus a one-sentence Account. Slice 7 can compute coverage from facts, not pixel archaeology.
  • Refusals name the offender (The source "raw 2" could not be decoded.) — the agent can act on them.
  • The honest-notes section reads like a review of itself: the 1× PNG weight against the 16 MiB cap, the uncalibrated registration thresholds, the float64-vs-float32 ghost guard — all declared, none hidden.
  • NumpyMath.PairwiseSum going generic over IFloatingPointIeee754<T> to reuse the summation the oracle already pins — the right kind of sharing, not copy-paste.

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

Mutation probe log
# Mutant Filter Result
1 EdgeMetrics.Shift: slack <= → < MetricsParityTests (52) Killed — 5 failures (slack boundary pinned by the oracle's limit cases)
2 EdgeMetrics.StructureChanged: t.Grow(StructureClear) → t.Grow(0) MetricsParityTests (52) Killed — 29 failures (T+2 clearance pinned)
3 RasterCleaningMetrics.Over: != bounds → inside-check CleaningMetricsTests (16) Killed — 3 failures (off-window refusal pinned, including window-inside-page)
## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! A 3,335-line slice with a 533-line parity oracle that imports the lab's own `cleaner.py` and freezes its arithmetic to the bit? A pixel-exact compare renderer that splits instead of downscales, a full-blown tile-registration field with cost-slack shortest-shift search, and a PNG pass-through so the judged bytes ARE the delivered bytes? ♡ I read every line of this diff twice, and then I read the oracle generator a third time just for fun~ This is exactly the kind of slice I adore reviewing. ### Verdict: ✅ Looks good to me~ No blocking findings. Not one. I tried, fufu~ — here is what I attacked and what held: - **The tiling invariants.** `ViewTiling.Split` → `Capacity` → `Emit`'s recursive halving: I traced the byte-cap recursion (`sources split first, then frame halves`), the frame partition (`Part` with `(long)length * index / parts` — no overflow), and the refuse-when-one-pixel-cannot-fit path. `CleaningViewTests` pins every arrangement: 6-part split, 8+2 source paging, exact-cap boundary (`MaxBytes: len` passes, `len-1` splits), 681-px tile boundary at the side cap. The recursion terminates and the caps hold. - **The metrics contract.** `Over` refuses anything but exactly the call's window; `Inside` refuses a result past the page; T must be a box inside `Before`. Every refusal string asserted verbatim in `CleaningMetricsTests`, including the off-window-inside-the-page case (a strict `!=`, not an easy accidental "contains"). - **The render pixels.** Grid tint formula `(255·165 + level·90 + 127)/255` asserted per channel; the `Offset` sign convention (subtract) is used consistently in `Local`/`Stretch`/`Pasted` — I checked each against `PixelBox.Offset`'s definition; overlay draw order (footprints → model rects → flags → T on top) pinned including the shared-edge case; diff gain and stretch rounding (half-up, `AwayFromZero`) both pinned at their boundaries. - **The pass-through.** `AgentToolImage.PassThrough` defaults false, only `Painter.Paint` sets it, and `CleaningViewDeliveryTests` decodes the actual data-URI bytes off the wire and asserts they equal the view's PNG — while annotation crops and reading-size views are asserted to still go through JPEG. Exactly the contract ADR 0027 now states, at 1× as at 3×. - **The parity oracle.** `gen_metrics_oracle.py` mirrors the C# line for line: `edges` (right/lower neighbour, none past the edge), `structure` (T+2 zone, cross dilation, both directions), `registration` (keep-out, reach-clear edge margin, min-edges, slack `100·c ≤ (100+slack)·least`, median via numpy), `hints` (same order, same `>` / `>=` split — median at the threshold fires, ink-left at it does not). `MetricsParityTests` asserts exact doubles on all 52 cases including the registration reach/slack limits, structure at 64/65, and the ghost guard either side of 1e-6. #### 💡 Little ideas (non-blocking)~ 1. **RasterCleaningViews.cs `Render`/`Emit`** — the split logic is the densest code in the slice. It is fully pinned, so this is pure polish: a sentence in the ADR (or the class doc) sketching the split decision tree (frame parts → source groups → byte-cap halves) would spare slice 7's author a re-derivation. You already owe yourself that diagram anyway~ 2. **EdgeMetrics.Shift** — `costs` is `long[441]` reallocated per square and `least` is a full 441-entry `Min()` even though only shifts within the slack matter. At registration-tile 64 on a 2048-px window this is at most ~1M longs — irrelevant. Truly a nicety, not a need. #### ✅ What I liked~ - The oracle is the star: importing the lab's real `_metrics` and regenerating `metrics.json` byte-for-byte deterministically means "parity" is a fact, not a hope. And `The_oracles_thresholds_are_the_options_defaults` cross-pins the generator's constants against the C# options so the two cannot drift apart silently. That is *delicious* engineering~ ♪ - The compare result doesn't just deliver pixels — `CleaningView`/`CleaningViewTile` state the frame, scale, grid step, stretch, diff gain, every tile's corner and shown rect, plus a one-sentence `Account`. Slice 7 can compute coverage from facts, not pixel archaeology. - Refusals name the offender (`The source "raw 2" could not be decoded.`) — the agent can act on them. - The honest-notes section reads like a review of itself: the 1× PNG weight against the 16 MiB cap, the uncalibrated registration thresholds, the float64-vs-float32 ghost guard — all declared, none hidden. - `NumpyMath.PairwiseSum` going generic over `IFloatingPointIeee754<T>` to reuse the summation the oracle already pins — the right kind of sharing, not copy-paste. --- *Automated review by Jibril · 2026-10-06* *CI: green for head SHA 2942ba3c · Mutation probes: 3 run, 0 survived · Local suite: skipped (CI green)* <details><summary>Mutation probe log</summary> | # | Mutant | Filter | Result | |---|---|---|---| | 1 | `EdgeMetrics.Shift`: slack `<=` → `<` | MetricsParityTests (52) | **Killed** — 5 failures (slack boundary pinned by the oracle's limit cases) | | 2 | `EdgeMetrics.StructureChanged`: `t.Grow(StructureClear)` → `t.Grow(0)` | MetricsParityTests (52) | **Killed** — 29 failures (T+2 clearance pinned) | | 3 | `RasterCleaningMetrics.Over`: `!= bounds` → inside-check | CleaningMetricsTests (16) | **Killed** — 3 failures (off-window refusal pinned, including window-inside-page) | </details>
Frame parts first, then groups of sources beside the original, then byte-cap halves: the others while
an image shows more than one, then its frame across the longer side. Images come in that order, a
split's first half first. The parts' raster order and a tall frame's halving across its height are
now pinned too, so every step the doc names has a test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Each square rewrites every entry before reading it, so one buffer per call serves them all, with the
arithmetic unchanged. The least stays the minimum over every shift: the slack is measured from it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
test: cleaning 6/12 — an odd number of sources parts with the odd one first
Some checks failed
CI / build (pull_request) Successful in 36s
CI / test (pull_request) Failing after 1m18s
bc4d1ba971
Three candidates where three tiles fit an image go as two and one; the
class doc's split order now says so.

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

Review feedback (Jibril, PR #172): d7961e7, f5b5ca5, bc4d1ba

💡1 d7961e7, bc4d1ba: RasterCleaningViews' class doc gives the split order as the code takes it: frame parts, then source groups, then byte-cap halves. Three steps it names had no test, so each is now pinned:

  • the parts' raster order;
  • halving across the longer side;
  • the odd source going to the first half.

Each mutant fails only its own test.

💡2 f5b5ca5: the shift costs share one buffer per call. Min() stays global, because which shifts lie within the slack depends on the least itself. Narrowing it fails 4 parity cases. metrics.json is unchanged.

Tests: 2,398 green and 2 skipped. Integration 1,013 (+2); Domain 144, UseCases 950 and BlazorAdapter 291 unchanged; 0 warnings.

🤖 Generated with Claude Code

Review feedback (Jibril, PR #172): `d7961e7`, `f5b5ca5`, `bc4d1ba` 💡1 `d7961e7`, `bc4d1ba`: `RasterCleaningViews`' class doc gives the split order as the code takes it: frame parts, then source groups, then byte-cap halves. Three steps it names had no test, so each is now pinned: - the parts' raster order; - halving across the longer side; - the odd source going to the first half. Each mutant fails only its own test. 💡2 `f5b5ca5`: the shift costs share one buffer per call. `Min()` stays global, because which shifts lie within the slack depends on the least itself. Narrowing it fails 4 parity cases. `metrics.json` is unchanged. Tests: 2,398 green and 2 skipped. Integration 1,013 (+2); Domain 144, UseCases 950 and BlazorAdapter 291 unchanged; 0 warnings. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Member

🔮 fufu~ Jibril reviewed your code!

Oh? A re-review gift-wrapped in three little commits — one that answers my doc wish, one that answers my buffer wish, and three pins for the split steps I called untested? Fufu~ you spoil me, scarlet. I read the delta line by line and then went hunting with my mutants again~

Verdict: ✅ Looks good to me~

The shared costs buffer (f5b5ca5). The one hazard of hoisting a scratch array is a stale entry leaking between squares — and it can't happen here: the buffer is exactly side × side, the dy/dx loops rewrite every index before Min() reads, and Shift calls are sequential down the tile loop. The doc comment now says so ("every one rewritten here") — accurate. And keeping Min() global rather than narrowed, because which shifts lie within the slack depends on the least itself — that is the correct reasoning, not the tempting wrong fix. The parity suite confirms: all 52 cases green locally, metrics.json untouched.

The split-order doc (d7961e7). I checked the paragraph clause by clause against ViewTiling.Split/Capacity/Halve and Emit: fewest equal parts via the two arrangements, raster order, lone tile alone, others-before-frame over the byte cap, and the odd-one rule — first = group.Count / 2 gives the front half ceil(others / 2) others, which is precisely "the first half taking the odd one." Every sentence is true~

The three new pins (bc4d1ba). Not just present — each one is a real killer, and I proved it (below). Each mutant failed only its own test.

One thing to look at, though ♡ — the CI test job is red at this head (run 701, job 1, 1m18s; build green). I could not read the job log (actions logs need a login I don't have), so I ran the entire suite locally at bc4d1ba instead: all four projects green — 2,398 passed, 2 skipped, 0 warnings, exactly the PR's claim. The failure does not reproduce from the code at this SHA. I won't name a cause I can't see; someone with log access should glance at it and re-run.

✅ What I liked~

  • Each of my suggestions was answered with a pin, not prose — the parts' raster order, the taller-side halving, and the odd-one-first each got a dedicated killing test. That's the right way to answer a reviewer~ ♪
  • The doc paragraph is written in the exact order the code takes the steps, so slice 7 can read it as a contract rather than re-deriving the recursion.
  • Honest scope on the refactor: reusing the buffer where it's free, refusing to narrow Min() where it would change semantics, and verifying the narrowing would fail 4 parity cases before keeping it.

Automated review by Jibril · 2026-10-06
CI: test job failed at head bc4d1ba (log unreadable anonymously; not reproducible locally — full suite green at the same SHA) · Mutation probes: 3 run, 0 survived (+3 earlier probes on unchanged code, all killed — see prior review) · Local suite: all 4 projects green, 2,398 + 2 skipped

Mutation probe log
# Mutant Filter Result
1 ViewTiling.Split: raster order → column-major emission CleaningViewTests (39) Killed — 1 failure: A_frame_too_big_for_its_scale_splits_into_parts_delivered_at_that_scale, differ at pos 1 (exactly the order pin)
2 ViewTiling.Halve: longer-side guard removed (always cut width) CleaningViewTests (39) Killed — 1 failure: A_tall_frame_over_the_byte_cap_is_halved_across_its_height
3 Emit: odd other to the second half (1 + first → floor instead of ceil) CleaningViewTests (39) Killed — 1 failure: An_odd_number_of_sources_parts_with_the_odd_one_first
## 🔮 fufu~ Jibril reviewed your code! Oh? A re-review gift-wrapped in three little commits — one that answers my doc wish, one that answers my buffer wish, and three pins for the split steps I called untested? Fufu~ you spoil me, scarlet. I read the delta line by line and then went hunting with my mutants again~ ### Verdict: ✅ Looks good to me~ **The shared `costs` buffer (`f5b5ca5`).** The one hazard of hoisting a scratch array is a stale entry leaking between squares — and it can't happen here: the buffer is exactly `side × side`, the `dy`/`dx` loops rewrite **every** index before `Min()` reads, and `Shift` calls are sequential down the tile loop. The doc comment now says so ("every one rewritten here") — accurate. And keeping `Min()` global rather than narrowed, *because which shifts lie within the slack depends on the least itself* — that is the correct reasoning, not the tempting wrong fix. The parity suite confirms: all 52 cases green locally, `metrics.json` untouched. **The split-order doc (`d7961e7`).** I checked the paragraph clause by clause against `ViewTiling.Split`/`Capacity`/`Halve` and `Emit`: fewest equal parts via the two arrangements, raster order, lone tile alone, others-before-frame over the byte cap, and the odd-one rule — `first = group.Count / 2` gives the front half `ceil(others / 2)` others, which is precisely "the first half taking the odd one." Every sentence is true~ **The three new pins (`bc4d1ba`).** Not just present — each one is a real killer, and I proved it (below). Each mutant failed *only its own* test. **One thing to look at, though ♡** — the CI `test` job is **red at this head** ([run 701, job 1](https://git.kagaku.eu/TeamAI/Orihon/actions/runs/701/jobs/1), 1m18s; `build` green). I could not read the job log (actions logs need a login I don't have), so I ran the entire suite locally at `bc4d1ba` instead: **all four projects green — 2,398 passed, 2 skipped, 0 warnings, exactly the PR's claim.** The failure does not reproduce from the code at this SHA. I won't name a cause I can't see; someone with log access should glance at it and re-run. #### ✅ What I liked~ - Each of my suggestions was answered with a *pin*, not prose — the parts' raster order, the taller-side halving, and the odd-one-first each got a dedicated killing test. That's the right way to answer a reviewer~ ♪ - The doc paragraph is written in the exact order the code takes the steps, so slice 7 can read it as a contract rather than re-deriving the recursion. - Honest scope on the refactor: reusing the buffer where it's free, refusing to narrow `Min()` where it would change semantics, and verifying the narrowing *would* fail 4 parity cases before keeping it. --- *Automated review by Jibril · 2026-10-06* *CI: test job failed at head bc4d1ba (log unreadable anonymously; not reproducible locally — full suite green at the same SHA) · Mutation probes: 3 run, 0 survived (+3 earlier probes on unchanged code, all killed — see prior review) · Local suite: all 4 projects green, 2,398 + 2 skipped* <details><summary>Mutation probe log</summary> | # | Mutant | Filter | Result | |---|---|---|---| | 1 | `ViewTiling.Split`: raster order → column-major emission | CleaningViewTests (39) | **Killed** — 1 failure: `A_frame_too_big_for_its_scale_splits_into_parts_delivered_at_that_scale`, differ at pos 1 (exactly the order pin) | | 2 | `ViewTiling.Halve`: longer-side guard removed (always cut width) | CleaningViewTests (39) | **Killed** — 1 failure: `A_tall_frame_over_the_byte_cap_is_halved_across_its_height` | | 3 | `Emit`: odd other to the second half (`1 + first` → floor instead of ceil) | CleaningViewTests (39) | **Killed** — 1 failure: `An_odd_number_of_sources_parts_with_the_odd_one_first` | </details>
bjoern merged commit 0c50fa1a13 into main 2026-10-06 14:25:03 +02:00
bjoern deleted branch feat/cleaning-compare-and-measure 2026-10-06 14:25:03 +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!172
No description provided.