Skip to content

fix: regroup the task-agent footer by question and shed route segments#3597

Merged
matthiasn merged 2 commits into
mainfrom
feat/task_agent_footer_polish
Jul 25, 2026
Merged

fix: regroup the task-agent footer by question and shed route segments#3597
matthiasn merged 2 commits into
mainfrom
feat/task_agent_footer_polish

Conversation

@matthiasn

@matthiasn matthiasn commented Jul 25, 2026

Copy link
Copy Markdown
Owner

Follow-up to #3591, driven by the design panel's round-2 verdict.

Scores

Round Experts Personas
1 — baseline (before #3591) 4.08 3.8 — all five "would-struggle"
2 — as merged in #3591 6.17 6.0 — four of five flipped to "would-use"
3 — first half of this PR 6.5 6.1
4 — this PR rating in flight rating in flight

Both panels are deliberately grumpy (10 = ship-grade, 8 = only polish left).
Every round re-rates freshly generated screenshots; no score is carried over.

What changed, and why

Grouping. "When does it update" was split across the full card width with
the manual trigger wedged between the halves, which made "Automatic updates"
read as a caption for the button. The row now presents two groups: state and
its remedy lead (freshness word + trigger), and the switch keeps its own
readout (countdown + Skip) on the trailing rail, separated by a real step6
gap rather than leftover spaceBetween slack. Stacked, the schedule sits
tight against the switch it belongs to with the larger gap between the two
questions — evenly spaced rows let the countdown read as the manual run's ETA.

Emphasis. The trigger was outlined, which is literally the same button
as Confirm all (proposals_section_part.dart:187) — the card's hero action.
It drops to the design system's text tier, so exactly one outlined action
remains and it belongs to the proposals.

Truncation. Routes are structured, so they shed whole segments instead of
characters: Qwen 3.5 Plus · Alibaba · via Melious.aiQwen 3.5 Plus · Melious.aiQwen 3.5 Plus. An ellipsis ate the serving provider — the one
fact the row exists to disclose — and left the connective "via" behind
(This rep… GLM 5.2 · Z.ai · via OpenRou…). The fixed "This report" label
never gives ground; only its route does.

Alignment. DesignSystemButton pays its own step3 content inset, so a
button box on the leading edge put its glyph 8px inside it — invisible until
the row stacked, then a broken column, and a direct contradiction of the
footer's own docstring. The row negates that inset, and a test asserts the
column at 320px in German rather than a comment claiming it. The switch also
moves to the trailing edge of its 48px slot: centring a 40px track left it
short of the rail the TTS button and proposal cards terminate on.

Also: the countdown joins the freshness word in the state register, so it
stops reading as the same class of information as the static model route; the
attribution line's vertical padding is top-only, so the card's bottom margin
no longer depends on whether provenance happens to differ; the model row's
tooltip names its action instead of repeating a visible label; and the
schedule says nothing while a run is in flight, where "Updates when this task
changes" beside a spinner described a state the card was not in.

Copy. "Skip" → "Skip once" — the persona panel could not tell whether it
skipped one run or disabled automation. Plus a new
taskAgentChangeSetupTooltip. Both hand-authored across all 11 locales.

One recommendation I did not follow

The panel wants aiCard.footerWash changed at the token source (it argues a
black multiply cannot separate a band on a near-black card). That is a Figma
-exported token consumed by generated code, so it is not mine to edit —
flagging it rather than working around it in the widget.

Testing

Analyzer clean (zero warnings, zero infos), formatter clean, 2212 tests
green
across test/features/agents/ui/ and test/features/tasks/ui/. New
coverage for the segment ladder, the stacked leading column, and the
running-state schedule suppression.

Version bumped to 0.9.1070+4256 at the maintainer's request.

Summary by CodeRabbit

  • New Features

    • AI summary update controls are clearer, with separate action groups and countdowns aligned to their related settings.
    • Scheduled updates can now be canceled with a clearly labeled “Skip once” action.
    • AI model and provider details adapt to narrow spaces by removing complete segments instead of cutting words short.
    • Added a tooltip for changing the AI setup, with expanded localization coverage.
  • Bug Fixes

    • Improved row alignment across screen sizes and languages.
    • Preserved consistent card spacing when report attribution is absent.
    • Hid scheduled-update details while an update is running.

@gemini-code-assist

Copy link
Copy Markdown
Contributor

Caution

The consumer version of Gemini Code Assist on GitHub has been sunset. All code review activity has officially ceased.

@coderabbitai

coderabbitai Bot commented Jul 25, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@matthiasn, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 26 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 6b3c2017-88c4-439d-93b3-63a2b8834e49

📥 Commits

Reviewing files that changed from the base of the PR and between c880634 and 2d73e60.

📒 Files selected for processing (35)
  • CHANGELOG.md
  • flatpak/com.matthiasn.lotti.metainfo.xml
  • lib/features/agents/README.md
  • lib/features/agents/ui/task_agent_automation_row.dart
  • lib/features/agents/ui/task_agent_identity_region.dart
  • lib/features/agents/ui/task_agent_model_identity.dart
  • lib/features/design_system/README.md
  • lib/features/design_system/components/buttons/design_system_button.dart
  • lib/features/design_system/widgetbook/design_system_button_widgetbook.dart
  • lib/l10n/app_cs.arb
  • lib/l10n/app_da.arb
  • lib/l10n/app_de.arb
  • lib/l10n/app_en.arb
  • lib/l10n/app_es.arb
  • lib/l10n/app_fr.arb
  • lib/l10n/app_it.arb
  • lib/l10n/app_localizations.dart
  • lib/l10n/app_localizations_cs.dart
  • lib/l10n/app_localizations_da.dart
  • lib/l10n/app_localizations_de.dart
  • lib/l10n/app_localizations_en.dart
  • lib/l10n/app_localizations_es.dart
  • lib/l10n/app_localizations_fr.dart
  • lib/l10n/app_localizations_it.dart
  • lib/l10n/app_localizations_nl.dart
  • lib/l10n/app_localizations_pt.dart
  • lib/l10n/app_localizations_ro.dart
  • lib/l10n/app_localizations_sv.dart
  • lib/l10n/app_nl.arb
  • lib/l10n/app_pt.arb
  • lib/l10n/app_ro.arb
  • lib/l10n/app_sv.arb
  • test/features/agents/ui/ai_summary_card/lifecycle_test.dart
  • test/features/agents/ui/task_agent_automation_row_test.dart
  • test/features/agents/ui/task_agent_identity_region_test.dart
📝 Walkthrough

Walkthrough

The task-agent summary card now uses separated automation control clusters, responsive stacking, tiered model identity rendering, updated “Skip once” and setup tooltip localizations, expanded UI tests, and version 0.9.1070 release metadata.

Changes

Task-agent summary card UI

Layer / File(s) Summary
Automation control clusters and responsive layout
lib/features/agents/ui/task_agent_automation_row.dart, test/features/agents/ui/task_agent_automation_row_test.dart, test/features/agents/ui/ai_summary_card/lifecycle_test.dart
Automation controls are split into freshness and schedule groups, schedule content is hidden while running, responsive stacking and alignment are recalculated, and tests cover the updated behavior.
Tiered model identity rendering
lib/features/agents/ui/task_agent_model_identity.dart, lib/features/agents/ui/task_agent_identity_region.dart, test/features/agents/ui/task_agent_identity_region_test.dart
Identity strings are generated as whole-segment tiers and rendered using the widest tier that fits available space.
Localized task-agent labels
lib/l10n/*.arb, lib/l10n/app_localizations*.dart
A setup-change tooltip is added across locales, and scheduled-update cancellation labels specify “Skip once”.
Version and release metadata
pubspec.yaml, CHANGELOG.md, flatpak/com.matthiasn.lotti.metainfo.xml
The package version is incremented to 0.9.1070+4256, with matching changelog and Flatpak release entries.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Possibly related PRs

Suggested reviewers: cyberk1ng

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title matches the main UI refactor and route-segment truncation changes in the task-agent footer.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/task_agent_footer_polish

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Jul 25, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 99.15%. Comparing base (5233f4b) to head (2d73e60).

Additional details and impacted files
@@           Coverage Diff           @@
##             main    #3597   +/-   ##
=======================================
  Coverage   99.15%   99.15%           
=======================================
  Files        1784     1784           
  Lines      131005   131044   +39     
=======================================
+ Hits       129899   129938   +39     
  Misses       1106     1106           
Flag Coverage Δ
glados 14.06% <0.00%> (-0.01%) ⬇️
standard 98.90% <100.00%> (+<0.01%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: c880634825

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread lib/features/agents/ui/task_agent_automation_row.dart
Design-panel round 2 scored the merged footer 6.17/10 (experts) and 6.0/10
(personas), up from 4.08/3.8. This applies its consensus must-fixes.

Grouping. "When does it update" was split across the full card width with the
manual trigger wedged between the halves, which made "Automatic updates" read
as a caption for the button. The row now presents two groups: state and its
remedy lead (freshness word + trigger), and the switch keeps its own readout
(countdown + Skip) on the trailing rail, separated by a real step6 gap rather
than leftover `spaceBetween` slack. Stacked, the schedule sits tight against
the switch it belongs to, with the larger gap between the two questions —
evenly spaced rows let the countdown read as the manual run's ETA.

Emphasis. The trigger was `outlined`, which is literally the same button as
`Confirm all` (proposals_section_part.dart:187) — the card's hero action. It
drops to the design system's text tier, so exactly one outlined action remains
and it belongs to the proposals.

Truncation. Routes are structured, so they now shed whole segments instead of
characters: "Qwen 3.5 Plus · Alibaba · via Melious.ai" → "Qwen 3.5 Plus ·
Melious.ai" → "Qwen 3.5 Plus". An ellipsis ate the serving provider — the one
fact the row exists to disclose — and left the connective "via" behind. The
fixed "This report" label never gives ground; only its route does.

Alignment. `DesignSystemButton` pays its own step3 content inset, so a button
box on the leading edge put its glyph 8px inside it — invisible until the row
stacked, then a broken column, and a direct contradiction of the footer's own
docstring. The row negates that inset, and a test now asserts the column at
320px in German rather than a comment claiming it. The switch also moves to
the trailing edge of its 48px slot: centring a 40px track left it short of the
rail the TTS button and the proposal cards terminate on.

Also: the countdown joins the freshness word in the state register so it stops
reading as the same class of information as the static model route; the
attribution line's vertical padding is top-only, so the card's bottom margin
no longer depends on whether provenance happens to differ; the model row's
tooltip names its action instead of repeating a visible label; and the
schedule says nothing at all while a run is in flight, where "Updates when
this task changes" beside a spinner described a state the card was not in.

Copy: "Skip" becomes "Skip once" — the persona panel could not tell whether it
skipped one run or disabled automation. New `taskAgentChangeSetupTooltip`.
Both hand-authored across all 11 locales.
Design-panel rounds 3 and 4 (6.5/6.1 then 6.58/6.4) kept returning to the same
two complaints, so this addresses them at the source rather than in the widget.

`DesignSystemButton` gains a `dense` size whose label is
`typography.styles.others.caption`. The footer trigger was `small`, which is
14/600 — the same type as `Confirm all` one hairline above it — so a settings
action was tied with the card's hero action on weight even after it stopped
being `outlined`. Additive: no existing call site changes.

Accent now means exactly one thing in the band, "this starts work". It was on
the trigger, on `Skip once`, and on the fresh-state check glyph at once, so two
opposite actions and a passive status shared one colour on one line. Only the
trigger keeps it; Skip carries its affordance through the underline.

The attribution line's ink was also backwards: the fixed "This report" label
was brighter than the route it labels. Swapped, so emphasis points at the
payload.

Docs: the agents README described three question-groups, the former
status/trigger/switch stacking, `Skip`, and identity rows that "truncate with
the full route in the tooltip" — all superseded by the two-group layout,
`Skip once`, segment shedding and the action-only setup tooltip. Rewritten,
including the fit-decision diagram, which now shows the two extra stacking
tiers. The design-system README documents the new size.
@matthiasn
matthiasn force-pushed the feat/task_agent_footer_polish branch from c880634 to 2d73e60 Compare July 25, 2026 22:16
@matthiasn
matthiasn merged commit d7a6294 into main Jul 25, 2026
28 checks passed
@matthiasn
matthiasn deleted the feat/task_agent_footer_polish branch July 25, 2026 22:28

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 2d73e609fd

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +292 to +296
DesignSystemButtonSize.dense => _ButtonSizeSpec(
labelStyle: tokens.typography.styles.others.caption,
iconSize: tokens.typography.lineHeight.caption,
horizontalPadding: tokens.spacing.step2,
verticalPadding: tokens.spacing.step2,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve a full-size touch target for dense buttons

When dense is used by the new taskAgentWakeButton, the 16 px caption line plus two 4 px vertical insets makes the button's InkWell only 24 px high. DesignSystemButton adds no minimum hit-area constraint, so touch users must land on a target half the 48 px size used by the adjacent toggle; keep the dense visual treatment while providing a full-size interaction target.

Useful? React with 👍 / 👎.

Comment on lines +607 to +612
size: DesignSystemButtonSize.dense,
// Tertiary, not outlined: this is a settings-zone action and must read
// one tier below "Confirm all", the only thing on the card that changes
// the user's own task. It stays labelled — an icon-only glyph beside an
// automation switch is exactly the ambiguity the worded Skip refuses.
variant: DesignSystemButtonVariant.tertiary,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep the dense tertiary label at AA contrast

In the light theme, combining the new 12 px caption size with the tertiary foreground paints Update now in interactive.enabled (#1F7963) over the composited footer background at only about 4.1:1 contrast, below the 4.5:1 requirement for normal text. This makes the footer's always-present manual action difficult to read for low-vision users; use a foreground or variant that retains the quieter hierarchy without dropping below the normal-text threshold.

Useful? React with 👍 / 👎.

Comment on lines +229 to +232
Text(
label,
maxLines: 1,
style: caption.copyWith(color: ai.faintMeta),

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use a readable token for the report attribution label

In the light theme, ai.faintMeta composites to roughly 2.6:1 against the footer wash while this is 12 px caption text. Because “This report” distinguishes the historical report route from the current setup, it is meaningful text rather than decorative metadata, and low-vision users can no longer reliably tell which model identity the second row describes; keep this label on a token that meets normal-text contrast.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant