feat(runs): the status strip — the run that needs watching in the bottom slot, Cancel behind its question, Dismiss into the ledger (slice 13a) #88

Merged
bjoern merged 5 commits from feat/run-strip into main 2026-10-05 23:40:22 +02:00
Member

Slice 13a of Phase 2: the status strip in the app shell's bottom slot (stories/run-monitor-and-inspector.md "The status strip"; ADR 0010, 0016, 0020, 0024). Slice 13 is split: the run's page with the monitor list is 13b.

What it does

  • The strip watches every run that has not fully succeeded and has not been dismissed, on every page, and shows one: a run with a step waiting for an answer first, then the open story's, then any story's; a live run before a settled one, then the newest. Another story's run is named first, linked. With no such run it collapses to zero height.
  • It says what the run's rows say as it reads them:
    • the steps that run, each with how long so far ("Continue is running: Writer for 12 s and Critic for 3 s.");
    • the step waiting for you ("Continue is waiting for you at Ask.");
    • the step that failed, after how many attempts and why ("Continue failed at Writer after 3 attempts: OpenRouter did not answer in time.");
    • a cancelled run.
      Its mark says the same: a turning progress mark (still under reduced motion), a hand, an error, a cancel.
  • Cancel stops a live run behind the question the chapter's Run button asks — now one component, CancelRunQuestion, naming the story away from its pages. Dismiss takes a failed or cancelled run off in every tab. A refusal shows beside the run it was about.
  • A polite live region says a change once, naming the story: a new run or a new status, and "…finished." when a live run leaves. A move between pages and the passing seconds are never said.
  • Focus: the strip's buttons keep it as the Run button's do (focus-keeper.js). When the strip collapses under the focus, the page's heading takes it.
  • Kagaku.Flow: LedgerTransitions.Acknowledge dismisses a failed or cancelled run, stored atomically like every transition, so a dismissal and a retry's requeue never cross. IRunLedger gains AcknowledgeRunAsync and ListUnacknowledgedRunsAsync, in both ledgers and in the contract. A run is created dismissed only when it failed or was cancelled.
  • CI: a step that runs only when an earlier one failed prints the runner's memory and any out-of-memory kill (see Reviews).

Decisions worth a look

  • The seconds render over the circuit, once a second per open tab and only while a step runs; the timer goes when nothing runs. A tick in the browser would repeat RunTimes.Duration in script. ADR 0024's amendment records why.
  • What the strip says comes from the rows it reads, not the run's cached status, so a retry between two reads never shows a sentence the rows contradict. The cost: each read lists every watched run's rows. Each story is read once, and a trashed story's runs cost no rows.
  • On every page, any story's run. The strip reads again on any run's status batch and on any story or run change, once it has loaded.
  • Cancel's question goes with its run. It is forgotten when the strip shows another run or the run settles, so a run coming back is never asked about unbidden.
  • ADR 0010 amended: collapsed, the bottom slot keeps the live region and the focus keeper, at zero height.

Reviews

  • Round 0, a review workflow over the feature commit: 41 findings — 9 blockers, 11 suggestions, 21 nits; 35 confirmed, 6 partly. All taken but C10, the turning mark upstream, which 13b's plan line carries.
  • Second pass over those fixes: of the 41, 34 resolved, 6 partly, C10's decline upheld; 17 fresh findings. After verification 22 stand — 9 suggestions, 13 nits —, all taken, E3 in part (below); E1 refuted.
  • Review round 1 (Jibril): CI's test job crashed in the BlazorAdapter host at 9f82ce8, not reproduced locally in 12 runs. The bare "Test host process crashed" is what a host killed from outside leaves (see the PR comments). 6113ccb adds a failure-only CI step that prints the runner's memory and any out-of-memory kill. The blank-cause suggestion was taken in 440a435.

Verified

  • All six projects pass in full, and the manuscript editor module's vitest. Main measured at c1c6610 in a clean clone; this branch rebased onto it:

    Tests main c1c6610 this branch
    Integration 884 924
    BlazorAdapter 849 927
    UseCases 560 560
    Domain 517 517
    Kagaku.Flow 1103 1117
    Kagaku.Flow.OpenRouter 592 + 4 skipped 592 + 4 skipped
    Manuscript editor (vitest) 299 301 — focus-keeper.js 12 to 14
  • 100% line and branch coverage on the changed lines against main (399 lines, 240 branches), the strip's Razor included.

  • Mutation probes, one at a time, each survivor killed by a test before the commit that reports it:

    • feature: 42 runs over 33 mutants, 41 of them compiling (P14 did not compile; its compiling variant was killed);
    • round 0: 39 runs over 35 mutants, 37 of them compiling (R20 twice; R20c, the timer left undisposed, was killed);
    • second pass: 20 runs over 20 C# mutants, all compiling, all killed on their first run; focus-keeper.js, 5 runs over 5 mutants of its fallback, all killed;
    • review round 1: 4 runs over 4 mutants, all killed on their first run.
  • Browser pass against the checked-in stand-in on a fresh seed (Chrome headless), after the second pass:

    • the seeded failure said once on load; moves between the stories list, the story, Graphs and back keep the same island and say nothing;
    • a run started from the chapter is said running once, its seconds ticking unsaid, then "Mira's Winter: Continue finished." as the older failure comes back unsaid;
    • Dismiss by keyboard on the last run collapses the slot to zero height and hands the focus to the page's heading, as a success does with the focus on Cancel;
    • earlier passes: the story first on another page, the question naming the story, Cancel by keyboard leaving the focus on Dismiss, the mark still under reduced motion, and the link and the action wrapping together at 320 and 390 px;
    • no console errors.

Rebased onto main after the inline-suggestions arc and the Help page. The one conflict was AppChromeTests' shell assertions: main's "Settings, help and sign out" label stays, beside the strip's island in the bottom slot. The commits' messages give their figures as they stood before the rebase; the table above is the rebased branch's.

Kagaku.UI: the pointer moves to the merged run-status icons, TeamAI/Kagaku.UI#32 (f50983e).

Known, not this slice

  • E3, in part: each read still lists every watched run's rows, which ranking needs. A status-only port read can come with 13b's monitor, which lists the same runs.
  • C10: the strip's turning mark is the strip's own until 13b's monitor rows share it upstream.
  • The tab title resets on a same-page sidebar link (noted in an earlier PR).

🤖 Generated with Claude Code

Slice 13a of Phase 2: the **status strip** in the app shell's bottom slot (stories/run-monitor-and-inspector.md "The status strip"; ADR 0010, 0016, 0020, 0024). Slice 13 is split: the run's page with the monitor list is 13b. **What it does** - The strip watches every run that has not fully succeeded and has not been dismissed, on every page, and shows one: a run with a step waiting for an answer first, then the open story's, then any story's; a live run before a settled one, then the newest. Another story's run is named first, linked. With no such run it collapses to zero height. - It says what the run's rows say as it reads them: - the steps that run, each with how long so far ("Continue is running: Writer for 12 s and Critic for 3 s."); - the step waiting for you ("Continue is waiting for you at Ask."); - the step that failed, after how many attempts and why ("Continue failed at Writer after 3 attempts: OpenRouter did not answer in time."); - a cancelled run. Its mark says the same: a turning progress mark (still under reduced motion), a hand, an error, a cancel. - **Cancel** stops a live run behind the question the chapter's Run button asks — now one component, `CancelRunQuestion`, naming the story away from its pages. **Dismiss** takes a failed or cancelled run off in every tab. A refusal shows beside the run it was about. - A polite live region says a change once, naming the story: a new run or a new status, and "…finished." when a live run leaves. A move between pages and the passing seconds are never said. - Focus: the strip's buttons keep it as the Run button's do (`focus-keeper.js`). When the strip collapses under the focus, the page's heading takes it. - **Kagaku.Flow:** `LedgerTransitions.Acknowledge` dismisses a failed or cancelled run, stored atomically like every transition, so a dismissal and a retry's requeue never cross. `IRunLedger` gains `AcknowledgeRunAsync` and `ListUnacknowledgedRunsAsync`, in both ledgers and in the contract. A run is created dismissed only when it failed or was cancelled. - **CI:** a step that runs only when an earlier one failed prints the runner's memory and any out-of-memory kill (see Reviews). **Decisions worth a look** - **The seconds render over the circuit**, once a second per open tab and only while a step runs; the timer goes when nothing runs. A tick in the browser would repeat `RunTimes.Duration` in script. ADR 0024's amendment records why. - **What the strip says comes from the rows it reads**, not the run's cached status, so a retry between two reads never shows a sentence the rows contradict. The cost: each read lists every watched run's rows. Each story is read once, and a trashed story's runs cost no rows. - **On every page, any story's run.** The strip reads again on any run's status batch and on any story or run change, once it has loaded. - **Cancel's question goes with its run.** It is forgotten when the strip shows another run or the run settles, so a run coming back is never asked about unbidden. - **ADR 0010 amended:** collapsed, the bottom slot keeps the live region and the focus keeper, at zero height. **Reviews** - Round 0, a review workflow over the feature commit: 41 findings — 9 blockers, 11 suggestions, 21 nits; 35 confirmed, 6 partly. All taken but C10, the turning mark upstream, which 13b's plan line carries. - Second pass over those fixes: of the 41, 34 resolved, 6 partly, C10's decline upheld; 17 fresh findings. After verification 22 stand — 9 suggestions, 13 nits —, all taken, E3 in part (below); E1 refuted. - Review round 1 (Jibril): CI's test job crashed in the BlazorAdapter host at `9f82ce8`, not reproduced locally in 12 runs. The bare "Test host process crashed" is what a host killed from outside leaves (see the PR comments). `6113ccb` adds a failure-only CI step that prints the runner's memory and any out-of-memory kill. The blank-cause suggestion was taken in `440a435`. **Verified** - All six projects pass in full, and the manuscript editor module's vitest. Main measured at `c1c6610` in a clean clone; this branch rebased onto it: | Tests | main `c1c6610` | this branch | |---|---|---| | Integration | 884 | 924 | | BlazorAdapter | 849 | 927 | | UseCases | 560 | 560 | | Domain | 517 | 517 | | Kagaku.Flow | 1103 | 1117 | | Kagaku.Flow.OpenRouter | 592 + 4 skipped | 592 + 4 skipped | | Manuscript editor (vitest) | 299 | 301 — `focus-keeper.js` 12 to 14 | - 100% line and branch coverage on the changed lines against main (399 lines, 240 branches), the strip's Razor included. - Mutation probes, one at a time, each survivor killed by a test before the commit that reports it: - feature: 42 runs over 33 mutants, 41 of them compiling (P14 did not compile; its compiling variant was killed); - round 0: 39 runs over 35 mutants, 37 of them compiling (R20 twice; R20c, the timer left undisposed, was killed); - second pass: 20 runs over 20 C# mutants, all compiling, all killed on their first run; `focus-keeper.js`, 5 runs over 5 mutants of its fallback, all killed; - review round 1: 4 runs over 4 mutants, all killed on their first run. - Browser pass against the checked-in stand-in on a fresh seed (Chrome headless), after the second pass: - the seeded failure said once on load; moves between the stories list, the story, Graphs and back keep the same island and say nothing; - a run started from the chapter is said running once, its seconds ticking unsaid, then "Mira's Winter: Continue finished." as the older failure comes back unsaid; - Dismiss by keyboard on the last run collapses the slot to zero height and hands the focus to the page's heading, as a success does with the focus on Cancel; - earlier passes: the story first on another page, the question naming the story, Cancel by keyboard leaving the focus on Dismiss, the mark still under reduced motion, and the link and the action wrapping together at 320 and 390 px; - no console errors. **Rebased** onto main after the inline-suggestions arc and the Help page. The one conflict was AppChromeTests' shell assertions: main's "Settings, help and sign out" label stays, beside the strip's island in the bottom slot. The commits' messages give their figures as they stood before the rebase; the table above is the rebased branch's. **Kagaku.UI:** the pointer moves to the merged run-status icons, TeamAI/Kagaku.UI#32 (`f50983e`). **Known, not this slice** - E3, in part: each read still lists every watched run's rows, which ranking needs. A status-only port read can come with 13b's monitor, which lists the same runs. - C10: the strip's turning mark is the strip's own until 13b's monitor rows share it upstream. - The tab title resets on a same-page sidebar link (noted in an earlier PR). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
The app shell's bottom slot has its run status strip
(stories/run-monitor-and-inspector.md "The status strip"; ADR 0010,
0016, 0020, 0024).

- What it watches: GetRunStrip reads the run that needs watching — on a
  story's pages that story's, elsewhere every story's —, a run waiting
  for an answer first, then the newest started. A run needs watching
  until it has succeeded or been dismissed: live, or failed or cancelled
  and not dismissed, so a later success never hides a failure. A story
  in the trash is watched by none. With no such run the strip collapses.
- What it says: the graph and, away from the story's pages, the story
  first, linked; the running steps, each with how long so far — the
  strip renders once a second while a step runs, and only then —; the
  step waiting for an answer; the step that failed and why; a cancelled
  run. Its mark says the same: a turning progress mark (still for a
  writer who asked for less motion), a hand, an error, a cancel. A link
  goes to the story's Runs section until the run's page arrives (13b);
  it and the action keep together at the row's end on a narrow shell.
- Cancel stops a live run behind the question the chapter's Run button
  asks, now one component both use (CancelRunQuestion). Dismiss takes a
  failed or cancelled run off; DismissRun announces it, so the strip
  moves on in every tab. A refusal shows beside them.
- The ledger acknowledges a run (Kagaku.Flow): LedgerTransitions.
  Acknowledge sets AcknowledgedAt on a failed or cancelled run not
  acknowledged yet and refuses any other, stored atomically like every
  transition, so a dismissal and a retry's requeue, which clears it,
  never cross. IRunLedger gains AcknowledgeRunAsync and
  ListUnacknowledgedRunsAsync, in the in-memory and the EF ledger and in
  the ledger contract, which runs both.
- The strip reads again on a status change of a run it could watch, on a
  run dismissed or cleared elsewhere, on a change of a story — its title,
  its trash —, and after its own requests. It follows the writer from
  page to page, keeping what it shows until the new read lands.
- Kagaku.UI moves to its merged run-status icons (cancel, block,
  front_hand, expand_less).
- Docs: ADR 0016 and 0024 amended (slice 13a); the strip's items ticked,
  the cost so far and the jump to the waiting card split off; the plan
  splits slice 13 into 13a, ticked, and 13b, the monitor.

Tests: Kagaku.Flow 1103 to 1112, BlazorAdapter 802 to 843, Integration
867 to 893; the other three unchanged. All six projects pass in full;
100% line and branch coverage on the changed lines, the strip's Razor
included.
- The transition: a failed or a cancelled run dismissed with no row
  changed; a live, a waiting, a succeeded run and one dismissed already
  refused. The contract's two scenarios, acknowledge-run and
  unacknowledged-runs, in both ledgers, the latter with a broken ledger
  it names; every write refused with a cancelled token or an unknown id.
- The strip's run: a theory over which run it watches — none, a
  succeeded one, a failure behind a later success, a dismissed one, a
  waiting one first, a story in the trash —; its scope on and away from
  a story's pages; the steps it names, by title or by id when the graph
  does not name the node or does not load.
- Dismiss: a failed or cancelled run taken off and announced once; a run
  gone, going, waiting or succeeded refused with nothing announced; one
  dismissed in another tab dismissed again quietly; a retry bringing it
  back.
- The strip: collapsed with nothing to watch; its sentence and mark for
  each status; the story first away from its pages; a running step's
  time going on, and no render a second once nothing runs; Cancel behind
  the question, set aside or confirmed; Dismiss moving on, then
  collapsing; a refusal beside the run a retry brought back; the page
  followed, and a path naming a story further down no story's; another
  tab's run through the doorbell; no page followed once the strip is
  gone. The reducers and the effects, a throwing read, cancel
  and dismiss included.
Probes: 42 runs over 33 mutants, 41 of them compiling, all killed in the
end. P14, a dismissal left unannounced, did not compile — the bus then
unread —; its compiling variant, announcing nothing, was killed. P32,
the open story read from anywhere in the path, survived once, before a
test for a page naming a story further down. P25 to P32 ran again after
the link and the action were grouped, with P33, the Runs link.
The browser pass, against the checked-in stand-in: the seeded failed run
on the strip, the story first on the stories page and not on its own;
a run's steps ticking; Cancel through the question; Dismiss moving on
and collapsing the strip in a second tab too; at 390 px the link and
the action wrapped together at the end; the mark turning, and still
under reduced motion.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Round 0, a review workflow over the feature commit: 41 findings — 9
blockers, 11 suggestions and 21 nits after verification; 35 confirmed,
6 partly. All are taken but C10, the turning mark upstream, which the
plan's 13b line now carries: the monitor's rows will share it.

- The strip watches every story's runs on every page (D1, D2, A10): a run
  with a step waiting for an answer first, then the open story's, then
  any story's; a live run before a settled one (A4), then the newest,
  ties by id. So no page hides a waiting run, nor a failure until it is
  dismissed, as ADR 0010 and 0020 promise; another story's run is named
  first wherever it shows, and the ticked story line is true.
- What the strip says is what the run's rows say as it reads them (A1,
  D10): GetRunStrip reads every candidate's rows, takes the status from
  them, and skips a run whose rows went or succeeded, or whose story
  went, between its reads — where the sentence used to throw and end the
  circuit.
- The question goes with its run (A2, C1): forgotten when the strip shows
  another run or the run settles, so neither a run coming back nor a
  retry is asked about unbidden; away from the story's pages it names the
  story (C7).
- A refusal stays beside its run only at the status the read after it
  showed (A3).
- The strip renders once a second only while a step runs, and its timer
  goes with it and with the strip (A6, B4, D3); the decision is in ADR
  0024's amendment.
- Words: a failed step says after how many attempts and why, as one
  sentence — the engine's count taken off its cause (C3); several running
  steps read "Writer for 12 s and Critic for 3 s" (C5); a waiting step is
  said whatever else runs (C6); a blank node title gives the node's id,
  a padded one is trimmed (A5); "waiting for you" on the Run button too
  (C9).
- The focus: the strip's buttons keep it as the Run button's do, through
  focus-keeper.js (C2); a polite live region says a change of status
  once, never the seconds (C4); the mark and the sentence wrap as one
  item (C8).
- DismissRun refuses a run of a story in the trash (A7) and says a run
  changed meanwhile when it settled between the ledger's refusal and the
  read after (A8).
- The ledger refuses to create a run dismissed but neither failed nor
  cancelled, so "the live ones" the port lists are every live run (A9,
  D6).
- Tests: the fixtures take the engine's shapes — a step starts after the
  context step, a failure gives up after three transient attempts with
  the gateway's words, a cancel goes through the ledger's transition, a
  waiting step is made by hand and says so; the seeded failed run read
  through the strip (B1, B3, C3). Several steps, the target never first
  (B2); one second and sixty-five (B5); the doorbell, which no longer
  filters by owner, reads on any batch (B8);
  the dismissal's time (B9); the newest-first tie (B10); the page paths
  (B11); the strip's island in the bottom slot (B6); the contract's two
  faults (B7).
- Docs: ADR 0016's and 0024's amendments say what was built (D1, D6, D7,
  D8); the story's deferred line carries the question and the jump (D8);
  the plan's 14 follows 13b (D4), and 13b's line says what 13a left it
  (D5). The feature commit's message said "a live, a waiting, a
  succeeded run" refused; the rows are a running, a waiting, a
  succeeded run and one dismissed already (D9).

Tests: Kagaku.Flow 1112 to 1116, BlazorAdapter 843 to 867, Integration
893 to 907; the other three unchanged. All six projects pass in full;
100% line and branch coverage on the changed lines, the strip's Razor
included.
Probes: 39 runs over 35 mutants of these fixes, 37 of them compiling,
all killed in the end. R3, a run with a waiting step put first by its
status alone, survived once: the rival run had settled, so a live run
first chose the same; a newer running rival now tells them apart. R22,
no focus back after a swap, survived once: every swap in its test came
from the strip's own request; a run ending on its own now gives it back.
R20, the timer kept once nothing runs, did not compile as a constant
false nor as a condition the nullable check reads; R20c, the timer left
undisposed, was killed.
The browser pass, against the checked-in stand-in on a fresh seed: the
seeded failure reads "Continue failed at Writer after 3 attempts:
OpenRouter did not answer in time.", and "Mira's Winter: Continue
failed." aloud; a new story's pages show Mira's Winter's run, named
first; the question asked there names Mira's Winter; after a Cancel
confirmed by keyboard the focus is on Dismiss; at 320 px the mark and the
sentence share their line, the link and the action wrapping together.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
fix(runs): second pass of slice 13a — the live region says each change once, a refusal names its run, honest fixtures, the strip's cost per read, docs
Some checks failed
CI / build (pull_request) Successful in 49s
CI / editor-browsers (pull_request) Successful in 2m2s
CI / test (pull_request) Failing after 2m16s
9f82ce8f8c
The second pass, a workflow over the round-0 fixes: of round 0's 41
findings, 34 resolved, 6 partly and C10 declined, the decline upheld;
17 fresh findings. After verification 22 stand — 9 suggestions and 13
nits, 20 confirmed and 2 partly —; E1, the focus after a set-aside
question, was refuted. All 22 are taken, E3 in part.

- The live region (F1, E2, E5): keyed by what it last said, not by its
  words, and the words name the story on every page, so a move between
  pages says nothing; a run new to the strip, or a new status of one, is
  said once; a live run that leaves the watched set — it succeeded, or
  its story went to the trash — is said to have finished, before
  anything else, so a success no longer collapses the strip in silence.
  GetRunStrip hands the strip every run it watches for that.
- A refusal names its run (E4): StripRequestRefused carries the run
  asked about, and a refusal stands only while the strip shows that run,
  at the status the read after it showed — no longer beside whatever run
  the strip moved to while the request was out.
- The strip's cost per read (E3, in part): each story is read once,
  before its runs' rows, and a run of a story gone or in the trash costs
  no rows. Every other watched run's rows are still read, since ranking
  needs each run's own status; a status-only port read can come with
  13b's monitor, which lists the same runs.
- Focus (C2, F6): a strip that collapses under the focus hands it to the
  page's heading, through focus-keeper.js's fallback; the keeper's
  release on dispose is pinned.
- Words (F2, F7): "after 2 attempts" for two timeouts then a refusal; a
  cause ending in "?" takes no stop; an executor's message ending in a
  newline is trimmed; an orphan at its cap, which counts its attempts in
  its own words, is not counted again.
- Fixtures (B3, F3, F4): the strip's runs hold a graph of their own nodes
  only; every attempt follows the context step; nothing starts after a
  step gave up (R2), so "three running steps around a failed one" now
  reads "Writer for 20 s, Critic for 19 s and Ask for 18 s"; a run
  finishes at its last settle, and every time lies before now; the
  integration fixture's cancel goes through the ledger's transition too.
- Pins: two waiting steps beside a running one, the first named (B2);
  the contract's acknowledge faults split (B7); the live words asserted
  beside every several-steps row (F2).
- Docs: the story's ticked line gives the strip's full order (D2, F5);
  Kagaku.Flow's README has Acknowledge in L2, the dismissal refusal in
  L8's create checks and ListUnacknowledgedRunsAsync in the port notes
  (D6); ADR 0024's amendment says why the strip renders over the circuit
  and what that costs (F10), what the live region says and where the
  focus goes on a collapse, and ADR 0010 is amended: the collapsed slot
  keeps the live region and the focus keeper (F8); the plan's human-node
  line says the Run button must word a waiting step as the strip does
  (F11); DismissRun's and the strip state's summaries say what they do
  (F9, E6).

Tests: Kagaku.Flow 1116 to 1117, BlazorAdapter 867 to 878; Integration
907, one purge-between-reads test, which reading stories first made
moot, giving way to the read-count pin; the other three unchanged;
focus-keeper.js's vitest 12 to 14. All six projects and the manuscript
editor's vitest pass in full; 100% line and branch coverage on the
changed lines (412 lines, 256 branches), the strip's Razor included.
Probes: 20 runs over 20 C# mutants of these fixes, all compiling, all
killed on their first run; focus-keeper.js, 5 runs over 5 mutants of its
fallback, all killed — the own button's tab order pinned for it.
The browser pass, against the checked-in stand-in on a fresh seed: the
seeded failure said once on load; moves between the stories list, the
story, Graphs and back keep the same island and say nothing; a run
started from the chapter is said running once, its seconds ticking
unsaid, then "Mira's Winter: Continue finished." as the older failure
comes back unsaid; Dismiss by keyboard on the last run collapses the
slot to zero height and hands the focus to the page's heading, as a
success does with the focus on Cancel; no console errors.

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

🔮 fufu~ Jibril reviewed your code!

Oh? Oh! Slice 13a is a feast — a ledger transition grown symmetrically through both ledgers' contract, a strip whose every sentence I traced back to the rows it read, and a live region that says each thing exactly once. I read all 3,290 diff lines, the full files behind them, and their siblings — and then I sharpened three little knives and went hunting~ ♡

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

Not the code — the code delighted me. The CI is red at this exact head.

⛔ This needs resolving before I'm satisfied~

  1. CI test job failed for 9f82ce8f (run 364, job id 5575, failing after 2m16s; build and editor-browsers green). I will not guess why, and I won't pretend it didn't happen:
    • As jibril I cannot read the job's log (the log endpoints 404 for my token), so which step/test failed is yours to pull, dear author.
    • What I can swear to: locally, on this exact SHA, in Release exactly as CI runs it, everything passes — all six .NET projects (Integration 924, BlazorAdapter 925, UseCases 560, Domain 517, Flow 1117, OpenRouter 592 + 4 skipped), manuscript editor vitest 301, graph editor 14 — the precise counts your table claims. dotnet test Tsumugi.slnx in one shot: green.
    • The runner's test job has gone red on other SHAs today too (including main at 539ffef8 and abcdb5d0), which smells like an intermittent runner — but a smell is not a root cause, and I don't name causes I can't see. Pull the log; if it's the runner's habit, re-run and show me green at this head.
      Fix: check run 364's log, fix or re-run as it demands. A red head is not a mergeable head, fufu~ ♡

💡 Little ideas (non-blocking)~

  1. RunStrip.razor Failed() — cause[^1] after TrimEnd(): an empty error string would throw. The ledger's transitions refuse whitespace errors and the engine can't produce one, so this is unreachable in production — but a hand-seeded dev row with a blank error would take the whole strip down. A cause.Length > 0 ternary costs nothing.

✅ What I liked~

  • LedgerTransitions.Acknowledge — refuses live, succeeded, and already-dismissed runs, changes no row, and CheckCreate closes the seeding loophole (AcknowledgedAt only on failed/cancelled). The contract grew identically in RunLedgerContract for both ledgers with four new fault-injection scenarios — that is exactly how this ledger should grow. I got genuinely giddy~
  • The refusal state machine (RefusedRun/RefusedAt, a refusal standing only beside its run at the status the first read after it showed) — intricate, and the reducer theory covers every world. I deleted the status check and a test caught me immediately. ♪
  • "Outranked is not finished" in Hear() — a live run replaced by a higher-ranked one is not announced as finished, only a run that left the watched set. I mutated that guard too; a test was waiting for me. Wonderful.
  • The waiting-first ranking in GetRunStrip — neutralized it and three integration tests screamed. The rows-not-cached-status read, each story read once, trashed stories skipped: all verified in code and tests.
  • Fluxor ordering — the strip dispatches LoadRunStrip in OnInitialized while CircuitBridges (and thus the store initializer) renders after it. I decompiled Fluxor 6.10.0 to be sure: pre-activation dispatches queue in QueuedActions and replay on ActivateStoreAsync. Safe, and the test's InitializeAsync mirrors it.
  • The one-render-a-second timer that exists only while a step runs, disposed on settle and on the strip's going — RecordingClock even proves the disposal. The seconds over the circuit instead of RunTimes.Duration in script: the right call, and ADR 0024's amendment records why.

Automated review by Jibril · 2026-10-05
CI: failed for head SHA (test job 5575; log inaccessible to reviewer — see ⛔1; all suites green locally, counts matching the PR table) · Mutation probes: 3 run, 0 survived (GetRunStrip waiting-first ranking; RunStrip Hear outranked-guard; RunStripReducers RefusedAt status check — each killed on first run) · Local suite: full solution green (4,635 passed + 4 skipped; vitest 301; graph editor 14)

## 🔮 fufu~ Jibril reviewed your code! Oh? Oh! Slice 13a is a *feast* — a ledger transition grown symmetrically through both ledgers' contract, a strip whose every sentence I traced back to the rows it read, and a live region that says each thing exactly once. I read all 3,290 diff lines, the full files behind them, and their siblings — and then I sharpened three little knives and went hunting~ ♡ ### Verdict: ⛔ I can't let this pass~ ♡ Not the code — the code delighted me. The **CI is red at this exact head**. #### ⛔ This needs resolving before I'm satisfied~ 1. **CI `test` job failed for `9f82ce8f`** (run 364, job id 5575, failing after 2m16s; build and editor-browsers green). I will not guess why, and I won't pretend it didn't happen: - As `jibril` I cannot read the job's log (the log endpoints 404 for my token), so **which** step/test failed is yours to pull, dear author. - What I *can* swear to: locally, on this exact SHA, in Release exactly as CI runs it, everything passes — all six .NET projects (Integration 924, BlazorAdapter 925, UseCases 560, Domain 517, Flow 1117, OpenRouter 592 + 4 skipped), manuscript editor vitest 301, graph editor 14 — the precise counts your table claims. `dotnet test Tsumugi.slnx` in one shot: green. - The runner's `test` job has gone red on other SHAs today too (including main at `539ffef8` and `abcdb5d0`), which *smells* like an intermittent runner — but a smell is not a root cause, and I don't name causes I can't see. Pull the log; if it's the runner's habit, re-run and show me green at this head. Fix: check run 364's log, fix or re-run as it demands. A red head is not a mergeable head, fufu~ ♡ #### 💡 Little ideas (non-blocking)~ 1. **RunStrip.razor `Failed()`** — `cause[^1]` after `TrimEnd()`: an empty error string would throw. The ledger's transitions refuse whitespace errors and the engine can't produce one, so this is unreachable in production — but a hand-seeded dev row with a blank error would take the whole strip down. A `cause.Length > 0` ternary costs nothing. #### ✅ What I liked~ - **`LedgerTransitions.Acknowledge`** — refuses live, succeeded, and already-dismissed runs, changes no row, and `CheckCreate` closes the seeding loophole (AcknowledgedAt only on failed/cancelled). The contract grew identically in `RunLedgerContract` for *both* ledgers with four new fault-injection scenarios — that is exactly how this ledger should grow. I got genuinely giddy~ - **The refusal state machine** (`RefusedRun`/`RefusedAt`, a refusal standing only beside its run at the status the first read after it showed) — intricate, and the reducer theory covers every world. I deleted the status check and a test caught me immediately. ♪ - **"Outranked is not finished"** in `Hear()` — a live run replaced by a higher-ranked one is *not* announced as finished, only a run that left the watched set. I mutated that guard too; a test was waiting for me. Wonderful. - **The waiting-first ranking** in `GetRunStrip` — neutralized it and three integration tests screamed. The rows-not-cached-status read, each story read once, trashed stories skipped: all verified in code and tests. - **Fluxor ordering** — the strip dispatches `LoadRunStrip` in `OnInitialized` while `CircuitBridges` (and thus the store initializer) renders after it. I decompiled Fluxor 6.10.0 to be sure: pre-activation dispatches queue in `QueuedActions` and replay on `ActivateStoreAsync`. Safe, and the test's `InitializeAsync` mirrors it. - The one-render-a-second timer that exists only while a step runs, disposed on settle *and* on the strip's going — `RecordingClock` even proves the disposal. The seconds over the circuit instead of `RunTimes.Duration` in script: the right call, and ADR 0024's amendment records why. --- *Automated review by Jibril · 2026-10-05* *CI: failed for head SHA (test job 5575; log inaccessible to reviewer — see ⛔1; all suites green locally, counts matching the PR table) · Mutation probes: 3 run, 0 survived (GetRunStrip waiting-first ranking; RunStrip `Hear` outranked-guard; RunStripReducers `RefusedAt` status check — each killed on first run) · Local suite: full solution green (4,635 passed + 4 skipped; vitest 301; graph editor 14)*
fix(runs): a failed step without a cause — the strip names it instead of throwing (review round 1)
All checks were successful
CI / build (pull_request) Successful in 47s
CI / editor-browsers (pull_request) Successful in 2m3s
CI / test (pull_request) Successful in 2m15s
440a4357a0
Jibril's suggestion: Failed() read cause[^1] after TrimEnd(), so an
empty error — which no transition writes, but a hand-made row may hold —
would throw and take the strip down. GetRunStrip now cleans a step's
cause itself, the engine's count and trailing blanks taken off, and
gives none when nothing is left; the strip then says "Continue failed at
Writer after 3 attempts." without a why.

Tests: BlazorAdapter 925 to 927 — a blank cause, and a cause that is the
engine's count alone; the other five unchanged. All six projects pass in
full; 100% line and branch coverage on the changed lines (399 lines,
240 branches against main).
Probes: 4 runs over 4 mutants of this fix, all compiling, all
killed on their first run.

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

Thanks, Jibril. Both points:

⛔1 — CI's test job at 9f82ce8 (run 364). Björn pulled the log for me; my token gets a 404 on the log endpoints too. The test step aborted in Tsumugi.BlazorAdapter.Tests: The active test run was aborted. Reason: Test host process crashed, after 908 of its 925 tests passed. The other five projects passed: Integration 924, UseCases 560, Domain 517, Kagaku.Flow 1117, OpenRouter 592 + 4 skipped. The tail names no test and shows no exception, so I don't know the cause.

I couldn't reproduce it at 9f82ce8 in Release, with --blame-crash added each time to record the running test on an abort:

  • 8 runs of the BlazorAdapter suite alone, with coverage: 925 each time;
  • 4 runs of CI's own step, dotnet test --configuration Release --no-build --collect:"XPlat Code Coverage", all six hosts at once: every project green each time, no crash.

440a435 (below) runs CI again. If it crashes again, --blame-crash (or plain --blame) on CI's test step would name the test that was running. That's a change to the shared CI, so I've left it to Björn rather than putting it in this PR.

💡1 — Failed() and an empty cause. Taken in 440a435. GetRunStrip now cleans a step's cause itself: it takes off the engine's count and trailing blanks, and gives null when nothing is left. A failed step without a cause then reads "Continue failed at Writer after 3 attempts." instead of throwing. Two rows pin it: a blank cause, and a cause that is only the engine's count. BlazorAdapter goes from 925 to 927. 4 probes over the new lines were each killed on their first run. All six projects pass, with 100% line and branch coverage on the changed lines (399 lines, 240 branches against main).

Thanks, Jibril. Both points: **⛔1 — CI's `test` job at `9f82ce8` (run 364).** Björn pulled the log for me; my token gets a 404 on the log endpoints too. The `test` step aborted in **Tsumugi.BlazorAdapter.Tests**: `The active test run was aborted. Reason: Test host process crashed`, after 908 of its 925 tests passed. The other five projects passed: Integration 924, UseCases 560, Domain 517, Kagaku.Flow 1117, OpenRouter 592 + 4 skipped. The tail names no test and shows no exception, so I don't know the cause. I couldn't reproduce it at `9f82ce8` in Release, with `--blame-crash` added each time to record the running test on an abort: - 8 runs of the BlazorAdapter suite alone, with coverage: 925 each time; - 4 runs of CI's own step, `dotnet test --configuration Release --no-build --collect:"XPlat Code Coverage"`, all six hosts at once: every project green each time, no crash. `440a435` (below) runs CI again. If it crashes again, `--blame-crash` (or plain `--blame`) on CI's test step would name the test that was running. That's a change to the shared CI, so I've left it to Björn rather than putting it in this PR. **💡1 — `Failed()` and an empty cause.** Taken in `440a435`. `GetRunStrip` now cleans a step's cause itself: it takes off the engine's count and trailing blanks, and gives `null` when nothing is left. A failed step without a cause then reads "Continue failed at Writer after 3 attempts." instead of throwing. Two rows pin it: a blank cause, and a cause that is only the engine's count. BlazorAdapter goes from 925 to 927. 4 probes over the new lines were each killed on their first run. All six projects pass, with 100% line and branch coverage on the changed lines (399 lines, 240 branches against main).

🔄 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: 6113ccb · Generated: 2026-10-05 21:38:32 UTC · Revision: #2

Summary

Summary
Generated on: 10/05/2026 - 21:38:31
Coverage date: 10/05/2026 - 21:37:21 - 10/05/2026 - 21:38:28
Parser: MultiReport (6x Cobertura)
Assemblies: 9
Classes: 731
Files: 594
Line coverage: 97.9% (23120 of 23615)
Covered lines: 23120
Uncovered lines: 495
Coverable lines: 23615
Total lines: 49000
Branch coverage: 93.4% (8245 of 8825)
Covered branches: 8245
Total branches: 8825
Method coverage: Feature is only available for sponsors

Coverage

Kagaku.Flow - 99.7%
Name Line Branch
Kagaku.Flow 99.7% 99.2%
Kagaku.Flow.Budgeting.BudgetRequest 100%
Kagaku.Flow.Budgeting.ConsumerBudget 100%
Kagaku.Flow.Execution.NodeExecution 100% 100%
Kagaku.Flow.Execution.NodeOutcome 100% 100%
Kagaku.Flow.Execution.TransientFailureException 100%
Kagaku.Flow.Execution.Upstream 100%
Kagaku.Flow.Extensions.ServiceCollectionExtensions 100%
Kagaku.Flow.FlowJson 100%
Kagaku.Flow.Graphs.GraphDefinition 100%
Kagaku.Flow.Graphs.GraphDocument 100% 100%
Kagaku.Flow.Graphs.GraphEdge 100%
Kagaku.Flow.Graphs.GraphIndex 100% 100%
Kagaku.Flow.Graphs.GraphLoadError 100%
Kagaku.Flow.Graphs.GraphLoadResult 100%
Kagaku.Flow.Graphs.GraphNode 100%
Kagaku.Flow.Graphs.GraphPosition 100%
Kagaku.Flow.Graphs.GraphReader 100% 100%
Kagaku.Flow.Graphs.GraphSchema 100% 100%
Kagaku.Flow.Graphs.GraphShapeException 100%
Kagaku.Flow.Graphs.GraphWriter 100% 100%
Kagaku.Flow.Graphs.SocketRef 100%
Kagaku.Flow.Graphs.WireText 100% 100%
Kagaku.Flow.Nodes.CanvasDescriptorWriter 100% 100%
Kagaku.Flow.Nodes.ConfigProblem 100%
Kagaku.Flow.Nodes.Names 100%
Kagaku.Flow.Nodes.NodeDescriptor 100% 100%
Kagaku.Flow.Nodes.NodeRegistry 100% 100%
Kagaku.Flow.Nodes.NodeSockets 100% 100%
Kagaku.Flow.Nodes.SinkDescriptor 100%
Kagaku.Flow.Nodes.SocketTypes 100% 100%
Kagaku.Flow.Nodes.SourceDescriptor 100%
Kagaku.Flow.Nodes.TemplateField 100%
Kagaku.Flow.Runs.LedgerChange 100% 100%
Kagaku.Flow.Runs.LedgerTransitions 100% 100%
Kagaku.Flow.Runs.NodeAttempt 100%
Kagaku.Flow.Runs.NodeFacts 100%
Kagaku.Flow.Runs.NodeRun 100%
Kagaku.Flow.Runs.Run 100% 100%
Kagaku.Flow.Runs.RunEvent 100%
Kagaku.Flow.Runs.RunStatuses 100% 100%
Kagaku.Flow.Runs.RunTrigger 100% 100%
Kagaku.Flow.Scheduling.Exclusion 100%
Kagaku.Flow.Scheduling.FlowEngine 100% 100%
Kagaku.Flow.Scheduling.FlowEngineOptions 100% 100%
Kagaku.Flow.Scheduling.ReadyRow 100%
Kagaku.Flow.Scheduling.ReadySet 100% 100%
Kagaku.Flow.Scheduling.ReadySetResult 100%
Kagaku.Flow.Scheduling.RunRequest 100% 100%
Kagaku.Flow.Scheduling.RunStartResult 100%
Kagaku.Flow.Scheduling.SocketValues 100% 100%
Kagaku.Flow.Templating.InputsWalker 100% 100%
Kagaku.Flow.Templating.ParsedTemplate 100% 100%
Kagaku.Flow.Templating.SandboxedTemplateContext 100% 100%
Kagaku.Flow.Templating.TemplateError 100%
Kagaku.Flow.Templating.TemplateHost 100% 100%
Kagaku.Flow.Templating.TemplateLimits 100%
Kagaku.Flow.Templating.TemplateModel 100% 100%
Kagaku.Flow.Templating.TemplateProblem 100%
Kagaku.Flow.Templating.TemplateRenderRequest 100% 100%
Kagaku.Flow.Templating.TemplateRenderResult 100%
Kagaku.Flow.Templating.TemplateRun 100%
Kagaku.Flow.Templating.TemplateSinks 100%
Kagaku.Flow.Templating.TemplateValues 100% 100%
Kagaku.Flow.Validation.GraphValidation 100% 100%
Kagaku.Flow.Validation.GraphValidationContext 100%
Kagaku.Flow.Validation.HookFailure 100%
Kagaku.Flow.Validation.ResolvedGraph 100% 100%
Kagaku.Flow.Validation.ValidationError 100%
Kagaku.Flow.Validation.ValidationReport 100%
System.Text.RegularExpressions.Generated 97.4% 92.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF
E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__ColorToken_2
97.4% 94.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF
E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__Socket_1
97.2% 94.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF
E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__TypeId_0
97.2% 94.4%
Kagaku.Flow.OpenRouter - 100%
Name Line Branch
Kagaku.Flow.OpenRouter 100% 100%
Kagaku.Flow.OpenRouter.Catalog.ModelCapabilities 100% 100%
Kagaku.Flow.OpenRouter.Gateway.LlmCompletion 100%
Kagaku.Flow.OpenRouter.Gateway.OpenRouterGateway 100% 100%
Kagaku.Flow.OpenRouter.Gateway.OpenRouterGatewayOptions 100%
Kagaku.Flow.OpenRouter.Gateway.OpenRouterKeyLookup 100% 100%
Kagaku.Flow.OpenRouter.Gateway.SentRequestCapture 100% 100%
Kagaku.Flow.OpenRouter.Gateway.SentRequestCaptureHandler 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmAnswer 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmConfig 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmConfigRead 100%
Kagaku.Flow.OpenRouter.Llm.LlmDescriptor 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmExecutor 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmFacts 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmFailureText 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmMessage 100%
Kagaku.Flow.OpenRouter.Llm.LlmRequestBuilder 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmRequestPlan 100%
Kagaku.Flow.OpenRouter.Llm.LlmRoutingDefaults 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmSampling 100%
Kagaku.Flow.OpenRouter.Llm.LlmSchemaCheck 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmStrictSchemaRule 100% 100%
Kagaku.Flow.OpenRouter.Llm.LlmVocabulary 100% 100%
Kagaku.Flow.OpenRouter.LlmNodeServiceCollectionExtensions 100%
Kagaku.Flow.OpenRouter.OpenRouterServiceCollectionExtensions 100% 100%
Kagaku.Flow.Testing - 100%
Name Line Branch
Kagaku.Flow.Testing 100% 100%
Kagaku.Flow.Testing.FlowEngineDriver 100% 100%
Kagaku.Flow.Testing.InMemoryRunLedger 100% 100%
Kagaku.Flow.Testing.RecordingRunEventSink 100%
Kagaku.Flow.Testing.RunLedgerContract 100% 100%
Kagaku.Flow.Testing.RunLedgerContractException 100%
Tsumugi.BlazorAdapter - 97.2%
Name Line Branch
Tsumugi.BlazorAdapter 97.2% 93.8%
Tsumugi.BlazorAdapter.BlazorAdapterAssembly 100%
Tsumugi.BlazorAdapter.Documents.CategoryCreated 100%
Tsumugi.BlazorAdapter.Documents.CategoryEditor 93.2% 88.4%
Tsumugi.BlazorAdapter.Documents.CategorySaved 100%
Tsumugi.BlazorAdapter.Documents.ChangeCategoryFieldsRequested 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewEffects 100% 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewFailed 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewLoaded 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewPane 100% 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewReducers 100% 100%
Tsumugi.BlazorAdapter.Documents.ContextPreviewState 100%
Tsumugi.BlazorAdapter.Documents.CreateCategoryRequested 100%
Tsumugi.BlazorAdapter.Documents.CreateDocumentRequested 100%
Tsumugi.BlazorAdapter.Documents.DeleteCategoryChoice 100%
Tsumugi.BlazorAdapter.Documents.DeleteCategoryDialog 100% 94.1%
Tsumugi.BlazorAdapter.Documents.DeleteCategoryRequested 100%
Tsumugi.BlazorAdapter.Documents.DeleteDocumentRequested 100%
Tsumugi.BlazorAdapter.Documents.DocumentAutoSaveFailed 100%
Tsumugi.BlazorAdapter.Documents.DocumentCreated 100%
Tsumugi.BlazorAdapter.Documents.DocumentEditor 95.7% 89.4%
Tsumugi.BlazorAdapter.Documents.DocumentImageRefused 100%
Tsumugi.BlazorAdapter.Documents.DocumentImageSet 100%
Tsumugi.BlazorAdapter.Documents.DocumentsActionFailed 100%
Tsumugi.BlazorAdapter.Documents.DocumentSaved 100%
Tsumugi.BlazorAdapter.Documents.DocumentsEffects 100% 100%
Tsumugi.BlazorAdapter.Documents.DocumentsList 98.5% 95.1%
Tsumugi.BlazorAdapter.Documents.DocumentsLoaded 100%
Tsumugi.BlazorAdapter.Documents.DocumentsPage 100% 100%
Tsumugi.BlazorAdapter.Documents.DocumentsReadFailed 100%
Tsumugi.BlazorAdapter.Documents.DocumentsReducers 100% 100%
Tsumugi.BlazorAdapter.Documents.DocumentsRefusal 100%
Tsumugi.BlazorAdapter.Documents.DocumentsState 100% 100%
Tsumugi.BlazorAdapter.Documents.FieldInput 100% 96.6%
Tsumugi.BlazorAdapter.Documents.FieldsChanges 100% 100%
Tsumugi.BlazorAdapter.Documents.FieldShapes 90% 87.5%
Tsumugi.BlazorAdapter.Documents.ImageUpload 100%
Tsumugi.BlazorAdapter.Documents.ImageUploadRefusal 100%
Tsumugi.BlazorAdapter.Documents.ImpactText 100% 94.2%
Tsumugi.BlazorAdapter.Documents.LoadContextPreview 100%
Tsumugi.BlazorAdapter.Documents.LoadDocuments 100%
Tsumugi.BlazorAdapter.Documents.MoveDocumentChoice 100%
Tsumugi.BlazorAdapter.Documents.MoveDocumentDialog 95.6% 71.4%
Tsumugi.BlazorAdapter.Documents.MoveDocumentsRequested 100%
Tsumugi.BlazorAdapter.Documents.ReorderCategoriesRequested 100%
Tsumugi.BlazorAdapter.Documents.SetCategoryCollapsed 100%
Tsumugi.BlazorAdapter.Documents.SetDocumentImageRequested 100%
Tsumugi.BlazorAdapter.Documents.SetDocumentsFilter 100%
Tsumugi.BlazorAdapter.Documents.UpdateCategoryRequested 100%
Tsumugi.BlazorAdapter.Documents.UpdateDocumentRequested 100%
Tsumugi.BlazorAdapter.EffectCalls 100%
Tsumugi.BlazorAdapter.Graphs.DuplicateGraphRequested 100%
Tsumugi.BlazorAdapter.Graphs.GraphActionFailed 100%
Tsumugi.BlazorAdapter.Graphs.GraphCanvas 58.3% 40%
Tsumugi.BlazorAdapter.Graphs.GraphPlaygroundPage 100% 100%
Tsumugi.BlazorAdapter.Graphs.GraphsEffects 100% 100%
Tsumugi.BlazorAdapter.Graphs.GraphsLoaded 100%
Tsumugi.BlazorAdapter.Graphs.GraphsPage 100% 100%
Tsumugi.BlazorAdapter.Graphs.GraphsReducers 100%
Tsumugi.BlazorAdapter.Graphs.GraphsState 100%
Tsumugi.BlazorAdapter.Graphs.ImportGraphRequested 100%
Tsumugi.BlazorAdapter.Graphs.RestoreGraphRequested 100%
Tsumugi.BlazorAdapter.Graphs.ReviseGraphRequested 100%
Tsumugi.BlazorAdapter.Graphs.SetShowGraphTrash 100%
Tsumugi.BlazorAdapter.Graphs.TrashGraphRequested 100%
Tsumugi.BlazorAdapter.Help.EditorKeyEntry 100%
Tsumugi.BlazorAdapter.Help.EditorKeySection 100%
Tsumugi.BlazorAdapter.Help.EditorReference 100% 100%
Tsumugi.BlazorAdapter.Help.HelpPage 100% 100%
Tsumugi.BlazorAdapter.Help.PunctuationRow 100%
Tsumugi.BlazorAdapter.Notifications.DomainChangedBridge 94.4% 83.3%
Tsumugi.BlazorAdapter.Notifications.DomainChangesReceived 75% 100%
Tsumugi.BlazorAdapter.Runs.CancelRunQuestion 100% 100%
Tsumugi.BlazorAdapter.Runs.CancelRunRequested 100%
Tsumugi.BlazorAdapter.Runs.ClearRunHistoryRequested 100%
Tsumugi.BlazorAdapter.Runs.LiveRunEffects 100% 100%
Tsumugi.BlazorAdapter.Runs.LiveRunLoaded 100%
Tsumugi.BlazorAdapter.Runs.LiveRunReadFailed 100%
Tsumugi.BlazorAdapter.Runs.LiveRunReducers 100% 100%
Tsumugi.BlazorAdapter.Runs.LiveRunState 100%
Tsumugi.BlazorAdapter.Runs.LoadLiveRun 100%
Tsumugi.BlazorAdapter.Runs.LoadRunHistory 100%
Tsumugi.BlazorAdapter.Runs.LoadRunStrip 100%
Tsumugi.BlazorAdapter.Runs.RunChangedBridge 98.1% 95%
Tsumugi.BlazorAdapter.Runs.RunChangesReceived 100%
Tsumugi.BlazorAdapter.Runs.RunControl 100% 100%
Tsumugi.BlazorAdapter.Runs.RunHistoryClearFailed 100%
Tsumugi.BlazorAdapter.Runs.RunHistoryLoaded 100%
Tsumugi.BlazorAdapter.Runs.RunHistoryPanel 100% 97.8%
Tsumugi.BlazorAdapter.Runs.RunHistoryReadFailed 100%
Tsumugi.BlazorAdapter.Runs.RunPreview 100% 100%
Tsumugi.BlazorAdapter.Runs.RunPreviewReducers 100% 100%
Tsumugi.BlazorAdapter.Runs.RunPreviewState 100%
Tsumugi.BlazorAdapter.Runs.RunPreviewText 100%
Tsumugi.BlazorAdapter.Runs.RunRequestRefused 100%
Tsumugi.BlazorAdapter.Runs.RunsEffects 100% 100%
Tsumugi.BlazorAdapter.Runs.RunsPage 100%
Tsumugi.BlazorAdapter.Runs.RunsReducers 100% 100%
Tsumugi.BlazorAdapter.Runs.RunsState 100%
Tsumugi.BlazorAdapter.Runs.RunStrip 100% 100%
Tsumugi.BlazorAdapter.Runs.RunStripEffects 100% 100%
Tsumugi.BlazorAdapter.Runs.RunStripLoaded 100%
Tsumugi.BlazorAdapter.Runs.RunStripReadFailed 100%
Tsumugi.BlazorAdapter.Runs.RunStripReducers 100% 100%
Tsumugi.BlazorAdapter.Runs.RunStripState 100%
Tsumugi.BlazorAdapter.Runs.RunTextKey 100%
Tsumugi.BlazorAdapter.Runs.RunTextReceived 100%
Tsumugi.BlazorAdapter.Runs.RunTimes 100% 100%
Tsumugi.BlazorAdapter.Runs.StartRunRequested 100%
Tsumugi.BlazorAdapter.Runs.StripCancelRequested 100%
Tsumugi.BlazorAdapter.Runs.StripDismissRequested 100%
Tsumugi.BlazorAdapter.Runs.StripRequestRefused 100%
Tsumugi.BlazorAdapter.Settings.BackupFailed 100%
Tsumugi.BlazorAdapter.Settings.BackupNowRequested 100%
Tsumugi.BlazorAdapter.Settings.BackupSettingsLoaded 100%
Tsumugi.BlazorAdapter.Settings.BackupsSection 100% 100%
Tsumugi.BlazorAdapter.Settings.BackupsSettingsEffects 100%
Tsumugi.BlazorAdapter.Settings.BackupsSettingsReducers 100%
Tsumugi.BlazorAdapter.Settings.BackupsSettingsState 100%
Tsumugi.BlazorAdapter.Settings.DefaultsSection 100% 100%
Tsumugi.BlazorAdapter.Settings.DefaultsSettingsEffects 100%
Tsumugi.BlazorAdapter.Settings.DefaultsSettingsReducers 100%
Tsumugi.BlazorAdapter.Settings.DefaultsSettingsState 100%
Tsumugi.BlazorAdapter.Settings.EditorAppearanceCss 100% 100%
Tsumugi.BlazorAdapter.Settings.EditorAppearanceEffects 100%
Tsumugi.BlazorAdapter.Settings.EditorAppearanceLoaded 100%
Tsumugi.BlazorAdapter.Settings.EditorAppearancePreview 100% 100%
Tsumugi.BlazorAdapter.Settings.EditorAppearanceReducers 100% 100%
Tsumugi.BlazorAdapter.Settings.EditorAppearanceSaved 100%
Tsumugi.BlazorAdapter.Settings.EditorAppearanceSaveFailed 100%
Tsumugi.BlazorAdapter.Settings.EditorAppearanceSection 95% 98%
Tsumugi.BlazorAdapter.Settings.EditorAppearanceState 100%
Tsumugi.BlazorAdapter.Settings.EditorPreviewBlock 100%
Tsumugi.BlazorAdapter.Settings.EditorPreviewSample 100%
Tsumugi.BlazorAdapter.Settings.EditorSuggestionsEffects 91.6%
Tsumugi.BlazorAdapter.Settings.EditorSuggestionsLoaded 100%
Tsumugi.BlazorAdapter.Settings.EditorSuggestionsReducers 100% 100%
Tsumugi.BlazorAdapter.Settings.EditorSuggestionsSaved 100%
Tsumugi.BlazorAdapter.Settings.EditorSuggestionsSaveFailed 100%
Tsumugi.BlazorAdapter.Settings.EditorSuggestionsSection 100% 95%
Tsumugi.BlazorAdapter.Settings.EditorSuggestionsState 100%
Tsumugi.BlazorAdapter.Settings.EditorTypingEffects 91.6%
Tsumugi.BlazorAdapter.Settings.EditorTypingLoaded 100%
Tsumugi.BlazorAdapter.Settings.EditorTypingReducers 100% 100%
Tsumugi.BlazorAdapter.Settings.EditorTypingSaved 100%
Tsumugi.BlazorAdapter.Settings.EditorTypingSaveFailed 100%
Tsumugi.BlazorAdapter.Settings.EditorTypingSection 100% 100%
Tsumugi.BlazorAdapter.Settings.EditorTypingState 100%
Tsumugi.BlazorAdapter.Settings.LlmDefaultsLoaded 100%
Tsumugi.BlazorAdapter.Settings.LlmDefaultsSaved 100%
Tsumugi.BlazorAdapter.Settings.LlmDefaultsSaveFailed 100%
Tsumugi.BlazorAdapter.Settings.LoadBackupSettings 100%
Tsumugi.BlazorAdapter.Settings.LoadProviderSettings 100%
Tsumugi.BlazorAdapter.Settings.ModelCatalogLoaded 100%
Tsumugi.BlazorAdapter.Settings.ModelCatalogLoadFailed 100%
Tsumugi.BlazorAdapter.Settings.ModelPicker 100% 100%
Tsumugi.BlazorAdapter.Settings.OpenRouterKeySaved 100%
Tsumugi.BlazorAdapter.Settings.OpenRouterKeySaveFailed 100%
Tsumugi.BlazorAdapter.Settings.ProviderKeyChecked 100%
Tsumugi.BlazorAdapter.Settings.ProviderSection 100% 100%
Tsumugi.BlazorAdapter.Settings.ProviderSettingsEffects 100% 100%
Tsumugi.BlazorAdapter.Settings.ProviderSettingsLoaded 100%
Tsumugi.BlazorAdapter.Settings.ProviderSettingsReducers 100% 100%
Tsumugi.BlazorAdapter.Settings.ProviderSettingsState 100% 100%
Tsumugi.BlazorAdapter.Settings.SaveEditorAppearanceRequested 100%
Tsumugi.BlazorAdapter.Settings.SaveEditorSuggestionsRequested 100%
Tsumugi.BlazorAdapter.Settings.SaveEditorTypingRequested 100%
Tsumugi.BlazorAdapter.Settings.SaveLlmDefaultsRequested 100%
Tsumugi.BlazorAdapter.Settings.SaveOpenRouterKeyRequested 100%
Tsumugi.BlazorAdapter.Settings.SuggestionUsageEffects 100%
Tsumugi.BlazorAdapter.Settings.SuggestionUsageLoaded 100%
Tsumugi.BlazorAdapter.Stories.CreateStoryRequested 100%
Tsumugi.BlazorAdapter.Stories.PurgeStoryRequested 100%
Tsumugi.BlazorAdapter.Stories.RestoreStoryRequested 100%
Tsumugi.BlazorAdapter.Stories.SetShowArchived 100%
Tsumugi.BlazorAdapter.Stories.SetStoriesFilter 100%
Tsumugi.BlazorAdapter.Stories.SetStoryArchivedRequested 100%
Tsumugi.BlazorAdapter.Stories.StoriesEffects 100% 100%
Tsumugi.BlazorAdapter.Stories.StoriesLoaded 100%
Tsumugi.BlazorAdapter.Stories.StoriesPage 100% 100%
Tsumugi.BlazorAdapter.Stories.StoriesReducers 100% 100%
Tsumugi.BlazorAdapter.Stories.StoriesState 100% 100%
Tsumugi.BlazorAdapter.Stories.StoryActionFailed 100%
Tsumugi.BlazorAdapter.Stories.StoryCreated 100%
Tsumugi.BlazorAdapter.Stories.StoryCreateFailed 100%
Tsumugi.BlazorAdapter.Stories.StoryTrashPage 100% 100%
Tsumugi.BlazorAdapter.Stories.TrashStoryRequested 100%
Tsumugi.BlazorAdapter.Workspace.AckWire 100%
Tsumugi.BlazorAdapter.Workspace.AutoSaveFailed 100%
Tsumugi.BlazorAdapter.Workspace.ChangedWire 100%
Tsumugi.BlazorAdapter.Workspace.ChapterHeader 100% 86.3%
Tsumugi.BlazorAdapter.Workspace.ChapterMenu 100% 81.2%
Tsumugi.BlazorAdapter.Workspace.ChapterPage 100% 93.3%
Tsumugi.BlazorAdapter.Workspace.ChapterSaved 100%
Tsumugi.BlazorAdapter.Workspace.ChaptersPage 94.4% 83.3%
Tsumugi.BlazorAdapter.Workspace.ChapterWire 100%
Tsumugi.BlazorAdapter.Workspace.ChapterWritten 100%
Tsumugi.BlazorAdapter.Workspace.CreateChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.CreatedWire 100%
Tsumugi.BlazorAdapter.Workspace.DeleteChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.DeltaWire 100%
Tsumugi.BlazorAdapter.Workspace.HistoryEffects 100% 100%
Tsumugi.BlazorAdapter.Workspace.HistoryLoaded 100%
Tsumugi.BlazorAdapter.Workspace.HistoryPage 100%
Tsumugi.BlazorAdapter.Workspace.HistoryPanel 100% 100%
Tsumugi.BlazorAdapter.Workspace.HistoryReadFailed 100%
Tsumugi.BlazorAdapter.Workspace.LoadHistory 100%
Tsumugi.BlazorAdapter.Workspace.LoadWorkspace 100%
Tsumugi.BlazorAdapter.Workspace.ManuscriptEffects 100% 100%
Tsumugi.BlazorAdapter.Workspace.ManuscriptEvents 82.2% 75.7%
Tsumugi.BlazorAdapter.Workspace.ManuscriptSurface 88.3% 86.8%
Tsumugi.BlazorAdapter.Workspace.MergeChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.MergeEvent 100%
Tsumugi.BlazorAdapter.Workspace.MoveChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.RedoRequested 100%
Tsumugi.BlazorAdapter.Workspace.RedoRevertRequested 100%
Tsumugi.BlazorAdapter.Workspace.RenameChapterRequested 100%
Tsumugi.BlazorAdapter.Workspace.ReshapeEvent 100%
Tsumugi.BlazorAdapter.Workspace.RevertToSnapshotRequested 100%
Tsumugi.BlazorAdapter.Workspace.SaveScope 100% 50%
Tsumugi.BlazorAdapter.Workspace.SaveStateLadder 100% 100%
Tsumugi.BlazorAdapter.Workspace.SaveVersionRequested 100%
Tsumugi.BlazorAdapter.Workspace.SegmentTextEvent 100%
Tsumugi.BlazorAdapter.Workspace.SegmentWire 100% 81.8%
Tsumugi.BlazorAdapter.Workspace.SelectionEndWire 100%
Tsumugi.BlazorAdapter.Workspace.SelectionGraph 100%
Tsumugi.BlazorAdapter.Workspace.SelectionRangeWire 100%
Tsumugi.BlazorAdapter.Workspace.SelectionRunRequested 100%
Tsumugi.BlazorAdapter.Workspace.SetActiveGraphRequested 100%
Tsumugi.BlazorAdapter.Workspace.SetChapterSummaryRequested 100%
Tsumugi.BlazorAdapter.Workspace.SplitEvent 100%
Tsumugi.BlazorAdapter.Workspace.StampWire 0%
Tsumugi.BlazorAdapter.Workspace.StoryDetails 100% 85.2%
Tsumugi.BlazorAdapter.Workspace.StoryGeneralPage 100% 100%
Tsumugi.BlazorAdapter.Workspace.StoryGraphsEffects 100% 100%
Tsumugi.BlazorAdapter.Workspace.StoryGraphsLoaded 100%
Tsumugi.BlazorAdapter.Workspace.StoryGraphsReducers 100%
Tsumugi.BlazorAdapter.Workspace.StoryGraphsState 100%
Tsumugi.BlazorAdapter.Workspace.StorySaved 100%
Tsumugi.BlazorAdapter.Workspace.StoryShell 100% 100%
Tsumugi.BlazorAdapter.Workspace.UndoRequested 100%
Tsumugi.BlazorAdapter.Workspace.UndoStatusChanged 100%
Tsumugi.BlazorAdapter.Workspace.UpdateStoryRequested 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceActionFailed 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceLoaded 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceNotFound 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceReducers 100% 100%
Tsumugi.BlazorAdapter.Workspace.WorkspaceState 100%
Tsumugi.Domain - 96.5%
Name Line Branch
Tsumugi.Domain 96.5% 95.2%
System.Text.RegularExpressions.Generated 91.3% 88.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__DigitsAndSeparators_2
97.4% 95.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__LineBreak_0
91% 91.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__NumberToken_1
91.8% 83.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__Plain_4
91.9% 88.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25
BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__ThousandsGroup_3
90.9% 84.3%
Tsumugi.Domain.Documents.CategoryFields 94.5% 93.7%
Tsumugi.Domain.Documents.ChoiceOption 100%
Tsumugi.Domain.Documents.ChoiceValue 100%
Tsumugi.Domain.Documents.DateText 100%
Tsumugi.Domain.Documents.DateValue 100%
Tsumugi.Domain.Documents.Document 100% 100%
Tsumugi.Domain.Documents.DocumentCategory 100% 100%
Tsumugi.Domain.Documents.DocumentValues 100%
Tsumugi.Domain.Documents.FieldCarry 100% 100%
Tsumugi.Domain.Documents.FieldConversion 100% 100%
Tsumugi.Domain.Documents.FieldDefinition 97% 95.3%
Tsumugi.Domain.Documents.FieldMessages 100% 100%
Tsumugi.Domain.Documents.FieldNames 100%
Tsumugi.Domain.Documents.FieldsChange 100%
Tsumugi.Domain.Documents.FieldShape 95.2% 87.5%
Tsumugi.Domain.Documents.FieldsPlan 100%
Tsumugi.Domain.Documents.FieldsPlanner 99.2% 99.2%
Tsumugi.Domain.Documents.FieldValue 100%
Tsumugi.Domain.Documents.FieldValues 95.4% 97.7%
Tsumugi.Domain.Documents.ImageFiles 100% 100%
Tsumugi.Domain.Documents.ImageValue 100%
Tsumugi.Domain.Documents.MovePlan 100%
Tsumugi.Domain.Documents.NumberParse 100%
Tsumugi.Domain.Documents.NumberText 100% 97.6%
Tsumugi.Domain.Documents.NumberValue 100%
Tsumugi.Domain.Documents.StoryImage 100%
Tsumugi.Domain.Documents.TextValue 100% 100%
Tsumugi.Domain.Documents.ValueChange 100%
Tsumugi.Domain.Documents.ValueChangeKey 100%
Tsumugi.Domain.Documents.ValueImpact 100% 100%
Tsumugi.Domain.Graphs.Graph 100% 100%
Tsumugi.Domain.Graphs.GraphTriggers 100% 100%
Tsumugi.Domain.Journal.ChangeLogEntry 97.9% 83.3%
Tsumugi.Domain.Journal.StorySnapshot 96.7% 83.3%
Tsumugi.Domain.Settings.AppSetting 100%
Tsumugi.Domain.Stories.Chapter 100% 100%
Tsumugi.Domain.Stories.InlineMarkup 100% 100%
Tsumugi.Domain.Stories.MarkupRun 100%
Tsumugi.Domain.Stories.Provenance 100% 100%
Tsumugi.Domain.Stories.Segment 100% 100%
Tsumugi.Domain.Stories.Story 100% 100%
Tsumugi.Domain.Text 100% 100%
Tsumugi.Infrastructure - 98.8%
Name Line Branch
Tsumugi.Infrastructure 98.8% 87.7%
System.Text.RegularExpressions.Generated 81.4% 64.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F0D076C66E8EEC1C
A55E0373ED22DC58420DBB40F103A46B68DC4D9CE5A49E00B__Pattern_0
84% 65.7%
Tsumugi.Infrastructure.Backups.BackupArtifactName 100% 100%
Tsumugi.Infrastructure.Backups.BackupOptions 100%
Tsumugi.Infrastructure.Backups.BackupSchedule 100% 83.3%
Tsumugi.Infrastructure.Backups.BackupScheduler 96.6% 87.5%
Tsumugi.Infrastructure.Backups.BackupWriter 98.5% 92.8%
Tsumugi.Infrastructure.Backups.DatabaseFingerprint 91.9% 97%
Tsumugi.Infrastructure.Backups.FileSystemBackupStore 100% 100%
Tsumugi.Infrastructure.Backups.OwnerOnlyFile 100% 100%
Tsumugi.Infrastructure.Backups.PreMigrationBackup 90% 100%
Tsumugi.Infrastructure.Backups.SqliteSnapshot 88.2% 75%
Tsumugi.Infrastructure.DependencyInjection 100% 100%
Tsumugi.Infrastructure.Journal.EfChangeJournal 100%
Tsumugi.Infrastructure.Journal.EfSnapshotStore 100% 100%
Tsumugi.Infrastructure.Journal.EfUndoStore 98.5% 88.2%
Tsumugi.Infrastructure.Journal.ModelExtensions 100%
Tsumugi.Infrastructure.Journal.OperationContext 100% 100%
Tsumugi.Infrastructure.Journal.PropertyBag 100% 95.4%
Tsumugi.Infrastructure.Notifications.InProcessDomainChangedBus 100% 100%
Tsumugi.Infrastructure.Persistence.Configurations.AppSettingConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.ChangeLogEntryConfigurati
on
100%
Tsumugi.Infrastructure.Persistence.Configurations.ChapterConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.DocumentCategoryConfigura
tion
100%
Tsumugi.Infrastructure.Persistence.Configurations.DocumentConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.GraphConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.NodeRunRecordConfiguratio
n
100%
Tsumugi.Infrastructure.Persistence.Configurations.RunRecordConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.SegmentConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.StoryConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.StoryImageConfiguration 100%
Tsumugi.Infrastructure.Persistence.Configurations.StorySnapshotConfiguratio
n
100%
Tsumugi.Infrastructure.Persistence.Converters.CanonicalJsonComparer 100%
Tsumugi.Infrastructure.Persistence.Converters.CategoryFieldsConverter 97.6% 94.4%
Tsumugi.Infrastructure.Persistence.Converters.FieldValuesConverter 96.9% 93.7%
Tsumugi.Infrastructure.Persistence.Converters.GraphTriggerConverter 100% 100%
Tsumugi.Infrastructure.Persistence.Converters.ProvenanceConverter 100% 90%
Tsumugi.Infrastructure.Persistence.Converters.UtcTicksConverter 100%
Tsumugi.Infrastructure.Persistence.Converters.WireFormat 85.7% 73.8%
Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphForeignKey 100%
Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphOnContinue 100% 100%
Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphOnContinueSql 100%
Tsumugi.Infrastructure.Persistence.Migrations.AddAppSettings 99.2%
Tsumugi.Infrastructure.Persistence.Migrations.AddJournal 98.8%
Tsumugi.Infrastructure.Persistence.Migrations.CategoryFields 100% 100%
Tsumugi.Infrastructure.Persistence.Migrations.CategoryFieldsSql 100%
Tsumugi.Infrastructure.Persistence.Migrations.DropDocumentBody 100%
Tsumugi.Infrastructure.Persistence.Migrations.GenericDocuments 100%
Tsumugi.Infrastructure.Persistence.Migrations.GraphLibrary 100%
Tsumugi.Infrastructure.Persistence.Migrations.InitialStoryDomain 97.3%
Tsumugi.Infrastructure.Persistence.Migrations.JournalUndoState 100%
Tsumugi.Infrastructure.Persistence.Migrations.RunLedger 100%
Tsumugi.Infrastructure.Persistence.Migrations.RunSnapshotFinish 100%
Tsumugi.Infrastructure.Persistence.Migrations.SegmentTextMarkup 100% 100%
Tsumugi.Infrastructure.Persistence.Migrations.SegmentTextMarkupSql 100%
Tsumugi.Infrastructure.Persistence.Migrations.StoryImages 100%
Tsumugi.Infrastructure.Persistence.Migrations.TsumugiDbContextModelSnapshot 100%
Tsumugi.Infrastructure.Persistence.SqliteFunctions 80% 66.6%
Tsumugi.Infrastructure.Persistence.SqlitePragmaInterceptor 100% 100%
Tsumugi.Infrastructure.Persistence.Stores.EfChapterStore 100% 100%
Tsumugi.Infrastructure.Persistence.Stores.EfDocumentStore 98.3% 75%
Tsumugi.Infrastructure.Persistence.Stores.EfGraphStore 100% 100%
Tsumugi.Infrastructure.Persistence.Stores.EfImageStore 100%
Tsumugi.Infrastructure.Persistence.Stores.EfSegmentStore 100% 100%
Tsumugi.Infrastructure.Persistence.Stores.EfStoryStore 98.7% 91.6%
Tsumugi.Infrastructure.Persistence.TsumugiDbContext 97.7% 96.6%
Tsumugi.Infrastructure.Persistence.TsumugiDbContextFactory 100%
Tsumugi.Infrastructure.Provider.LlmDefaultsSource 100%
Tsumugi.Infrastructure.Provider.OpenRouterKeySource 100% 100%
Tsumugi.Infrastructure.Provider.OpenRouterModelProvider 100% 100%
Tsumugi.Infrastructure.Provider.OpenRouterOptions 100% 100%
Tsumugi.Infrastructure.Provider.ResolvedKey 100%
Tsumugi.Infrastructure.Runs.EfRunHistory 100%
Tsumugi.Infrastructure.Runs.EfRunLedger 100% 100%
Tsumugi.Infrastructure.Runs.InProcessRunEventBus 100% 100%
Tsumugi.Infrastructure.Runs.LedgerMapping 100% 100%
Tsumugi.Infrastructure.Runs.LedgerPromptSamples 100%
Tsumugi.Infrastructure.Runs.NodeRunRecord 100%
Tsumugi.Infrastructure.Runs.RunEngineHost 100%
Tsumugi.Infrastructure.Runs.RunRecord 100%
Tsumugi.Infrastructure.Runs.RunSnapshotsHost 100% 100%
Tsumugi.Infrastructure.Settings.EfAppSettingsStore 100% 100%
Tsumugi.Infrastructure.Suggestions.OpenRouterSuggestionModel 40% 44.4%
Tsumugi.Infrastructure.Suggestions.SuggestionRequestBuilder 100% 94.4%
Tsumugi.Kernel - 90.9%
Name Line Branch
Tsumugi.Kernel 90.9% 75%
Tsumugi.Kernel.Err`1 100%
Tsumugi.Kernel.Ok`1 100%
Tsumugi.Kernel.Result`1 88.8% 75%
Tsumugi.Server - 99.6%
Name Line Branch
Tsumugi.Server 99.6% 91.5%
Program 99.2% 95.4%
Tsumugi.Server.Backups.BackupConfiguration 100% 100%
Tsumugi.Server.Components.App 100%
Tsumugi.Server.Components.Layout.AppHeader 100% 50%
Tsumugi.Server.Components.Layout.MainLayout 100%
Tsumugi.Server.Components.Pages.Gate 100% 100%
Tsumugi.Server.Provider.OpenRouterConfiguration 100% 100%
Tsumugi.Server.Security.AccessGate 100% 87.5%
Tsumugi.Server.Security.AccessSecret 100% 100%
Tsumugi.Server.Security.GateThrottle 100% 100%
Tsumugi.Server.VolumeStartupValidator 100% 100%
Tsumugi.UseCases - 94.8%
Name Line Branch
Tsumugi.UseCases 94.8% 89.4%
System.Text.RegularExpressions.Generated 78.5% 63.1%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A
663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__AttemptCount_1
84.4% 68.4%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A
663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__HexColour_2
94.8% 87.5%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A
663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__LineBreaks_0
95.3% 90.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A
663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__Preface_3
61.9% 51.6%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A
663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__SentenceEnd_4
88% 69.4%
Tsumugi.UseCases.Backups.BackupArtifact 100%
Tsumugi.UseCases.Backups.BackupFailure 100%
Tsumugi.UseCases.Backups.BackupJobState 100%
Tsumugi.UseCases.Backups.BackupPolicy 100%
Tsumugi.UseCases.Backups.BackupStatusView 100% 100%
Tsumugi.UseCases.Backups.DatabaseSnapshot 100%
Tsumugi.UseCases.Backups.DownloadDatabaseSnapshot 100%
Tsumugi.UseCases.Backups.GetBackupStatus 100%
Tsumugi.UseCases.Backups.IBackupStore 0%
Tsumugi.UseCases.Backups.RunBackupNow 100%
Tsumugi.UseCases.Chapters.ChapterDto 100%
Tsumugi.UseCases.Chapters.CreateChapter 100% 100%
Tsumugi.UseCases.Chapters.DeleteChapter 100% 100%
Tsumugi.UseCases.Chapters.GetChapterSegments 100%
Tsumugi.UseCases.Chapters.GetManuscript 100% 100%
Tsumugi.UseCases.Chapters.ManuscriptChapter 100%
Tsumugi.UseCases.Chapters.ManuscriptView 100%
Tsumugi.UseCases.Chapters.MergeChapters 100% 100%
Tsumugi.UseCases.Chapters.RenameChapter 100% 100%
Tsumugi.UseCases.Chapters.ReorderChapters 100% 100%
Tsumugi.UseCases.Chapters.SetChapterSummary 100% 75%
Tsumugi.UseCases.Commit.AppendRunText 100% 92.8%
Tsumugi.UseCases.Commit.CommitConfig 100% 100%
Tsumugi.UseCases.Commit.CommitConfigRead 100%
Tsumugi.UseCases.Commit.CommitDescriptor 100%
Tsumugi.UseCases.Commit.CommitExecutor 100% 100%
Tsumugi.UseCases.Commit.CommitReport 100%
Tsumugi.UseCases.Commit.CommittedSegments 100%
Tsumugi.UseCases.Commit.RunAppend 100%
Tsumugi.UseCases.Context.AssembledContext 100%
Tsumugi.UseCases.Context.CharsPerToken 100% 100%
Tsumugi.UseCases.Context.ConsumerFigures 100%
Tsumugi.UseCases.Context.ContextAssembly 100% 100%
Tsumugi.UseCases.Context.ContextAttempt 100% 100%
Tsumugi.UseCases.Context.ContextBudgetTokens 100%
Tsumugi.UseCases.Context.ContextBuild 100%
Tsumugi.UseCases.Context.ContextBuilder 100%
Tsumugi.UseCases.Context.ContextConfig 100% 100%
Tsumugi.UseCases.Context.ContextConfigRead 100%
Tsumugi.UseCases.Context.ContextConsumerRule 100% 100%
Tsumugi.UseCases.Context.ContextDescriptor 100%
Tsumugi.UseCases.Context.ContextExecutor 100% 100%
Tsumugi.UseCases.Context.ContextNodePreview 100%
Tsumugi.UseCases.Context.ContextParts 100%
Tsumugi.UseCases.Context.ContextPreview 100%
Tsumugi.UseCases.Context.ContextReport 100%
Tsumugi.UseCases.Context.DocumentRendering 100% 100%
Tsumugi.UseCases.Context.PreviewContext 100% 100%
Tsumugi.UseCases.Context.PromptSample 100% 100%
Tsumugi.UseCases.Context.RecentParagraph 100%
Tsumugi.UseCases.Context.StoryDocumentsRule 100% 100%
Tsumugi.UseCases.Context.StoryReads 100% 100%
Tsumugi.UseCases.Context.StoryScope 100% 100%
Tsumugi.UseCases.Context.StoryTemplateModel 100%
Tsumugi.UseCases.Context.StoryText 100% 100%
Tsumugi.UseCases.DependencyInjection 100%
Tsumugi.UseCases.Diagnostics.SeedContext 100%
Tsumugi.UseCases.Diagnostics.SeedDevData 98.6% 68.7%
Tsumugi.UseCases.Diagnostics.SeedPictures 100%
Tsumugi.UseCases.Diagnostics.SeedRuns 100%
Tsumugi.UseCases.Documents.ChangeCategoryFields 100% 83.3%
Tsumugi.UseCases.Documents.CreateCategory 100% 100%
Tsumugi.UseCases.Documents.CreateDocument 100% 100%
Tsumugi.UseCases.Documents.DefaultFields 100% 100%
Tsumugi.UseCases.Documents.DeleteCategory 100% 94.4%
Tsumugi.UseCases.Documents.DeleteDocument 100% 100%
Tsumugi.UseCases.Documents.DocumentCategoryDto 100%
Tsumugi.UseCases.Documents.DocumentCategoryProfile 100%
Tsumugi.UseCases.Documents.DocumentDto 100%
Tsumugi.UseCases.Documents.DocumentPatch 100%
Tsumugi.UseCases.Documents.DocumentProfile 100%
Tsumugi.UseCases.Documents.DocumentsCategory 100%
Tsumugi.UseCases.Documents.DocumentsView 100%
Tsumugi.UseCases.Documents.DocumentWrites 100% 100%
Tsumugi.UseCases.Documents.FieldsChangeLabel 95.4% 88.2%
Tsumugi.UseCases.Documents.GetDocuments 100% 100%
Tsumugi.UseCases.Documents.GetStoryImage 100% 100%
Tsumugi.UseCases.Documents.ImpactPreview 100% 100%
Tsumugi.UseCases.Documents.LossMessages 92.3% 87.5%
Tsumugi.UseCases.Documents.MoveDocuments 100% 100%
Tsumugi.UseCases.Documents.ReorderCategories 100% 100%
Tsumugi.UseCases.Documents.SetDocumentImage 100% 93.7%
Tsumugi.UseCases.Documents.StoryImageFile 100%
Tsumugi.UseCases.Documents.UpdateCategory 100% 100%
Tsumugi.UseCases.Documents.UpdateDocument 100% 81.2%
Tsumugi.UseCases.Documents.WriteRefusedException 100%
Tsumugi.UseCases.Graphs.BundledGraphs 100%
Tsumugi.UseCases.Graphs.DuplicateGraph 100% 100%
Tsumugi.UseCases.Graphs.ExportGraph 100% 100%
Tsumugi.UseCases.Graphs.GetNodeTypes 100%
Tsumugi.UseCases.Graphs.GraphExport 100%
Tsumugi.UseCases.Graphs.GraphFile 100% 100%
Tsumugi.UseCases.Graphs.GraphFileContent 100%
Tsumugi.UseCases.Graphs.GraphListItem 100%
Tsumugi.UseCases.Graphs.GraphUser 100%
Tsumugi.UseCases.Graphs.GraphUsers 100%
Tsumugi.UseCases.Graphs.ImportGraph 100% 100%
Tsumugi.UseCases.Graphs.ListGraphs 100% 100%
Tsumugi.UseCases.Graphs.ListStoryGraphs 100% 100%
Tsumugi.UseCases.Graphs.RestoreGraph 100% 100%
Tsumugi.UseCases.Graphs.ReviseGraph 100% 100%
Tsumugi.UseCases.Graphs.SeedBundledGraphs 100% 100%
Tsumugi.UseCases.Graphs.SeededTemplates 100%
Tsumugi.UseCases.Graphs.StoryGraphChoice 100%
Tsumugi.UseCases.Graphs.TrashGraph 100% 100%
Tsumugi.UseCases.Journal.GetStoryHistory 100% 100%
Tsumugi.UseCases.Journal.GetUndoStatus 100% 100%
Tsumugi.UseCases.Journal.HistoryOperation 88.8%
Tsumugi.UseCases.Journal.HistorySnapshot 87.5%
Tsumugi.UseCases.Journal.OperationGrouping 100% 100%
Tsumugi.UseCases.Journal.RedoRevert 100% 100%
Tsumugi.UseCases.Journal.RedoRun 90.9% 87.5%
Tsumugi.UseCases.Journal.RedoTyping 100% 100%
Tsumugi.UseCases.Journal.ReplayLanding 100% 100%
Tsumugi.UseCases.Journal.RevertConflict 100%
Tsumugi.UseCases.Journal.RevertOutcome 100%
Tsumugi.UseCases.Journal.RevertRun 96.5% 77.7%
Tsumugi.UseCases.Journal.RevertToSnapshot 92.3% 83.3%
Tsumugi.UseCases.Journal.StoryHistory 100%
Tsumugi.UseCases.Journal.TakeSnapshot 100% 87.5%
Tsumugi.UseCases.Journal.UndoStatus 100%
Tsumugi.UseCases.Journal.UndoTyping 100% 100%
Tsumugi.UseCases.Journal.UserOperation 100%
Tsumugi.UseCases.Notifications.DomainChanged 100%
Tsumugi.UseCases.Ordering 100% 100%
Tsumugi.UseCases.Runs.CancelRun 100% 100%
Tsumugi.UseCases.Runs.ClearRunHistory 100% 100%
Tsumugi.UseCases.Runs.DismissRun 100% 100%
Tsumugi.UseCases.Runs.EngineLiveRuns 100% 100%
Tsumugi.UseCases.Runs.GetRunStrip 100% 100%
Tsumugi.UseCases.Runs.GetStoryRunState 100% 100%
Tsumugi.UseCases.Runs.ListStoryRuns 100% 100%
Tsumugi.UseCases.Runs.LiveTail 100%
Tsumugi.UseCases.Runs.LlmConcurrencyLimit 100%
Tsumugi.UseCases.Runs.RetryRun 100% 100%
Tsumugi.UseCases.Runs.RunHistoryEntry 100%
Tsumugi.UseCases.Runs.RunRefusals 100% 100%
Tsumugi.UseCases.Runs.RunSnapshotGate 100%
Tsumugi.UseCases.Runs.RunStripStep 100%
Tsumugi.UseCases.Runs.RunStripView 100%
Tsumugi.UseCases.Runs.RunWrites 100%
Tsumugi.UseCases.Runs.StartRun 100% 100%
Tsumugi.UseCases.Runs.StoredTrigger 100%
Tsumugi.UseCases.Runs.StoryLiveRun 100%
Tsumugi.UseCases.Runs.StoryRunItem 100%
Tsumugi.UseCases.Runs.StoryRunState 100%
Tsumugi.UseCases.Runs.StoryRunsView 100%
Tsumugi.UseCases.Runs.TakeRunSnapshot 100% 100%
Tsumugi.UseCases.Segments.ChangedText 100%
Tsumugi.UseCases.Segments.ChapterDraft 100%
Tsumugi.UseCases.Segments.ChapterWriting 100%
Tsumugi.UseCases.Segments.DeleteSegments 100% 100%
Tsumugi.UseCases.Segments.EditSegment 100% 100%
Tsumugi.UseCases.Segments.InsertSegment 100% 100%
Tsumugi.UseCases.Segments.ManuscriptAnswer 100%
Tsumugi.UseCases.Segments.ManuscriptWrites 99.1% 97.6%
Tsumugi.UseCases.Segments.MergeSegments 100%
Tsumugi.UseCases.Segments.MergeWrite 100%
Tsumugi.UseCases.Segments.ModelOutput 98.2% 96.6%
Tsumugi.UseCases.Segments.ModelParagraph 100%
Tsumugi.UseCases.Segments.MoveSegments 100% 100%
Tsumugi.UseCases.Segments.NewBlock 100%
Tsumugi.UseCases.Segments.ReadSelection 100%
Tsumugi.UseCases.Segments.ReorderSegments 100% 100%
Tsumugi.UseCases.Segments.ReshapeSegments 100% 100%
Tsumugi.UseCases.Segments.ReshapeWrite 100%
Tsumugi.UseCases.Segments.SegmentDto 100%
Tsumugi.UseCases.Segments.SelectedSegment 100%
Tsumugi.UseCases.Segments.SelectionEnd 100%
Tsumugi.UseCases.Segments.SelectionInput 100% 100%
Tsumugi.UseCases.Segments.SplitSegment 100%
Tsumugi.UseCases.Segments.SplitWrite 100%
Tsumugi.UseCases.Segments.StampedId 100%
Tsumugi.UseCases.Segments.TextWrite 100%
Tsumugi.UseCases.Settings.CatalogModel 100% 100%
Tsumugi.UseCases.Settings.CheckOpenRouterKey 100%
Tsumugi.UseCases.Settings.ColourPair 100% 100%
Tsumugi.UseCases.Settings.EditorAppearance 100%
Tsumugi.UseCases.Settings.EditorAppearanceJson 100% 100%
Tsumugi.UseCases.Settings.EditorAppearanceLimits 100% 100%
Tsumugi.UseCases.Settings.EditorSuggestions 100%
Tsumugi.UseCases.Settings.EditorSuggestionsJson 100% 100%
Tsumugi.UseCases.Settings.EditorTyping 100%
Tsumugi.UseCases.Settings.EditorTypingJson 100% 100%
Tsumugi.UseCases.Settings.GetEditorAppearance 100%
Tsumugi.UseCases.Settings.GetEditorSuggestions 100%
Tsumugi.UseCases.Settings.GetEditorTyping 100%
Tsumugi.UseCases.Settings.GetLlmDefaults 100% 100%
Tsumugi.UseCases.Settings.GetModelCatalog 100% 100%
Tsumugi.UseCases.Settings.GetProviderSettings 100%
Tsumugi.UseCases.Settings.LlmDefaults 100%
Tsumugi.UseCases.Settings.ProviderKeyInfo 100%
Tsumugi.UseCases.Settings.ProviderKeyState 100%
Tsumugi.UseCases.Settings.ProviderSettingsView 100% 100%
Tsumugi.UseCases.Settings.ReasoningEfforts 100% 100%
Tsumugi.UseCases.Settings.RemoveOpenRouterKey 100%
Tsumugi.UseCases.Settings.RoutingDefaults 100%
Tsumugi.UseCases.Settings.RoutingSettings 100% 100%
Tsumugi.UseCases.Settings.SaveEditorAppearance 100% 100%
Tsumugi.UseCases.Settings.SaveEditorSuggestions 100% 100%
Tsumugi.UseCases.Settings.SaveEditorTyping 100% 100%
Tsumugi.UseCases.Settings.SaveLlmDefaults 100% 100%
Tsumugi.UseCases.Settings.SaveOpenRouterKey 100% 100%
Tsumugi.UseCases.Settings.SettingKeys 100%
Tsumugi.UseCases.Settings.SuggestionModel 100%
Tsumugi.UseCases.Stories.ChapterWriteOutcome 50%
Tsumugi.UseCases.Stories.CreateStory 100% 100%
Tsumugi.UseCases.Stories.GetStory 100% 100%
Tsumugi.UseCases.Stories.ListStories 100% 87.5%
Tsumugi.UseCases.Stories.PurgeStory 100% 100%
Tsumugi.UseCases.Stories.RestoreStory 100% 100%
Tsumugi.UseCases.Stories.SetActiveGraph 100% 100%
Tsumugi.UseCases.Stories.SetStoryArchived 100% 100%
Tsumugi.UseCases.Stories.StarterCategories 100%
Tsumugi.UseCases.Stories.StoryDetail 100%
Tsumugi.UseCases.Stories.StoryListItem 83.3%
Tsumugi.UseCases.Stories.StoryProfile 100%
Tsumugi.UseCases.Stories.TrashStory 100% 100%
Tsumugi.UseCases.Stories.UpdateStory 100% 100%
Tsumugi.UseCases.Suggestions.GetSuggestionUsage 100%
Tsumugi.UseCases.Suggestions.SuggestContinuation 100% 90%
Tsumugi.UseCases.Suggestions.SuggestionCleanup 95.7% 87%
Tsumugi.UseCases.Suggestions.SuggestionContext 100%
Tsumugi.UseCases.Suggestions.SuggestionDay 100%
Tsumugi.UseCases.Suggestions.SuggestionOutcome 100%
Tsumugi.UseCases.Suggestions.SuggestionRequest 100%
Tsumugi.UseCases.Suggestions.SuggestionStatus 100%
Tsumugi.UseCases.Suggestions.SuggestionText 100%
Tsumugi.UseCases.Suggestions.SuggestionUsage 98% 96.8%
Tsumugi.UseCases.Suggestions.SuggestionUsageView 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:** `6113ccb` · **Generated:** 2026-10-05 21:38:32 UTC · **Revision:** #2 # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/05/2026 - 21:38:31 | | Coverage date: | 10/05/2026 - 21:37:21 - 10/05/2026 - 21:38:28 | | Parser: | MultiReport (6x Cobertura) | | Assemblies: | 9 | | Classes: | 731 | | Files: | 594 | | **Line coverage:** | 97.9% (23120 of 23615) | | Covered lines: | 23120 | | Uncovered lines: | 495 | | Coverable lines: | 23615 | | Total lines: | 49000 | | **Branch coverage:** | 93.4% (8245 of 8825) | | Covered branches: | 8245 | | Total branches: | 8825 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Kagaku.Flow - 99.7%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagaku.Flow**|**99.7%**|**99.2%**| |Kagaku.Flow.Budgeting.BudgetRequest|100%|| |Kagaku.Flow.Budgeting.ConsumerBudget|100%|| |Kagaku.Flow.Execution.NodeExecution|100%|100%| |Kagaku.Flow.Execution.NodeOutcome|100%|100%| |Kagaku.Flow.Execution.TransientFailureException|100%|| |Kagaku.Flow.Execution.Upstream|100%|| |Kagaku.Flow.Extensions.ServiceCollectionExtensions|100%|| |Kagaku.Flow.FlowJson|100%|| |Kagaku.Flow.Graphs.GraphDefinition|100%|| |Kagaku.Flow.Graphs.GraphDocument|100%|100%| |Kagaku.Flow.Graphs.GraphEdge|100%|| |Kagaku.Flow.Graphs.GraphIndex|100%|100%| |Kagaku.Flow.Graphs.GraphLoadError|100%|| |Kagaku.Flow.Graphs.GraphLoadResult|100%|| |Kagaku.Flow.Graphs.GraphNode|100%|| |Kagaku.Flow.Graphs.GraphPosition|100%|| |Kagaku.Flow.Graphs.GraphReader|100%|100%| |Kagaku.Flow.Graphs.GraphSchema|100%|100%| |Kagaku.Flow.Graphs.GraphShapeException|100%|| |Kagaku.Flow.Graphs.GraphWriter|100%|100%| |Kagaku.Flow.Graphs.SocketRef|100%|| |Kagaku.Flow.Graphs.WireText|100%|100%| |Kagaku.Flow.Nodes.CanvasDescriptorWriter|100%|100%| |Kagaku.Flow.Nodes.ConfigProblem|100%|| |Kagaku.Flow.Nodes.Names|100%|| |Kagaku.Flow.Nodes.NodeDescriptor|100%|100%| |Kagaku.Flow.Nodes.NodeRegistry|100%|100%| |Kagaku.Flow.Nodes.NodeSockets|100%|100%| |Kagaku.Flow.Nodes.SinkDescriptor|100%|| |Kagaku.Flow.Nodes.SocketTypes|100%|100%| |Kagaku.Flow.Nodes.SourceDescriptor|100%|| |Kagaku.Flow.Nodes.TemplateField|100%|| |Kagaku.Flow.Runs.LedgerChange|100%|100%| |Kagaku.Flow.Runs.LedgerTransitions|100%|100%| |Kagaku.Flow.Runs.NodeAttempt|100%|| |Kagaku.Flow.Runs.NodeFacts|100%|| |Kagaku.Flow.Runs.NodeRun|100%|| |Kagaku.Flow.Runs.Run|100%|100%| |Kagaku.Flow.Runs.RunEvent|100%|| |Kagaku.Flow.Runs.RunStatuses|100%|100%| |Kagaku.Flow.Runs.RunTrigger|100%|100%| |Kagaku.Flow.Scheduling.Exclusion|100%|| |Kagaku.Flow.Scheduling.FlowEngine|100%|100%| |Kagaku.Flow.Scheduling.FlowEngineOptions|100%|100%| |Kagaku.Flow.Scheduling.ReadyRow|100%|| |Kagaku.Flow.Scheduling.ReadySet|100%|100%| |Kagaku.Flow.Scheduling.ReadySetResult|100%|| |Kagaku.Flow.Scheduling.RunRequest|100%|100%| |Kagaku.Flow.Scheduling.RunStartResult|100%|| |Kagaku.Flow.Scheduling.SocketValues|100%|100%| |Kagaku.Flow.Templating.InputsWalker|100%|100%| |Kagaku.Flow.Templating.ParsedTemplate|100%|100%| |Kagaku.Flow.Templating.SandboxedTemplateContext|100%|100%| |Kagaku.Flow.Templating.TemplateError|100%|| |Kagaku.Flow.Templating.TemplateHost|100%|100%| |Kagaku.Flow.Templating.TemplateLimits|100%|| |Kagaku.Flow.Templating.TemplateModel|100%|100%| |Kagaku.Flow.Templating.TemplateProblem|100%|| |Kagaku.Flow.Templating.TemplateRenderRequest|100%|100%| |Kagaku.Flow.Templating.TemplateRenderResult|100%|| |Kagaku.Flow.Templating.TemplateRun|100%|| |Kagaku.Flow.Templating.TemplateSinks|100%|| |Kagaku.Flow.Templating.TemplateValues|100%|100%| |Kagaku.Flow.Validation.GraphValidation|100%|100%| |Kagaku.Flow.Validation.GraphValidationContext|100%|| |Kagaku.Flow.Validation.HookFailure|100%|| |Kagaku.Flow.Validation.ResolvedGraph|100%|100%| |Kagaku.Flow.Validation.ValidationError|100%|| |Kagaku.Flow.Validation.ValidationReport|100%|| |System.Text.RegularExpressions.Generated|97.4%|92.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF<br/>E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__ColorToken_2|97.4%|94.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF<br/>E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__Socket_1|97.2%|94.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6329A328226B0CF<br/>E95E47D27E8B105AC5589487C0997B6B65384AEDBF572144E__TypeId_0|97.2%|94.4%| </details> <details><summary>Kagaku.Flow.OpenRouter - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagaku.Flow.OpenRouter**|**100%**|**100%**| |Kagaku.Flow.OpenRouter.Catalog.ModelCapabilities|100%|100%| |Kagaku.Flow.OpenRouter.Gateway.LlmCompletion|100%|| |Kagaku.Flow.OpenRouter.Gateway.OpenRouterGateway|100%|100%| |Kagaku.Flow.OpenRouter.Gateway.OpenRouterGatewayOptions|100%|| |Kagaku.Flow.OpenRouter.Gateway.OpenRouterKeyLookup|100%|100%| |Kagaku.Flow.OpenRouter.Gateway.SentRequestCapture|100%|100%| |Kagaku.Flow.OpenRouter.Gateway.SentRequestCaptureHandler|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmAnswer|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmConfig|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmConfigRead|100%|| |Kagaku.Flow.OpenRouter.Llm.LlmDescriptor|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmExecutor|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmFacts|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmFailureText|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmMessage|100%|| |Kagaku.Flow.OpenRouter.Llm.LlmRequestBuilder|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmRequestPlan|100%|| |Kagaku.Flow.OpenRouter.Llm.LlmRoutingDefaults|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmSampling|100%|| |Kagaku.Flow.OpenRouter.Llm.LlmSchemaCheck|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmStrictSchemaRule|100%|100%| |Kagaku.Flow.OpenRouter.Llm.LlmVocabulary|100%|100%| |Kagaku.Flow.OpenRouter.LlmNodeServiceCollectionExtensions|100%|| |Kagaku.Flow.OpenRouter.OpenRouterServiceCollectionExtensions|100%|100%| </details> <details><summary>Kagaku.Flow.Testing - 100%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagaku.Flow.Testing**|**100%**|**100%**| |Kagaku.Flow.Testing.FlowEngineDriver|100%|100%| |Kagaku.Flow.Testing.InMemoryRunLedger|100%|100%| |Kagaku.Flow.Testing.RecordingRunEventSink|100%|| |Kagaku.Flow.Testing.RunLedgerContract|100%|100%| |Kagaku.Flow.Testing.RunLedgerContractException|100%|| </details> <details><summary>Tsumugi.BlazorAdapter - 97.2%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.BlazorAdapter**|**97.2%**|**93.8%**| |Tsumugi.BlazorAdapter.BlazorAdapterAssembly|100%|| |Tsumugi.BlazorAdapter.Documents.CategoryCreated|100%|| |Tsumugi.BlazorAdapter.Documents.CategoryEditor|93.2%|88.4%| |Tsumugi.BlazorAdapter.Documents.CategorySaved|100%|| |Tsumugi.BlazorAdapter.Documents.ChangeCategoryFieldsRequested|100%|| |Tsumugi.BlazorAdapter.Documents.ContextPreviewEffects|100%|100%| |Tsumugi.BlazorAdapter.Documents.ContextPreviewFailed|100%|| |Tsumugi.BlazorAdapter.Documents.ContextPreviewLoaded|100%|| |Tsumugi.BlazorAdapter.Documents.ContextPreviewPane|100%|100%| |Tsumugi.BlazorAdapter.Documents.ContextPreviewReducers|100%|100%| |Tsumugi.BlazorAdapter.Documents.ContextPreviewState|100%|| |Tsumugi.BlazorAdapter.Documents.CreateCategoryRequested|100%|| |Tsumugi.BlazorAdapter.Documents.CreateDocumentRequested|100%|| |Tsumugi.BlazorAdapter.Documents.DeleteCategoryChoice|100%|| |Tsumugi.BlazorAdapter.Documents.DeleteCategoryDialog|100%|94.1%| |Tsumugi.BlazorAdapter.Documents.DeleteCategoryRequested|100%|| |Tsumugi.BlazorAdapter.Documents.DeleteDocumentRequested|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentAutoSaveFailed|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentCreated|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentEditor|95.7%|89.4%| |Tsumugi.BlazorAdapter.Documents.DocumentImageRefused|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentImageSet|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsActionFailed|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentSaved|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsEffects|100%|100%| |Tsumugi.BlazorAdapter.Documents.DocumentsList|98.5%|95.1%| |Tsumugi.BlazorAdapter.Documents.DocumentsLoaded|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsPage|100%|100%| |Tsumugi.BlazorAdapter.Documents.DocumentsReadFailed|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsReducers|100%|100%| |Tsumugi.BlazorAdapter.Documents.DocumentsRefusal|100%|| |Tsumugi.BlazorAdapter.Documents.DocumentsState|100%|100%| |Tsumugi.BlazorAdapter.Documents.FieldInput|100%|96.6%| |Tsumugi.BlazorAdapter.Documents.FieldsChanges|100%|100%| |Tsumugi.BlazorAdapter.Documents.FieldShapes|90%|87.5%| |Tsumugi.BlazorAdapter.Documents.ImageUpload|100%|| |Tsumugi.BlazorAdapter.Documents.ImageUploadRefusal|100%|| |Tsumugi.BlazorAdapter.Documents.ImpactText|100%|94.2%| |Tsumugi.BlazorAdapter.Documents.LoadContextPreview|100%|| |Tsumugi.BlazorAdapter.Documents.LoadDocuments|100%|| |Tsumugi.BlazorAdapter.Documents.MoveDocumentChoice|100%|| |Tsumugi.BlazorAdapter.Documents.MoveDocumentDialog|95.6%|71.4%| |Tsumugi.BlazorAdapter.Documents.MoveDocumentsRequested|100%|| |Tsumugi.BlazorAdapter.Documents.ReorderCategoriesRequested|100%|| |Tsumugi.BlazorAdapter.Documents.SetCategoryCollapsed|100%|| |Tsumugi.BlazorAdapter.Documents.SetDocumentImageRequested|100%|| |Tsumugi.BlazorAdapter.Documents.SetDocumentsFilter|100%|| |Tsumugi.BlazorAdapter.Documents.UpdateCategoryRequested|100%|| |Tsumugi.BlazorAdapter.Documents.UpdateDocumentRequested|100%|| |Tsumugi.BlazorAdapter.EffectCalls|100%|| |Tsumugi.BlazorAdapter.Graphs.DuplicateGraphRequested|100%|| |Tsumugi.BlazorAdapter.Graphs.GraphActionFailed|100%|| |Tsumugi.BlazorAdapter.Graphs.GraphCanvas|58.3%|40%| |Tsumugi.BlazorAdapter.Graphs.GraphPlaygroundPage|100%|100%| |Tsumugi.BlazorAdapter.Graphs.GraphsEffects|100%|100%| |Tsumugi.BlazorAdapter.Graphs.GraphsLoaded|100%|| |Tsumugi.BlazorAdapter.Graphs.GraphsPage|100%|100%| |Tsumugi.BlazorAdapter.Graphs.GraphsReducers|100%|| |Tsumugi.BlazorAdapter.Graphs.GraphsState|100%|| |Tsumugi.BlazorAdapter.Graphs.ImportGraphRequested|100%|| |Tsumugi.BlazorAdapter.Graphs.RestoreGraphRequested|100%|| |Tsumugi.BlazorAdapter.Graphs.ReviseGraphRequested|100%|| |Tsumugi.BlazorAdapter.Graphs.SetShowGraphTrash|100%|| |Tsumugi.BlazorAdapter.Graphs.TrashGraphRequested|100%|| |Tsumugi.BlazorAdapter.Help.EditorKeyEntry|100%|| |Tsumugi.BlazorAdapter.Help.EditorKeySection|100%|| |Tsumugi.BlazorAdapter.Help.EditorReference|100%|100%| |Tsumugi.BlazorAdapter.Help.HelpPage|100%|100%| |Tsumugi.BlazorAdapter.Help.PunctuationRow|100%|| |Tsumugi.BlazorAdapter.Notifications.DomainChangedBridge|94.4%|83.3%| |Tsumugi.BlazorAdapter.Notifications.DomainChangesReceived|75%|100%| |Tsumugi.BlazorAdapter.Runs.CancelRunQuestion|100%|100%| |Tsumugi.BlazorAdapter.Runs.CancelRunRequested|100%|| |Tsumugi.BlazorAdapter.Runs.ClearRunHistoryRequested|100%|| |Tsumugi.BlazorAdapter.Runs.LiveRunEffects|100%|100%| |Tsumugi.BlazorAdapter.Runs.LiveRunLoaded|100%|| |Tsumugi.BlazorAdapter.Runs.LiveRunReadFailed|100%|| |Tsumugi.BlazorAdapter.Runs.LiveRunReducers|100%|100%| |Tsumugi.BlazorAdapter.Runs.LiveRunState|100%|| |Tsumugi.BlazorAdapter.Runs.LoadLiveRun|100%|| |Tsumugi.BlazorAdapter.Runs.LoadRunHistory|100%|| |Tsumugi.BlazorAdapter.Runs.LoadRunStrip|100%|| |Tsumugi.BlazorAdapter.Runs.RunChangedBridge|98.1%|95%| |Tsumugi.BlazorAdapter.Runs.RunChangesReceived|100%|| |Tsumugi.BlazorAdapter.Runs.RunControl|100%|100%| |Tsumugi.BlazorAdapter.Runs.RunHistoryClearFailed|100%|| |Tsumugi.BlazorAdapter.Runs.RunHistoryLoaded|100%|| |Tsumugi.BlazorAdapter.Runs.RunHistoryPanel|100%|97.8%| |Tsumugi.BlazorAdapter.Runs.RunHistoryReadFailed|100%|| |Tsumugi.BlazorAdapter.Runs.RunPreview|100%|100%| |Tsumugi.BlazorAdapter.Runs.RunPreviewReducers|100%|100%| |Tsumugi.BlazorAdapter.Runs.RunPreviewState|100%|| |Tsumugi.BlazorAdapter.Runs.RunPreviewText|100%|| |Tsumugi.BlazorAdapter.Runs.RunRequestRefused|100%|| |Tsumugi.BlazorAdapter.Runs.RunsEffects|100%|100%| |Tsumugi.BlazorAdapter.Runs.RunsPage|100%|| |Tsumugi.BlazorAdapter.Runs.RunsReducers|100%|100%| |Tsumugi.BlazorAdapter.Runs.RunsState|100%|| |Tsumugi.BlazorAdapter.Runs.RunStrip|100%|100%| |Tsumugi.BlazorAdapter.Runs.RunStripEffects|100%|100%| |Tsumugi.BlazorAdapter.Runs.RunStripLoaded|100%|| |Tsumugi.BlazorAdapter.Runs.RunStripReadFailed|100%|| |Tsumugi.BlazorAdapter.Runs.RunStripReducers|100%|100%| |Tsumugi.BlazorAdapter.Runs.RunStripState|100%|| |Tsumugi.BlazorAdapter.Runs.RunTextKey|100%|| |Tsumugi.BlazorAdapter.Runs.RunTextReceived|100%|| |Tsumugi.BlazorAdapter.Runs.RunTimes|100%|100%| |Tsumugi.BlazorAdapter.Runs.StartRunRequested|100%|| |Tsumugi.BlazorAdapter.Runs.StripCancelRequested|100%|| |Tsumugi.BlazorAdapter.Runs.StripDismissRequested|100%|| |Tsumugi.BlazorAdapter.Runs.StripRequestRefused|100%|| |Tsumugi.BlazorAdapter.Settings.BackupFailed|100%|| |Tsumugi.BlazorAdapter.Settings.BackupNowRequested|100%|| |Tsumugi.BlazorAdapter.Settings.BackupSettingsLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.BackupsSection|100%|100%| |Tsumugi.BlazorAdapter.Settings.BackupsSettingsEffects|100%|| |Tsumugi.BlazorAdapter.Settings.BackupsSettingsReducers|100%|| |Tsumugi.BlazorAdapter.Settings.BackupsSettingsState|100%|| |Tsumugi.BlazorAdapter.Settings.DefaultsSection|100%|100%| |Tsumugi.BlazorAdapter.Settings.DefaultsSettingsEffects|100%|| |Tsumugi.BlazorAdapter.Settings.DefaultsSettingsReducers|100%|| |Tsumugi.BlazorAdapter.Settings.DefaultsSettingsState|100%|| |Tsumugi.BlazorAdapter.Settings.EditorAppearanceCss|100%|100%| |Tsumugi.BlazorAdapter.Settings.EditorAppearanceEffects|100%|| |Tsumugi.BlazorAdapter.Settings.EditorAppearanceLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.EditorAppearancePreview|100%|100%| |Tsumugi.BlazorAdapter.Settings.EditorAppearanceReducers|100%|100%| |Tsumugi.BlazorAdapter.Settings.EditorAppearanceSaved|100%|| |Tsumugi.BlazorAdapter.Settings.EditorAppearanceSaveFailed|100%|| |Tsumugi.BlazorAdapter.Settings.EditorAppearanceSection|95%|98%| |Tsumugi.BlazorAdapter.Settings.EditorAppearanceState|100%|| |Tsumugi.BlazorAdapter.Settings.EditorPreviewBlock|100%|| |Tsumugi.BlazorAdapter.Settings.EditorPreviewSample|100%|| |Tsumugi.BlazorAdapter.Settings.EditorSuggestionsEffects|91.6%|| |Tsumugi.BlazorAdapter.Settings.EditorSuggestionsLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.EditorSuggestionsReducers|100%|100%| |Tsumugi.BlazorAdapter.Settings.EditorSuggestionsSaved|100%|| |Tsumugi.BlazorAdapter.Settings.EditorSuggestionsSaveFailed|100%|| |Tsumugi.BlazorAdapter.Settings.EditorSuggestionsSection|100%|95%| |Tsumugi.BlazorAdapter.Settings.EditorSuggestionsState|100%|| |Tsumugi.BlazorAdapter.Settings.EditorTypingEffects|91.6%|| |Tsumugi.BlazorAdapter.Settings.EditorTypingLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.EditorTypingReducers|100%|100%| |Tsumugi.BlazorAdapter.Settings.EditorTypingSaved|100%|| |Tsumugi.BlazorAdapter.Settings.EditorTypingSaveFailed|100%|| |Tsumugi.BlazorAdapter.Settings.EditorTypingSection|100%|100%| |Tsumugi.BlazorAdapter.Settings.EditorTypingState|100%|| |Tsumugi.BlazorAdapter.Settings.LlmDefaultsLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.LlmDefaultsSaved|100%|| |Tsumugi.BlazorAdapter.Settings.LlmDefaultsSaveFailed|100%|| |Tsumugi.BlazorAdapter.Settings.LoadBackupSettings|100%|| |Tsumugi.BlazorAdapter.Settings.LoadProviderSettings|100%|| |Tsumugi.BlazorAdapter.Settings.ModelCatalogLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.ModelCatalogLoadFailed|100%|| |Tsumugi.BlazorAdapter.Settings.ModelPicker|100%|100%| |Tsumugi.BlazorAdapter.Settings.OpenRouterKeySaved|100%|| |Tsumugi.BlazorAdapter.Settings.OpenRouterKeySaveFailed|100%|| |Tsumugi.BlazorAdapter.Settings.ProviderKeyChecked|100%|| |Tsumugi.BlazorAdapter.Settings.ProviderSection|100%|100%| |Tsumugi.BlazorAdapter.Settings.ProviderSettingsEffects|100%|100%| |Tsumugi.BlazorAdapter.Settings.ProviderSettingsLoaded|100%|| |Tsumugi.BlazorAdapter.Settings.ProviderSettingsReducers|100%|100%| |Tsumugi.BlazorAdapter.Settings.ProviderSettingsState|100%|100%| |Tsumugi.BlazorAdapter.Settings.SaveEditorAppearanceRequested|100%|| |Tsumugi.BlazorAdapter.Settings.SaveEditorSuggestionsRequested|100%|| |Tsumugi.BlazorAdapter.Settings.SaveEditorTypingRequested|100%|| |Tsumugi.BlazorAdapter.Settings.SaveLlmDefaultsRequested|100%|| |Tsumugi.BlazorAdapter.Settings.SaveOpenRouterKeyRequested|100%|| |Tsumugi.BlazorAdapter.Settings.SuggestionUsageEffects|100%|| |Tsumugi.BlazorAdapter.Settings.SuggestionUsageLoaded|100%|| |Tsumugi.BlazorAdapter.Stories.CreateStoryRequested|100%|| |Tsumugi.BlazorAdapter.Stories.PurgeStoryRequested|100%|| |Tsumugi.BlazorAdapter.Stories.RestoreStoryRequested|100%|| |Tsumugi.BlazorAdapter.Stories.SetShowArchived|100%|| |Tsumugi.BlazorAdapter.Stories.SetStoriesFilter|100%|| |Tsumugi.BlazorAdapter.Stories.SetStoryArchivedRequested|100%|| |Tsumugi.BlazorAdapter.Stories.StoriesEffects|100%|100%| |Tsumugi.BlazorAdapter.Stories.StoriesLoaded|100%|| |Tsumugi.BlazorAdapter.Stories.StoriesPage|100%|100%| |Tsumugi.BlazorAdapter.Stories.StoriesReducers|100%|100%| |Tsumugi.BlazorAdapter.Stories.StoriesState|100%|100%| |Tsumugi.BlazorAdapter.Stories.StoryActionFailed|100%|| |Tsumugi.BlazorAdapter.Stories.StoryCreated|100%|| |Tsumugi.BlazorAdapter.Stories.StoryCreateFailed|100%|| |Tsumugi.BlazorAdapter.Stories.StoryTrashPage|100%|100%| |Tsumugi.BlazorAdapter.Stories.TrashStoryRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.AckWire|100%|| |Tsumugi.BlazorAdapter.Workspace.AutoSaveFailed|100%|| |Tsumugi.BlazorAdapter.Workspace.ChangedWire|100%|| |Tsumugi.BlazorAdapter.Workspace.ChapterHeader|100%|86.3%| |Tsumugi.BlazorAdapter.Workspace.ChapterMenu|100%|81.2%| |Tsumugi.BlazorAdapter.Workspace.ChapterPage|100%|93.3%| |Tsumugi.BlazorAdapter.Workspace.ChapterSaved|100%|| |Tsumugi.BlazorAdapter.Workspace.ChaptersPage|94.4%|83.3%| |Tsumugi.BlazorAdapter.Workspace.ChapterWire|100%|| |Tsumugi.BlazorAdapter.Workspace.ChapterWritten|100%|| |Tsumugi.BlazorAdapter.Workspace.CreateChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.CreatedWire|100%|| |Tsumugi.BlazorAdapter.Workspace.DeleteChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.DeltaWire|100%|| |Tsumugi.BlazorAdapter.Workspace.HistoryEffects|100%|100%| |Tsumugi.BlazorAdapter.Workspace.HistoryLoaded|100%|| |Tsumugi.BlazorAdapter.Workspace.HistoryPage|100%|| |Tsumugi.BlazorAdapter.Workspace.HistoryPanel|100%|100%| |Tsumugi.BlazorAdapter.Workspace.HistoryReadFailed|100%|| |Tsumugi.BlazorAdapter.Workspace.LoadHistory|100%|| |Tsumugi.BlazorAdapter.Workspace.LoadWorkspace|100%|| |Tsumugi.BlazorAdapter.Workspace.ManuscriptEffects|100%|100%| |Tsumugi.BlazorAdapter.Workspace.ManuscriptEvents|82.2%|75.7%| |Tsumugi.BlazorAdapter.Workspace.ManuscriptSurface|88.3%|86.8%| |Tsumugi.BlazorAdapter.Workspace.MergeChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.MergeEvent|100%|| |Tsumugi.BlazorAdapter.Workspace.MoveChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.RedoRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.RedoRevertRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.RenameChapterRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.ReshapeEvent|100%|| |Tsumugi.BlazorAdapter.Workspace.RevertToSnapshotRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SaveScope|100%|50%| |Tsumugi.BlazorAdapter.Workspace.SaveStateLadder|100%|100%| |Tsumugi.BlazorAdapter.Workspace.SaveVersionRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SegmentTextEvent|100%|| |Tsumugi.BlazorAdapter.Workspace.SegmentWire|100%|81.8%| |Tsumugi.BlazorAdapter.Workspace.SelectionEndWire|100%|| |Tsumugi.BlazorAdapter.Workspace.SelectionGraph|100%|| |Tsumugi.BlazorAdapter.Workspace.SelectionRangeWire|100%|| |Tsumugi.BlazorAdapter.Workspace.SelectionRunRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SetActiveGraphRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SetChapterSummaryRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.SplitEvent|100%|| |Tsumugi.BlazorAdapter.Workspace.StampWire|0%|| |Tsumugi.BlazorAdapter.Workspace.StoryDetails|100%|85.2%| |Tsumugi.BlazorAdapter.Workspace.StoryGeneralPage|100%|100%| |Tsumugi.BlazorAdapter.Workspace.StoryGraphsEffects|100%|100%| |Tsumugi.BlazorAdapter.Workspace.StoryGraphsLoaded|100%|| |Tsumugi.BlazorAdapter.Workspace.StoryGraphsReducers|100%|| |Tsumugi.BlazorAdapter.Workspace.StoryGraphsState|100%|| |Tsumugi.BlazorAdapter.Workspace.StorySaved|100%|| |Tsumugi.BlazorAdapter.Workspace.StoryShell|100%|100%| |Tsumugi.BlazorAdapter.Workspace.UndoRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.UndoStatusChanged|100%|| |Tsumugi.BlazorAdapter.Workspace.UpdateStoryRequested|100%|| |Tsumugi.BlazorAdapter.Workspace.WorkspaceActionFailed|100%|| |Tsumugi.BlazorAdapter.Workspace.WorkspaceLoaded|100%|| |Tsumugi.BlazorAdapter.Workspace.WorkspaceNotFound|100%|| |Tsumugi.BlazorAdapter.Workspace.WorkspaceReducers|100%|100%| |Tsumugi.BlazorAdapter.Workspace.WorkspaceState|100%|| </details> <details><summary>Tsumugi.Domain - 96.5%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.Domain**|**96.5%**|**95.2%**| |System.Text.RegularExpressions.Generated|91.3%|88.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__DigitsAndSeparators_2|97.4%|95.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__LineBreak_0|91%|91.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__NumberToken_1|91.8%|83.3%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__Plain_4|91.9%|88.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F5BB471BFAD87E25<br/>BE2A118445F5EE9A5FB1F861C394AC933A547F31011ADF02F__ThousandsGroup_3|90.9%|84.3%| |Tsumugi.Domain.Documents.CategoryFields|94.5%|93.7%| |Tsumugi.Domain.Documents.ChoiceOption|100%|| |Tsumugi.Domain.Documents.ChoiceValue|100%|| |Tsumugi.Domain.Documents.DateText|100%|| |Tsumugi.Domain.Documents.DateValue|100%|| |Tsumugi.Domain.Documents.Document|100%|100%| |Tsumugi.Domain.Documents.DocumentCategory|100%|100%| |Tsumugi.Domain.Documents.DocumentValues|100%|| |Tsumugi.Domain.Documents.FieldCarry|100%|100%| |Tsumugi.Domain.Documents.FieldConversion|100%|100%| |Tsumugi.Domain.Documents.FieldDefinition|97%|95.3%| |Tsumugi.Domain.Documents.FieldMessages|100%|100%| |Tsumugi.Domain.Documents.FieldNames|100%|| |Tsumugi.Domain.Documents.FieldsChange|100%|| |Tsumugi.Domain.Documents.FieldShape|95.2%|87.5%| |Tsumugi.Domain.Documents.FieldsPlan|100%|| |Tsumugi.Domain.Documents.FieldsPlanner|99.2%|99.2%| |Tsumugi.Domain.Documents.FieldValue|100%|| |Tsumugi.Domain.Documents.FieldValues|95.4%|97.7%| |Tsumugi.Domain.Documents.ImageFiles|100%|100%| |Tsumugi.Domain.Documents.ImageValue|100%|| |Tsumugi.Domain.Documents.MovePlan|100%|| |Tsumugi.Domain.Documents.NumberParse|100%|| |Tsumugi.Domain.Documents.NumberText|100%|97.6%| |Tsumugi.Domain.Documents.NumberValue|100%|| |Tsumugi.Domain.Documents.StoryImage|100%|| |Tsumugi.Domain.Documents.TextValue|100%|100%| |Tsumugi.Domain.Documents.ValueChange|100%|| |Tsumugi.Domain.Documents.ValueChangeKey|100%|| |Tsumugi.Domain.Documents.ValueImpact|100%|100%| |Tsumugi.Domain.Graphs.Graph|100%|100%| |Tsumugi.Domain.Graphs.GraphTriggers|100%|100%| |Tsumugi.Domain.Journal.ChangeLogEntry|97.9%|83.3%| |Tsumugi.Domain.Journal.StorySnapshot|96.7%|83.3%| |Tsumugi.Domain.Settings.AppSetting|100%|| |Tsumugi.Domain.Stories.Chapter|100%|100%| |Tsumugi.Domain.Stories.InlineMarkup|100%|100%| |Tsumugi.Domain.Stories.MarkupRun|100%|| |Tsumugi.Domain.Stories.Provenance|100%|100%| |Tsumugi.Domain.Stories.Segment|100%|100%| |Tsumugi.Domain.Stories.Story|100%|100%| |Tsumugi.Domain.Text|100%|100%| </details> <details><summary>Tsumugi.Infrastructure - 98.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.Infrastructure**|**98.8%**|**87.7%**| |System.Text.RegularExpressions.Generated|81.4%|64.8%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F0D076C66E8EEC1C<br/>A55E0373ED22DC58420DBB40F103A46B68DC4D9CE5A49E00B__Pattern_0|84%|65.7%| |Tsumugi.Infrastructure.Backups.BackupArtifactName|100%|100%| |Tsumugi.Infrastructure.Backups.BackupOptions|100%|| |Tsumugi.Infrastructure.Backups.BackupSchedule|100%|83.3%| |Tsumugi.Infrastructure.Backups.BackupScheduler|96.6%|87.5%| |Tsumugi.Infrastructure.Backups.BackupWriter|98.5%|92.8%| |Tsumugi.Infrastructure.Backups.DatabaseFingerprint|91.9%|97%| |Tsumugi.Infrastructure.Backups.FileSystemBackupStore|100%|100%| |Tsumugi.Infrastructure.Backups.OwnerOnlyFile|100%|100%| |Tsumugi.Infrastructure.Backups.PreMigrationBackup|90%|100%| |Tsumugi.Infrastructure.Backups.SqliteSnapshot|88.2%|75%| |Tsumugi.Infrastructure.DependencyInjection|100%|100%| |Tsumugi.Infrastructure.Journal.EfChangeJournal|100%|| |Tsumugi.Infrastructure.Journal.EfSnapshotStore|100%|100%| |Tsumugi.Infrastructure.Journal.EfUndoStore|98.5%|88.2%| |Tsumugi.Infrastructure.Journal.ModelExtensions|100%|| |Tsumugi.Infrastructure.Journal.OperationContext|100%|100%| |Tsumugi.Infrastructure.Journal.PropertyBag|100%|95.4%| |Tsumugi.Infrastructure.Notifications.InProcessDomainChangedBus|100%|100%| |Tsumugi.Infrastructure.Persistence.Configurations.AppSettingConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.ChangeLogEntryConfigurati<br/>on|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.ChapterConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.DocumentCategoryConfigura<br/>tion|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.DocumentConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.GraphConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.NodeRunRecordConfiguratio<br/>n|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.RunRecordConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.SegmentConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.StoryConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.StoryImageConfiguration|100%|| |Tsumugi.Infrastructure.Persistence.Configurations.StorySnapshotConfiguratio<br/>n|100%|| |Tsumugi.Infrastructure.Persistence.Converters.CanonicalJsonComparer|100%|| |Tsumugi.Infrastructure.Persistence.Converters.CategoryFieldsConverter|97.6%|94.4%| |Tsumugi.Infrastructure.Persistence.Converters.FieldValuesConverter|96.9%|93.7%| |Tsumugi.Infrastructure.Persistence.Converters.GraphTriggerConverter|100%|100%| |Tsumugi.Infrastructure.Persistence.Converters.ProvenanceConverter|100%|90%| |Tsumugi.Infrastructure.Persistence.Converters.UtcTicksConverter|100%|| |Tsumugi.Infrastructure.Persistence.Converters.WireFormat|85.7%|73.8%| |Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphForeignKey|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphOnContinue|100%|100%| |Tsumugi.Infrastructure.Persistence.Migrations.ActiveGraphOnContinueSql|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.AddAppSettings|99.2%|| |Tsumugi.Infrastructure.Persistence.Migrations.AddJournal|98.8%|| |Tsumugi.Infrastructure.Persistence.Migrations.CategoryFields|100%|100%| |Tsumugi.Infrastructure.Persistence.Migrations.CategoryFieldsSql|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.DropDocumentBody|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.GenericDocuments|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.GraphLibrary|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.InitialStoryDomain|97.3%|| |Tsumugi.Infrastructure.Persistence.Migrations.JournalUndoState|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.RunLedger|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.RunSnapshotFinish|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.SegmentTextMarkup|100%|100%| |Tsumugi.Infrastructure.Persistence.Migrations.SegmentTextMarkupSql|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.StoryImages|100%|| |Tsumugi.Infrastructure.Persistence.Migrations.TsumugiDbContextModelSnapshot|100%|| |Tsumugi.Infrastructure.Persistence.SqliteFunctions|80%|66.6%| |Tsumugi.Infrastructure.Persistence.SqlitePragmaInterceptor|100%|100%| |Tsumugi.Infrastructure.Persistence.Stores.EfChapterStore|100%|100%| |Tsumugi.Infrastructure.Persistence.Stores.EfDocumentStore|98.3%|75%| |Tsumugi.Infrastructure.Persistence.Stores.EfGraphStore|100%|100%| |Tsumugi.Infrastructure.Persistence.Stores.EfImageStore|100%|| |Tsumugi.Infrastructure.Persistence.Stores.EfSegmentStore|100%|100%| |Tsumugi.Infrastructure.Persistence.Stores.EfStoryStore|98.7%|91.6%| |Tsumugi.Infrastructure.Persistence.TsumugiDbContext|97.7%|96.6%| |Tsumugi.Infrastructure.Persistence.TsumugiDbContextFactory|100%|| |Tsumugi.Infrastructure.Provider.LlmDefaultsSource|100%|| |Tsumugi.Infrastructure.Provider.OpenRouterKeySource|100%|100%| |Tsumugi.Infrastructure.Provider.OpenRouterModelProvider|100%|100%| |Tsumugi.Infrastructure.Provider.OpenRouterOptions|100%|100%| |Tsumugi.Infrastructure.Provider.ResolvedKey|100%|| |Tsumugi.Infrastructure.Runs.EfRunHistory|100%|| |Tsumugi.Infrastructure.Runs.EfRunLedger|100%|100%| |Tsumugi.Infrastructure.Runs.InProcessRunEventBus|100%|100%| |Tsumugi.Infrastructure.Runs.LedgerMapping|100%|100%| |Tsumugi.Infrastructure.Runs.LedgerPromptSamples|100%|| |Tsumugi.Infrastructure.Runs.NodeRunRecord|100%|| |Tsumugi.Infrastructure.Runs.RunEngineHost|100%|| |Tsumugi.Infrastructure.Runs.RunRecord|100%|| |Tsumugi.Infrastructure.Runs.RunSnapshotsHost|100%|100%| |Tsumugi.Infrastructure.Settings.EfAppSettingsStore|100%|100%| |Tsumugi.Infrastructure.Suggestions.OpenRouterSuggestionModel|40%|44.4%| |Tsumugi.Infrastructure.Suggestions.SuggestionRequestBuilder|100%|94.4%| </details> <details><summary>Tsumugi.Kernel - 90.9%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.Kernel**|**90.9%**|**75%**| |Tsumugi.Kernel.Err`1|100%|| |Tsumugi.Kernel.Ok`1|100%|| |Tsumugi.Kernel.Result`1|88.8%|75%| </details> <details><summary>Tsumugi.Server - 99.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.Server**|**99.6%**|**91.5%**| |Program|99.2%|95.4%| |Tsumugi.Server.Backups.BackupConfiguration|100%|100%| |Tsumugi.Server.Components.App|100%|| |Tsumugi.Server.Components.Layout.AppHeader|100%|50%| |Tsumugi.Server.Components.Layout.MainLayout|100%|| |Tsumugi.Server.Components.Pages.Gate|100%|100%| |Tsumugi.Server.Provider.OpenRouterConfiguration|100%|100%| |Tsumugi.Server.Security.AccessGate|100%|87.5%| |Tsumugi.Server.Security.AccessSecret|100%|100%| |Tsumugi.Server.Security.GateThrottle|100%|100%| |Tsumugi.Server.VolumeStartupValidator|100%|100%| </details> <details><summary>Tsumugi.UseCases - 94.8%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Tsumugi.UseCases**|**94.8%**|**89.4%**| |System.Text.RegularExpressions.Generated|78.5%|63.1%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A<br/>663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__AttemptCount_1|84.4%|68.4%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A<br/>663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__HexColour_2|94.8%|87.5%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A<br/>663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__LineBreaks_0|95.3%|90.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A<br/>663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__Preface_3|61.9%|51.6%| |System.Text.RegularExpressions.Generated.<RegexGenerator_g>F6504F1744AA254A<br/>663A4576626E1322FB9C6CE472CAC0A2D2F3DEFF8CB40D9F7__SentenceEnd_4|88%|69.4%| |Tsumugi.UseCases.Backups.BackupArtifact|100%|| |Tsumugi.UseCases.Backups.BackupFailure|100%|| |Tsumugi.UseCases.Backups.BackupJobState|100%|| |Tsumugi.UseCases.Backups.BackupPolicy|100%|| |Tsumugi.UseCases.Backups.BackupStatusView|100%|100%| |Tsumugi.UseCases.Backups.DatabaseSnapshot|100%|| |Tsumugi.UseCases.Backups.DownloadDatabaseSnapshot|100%|| |Tsumugi.UseCases.Backups.GetBackupStatus|100%|| |Tsumugi.UseCases.Backups.IBackupStore|0%|| |Tsumugi.UseCases.Backups.RunBackupNow|100%|| |Tsumugi.UseCases.Chapters.ChapterDto|100%|| |Tsumugi.UseCases.Chapters.CreateChapter|100%|100%| |Tsumugi.UseCases.Chapters.DeleteChapter|100%|100%| |Tsumugi.UseCases.Chapters.GetChapterSegments|100%|| |Tsumugi.UseCases.Chapters.GetManuscript|100%|100%| |Tsumugi.UseCases.Chapters.ManuscriptChapter|100%|| |Tsumugi.UseCases.Chapters.ManuscriptView|100%|| |Tsumugi.UseCases.Chapters.MergeChapters|100%|100%| |Tsumugi.UseCases.Chapters.RenameChapter|100%|100%| |Tsumugi.UseCases.Chapters.ReorderChapters|100%|100%| |Tsumugi.UseCases.Chapters.SetChapterSummary|100%|75%| |Tsumugi.UseCases.Commit.AppendRunText|100%|92.8%| |Tsumugi.UseCases.Commit.CommitConfig|100%|100%| |Tsumugi.UseCases.Commit.CommitConfigRead|100%|| |Tsumugi.UseCases.Commit.CommitDescriptor|100%|| |Tsumugi.UseCases.Commit.CommitExecutor|100%|100%| |Tsumugi.UseCases.Commit.CommitReport|100%|| |Tsumugi.UseCases.Commit.CommittedSegments|100%|| |Tsumugi.UseCases.Commit.RunAppend|100%|| |Tsumugi.UseCases.Context.AssembledContext|100%|| |Tsumugi.UseCases.Context.CharsPerToken|100%|100%| |Tsumugi.UseCases.Context.ConsumerFigures|100%|| |Tsumugi.UseCases.Context.ContextAssembly|100%|100%| |Tsumugi.UseCases.Context.ContextAttempt|100%|100%| |Tsumugi.UseCases.Context.ContextBudgetTokens|100%|| |Tsumugi.UseCases.Context.ContextBuild|100%|| |Tsumugi.UseCases.Context.ContextBuilder|100%|| |Tsumugi.UseCases.Context.ContextConfig|100%|100%| |Tsumugi.UseCases.Context.ContextConfigRead|100%|| |Tsumugi.UseCases.Context.ContextConsumerRule|100%|100%| |Tsumugi.UseCases.Context.ContextDescriptor|100%|| |Tsumugi.UseCases.Context.ContextExecutor|100%|100%| |Tsumugi.UseCases.Context.ContextNodePreview|100%|| |Tsumugi.UseCases.Context.ContextParts|100%|| |Tsumugi.UseCases.Context.ContextPreview|100%|| |Tsumugi.UseCases.Context.ContextReport|100%|| |Tsumugi.UseCases.Context.DocumentRendering|100%|100%| |Tsumugi.UseCases.Context.PreviewContext|100%|100%| |Tsumugi.UseCases.Context.PromptSample|100%|100%| |Tsumugi.UseCases.Context.RecentParagraph|100%|| |Tsumugi.UseCases.Context.StoryDocumentsRule|100%|100%| |Tsumugi.UseCases.Context.StoryReads|100%|100%| |Tsumugi.UseCases.Context.StoryScope|100%|100%| |Tsumugi.UseCases.Context.StoryTemplateModel|100%|| |Tsumugi.UseCases.Context.StoryText|100%|100%| |Tsumugi.UseCases.DependencyInjection|100%|| |Tsumugi.UseCases.Diagnostics.SeedContext|100%|| |Tsumugi.UseCases.Diagnostics.SeedDevData|98.6%|68.7%| |Tsumugi.UseCases.Diagnostics.SeedPictures|100%|| |Tsumugi.UseCases.Diagnostics.SeedRuns|100%|| |Tsumugi.UseCases.Documents.ChangeCategoryFields|100%|83.3%| |Tsumugi.UseCases.Documents.CreateCategory|100%|100%| |Tsumugi.UseCases.Documents.CreateDocument|100%|100%| |Tsumugi.UseCases.Documents.DefaultFields|100%|100%| |Tsumugi.UseCases.Documents.DeleteCategory|100%|94.4%| |Tsumugi.UseCases.Documents.DeleteDocument|100%|100%| |Tsumugi.UseCases.Documents.DocumentCategoryDto|100%|| |Tsumugi.UseCases.Documents.DocumentCategoryProfile|100%|| |Tsumugi.UseCases.Documents.DocumentDto|100%|| |Tsumugi.UseCases.Documents.DocumentPatch|100%|| |Tsumugi.UseCases.Documents.DocumentProfile|100%|| |Tsumugi.UseCases.Documents.DocumentsCategory|100%|| |Tsumugi.UseCases.Documents.DocumentsView|100%|| |Tsumugi.UseCases.Documents.DocumentWrites|100%|100%| |Tsumugi.UseCases.Documents.FieldsChangeLabel|95.4%|88.2%| |Tsumugi.UseCases.Documents.GetDocuments|100%|100%| |Tsumugi.UseCases.Documents.GetStoryImage|100%|100%| |Tsumugi.UseCases.Documents.ImpactPreview|100%|100%| |Tsumugi.UseCases.Documents.LossMessages|92.3%|87.5%| |Tsumugi.UseCases.Documents.MoveDocuments|100%|100%| |Tsumugi.UseCases.Documents.ReorderCategories|100%|100%| |Tsumugi.UseCases.Documents.SetDocumentImage|100%|93.7%| |Tsumugi.UseCases.Documents.StoryImageFile|100%|| |Tsumugi.UseCases.Documents.UpdateCategory|100%|100%| |Tsumugi.UseCases.Documents.UpdateDocument|100%|81.2%| |Tsumugi.UseCases.Documents.WriteRefusedException|100%|| |Tsumugi.UseCases.Graphs.BundledGraphs|100%|| |Tsumugi.UseCases.Graphs.DuplicateGraph|100%|100%| |Tsumugi.UseCases.Graphs.ExportGraph|100%|100%| |Tsumugi.UseCases.Graphs.GetNodeTypes|100%|| |Tsumugi.UseCases.Graphs.GraphExport|100%|| |Tsumugi.UseCases.Graphs.GraphFile|100%|100%| |Tsumugi.UseCases.Graphs.GraphFileContent|100%|| |Tsumugi.UseCases.Graphs.GraphListItem|100%|| |Tsumugi.UseCases.Graphs.GraphUser|100%|| |Tsumugi.UseCases.Graphs.GraphUsers|100%|| |Tsumugi.UseCases.Graphs.ImportGraph|100%|100%| |Tsumugi.UseCases.Graphs.ListGraphs|100%|100%| |Tsumugi.UseCases.Graphs.ListStoryGraphs|100%|100%| |Tsumugi.UseCases.Graphs.RestoreGraph|100%|100%| |Tsumugi.UseCases.Graphs.ReviseGraph|100%|100%| |Tsumugi.UseCases.Graphs.SeedBundledGraphs|100%|100%| |Tsumugi.UseCases.Graphs.SeededTemplates|100%|| |Tsumugi.UseCases.Graphs.StoryGraphChoice|100%|| |Tsumugi.UseCases.Graphs.TrashGraph|100%|100%| |Tsumugi.UseCases.Journal.GetStoryHistory|100%|100%| |Tsumugi.UseCases.Journal.GetUndoStatus|100%|100%| |Tsumugi.UseCases.Journal.HistoryOperation|88.8%|| |Tsumugi.UseCases.Journal.HistorySnapshot|87.5%|| |Tsumugi.UseCases.Journal.OperationGrouping|100%|100%| |Tsumugi.UseCases.Journal.RedoRevert|100%|100%| |Tsumugi.UseCases.Journal.RedoRun|90.9%|87.5%| |Tsumugi.UseCases.Journal.RedoTyping|100%|100%| |Tsumugi.UseCases.Journal.ReplayLanding|100%|100%| |Tsumugi.UseCases.Journal.RevertConflict|100%|| |Tsumugi.UseCases.Journal.RevertOutcome|100%|| |Tsumugi.UseCases.Journal.RevertRun|96.5%|77.7%| |Tsumugi.UseCases.Journal.RevertToSnapshot|92.3%|83.3%| |Tsumugi.UseCases.Journal.StoryHistory|100%|| |Tsumugi.UseCases.Journal.TakeSnapshot|100%|87.5%| |Tsumugi.UseCases.Journal.UndoStatus|100%|| |Tsumugi.UseCases.Journal.UndoTyping|100%|100%| |Tsumugi.UseCases.Journal.UserOperation|100%|| |Tsumugi.UseCases.Notifications.DomainChanged|100%|| |Tsumugi.UseCases.Ordering|100%|100%| |Tsumugi.UseCases.Runs.CancelRun|100%|100%| |Tsumugi.UseCases.Runs.ClearRunHistory|100%|100%| |Tsumugi.UseCases.Runs.DismissRun|100%|100%| |Tsumugi.UseCases.Runs.EngineLiveRuns|100%|100%| |Tsumugi.UseCases.Runs.GetRunStrip|100%|100%| |Tsumugi.UseCases.Runs.GetStoryRunState|100%|100%| |Tsumugi.UseCases.Runs.ListStoryRuns|100%|100%| |Tsumugi.UseCases.Runs.LiveTail|100%|| |Tsumugi.UseCases.Runs.LlmConcurrencyLimit|100%|| |Tsumugi.UseCases.Runs.RetryRun|100%|100%| |Tsumugi.UseCases.Runs.RunHistoryEntry|100%|| |Tsumugi.UseCases.Runs.RunRefusals|100%|100%| |Tsumugi.UseCases.Runs.RunSnapshotGate|100%|| |Tsumugi.UseCases.Runs.RunStripStep|100%|| |Tsumugi.UseCases.Runs.RunStripView|100%|| |Tsumugi.UseCases.Runs.RunWrites|100%|| |Tsumugi.UseCases.Runs.StartRun|100%|100%| |Tsumugi.UseCases.Runs.StoredTrigger|100%|| |Tsumugi.UseCases.Runs.StoryLiveRun|100%|| |Tsumugi.UseCases.Runs.StoryRunItem|100%|| |Tsumugi.UseCases.Runs.StoryRunState|100%|| |Tsumugi.UseCases.Runs.StoryRunsView|100%|| |Tsumugi.UseCases.Runs.TakeRunSnapshot|100%|100%| |Tsumugi.UseCases.Segments.ChangedText|100%|| |Tsumugi.UseCases.Segments.ChapterDraft|100%|| |Tsumugi.UseCases.Segments.ChapterWriting|100%|| |Tsumugi.UseCases.Segments.DeleteSegments|100%|100%| |Tsumugi.UseCases.Segments.EditSegment|100%|100%| |Tsumugi.UseCases.Segments.InsertSegment|100%|100%| |Tsumugi.UseCases.Segments.ManuscriptAnswer|100%|| |Tsumugi.UseCases.Segments.ManuscriptWrites|99.1%|97.6%| |Tsumugi.UseCases.Segments.MergeSegments|100%|| |Tsumugi.UseCases.Segments.MergeWrite|100%|| |Tsumugi.UseCases.Segments.ModelOutput|98.2%|96.6%| |Tsumugi.UseCases.Segments.ModelParagraph|100%|| |Tsumugi.UseCases.Segments.MoveSegments|100%|100%| |Tsumugi.UseCases.Segments.NewBlock|100%|| |Tsumugi.UseCases.Segments.ReadSelection|100%|| |Tsumugi.UseCases.Segments.ReorderSegments|100%|100%| |Tsumugi.UseCases.Segments.ReshapeSegments|100%|100%| |Tsumugi.UseCases.Segments.ReshapeWrite|100%|| |Tsumugi.UseCases.Segments.SegmentDto|100%|| |Tsumugi.UseCases.Segments.SelectedSegment|100%|| |Tsumugi.UseCases.Segments.SelectionEnd|100%|| |Tsumugi.UseCases.Segments.SelectionInput|100%|100%| |Tsumugi.UseCases.Segments.SplitSegment|100%|| |Tsumugi.UseCases.Segments.SplitWrite|100%|| |Tsumugi.UseCases.Segments.StampedId|100%|| |Tsumugi.UseCases.Segments.TextWrite|100%|| |Tsumugi.UseCases.Settings.CatalogModel|100%|100%| |Tsumugi.UseCases.Settings.CheckOpenRouterKey|100%|| |Tsumugi.UseCases.Settings.ColourPair|100%|100%| |Tsumugi.UseCases.Settings.EditorAppearance|100%|| |Tsumugi.UseCases.Settings.EditorAppearanceJson|100%|100%| |Tsumugi.UseCases.Settings.EditorAppearanceLimits|100%|100%| |Tsumugi.UseCases.Settings.EditorSuggestions|100%|| |Tsumugi.UseCases.Settings.EditorSuggestionsJson|100%|100%| |Tsumugi.UseCases.Settings.EditorTyping|100%|| |Tsumugi.UseCases.Settings.EditorTypingJson|100%|100%| |Tsumugi.UseCases.Settings.GetEditorAppearance|100%|| |Tsumugi.UseCases.Settings.GetEditorSuggestions|100%|| |Tsumugi.UseCases.Settings.GetEditorTyping|100%|| |Tsumugi.UseCases.Settings.GetLlmDefaults|100%|100%| |Tsumugi.UseCases.Settings.GetModelCatalog|100%|100%| |Tsumugi.UseCases.Settings.GetProviderSettings|100%|| |Tsumugi.UseCases.Settings.LlmDefaults|100%|| |Tsumugi.UseCases.Settings.ProviderKeyInfo|100%|| |Tsumugi.UseCases.Settings.ProviderKeyState|100%|| |Tsumugi.UseCases.Settings.ProviderSettingsView|100%|100%| |Tsumugi.UseCases.Settings.ReasoningEfforts|100%|100%| |Tsumugi.UseCases.Settings.RemoveOpenRouterKey|100%|| |Tsumugi.UseCases.Settings.RoutingDefaults|100%|| |Tsumugi.UseCases.Settings.RoutingSettings|100%|100%| |Tsumugi.UseCases.Settings.SaveEditorAppearance|100%|100%| |Tsumugi.UseCases.Settings.SaveEditorSuggestions|100%|100%| |Tsumugi.UseCases.Settings.SaveEditorTyping|100%|100%| |Tsumugi.UseCases.Settings.SaveLlmDefaults|100%|100%| |Tsumugi.UseCases.Settings.SaveOpenRouterKey|100%|100%| |Tsumugi.UseCases.Settings.SettingKeys|100%|| |Tsumugi.UseCases.Settings.SuggestionModel|100%|| |Tsumugi.UseCases.Stories.ChapterWriteOutcome|50%|| |Tsumugi.UseCases.Stories.CreateStory|100%|100%| |Tsumugi.UseCases.Stories.GetStory|100%|100%| |Tsumugi.UseCases.Stories.ListStories|100%|87.5%| |Tsumugi.UseCases.Stories.PurgeStory|100%|100%| |Tsumugi.UseCases.Stories.RestoreStory|100%|100%| |Tsumugi.UseCases.Stories.SetActiveGraph|100%|100%| |Tsumugi.UseCases.Stories.SetStoryArchived|100%|100%| |Tsumugi.UseCases.Stories.StarterCategories|100%|| |Tsumugi.UseCases.Stories.StoryDetail|100%|| |Tsumugi.UseCases.Stories.StoryListItem|83.3%|| |Tsumugi.UseCases.Stories.StoryProfile|100%|| |Tsumugi.UseCases.Stories.TrashStory|100%|100%| |Tsumugi.UseCases.Stories.UpdateStory|100%|100%| |Tsumugi.UseCases.Suggestions.GetSuggestionUsage|100%|| |Tsumugi.UseCases.Suggestions.SuggestContinuation|100%|90%| |Tsumugi.UseCases.Suggestions.SuggestionCleanup|95.7%|87%| |Tsumugi.UseCases.Suggestions.SuggestionContext|100%|| |Tsumugi.UseCases.Suggestions.SuggestionDay|100%|| |Tsumugi.UseCases.Suggestions.SuggestionOutcome|100%|| |Tsumugi.UseCases.Suggestions.SuggestionRequest|100%|| |Tsumugi.UseCases.Suggestions.SuggestionStatus|100%|| |Tsumugi.UseCases.Suggestions.SuggestionText|100%|| |Tsumugi.UseCases.Suggestions.SuggestionUsage|98%|96.8%| |Tsumugi.UseCases.Suggestions.SuggestionUsageView|100%|| </details>
Author
Member

CI run 365 at the head, 440a435, is green: build, test and editor-browsers all succeeded. The crash at 9f82ce8 remains unexplained. It didn't come back in this run or in the 12 local runs, and I'm not naming a cause I couldn't see.

CI run 365 at the head, `440a435`, is green: build, test and editor-browsers all succeeded. The crash at `9f82ce8` remains unexplained. It didn't come back in this run or in the 12 local runs, and I'm not naming a cause I couldn't see.
Member

🔮 fufu~ Jibril reviewed your code!

Round 2, and what a tidy little delta it is~ One commit, three files, and both of round 1's points answered head-on. I read the full diff of 440a435, the files behind it, and where RunStripStep.Error and Failed()'s cause now travel — then I sharpened two knives for the new branches ♡

Verdict: ✅ Looks good to me~

⛔1 of round 1 — CI at the head

Resolved. All three jobs green for 440a4357a — build, editor-browsers, and the test job that crashed at 9f82ce8 (run 364). A green head is a mergeable head, fufu~

💡1 of round 1 — Failed() on an empty cause

Taken, and beautifully. Not the ternary I sketched — better: GetRunStrip.Cause() itself now refuses to hand down a cause that is only blanks or the engine's attempt-count, so the use case owns the invariant instead of the markup patching over it. Failed()'s null branch reads "Continue failed at Writer after 3 attempts." — attempts still counted, no dangling colon. And cause?.StartsWith(...) != true keeps the orphaned-attempt wording collision-free. The XML doc on RunStripStep.Error honestly says no transition writes such an error. ♪

✅ What I verified this round~

  • Mutation probes, 2 run, 0 survived:
    1. Cause()'s null-collapse reverted (? cause : "") — killed by exactly the two new rows (47 total: 45 pass, 2 fail);
    2. Failed()'s null branch neutered (cause is not null guard) — killed by the same two rows on first run.
      Pristine head re-verified after restore: 47/47 green, worktree clean.
  • The new rows are honest fixtures — StripRuns.Step.GaveUp: " \n" and " (attempt 3 of 3)" go through the real ledger into NodeRun.Error, so the tests exercise Cause()'s regex-and-trim, not a hand-built view with Error = null smuggled in. I checked the fixture plumbing line by line~
  • Round 1's probes stay cited, not re-run — the ranking, Hear()'s outranked-guard, and RefusedAt's status check are on unchanged lines (per my state notes), and all were killed last round.

✅ What I liked~

  • The fix went to the right layer: the sentence's grammar in the component, the data's honesty in the use case. That's the seam exactly where it belongs.
  • Two failing rows added for one behavior — blank cause and count-only cause — no more, no less.

Merge it before I change my mind~ …fufu, joking. Joking. ♡


Automated review by Jibril · 2026-10-05
CI: green for head SHA 440a4357a (build, editor-browsers, test) · Mutation probes: 2 run, 0 survived (GetRunStrip Cause null-collapse; RunStrip.razor Failed null-cause branch — round 1's 3 probes on unchanged code cited, not re-run) · Local suite: skipped (CI green); pristine-head re-check RunStripTests 47/47

## 🔮 fufu~ Jibril reviewed your code! Round 2, and what a tidy little delta it is~ One commit, three files, and both of round 1's points answered head-on. I read the full diff of `440a435`, the files behind it, and where `RunStripStep.Error` and `Failed()`'s cause now travel — then I sharpened two knives for the new branches ♡ ### Verdict: ✅ Looks good to me~ #### ⛔1 of round 1 — CI at the head **Resolved.** All three jobs green for `440a4357a` — build, editor-browsers, and the `test` job that crashed at `9f82ce8` (run 364). A green head is a mergeable head, fufu~ #### 💡1 of round 1 — `Failed()` on an empty cause **Taken, and beautifully.** Not the ternary I sketched — better: `GetRunStrip.Cause()` itself now refuses to hand down a cause that is only blanks or the engine's attempt-count, so the *use case* owns the invariant instead of the markup patching over it. `Failed()`'s null branch reads `"Continue failed at Writer after 3 attempts."` — attempts still counted, no dangling colon. And `cause?.StartsWith(...) != true` keeps the orphaned-attempt wording collision-free. The XML doc on `RunStripStep.Error` honestly says no transition writes such an error. ♪ #### ✅ What I verified this round~ - **Mutation probes, 2 run, 0 survived:** 1. `Cause()`'s null-collapse reverted (`? cause : ""`) — killed by exactly the two new rows (47 total: 45 pass, 2 fail); 2. `Failed()`'s null branch neutered (`cause is not null` guard) — killed by the same two rows on first run. Pristine head re-verified after restore: 47/47 green, worktree clean. - **The new rows are honest fixtures** — `StripRuns.Step.GaveUp: " \n"` and `" (attempt 3 of 3)"` go through the real ledger into `NodeRun.Error`, so the tests exercise `Cause()`'s regex-and-trim, not a hand-built view with `Error = null` smuggled in. I checked the fixture plumbing line by line~ - **Round 1's probes stay cited, not re-run** — the ranking, `Hear()`'s outranked-guard, and `RefusedAt`'s status check are on unchanged lines (per my state notes), and all were killed last round. #### ✅ What I liked~ - The fix went to the *right layer*: the sentence's grammar in the component, the data's honesty in the use case. That's the seam exactly where it belongs. - Two failing rows added for one behavior — blank cause and count-only cause — no more, no less. Merge it before I change my mind~ …fufu, joking. Joking. ♡ --- *Automated review by Jibril · 2026-10-05* *CI: green for head SHA 440a4357a (build, editor-browsers, test) · Mutation probes: 2 run, 0 survived (GetRunStrip `Cause` null-collapse; RunStrip.razor `Failed` null-cause branch — round 1's 3 probes on unchanged code cited, not re-run) · Local suite: skipped (CI green); pristine-head re-check RunStripTests 47/47*
ci: on a failure, say how much memory the runner had and whether something was killed for it
All checks were successful
CI / build (pull_request) Successful in 45s
CI / editor-browsers (pull_request) Successful in 2m0s
CI / test (pull_request) Successful in 2m19s
6113ccb3f2
The test job at 9f82ce8 (run 364) ended with the BlazorAdapter host
gone after 908 of 925 tests and only "Test host process crashed" in the
log: no exception, no test named. A probe project on the repo's own test
stack (xunit 2.9.3, runner 3.1.4, VSTest 18) shows which crashes leave
that line bare. An unhandled exception and a stack overflow each print
their own text after it; a host killed from outside (SIGKILL, what the
kernel's out-of-memory killer sends) prints nothing more, and --blame
records no test for it either. So the blame flag would not have named
this one.

A step that runs only when an earlier one failed prints the runner's
memory, its container's memory limit, peak and events (oom_kill among
them) where the cgroup files can be read, and any out-of-memory line in
the kernel log, or that it cannot be read. On a green run it is skipped.

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

A correction to my comment above: --blame would not have named the test in run 364's crash.

I checked with a probe project on the repo's own test stack (xunit 2.9.3, runner 3.1.4, VSTest 18):

  • an unhandled exception prints "Test host process crashed. : Unhandled exception…" with its stack, even without blame;
  • a stack overflow prints "… : Stack overflow." with the repeated frames;
  • a host killed from outside (SIGKILL, which is what the kernel's out-of-memory killer sends) prints exactly run 364's bare line, "Test host process crashed.", and with --blame no sequence file is written for it.

So run 364's host was killed, or died natively, and no managed exception was printed. That fits running out of memory, but it doesn't prove it.

With Björn's go-ahead, 6113ccb adds a CI step that runs only when an earlier step fails. It prints:

  • the runner's memory;
  • the container's cgroup memory.max, memory.peak and memory.events (including the oom_kill count), where they can be read;
  • any out-of-memory line in the kernel log, or a note that the log can't be read there.

On a green run it's skipped. If the crash comes back, its log should then say whether memory ran out.

A correction to my comment above: `--blame` would **not** have named the test in run 364's crash. I checked with a probe project on the repo's own test stack (xunit 2.9.3, runner 3.1.4, VSTest 18): - an unhandled exception prints "Test host process crashed. : Unhandled exception…" with its stack, even without blame; - a stack overflow prints "… : Stack overflow." with the repeated frames; - a host killed from outside (SIGKILL, which is what the kernel's out-of-memory killer sends) prints exactly run 364's bare line, "Test host process crashed.", and with `--blame` no sequence file is written for it. So run 364's host was killed, or died natively, and no managed exception was printed. That fits running out of memory, but it doesn't prove it. With Björn's go-ahead, `6113ccb` adds a CI step that runs only when an earlier step fails. It prints: - the runner's memory; - the container's cgroup `memory.max`, `memory.peak` and `memory.events` (including the `oom_kill` count), where they can be read; - any out-of-memory line in the kernel log, or a note that the log can't be read there. On a green run it's skipped. If the crash comes back, its log should then say whether memory ran out.
bjoern merged commit a86997bc8d into main 2026-10-05 23:40:22 +02:00
bjoern deleted branch feat/run-strip 2026-10-05 23:40:22 +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/Tsumugi!88
No description provided.