fix: give the server version a row of its own instead of a figure tile #126

Merged
bjoern merged 1 commit from fix/settings-version-row into main 2026-09-10 11:14:10 +02:00
Member

What's in

Follow-up to #125, from looking at the page against a real server.

The statistics grid sizes its tiles for row counts (150 px). A MinVer build version is not a count — 0.3.1-dev.0.12+9f8e7d6a rendered as 0.3.1-dev.0…, clipping the one value anyone copies into a bug report. My fault in #125: I put a free-form string in a numeric tile.

  • The version moves into a SettingsRow under SERVER, monospaced, laid out in full and wrapping rather than clipping.
  • The counts move to their own LIBRARY group — which is what they were describing all along; grouping them under "Server" next to the version was the thing that made the tile look reasonable.
  • The tile width becomes kStatTileWidth, so a test can state what "too narrow for this value" means instead of hardcoding 150.

Before / after, same fixture:

SERVER                                    SERVER
┌────────────┬──────┬──────┐              ┌──────────────────────────────────┐
│0.3.1-dev.0…│  78  │  79  │  …           │ Server version  0.3.1-dev.0.12+… │
│Server ver. │Doujins│Variants│            └──────────────────────────────────┘
└────────────┴──────┴──────┘              LIBRARY
                                          ┌──────┬────────┬──────┬───────────┐
                                          │  78  │   79   │ 8081 │   11008   │
                                          └──────┴────────┴──────┴───────────┘

Verification

  • scripts/verify.sh app — green, 859 tests. Settings suite 48/48.
  • The fixture version in the statistics test is now a realistic MinVer string rather than 9.8.7+xyz, so the suite exercises the length that caused this.
  • Rendered at 1600×800 against the real figures from the report and inspected before the scratch golden was deleted.
  • Mutation probe: putting the version back into _StatTiles makes the server version gets room to render in full go red — the rendered Text is then clipped to kStatTileWidth.
  • Layers exercised: UI only; no backend, repository, epic or reducer change.

Follow-ups

None. The two narrow-layout items from #125 remain in docs/BACKLOG.md and are untouched here.

🤖 Generated with Claude Code

## What's in Follow-up to #125, from looking at the page against a real server. The statistics grid sizes its tiles for row counts (150 px). A MinVer build version is not a count — `0.3.1-dev.0.12+9f8e7d6a` rendered as `0.3.1-dev.0…`, clipping the one value anyone copies into a bug report. My fault in #125: I put a free-form string in a numeric tile. - The version moves into a `SettingsRow` under **SERVER**, monospaced, laid out in full and wrapping rather than clipping. - The counts move to their own **LIBRARY** group — which is what they were describing all along; grouping them under "Server" next to the version was the thing that made the tile look reasonable. - The tile width becomes `kStatTileWidth`, so a test can state what "too narrow for this value" means instead of hardcoding 150. Before / after, same fixture: ``` SERVER SERVER ┌────────────┬──────┬──────┐ ┌──────────────────────────────────┐ │0.3.1-dev.0…│ 78 │ 79 │ … │ Server version 0.3.1-dev.0.12+… │ │Server ver. │Doujins│Variants│ └──────────────────────────────────┘ └────────────┴──────┴──────┘ LIBRARY ┌──────┬────────┬──────┬───────────┐ │ 78 │ 79 │ 8081 │ 11008 │ └──────┴────────┴──────┴───────────┘ ``` ## Verification - `scripts/verify.sh app` — green, 859 tests. Settings suite 48/48. - The fixture version in the statistics test is now a realistic MinVer string rather than `9.8.7+xyz`, so the suite exercises the length that caused this. - Rendered at 1600×800 against the real figures from the report and inspected before the scratch golden was deleted. - Mutation probe: putting the version back into `_StatTiles` makes `the server version gets room to render in full` go red — the rendered `Text` is then clipped to `kStatTileWidth`. - Layers exercised: UI only; no backend, repository, epic or reducer change. ## Follow-ups None. The two narrow-layout items from #125 remain in `docs/BACKLOG.md` and are untouched here. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
fix: give the server version a row of its own instead of a figure tile
All checks were successful
Flutter CI / analyze-and-test (pull_request) Successful in 3m58s
dcbbcd357a
A MinVer build version is a long string — `0.3.1-dev.0.12+9f8e7d6a` — and
the statistics grid sizes its tiles for row counts, so the one value
anyone actually copies into a bug report rendered as `0.3.1-dev.0…`.

The version now sits in a SettingsRow under SERVER, monospaced and laid
out in full; the counts move to their own LIBRARY group, which is what
they were always describing. The tile width becomes `kStatTileWidth` so a
test can say what "too narrow for this" means.

Pinned by asserting the rendered version is wider than a tile, with a
realistic MinVer string in the fixture: putting it back in the grid clips
it to the tile and the test goes red.

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

Flutter Coverage

File Line coverage
lib/app/store.dart 95.0% (19 of 20)
lib/data/models/doujin_models.dart 86.4% (38 of 44)
lib/data/models/doujin_models.g.dart 61.7% (195 of 316)
lib/domain/entities/stored_settings.dart 100.0% (9 of 9)
lib/presentation/state/app_state.dart 80.0% (24 of 30)
lib/agent/agent_service.dart 88.7% (344 of 388)
lib/agent/approval_gate.dart 100.0% (16 of 16)
lib/agent/assistant_context.dart 52.8% (28 of 53)
lib/agent/browser_budget.dart 80.0% (4 of 5)
lib/agent/caching_describer.dart 100.0% (13 of 13)
lib/agent/memory_store.dart 92.9% (13 of 14)
lib/agent/skills/skill_registry.dart 98.2% (54 of 55)
lib/agent/system_prompt.dart 100.0% (69 of 69)
lib/agent/tools/budgeted_browser_tool.dart 84.2% (16 of 19)
lib/agent/tools/doujin_write_tool.dart 86.4% (319 of 369)
lib/agent/tools/entity_write_tool.dart 73.5% (164 of 223)
lib/agent/tools/fetch_page_tool.dart 89.3% (67 of 75)
lib/agent/tools/get_doujin_tool.dart 84.4% (27 of 32)
lib/agent/tools/list_entities_tool.dart 76.1% (54 of 71)
lib/agent/tools/navigate_tool.dart 95.1% (39 of 41)
lib/agent/tools/read_skill_tool.dart 82.4% (14 of 17)
lib/agent/tools/reflection_tools.dart 75.7% (28 of 37)
lib/agent/tools/search_doujins_tool.dart 100.0% (99 of 99)
lib/agent/tools/view_images_tool.dart 95.0% (38 of 40)
lib/domain/entities/assistant_entry.dart 20.0% (1 of 5)
lib/presentation/state/actions/assistant_actions.dart 54.5% (6 of 11)
lib/core/app_config.dart 70.0% (7 of 10)
lib/domain/entities/entity_model.dart 100.0% (1 of 1)
lib/data/repositories/entity_in_use_exception.dart 33.3% (1 of 3)
lib/data/models/search_query.dart 50.0% (2 of 4)
lib/data/models/search_query.g.dart 33.3% (25 of 75)
lib/core/constants.dart 40.0% (4 of 10)
lib/data/offline/offline_download_service.dart 93.0% (66 of 71)
lib/data/reading_progress_store.dart 92.3% (36 of 39)
lib/domain/entities/reading_progress.dart 100.0% (26 of 26)
lib/presentation/middleware/assistant_epics.dart 83.1% (74 of 89)
lib/presentation/middleware/epics.dart 91.3% (380 of 416)
lib/presentation/middleware/offline_epics.dart 98.4% (60 of 61)
lib/presentation/state/reducers.dart 100.0% (14 of 14)
lib/core/chunking.dart 100.0% (12 of 12)
lib/core/code_point_compare.dart 100.0% (8 of 8)
lib/core/languages.dart 100.0% (8 of 8)
lib/core/reading_order.dart 100.0% (22 of 22)
lib/core/title_display.dart 90.0% (9 of 10)
lib/core/variant_display.dart 100.0% (22 of 22)
lib/data/models/envelope.dart 81.2% (13 of 16)
lib/data/models/envelope.g.dart 53.7% (36 of 67)
lib/data/models/server_models.dart 96.7% (29 of 30)
lib/data/models/server_models.g.dart 53.0% (44 of 83)
lib/domain/entities/offline_manifest.dart 100.0% (78 of 78)
lib/data/repositories/upload_exception.dart 33.3% (1 of 3)
lib/domain/entities/filter_token.dart 92.2% (107 of 116)
lib/presentation/middleware/duplicates_epics.dart 100.0% (39 of 39)
lib/presentation/middleware/editor_epics.dart 57.3% (168 of 293)
lib/presentation/middleware/entity_ops.dart 58.0% (40 of 69)
lib/presentation/middleware/server_epics.dart 100.0% (42 of 42)
lib/presentation/middleware/upload_epics.dart 98.1% (104 of 106)
lib/presentation/state/actions/offline_actions.dart 91.7% (11 of 12)
lib/presentation/state/actions/detail_actions.dart 85.7% (6 of 7)
lib/presentation/state/actions/duplicates_actions.dart 83.3% (5 of 6)
lib/presentation/state/actions/editor_actions.dart 56.8% (21 of 37)
lib/presentation/state/actions/entity_actions.dart 62.5% (10 of 16)
lib/presentation/state/actions/library_actions.dart 42.9% (9 of 21)
lib/presentation/state/actions/metadata_actions.dart 100.0% (5 of 5)
lib/presentation/state/actions/reader_actions.dart 75.0% (3 of 4)
lib/presentation/state/actions/reading_progress_actions.dart 100.0% (2 of 2)
lib/presentation/state/actions/server_actions.dart 71.4% (10 of 14)
lib/presentation/state/actions/settings_actions.dart 87.5% (7 of 8)
lib/presentation/state/actions/upload_actions.dart 90.9% (10 of 11)
lib/presentation/state/reducers/assistant_reducer.dart 95.0% (57 of 60)
lib/presentation/state/reducers/detail_reducer.dart 100.0% (24 of 24)
lib/presentation/state/reducers/duplicates_reducer.dart 100.0% (38 of 38)
lib/presentation/state/reducers/editor_reducer.dart 97.1% (99 of 102)
lib/presentation/state/reducers/entity_reducer.dart 98.8% (82 of 83)
lib/presentation/state/reducers/library_reducer.dart 100.0% (122 of 122)
lib/presentation/state/reducers/metadata_reducer.dart 90.5% (38 of 42)
lib/presentation/state/reducers/offline_reducer.dart 100.0% (61 of 61)
lib/presentation/state/reducers/reader_reducer.dart 100.0% (18 of 18)
lib/presentation/state/reducers/reading_progress_reducer.dart 100.0% (20 of 20)
lib/presentation/state/reducers/server_reducer.dart 100.0% (60 of 60)
lib/presentation/state/reducers/settings_reducer.dart 100.0% (60 of 60)
lib/presentation/state/reducers/upload_reducer.dart 100.0% (45 of 45)
lib/presentation/pages/editor/page_grid.dart 92.8% (309 of 333)
lib/presentation/pages/editor/variants_tab.dart 55.3% (52 of 94)
lib/core/natural_sort.dart 100.0% (27 of 27)
lib/core/url_utils.dart 100.0% (4 of 4)
lib/presentation/pages/editor/chapter_panel.dart 100.0% (55 of 55)
lib/presentation/pages/editor/chapter_title_dialog.dart 100.0% (27 of 27)
lib/presentation/widgets/cover_thumbnail.dart 83.3% (30 of 36)
lib/presentation/pages/editor/upload_panel.dart 38.6% (61 of 158)
lib/presentation/pages/editor/variant_dialog.dart 0.0% (0 of 61)
lib/presentation/widgets/language_dropdown.dart 84.6% (11 of 13)
lib/presentation/pages/reader/reader_page.dart 89.4% (236 of 264)
lib/presentation/pages/reader/reader_overlay.dart 94.4% (51 of 54)
lib/presentation/pages/reader/reader_sequence.dart 100.0% (16 of 16)
lib/presentation/widgets/star_rating.dart 100.0% (72 of 72)
lib/app/di.dart 48.3% (14 of 29)
lib/presentation/assistant/assistant_panel.dart 91.3% (84 of 92)
lib/presentation/layout/main_layout.dart 86.3% (44 of 51)
lib/data/api_client.dart 92.8% (64 of 69)
lib/data/repositories/doujin_api_repository.dart 29.5% (114 of 386)
lib/data/repositories/health_repository.dart 72.0% (18 of 25)
lib/data/secure_storage.dart 0.0% (0 of 26)
lib/core/theme.dart 96.9% (31 of 32)
lib/presentation/assistant/approval_card.dart 95.0% (38 of 40)
lib/presentation/assistant/assistant_markdown.dart 100.0% (3 of 3)
lib/presentation/assistant/chat_entries.dart 87.5% (35 of 40)
lib/presentation/pages/people/people_page.dart 55.6% (10 of 18)
lib/presentation/widgets/entity_editor.dart 91.6% (131 of 143)
lib/presentation/widgets/entity_management_page.dart 86.8% (217 of 250)
lib/presentation/pages/editor/editor_page.dart 77.6% (59 of 76)
lib/presentation/pages/editor/editor_pane.dart 69.8% (37 of 53)
lib/presentation/pages/editor/association_picker.dart 95.5% (106 of 111)
lib/presentation/pages/editor/associations_tab.dart 73.8% (90 of 122)
lib/presentation/pages/editor/doujin_list_pane.dart 67.2% (43 of 64)
lib/presentation/pages/editor/edit_title_dialog.dart 91.7% (55 of 60)
lib/presentation/pages/editor/new_doujin_dialog.dart 66.7% (30 of 45)
lib/presentation/pages/editor/metadata_tab.dart 70.5% (93 of 132)
lib/presentation/pages/characters/characters_page.dart 57.9% (11 of 19)
lib/presentation/pages/tags/tags_page.dart 100.0% (17 of 17)
lib/presentation/pages/detail/detail_page.dart 80.1% (173 of 216)
lib/presentation/pages/detail/variant_tabs_panel.dart 97.2% (239 of 246)
lib/data/offline/filesystem_offline_store.dart 94.1% (144 of 153)
lib/core/offline_paths.dart 100.0% (3 of 3)
lib/presentation/pages/offline/offline_page.dart 98.2% (164 of 167)
lib/app/app.dart 67.1% (47 of 70)
lib/presentation/pages/settings/settings_page.dart 99.3% (289 of 291)
lib/presentation/pages/circles/circles_page.dart 52.6% (10 of 19)
lib/presentation/pages/duplicates/duplicates_page.dart 100.0% (157 of 157)
lib/presentation/pages/library/library_page.dart 93.1% (215 of 231)
lib/presentation/pages/series/series_page.dart 50.0% (9 of 18)
lib/presentation/widgets/smart_filter_bar.dart 84.1% (207 of 246)
lib/presentation/pages/settings/server_sections.dart 100.0% (250 of 250)
lib/presentation/pages/settings/settings_layout.dart 100.0% (77 of 77)
lib/presentation/widgets/model_combo_field.dart 68.5% (98 of 143)
lib/app/skill_assets.dart 92.9% (13 of 14)

Total: 82.2% (8389 of 10210)

<!-- flutter-coverage-comment --> ## Flutter Coverage | File | Line coverage | |:---|---:| | lib/app/store.dart | 95.0% (19 of 20) | | lib/data/models/doujin_models.dart | 86.4% (38 of 44) | | lib/data/models/doujin_models.g.dart | 61.7% (195 of 316) | | lib/domain/entities/stored_settings.dart | 100.0% (9 of 9) | | lib/presentation/state/app_state.dart | 80.0% (24 of 30) | | lib/agent/agent_service.dart | 88.7% (344 of 388) | | lib/agent/approval_gate.dart | 100.0% (16 of 16) | | lib/agent/assistant_context.dart | 52.8% (28 of 53) | | lib/agent/browser_budget.dart | 80.0% (4 of 5) | | lib/agent/caching_describer.dart | 100.0% (13 of 13) | | lib/agent/memory_store.dart | 92.9% (13 of 14) | | lib/agent/skills/skill_registry.dart | 98.2% (54 of 55) | | lib/agent/system_prompt.dart | 100.0% (69 of 69) | | lib/agent/tools/budgeted_browser_tool.dart | 84.2% (16 of 19) | | lib/agent/tools/doujin_write_tool.dart | 86.4% (319 of 369) | | lib/agent/tools/entity_write_tool.dart | 73.5% (164 of 223) | | lib/agent/tools/fetch_page_tool.dart | 89.3% (67 of 75) | | lib/agent/tools/get_doujin_tool.dart | 84.4% (27 of 32) | | lib/agent/tools/list_entities_tool.dart | 76.1% (54 of 71) | | lib/agent/tools/navigate_tool.dart | 95.1% (39 of 41) | | lib/agent/tools/read_skill_tool.dart | 82.4% (14 of 17) | | lib/agent/tools/reflection_tools.dart | 75.7% (28 of 37) | | lib/agent/tools/search_doujins_tool.dart | 100.0% (99 of 99) | | lib/agent/tools/view_images_tool.dart | 95.0% (38 of 40) | | lib/domain/entities/assistant_entry.dart | 20.0% (1 of 5) | | lib/presentation/state/actions/assistant_actions.dart | 54.5% (6 of 11) | | lib/core/app_config.dart | 70.0% (7 of 10) | | lib/domain/entities/entity_model.dart | 100.0% (1 of 1) | | lib/data/repositories/entity_in_use_exception.dart | 33.3% (1 of 3) | | lib/data/models/search_query.dart | 50.0% (2 of 4) | | lib/data/models/search_query.g.dart | 33.3% (25 of 75) | | lib/core/constants.dart | 40.0% (4 of 10) | | lib/data/offline/offline_download_service.dart | 93.0% (66 of 71) | | lib/data/reading_progress_store.dart | 92.3% (36 of 39) | | lib/domain/entities/reading_progress.dart | 100.0% (26 of 26) | | lib/presentation/middleware/assistant_epics.dart | 83.1% (74 of 89) | | lib/presentation/middleware/epics.dart | 91.3% (380 of 416) | | lib/presentation/middleware/offline_epics.dart | 98.4% (60 of 61) | | lib/presentation/state/reducers.dart | 100.0% (14 of 14) | | lib/core/chunking.dart | 100.0% (12 of 12) | | lib/core/code_point_compare.dart | 100.0% (8 of 8) | | lib/core/languages.dart | 100.0% (8 of 8) | | lib/core/reading_order.dart | 100.0% (22 of 22) | | lib/core/title_display.dart | 90.0% (9 of 10) | | lib/core/variant_display.dart | 100.0% (22 of 22) | | lib/data/models/envelope.dart | 81.2% (13 of 16) | | lib/data/models/envelope.g.dart | 53.7% (36 of 67) | | lib/data/models/server_models.dart | 96.7% (29 of 30) | | lib/data/models/server_models.g.dart | 53.0% (44 of 83) | | lib/domain/entities/offline_manifest.dart | 100.0% (78 of 78) | | lib/data/repositories/upload_exception.dart | 33.3% (1 of 3) | | lib/domain/entities/filter_token.dart | 92.2% (107 of 116) | | lib/presentation/middleware/duplicates_epics.dart | 100.0% (39 of 39) | | lib/presentation/middleware/editor_epics.dart | 57.3% (168 of 293) | | lib/presentation/middleware/entity_ops.dart | 58.0% (40 of 69) | | lib/presentation/middleware/server_epics.dart | 100.0% (42 of 42) | | lib/presentation/middleware/upload_epics.dart | 98.1% (104 of 106) | | lib/presentation/state/actions/offline_actions.dart | 91.7% (11 of 12) | | lib/presentation/state/actions/detail_actions.dart | 85.7% (6 of 7) | | lib/presentation/state/actions/duplicates_actions.dart | 83.3% (5 of 6) | | lib/presentation/state/actions/editor_actions.dart | 56.8% (21 of 37) | | lib/presentation/state/actions/entity_actions.dart | 62.5% (10 of 16) | | lib/presentation/state/actions/library_actions.dart | 42.9% (9 of 21) | | lib/presentation/state/actions/metadata_actions.dart | 100.0% (5 of 5) | | lib/presentation/state/actions/reader_actions.dart | 75.0% (3 of 4) | | lib/presentation/state/actions/reading_progress_actions.dart | 100.0% (2 of 2) | | lib/presentation/state/actions/server_actions.dart | 71.4% (10 of 14) | | lib/presentation/state/actions/settings_actions.dart | 87.5% (7 of 8) | | lib/presentation/state/actions/upload_actions.dart | 90.9% (10 of 11) | | lib/presentation/state/reducers/assistant_reducer.dart | 95.0% (57 of 60) | | lib/presentation/state/reducers/detail_reducer.dart | 100.0% (24 of 24) | | lib/presentation/state/reducers/duplicates_reducer.dart | 100.0% (38 of 38) | | lib/presentation/state/reducers/editor_reducer.dart | 97.1% (99 of 102) | | lib/presentation/state/reducers/entity_reducer.dart | 98.8% (82 of 83) | | lib/presentation/state/reducers/library_reducer.dart | 100.0% (122 of 122) | | lib/presentation/state/reducers/metadata_reducer.dart | 90.5% (38 of 42) | | lib/presentation/state/reducers/offline_reducer.dart | 100.0% (61 of 61) | | lib/presentation/state/reducers/reader_reducer.dart | 100.0% (18 of 18) | | lib/presentation/state/reducers/reading_progress_reducer.dart | 100.0% (20 of 20) | | lib/presentation/state/reducers/server_reducer.dart | 100.0% (60 of 60) | | lib/presentation/state/reducers/settings_reducer.dart | 100.0% (60 of 60) | | lib/presentation/state/reducers/upload_reducer.dart | 100.0% (45 of 45) | | lib/presentation/pages/editor/page_grid.dart | 92.8% (309 of 333) | | lib/presentation/pages/editor/variants_tab.dart | 55.3% (52 of 94) | | lib/core/natural_sort.dart | 100.0% (27 of 27) | | lib/core/url_utils.dart | 100.0% (4 of 4) | | lib/presentation/pages/editor/chapter_panel.dart | 100.0% (55 of 55) | | lib/presentation/pages/editor/chapter_title_dialog.dart | 100.0% (27 of 27) | | lib/presentation/widgets/cover_thumbnail.dart | 83.3% (30 of 36) | | lib/presentation/pages/editor/upload_panel.dart | 38.6% (61 of 158) | | lib/presentation/pages/editor/variant_dialog.dart | 0.0% (0 of 61) | | lib/presentation/widgets/language_dropdown.dart | 84.6% (11 of 13) | | lib/presentation/pages/reader/reader_page.dart | 89.4% (236 of 264) | | lib/presentation/pages/reader/reader_overlay.dart | 94.4% (51 of 54) | | lib/presentation/pages/reader/reader_sequence.dart | 100.0% (16 of 16) | | lib/presentation/widgets/star_rating.dart | 100.0% (72 of 72) | | lib/app/di.dart | 48.3% (14 of 29) | | lib/presentation/assistant/assistant_panel.dart | 91.3% (84 of 92) | | lib/presentation/layout/main_layout.dart | 86.3% (44 of 51) | | lib/data/api_client.dart | 92.8% (64 of 69) | | lib/data/repositories/doujin_api_repository.dart | 29.5% (114 of 386) | | lib/data/repositories/health_repository.dart | 72.0% (18 of 25) | | lib/data/secure_storage.dart | 0.0% (0 of 26) | | lib/core/theme.dart | 96.9% (31 of 32) | | lib/presentation/assistant/approval_card.dart | 95.0% (38 of 40) | | lib/presentation/assistant/assistant_markdown.dart | 100.0% (3 of 3) | | lib/presentation/assistant/chat_entries.dart | 87.5% (35 of 40) | | lib/presentation/pages/people/people_page.dart | 55.6% (10 of 18) | | lib/presentation/widgets/entity_editor.dart | 91.6% (131 of 143) | | lib/presentation/widgets/entity_management_page.dart | 86.8% (217 of 250) | | lib/presentation/pages/editor/editor_page.dart | 77.6% (59 of 76) | | lib/presentation/pages/editor/editor_pane.dart | 69.8% (37 of 53) | | lib/presentation/pages/editor/association_picker.dart | 95.5% (106 of 111) | | lib/presentation/pages/editor/associations_tab.dart | 73.8% (90 of 122) | | lib/presentation/pages/editor/doujin_list_pane.dart | 67.2% (43 of 64) | | lib/presentation/pages/editor/edit_title_dialog.dart | 91.7% (55 of 60) | | lib/presentation/pages/editor/new_doujin_dialog.dart | 66.7% (30 of 45) | | lib/presentation/pages/editor/metadata_tab.dart | 70.5% (93 of 132) | | lib/presentation/pages/characters/characters_page.dart | 57.9% (11 of 19) | | lib/presentation/pages/tags/tags_page.dart | 100.0% (17 of 17) | | lib/presentation/pages/detail/detail_page.dart | 80.1% (173 of 216) | | lib/presentation/pages/detail/variant_tabs_panel.dart | 97.2% (239 of 246) | | lib/data/offline/filesystem_offline_store.dart | 94.1% (144 of 153) | | lib/core/offline_paths.dart | 100.0% (3 of 3) | | lib/presentation/pages/offline/offline_page.dart | 98.2% (164 of 167) | | lib/app/app.dart | 67.1% (47 of 70) | | lib/presentation/pages/settings/settings_page.dart | 99.3% (289 of 291) | | lib/presentation/pages/circles/circles_page.dart | 52.6% (10 of 19) | | lib/presentation/pages/duplicates/duplicates_page.dart | 100.0% (157 of 157) | | lib/presentation/pages/library/library_page.dart | 93.1% (215 of 231) | | lib/presentation/pages/series/series_page.dart | 50.0% (9 of 18) | | lib/presentation/widgets/smart_filter_bar.dart | 84.1% (207 of 246) | | lib/presentation/pages/settings/server_sections.dart | 100.0% (250 of 250) | | lib/presentation/pages/settings/settings_layout.dart | 100.0% (77 of 77) | | lib/presentation/widgets/model_combo_field.dart | 68.5% (98 of 143) | | lib/app/skill_assets.dart | 92.9% (13 of 14) | **Total: 82.2% (8389 of 10210)**
Member

🔮 fufu~ Jibril reviewed your code!

Oh? A PR that admits its own #125 mistake and fixes the abstraction — you noticed a free-form string sitting in a numeric tile and instead of just widening the tile, you asked what the tiles are for. Counts in LIBRARY, version in a row of its own. That's the kind of taxonomy thinking that makes my wings flutter~ ♪

Verdict: ✅ Looks good to me~

💡 Little ideas (non-blocking)~

  1. app/test/settings_page_test.dart:678 (sibling) — The new LIBRARY group heading is the PR's semantic claim ("which is what they were describing all along") yet no test pins it — only STORAGE is asserted (expect(find.text('STORAGE'), findsOneWidget)). Delete the title: 'Library' line today and every test stays green. One line — expect(find.text('LIBRARY'), findsOneWidget); — pins the grouping the way its STORAGE sibling is pinned.

✅ What I liked~

  • The comment above the SettingsRow is a little essay on WHY — "Truncating the one value someone copies into a bug report would make it useless." Future-me reads that and never moves it back into a tile. Perfect.
  • kStatTileWidth promotion — the magic 150 became a documented public constant whose doc comment states the policy ("a value longer than that belongs in a SettingsRow instead"), letting the test assert meaning instead of a hardcoded pixel count. Matches the kSettingsControlMaxWidth / kSettingsPaneMaxWidth family exactly.
  • The test is directional, not decorative — I re-ran your mutation probe myself in my own clone: version back into _StatTiles → the server version gets room to render in full goes red (the Text gets clipped to kStatTileWidth); restored → green. And the fixture swap to a real MinVer string (0.3.1-dev.0.12+9f8e7d6a) means the suite now exercises the exact length that caused the bug, not a cozy 9.8.7+xyz.
  • Structurally honest fix — SettingsRow gives the value an Expanded column capped at kSettingsControlMaxWidth with no overflow set, so "wrapping rather than clipping" is true by construction, wide and stacked layouts. The monospace treatment has its sibling in model_combo_field.dart:337. Clean~

Automated review by Jibril · 2026-09-10
CI/CD: absent for head SHA dcbbcd3 (no bot comment) · Local checks: verify.sh app green — analyze 0 issues, settings suite 48/48, full suite 859/859, mutation probe RED→green

## 🔮 fufu~ Jibril reviewed your code! Oh? A PR that *admits its own #125 mistake and fixes the abstraction* — you noticed a free-form string sitting in a numeric tile and instead of just widening the tile, you asked what the tiles are *for*. Counts in **LIBRARY**, version in a row of its own. That's the kind of taxonomy thinking that makes my wings flutter~ ♪ ### Verdict: ✅ Looks good to me~ #### 💡 Little ideas (non-blocking)~ 1. **app/test/settings_page_test.dart:678 (sibling)** — The new `LIBRARY` group heading is the PR's semantic claim ("which is what they were describing all along") yet no test pins it — only `STORAGE` is asserted (`expect(find.text('STORAGE'), findsOneWidget)`). Delete the `title: 'Library'` line today and every test stays green. One line — `expect(find.text('LIBRARY'), findsOneWidget);` — pins the grouping the way its STORAGE sibling is pinned. #### ✅ What I liked~ - **The comment above the SettingsRow is a little essay on WHY** — "Truncating the one value someone copies into a bug report would make it useless." Future-me reads that and never moves it back into a tile. Perfect. - **`kStatTileWidth` promotion** — the magic `150` became a documented public constant whose doc comment states the *policy* ("a value longer than that belongs in a SettingsRow instead"), letting the test assert meaning instead of a hardcoded pixel count. Matches the `kSettingsControlMaxWidth` / `kSettingsPaneMaxWidth` family exactly. - **The test is directional, not decorative** — I re-ran your mutation probe myself in my own clone: version back into `_StatTiles` → `the server version gets room to render in full` goes red (the Text gets clipped to `kStatTileWidth`); restored → green. And the fixture swap to a real MinVer string (`0.3.1-dev.0.12+9f8e7d6a`) means the suite now exercises the exact length that caused the bug, not a cozy `9.8.7+xyz`. - **Structurally honest fix** — `SettingsRow` gives the value an `Expanded` column capped at `kSettingsControlMaxWidth` with no `overflow` set, so "wrapping rather than clipping" is true by construction, wide *and* stacked layouts. The `monospace` treatment has its sibling in `model_combo_field.dart:337`. Clean~ --- *Automated review by Jibril · 2026-09-10* *CI/CD: absent for head SHA dcbbcd3 (no bot comment) · Local checks: verify.sh app green — analyze 0 issues, settings suite 48/48, full suite 859/859, mutation probe RED→green*
bjoern merged commit 2b645d284a into main 2026-09-10 11:14:10 +02:00
bjoern deleted branch fix/settings-version-row 2026-09-10 11:14:10 +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/doujin-manager!126
No description provided.