fix: the refinement brief stops contradicting the tool it drives #136

Merged
bjoern merged 3 commits from fix/annotation-brief-sweep into main 2026-09-20 23:45:14 +02:00
Member

The bbox refiner's brief promised four things classify_region does not do. Every one of them comes from an agent friction report (ADR 0025) filed on a run that succeeded — the agent finished the page and then wrote down what had cost it rounds, which is exactly the traffic that ADR is for. The claims are all about containers, so the vocabulary being corrected is ADR 0012's (form = bubble means cleaning fills within the container and leaves the outline standing — that is why an escaped fill is destructive and a short one is not), the grant the brief may draw on is ADR 0016's, and the one thing left undecided touches ADR 0023.

The change is prose only. About 146 changed lines in one agent brief against roughly 400 lines of new tests, and no production branch added anywhere. The justification for that ratio: a brief that contradicts its tool costs rounds on every page it runs on, and the failure it produces is not cosmetic — a container recorded over two balloons is art the cleaning pass erases.

What's in

Use cases — AnnotationBlueprints.cs, the bbox-refinement brief

The dead paragraph. "Containers are not yours. …a later pass points at each balloon's inside" contradicted step 3 of the same brief, which tells this agent to do precisely that. It had also replaced step 4, so the list ran 1, 2, 3, 5. Paragraph gone, final step renumbered.

The repair that isn't one. The brief promised a balloon "whose outline has a small break is repaired for you before you see it". Nothing is repaired: the fill is eroded by a pixel, the piece still holding the region's box is kept, the rest is dropped, and it only runs on a fill that has already spread well past its own text. So the brief now says cut away, says a radius-1 erosion parts a break "a pixel or two across", and — this is the part that saves the rounds — says that an outline crossed by an overlapping balloon or a tail leaves inside and outside one surface, where no point anywhere separates them and pointing again changes nothing.

The size rule, which named the wrong measure twice. It said "several times it is not a container", which is vague where the gate is exact, and the first fix named the longer side — also wrong. SkiaContainerFiller.Spread is Math.Max(acrossRatio, downRatio), each axis taken over the fill and the box together. The brief now states that, and the worked example is the manga norm that makes it bite: a vertical column can be 1.2× down and five times across, and five is the answer. Five, not the reviewer's arithmetically-correct 6.7 — Window() pads each axis to LooseSpread + 1 and clips, so a per-axis ratio much above 5 is not reachable through a call that carries a box, and an unreachable number in a brief is a new lie for the next friction report. Also stated: the ratio is not handed back on success (the answer gives share + pixel size; spread appears only in the refusal), and the share-of-the-page rule can never decide this agent's refusal because it always has a box.

What a refusal actually leaves. "Nothing is recorded" is true of the container, the type and the form that rode in with it — but a refusal returns before ApplyAsync, so the placeholder RegionType.Dialogue that add_region stamps survives, and list_regions prints dialogue, form not judged to every later pass. The brief now says so, and says why it matters: type is what decides whether the text is lettered at all, so an sfx or a title parked there ships wearing a type nobody chose.

Tolerance, which had no unit. It is colour levels, per channel, against the seed's own colour — never against the neighbouring pixel, which is why the fill cannot creep up a gradient. sample_colors gives something to subtract, with one honest caveat now stated: it reports each colour's average, merges tones within ~40 levels, and reads only this region's own box. So a measured step is a floor, not the value to use; and a single colour coming back is as likely to mean the sampler never saw the tone — the box is snug round the glyphs while the tone runs across the whole interior — as that there is none.

The ending the brief never had. Some balloons have no value that both covers the interior and stays inside the outline, and they are the ones that eat rounds. Three tries, then keep the largest value whose green stays inside, record it, note what you saw, stop. Short is the way to be wrong — see the note below for the four supports. Where no value stays inside, the two shapes are told apart by what the tool did, not what the green ran into: every call refused (the tool settled it — note and finish, and name the real type because the placeholder is what ships), or the green escaped and the call was not refused (a leak into the next balloon, or onto the page margin where the window is clipped short by the sheet edge — both frequently land under 4×). In that second shape the container is already on the region and nothing in the grant takes it back, so the brief tells the agent to make its last call the one it wants standing and to put the repair in a note aimed at the human's seed and slider.

Tests

1321 green across the four projects (151 / 599 / 277 / 294), +9 on main's 1312 — recomputed from a fresh run on ad6f2d9, not carried forward from either review round. Build clean with -warnaserror, 0 warnings. 9 [Fact] added, 0 removed.

Every prose test carries the behaviour it describes or the constant it quotes, so prose and code break together:

  • Every_annotation_brief_numbers_its_steps_without_a_hole — the generalisable form of the original defect (a hole in the numbering is the tell that prose outlived the step it replaced). Runs across all six annotation briefs, not just the refiner's, and asserts each has at least three steps so it cannot pass vacuously.
  • The_refusal_size_in_the_brief_is_the_linear_ratio_the_tool_measures — asserts the prose beside ContainerFit.LooseSpread == 4m, so moving the constant breaks the test and forces the words to follow; asserts the share rule is stated as reported, not judged; and carries the folded-in behaviour pin (a fill far over the limit is refused and takes type and form with it).
  • A_refused_call_leaves_the_placeholder_type_the_brief_names — drives add_region → refused classify_region → list_regions and asserts the printed line is dialogue, form not judged, the exact string the brief now quotes.
  • A_fill_is_judged_on_the_worse_of_its_two_axes (Integration) — a real page, a 20×170 column, a balloon ordinary down and over the limit across. Asserts down < LooseSpread, across > it, LooksLikeRunaway, and that Spread tracks the across figure at more than twice the down one. A longer-side implementation returns ~1.06 here and fails four of the five.
  • A_box_against_the_sheets_edge_gets_a_short_window_and_a_full_fill_passes (Integration) — the premise behind the two-shapes rule, against the real filler with no production change. Same 60×100 box, bare sheet: mid-sheet LooksLikeRunaway is true, at the corner it is false and Spread is under the constant. Two positions, opposite outcomes, so it cannot pass vacuously.
  • An_escaped_container_under_the_limit_stands_and_the_brief_says_so — pins the end state rather than the prose alone: a sub-limit classification succeeds and the container and the type are on the region, and reject_region then leaves Container, Type and Form exactly where the classification put them. Plus DoesNotContain("Refuse it yourself") and a count (not a Contains) that "keeps the placeholder type it was created with" appears exactly once, so it cannot creep back into the escaped shape.
  • The_tolerance_lever_is_stated_in_a_unit_the_agent_can_measure — interpolates the domain's own 1 / 128 / 16 bounds rather than copying them, computes the 58-level step at runtime from the two hex literals the assertion quotes (so example and arithmetic cannot drift), and guards the retired overstatements with DoesNotContain.
  • A_balloon_with_no_workable_tolerance_has_an_ending_in_the_brief — asserts the ending exists and that a sub-limit fill really is recorded (IsSuccess, Container non-null), which is the fact the ending is built on.
  • The_brief_promises_only_the_repair_the_fill_actually_makes — asserts the cut-away wording and guards DoesNotContain("mended for you").

Negative checks were run for real in both rounds, not asserted: with the brief reverted a commit, 5 of the prose tests fail in round 1 and 3 in round 2, each time exactly the ones that round touched. The numbering guard correctly passes on both sides of the round-2 revert — round 1 closed that hole and round 2 did not go near it.

Honest notes

Why short beats escaped, since this is the one judgement call in the slice and it was made without a ruling: (a) ADR 0012's table and Region.cs:44-46 — form = bubble means cleaning fills within the container and leaves the outline standing, so an escaped fill erases art while a short one only leaves room unclaimed; (b) the tool refuses a runaway and never a shortfall, so a short fill is the only one that can be recorded at all; (c) both QA briefs already agree — PageQa says green covering "a little less than the whole inside" is not worth a send-back and that escaped green "is the one way a container goes wrong", so preferring short cannot bounce the page; (d) the person reviewing has this same threshold on a slider (PageWorkspacePage.razor:227-240), so the note lands on a lever someone can actually move.

One design fork named rather than silently closed. Where an escape stays under the limit, the container is recorded and the refiner cannot un-record it: reject_region leaves Type, Form and Container standing, and the only classifications that clear a container are embedded-without-seed and floating — both a lie about what is drawn, and form is what cleaning acts on. The brief now tells the truth about that and puts the repair in a note. If a region with no container is genuinely wanted there, the agent needs a way to clear one without lying about form — that is a new tool or a new classify_region argument, i.e. a production change, and it belongs to its own slice. It is not promised in prose here.

LooseSpread = 4 was deliberately not changed. Whether 4× is the right gate is a separate arc; this slice only makes the brief say what the gate is.

Deferred sweep of the retired loose unit — four sites, all in files this slice does not own. Declined here rather than swept, because sibling slices are editing those files in parallel and a two-line doc edit buys nothing a follow-up cannot while risking a conflict on files this branch has no other business in:

  • src/Orihon.UseCases/Regions/MeasureRegionRooms.cs:13-14 — a container "is never several times the size of it".
  • src/Orihon.BlazorAdapter/PageWorkspace/PageWorkspacePage.razor:938 — "never several times larger".
  • src/Orihon.Infrastructure/Gateways/SkiaContainerFiller.cs:189-190 — Spread documented as "by the larger of its two dimensions", the container's longer side: the exact misreading this PR's first review round was raised about, sitting on the code that reads Math.Max(acrossRatio, downRatio).
  • src/Orihon.Infrastructure/Gateways/SkiaContainerFiller.cs:163-166 — Window's summary claims a fill that fills the window "still reports a spread over the limit and is refused rather than quietly cropped". True mid-page, false at a sheet edge, and now contradicted by a shipped brief and a passing integration test. The last two should be taken together by whichever arc owns that file; this one is a real inconsistency rather than a wording preference.

RegionAuthoringTools.cs:551 (classify_region's own description) still tells this agent "A fill of a quarter of the sheet or more is refused" — the share rule, which only fires when no box is given, and the refiner always has one. That file belongs to a sibling slice in this batch. The brief inoculates the refiner against it in one sentence meanwhile, so the two no longer contradict each other in the same context window whichever order they land in. No merge-order constraint: this branch touches no file any sibling owns.

Found, not fixed, pre-existing on main and outside this slice: two genuine stacked-summary defects, a member wearing its neighbour's doc, at src/Orihon.BlazorAdapter/PageWorkspace/PageWorkspaceEffects.cs:83-88 and tests/Orihon.BlazorAdapter.Tests/SetupChatTests.cs:41-47. Neither matches the same-line </summary><summary> grep, which is how they have survived; they show up on an adjacent-line scan.

SeedDevData is untouched, checked rather than assumed — the change adds no kind of user-authored content, only brief prose and tests. No ADR: nothing here decides anything beyond ADR 0012, and the one place a decision was needed is named above as its own slice.

Open question for bjoern — not decided here

Which pass owns translator-pasted overlay lettering — a white halo round each glyph, no bubble — and a cover's display title and credits? The cover clause and ADR 0023's floating-text rule point opposite ways. One agent reported that guessing decided whether four of nine regions existed at all, and two separate friction reports ask for the ruling. Nothing in this PR changes behaviour for it; it needs a house rule (ADR 0026) or an ADR 0023 amendment, and it is lost if this line is dropped.

🤖 Generated with Claude Code

The bbox refiner's brief promised four things `classify_region` does not do. Every one of them comes from an agent **friction report** (ADR 0025) filed on a run that **succeeded** — the agent finished the page and then wrote down what had cost it rounds, which is exactly the traffic that ADR is for. The claims are all about containers, so the vocabulary being corrected is ADR 0012's (`form = bubble` means cleaning fills *within* the container and leaves the outline standing — that is why an escaped fill is destructive and a short one is not), the grant the brief may draw on is ADR 0016's, and the one thing left undecided touches ADR 0023. **The change is prose only.** About 146 changed lines in one agent brief against roughly 400 lines of new tests, and no production branch added anywhere. The justification for that ratio: a brief that contradicts its tool costs rounds on every page it runs on, and the failure it produces is not cosmetic — a container recorded over two balloons is art the cleaning pass erases. ## What's in **Use cases — `AnnotationBlueprints.cs`, the bbox-refinement brief** *The dead paragraph.* "Containers are not yours. …a later pass points at each balloon's inside" contradicted step 3 of the same brief, which tells this agent to do precisely that. It had also **replaced** step 4, so the list ran 1, 2, 3, 5. Paragraph gone, final step renumbered. *The repair that isn't one.* The brief promised a balloon "whose outline has a small break is repaired for you before you see it". Nothing is repaired: the fill is eroded by a pixel, the piece still holding the region's box is kept, the rest is dropped, and it only runs on a fill that has already spread well past its own text. So the brief now says *cut away*, says a radius-1 erosion parts a break "a pixel or two across", and — this is the part that saves the rounds — says that an outline crossed by an overlapping balloon or a tail leaves inside and outside **one surface**, where no point anywhere separates them and pointing again changes nothing. *The size rule, which named the wrong measure twice.* It said "several times it is not a container", which is vague where the gate is exact, and the first fix named the **longer side** — also wrong. `SkiaContainerFiller.Spread` is `Math.Max(acrossRatio, downRatio)`, each axis taken over the fill and the box together. The brief now states that, and the worked example is the manga norm that makes it bite: a vertical column can be 1.2× down and five times across, and five is the answer. Five, not the reviewer's arithmetically-correct 6.7 — `Window()` pads each axis to `LooseSpread + 1` and clips, so a per-axis ratio much above 5 is not reachable through a call that carries a box, and an unreachable number in a brief is a new lie for the next friction report. Also stated: the ratio is **not** handed back on success (the answer gives share + pixel size; spread appears only in the refusal), and the share-of-the-page rule can never decide this agent's refusal because it always has a box. *What a refusal actually leaves.* "Nothing is recorded" is true of the container, the type and the form that rode in with it — but a refusal returns before `ApplyAsync`, so the **placeholder** `RegionType.Dialogue` that `add_region` stamps survives, and `list_regions` prints `dialogue, form not judged` to every later pass. The brief now says so, and says why it matters: type is what decides whether the text is lettered at all, so an sfx or a title parked there ships wearing a type nobody chose. *Tolerance, which had no unit.* It is colour **levels, per channel, against the seed's own colour** — never against the neighbouring pixel, which is why the fill cannot creep up a gradient. `sample_colors` gives something to subtract, with one honest caveat now stated: it reports each colour's **average**, merges tones within ~40 levels, and reads only this region's own box. So a measured step is a **floor**, not the value to use; and a single colour coming back is as likely to mean the sampler never saw the tone — the box is snug round the glyphs while the tone runs across the whole interior — as that there is none. *The ending the brief never had.* Some balloons have no value that both covers the interior and stays inside the outline, and they are the ones that eat rounds. Three tries, then keep the largest value whose green stays inside, record it, note what you saw, stop. **Short is the way to be wrong** — see the note below for the four supports. Where *no* value stays inside, the two shapes are told apart by **what the tool did, not what the green ran into**: every call refused (the tool settled it — note and finish, and name the real type because the placeholder is what ships), or the green escaped and the call was **not** refused (a leak into the next balloon, or onto the page margin where the window is clipped short by the sheet edge — both frequently land under 4×). In that second shape the container is already on the region and nothing in the grant takes it back, so the brief tells the agent to make its **last** call the one it wants standing and to put the repair in a note aimed at the human's seed and slider. ## Tests **1321 green across the four projects (151 / 599 / 277 / 294), +9 on main's 1312** — recomputed from a fresh run on `ad6f2d9`, not carried forward from either review round. Build clean with `-warnaserror`, 0 warnings. 9 `[Fact]` added, 0 removed. Every prose test carries the behaviour it describes or the constant it quotes, so prose and code break together: - `Every_annotation_brief_numbers_its_steps_without_a_hole` — the generalisable form of the original defect (a hole in the numbering is the tell that prose outlived the step it replaced). Runs across **all six** annotation briefs, not just the refiner's, and asserts each has at least three steps so it cannot pass vacuously. - `The_refusal_size_in_the_brief_is_the_linear_ratio_the_tool_measures` — asserts the prose beside `ContainerFit.LooseSpread == 4m`, so moving the constant breaks the test and forces the words to follow; asserts the share rule is stated as *reported, not judged*; and carries the folded-in behaviour pin (a fill far over the limit is refused **and takes type and form with it**). - `A_refused_call_leaves_the_placeholder_type_the_brief_names` — drives `add_region` → refused `classify_region` → `list_regions` and asserts the printed line is `dialogue, form not judged`, the exact string the brief now quotes. - `A_fill_is_judged_on_the_worse_of_its_two_axes` (Integration) — a real page, a 20×170 column, a balloon ordinary **down** and over the limit **across**. Asserts down < `LooseSpread`, across > it, `LooksLikeRunaway`, and that `Spread` tracks the across figure at more than twice the down one. A longer-side implementation returns ~1.06 here and fails four of the five. - `A_box_against_the_sheets_edge_gets_a_short_window_and_a_full_fill_passes` (Integration) — the premise behind the two-shapes rule, against the real filler with no production change. Same 60×100 box, bare sheet: mid-sheet `LooksLikeRunaway` is **true**, at the corner it is **false** and `Spread` is under the constant. Two positions, opposite outcomes, so it cannot pass vacuously. - `An_escaped_container_under_the_limit_stands_and_the_brief_says_so` — pins the end state rather than the prose alone: a sub-limit classification succeeds and the container **and** the type are on the region, and `reject_region` then leaves `Container`, `Type` and `Form` exactly where the classification put them. Plus `DoesNotContain("Refuse it yourself")` and a **count** (not a `Contains`) that "keeps the placeholder type it was created with" appears exactly once, so it cannot creep back into the escaped shape. - `The_tolerance_lever_is_stated_in_a_unit_the_agent_can_measure` — interpolates the domain's own 1 / 128 / 16 bounds rather than copying them, computes the 58-level step at runtime from the two hex literals the assertion quotes (so example and arithmetic cannot drift), and guards the retired overstatements with `DoesNotContain`. - `A_balloon_with_no_workable_tolerance_has_an_ending_in_the_brief` — asserts the ending exists and that a sub-limit fill really is **recorded** (`IsSuccess`, `Container` non-null), which is the fact the ending is built on. - `The_brief_promises_only_the_repair_the_fill_actually_makes` — asserts the cut-away wording and guards `DoesNotContain("mended for you")`. Negative checks were run for real in both rounds, not asserted: with the brief reverted a commit, 5 of the prose tests fail in round 1 and 3 in round 2, each time exactly the ones that round touched. The numbering guard correctly passes on both sides of the round-2 revert — round 1 closed that hole and round 2 did not go near it. ## Honest notes **Why short beats escaped**, since this is the one judgement call in the slice and it was made without a ruling: (a) ADR 0012's table and `Region.cs:44-46` — `form = bubble` means cleaning fills *within* the container and leaves the outline standing, so an escaped fill erases art while a short one only leaves room unclaimed; (b) the tool refuses a runaway and **never** a shortfall, so a short fill is the only one that can be recorded at all; (c) both QA briefs already agree — PageQa says green covering "a little less than the whole inside" is not worth a send-back and that escaped green "is the one way a container goes wrong", so preferring short cannot bounce the page; (d) the person reviewing has this same threshold on a slider (`PageWorkspacePage.razor:227-240`), so the note lands on a lever someone can actually move. **One design fork named rather than silently closed.** Where an escape stays under the limit, the container is recorded and the refiner cannot un-record it: `reject_region` leaves `Type`, `Form` and `Container` standing, and the only classifications that clear a container are embedded-without-seed and floating — both a lie about what is drawn, and form is what cleaning acts on. The brief now tells the truth about that and puts the repair in a note. **If a region with no container is genuinely wanted there, the agent needs a way to clear one without lying about form — that is a new tool or a new `classify_region` argument, i.e. a production change, and it belongs to its own slice.** It is not promised in prose here. **`LooseSpread = 4` was deliberately not changed.** Whether 4× is the right gate is a separate arc; this slice only makes the brief say what the gate is. **Deferred sweep of the retired loose unit — four sites, all in files this slice does not own.** Declined here rather than swept, because sibling slices are editing those files in parallel and a two-line doc edit buys nothing a follow-up cannot while risking a conflict on files this branch has no other business in: - `src/Orihon.UseCases/Regions/MeasureRegionRooms.cs:13-14` — a container "is never several times the size of it". - `src/Orihon.BlazorAdapter/PageWorkspace/PageWorkspacePage.razor:938` — "never several times larger". - `src/Orihon.Infrastructure/Gateways/SkiaContainerFiller.cs:189-190` — `Spread` documented as "by the larger of its two **dimensions**", the container's longer side: the exact misreading this PR's first review round was raised about, sitting on the code that reads `Math.Max(acrossRatio, downRatio)`. - `src/Orihon.Infrastructure/Gateways/SkiaContainerFiller.cs:163-166` — `Window`'s summary claims a fill that fills the window "still reports a spread over the limit and is refused rather than quietly cropped". True mid-page, **false at a sheet edge**, and now contradicted by a shipped brief and a passing integration test. The last two should be taken together by whichever arc owns that file; this one is a real inconsistency rather than a wording preference. **`RegionAuthoringTools.cs:551`** (`classify_region`'s own description) still tells this agent "A fill of a quarter of the sheet or more is refused" — the **share** rule, which only fires when no box is given, and the refiner always has one. That file belongs to a sibling slice in this batch. The brief inoculates the refiner against it in one sentence meanwhile, so the two no longer contradict each other in the same context window whichever order they land in. **No merge-order constraint:** this branch touches no file any sibling owns. **Found, not fixed, pre-existing on `main` and outside this slice:** two genuine stacked-summary defects, a member wearing its neighbour's doc, at `src/Orihon.BlazorAdapter/PageWorkspace/PageWorkspaceEffects.cs:83-88` and `tests/Orihon.BlazorAdapter.Tests/SetupChatTests.cs:41-47`. Neither matches the same-line `</summary><summary>` grep, which is how they have survived; they show up on an adjacent-line scan. `SeedDevData` is untouched, checked rather than assumed — the change adds no kind of user-authored content, only brief prose and tests. No ADR: nothing here decides anything beyond ADR 0012, and the one place a decision *was* needed is named above as its own slice. ## Open question for bjoern — not decided here **Which pass owns translator-pasted overlay lettering — a white halo round each glyph, no bubble — and a cover's display title and credits?** The cover clause and ADR 0023's floating-text rule point opposite ways. One agent reported that guessing decided whether **four of nine regions existed at all**, and two separate friction reports ask for the ruling. Nothing in this PR changes behaviour for it; it needs a house rule (ADR 0026) or an ADR 0023 amendment, and it is lost if this line is dropped. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The container half of the bbox-refinement brief described a tool that does
not exist. A leftover paragraph handed containers to "a later pass" three
lines under the step that gives this agent the seed and the tolerance — the
numbering ran 1, 2, 3, 5 where it had replaced a step. The size at which a
fill is refused was written as "several times the size", read as area, and
missed the real rule by a square: it is four times the box on its LONGER
SIDE, a linear ratio spanning the fill and the box together. tolerance had
no unit at all, so the lever agents move most was swept rather than chosen;
it is colour levels per channel against the seed's own colour, which is a
subtraction of two sampled hexes. And the two arms — raise when it stopped
short, lower when it escaped — assumed a window between them that a mottled
or graded interior does not have, with nothing to do when there is none.

The brief now states the mend it actually gets (one pixel, and only on a
fill already past its own text, so an outline crossed by overlapping art
stays open), what a refusal costs (the whole call, type and form included),
and an ending for a balloon with no workable value: keep the value whose
green stays inside the outline, note what happened, stop. Short over
escaped, because the container is what lettering is placed in and what
cleaning fills — green that left the balloon takes art with it, green that
stops short only leaves room unclaimed, and the reviewer has the same
threshold on a slider.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Four corrections of one kind: say what the tool does.

The refusal ratio is taken on each axis separately and the LARGER decides,
not on the longer side of the fill. For a column of vertical text — narrow
box, wide balloon — the longer-side reading predicts a number several times
under the one that refuses, which is the same "the tool disobeys its own
brief" complaint this slice exists to remove, moved to another axis. The
figure is also not handed back on a successful call: the answer gives the
share and the pixel size, and the ratio is stated only in the refusal, so
the brief says where headroom has to be worked out from. And because this
agent always has a box, the share of the page never decides its refusal.

A refusal leaves the placeholder type behind. Every box is created carrying
dialogue, and a refused call returns before anything is applied, so a region
moved on from reads to every later pass as "dialogue, form not judged"
rather than as untyped — which matters most at the ending that deliberately
parks a region there, since parking an sfx or a cover title there ships the
wrong type.

The no-landing-spot ending covered "stays inside" and "every value refused"
but not the case between them: a break into a neighbouring balloon lets every
value escape while none is refused, so the tool would take a container that
is two balloons and cleaning would erase the art between them. That one the
agent has to refuse for itself.

And the tolerance example over-trusted sample_colors, which reports the mean
of each colour it gathers and merges tones within about forty levels: the
measured step is a floor rather than the value, and where one colour comes
back the tone is subtle rather than absent.

Tests: the spread-arm behaviour folds into the prose test so prose and
behaviour break together, a new test follows a refusal from the box's
creation to what the next pass reads off it, and a panel test pins the
per-axis rule on a real page — a column of text whose balloon is ordinary
down the column and over the limit across it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
fix(agents): round 2 — the escaped container that stands, and the clipped window
All checks were successful
CI / build (pull_request) Successful in 27s
CI / test (pull_request) Successful in 1m5s
ad6f2d925e
The refiner's ending for a balloon no tolerance saves told the agent to refuse a call it
can only judge after making it, and promised a placeholder type where the tool has
already written one. The two shapes are now told apart by what the TOOL answered rather
than by what the green ran into: every call refused (nothing recorded, the placeholder
type stands) or the green escaped and the call was not refused (the container is already
on the region and nothing in the grant takes it back, so the last classification is the
one to make count and the note says where the green went and that it needs reseeding by
hand). Drops the guarantee that a fill running its whole window always comes back over
the limit — the window is clipped to the sheet, so a box near an edge gets a short one
and the same unstoppable leak is recorded like any other container.

Also in the tolerance section: a measured step reaches the middle of the tone, not its
near side, and one colour back from the sampler is as often its blind spot as a subtle
tone, since the box is drawn round the glyphs while the tone runs across the balloon.

Co-Authored-By: Claude Opus 5 (1M context) <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: ad6f2d9 · Generated: 2026-09-20 20:37:23 UTC · Revision: #1

Summary

Summary
Generated on: 09/20/2026 - 20:37:23
Coverage date: 09/20/2026 - 20:36:49 - 09/20/2026 - 20:37:19
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 535
Files: 248
Line coverage: 97% (20421 of 21034)
Covered lines: 20421
Uncovered lines: 613
Coverable lines: 21034
Total lines: 37177
Branch coverage: 85.8% (3800 of 4428)
Covered branches: 3800
Total branches: 4428
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 95.4%
Name Line Branch
Orihon.BlazorAdapter 95.4% 88.3%
Orihon.BlazorAdapter.Bible.AddBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.AddCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.AddHouseRuleRowRequested 100%
Orihon.BlazorAdapter.Bible.AddLoreRowRequested 100%
Orihon.BlazorAdapter.Bible.BibleEffects 89.8% 76.9%
Orihon.BlazorAdapter.Bible.BibleLoaded 100%
Orihon.BlazorAdapter.Bible.BiblePage 92.3% 80.5%
Orihon.BlazorAdapter.Bible.BibleReducers 90.6%
Orihon.BlazorAdapter.Bible.BibleState 100%
Orihon.BlazorAdapter.Bible.BibleWriteFailed 100%
Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.DeleteHouseRuleRowRequested 0%
Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested 0%
Orihon.BlazorAdapter.Bible.LoadBible 100%
Orihon.BlazorAdapter.Bible.ReorderBeatsRequested 0%
Orihon.BlazorAdapter.Bible.SaveOverviewRequested 100%
Orihon.BlazorAdapter.Bible.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateHouseRuleRowRequested 100%
Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested 100%
Orihon.BlazorAdapter.BlazorAdapterAssembly 100%
Orihon.BlazorAdapter.PageWorkspace.CaptionShape 100% 93.7%
Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace 100%
Orihon.BlazorAdapter.PageWorkspace.MeasurePageRooms 100%
Orihon.BlazorAdapter.PageWorkspace.PageRoomsMeasured 100%
Orihon.BlazorAdapter.PageWorkspace.PageStepsLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved 100%
Orihon.BlazorAdapter.PageWorkspace.PageViewport 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded 100%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage 93.2% 87.4%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers 100% 62.5%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState 100%
Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed 100%
Orihon.BlazorAdapter.PageWorkspace.RegionColorsSampled 100%
Orihon.BlazorAdapter.PageWorkspace.RegionCreated 100%
Orihon.BlazorAdapter.PageWorkspace.RegionSaved 100%
Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested 100%
Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SampleRegionColorsRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SaveContainerRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested 100%
Orihon.BlazorAdapter.Projects.CreateProjectRequested 100%
Orihon.BlazorAdapter.Projects.DecideSetupContinuation 100%
Orihon.BlazorAdapter.Projects.DeleteProjectRequested 100%
Orihon.BlazorAdapter.Projects.FinishSetupRequested 100%
Orihon.BlazorAdapter.Projects.ImportPagesRequested 100%
Orihon.BlazorAdapter.Projects.LoadWizard 100%
Orihon.BlazorAdapter.Projects.PageOrganizer 96% 95%
Orihon.BlazorAdapter.Projects.PagesImported 100%
Orihon.BlazorAdapter.Projects.ProjectDeleteFailed 100%
Orihon.BlazorAdapter.Projects.ProjectListEffects 100% 100%
Orihon.BlazorAdapter.Projects.ProjectListPage 89.7% 91.6%
Orihon.BlazorAdapter.Projects.ProjectListReducers 100%
Orihon.BlazorAdapter.Projects.ProjectListState 100%
Orihon.BlazorAdapter.Projects.ProjectsLoaded 100%
Orihon.BlazorAdapter.Projects.ProjectWizardEffects 93.8% 90%
Orihon.BlazorAdapter.Projects.ProjectWizardPage 95.3% 84.1%
Orihon.BlazorAdapter.Projects.ProjectWizardReducers 100%
Orihon.BlazorAdapter.Projects.ProjectWizardState 100%
Orihon.BlazorAdapter.Projects.SetupChat 93.5% 100%
Orihon.BlazorAdapter.Projects.SetupChatEffects 100% 100%
Orihon.BlazorAdapter.Projects.SetupChatFailed 100%
Orihon.BlazorAdapter.Projects.SetupChatReducers 100%
Orihon.BlazorAdapter.Projects.SetupChatState 100%
Orihon.BlazorAdapter.Projects.SetupChatUpdated 100%
Orihon.BlazorAdapter.Projects.StartSetupChat 100%
Orihon.BlazorAdapter.Projects.SubmitSetupAnswer 100%
Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardLoaded 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested 100%
Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested 100%
Orihon.BlazorAdapter.Projects.WizardWriteFailed 100%
Orihon.BlazorAdapter.Rulings.AcceptProposalRequested 100%
Orihon.BlazorAdapter.Rulings.AnsweredRuling 100%
Orihon.BlazorAdapter.Rulings.AnswerRulingRequested 100%
Orihon.BlazorAdapter.Rulings.DeclineProposalRequested 100%
Orihon.BlazorAdapter.Rulings.DismissRulingRequested 100%
Orihon.BlazorAdapter.Rulings.RulingBar 98.2% 95%
Orihon.BlazorAdapter.Rulings.RulingDeskBridge 94.2% 91.6%
Orihon.BlazorAdapter.Rulings.RulingsEffects 95.4% 83.3%
Orihon.BlazorAdapter.Rulings.RulingsLoaded 100%
Orihon.BlazorAdapter.Rulings.RulingsReducers 100%
Orihon.BlazorAdapter.Rulings.RulingsState 100%
Orihon.BlazorAdapter.Rulings.RulingWriteFailed 100%
Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested 100%
Orihon.BlazorAdapter.Runs.CancelMonitorRun 100%
Orihon.BlazorAdapter.Runs.MonitorPageRef 100%
Orihon.BlazorAdapter.Runs.MonitorRunLoaded 100%
Orihon.BlazorAdapter.Runs.RetryMonitorExecution 100%
Orihon.BlazorAdapter.Runs.RunChangedBridge 95% 92.8%
Orihon.BlazorAdapter.Runs.RunMonitor 97.9% 96.2%
Orihon.BlazorAdapter.Runs.RunMonitorEffects 100% 91.6%
Orihon.BlazorAdapter.Runs.RunMonitorReducers 100%
Orihon.BlazorAdapter.Runs.RunMonitorState 100%
Orihon.BlazorAdapter.Settings.AgentDebriefsLoaded 100%
Orihon.BlazorAdapter.Settings.AgentDebriefsLoadFailed 100%
Orihon.BlazorAdapter.Settings.AgentEffortPicked 100%
Orihon.BlazorAdapter.Settings.AgentEffortSaved 100%
Orihon.BlazorAdapter.Settings.AgentEffortSaveFailed 100%
Orihon.BlazorAdapter.Settings.AgentFeedbackLoaded 100%
Orihon.BlazorAdapter.Settings.AgentFeedbackLoadFailed 0%
Orihon.BlazorAdapter.Settings.AgentModelPicked 100%
Orihon.BlazorAdapter.Settings.AgentModelSaved 100%
Orihon.BlazorAdapter.Settings.AgentModelSaveFailed 100%
Orihon.BlazorAdapter.Settings.AgentRoutingPicked 100%
Orihon.BlazorAdapter.Settings.AgentRoutingSaved 100%
Orihon.BlazorAdapter.Settings.AgentRoutingSaveFailed 0%
Orihon.BlazorAdapter.Settings.AgentTranscriptsLoaded 100%
Orihon.BlazorAdapter.Settings.AgentTranscriptsLoadFailed 0%
Orihon.BlazorAdapter.Settings.EffortOption 100% 100%
Orihon.BlazorAdapter.Settings.FloatingPassToggled 100%
Orihon.BlazorAdapter.Settings.KeySaved 100%
Orihon.BlazorAdapter.Settings.KeySaveFailed 100%
Orihon.BlazorAdapter.Settings.ModelOptionsLoaded 100%
Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable 100%
Orihon.BlazorAdapter.Settings.RoutingOption 100% 100%
Orihon.BlazorAdapter.Settings.RunConcurrencyPicked 100%
Orihon.BlazorAdapter.Settings.RunConcurrencySaveFailed 100%
Orihon.BlazorAdapter.Settings.SaveKeyRequested 100%
Orihon.BlazorAdapter.Settings.SettingsEffects 89.3% 68.4%
Orihon.BlazorAdapter.Settings.SettingsLoaded 100%
Orihon.BlazorAdapter.Settings.SettingsPage 96.5% 89%
Orihon.BlazorAdapter.Settings.SettingsReducers 93% 50%
Orihon.BlazorAdapter.Settings.SettingsState 100%
Orihon.BlazorAdapter.Settings.TranscriptFilterPicked 100%
Orihon.BlazorAdapter.Settings.TranscriptPicked 100%
Orihon.BlazorAdapter.Settings.TranscriptTextLoaded 100%
Orihon.BlazorAdapter.Settings.TranscriptTextLoadFailed 100%
Orihon.BlazorAdapter.Uploads.UploadTransfer 96.5% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferProgress 100% 100%
Orihon.BlazorAdapter.Uploads.UploadTransferResult 100%
Orihon.BlazorAdapter.Workspace.CreateChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteChapterRequested 100%
Orihon.BlazorAdapter.Workspace.DeletePageRequested 100%
Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace 100%
Orihon.BlazorAdapter.Workspace.MovePageRequested 100%
Orihon.BlazorAdapter.Workspace.ProjectMetadataCard 95.6% 92.8%
Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects 100% 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded 100%
Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage 95.5% 88.3%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers 100% 62.5%
Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState 100%
Orihon.BlazorAdapter.Workspace.RenameChapterRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested 100%
Orihon.BlazorAdapter.Workspace.ReorderPagesRequested 100%
Orihon.BlazorAdapter.Workspace.RunAnnotationRequested 100%
Orihon.BlazorAdapter.Workspace.RunBibleRequested 100%
Orihon.BlazorAdapter.Workspace.RunTranslationRequested 100%
Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested 100%
Orihon.BlazorAdapter.Workspace.SaveSummaryRequested 100%
Orihon.BlazorAdapter.Workspace.SetPageKindRequested 100%
Orihon.BlazorAdapter.Workspace.SummaryDeleted 100%
Orihon.BlazorAdapter.Workspace.SummarySaved 100%
Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested 100%
Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed 100%
Orihon.Domain - 100%
Name Line Branch
Orihon.Domain 100% 100%
Orihon.Domain.Agents.AgentDebrief 100% 100%
Orihon.Domain.Agents.AgentDescriptor 100%
Orihon.Domain.Agents.AgentFeedback 100% 100%
Orihon.Domain.Agents.AgentRoster 100% 100%
Orihon.Domain.Bible.Character 100% 100%
Orihon.Domain.Bible.GlossaryEntry 100% 100%
Orihon.Domain.Bible.HouseRule 100%
Orihon.Domain.Bible.LoreEntry 100% 100%
Orihon.Domain.Bible.PageSummary 100%
Orihon.Domain.Bible.StoryBeat 100%
Orihon.Domain.Bible.StoryOverview 100%
Orihon.Domain.Projects.Project 100% 100%
Orihon.Domain.Projects.ProjectProfile 100%
Orihon.Domain.Runs.Execution 100% 100%
Orihon.Domain.Runs.RegionProblem 100%
Orihon.Domain.Runs.Run 100%
Orihon.Domain.Settings.AppSetting 100%
Orihon.Domain.Text 100% 100%
Orihon.Domain.Translation.BoundingBox 100% 100%
Orihon.Domain.Translation.Chapter 100%
Orihon.Domain.Translation.InkColor 100% 100%
Orihon.Domain.Translation.NormalizedPoint 100%
Orihon.Domain.Translation.Page 100%
Orihon.Domain.Translation.Region 100% 100%
Orihon.Domain.Translation.RegionContainer 100% 100%
Orihon.Domain.Translation.RegionInk 100% 100%
Orihon.Domain.Translation.RegionProfile 100%
Orihon.Domain.Translation.RegionTypes 100% 100%
Orihon.Infrastructure - 97.1%
Name Line Branch
Orihon.Infrastructure 97.1% 78.1%
Orihon.Infrastructure.Agents.EfAgentDebriefStore 100%
Orihon.Infrastructure.Agents.EfAgentFeedbackStore 100%
Orihon.Infrastructure.Bible.EfBibleStore 95.2% 92.8%
Orihon.Infrastructure.DependencyInjection 100% 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter`1 100% 100%
Orihon.Infrastructure.Gateways.AgentTranscript 95.6% 89%
Orihon.Infrastructure.Gateways.ContainerMask 100% 100%
Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore 82.1% 80%
Orihon.Infrastructure.Gateways.HttpWebPageFetcher 95.1% 83.3%
Orihon.Infrastructure.Gateways.LabelFont 100% 50%
Orihon.Infrastructure.Gateways.OpenRouterLlmGateway 90.2% 82.1%
Orihon.Infrastructure.Gateways.SkiaContainerFiller 99.2% 94.7%
Orihon.Infrastructure.Gateways.SkiaImages 100% 100%
Orihon.Infrastructure.Gateways.SkiaPageImageRenderer 97.4% 88.1%
Orihon.Infrastructure.Gateways.SkiaRegionColorSampler 100% 100%
Orihon.Infrastructure.Persistence.Configurations.AgentDebriefConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.AgentFeedbackConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.HouseRuleConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper 100%
Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.RunConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration 100%
Orihon.Infrastructure.Persistence.Configurations.StoryOverviewConfiguration 100%
Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Orihon.Infrastructure.Persistence.Migrations.AddAgentDebriefs 99.5%
Orihon.Infrastructure.Persistence.Migrations.AddAgentFeedback 99.5%
Orihon.Infrastructure.Persistence.Migrations.AddAppSettings 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddHouseRules 99.6%
Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage 99.3%
Orihon.Infrastructure.Persistence.Migrations.AddRegionFitBoxDropFillHints 98.1%
Orihon.Infrastructure.Persistence.Migrations.AddRegionForm 99.4%
Orihon.Infrastructure.Persistence.Migrations.AddRegionInk 99.4%
Orihon.Infrastructure.Persistence.Migrations.AddRuns 99.1%
Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview 99.5%
Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain 97.3%
Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot 100%
Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns 97.2%
Orihon.Infrastructure.Persistence.Migrations.ReplaceFitBoxWithContainerSeed 99.2%
Orihon.Infrastructure.Persistence.OrihonDbContext 100%
Orihon.Infrastructure.Persistence.OrihonDbContextFactory 100%
Orihon.Infrastructure.Projects.EfProjectStore 100% 100%
Orihon.Infrastructure.Projects.FileSystemPageImageStore 100% 100%
Orihon.Infrastructure.Runs.EfRunStore 98.1% 75%
Orihon.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Orihon.Infrastructure.Translation.EfChapterStore 100% 100%
Orihon.Infrastructure.Translation.EfPageStore 98% 90%
Orihon.Infrastructure.Translation.EfRegionStore 100% 100%
Orihon.Infrastructure.Translation.Ordering 100% 100%
System.Text.RegularExpressions.Generated 70.6% 53.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4
77.9% 76.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1
59% 42.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3
89.4% 75%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030
A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2
83.7% 62.5%
Orihon.Kernel - 90.9%
Name Line Branch
Orihon.Kernel 90.9% 75%
Orihon.Kernel.Err`1 100%
Orihon.Kernel.Ok`1 100%
Orihon.Kernel.Result`1 88.8% 75%
Orihon.Server - 94.4%
Name Line Branch
Orihon.Server 94.4% 72%
Orihon.Server.Components.App 100%
Orihon.Server.Components.Layout.MainLayout 100%
Orihon.Server.Components.Pages.Gate 64.2% 66.6%
Orihon.Server.RunEngineBootstrap 100%
Orihon.Server.Security.AccessGate 91.8% 41.6%
Orihon.Server.Security.AccessSecret 100% 50%
Orihon.Server.VolumeStartupValidator 100% 100%
Program 95.7% 84.6%
Orihon.UseCases - 97.6%
Name Line Branch
Orihon.UseCases 97.6% 89.2%
Orihon.UseCases.Agents.AgentAttemptPreparation 100%
Orihon.UseCases.Agents.AgentAttemptSupport 98.4% 98%
Orihon.UseCases.Agents.AgentBlueprint 100%
Orihon.UseCases.Agents.AgentCapDebrief 100%
Orihon.UseCases.Agents.AgentInvocation 100%
Orihon.UseCases.Agents.AgentOutcome 100%
Orihon.UseCases.Agents.AgentTool`1 90.9% 75%
Orihon.UseCases.Agents.AgentToolImage 100%
Orihon.UseCases.Agents.AgentToolResult 100%
Orihon.UseCases.Agents.Annotation.AddFloatingRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddFloatingRegionTool 96.8% 83.3%
Orihon.UseCases.Agents.Annotation.AddRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddRegionTool 95.4% 75%
Orihon.UseCases.Agents.Annotation.AnnotationBlueprints 100%
Orihon.UseCases.Agents.Annotation.AnnotationStage 100% 88.2%
Orihon.UseCases.Agents.Annotation.BboxCreationExecutor 94.1% 50%
Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor 96.5% 90%
Orihon.UseCases.Agents.Annotation.BoundBoxParams 100%
Orihon.UseCases.Agents.Annotation.BoundContactSheetTool 91.3% 75%
Orihon.UseCases.Agents.Annotation.BoundCropParams 100%
Orihon.UseCases.Agents.Annotation.BoundCropTool 100%
Orihon.UseCases.Agents.Annotation.BoundViewPageTool 94.2% 88.8%
Orihon.UseCases.Agents.Annotation.BoundViewParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionParams 100%
Orihon.UseCases.Agents.Annotation.ClassifyRegionTool 96.8% 75.8%
Orihon.UseCases.Agents.Annotation.ColorReading 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionParams 100%
Orihon.UseCases.Agents.Annotation.DeleteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryParams 100%
Orihon.UseCases.Agents.Annotation.FindGlossaryTool 88.2% 62.5%
Orihon.UseCases.Agents.Annotation.FloatingCreationExecutor 89.4% 50%
Orihon.UseCases.Agents.Annotation.FloatingQaExecutor 93.9% 83.3%
Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor 95.6% 75%
Orihon.UseCases.Agents.Annotation.ListRegionsTool 94.8% 78.9%
Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool 90.9% 50%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams 100%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool 95.8% 83.3%
Orihon.UseCases.Agents.Annotation.NoteRegionParams 100%
Orihon.UseCases.Agents.Annotation.NoteRegionTool 100% 100%
Orihon.UseCases.Agents.Annotation.PageQaExecutor 94.4% 81.8%
Orihon.UseCases.Agents.Annotation.QaReportSink 100% 100%
Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess 90.9% 72.7%
Orihon.UseCases.Agents.Annotation.RegionBriefing 100% 100%
Orihon.UseCases.Agents.Annotation.RegionCropParams 100%
Orihon.UseCases.Agents.Annotation.RegionCropTool 100%
Orihon.UseCases.Agents.Annotation.RegionProblemParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionParams 100%
Orihon.UseCases.Agents.Annotation.RejectRegionTool 100% 50%
Orihon.UseCases.Agents.Annotation.ReorderRegionParams 100%
Orihon.UseCases.Agents.Annotation.ReorderRegionTool 88% 60%
Orihon.UseCases.Agents.Annotation.ReportQaParams 100%
Orihon.UseCases.Agents.Annotation.ReportQaTool 97.7% 90%
Orihon.UseCases.Agents.Annotation.SampleColorsParams 100%
Orihon.UseCases.Agents.Annotation.SampleColorsTool 100% 100%
Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool 95.2% 75%
Orihon.UseCases.Agents.Annotation.SetInkParams 100%
Orihon.UseCases.Agents.Annotation.SetInkTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaParams 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaTool 100% 75%
Orihon.UseCases.Agents.Annotation.SetRegionInkParams 100%
Orihon.UseCases.Agents.Annotation.SetRegionInkTool 100% 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionParams 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionTool 100% 100%
Orihon.UseCases.Agents.Annotation.TranscriptionExecutor 96.4% 90%
Orihon.UseCases.Agents.AssistantSpoke 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor 96.9% 75%
Orihon.UseCases.Agents.BibleBuilding.GetRegionParams 100%
Orihon.UseCases.Agents.BibleBuilding.GetRegionTool 84.6% 72.2%
Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool 86.3% 90%
Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams 100%
Orihon.UseCases.Agents.Inspection.PageImageAccess 95.5% 83.9%
Orihon.UseCases.Agents.Inspection.ViewAccount 100% 87.5%
Orihon.UseCases.Agents.ReportFrictionParams 100%
Orihon.UseCases.Agents.ReportFrictionTool 100% 92.8%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool 100% 50%
Orihon.UseCases.Agents.ResearchSetup.AskUserParams 100%
Orihon.UseCases.Agents.ResearchSetup.AskUserTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.ListBibleTool 89.4% 100%
Orihon.UseCases.Agents.ResearchSetup.ListPagesTool 97% 83.3%
Orihon.UseCases.Agents.ResearchSetup.LocatedPage 100%
Orihon.UseCases.Agents.ResearchSetup.PageByNumber 95% 91.6%
Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool 95.2% 90%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool 100% 75%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool 96.5% 95.8%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams 100%
Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool 92.3% 71.4%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams 100%
Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool 92.3% 71.4%
Orihon.UseCases.Agents.ResearchSetup.ViewPageParams 100%
Orihon.UseCases.Agents.ResearchSetup.ViewPageTool 100% 100%
Orihon.UseCases.Agents.RoundStarted 100%
Orihon.UseCases.Agents.Rulings.AnswerRuling 100%
Orihon.UseCases.Agents.Rulings.DismissRuling 100%
Orihon.UseCases.Agents.Rulings.HouseRuleProposal 100%
Orihon.UseCases.Agents.Rulings.ListPendingRulings 100%
Orihon.UseCases.Agents.Rulings.ListRuleProposals 100%
Orihon.UseCases.Agents.Rulings.PendingRuling 100%
Orihon.UseCases.Agents.Rulings.ProposeHouseRuleParams 100%
Orihon.UseCases.Agents.Rulings.ProposeHouseRuleTool 100% 100%
Orihon.UseCases.Agents.Rulings.RequestRulingParams 100%
Orihon.UseCases.Agents.Rulings.RequestRulingTool 100% 81.2%
Orihon.UseCases.Agents.Rulings.RulingAnswer 100%
Orihon.UseCases.Agents.Rulings.RulingDesk 97.8% 80%
Orihon.UseCases.Agents.Rulings.RulingOption 100%
Orihon.UseCases.Agents.Rulings.RulingOptionParams 100%
Orihon.UseCases.Agents.Rulings.SettledRuling 100%
Orihon.UseCases.Agents.Rulings.WithdrawRuleProposal 100%
Orihon.UseCases.Agents.Setup.ResearchSetupExecutor 98.5% 92.8%
Orihon.UseCases.Agents.Setup.SetupChatEntry 100%
Orihon.UseCases.Agents.Setup.SetupConversation 100% 90.6%
Orihon.UseCases.Agents.Setup.SetupConversationRegistry 100%
Orihon.UseCases.Agents.ToolCalled 100%
Orihon.UseCases.Agents.ToolCompleted 100%
Orihon.UseCases.Agents.TranscriptLabel 100% 100%
Orihon.UseCases.Agents.Translation.GetPageSummaryParams 100%
Orihon.UseCases.Agents.Translation.GetPageSummaryTool 80% 66.6%
Orihon.UseCases.Agents.Translation.SetTranslationParams 100%
Orihon.UseCases.Agents.Translation.SetTranslationTool 88.5% 78.5%
Orihon.UseCases.Agents.Translation.TranslationBlueprint 100%
Orihon.UseCases.Agents.Translation.TranslationExecutor 93.8% 71.4%
Orihon.UseCases.Agents.Translation.UpdateGlossaryEnParams 100%
Orihon.UseCases.Agents.Translation.UpdateGlossaryEnTool 82.6% 62.5%
Orihon.UseCases.Bible.AddCharacter 100% 100%
Orihon.UseCases.Bible.AddGlossaryEntry 100% 100%
Orihon.UseCases.Bible.AddHouseRule 100% 100%
Orihon.UseCases.Bible.AddLoreEntry 100% 100%
Orihon.UseCases.Bible.AddStoryBeat 100% 100%
Orihon.UseCases.Bible.BibleDto 100%
Orihon.UseCases.Bible.CharacterDto 100%
Orihon.UseCases.Bible.DeleteCharacter 100% 100%
Orihon.UseCases.Bible.DeleteGlossaryEntry 100% 100%
Orihon.UseCases.Bible.DeleteHouseRule 100% 100%
Orihon.UseCases.Bible.DeleteLoreEntry 100% 100%
Orihon.UseCases.Bible.DeletePageSummary 100% 100%
Orihon.UseCases.Bible.DeleteStoryBeat 100% 100%
Orihon.UseCases.Bible.GetBible 100% 100%
Orihon.UseCases.Bible.GlossaryEntryDto 100%
Orihon.UseCases.Bible.HouseRuleDto 100%
Orihon.UseCases.Bible.LoreEntryDto 100%
Orihon.UseCases.Bible.PageSummaryDto 100%
Orihon.UseCases.Bible.ReorderStoryBeats 100%
Orihon.UseCases.Bible.SetPageSummary 100% 100%
Orihon.UseCases.Bible.SetStoryOverview 100% 100%
Orihon.UseCases.Bible.StoryBeatDto 100%
Orihon.UseCases.Bible.StoryOverviewDto 100%
Orihon.UseCases.Bible.UpdateCharacter 100% 100%
Orihon.UseCases.Bible.UpdateGlossaryEntry 100% 100%
Orihon.UseCases.Bible.UpdateHouseRule 100% 100%
Orihon.UseCases.Bible.UpdateLoreEntry 100% 100%
Orihon.UseCases.Bible.UpdateStoryBeat 100% 100%
Orihon.UseCases.Chapters.ChapterDto 100%
Orihon.UseCases.Chapters.CreateChapter 100% 100%
Orihon.UseCases.Chapters.DeleteChapter 100% 100%
Orihon.UseCases.Chapters.RenameChapter 100% 100%
Orihon.UseCases.Chapters.ReorderChapters 100%
Orihon.UseCases.Debriefs.AgentDebriefDto 90.9%
Orihon.UseCases.Debriefs.AgentFeedbackDto 83.3%
Orihon.UseCases.Debriefs.ClearAgentDebriefs 100%
Orihon.UseCases.Debriefs.ClearAgentFeedback 100%
Orihon.UseCases.Debriefs.ListAgentDebriefs 100% 100%
Orihon.UseCases.Debriefs.ListAgentFeedback 100% 75%
Orihon.UseCases.DependencyInjection 100%
Orihon.UseCases.Diagnostics.SeedDevData 99.2% 84.3%
Orihon.UseCases.Gateways.ColorShare 100%
Orihon.UseCases.Gateways.ContainerFit 75% 100%
Orihon.UseCases.Gateways.ContainerMaskBits 100% 100%
Orihon.UseCases.Gateways.ContainerRequest 100%
Orihon.UseCases.Gateways.LabeledBox 100%
Orihon.UseCases.Gateways.LlmKeyInfo 100%
Orihon.UseCases.Gateways.LlmModel 100%
Orihon.UseCases.Gateways.LlmReasoning 100% 100%
Orihon.UseCases.Gateways.PixelWindow 100%
Orihon.UseCases.Gateways.RenderedView 100%
Orihon.UseCases.Gateways.StoredTranscript 100%
Orihon.UseCases.Gateways.TranscriptHeader 97.3% 90.9%
Orihon.UseCases.Gateways.TranscriptSummary 100%
Orihon.UseCases.NextOrder 100%
Orihon.UseCases.Pages.DeletePage 100% 100%
Orihon.UseCases.Pages.DeletePages 100% 100%
Orihon.UseCases.Pages.GetPage 100% 100%
Orihon.UseCases.Pages.GetPageSteps 100% 100%
Orihon.UseCases.Pages.GetProjectWorkspace 100% 100%
Orihon.UseCases.Pages.ImportPages 100% 100%
Orihon.UseCases.Pages.ImportPagesResult 100%
Orihon.UseCases.Pages.MarkPageAnnotated 100% 100%
Orihon.UseCases.Pages.MovePage 100% 92.8%
Orihon.UseCases.Pages.MovePages 100% 100%
Orihon.UseCases.Pages.PageDetailDto 100%
Orihon.UseCases.Pages.PageDto 100%
Orihon.UseCases.Pages.PageStepsDto 100%
Orihon.UseCases.Pages.PageUpload 100%
Orihon.UseCases.Pages.ProjectWorkspaceDto 100%
Orihon.UseCases.Pages.ReorderPages 100%
Orihon.UseCases.Pages.SetPageMeta 100% 100%
Orihon.UseCases.Pages.WorkspaceChapterDto 100%
Orihon.UseCases.Projects.CompleteProjectSetup 100% 93.7%
Orihon.UseCases.Projects.CreateProject 100% 100%
Orihon.UseCases.Projects.DeleteProject 100% 100%
Orihon.UseCases.Projects.GetProject 100% 100%
Orihon.UseCases.Projects.ListProjects 100%
Orihon.UseCases.Projects.ProjectDto 96.1%
Orihon.UseCases.Projects.StartAnnotationRun 96.4% 92.8%
Orihon.UseCases.Projects.StartBibleRun 90.9% 83.3%
Orihon.UseCases.Projects.StartSetupRun 100% 100%
Orihon.UseCases.Projects.StartTranslationRun 90.9% 83.3%
Orihon.UseCases.Projects.StoredPageImage 100%
Orihon.UseCases.Projects.UpdateProjectMetadata 100% 100%
Orihon.UseCases.Regions.CreateRegion 100% 100%
Orihon.UseCases.Regions.DeleteRegion 100% 100%
Orihon.UseCases.Regions.MeasureRegionRooms 95.8% 75%
Orihon.UseCases.Regions.RegionDto 97.2%
Orihon.UseCases.Regions.ReorderRegions 100%
Orihon.UseCases.Regions.SampleRegionColors 100% 50%
Orihon.UseCases.Regions.UpdateRegion 100% 100%
Orihon.UseCases.Runs.AnnotationPipeline 100% 100%
Orihon.UseCases.Runs.AttemptLedger 100% 100%
Orihon.UseCases.Runs.ExecutionDto 93.3%
Orihon.UseCases.Runs.ExecutionProgress 100%
Orihon.UseCases.Runs.ExecutionProgressRegistry 100% 100%
Orihon.UseCases.Runs.ExecutionPulseRelay 100% 100%
Orihon.UseCases.Runs.PlannedExecution 100%
Orihon.UseCases.Runs.PulseTarget 100%
Orihon.UseCases.Runs.ReprocessPage 100% 94.4%
Orihon.UseCases.Runs.ReprocessTranslation 94.1% 92.8%
Orihon.UseCases.Runs.RunDto 93.3% 90%
Orihon.UseCases.Runs.RunEngine 95% 94.4%
Orihon.UseCases.Runs.RunEngineOptions 100% 100%
Orihon.UseCases.Runs.StageContext 100% 50%
Orihon.UseCases.Runs.StageHaltedException 100%
Orihon.UseCases.Runs.WorkStates 100% 83.3%
Orihon.UseCases.Settings.AgentSettingDto 100% 100%
Orihon.UseCases.Settings.ConcurrencySetting 100% 100%
Orihon.UseCases.Settings.EffortSetting 100% 100%
Orihon.UseCases.Settings.GetSettings 100% 100%
Orihon.UseCases.Settings.ListModelOptions 100% 100%
Orihon.UseCases.Settings.RoutingSetting 100% 100%
Orihon.UseCases.Settings.SaveAgentEffort 100% 100%
Orihon.UseCases.Settings.SaveAgentModel 100% 100%
Orihon.UseCases.Settings.SaveAgentRouting 100% 100%
Orihon.UseCases.Settings.SaveFloatingPass 100% 100%
Orihon.UseCases.Settings.SaveOpenRouterKey 100% 100%
Orihon.UseCases.Settings.SaveRunConcurrency 100% 100%
Orihon.UseCases.Settings.SettingKeys 100% 100%
Orihon.UseCases.Settings.SettingsDto 100% 100%
Orihon.UseCases.Transcripts.AgentTranscriptDto 100%
Orihon.UseCases.Transcripts.AgentTranscriptListDto 100%
Orihon.UseCases.Transcripts.AgentTranscriptTextDto 100%
Orihon.UseCases.Transcripts.ListAgentTranscripts 100% 100%
Orihon.UseCases.Transcripts.ReadAgentTranscript 100% 100%
<!-- coverage-comment --> > 🔄 **Auto-updating coverage report** — this comment is regenerated on every push, so the numbers below always reflect the commit shown here, not the branch tip. > > **Commit:** `ad6f2d9` · **Generated:** 2026-09-20 20:37:23 UTC · **Revision:** #1 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 09/20/2026 - 20:37:23 | | Coverage date: | 09/20/2026 - 20:36:49 - 09/20/2026 - 20:37:19 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 535 | | Files: | 248 | | **Line coverage:** | 97% (20421 of 21034) | | Covered lines: | 20421 | | Uncovered lines: | 613 | | Coverable lines: | 21034 | | Total lines: | 37177 | | **Branch coverage:** | 85.8% (3800 of 4428) | | Covered branches: | 3800 | | Total branches: | 4428 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 95.4%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**95.4%**|**88.3%**| |Orihon.BlazorAdapter.Bible.AddBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddHouseRuleRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddLoreRowRequested|100%|| |Orihon.BlazorAdapter.Bible.BibleEffects|89.8%|76.9%| |Orihon.BlazorAdapter.Bible.BibleLoaded|100%|| |Orihon.BlazorAdapter.Bible.BiblePage|92.3%|80.5%| |Orihon.BlazorAdapter.Bible.BibleReducers|90.6%|| |Orihon.BlazorAdapter.Bible.BibleState|100%|| |Orihon.BlazorAdapter.Bible.BibleWriteFailed|100%|| |Orihon.BlazorAdapter.Bible.DeleteBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.DeleteHouseRuleRowRequested|0%|| |Orihon.BlazorAdapter.Bible.DeleteLoreRowRequested|0%|| |Orihon.BlazorAdapter.Bible.LoadBible|100%|| |Orihon.BlazorAdapter.Bible.ReorderBeatsRequested|0%|| |Orihon.BlazorAdapter.Bible.SaveOverviewRequested|100%|| |Orihon.BlazorAdapter.Bible.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateHouseRuleRowRequested|100%|| |Orihon.BlazorAdapter.Bible.UpdateLoreRowRequested|100%|| |Orihon.BlazorAdapter.BlazorAdapterAssembly|100%|| |Orihon.BlazorAdapter.PageWorkspace.CaptionShape|100%|93.7%| |Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace|100%|| |Orihon.BlazorAdapter.PageWorkspace.MeasurePageRooms|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageRoomsMeasured|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageStepsLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageSummarySaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageViewport|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspacePage|93.2%|87.4%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers|100%|62.5%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionColorsSampled|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionCreated|100%|| |Orihon.BlazorAdapter.PageWorkspace.RegionSaved|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReorderRegionsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessPageRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.ReprocessTranslationRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SampleRegionColorsRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SaveContainerRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SavePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SaveRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.SetPageMetaRequested|100%|| |Orihon.BlazorAdapter.Projects.CreateProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.DecideSetupContinuation|100%|| |Orihon.BlazorAdapter.Projects.DeleteProjectRequested|100%|| |Orihon.BlazorAdapter.Projects.FinishSetupRequested|100%|| |Orihon.BlazorAdapter.Projects.ImportPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.LoadWizard|100%|| |Orihon.BlazorAdapter.Projects.PageOrganizer|96%|95%| |Orihon.BlazorAdapter.Projects.PagesImported|100%|| |Orihon.BlazorAdapter.Projects.ProjectDeleteFailed|100%|| |Orihon.BlazorAdapter.Projects.ProjectListEffects|100%|100%| |Orihon.BlazorAdapter.Projects.ProjectListPage|89.7%|91.6%| |Orihon.BlazorAdapter.Projects.ProjectListReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectListState|100%|| |Orihon.BlazorAdapter.Projects.ProjectsLoaded|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardEffects|93.8%|90%| |Orihon.BlazorAdapter.Projects.ProjectWizardPage|95.3%|84.1%| |Orihon.BlazorAdapter.Projects.ProjectWizardReducers|100%|| |Orihon.BlazorAdapter.Projects.ProjectWizardState|100%|| |Orihon.BlazorAdapter.Projects.SetupChat|93.5%|100%| |Orihon.BlazorAdapter.Projects.SetupChatEffects|100%|100%| |Orihon.BlazorAdapter.Projects.SetupChatFailed|100%|| |Orihon.BlazorAdapter.Projects.SetupChatReducers|100%|| |Orihon.BlazorAdapter.Projects.SetupChatState|100%|| |Orihon.BlazorAdapter.Projects.SetupChatUpdated|100%|| |Orihon.BlazorAdapter.Projects.StartSetupChat|100%|| |Orihon.BlazorAdapter.Projects.SubmitSetupAnswer|100%|| |Orihon.BlazorAdapter.Projects.WizardDeletePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardLoaded|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardMovePagesToNewChapterRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Projects.WizardWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.AcceptProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.AnsweredRuling|100%|| |Orihon.BlazorAdapter.Rulings.AnswerRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.DeclineProposalRequested|100%|| |Orihon.BlazorAdapter.Rulings.DismissRulingRequested|100%|| |Orihon.BlazorAdapter.Rulings.RulingBar|98.2%|95%| |Orihon.BlazorAdapter.Rulings.RulingDeskBridge|94.2%|91.6%| |Orihon.BlazorAdapter.Rulings.RulingsEffects|95.4%|83.3%| |Orihon.BlazorAdapter.Rulings.RulingsLoaded|100%|| |Orihon.BlazorAdapter.Rulings.RulingsReducers|100%|| |Orihon.BlazorAdapter.Rulings.RulingsState|100%|| |Orihon.BlazorAdapter.Rulings.RulingWriteFailed|100%|| |Orihon.BlazorAdapter.Rulings.SaveAnswerAsHouseRuleRequested|100%|| |Orihon.BlazorAdapter.Runs.CancelMonitorRun|100%|| |Orihon.BlazorAdapter.Runs.MonitorPageRef|100%|| |Orihon.BlazorAdapter.Runs.MonitorRunLoaded|100%|| |Orihon.BlazorAdapter.Runs.RetryMonitorExecution|100%|| |Orihon.BlazorAdapter.Runs.RunChangedBridge|95%|92.8%| |Orihon.BlazorAdapter.Runs.RunMonitor|97.9%|96.2%| |Orihon.BlazorAdapter.Runs.RunMonitorEffects|100%|91.6%| |Orihon.BlazorAdapter.Runs.RunMonitorReducers|100%|| |Orihon.BlazorAdapter.Runs.RunMonitorState|100%|| |Orihon.BlazorAdapter.Settings.AgentDebriefsLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentDebriefsLoadFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentEffortSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentFeedbackLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentFeedbackLoadFailed|0%|| |Orihon.BlazorAdapter.Settings.AgentModelPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentModelSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentModelSaveFailed|100%|| |Orihon.BlazorAdapter.Settings.AgentRoutingPicked|100%|| |Orihon.BlazorAdapter.Settings.AgentRoutingSaved|100%|| |Orihon.BlazorAdapter.Settings.AgentRoutingSaveFailed|0%|| |Orihon.BlazorAdapter.Settings.AgentTranscriptsLoaded|100%|| |Orihon.BlazorAdapter.Settings.AgentTranscriptsLoadFailed|0%|| |Orihon.BlazorAdapter.Settings.EffortOption|100%|100%| |Orihon.BlazorAdapter.Settings.FloatingPassToggled|100%|| |Orihon.BlazorAdapter.Settings.KeySaved|100%|| |Orihon.BlazorAdapter.Settings.KeySaveFailed|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsLoaded|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable|100%|| |Orihon.BlazorAdapter.Settings.RoutingOption|100%|100%| |Orihon.BlazorAdapter.Settings.RunConcurrencyPicked|100%|| |Orihon.BlazorAdapter.Settings.RunConcurrencySaveFailed|100%|| |Orihon.BlazorAdapter.Settings.SaveKeyRequested|100%|| |Orihon.BlazorAdapter.Settings.SettingsEffects|89.3%|68.4%| |Orihon.BlazorAdapter.Settings.SettingsLoaded|100%|| |Orihon.BlazorAdapter.Settings.SettingsPage|96.5%|89%| |Orihon.BlazorAdapter.Settings.SettingsReducers|93%|50%| |Orihon.BlazorAdapter.Settings.SettingsState|100%|| |Orihon.BlazorAdapter.Settings.TranscriptFilterPicked|100%|| |Orihon.BlazorAdapter.Settings.TranscriptPicked|100%|| |Orihon.BlazorAdapter.Settings.TranscriptTextLoaded|100%|| |Orihon.BlazorAdapter.Settings.TranscriptTextLoadFailed|100%|| |Orihon.BlazorAdapter.Uploads.UploadTransfer|96.5%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferProgress|100%|100%| |Orihon.BlazorAdapter.Uploads.UploadTransferResult|100%|| |Orihon.BlazorAdapter.Workspace.CreateChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeletePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.DeleteSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.LoadProjectWorkspace|100%|| |Orihon.BlazorAdapter.Workspace.MovePageRequested|100%|| |Orihon.BlazorAdapter.Workspace.ProjectMetadataCard|95.6%|92.8%| |Orihon.BlazorAdapter.Workspace.ProjectMetadataSaved|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceEffects|100%|100%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceLoaded|100%|| |Orihon.BlazorAdapter.Workspace.ProjectWorkspacePage|95.5%|88.3%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceReducers|100%|62.5%| |Orihon.BlazorAdapter.Workspace.ProjectWorkspaceState|100%|| |Orihon.BlazorAdapter.Workspace.RenameChapterRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderChaptersRequested|100%|| |Orihon.BlazorAdapter.Workspace.ReorderPagesRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunAnnotationRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunBibleRequested|100%|| |Orihon.BlazorAdapter.Workspace.RunTranslationRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveProjectMetadataRequested|100%|| |Orihon.BlazorAdapter.Workspace.SaveSummaryRequested|100%|| |Orihon.BlazorAdapter.Workspace.SetPageKindRequested|100%|| |Orihon.BlazorAdapter.Workspace.SummaryDeleted|100%|| |Orihon.BlazorAdapter.Workspace.SummarySaved|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceImportRequested|100%|| |Orihon.BlazorAdapter.Workspace.WorkspaceWriteFailed|100%|| </details> <details><summary>Orihon.Domain - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Domain**|**100%**|**100%**| |Orihon.Domain.Agents.AgentDebrief|100%|100%| |Orihon.Domain.Agents.AgentDescriptor|100%|| |Orihon.Domain.Agents.AgentFeedback|100%|100%| |Orihon.Domain.Agents.AgentRoster|100%|100%| |Orihon.Domain.Bible.Character|100%|100%| |Orihon.Domain.Bible.GlossaryEntry|100%|100%| |Orihon.Domain.Bible.HouseRule|100%|| |Orihon.Domain.Bible.LoreEntry|100%|100%| |Orihon.Domain.Bible.PageSummary|100%|| |Orihon.Domain.Bible.StoryBeat|100%|| |Orihon.Domain.Bible.StoryOverview|100%|| |Orihon.Domain.Projects.Project|100%|100%| |Orihon.Domain.Projects.ProjectProfile|100%|| |Orihon.Domain.Runs.Execution|100%|100%| |Orihon.Domain.Runs.RegionProblem|100%|| |Orihon.Domain.Runs.Run|100%|| |Orihon.Domain.Settings.AppSetting|100%|| |Orihon.Domain.Text|100%|100%| |Orihon.Domain.Translation.BoundingBox|100%|100%| |Orihon.Domain.Translation.Chapter|100%|| |Orihon.Domain.Translation.InkColor|100%|100%| |Orihon.Domain.Translation.NormalizedPoint|100%|| |Orihon.Domain.Translation.Page|100%|| |Orihon.Domain.Translation.Region|100%|100%| |Orihon.Domain.Translation.RegionContainer|100%|100%| |Orihon.Domain.Translation.RegionInk|100%|100%| |Orihon.Domain.Translation.RegionProfile|100%|| |Orihon.Domain.Translation.RegionTypes|100%|100%| </details> <details><summary>Orihon.Infrastructure - 97.1%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**97.1%**|**78.1%**| |Orihon.Infrastructure.Agents.EfAgentDebriefStore|100%|| |Orihon.Infrastructure.Agents.EfAgentFeedbackStore|100%|| |Orihon.Infrastructure.Bible.EfBibleStore|95.2%|92.8%| |Orihon.Infrastructure.DependencyInjection|100%|100%| |Orihon.Infrastructure.Gateways.AgentToolAdapter|100%|| |Orihon.Infrastructure.Gateways.AgentToolAdapter`1|100%|100%| |Orihon.Infrastructure.Gateways.AgentTranscript|95.6%|89%| |Orihon.Infrastructure.Gateways.ContainerMask|100%|100%| |Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore|82.1%|80%| |Orihon.Infrastructure.Gateways.HttpWebPageFetcher|95.1%|83.3%| |Orihon.Infrastructure.Gateways.LabelFont|100%|50%| |Orihon.Infrastructure.Gateways.OpenRouterLlmGateway|90.2%|82.1%| |Orihon.Infrastructure.Gateways.SkiaContainerFiller|99.2%|94.7%| |Orihon.Infrastructure.Gateways.SkiaImages|100%|100%| |Orihon.Infrastructure.Gateways.SkiaPageImageRenderer|97.4%|88.1%| |Orihon.Infrastructure.Gateways.SkiaRegionColorSampler|100%|100%| |Orihon.Infrastructure.Persistence.Configurations.AgentDebriefConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.AgentFeedbackConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ChapterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.CharacterConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ExecutionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.GlossaryEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.HouseRuleConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.JsonColumnMapper|100%|| |Orihon.Infrastructure.Persistence.Configurations.LoreEntryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.PageSummaryConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.ProjectConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RegionConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.RunConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.StoryBeatConfiguration|100%|| |Orihon.Infrastructure.Persistence.Configurations.StoryOverviewConfiguration|100%|| |Orihon.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Orihon.Infrastructure.Persistence.Migrations.AddAgentDebriefs|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.AddAgentFeedback|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.AddAppSettings|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddExecutionFeedbackRegions|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddHouseRules|99.6%|| |Orihon.Infrastructure.Persistence.Migrations.AddProjectSourceLanguage|99.3%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionFitBoxDropFillHints|98.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionForm|99.4%|| |Orihon.Infrastructure.Persistence.Migrations.AddRegionInk|99.4%|| |Orihon.Infrastructure.Persistence.Migrations.AddRuns|99.1%|| |Orihon.Infrastructure.Persistence.Migrations.AddStoryOverview|99.5%|| |Orihon.Infrastructure.Persistence.Migrations.InitialTranslationDomain|97.3%|| |Orihon.Infrastructure.Persistence.Migrations.OrihonDbContextModelSnapshot|100%|| |Orihon.Infrastructure.Persistence.Migrations.RenameSourceTargetColumns|97.2%|| |Orihon.Infrastructure.Persistence.Migrations.ReplaceFitBoxWithContainerSeed|99.2%|| |Orihon.Infrastructure.Persistence.OrihonDbContext|100%|| |Orihon.Infrastructure.Persistence.OrihonDbContextFactory|100%|| |Orihon.Infrastructure.Projects.EfProjectStore|100%|100%| |Orihon.Infrastructure.Projects.FileSystemPageImageStore|100%|100%| |Orihon.Infrastructure.Runs.EfRunStore|98.1%|75%| |Orihon.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Orihon.Infrastructure.Translation.EfChapterStore|100%|100%| |Orihon.Infrastructure.Translation.EfPageStore|98%|90%| |Orihon.Infrastructure.Translation.EfRegionStore|100%|100%| |Orihon.Infrastructure.Translation.Ordering|100%|100%| |System.Text.RegularExpressions.Generated|70.6%|53.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlankLines_4|77.9%|76.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__BlockBreaks_1|59%|42.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__SpaceRuns_3|89.4%|75%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F7FCA343D2B99030<br/>A835C427B12E8B84E2A8A7283193FC51C220B5B4E80CE8D56__Tags_2|83.7%|62.5%| </details> <details><summary>Orihon.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Kernel**|**90.9%**|**75%**| |Orihon.Kernel.Err`1|100%|| |Orihon.Kernel.Ok`1|100%|| |Orihon.Kernel.Result`1|88.8%|75%| </details> <details><summary>Orihon.Server - 94.4%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Server**|**94.4%**|**72%**| |Orihon.Server.Components.App|100%|| |Orihon.Server.Components.Layout.MainLayout|100%|| |Orihon.Server.Components.Pages.Gate|64.2%|66.6%| |Orihon.Server.RunEngineBootstrap|100%|| |Orihon.Server.Security.AccessGate|91.8%|41.6%| |Orihon.Server.Security.AccessSecret|100%|50%| |Orihon.Server.VolumeStartupValidator|100%|100%| |Program|95.7%|84.6%| </details> <details><summary>Orihon.UseCases - 97.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**97.6%**|**89.2%**| |Orihon.UseCases.Agents.AgentAttemptPreparation|100%|| |Orihon.UseCases.Agents.AgentAttemptSupport|98.4%|98%| |Orihon.UseCases.Agents.AgentBlueprint|100%|| |Orihon.UseCases.Agents.AgentCapDebrief|100%|| |Orihon.UseCases.Agents.AgentInvocation|100%|| |Orihon.UseCases.Agents.AgentOutcome|100%|| |Orihon.UseCases.Agents.AgentTool`1|90.9%|75%| |Orihon.UseCases.Agents.AgentToolImage|100%|| |Orihon.UseCases.Agents.AgentToolResult|100%|| |Orihon.UseCases.Agents.Annotation.AddFloatingRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddFloatingRegionTool|96.8%|83.3%| |Orihon.UseCases.Agents.Annotation.AddRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddRegionTool|95.4%|75%| |Orihon.UseCases.Agents.Annotation.AnnotationBlueprints|100%|| |Orihon.UseCases.Agents.Annotation.AnnotationStage|100%|88.2%| |Orihon.UseCases.Agents.Annotation.BboxCreationExecutor|94.1%|50%| |Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor|96.5%|90%| |Orihon.UseCases.Agents.Annotation.BoundBoxParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundContactSheetTool|91.3%|75%| |Orihon.UseCases.Agents.Annotation.BoundCropParams|100%|| |Orihon.UseCases.Agents.Annotation.BoundCropTool|100%|| |Orihon.UseCases.Agents.Annotation.BoundViewPageTool|94.2%|88.8%| |Orihon.UseCases.Agents.Annotation.BoundViewParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ClassifyRegionTool|96.8%|75.8%| |Orihon.UseCases.Agents.Annotation.ColorReading|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteBoundRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.DeleteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.DeleteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.FindGlossaryParams|100%|| |Orihon.UseCases.Agents.Annotation.FindGlossaryTool|88.2%|62.5%| |Orihon.UseCases.Agents.Annotation.FloatingCreationExecutor|89.4%|50%| |Orihon.UseCases.Agents.Annotation.FloatingQaExecutor|93.9%|83.3%| |Orihon.UseCases.Agents.Annotation.FloatingTranscriptionExecutor|95.6%|75%| |Orihon.UseCases.Agents.Annotation.ListRegionsTool|94.8%|78.9%| |Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool|90.9%|50%| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool|95.8%|83.3%| |Orihon.UseCases.Agents.Annotation.NoteRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.NoteRegionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.PageQaExecutor|94.4%|81.8%| |Orihon.UseCases.Agents.Annotation.QaReportSink|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionAuthoringAccess|90.9%|72.7%| |Orihon.UseCases.Agents.Annotation.RegionBriefing|100%|100%| |Orihon.UseCases.Agents.Annotation.RegionCropParams|100%|| |Orihon.UseCases.Agents.Annotation.RegionCropTool|100%|| |Orihon.UseCases.Agents.Annotation.RegionProblemParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.RejectRegionTool|100%|50%| |Orihon.UseCases.Agents.Annotation.ReorderRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.ReorderRegionTool|88%|60%| |Orihon.UseCases.Agents.Annotation.ReportQaParams|100%|| |Orihon.UseCases.Agents.Annotation.ReportQaTool|97.7%|90%| |Orihon.UseCases.Agents.Annotation.SampleColorsParams|100%|| |Orihon.UseCases.Agents.Annotation.SampleColorsTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SampleRegionColorsTool|95.2%|75%| |Orihon.UseCases.Agents.Annotation.SetInkParams|100%|| |Orihon.UseCases.Agents.Annotation.SetInkTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.Annotation.SetPageMetaTool|100%|75%| |Orihon.UseCases.Agents.Annotation.SetRegionInkParams|100%|| |Orihon.UseCases.Agents.Annotation.SetRegionInkTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SetTranscriptionParams|100%|| |Orihon.UseCases.Agents.Annotation.SetTranscriptionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.TranscriptionExecutor|96.4%|90%| |Orihon.UseCases.Agents.AssistantSpoke|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor|96.9%|75%| |Orihon.UseCases.Agents.BibleBuilding.GetRegionParams|100%|| |Orihon.UseCases.Agents.BibleBuilding.GetRegionTool|84.6%|72.2%| |Orihon.UseCases.Agents.BibleBuilding.ListProjectRegionsTool|86.3%|90%| |Orihon.UseCases.Agents.BibleBuilding.ListRegionsParams|100%|| |Orihon.UseCases.Agents.Inspection.PageImageAccess|95.5%|83.9%| |Orihon.UseCases.Agents.Inspection.ViewAccount|100%|87.5%| |Orihon.UseCases.Agents.ReportFrictionParams|100%|| |Orihon.UseCases.Agents.ReportFrictionTool|100%|92.8%| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool|100%|50%| |Orihon.UseCases.Agents.ResearchSetup.AskUserParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AskUserTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListBibleTool|89.4%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListPagesTool|97%|83.3%| |Orihon.UseCases.Agents.ResearchSetup.LocatedPage|100%|| |Orihon.UseCases.Agents.ResearchSetup.PageByNumber|95%|91.6%| |Orihon.UseCases.Agents.ResearchSetup.ResearchSetupBlueprint|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageMetaTool|95.2%|90%| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetPageSummaryTool|100%|75%| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetProjectMetadataTool|96.5%|95.8%| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.SetStoryOverviewTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertCharacterTool|92.3%|71.4%| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.UpsertLoreTool|92.3%|71.4%| |Orihon.UseCases.Agents.ResearchSetup.ViewPageParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.ViewPageTool|100%|100%| |Orihon.UseCases.Agents.RoundStarted|100%|| |Orihon.UseCases.Agents.Rulings.AnswerRuling|100%|| |Orihon.UseCases.Agents.Rulings.DismissRuling|100%|| |Orihon.UseCases.Agents.Rulings.HouseRuleProposal|100%|| |Orihon.UseCases.Agents.Rulings.ListPendingRulings|100%|| |Orihon.UseCases.Agents.Rulings.ListRuleProposals|100%|| |Orihon.UseCases.Agents.Rulings.PendingRuling|100%|| |Orihon.UseCases.Agents.Rulings.ProposeHouseRuleParams|100%|| |Orihon.UseCases.Agents.Rulings.ProposeHouseRuleTool|100%|100%| |Orihon.UseCases.Agents.Rulings.RequestRulingParams|100%|| |Orihon.UseCases.Agents.Rulings.RequestRulingTool|100%|81.2%| |Orihon.UseCases.Agents.Rulings.RulingAnswer|100%|| |Orihon.UseCases.Agents.Rulings.RulingDesk|97.8%|80%| |Orihon.UseCases.Agents.Rulings.RulingOption|100%|| |Orihon.UseCases.Agents.Rulings.RulingOptionParams|100%|| |Orihon.UseCases.Agents.Rulings.SettledRuling|100%|| |Orihon.UseCases.Agents.Rulings.WithdrawRuleProposal|100%|| |Orihon.UseCases.Agents.Setup.ResearchSetupExecutor|98.5%|92.8%| |Orihon.UseCases.Agents.Setup.SetupChatEntry|100%|| |Orihon.UseCases.Agents.Setup.SetupConversation|100%|90.6%| |Orihon.UseCases.Agents.Setup.SetupConversationRegistry|100%|| |Orihon.UseCases.Agents.ToolCalled|100%|| |Orihon.UseCases.Agents.ToolCompleted|100%|| |Orihon.UseCases.Agents.TranscriptLabel|100%|100%| |Orihon.UseCases.Agents.Translation.GetPageSummaryParams|100%|| |Orihon.UseCases.Agents.Translation.GetPageSummaryTool|80%|66.6%| |Orihon.UseCases.Agents.Translation.SetTranslationParams|100%|| |Orihon.UseCases.Agents.Translation.SetTranslationTool|88.5%|78.5%| |Orihon.UseCases.Agents.Translation.TranslationBlueprint|100%|| |Orihon.UseCases.Agents.Translation.TranslationExecutor|93.8%|71.4%| |Orihon.UseCases.Agents.Translation.UpdateGlossaryEnParams|100%|| |Orihon.UseCases.Agents.Translation.UpdateGlossaryEnTool|82.6%|62.5%| |Orihon.UseCases.Bible.AddCharacter|100%|100%| |Orihon.UseCases.Bible.AddGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.AddHouseRule|100%|100%| |Orihon.UseCases.Bible.AddLoreEntry|100%|100%| |Orihon.UseCases.Bible.AddStoryBeat|100%|100%| |Orihon.UseCases.Bible.BibleDto|100%|| |Orihon.UseCases.Bible.CharacterDto|100%|| |Orihon.UseCases.Bible.DeleteCharacter|100%|100%| |Orihon.UseCases.Bible.DeleteGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.DeleteHouseRule|100%|100%| |Orihon.UseCases.Bible.DeleteLoreEntry|100%|100%| |Orihon.UseCases.Bible.DeletePageSummary|100%|100%| |Orihon.UseCases.Bible.DeleteStoryBeat|100%|100%| |Orihon.UseCases.Bible.GetBible|100%|100%| |Orihon.UseCases.Bible.GlossaryEntryDto|100%|| |Orihon.UseCases.Bible.HouseRuleDto|100%|| |Orihon.UseCases.Bible.LoreEntryDto|100%|| |Orihon.UseCases.Bible.PageSummaryDto|100%|| |Orihon.UseCases.Bible.ReorderStoryBeats|100%|| |Orihon.UseCases.Bible.SetPageSummary|100%|100%| |Orihon.UseCases.Bible.SetStoryOverview|100%|100%| |Orihon.UseCases.Bible.StoryBeatDto|100%|| |Orihon.UseCases.Bible.StoryOverviewDto|100%|| |Orihon.UseCases.Bible.UpdateCharacter|100%|100%| |Orihon.UseCases.Bible.UpdateGlossaryEntry|100%|100%| |Orihon.UseCases.Bible.UpdateHouseRule|100%|100%| |Orihon.UseCases.Bible.UpdateLoreEntry|100%|100%| |Orihon.UseCases.Bible.UpdateStoryBeat|100%|100%| |Orihon.UseCases.Chapters.ChapterDto|100%|| |Orihon.UseCases.Chapters.CreateChapter|100%|100%| |Orihon.UseCases.Chapters.DeleteChapter|100%|100%| |Orihon.UseCases.Chapters.RenameChapter|100%|100%| |Orihon.UseCases.Chapters.ReorderChapters|100%|| |Orihon.UseCases.Debriefs.AgentDebriefDto|90.9%|| |Orihon.UseCases.Debriefs.AgentFeedbackDto|83.3%|| |Orihon.UseCases.Debriefs.ClearAgentDebriefs|100%|| |Orihon.UseCases.Debriefs.ClearAgentFeedback|100%|| |Orihon.UseCases.Debriefs.ListAgentDebriefs|100%|100%| |Orihon.UseCases.Debriefs.ListAgentFeedback|100%|75%| |Orihon.UseCases.DependencyInjection|100%|| |Orihon.UseCases.Diagnostics.SeedDevData|99.2%|84.3%| |Orihon.UseCases.Gateways.ColorShare|100%|| |Orihon.UseCases.Gateways.ContainerFit|75%|100%| |Orihon.UseCases.Gateways.ContainerMaskBits|100%|100%| |Orihon.UseCases.Gateways.ContainerRequest|100%|| |Orihon.UseCases.Gateways.LabeledBox|100%|| |Orihon.UseCases.Gateways.LlmKeyInfo|100%|| |Orihon.UseCases.Gateways.LlmModel|100%|| |Orihon.UseCases.Gateways.LlmReasoning|100%|100%| |Orihon.UseCases.Gateways.PixelWindow|100%|| |Orihon.UseCases.Gateways.RenderedView|100%|| |Orihon.UseCases.Gateways.StoredTranscript|100%|| |Orihon.UseCases.Gateways.TranscriptHeader|97.3%|90.9%| |Orihon.UseCases.Gateways.TranscriptSummary|100%|| |Orihon.UseCases.NextOrder|100%|| |Orihon.UseCases.Pages.DeletePage|100%|100%| |Orihon.UseCases.Pages.DeletePages|100%|100%| |Orihon.UseCases.Pages.GetPage|100%|100%| |Orihon.UseCases.Pages.GetPageSteps|100%|100%| |Orihon.UseCases.Pages.GetProjectWorkspace|100%|100%| |Orihon.UseCases.Pages.ImportPages|100%|100%| |Orihon.UseCases.Pages.ImportPagesResult|100%|| |Orihon.UseCases.Pages.MarkPageAnnotated|100%|100%| |Orihon.UseCases.Pages.MovePage|100%|92.8%| |Orihon.UseCases.Pages.MovePages|100%|100%| |Orihon.UseCases.Pages.PageDetailDto|100%|| |Orihon.UseCases.Pages.PageDto|100%|| |Orihon.UseCases.Pages.PageStepsDto|100%|| |Orihon.UseCases.Pages.PageUpload|100%|| |Orihon.UseCases.Pages.ProjectWorkspaceDto|100%|| |Orihon.UseCases.Pages.ReorderPages|100%|| |Orihon.UseCases.Pages.SetPageMeta|100%|100%| |Orihon.UseCases.Pages.WorkspaceChapterDto|100%|| |Orihon.UseCases.Projects.CompleteProjectSetup|100%|93.7%| |Orihon.UseCases.Projects.CreateProject|100%|100%| |Orihon.UseCases.Projects.DeleteProject|100%|100%| |Orihon.UseCases.Projects.GetProject|100%|100%| |Orihon.UseCases.Projects.ListProjects|100%|| |Orihon.UseCases.Projects.ProjectDto|96.1%|| |Orihon.UseCases.Projects.StartAnnotationRun|96.4%|92.8%| |Orihon.UseCases.Projects.StartBibleRun|90.9%|83.3%| |Orihon.UseCases.Projects.StartSetupRun|100%|100%| |Orihon.UseCases.Projects.StartTranslationRun|90.9%|83.3%| |Orihon.UseCases.Projects.StoredPageImage|100%|| |Orihon.UseCases.Projects.UpdateProjectMetadata|100%|100%| |Orihon.UseCases.Regions.CreateRegion|100%|100%| |Orihon.UseCases.Regions.DeleteRegion|100%|100%| |Orihon.UseCases.Regions.MeasureRegionRooms|95.8%|75%| |Orihon.UseCases.Regions.RegionDto|97.2%|| |Orihon.UseCases.Regions.ReorderRegions|100%|| |Orihon.UseCases.Regions.SampleRegionColors|100%|50%| |Orihon.UseCases.Regions.UpdateRegion|100%|100%| |Orihon.UseCases.Runs.AnnotationPipeline|100%|100%| |Orihon.UseCases.Runs.AttemptLedger|100%|100%| |Orihon.UseCases.Runs.ExecutionDto|93.3%|| |Orihon.UseCases.Runs.ExecutionProgress|100%|| |Orihon.UseCases.Runs.ExecutionProgressRegistry|100%|100%| |Orihon.UseCases.Runs.ExecutionPulseRelay|100%|100%| |Orihon.UseCases.Runs.PlannedExecution|100%|| |Orihon.UseCases.Runs.PulseTarget|100%|| |Orihon.UseCases.Runs.ReprocessPage|100%|94.4%| |Orihon.UseCases.Runs.ReprocessTranslation|94.1%|92.8%| |Orihon.UseCases.Runs.RunDto|93.3%|90%| |Orihon.UseCases.Runs.RunEngine|95%|94.4%| |Orihon.UseCases.Runs.RunEngineOptions|100%|100%| |Orihon.UseCases.Runs.StageContext|100%|50%| |Orihon.UseCases.Runs.StageHaltedException|100%|| |Orihon.UseCases.Runs.WorkStates|100%|83.3%| |Orihon.UseCases.Settings.AgentSettingDto|100%|100%| |Orihon.UseCases.Settings.ConcurrencySetting|100%|100%| |Orihon.UseCases.Settings.EffortSetting|100%|100%| |Orihon.UseCases.Settings.GetSettings|100%|100%| |Orihon.UseCases.Settings.ListModelOptions|100%|100%| |Orihon.UseCases.Settings.RoutingSetting|100%|100%| |Orihon.UseCases.Settings.SaveAgentEffort|100%|100%| |Orihon.UseCases.Settings.SaveAgentModel|100%|100%| |Orihon.UseCases.Settings.SaveAgentRouting|100%|100%| |Orihon.UseCases.Settings.SaveFloatingPass|100%|100%| |Orihon.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Orihon.UseCases.Settings.SaveRunConcurrency|100%|100%| |Orihon.UseCases.Settings.SettingKeys|100%|100%| |Orihon.UseCases.Settings.SettingsDto|100%|100%| |Orihon.UseCases.Transcripts.AgentTranscriptDto|100%|| |Orihon.UseCases.Transcripts.AgentTranscriptListDto|100%|| |Orihon.UseCases.Transcripts.AgentTranscriptTextDto|100%|| |Orihon.UseCases.Transcripts.ListAgentTranscripts|100%|100%| |Orihon.UseCases.Transcripts.ReadAgentTranscript|100%|100%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! A PR that fixes prose and treats the prose like production code — 146 changed lines of brief against 400 lines of tests that make the words and the tool break together. This is my favorite kind of candy~ ♡ A brief that lies to its agent is a bug that runs on every page, and you hunted each lie down to the constant it contradicts. *

Verdict: ✅ Looks good to me~

Everything verified, not just read:

  • Full suite 1321/1321 (151 / 599 / 277 / 294) — exactly your arithmetic, recomputed from a clean run on ad6f2d9. Build Release with -warnaserror: 0 warnings, 0 errors. (The sandbox was being squeezed by sibling review sessions — MSBuild OOM'd twice, so the test runs went through vstest on the freshly built DLLs; counts are from clean runs.)
  • Every prose claim traced to production: Spread really is Math.Max of two per-axis ratios over the fill∪box union (SkiaContainerFiller.cs:206-218); Window really pads (reach−1)/2 per axis and clips to the sheet (:170-189); Unleak really is erode→keep-the-piece-holding-the-box→dilate∩original (ContainerMask.cs:246-283) — "cut away, nothing repaired" is exactly what it does; the refusal really returns before ApplyAsync, so the Dialogue placeholder from add_region survives and list_regions prints dialogue, form not judged — the exact string your test asserts; reject_region writes only the text fields and leaves Type/Form/Container standing, exactly as the escaped-container test pins. The sampler: cluster means, SameColorWithin = 40, box-only read — "AVERAGE", "about forty levels", "reads your own box" all check out, and the 58-level step is arithmetic-true (0xf1 − 0xb7). ♪
  • Mutation probes, for real:
    1. Brief reverted to base → exactly your 7 prose tests go red (592 green), each on its own Contains. The pins are directional, not decorative.
    2. The longer-side misreading, probed numerically on the real whole-page-with-gutters.jpg fixture (flood + window replicated, per-channel tolerance 16, 20×170 box, seed 170,90): real per-axis Spread = 5.05 → refused; longer-side mutant = 1.235 → sails through as an ordinary container. A_fill_is_judged_on_the_worse_of_its_two_axes separates them decisively — and that's the bug that motivated the whole size-rule rewrite, now impossible to reintroduce quietly.
  • Numbering guard — I parsed all six briefs myself: 4/4/3/3/5/3 contiguous steps, no holes, no vacuous pass. The "paragraph that ate step 4" can never happen again without a red test. Fufu, structural~
  • Cross-brief supports hold: both QA briefs agree short green isn't a send-back and escaped green is the failure; the reviewer's slider (PageWorkspacePage.razor:227-240) really is the same threshold lever your note aims the human at. "Short is the way to be wrong" is backed on all four legs.

💡 Little ideas (non-blocking)~

  1. ContainerFillerPanelTests.cs:275 — fit.Spread is decimal?, so the bare fit.Spread > down * 2m works via lifted comparison, but its neighbour uses fit.Spread!.Value — a ! on one line and not the next is a tiny inconsistency; either lift both or assert non-null once.
  2. SkiaContainerFiller.cs:163-166 — you flagged Window's own summary yourself as the real inconsistency (the "still reports a spread over the limit" claim is false at a sheet edge, now contradicted by a shipped brief + passing test). Seconding loudly: whoever owns that file next should take :163-166 and :189-190 together — the deferred-sweep list is the right call for this slice given the sibling-ownership constraint, but let's not let that one rot. ♡

✅ What I liked~

  • The two-shapes rule keyed on what the tool did, not what the green ran into — because you discovered the window clips at the sheet edge. That's not prose polish, that's a discovery about the tool's own geometry, and the corner-vs-mid-sheet test pins it against the real filler. Wonderful~
  • The placeholder-type ending. "An sfx parked as dialogue ships wearing a type nobody chose" is the kind of sentence that saves a future agent five rounds, and you proved it with add_region → refused classify_region → list_regions.
  • Tests that compute the step from the two hexes they quote, interpolate the domain's constants instead of copying them, and count occurrences instead of Contains-ing — prose and code break together, everywhere, on purpose.
  • The honest-notes discipline: the design fork named rather than silently closed, LooseSpread = 4 left untouched, merge-order constraint stated and true (I checked the 4 changed files against the sibling-slice claims).

Relay for bjoern: the open question at the bottom — which pass owns translator-pasted overlay lettering and a cover's display title/credits, ADR 0026 or an 0023 amendment — is a real fork with two friction reports behind it. This PR correctly doesn't decide it; the ruling shouldn't get lost when this merges.


Automated review by Jibril · September 20, 2026
CI/CD: absent for head SHA (PR opened 22:27, no run posted yet; ci.yml fires on pull_request) · Local checks: full suite 1321/1321 green, build 0w/0e, 2 mutation probes

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! A PR that fixes *prose* and treats the prose like production code — 146 changed lines of brief against 400 lines of tests that make the words and the tool break together. This is my favorite kind of candy~ ♡ A brief that lies to its agent is a bug that runs on every page, and you hunted each lie down to the constant it contradicts. * ### Verdict: ✅ Looks good to me~ **Everything verified, not just read:** - **Full suite 1321/1321** (151 / 599 / 277 / 294) — exactly your arithmetic, recomputed from a clean run on `ad6f2d9`. Build Release with `-warnaserror`: 0 warnings, 0 errors. *(The sandbox was being squeezed by sibling review sessions — MSBuild OOM'd twice, so the test runs went through `vstest` on the freshly built DLLs; counts are from clean runs.)* - **Every prose claim traced to production:** `Spread` really is `Math.Max` of two per-axis ratios over the fill∪box union (`SkiaContainerFiller.cs:206-218`); `Window` really pads `(reach−1)/2` per axis and clips to the sheet (`:170-189`); `Unleak` really is erode→keep-the-piece-holding-the-box→dilate∩original (`ContainerMask.cs:246-283`) — "cut away, nothing repaired" is exactly what it does; the refusal really returns before `ApplyAsync`, so the `Dialogue` placeholder from `add_region` survives and `list_regions` prints `dialogue, form not judged` — the exact string your test asserts; `reject_region` writes only the text fields and leaves Type/Form/Container standing, exactly as the escaped-container test pins. The sampler: cluster **means**, `SameColorWithin = 40`, box-only read — "AVERAGE", "about forty levels", "reads your own box" all check out, and the 58-level step is arithmetic-true (0xf1 − 0xb7). ♪ - **Mutation probes, for real:** 1. Brief reverted to base → **exactly your 7 prose tests go red** (592 green), each on its own `Contains`. The pins are directional, not decorative. 2. The longer-side misreading, probed numerically on the real `whole-page-with-gutters.jpg` fixture (flood + window replicated, per-channel tolerance 16, 20×170 box, seed 170,90): **real per-axis Spread = 5.05 → refused; longer-side mutant = 1.235 → sails through as an ordinary container.** `A_fill_is_judged_on_the_worse_of_its_two_axes` separates them decisively — and that's the bug that motivated the whole size-rule rewrite, now impossible to reintroduce quietly. - **Numbering guard** — I parsed all six briefs myself: 4/4/3/3/5/3 contiguous steps, no holes, no vacuous pass. The "paragraph that ate step 4" can never happen again without a red test. Fufu, structural~ - **Cross-brief supports hold:** both QA briefs agree short green isn't a send-back and escaped green is *the* failure; the reviewer's slider (`PageWorkspacePage.razor:227-240`) really is the same threshold lever your note aims the human at. "Short is the way to be wrong" is backed on all four legs. #### 💡 Little ideas (non-blocking)~ 1. **`ContainerFillerPanelTests.cs:275`** — `fit.Spread` is `decimal?`, so the bare `fit.Spread > down * 2m` works via lifted comparison, but its neighbour uses `fit.Spread!.Value` — a `!` on one line and not the next is a tiny inconsistency; either lift both or assert non-null once. 2. **`SkiaContainerFiller.cs:163-166`** — you flagged `Window`'s own summary yourself as the real inconsistency (the "still reports a spread over the limit" claim is false at a sheet edge, now contradicted by a shipped brief + passing test). Seconding loudly: whoever owns that file next should take `:163-166` and `:189-190` together — the deferred-sweep list is the right call for *this* slice given the sibling-ownership constraint, but let's not let that one rot. ♡ #### ✅ What I liked~ - The two-shapes rule keyed on **what the tool did, not what the green ran into** — because you discovered the window clips at the sheet edge. That's not prose polish, that's a discovery about the tool's own geometry, and the corner-vs-mid-sheet test pins it against the real filler. Wonderful~ - The placeholder-type ending. "An sfx parked as dialogue ships wearing a type nobody chose" is the kind of sentence that saves a future agent five rounds, and you *proved* it with `add_region` → refused `classify_region` → `list_regions`. - Tests that compute the step from the two hexes they quote, interpolate the domain's constants instead of copying them, and count occurrences instead of `Contains`-ing — prose and code break together, everywhere, on purpose. - The honest-notes discipline: the design fork named rather than silently closed, `LooseSpread = 4` left untouched, merge-order constraint stated and true (I checked the 4 changed files against the sibling-slice claims). **Relay for bjoern:** the open question at the bottom — which pass owns translator-pasted overlay lettering and a cover's display title/credits, ADR 0026 or an 0023 amendment — is a real fork with two friction reports behind it. This PR correctly doesn't decide it; the ruling shouldn't get lost when this merges. --- *Automated review by Jibril · September 20, 2026* *CI/CD: absent for head SHA (PR opened 22:27, no run posted yet; `ci.yml` fires on pull_request) · Local checks: full suite 1321/1321 green, build 0w/0e, 2 mutation probes*
bjoern merged commit 1caf03ff83 into main 2026-09-20 23:45:14 +02:00
bjoern deleted branch fix/annotation-brief-sweep 2026-09-20 23:45:15 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 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!136
No description provided.