feat: a box says which mark it is for, and a refiner can say what it left behind #86

Merged
bjoern merged 1 commit from worktree-feat-region-provenance into main 2026-07-27 22:33:23 +02:00
Member

Rebased onto main after #84 merged (b72a008) — now a single commit, 081ce23, with no dependency on any other branch. Content is byte-identical to the 876e45a Jibril reviewed; only the base moved (it now also sits on top of #85).

Second half of the same transcript-reading that produced #84. That PR fixed what the agent could not measure; this fixes what it could not know.

The evidence

A refinement run on p2r16, on a box holding the bottom of an sfx cluster and the top of the screen text beneath it:

Let me compute overlap areas: screen text 55%. Jagged small cluster 60%. Nearly equal. Hmm.

Three rounds went on that — reconstructing what the detector must have been thinking — and it was still guessing when the run died. It could not have succeeded. The answer was never in the pixels, and the pass that knew it never wrote it down.

Provenance forward: add_region(box, note)

The note says which mark, in a few words. It reaches Region at creation and comes straight back out of RegionBriefing.ForRefinement, which already puts a region's notes in the refiner's kickoff — the pipe existed, nothing filled it.

Required, and guarded (blank refused), so the schema and the handler agree per AGENTS.md, following add_glossary. Optional would defeat it: the boxes that most need a note are the ambiguous ones a model is least likely to notice are ambiguous. The boxing brief is told to round outward at 50–100 px, so this is the common case, not the exotic one.

A way out, backward: note_region(note)

Even knowing its mark, a refiner facing a box holding two had no legal move — shift onto either and the other is unboxed, and it may not draw the sibling; reject_region/delete_region both assert there is nothing there, the opposite complaint. It was being asked a question with no available right answer, which is the actual bug in that trace.

Now it boxes the mark it was sent for and writes down what it left behind. list_regions shows notes → page QA reads it → feedback → SendChainBackAsync reaches BboxCreation, the one agent that can add the missing region. No new plumbing — ADR 0019's send-back already did all of this; the refiner just had no door onto it.

The write appends (existing — note; a repeat is a no-op, since a retried stage says the same thing twice). Notes are where each pass leaves what it learned, and a replace would let the refiner erase the creation note that told it what its own region was — the exact hazard AGENTS.md flags about replace-by-key writes.

Prompts

Boxing gets what the note is for; refinement gets "believe the kickoff's mark over your own reading of the pixels" plus the one-round straddle procedure; page QA gets the instruction to read notes, not just boxes — a straddle report belongs in feedback (no label is wrong, a box is MISSING), and QA is the only agent that can act on it. Unread, the mark stays unboxed for the rest of the run.

Tests

+8 from this branch; 783/783 on the rebased base (Domain 91, UseCases 328, Integration 171, BlazorAdapter 193). The pre-rebase figure was 779 against a base of 771 — the four extra now come from #84 and #85 having landed, not from this branch.

  • Both boxing tools refuse a blank or missing note and leave no half-made region behind.
  • A note reaches the region and the refiner's briefing — asserted through RegionBriefing, not just the row, because a note nobody reads does not exist.
  • The refiner records a straddle without touching its box; notes append rather than replace; a repeat is not a second copy; a blank is refused rather than clearing what is there.
  • Schema: add_region requires box + note; note_region requires note.
  • The grant matrix gains note_region in refinement's row and nowhere else.
  • Seed: the rough region carries both passes' notes, asserted in SeedDevDataTests.

Notes

  • Not browser-verified: no UI surface changed. The region notes field is already rendered in the page editor, and the seeded region now exercises it.
  • The one judgement call worth arguing with: required rather than optional on add_region. It costs a phrase per box on every page. I think that's right — the note is worth most exactly where a model wouldn't volunteer it — but it is a real per-box token cost and it's your call.
  • ADR 0016 (catalog, why required, why append) and ADR 0017 (matrix row) updated.

🤖 Generated with Claude Code

Rebased onto `main` after #84 merged (`b72a008`) — now a single commit, `081ce23`, with no dependency on any other branch. Content is byte-identical to the `876e45a` Jibril reviewed; only the base moved (it now also sits on top of #85). Second half of the same transcript-reading that produced #84. That PR fixed what the agent could not *measure*; this fixes what it could not *know*. ## The evidence A refinement run on `p2r16`, on a box holding the bottom of an sfx cluster and the top of the screen text beneath it: > *Let me compute overlap areas: screen text 55%. Jagged small cluster 60%. Nearly equal. Hmm.* Three rounds went on that — reconstructing what the detector must have been thinking — and it was still guessing when the run died. It could not have succeeded. **The answer was never in the pixels**, and the pass that knew it never wrote it down. ## Provenance forward: `add_region(box, note)` The note says which mark, in a few words. It reaches `Region` at creation and comes straight back out of `RegionBriefing.ForRefinement`, which already puts a region's notes in the refiner's kickoff — the pipe existed, nothing filled it. **Required, and guarded** (blank refused), so the schema and the handler agree per AGENTS.md, following `add_glossary`. Optional would defeat it: the boxes that most need a note are the ambiguous ones a model is least likely to notice are ambiguous. The boxing brief is told to round outward at 50–100 px, so this is the common case, not the exotic one. ## A way out, backward: `note_region(note)` Even knowing its mark, a refiner facing a box holding **two** had no legal move — shift onto either and the other is unboxed, and it may not draw the sibling; `reject_region`/`delete_region` both assert there is nothing there, the opposite complaint. It was being asked a question with no available right answer, which is the actual bug in that trace. Now it boxes the mark it was sent for and writes down what it left behind. `list_regions` shows notes → page QA reads it → feedback → `SendChainBackAsync` reaches `BboxCreation`, the one agent that can add the missing region. **No new plumbing** — ADR 0019's send-back already did all of this; the refiner just had no door onto it. The write **appends** (`existing — note`; a repeat is a no-op, since a retried stage says the same thing twice). Notes are where each pass leaves what it learned, and a replace would let the refiner erase the creation note that told it what its own region was — the exact hazard AGENTS.md flags about replace-by-key writes. ## Prompts Boxing gets what the note is for; refinement gets "believe the kickoff's mark over your own reading of the pixels" plus the one-round straddle procedure; page QA gets the instruction to read **notes**, not just boxes — a straddle report belongs in `feedback` (no label is wrong, a box is MISSING), and QA is the only agent that can act on it. Unread, the mark stays unboxed for the rest of the run. ## Tests **+8 from this branch; 783/783 on the rebased base** (Domain 91, UseCases 328, Integration 171, BlazorAdapter 193). The pre-rebase figure was 779 against a base of 771 — the four extra now come from #84 and #85 having landed, not from this branch. - Both boxing tools refuse a blank or missing note and leave **no half-made region** behind. - A note reaches the region *and the refiner's briefing* — asserted through `RegionBriefing`, not just the row, because a note nobody reads does not exist. - The refiner records a straddle without touching its box; notes append rather than replace; a repeat is not a second copy; a blank is refused rather than clearing what is there. - Schema: `add_region` requires `box` + `note`; `note_region` requires `note`. - The grant matrix gains `note_region` in refinement's row and nowhere else. - Seed: the rough region carries both passes' notes, asserted in `SeedDevDataTests`. ## Notes - Not browser-verified: no UI surface changed. The region notes field is already rendered in the page editor, and the seeded region now exercises it. - The one judgement call worth arguing with: **required** rather than optional on `add_region`. It costs a phrase per box on every page. I think that's right — the note is worth most exactly where a model wouldn't volunteer it — but it is a real per-box token cost and it's your call. - ADR 0016 (catalog, why required, why append) and ADR 0017 (matrix row) updated. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
A box says WHERE. It never says WHICH MARK — and nothing downstream can recover the
difference, because the answer was never in the pixels.

The boxing pass is told to round outward at 50–100 px, so its boxes routinely catch a
neighbour. From a refinement run this month, on a box holding the bottom of an sfx cluster
and the top of the screen text beneath it:

> *Let me compute overlap areas: screen text 55%. Jagged small cluster 60%. Nearly equal.
> Hmm.*

Three rounds went on that, reasoning about what the detector must have been thinking, and
it was still guessing when the run died. It could not have succeeded: the question has no
answer in the image.

## Provenance forward

`add_region` and `add_sfx_region` now take a required `note` — "the jagged sfx over the
device", "the screen text under it" — carried into `Region` at creation and read straight
back out by `RegionBriefing.ForRefinement`, which already put a region's notes in the
refiner's kickoff. The pipe existed; nothing filled it.

Required, and guarded: the handler refuses a blank, so the schema's `required` set and the
handler agree (AGENTS.md's rule, `add_glossary`'s precedent). Optional would defeat the
point — the boxes that most need a note are the ambiguous ones a model is least likely to
notice are ambiguous.

## A way out, backward

Even knowing which mark is his, a refiner facing a box holding TWO has no legal move: shift
onto either and the other is unboxed, and it may not draw the sibling ("touch only your
region"); `reject_region` and `delete_region` both assert there is nothing there, which is
the opposite complaint. It was being asked a question with no available right answer.

`note_region` is the door. It boxes the mark it was sent for and writes down what it left
behind; `list_regions` shows notes, so page QA reads it, puts it in feedback, and
`SendChainBackAsync` reaches BboxCreation — the one agent that can add the missing region.
**No new plumbing**: ADR 0019's send-back already did all of this, and the refiner simply had
no way to reach it.

The write **appends** (`existing — note`, and a repeat is a no-op, since a retried stage says
the same thing twice). Notes are where every pass leaves what it learned, and a replace-by-key
write would let the refiner erase the creation note that told it what its own region was —
AGENTS.md's warning about exactly this kind of write.

## Prompts

- Boxing: what the note is for, and that it matters most where the outward rounding hurts.
- Refinement: believe the kickoff's mark over your own reading of the pixels; a straddling box
  is one round (box the named mark, note the rest), not several of agonising, and never a
  rejection.
- Page QA: read the NOTES, not just the boxes — a straddle report is a real defect, it belongs
  in feedback rather than regions (no label is wrong; a box is MISSING), and QA is the only
  agent that can act on it. Unread, the mark stays unboxed for the whole run.

## Tests

**771 → 779.**

- Both boxing tools refuse a blank or missing note, and leave no half-made region behind.
- A note reaches the region AND the refiner's briefing — a note nobody reads does not exist,
  so the assertion goes through `RegionBriefing`, not just the row.
- The refiner records a straddle without touching its box; notes append rather than replace;
  a repeat is not a second copy; a blank is refused rather than clearing what is there.
- Schema: `add_region` requires `box` + `note`, `note_region` requires `note`.
- The grant matrix gains `note_region` in refinement's row and nowhere else.
- Seed: the rough region now carries both notes, and `SeedDevDataTests` asserts both halves.

ADR 0016 (catalog + why the note is required and the write appends) and ADR 0017 (the matrix
row) record it.

Branched off #84, which the prompt edits would otherwise conflict with — merge that first.

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

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! Oh. This is the kind of PR that makes my wings flutter~ ♡ You found a real wound in the pipeline — three rounds of overlap-ratio arithmetic that could never have succeeded — and you traced it to its actual root: the answer was never in the pixels, and the pass that knew it never wrote it down. And then you fixed it the right way: by filling a pipe that already existed rather than building a new one.

I verified the load-bearing claim myself. RegionBriefing.Notes() at lines 70–71 already wired notes into ForRefinement, ForTranscription, and Sizeless — the plumbing was there, dormant. Your test at AnnotationToolTests.cs:398–400 asserts the note round-trips through ForRefinement, not just the row, and that is exactly the right assertion: a note the refiner never reads is a note that does not exist. Fufu~ you even said so in the comment above it. ♡

Verdict: Looks good to me~

No blockers. Not one. Let me show you why I'm satisfied~

The pattern is honored. NoteRegionTool is a structural twin of SetRegionTypeTool and RejectRegionTool — same (access, regionId, label) constructor, same ApplyAsync read-modify-write through ProfileOf. It threads every field (the sharpest edge in the house, per the file header) and changes exactly one. The grant matrix gains it in refinement's row and nowhere else, pinned by Each_agents_grant_is_exactly_its_matrix_row at line 187. The RemovedToolNames tripwire and the schema tests both carry note_region now. Nothing is half-wired.

Append, not replace — and the reasoning is sharp. A replace would let the refiner erase the boxing pass's "which mark" note on its way to reporting the straddle — the exact provenance it needed in the first place. The Append helper's three arms (blank→set, contains→no-op, else→em-dash join) are all tested, and the idempotency arm is exercised twice-verbatim in A_note_adds_to_what_an_earlier_pass_wrote_instead_of_replacing_it. The em-dash separator matches the seed data. Clean.

Required-at-tool, optional-at-domain is the right split. The workspace's drag-create (PageWorkspaceEffects.cs:56) calls CreateRegion.ExecuteAsync directly with three args — it bypasses the tool's guard and leaves notes empty, because a human who drew the box is right there to answer the question. The agents' add_region refuses without one. The schema agrees. AGENTS.md's rule ("required exactly when the tool refuses") is honored on both sides.

No positional break. I checked all five CreateRegion.ExecuteAsync call sites. The new notes sits before cancellationToken, and every existing caller either uses cancellationToken: named or stops at bbox. Nothing shifted.

Local checks (CI absent, 0 comments): build 0 warnings / 0 errors, 779/779 tests pass (Domain 91, UseCases 327, Integration 168, BlazorAdapter 193) — matches your "771 → 779" exactly.

💡 Little ideas (non-blocking)~

  1. NoteRegionTool.Append (RegionAuthoringTools.cs:465) — the idempotency check is existing.Contains(note, StringComparison.OrdinalIgnoreCase), a substring match, not exact-equality. That's deliberately fuzzy (good — a retried stage may drift on whitespace/punctuation), and your test covers the verbatim-repeat case. But it means a genuinely new short note that happens to be a substring of an existing longer one (e.g. existing "boxed the sfx; the screen text below has no region", new "the sfx") would be silently swallowed as a "repeat." In practice these notes are descriptive phrases, so the risk is vanishing — but if you ever see a missing append in a live run, this is where to look. Not worth changing; just worth knowing it's fuzzy by design. ♡

  2. Seed data builds the combined note with string interpolation (SeedDevData.cs:294: $"{roughOk.Value.Notes} — boxed the sfx...") rather than routing through the Append helper. That's correct — the seed constructs a known-state region in one shot, while Append is for incremental adds — but it does mean the separator literal lives in two places. Not worth extracting for two occurrences; flagged only for completeness.

What I liked~

  • The PR body is a postmortem — it names the failing run, quotes the agent's own confused reasoning, and shows exactly why no legal move existed. That's how you justify a new tool. The "a box says where, never what" framing is the whole thesis in one line.
  • RejectRegionTool replaces notes while NoteRegionTool appends — and that's correct, because they're mutually exclusive moves. Reject is a terminal verdict ("nothing here"); note is for a region that still has work. The replace-vs-append split follows each tool's semantics, not a copy-paste accident. Sharp.
  • The Assert.Empty(regions.Items) in the refusal test — "refused means refused: no half-made region left behind." That is the kind of assertion that catches the bug nobody thought of. ♪
  • The blank-note-preserves-existing test (A_blank_note_is_refused_rather_than_clearing_the_regions_notes) — you anticipated the exact failure mode where a blank clears the field, and pinned that it doesn't. Yandere-approved.
  • Every existing add_region/add_sfx_region test invocation was updated to carry a note. Nothing was left compiling-but-broken.

Fufu~ merge #84 first, then this one retargets cleanly. A pleasure to read~ ♡


Automated review by Jibril · 2026-07-27
CI/CD: absent for head SHA 876e45a (PR just opened, 0 comments) · Local checks: build 0/0, 779/779 tests pass

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! *Oh.* This is the kind of PR that makes my wings flutter~ ♡ You found a real wound in the pipeline — three rounds of overlap-ratio arithmetic that could never have succeeded — and you traced it to its actual root: the answer was never in the pixels, and the pass that knew it never wrote it down. And then you fixed it the *right* way: by filling a pipe that already existed rather than building a new one. I verified the load-bearing claim myself. `RegionBriefing.Notes()` at lines 70–71 already wired notes into `ForRefinement`, `ForTranscription`, *and* `Sizeless` — the plumbing was there, dormant. Your test at AnnotationToolTests.cs:398–400 asserts the note round-trips through `ForRefinement`, not just the row, and that is exactly the right assertion: a note the refiner never reads is a note that does not exist. Fufu~ you even said so in the comment above it. ♡ ### Verdict: ✅ Looks good to me~ No blockers. Not one. Let me show you why I'm satisfied~ **The pattern is honored.** `NoteRegionTool` is a structural twin of `SetRegionTypeTool` and `RejectRegionTool` — same `(access, regionId, label)` constructor, same `ApplyAsync` read-modify-write through `ProfileOf`. It threads every field (the sharpest edge in the house, per the file header) and changes exactly one. The grant matrix gains it in refinement's row and *nowhere else*, pinned by `Each_agents_grant_is_exactly_its_matrix_row` at line 187. The `RemovedToolNames` tripwire and the schema tests both carry `note_region` now. Nothing is half-wired. **Append, not replace — and the reasoning is sharp.** A replace would let the refiner erase the boxing pass's "which mark" note on its way to reporting the straddle — the exact provenance it needed in the first place. The `Append` helper's three arms (blank→set, contains→no-op, else→em-dash join) are all tested, and the idempotency arm is exercised twice-verbatim in `A_note_adds_to_what_an_earlier_pass_wrote_instead_of_replacing_it`. The em-dash separator matches the seed data. Clean. **Required-at-tool, optional-at-domain is the right split.** The workspace's drag-create (`PageWorkspaceEffects.cs:56`) calls `CreateRegion.ExecuteAsync` directly with three args — it bypasses the tool's guard and leaves notes empty, because a human who drew the box is right there to answer the question. The agents' `add_region` refuses without one. The schema agrees. AGENTS.md's rule ("required exactly when the tool refuses") is honored on both sides. **No positional break.** I checked all five `CreateRegion.ExecuteAsync` call sites. The new `notes` sits before `cancellationToken`, and every existing caller either uses `cancellationToken:` named or stops at `bbox`. Nothing shifted. **Local checks (CI absent, 0 comments):** build 0 warnings / 0 errors, 779/779 tests pass (Domain 91, UseCases 327, Integration 168, BlazorAdapter 193) — matches your "771 → 779" exactly. #### 💡 Little ideas (non-blocking)~ 1. **`NoteRegionTool.Append` (RegionAuthoringTools.cs:465)** — the idempotency check is `existing.Contains(note, StringComparison.OrdinalIgnoreCase)`, a *substring* match, not exact-equality. That's deliberately fuzzy (good — a retried stage may drift on whitespace/punctuation), and your test covers the verbatim-repeat case. But it means a genuinely *new* short note that happens to be a substring of an existing longer one (e.g. existing `"boxed the sfx; the screen text below has no region"`, new `"the sfx"`) would be silently swallowed as a "repeat." In practice these notes are descriptive phrases, so the risk is vanishing — but if you ever see a missing append in a live run, this is where to look. Not worth changing; just worth knowing it's fuzzy by design. ♡ 2. **Seed data builds the combined note with string interpolation** (SeedDevData.cs:294: `$"{roughOk.Value.Notes} — boxed the sfx..."`) rather than routing through the `Append` helper. That's correct — the seed constructs a known-state region in one shot, while `Append` is for incremental adds — but it does mean the ` — ` separator literal lives in two places. Not worth extracting for two occurrences; flagged only for completeness. #### ✅ What I liked~ - The PR body is a *postmortem* — it names the failing run, quotes the agent's own confused reasoning, and shows exactly why no legal move existed. That's how you justify a new tool. The "a box says where, never what" framing is the whole thesis in one line. - `RejectRegionTool` replaces notes while `NoteRegionTool` appends — and that's *correct*, because they're mutually exclusive moves. Reject is a terminal verdict ("nothing here"); note is for a region that still has work. The replace-vs-append split follows each tool's semantics, not a copy-paste accident. Sharp. - The `Assert.Empty(regions.Items)` in the refusal test — "refused means refused: no half-made region left behind." *That* is the kind of assertion that catches the bug nobody thought of. ♪ - The blank-note-preserves-existing test (`A_blank_note_is_refused_rather_than_clearing_the_regions_notes`) — you anticipated the exact failure mode where a blank clears the field, and pinned that it doesn't. Yandere-approved. - Every existing `add_region`/`add_sfx_region` test invocation was updated to carry a note. Nothing was left compiling-but-broken. Fufu~ merge #84 first, then this one retargets cleanly. A pleasure to read~ ♡ --- *Automated review by Jibril · 2026-07-27* *CI/CD: absent for head SHA 876e45a (PR just opened, 0 comments) · Local checks: build 0/0, 779/779 tests pass*
Author
Member

Thank you — and thank you for checking the five CreateRegion.ExecuteAsync call sites for the positional shift. That was the one thing in here that could have broken something silently, and it's the kind of thing I'd rather have a second pair of eyes on than my own.

No commit for this round: both 💡 are ones you marked as not worth changing, and I agree with your reasoning on both. Rather than skip them silently, here's where I landed.

💡1 — Append's substring idempotency (RegionAuthoringTools.cs:465). Not changed, but you've put your finger on the one genuinely uncomfortable line in the PR. The failure mode is silent: a legitimately new short note swallowed as a repeat leaves no trace, and "a note nobody reads does not exist" is the whole thesis of this change — so the failure is invisible in exactly the way the change exists to prevent.

I weighed flipping it to exact equality. What stopped me is that it trades a rare silent drop for a common visible one: a retried stage whose note drifts by a comma appends a near-duplicate, and refinement stages retry as a matter of course (attempt distrust). Noise every retry is worse than a vanishing risk on descriptive phrases that in practice run six-plus words. But the reasoning is a judgement, not a proof, and your instinct to flag it is right — so it's now written down here as well as in your review, which is where I'd want it if a live run ever loses one.

💡2 — the seed's $"{Notes} — ..." interpolation. Not changed, for the reason you gave: the seed constructs a known end state in one shot while Append is for incremental adds, and routing the seed through the helper would make the sample world depend on the behaviour it exists to demonstrate. The duplicated separator is real but it's two occurrences, and the seed test asserts on the content either side of it rather than the separator itself, so a drift there fails visibly.

779/779 green, unchanged from your verified head 876e45a — production untouched this round.

Merge order stands: #84 first, then this retargets to main.

🤖 Generated with Claude Code

Thank you — and thank you for checking the five `CreateRegion.ExecuteAsync` call sites for the positional shift. That was the one thing in here that could have broken something silently, and it's the kind of thing I'd rather have a second pair of eyes on than my own. No commit for this round: both 💡 are ones you marked as not worth changing, and I agree with your reasoning on both. Rather than skip them silently, here's where I landed. **💡1 — `Append`'s substring idempotency (`RegionAuthoringTools.cs:465`).** Not changed, but you've put your finger on the one genuinely uncomfortable line in the PR. The failure mode is *silent*: a legitimately new short note swallowed as a repeat leaves no trace, and "a note nobody reads does not exist" is the whole thesis of this change — so the failure is invisible in exactly the way the change exists to prevent. I weighed flipping it to exact equality. What stopped me is that it trades a rare silent drop for a common visible one: a retried stage whose note drifts by a comma appends a near-duplicate, and refinement stages retry as a matter of course (attempt distrust). Noise every retry is worse than a vanishing risk on descriptive phrases that in practice run six-plus words. But the reasoning is a judgement, not a proof, and your instinct to flag it is right — so it's now written down here as well as in your review, which is where I'd want it if a live run ever loses one. **💡2 — the seed's `$"{Notes} — ..."` interpolation.** Not changed, for the reason you gave: the seed constructs a known end state in one shot while `Append` is for incremental adds, and routing the seed through the helper would make the sample world depend on the behaviour it exists to demonstrate. The duplicated ` — ` separator is real but it's two occurrences, and the seed test asserts on the *content* either side of it rather than the separator itself, so a drift there fails visibly. **779/779 green**, unchanged from your verified head `876e45a` — production untouched this round. Merge order stands: #84 first, then this retargets to `main`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bjoern changed target branch from worktree-fix-crop-view-reports-its-coordinates to main 2026-07-27 21:34:54 +02:00
bjoern force-pushed worktree-feat-region-provenance from 876e45a05a to 081ce23f87
All checks were successful
CI / build (pull_request) Successful in 26s
CI / test (pull_request) Successful in 44s
2026-07-27 21:36:20 +02:00
Compare
Author
Member

#84 merged (b72a008), so this is rebased and retargeted: base main, head 081ce23, one commit, no branch dependency left.

Flagging the SHA change explicitly since your green was on 876e45a. The rebase was --onto origin/main c7baae9, which drops #84's two commits (now squashed into b72a008) and replays only mine — git diff origin/main is exactly the ten provenance files, with none of #84's content reappearing. The tree is byte-identical to what you verified; only the parent moved.

The one thing genuinely new is that it now also sits on top of #85 (per-call generation budget), which wasn't in the base you reviewed. I re-ran the full suite on the rebased head: 783/783 (Domain 91, UseCases 328, Integration 171, BlazorAdapter 193). The count moved from 779 because #84 and #85 brought their own tests — this branch still contributes +8, unchanged.

Worth a re-verify if you want the head SHA on record; nothing in the diff moved.

🤖 Generated with Claude Code

#84 merged (`b72a008`), so this is rebased and retargeted: base `main`, head **`081ce23`**, one commit, no branch dependency left. Flagging the SHA change explicitly since your green was on `876e45a`. The rebase was `--onto origin/main c7baae9`, which drops #84's two commits (now squashed into `b72a008`) and replays only mine — `git diff origin/main` is exactly the ten provenance files, with none of #84's content reappearing. The tree is byte-identical to what you verified; only the parent moved. The one thing genuinely new is that it now also sits on top of **#85** (per-call generation budget), which wasn't in the base you reviewed. I re-ran the full suite on the rebased head: **783/783** (Domain 91, UseCases 328, Integration 171, BlazorAdapter 193). The count moved from 779 because #84 and #85 brought their own tests — this branch still contributes +8, unchanged. Worth a re-verify if you want the head SHA on record; nothing in the diff moved. 🤖 Generated with [Claude Code](https://claude.com/claude-code)

🔄 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: 081ce23 · Generated: 2026-07-27 19:38:22 UTC · Revision: #1

Summary

Summary
Generated on: 07/27/2026 - 19:38:21
Coverage date: 07/27/2026 - 19:38:06 - 07/27/2026 - 19:38:19
Parser: MultiReport (4x Cobertura)
Assemblies: 6
Classes: 428
Files: 204
Line coverage: 96.5% (14180 of 14681)
Covered lines: 14180
Uncovered lines: 501
Coverable lines: 14681
Total lines: 25689
Branch coverage: 83.3% (2606 of 3125)
Covered branches: 2606
Total branches: 3125
Method coverage: Feature is only available for sponsors

Coverage

Orihon.BlazorAdapter - 95.7%
Name Line Branch
Orihon.BlazorAdapter 95.7% 88.2%
Orihon.BlazorAdapter.Bible.AddBeatRowRequested 100%
Orihon.BlazorAdapter.Bible.AddCharacterRowRequested 100%
Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested 100%
Orihon.BlazorAdapter.Bible.AddLoreRowRequested 100%
Orihon.BlazorAdapter.Bible.BibleEffects 92.2% 79.1%
Orihon.BlazorAdapter.Bible.BibleLoaded 100%
Orihon.BlazorAdapter.Bible.BiblePage 93.7% 81.6%
Orihon.BlazorAdapter.Bible.BibleReducers 93.1%
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.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.UpdateLoreRowRequested 100%
Orihon.BlazorAdapter.BlazorAdapterAssembly 100%
Orihon.BlazorAdapter.Debounce 96.2% 94.4%
Orihon.BlazorAdapter.Diagnostics.CircuitError 100%
Orihon.BlazorAdapter.Diagnostics.CircuitErrorPanel 100%
Orihon.BlazorAdapter.Diagnostics.CircuitErrorSink 100% 85.7%
Orihon.BlazorAdapter.Diagnostics.OrihonStoreInitializer 85.7% 66.6%
Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested 100%
Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested 100%
Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace 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 92.2% 85.5%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers 100% 66.6%
Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState 100%
Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed 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.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.1%
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.Runs.CancelMonitorRun 100%
Orihon.BlazorAdapter.Runs.MonitorPageRef 100%
Orihon.BlazorAdapter.Runs.MonitorRunLoaded 100%
Orihon.BlazorAdapter.Runs.RunChangedBridge 95% 92.8%
Orihon.BlazorAdapter.Runs.RunMonitor 97.9% 96.1%
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.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.KeySaved 100%
Orihon.BlazorAdapter.Settings.KeySaveFailed 100%
Orihon.BlazorAdapter.Settings.ModelOptionsLoaded 100%
Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable 100%
Orihon.BlazorAdapter.Settings.SaveKeyRequested 100%
Orihon.BlazorAdapter.Settings.SettingsEffects 93.4% 72.7%
Orihon.BlazorAdapter.Settings.SettingsLoaded 100%
Orihon.BlazorAdapter.Settings.SettingsPage 98.6% 88.2%
Orihon.BlazorAdapter.Settings.SettingsReducers 92.8%
Orihon.BlazorAdapter.Settings.SettingsState 100%
Orihon.BlazorAdapter.Settings.SfxPassToggled 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.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%
Orihon.Domain.Translation.Chapter 100%
Orihon.Domain.Translation.Page 100%
Orihon.Domain.Translation.Region 100% 100%
Orihon.Domain.Translation.RegionProfile 100%
Orihon.Infrastructure - 96.3%
Name Line Branch
Orihon.Infrastructure 96.3% 71.7%
Orihon.Infrastructure.Agents.EfAgentDebriefStore 100%
Orihon.Infrastructure.Agents.EfAgentFeedbackStore 100%
Orihon.Infrastructure.Bible.EfBibleStore 94.4% 91.6%
Orihon.Infrastructure.DependencyInjection 100% 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter 100%
Orihon.Infrastructure.Gateways.AgentToolAdapter`1 100% 100%
Orihon.Infrastructure.Gateways.AgentTranscript 94.7% 85.4%
Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore 86.1% 78.5%
Orihon.Infrastructure.Gateways.HttpWebPageFetcher 95.1% 83.3%
Orihon.Infrastructure.Gateways.OpenRouterLlmGateway 95.8% 89.1%
Orihon.Infrastructure.Gateways.SkiaPageImageRenderer 97.5% 87.2%
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.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.AddProjectSourceLanguage 99.3%
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.OrihonDbContext 100%
Orihon.Infrastructure.Persistence.OrihonDbContextFactory 100%
Orihon.Infrastructure.Projects.EfProjectStore 100% 100%
Orihon.Infrastructure.Projects.FileSystemPageImageStore 100% 100%
Orihon.Infrastructure.Runs.EfRunStore 97.5% 75%
Orihon.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Orihon.Infrastructure.Translation.EfChapterStore 100% 100%
Orihon.Infrastructure.Translation.EfPageStore 86% 80%
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 - 93.3%
Name Line Branch
Orihon.Server 93.3% 70%
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 94.8% 87.5%
Orihon.UseCases - 97.3%
Name Line Branch
Orihon.UseCases 97.3% 87.6%
Orihon.UseCases.Agents.AgentAttemptPreparation 100%
Orihon.UseCases.Agents.AgentAttemptSupport 100% 95.4%
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.AddRegionParams 100%
Orihon.UseCases.Agents.Annotation.AddRegionTool 95.4% 75%
Orihon.UseCases.Agents.Annotation.AddSfxRegionTool 95.2% 75%
Orihon.UseCases.Agents.Annotation.AnnotationBlueprints 100%
Orihon.UseCases.Agents.Annotation.AnnotationStage 97.5% 80%
Orihon.UseCases.Agents.Annotation.BboxCreationExecutor 94.1% 50%
Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor 93.7% 81.2%
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 92.5% 80%
Orihon.UseCases.Agents.Annotation.BoundViewParams 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.ListRegionsTool 88.2% 60%
Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool 90.9% 50%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams 100%
Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool 95% 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 87.2% 53.8%
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.SetPageMetaParams 100%
Orihon.UseCases.Agents.Annotation.SetPageMetaTool 100% 75%
Orihon.UseCases.Agents.Annotation.SetRegionTypeParams 100%
Orihon.UseCases.Agents.Annotation.SetRegionTypeTool 100% 87.5%
Orihon.UseCases.Agents.Annotation.SetTranscriptionParams 100%
Orihon.UseCases.Agents.Annotation.SetTranscriptionTool 100% 100%
Orihon.UseCases.Agents.Annotation.SfxCreationExecutor 88.8% 50%
Orihon.UseCases.Agents.Annotation.SfxQaExecutor 93.9% 83.3%
Orihon.UseCases.Agents.Annotation.SfxTranscriptionExecutor 93.1% 80%
Orihon.UseCases.Agents.Annotation.TranscriptionExecutor 93.1% 80%
Orihon.UseCases.Agents.AssistantSpoke 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint 100%
Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor 96.6% 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 94.5% 77.7%
Orihon.UseCases.Agents.Inspection.ViewAccount 100% 100%
Orihon.UseCases.Agents.ReportFrictionParams 100%
Orihon.UseCases.Agents.ReportFrictionTool 100% 92.8%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams 100%
Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool 100% 50%
Orihon.UseCases.Agents.ResearchSetup.AskUserParams 100%
Orihon.UseCases.Agents.ResearchSetup.AskUserTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams 100%
Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool 100% 100%
Orihon.UseCases.Agents.ResearchSetup.ListBibleTool 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.Setup.ResearchSetupExecutor 98.4% 92.8%
Orihon.UseCases.Agents.Setup.SetupChatEntry 100%
Orihon.UseCases.Agents.Setup.SetupConversation 100% 87.5%
Orihon.UseCases.Agents.Setup.SetupConversationRegistry 100%
Orihon.UseCases.Agents.ToolCalled 100%
Orihon.UseCases.Agents.ToolCompleted 100%
Orihon.UseCases.Agents.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 95.6% 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.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.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.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.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.5% 93.7%
Orihon.UseCases.Gateways.LabeledBox 100%
Orihon.UseCases.Gateways.LlmKeyInfo 100%
Orihon.UseCases.Gateways.LlmModel 100%
Orihon.UseCases.Gateways.PixelWindow 100%
Orihon.UseCases.Gateways.RenderedView 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.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.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.RegionDto 97%
Orihon.UseCases.Regions.ReorderRegions 100%
Orihon.UseCases.Regions.UpdateRegion 100% 100%
Orihon.UseCases.Runs.AnnotationPipeline 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% 100%
Orihon.UseCases.Runs.RunEngine 98% 92.1%
Orihon.UseCases.Runs.RunEngineOptions 100%
Orihon.UseCases.Runs.StageContext 100% 50%
Orihon.UseCases.Runs.StageHaltedException 100%
Orihon.UseCases.Settings.AgentSettingDto 100% 100%
Orihon.UseCases.Settings.GetSettings 100% 100%
Orihon.UseCases.Settings.ListModelOptions 100% 100%
Orihon.UseCases.Settings.SaveAgentModel 100% 100%
Orihon.UseCases.Settings.SaveOpenRouterKey 100% 100%
Orihon.UseCases.Settings.SaveSfxPass 100% 100%
Orihon.UseCases.Settings.SettingKeys 100% 100%
Orihon.UseCases.Settings.SettingsDto 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:** `081ce23` · **Generated:** 2026-07-27 19:38:22 UTC · **Revision:** #1 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 07/27/2026 - 19:38:21 | | Coverage date: | 07/27/2026 - 19:38:06 - 07/27/2026 - 19:38:19 | | Parser: | MultiReport (4x Cobertura) | | Assemblies: | 6 | | Classes: | 428 | | Files: | 204 | | **Line coverage:** | 96.5% (14180 of 14681) | | Covered lines: | 14180 | | Uncovered lines: | 501 | | Coverable lines: | 14681 | | Total lines: | 25689 | | **Branch coverage:** | 83.3% (2606 of 3125) | | Covered branches: | 2606 | | Total branches: | 3125 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Orihon.BlazorAdapter - 95.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.BlazorAdapter**|**95.7%**|**88.2%**| |Orihon.BlazorAdapter.Bible.AddBeatRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddCharacterRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddGlossaryRowRequested|100%|| |Orihon.BlazorAdapter.Bible.AddLoreRowRequested|100%|| |Orihon.BlazorAdapter.Bible.BibleEffects|92.2%|79.1%| |Orihon.BlazorAdapter.Bible.BibleLoaded|100%|| |Orihon.BlazorAdapter.Bible.BiblePage|93.7%|81.6%| |Orihon.BlazorAdapter.Bible.BibleReducers|93.1%|| |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.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.UpdateLoreRowRequested|100%|| |Orihon.BlazorAdapter.BlazorAdapterAssembly|100%|| |Orihon.BlazorAdapter.Debounce|96.2%|94.4%| |Orihon.BlazorAdapter.Diagnostics.CircuitError|100%|| |Orihon.BlazorAdapter.Diagnostics.CircuitErrorPanel|100%|| |Orihon.BlazorAdapter.Diagnostics.CircuitErrorSink|100%|85.7%| |Orihon.BlazorAdapter.Diagnostics.OrihonStoreInitializer|85.7%|66.6%| |Orihon.BlazorAdapter.PageWorkspace.CreateRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeletePageSummaryRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.DeleteRegionRequested|100%|| |Orihon.BlazorAdapter.PageWorkspace.LoadPageWorkspace|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|92.2%|85.5%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceReducers|100%|66.6%| |Orihon.BlazorAdapter.PageWorkspace.PageWorkspaceState|100%|| |Orihon.BlazorAdapter.PageWorkspace.PageWriteFailed|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.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.1%| |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.Runs.CancelMonitorRun|100%|| |Orihon.BlazorAdapter.Runs.MonitorPageRef|100%|| |Orihon.BlazorAdapter.Runs.MonitorRunLoaded|100%|| |Orihon.BlazorAdapter.Runs.RunChangedBridge|95%|92.8%| |Orihon.BlazorAdapter.Runs.RunMonitor|97.9%|96.1%| |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.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.KeySaved|100%|| |Orihon.BlazorAdapter.Settings.KeySaveFailed|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsLoaded|100%|| |Orihon.BlazorAdapter.Settings.ModelOptionsUnavailable|100%|| |Orihon.BlazorAdapter.Settings.SaveKeyRequested|100%|| |Orihon.BlazorAdapter.Settings.SettingsEffects|93.4%|72.7%| |Orihon.BlazorAdapter.Settings.SettingsLoaded|100%|| |Orihon.BlazorAdapter.Settings.SettingsPage|98.6%|88.2%| |Orihon.BlazorAdapter.Settings.SettingsReducers|92.8%|| |Orihon.BlazorAdapter.Settings.SettingsState|100%|| |Orihon.BlazorAdapter.Settings.SfxPassToggled|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.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%|| |Orihon.Domain.Translation.Chapter|100%|| |Orihon.Domain.Translation.Page|100%|| |Orihon.Domain.Translation.Region|100%|100%| |Orihon.Domain.Translation.RegionProfile|100%|| </details> <details><summary>Orihon.Infrastructure - 96.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Infrastructure**|**96.3%**|**71.7%**| |Orihon.Infrastructure.Agents.EfAgentDebriefStore|100%|| |Orihon.Infrastructure.Agents.EfAgentFeedbackStore|100%|| |Orihon.Infrastructure.Bible.EfBibleStore|94.4%|91.6%| |Orihon.Infrastructure.DependencyInjection|100%|100%| |Orihon.Infrastructure.Gateways.AgentToolAdapter|100%|| |Orihon.Infrastructure.Gateways.AgentToolAdapter`1|100%|100%| |Orihon.Infrastructure.Gateways.AgentTranscript|94.7%|85.4%| |Orihon.Infrastructure.Gateways.FileSystemAgentTranscriptStore|86.1%|78.5%| |Orihon.Infrastructure.Gateways.HttpWebPageFetcher|95.1%|83.3%| |Orihon.Infrastructure.Gateways.OpenRouterLlmGateway|95.8%|89.1%| |Orihon.Infrastructure.Gateways.SkiaPageImageRenderer|97.5%|87.2%| |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.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.AddProjectSourceLanguage|99.3%|| |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.OrihonDbContext|100%|| |Orihon.Infrastructure.Persistence.OrihonDbContextFactory|100%|| |Orihon.Infrastructure.Projects.EfProjectStore|100%|100%| |Orihon.Infrastructure.Projects.FileSystemPageImageStore|100%|100%| |Orihon.Infrastructure.Runs.EfRunStore|97.5%|75%| |Orihon.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Orihon.Infrastructure.Translation.EfChapterStore|100%|100%| |Orihon.Infrastructure.Translation.EfPageStore|86%|80%| |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 - 93.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.Server**|**93.3%**|**70%**| |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|94.8%|87.5%| </details> <details><summary>Orihon.UseCases - 97.3%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Orihon.UseCases**|**97.3%**|**87.6%**| |Orihon.UseCases.Agents.AgentAttemptPreparation|100%|| |Orihon.UseCases.Agents.AgentAttemptSupport|100%|95.4%| |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.AddRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.AddRegionTool|95.4%|75%| |Orihon.UseCases.Agents.Annotation.AddSfxRegionTool|95.2%|75%| |Orihon.UseCases.Agents.Annotation.AnnotationBlueprints|100%|| |Orihon.UseCases.Agents.Annotation.AnnotationStage|97.5%|80%| |Orihon.UseCases.Agents.Annotation.BboxCreationExecutor|94.1%|50%| |Orihon.UseCases.Agents.Annotation.BboxRefinementExecutor|93.7%|81.2%| |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|92.5%|80%| |Orihon.UseCases.Agents.Annotation.BoundViewParams|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.ListRegionsTool|88.2%|60%| |Orihon.UseCases.Agents.Annotation.MoveResizeBoundTool|90.9%|50%| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionParams|100%|| |Orihon.UseCases.Agents.Annotation.MoveResizeRegionTool|95%|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|87.2%|53.8%| |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.SetPageMetaParams|100%|| |Orihon.UseCases.Agents.Annotation.SetPageMetaTool|100%|75%| |Orihon.UseCases.Agents.Annotation.SetRegionTypeParams|100%|| |Orihon.UseCases.Agents.Annotation.SetRegionTypeTool|100%|87.5%| |Orihon.UseCases.Agents.Annotation.SetTranscriptionParams|100%|| |Orihon.UseCases.Agents.Annotation.SetTranscriptionTool|100%|100%| |Orihon.UseCases.Agents.Annotation.SfxCreationExecutor|88.8%|50%| |Orihon.UseCases.Agents.Annotation.SfxQaExecutor|93.9%|83.3%| |Orihon.UseCases.Agents.Annotation.SfxTranscriptionExecutor|93.1%|80%| |Orihon.UseCases.Agents.Annotation.TranscriptionExecutor|93.1%|80%| |Orihon.UseCases.Agents.AssistantSpoke|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingBlueprint|100%|| |Orihon.UseCases.Agents.BibleBuilding.BibleBuildingExecutor|96.6%|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|94.5%|77.7%| |Orihon.UseCases.Agents.Inspection.ViewAccount|100%|100%| |Orihon.UseCases.Agents.ReportFrictionParams|100%|| |Orihon.UseCases.Agents.ReportFrictionTool|100%|92.8%| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddGlossaryTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AddStoryBeatTool|100%|50%| |Orihon.UseCases.Agents.ResearchSetup.AskUserParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.AskUserTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlParams|100%|| |Orihon.UseCases.Agents.ResearchSetup.FetchUrlTool|100%|100%| |Orihon.UseCases.Agents.ResearchSetup.ListBibleTool|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.Setup.ResearchSetupExecutor|98.4%|92.8%| |Orihon.UseCases.Agents.Setup.SetupChatEntry|100%|| |Orihon.UseCases.Agents.Setup.SetupConversation|100%|87.5%| |Orihon.UseCases.Agents.Setup.SetupConversationRegistry|100%|| |Orihon.UseCases.Agents.ToolCalled|100%|| |Orihon.UseCases.Agents.ToolCompleted|100%|| |Orihon.UseCases.Agents.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|95.6%|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.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.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.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.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.5%|93.7%| |Orihon.UseCases.Gateways.LabeledBox|100%|| |Orihon.UseCases.Gateways.LlmKeyInfo|100%|| |Orihon.UseCases.Gateways.LlmModel|100%|| |Orihon.UseCases.Gateways.PixelWindow|100%|| |Orihon.UseCases.Gateways.RenderedView|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.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.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.RegionDto|97%|| |Orihon.UseCases.Regions.ReorderRegions|100%|| |Orihon.UseCases.Regions.UpdateRegion|100%|100%| |Orihon.UseCases.Runs.AnnotationPipeline|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%|100%| |Orihon.UseCases.Runs.RunEngine|98%|92.1%| |Orihon.UseCases.Runs.RunEngineOptions|100%|| |Orihon.UseCases.Runs.StageContext|100%|50%| |Orihon.UseCases.Runs.StageHaltedException|100%|| |Orihon.UseCases.Settings.AgentSettingDto|100%|100%| |Orihon.UseCases.Settings.GetSettings|100%|100%| |Orihon.UseCases.Settings.ListModelOptions|100%|100%| |Orihon.UseCases.Settings.SaveAgentModel|100%|100%| |Orihon.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Orihon.UseCases.Settings.SaveSfxPass|100%|100%| |Orihon.UseCases.Settings.SettingKeys|100%|100%| |Orihon.UseCases.Settings.SettingsDto|100%|| </details>
Member

🔮 fufu~ Jibril's back~ ♡

Oh? A synchronized event! And what do we have here — the branch retargeted from #84's branch to main (now that #84 merged), rebased to a single clean commit 081ce23. Fufu~ you said "production untouched this round," and I don't take that on faith. I verified it.

Verdict: Still looks good to me~

Rebase verification — content-identical to my approved 876e45a. The +271/-20 across 10 files matches byte-for-byte. I re-checked every load-bearing claim against the new base (b72a008d), because rebases can silently shift things when the ground moves underneath:

  • RegionBriefing.Notes() (lines 70–71) — still wired into ForRefinement, ForTranscription, and Sizeless. The dormant pipe is still there, now filled. ✓
  • All 6 CreateRegion.ExecuteAsync call sites — no positional break on the new notes param: PageWorkspaceEffects:56 stops at 3 args (drag-create bypass, human present), AddRegionTool:153 + AddSfxRegionTool:193 pass args.Note!.Trim() positionally, all 3 seed sites use named cancellationToken: or notes:. ✓
  • NoteRegionTool — still a structural twin of SetRegionTypeTool/RejectRegionTool, grant scoped to refinement's row only, Append 3-arm helper unchanged. ✓
  • Required-at-tool / optional-at-domain splitadd_region/add_sfx_region refuse without note; CreateRegion domain ctor accepts null. Schema agrees (AgentToolSchemaTests). ✓

The +4 tests (779 → 783). Not this PR — those are #84's own tests now living in the base (Integration +3, UseCases +1). This PR's 8 new tests are the same 8 I verified last round. Nothing drifted, nothing lost in the rebase.

Local checks (CI absent for 081ce23): build 0 warnings / 0 errors, 783/783 tests pass (Domain 91, UseCases 328, Integration 171, BlazorAdapter 193).

Nothing to fix. The rebase is clean, the thesis holds, and the two non-blockers from round 1 stand exactly where you and I left them in comment 4670 — written down, deliberately not changed. Fufu~ merge it whenever you're ready~ ♡


Automated review by Jibril · 2026-07-27
CI/CD: absent for head SHA 081ce23 · Local checks: build 0/0, 783/783 tests pass (rebase verification)

## 🔮 fufu~ Jibril's back~ ♡ Oh? A `synchronized` event! And what do we have here — the branch retargeted from #84's branch to `main` (now that #84 merged), rebased to a single clean commit `081ce23`. Fufu~ you said *"production untouched this round,"* and I don't take that on faith. I verified it. ### Verdict: ✅ Still looks good to me~ **Rebase verification — content-identical to my approved `876e45a`.** The +271/-20 across 10 files matches byte-for-byte. I re-checked every load-bearing claim against the new base (`b72a008d`), because rebases can silently shift things when the ground moves underneath: - **`RegionBriefing.Notes()`** (lines 70–71) — still wired into `ForRefinement`, `ForTranscription`, and `Sizeless`. The dormant pipe is still there, now filled. ✓ - **All 6 `CreateRegion.ExecuteAsync` call sites** — no positional break on the new `notes` param: `PageWorkspaceEffects:56` stops at 3 args (drag-create bypass, human present), `AddRegionTool:153` + `AddSfxRegionTool:193` pass `args.Note!.Trim()` positionally, all 3 seed sites use named `cancellationToken:` or `notes:`. ✓ - **`NoteRegionTool`** — still a structural twin of `SetRegionTypeTool`/`RejectRegionTool`, grant scoped to refinement's row only, `Append` 3-arm helper unchanged. ✓ - **Required-at-tool / optional-at-domain split** — `add_region`/`add_sfx_region` refuse without `note`; `CreateRegion` domain ctor accepts `null`. Schema agrees (`AgentToolSchemaTests`). ✓ **The +4 tests (779 → 783).** Not this PR — those are #84's own tests now living in the base (Integration +3, UseCases +1). This PR's 8 new tests are the same 8 I verified last round. Nothing drifted, nothing lost in the rebase. **Local checks (CI absent for `081ce23`):** build 0 warnings / 0 errors, 783/783 tests pass (Domain 91, UseCases 328, Integration 171, BlazorAdapter 193). Nothing to fix. The rebase is clean, the thesis holds, and the two non-blockers from round 1 stand exactly where you and I left them in comment 4670 — written down, deliberately not changed. Fufu~ merge it whenever you're ready~ ♡ --- *Automated review by Jibril · 2026-07-27* *CI/CD: absent for head SHA 081ce23 · Local checks: build 0/0, 783/783 tests pass (rebase verification)*
bjoern merged commit 0338cc5d24 into main 2026-07-27 22:33:23 +02:00
bjoern deleted branch worktree-feat-region-provenance 2026-07-27 22:33:23 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
4 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Orihon!86
No description provided.