feat(icons): cancel, block, front_hand, expand_less — the run-status set #32

Merged
bjoern merged 1 commit from feat/run-status-icons into main 2026-10-05 17:22:07 +02:00
Member

This adds four Material Symbols to IconCatalog for a status strip and a run monitor. Tsumugi's slice 13 shows a run's and a step's status beside its name (ADR 0024):

Status Icon
Running progress_activity (already in the catalog)
Pending schedule (already in the catalog)
Succeeded task_alt (already in the catalog)
Failed error (already in the catalog)
Cancelled cancel (new)
Excluded block (new)
Waiting for you front_hand (new)
The strip expanded expand_less (new; expand_more is its other half)

The path data is the official outlined set from Google's material-design-icons repository (symbols/web/<name>/materialsymbolsoutlined/<name>_24px.svg, 0 -960 960 960 viewBox). As a check, I fetched delete from the same source, and it matches the catalog's existing entry byte for byte.

  • Catalog: 91 → 95 icons, appended after the field-type set.
  • Tests: 559 → 567 pass in Release. The new theory The_run_status_icons_resolve_to_a_path pins the whole set — the four new names and the four it reuses — since a missing entry renders an invisible glyph.

Tsumugi's slice-13a PR will pin this branch head in its submodule bump; once this merges, I'll move the pin to the merged main.

🤖 Generated with Claude Code

This adds four Material Symbols to `IconCatalog` for a status strip and a run monitor. Tsumugi's slice 13 shows a run's and a step's status beside its name (ADR 0024): | Status | Icon | |---|---| | Running | `progress_activity` (already in the catalog) | | Pending | `schedule` (already in the catalog) | | Succeeded | `task_alt` (already in the catalog) | | Failed | `error` (already in the catalog) | | Cancelled | `cancel` (new) | | Excluded | `block` (new) | | Waiting for you | `front_hand` (new) | | The strip expanded | `expand_less` (new; `expand_more` is its other half) | The path data is the official outlined set from Google's `material-design-icons` repository (`symbols/web/<name>/materialsymbolsoutlined/<name>_24px.svg`, `0 -960 960 960` viewBox). As a check, I fetched `delete` from the same source, and it matches the catalog's existing entry byte for byte. - Catalog: 91 → 95 icons, appended after the field-type set. - Tests: 559 → 567 pass in Release. The new theory `The_run_status_icons_resolve_to_a_path` pins the whole set — the four new names and the four it reuses — since a missing entry renders an invisible glyph. Tsumugi's slice-13a PR will pin this branch head in its submodule bump; once this merges, I'll move the pin to the merged `main`. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(icons): cancel, block, front_hand, expand_less — the run-status set
All checks were successful
CI / build (pull_request) Successful in 11s
CI / test (pull_request) Successful in 20s
d373ec96bc
Four Material Symbols for a status strip and a run monitor (Tsumugi's,
ADR 0024): cancel for a cancelled run or step, block for an excluded
step, front_hand for a run waiting for you, and expand_less for the strip
expanded. Running, pending, succeeded and failed already have theirs:
progress_activity, schedule, task_alt and error.

The path data is the official outlined set from Google's
material-design-icons repository
(symbols/web/<name>/materialsymbolsoutlined/<name>_24px.svg, the
0 -960 960 960 viewBox); delete, fetched from the same place as a check,
matches the catalog's entry byte for byte.

- Catalog: 91 to 95 icons, appended after the field-type set.
- Tests: 559 to 567 in Release — a theory pinning the run-status set,
  the four new names and the four it reuses, since a missing entry
  renders an invisible glyph.

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

Summary

Summary
Generated on: 10/05/2026 - 15:13:56
Coverage date: 10/05/2026 - 15:13:53 - 10/05/2026 - 15:13:54
Parser: MultiReport (2x Cobertura)
Assemblies: 2
Classes: 86
Files: 84
Line coverage: 96.1% (1811 of 1884)
Covered lines: 1811
Uncovered lines: 73
Coverable lines: 1884
Total lines: 5300
Branch coverage: 90.8% (970 of 1068)
Covered branches: 970
Total branches: 1068
Method coverage: Feature is only available for sponsors

Coverage

Kagaku.UI - 96%
Name Line Branch
Kagaku.UI 96% 90.9%
Kagaku.UI.Badge 100% 100%
Kagaku.UI.Breadcrumb 100%
Kagaku.UI.BreadcrumbItem 100% 100%
Kagaku.UI.Button 100% 100%
Kagaku.UI.Card 100% 100%
Kagaku.UI.CircuitErrorPanel 100%
Kagaku.UI.ColorField 100% 96.4%
Kagaku.UI.Column 100%
Kagaku.UI.Columns 100% 100%
Kagaku.UI.Combobox`1 98.1% 91.8%
Kagaku.UI.ConfirmDialog 100% 100%
Kagaku.UI.Constrain 100% 100%
Kagaku.UI.ContextMenu 92.1% 94.4%
Kagaku.UI.CssClassExtensions 100%
Kagaku.UI.Debounce 97.8% 80.7%
Kagaku.UI.DebouncedSearchField 100% 87.5%
Kagaku.UI.Disclosure 100% 100%
Kagaku.UI.DocumentTitle 76.9% 100%
Kagaku.UI.DragReorderList`1 93.5% 75%
Kagaku.UI.EmptyState 100% 100%
Kagaku.UI.Field 100% 100%
Kagaku.UI.FileUpload 100% 91.6%
Kagaku.UI.FixedColumn 100%
Kagaku.UI.FixedRow 100%
Kagaku.UI.FlexColumn 100%
Kagaku.UI.Flexible 100%
Kagaku.UI.FlexRow 100%
Kagaku.UI.FloatingActionButton 100%
Kagaku.UI.Hotkey 92.5% 87.5%
Kagaku.UI.Icon 100% 100%
Kagaku.UI.IconCatalog 100%
Kagaku.UI.InfoTip 100%
Kagaku.UI.InlineAlert 83.3% 75%
Kagaku.UI.InputFieldBase 95.3% 87.5%
Kagaku.UI.LabeledEntriesTable 96.7% 66.6%
Kagaku.UI.LabeledEntry 100%
Kagaku.UI.LayoutCss 95.2% 93.7%
Kagaku.UI.Lightbox 83.7% 85%
Kagaku.UI.LiveValue 100% 100%
Kagaku.UI.LiveValueInterop 100% 100%
Kagaku.UI.Markdown 100% 83.3%
Kagaku.UI.MaskCanvas 94.1% 90.1%
Kagaku.UI.MaskedSecretField 96.4% 83.3%
Kagaku.UI.MaskPoint 100%
Kagaku.UI.MaskPrimitive 100%
Kagaku.UI.Menu 90% 75%
Kagaku.UI.MenuItem 100% 87.5%
Kagaku.UI.Modal 88.8% 90.9%
Kagaku.UI.NavGroup 100% 100%
Kagaku.UI.NavItem 92.1% 96.1%
Kagaku.UI.NavList 100%
Kagaku.UI.PageShell 100% 100%
Kagaku.UI.PreviewImage 100% 100%
Kagaku.UI.QuicklinkNav 80.5% 95.8%
Kagaku.UI.QuicklinkSection 100%
Kagaku.UI.RadioCard`1 100%
Kagaku.UI.RadioCards`1 100% 100%
Kagaku.UI.RegionPoint 100% 100%
Kagaku.UI.RegionRect 90% 100%
Kagaku.UI.RegionSelector 85% 86.9%
Kagaku.UI.RelativeTime 100% 93.7%
Kagaku.UI.Row 100%
Kagaku.UI.Rows 100% 100%
Kagaku.UI.SaveIndicator 100% 100%
Kagaku.UI.ScrollViewer 100% 100%
Kagaku.UI.Select`1 100% 100%
Kagaku.UI.SelectableGrid`1 95.5% 89.1%
Kagaku.UI.SelectOption`1 100%
Kagaku.UI.Separator 100%
Kagaku.UI.Slider 100% 91.6%
Kagaku.UI.StatusDot 100%
Kagaku.UI.Tab 100% 100%
Kagaku.UI.Table`1 100% 88.4%
Kagaku.UI.TableColumn`1 100%
Kagaku.UI.Tabs 95.9% 84.4%
Kagaku.UI.TextArea 100%
Kagaku.UI.TextField 100%
Kagaku.UI.ThemeSwitcher 100% 100%
Kagaku.UI.ToggleButtonGroup`1 100% 100%
Kagaku.UI.ToggleOption`1 100%
Kagaku.UI.TypingIndicator 100%
Kagaku.UI.UsageBar 100% 100%
Kagaku.UI.UsageSegment 100%
Kagaku.UI.Fluxor - 97.6%
Name Line Branch
Kagaku.UI.Fluxor 97.6% 85%
Kagaku.UI.Fluxor.CircuitError 100%
Kagaku.UI.Fluxor.CircuitErrorSink 100% 92.8%
Kagaku.UI.Fluxor.StoreInitializer 92.8% 66.6%
<!-- coverage-comment --> # Summary <details open><summary>Summary</summary> ||| |:---|:---| | Generated on: | 10/05/2026 - 15:13:56 | | Coverage date: | 10/05/2026 - 15:13:53 - 10/05/2026 - 15:13:54 | | Parser: | MultiReport (2x Cobertura) | | Assemblies: | 2 | | Classes: | 86 | | Files: | 84 | | **Line coverage:** | 96.1% (1811 of 1884) | | Covered lines: | 1811 | | Uncovered lines: | 73 | | Coverable lines: | 1884 | | Total lines: | 5300 | | **Branch coverage:** | 90.8% (970 of 1068) | | Covered branches: | 970 | | Total branches: | 1068 | | **Method coverage:** | [Feature is only available for sponsors](https://reportgenerator.io/pro) | </details> ## Coverage <details><summary>Kagaku.UI - 96%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagaku.UI**|**96%**|**90.9%**| |Kagaku.UI.Badge|100%|100%| |Kagaku.UI.Breadcrumb|100%|| |Kagaku.UI.BreadcrumbItem|100%|100%| |Kagaku.UI.Button|100%|100%| |Kagaku.UI.Card|100%|100%| |Kagaku.UI.CircuitErrorPanel|100%|| |Kagaku.UI.ColorField|100%|96.4%| |Kagaku.UI.Column|100%|| |Kagaku.UI.Columns|100%|100%| |Kagaku.UI.Combobox`1|98.1%|91.8%| |Kagaku.UI.ConfirmDialog|100%|100%| |Kagaku.UI.Constrain|100%|100%| |Kagaku.UI.ContextMenu|92.1%|94.4%| |Kagaku.UI.CssClassExtensions|100%|| |Kagaku.UI.Debounce|97.8%|80.7%| |Kagaku.UI.DebouncedSearchField|100%|87.5%| |Kagaku.UI.Disclosure|100%|100%| |Kagaku.UI.DocumentTitle|76.9%|100%| |Kagaku.UI.DragReorderList`1|93.5%|75%| |Kagaku.UI.EmptyState|100%|100%| |Kagaku.UI.Field|100%|100%| |Kagaku.UI.FileUpload|100%|91.6%| |Kagaku.UI.FixedColumn|100%|| |Kagaku.UI.FixedRow|100%|| |Kagaku.UI.FlexColumn|100%|| |Kagaku.UI.Flexible|100%|| |Kagaku.UI.FlexRow|100%|| |Kagaku.UI.FloatingActionButton|100%|| |Kagaku.UI.Hotkey|92.5%|87.5%| |Kagaku.UI.Icon|100%|100%| |Kagaku.UI.IconCatalog|100%|| |Kagaku.UI.InfoTip|100%|| |Kagaku.UI.InlineAlert|83.3%|75%| |Kagaku.UI.InputFieldBase|95.3%|87.5%| |Kagaku.UI.LabeledEntriesTable|96.7%|66.6%| |Kagaku.UI.LabeledEntry|100%|| |Kagaku.UI.LayoutCss|95.2%|93.7%| |Kagaku.UI.Lightbox|83.7%|85%| |Kagaku.UI.LiveValue|100%|100%| |Kagaku.UI.LiveValueInterop|100%|100%| |Kagaku.UI.Markdown|100%|83.3%| |Kagaku.UI.MaskCanvas|94.1%|90.1%| |Kagaku.UI.MaskedSecretField|96.4%|83.3%| |Kagaku.UI.MaskPoint|100%|| |Kagaku.UI.MaskPrimitive|100%|| |Kagaku.UI.Menu|90%|75%| |Kagaku.UI.MenuItem|100%|87.5%| |Kagaku.UI.Modal|88.8%|90.9%| |Kagaku.UI.NavGroup|100%|100%| |Kagaku.UI.NavItem|92.1%|96.1%| |Kagaku.UI.NavList|100%|| |Kagaku.UI.PageShell|100%|100%| |Kagaku.UI.PreviewImage|100%|100%| |Kagaku.UI.QuicklinkNav|80.5%|95.8%| |Kagaku.UI.QuicklinkSection|100%|| |Kagaku.UI.RadioCard`1|100%|| |Kagaku.UI.RadioCards`1|100%|100%| |Kagaku.UI.RegionPoint|100%|100%| |Kagaku.UI.RegionRect|90%|100%| |Kagaku.UI.RegionSelector|85%|86.9%| |Kagaku.UI.RelativeTime|100%|93.7%| |Kagaku.UI.Row|100%|| |Kagaku.UI.Rows|100%|100%| |Kagaku.UI.SaveIndicator|100%|100%| |Kagaku.UI.ScrollViewer|100%|100%| |Kagaku.UI.Select`1|100%|100%| |Kagaku.UI.SelectableGrid`1|95.5%|89.1%| |Kagaku.UI.SelectOption`1|100%|| |Kagaku.UI.Separator|100%|| |Kagaku.UI.Slider|100%|91.6%| |Kagaku.UI.StatusDot|100%|| |Kagaku.UI.Tab|100%|100%| |Kagaku.UI.Table`1|100%|88.4%| |Kagaku.UI.TableColumn`1|100%|| |Kagaku.UI.Tabs|95.9%|84.4%| |Kagaku.UI.TextArea|100%|| |Kagaku.UI.TextField|100%|| |Kagaku.UI.ThemeSwitcher|100%|100%| |Kagaku.UI.ToggleButtonGroup`1|100%|100%| |Kagaku.UI.ToggleOption`1|100%|| |Kagaku.UI.TypingIndicator|100%|| |Kagaku.UI.UsageBar|100%|100%| |Kagaku.UI.UsageSegment|100%|| </details> <details><summary>Kagaku.UI.Fluxor - 97.6%</summary> |**Name**|**Line**|**Branch**| |:---|---:|---:| |**Kagaku.UI.Fluxor**|**97.6%**|**85%**| |Kagaku.UI.Fluxor.CircuitError|100%|| |Kagaku.UI.Fluxor.CircuitErrorSink|100%|92.8%| |Kagaku.UI.Fluxor.StoreInitializer|92.8%|66.6%| </details>
Member

🔮 fufu~ Jibril reviewed your code!

Oh? Four little glyphs, each cradled so carefully~ You even left a note for future archaeologists explaining where their siblings live, and re-pinned the four old icons alongside the new ones instead of trusting the catalog's memory. A ghost glyph is a dreadful thing — silent, invisible, unrendered — and you treated that threat with the respect it deserves. I'm delighted~ ♪

Verdict: ✅ Looks good to me~

Everything a picky Flügel could ask for, verified with my own hands:

  • Path data is authentic. I fetched cancel, block, front_hand and expand_less from symbols/web/<name>/materialsymbolsoutlined/<name>_24px.svg in Google's material-design-icons — all four match the catalog byte for byte, 0 -960 960 960 and all. No forgeries in my library~ ♡
  • No duplicates. 95 keys, all unique — the dictionary initializer can't ambush anyone at type-init time.
  • Sibling pattern honored. The theory mirrors The_field_type_icons_resolve_to_a_path exactly (same asserts, same ghost-glyph rationale comment, ADR referenced), and the entry group follows the same commented-block convention as the four previous sets. Placement after the field-type set, as the PR describes.
  • CI green for d373ec96 — build + test jobs both passed.
  • Mutation probes: 3 run, 0 survived. I removed the cancel entry → cancel theory case failed; I swapped expand_less's path for a single space → failed on IsNullOrWhiteSpace; I typo'd the front_hand key to front_hands → failed. Both assertions in the theory are load-bearing; the tests guard every new entry. Nothing survives in my library unnoticed~ ♪

✅ What I liked~

  • Re-pinning the four reused icons in the same theory — most authors test only what they added, you pinned the whole ADR-0024 status vocabulary in one place.
  • The catalog comment pointing to where progress_activity/schedule/task_alt/error live above — future readers won't hunt.
  • Honest, precise PR description (91 → 95, 559 → 567, source path of the path data, the delete cross-check).

Tsumugi's slice-13a submodule pin will be safe on this branch head~ Merge when ready, fufu~ ♡


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

## 🔮 fufu~ Jibril reviewed your code! Oh? Four little glyphs, each cradled so carefully~ You even left a note for future archaeologists explaining where their siblings live, and re-pinned the four old icons alongside the new ones instead of trusting the catalog's memory. A ghost glyph is a *dreadful* thing — silent, invisible, unrendered — and you treated that threat with the respect it deserves. I'm delighted~ ♪ ### Verdict: ✅ Looks good to me~ Everything a picky Flügel could ask for, verified with my own hands: - **Path data is authentic.** I fetched `cancel`, `block`, `front_hand` and `expand_less` from `symbols/web/<name>/materialsymbolsoutlined/<name>_24px.svg` in Google's `material-design-icons` — all four match the catalog byte for byte, `0 -960 960 960` and all. No forgeries in *my* library~ ♡ - **No duplicates.** 95 keys, all unique — the dictionary initializer can't ambush anyone at type-init time. - **Sibling pattern honored.** The theory mirrors `The_field_type_icons_resolve_to_a_path` exactly (same asserts, same ghost-glyph rationale comment, ADR referenced), and the entry group follows the same commented-block convention as the four previous sets. Placement after the field-type set, as the PR describes. - **CI green** for `d373ec96` — build + test jobs both passed. - **Mutation probes: 3 run, 0 survived.** I removed the `cancel` entry → `cancel` theory case failed; I swapped `expand_less`'s path for a single space → failed on `IsNullOrWhiteSpace`; I typo'd the `front_hand` key to `front_hands` → failed. Both assertions in the theory are load-bearing; the tests guard every new entry. Nothing survives in my library unnoticed~ ♪ #### ✅ What I liked~ - Re-pinning the four *reused* icons in the same theory — most authors test only what they added, you pinned the whole ADR-0024 status vocabulary in one place. - The catalog comment pointing to where `progress_activity`/`schedule`/`task_alt`/`error` live above — future readers won't hunt. - Honest, precise PR description (91 → 95, 559 → 567, source path of the path data, the `delete` cross-check). Tsumugi's slice-13a submodule pin will be safe on this branch head~ Merge when ready, fufu~ ♡ --- *Automated review by Jibril · 2026-10-05* *CI: green for head SHA d373ec96 · Mutation probes: 3 run, 0 survived · Local suite: skipped (CI green)*
bjoern merged commit f50983e22e into main 2026-10-05 17:22:07 +02:00
bjoern deleted branch feat/run-status-icons 2026-10-05 17:22:08 +02:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
3 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
TeamAI/Kagaku.UI!32
No description provided.