Skip to content

AI agent: plan checklist UX + test-debt follow-ups (deferred from 3e) #76

Description

@kipavy

Roll-up of the UX/polish findings deferred by the 3e (plan checklist / "Approve & run") review. None is an authority path — the approval gate is independently correct in every case below; these are places where the card tells the user less than it could, or tells them something ambiguous.

Display fidelity

  • Duplicate connection names. A step renders ScopeLabel's label only and drops detail, so a plan mixing two same-named connections looks like one target. Duplicate names are known to exist in this product.
  • Badge explanation lives only in a title attribute — invisible on touch, invisible to most keyboard users.
  • Badge is ambiguous next to "Approve plan". It means "will still ask even if you pre-authorize", but under Approve plan (ask) nothing is pre-authorized, so the user who picked the conservative button is then surprised by cards on unbadged steps too.
  • Invisible-but-nonempty commands (3e task 1, m1): the residual after the hasShellMetacharacter widening is trim() equivalence collapse.
  • Duplicate step ids degrade oddly — React duplicate-key warning, both rows tick together. Unreachable today; worth a guard or a comment saying why it can't happen.

Dead-end states

  • Removing every step still offers "Approve & run"Plan — 0 steps renders with all three buttons enabled, and approving silently leaves plan mode having authorized nothing.
  • A plan parked when the run errors is never reaped (3e task 3, minor 3). It self-heals on the next send, but until then the user sees a live grant card with no run behind it.

Test debt (found by mutation, all currently green)

  • The whole read-only half of PlanCard is unpinned — mutants that drop "this plan is no longer active" and similar survive all tests.
  • Transcript's plan dispatch has no test at all — there is no Transcript.test.tsx.
  • p.planId !== planId untested (task 3, minor 2); proposePlan accepts a dead generation (task 3, minor 4).

i18n

  • ru plan.heading omits _other, breaking the file's own convention.
  • fr outcome.abandoned is "n'est plus actif", a clause where the sibling strings are noun phrases.

Reference

.superpowers/sdd/3e/task-6-review.md (minors 2–9), task-3-review.md, and whole-branch-review.md §5 rows 6, 13, 17, 25.

Metadata

Metadata

Assignees

No one assigned

    Labels

    ai-agentBYOK AI agent featureenhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions