Skip to content

feat(feedback): FleetCrown users can finally report bugs in FleetCrown - #472

Merged
github-actions[bot] merged 1 commit into
mainfrom
feat/in-app-feedback-widget
Sep 3, 2026
Merged

feat(feedback): FleetCrown users can finally report bugs in FleetCrown#472
github-actions[bot] merged 1 commit into
mainfrom
feat/in-app-feedback-widget

Conversation

@catomean

@catomean catomean commented Sep 3, 2026

Copy link
Copy Markdown
Collaborator

Asked directly: where is the feedback widget on FleetCrown itself, and how does a user give feedback about the site they are using?

Measured on the live app — feedbackWidgetPresent: false, no widget script loaded at all. The only thing in the corner is the Loki assistant button.

A signed-in FleetCrown user has had no way to report a bug in FleetCrown.

The allowlist, and its two reasons

The widget was scoped to eleven public marketing routes. Its comment gave two justifications; both were checked:

Stated reason Verdict
"the FAB would collide with the app shell's mobile nav" Was true — and is exactly what auto-avoid fixed in #466/#467
"in-app feedback already has Loki" Not true

insertSiteFeedback has exactly one caller — the widget's ingest route — and the word "feedback" does not appear in loki-core.ts. Telling the assistant "this button is broken" produces no site_feedback row, nothing in the triage inbox, nothing dispatchable.

On the collision: the desktop Loki FAB is 56px at bottom:28/right:28, which the feedback FAB at bottom:16/right:16 overlapped exactly — rectangle-matching auto-avoid now steps it up. The mobile nav is inset-x-3 (~94% of viewport), deliberately too wide for the rectangle scan to treat as an obstacle, so the ≤480px interactive hit-test catches its nav links instead. Both paths covered.

Inverted the rule

Render everywhere except a short list, each entry carrying its reason:

  • /terminal — a floating button over live PTY output covers what you are reading
  • the auth routes — you are not in the product yet; an anonymous FAB on a credential form is the wrong invitation
  • /docs/feedback-widget — a launcher on the page that documents launchers makes "is this yours or the demo's?" unanswerable

An allowlist meant every new page shipped with no way to report a bug on it, and nobody noticed — because a missing feedback channel is invisible in exactly the way the problems it would have caught are.

PublicFeedbackWidgetDogfoodFeedbackWidget: it is no longer public-only, and a name saying otherwise is the stale labelling this area already had too much of.

Verification

scripts/test/feedback-widget-reach.ts — 42 assertions:

  • every app surface reachable (/control, /projects, /today, /loki, …)
  • public pages still reachable
  • exclusions excluded, including nested paths
  • near-misses not swallowed by prefix matching (/terminals/terminal, /settings is an app page)
  • widget mounted from the root layout, so new pages inherit it
  • loki-core still cannot file feedback — the premise that justified the old scoping

Proven by mutation: restoring a public-only allowlist turns 20 assertions red, including every app surface.

npm run verify exits 0.

Asked directly: where is the feedback widget on FleetCrown itself, and how
does a user give feedback about the site they are using? Measured on the
live app — feedbackWidgetPresent: false, no widget script loaded at all.
The only thing in the corner is the Loki assistant button.

The widget was scoped to eleven public marketing routes by an allowlist
whose comment gave two reasons. Both were checked:

  "the FAB would collide with the app shell's mobile nav"
    True when written, and fixed earlier today. The widget now measures its
    corner and steps aside — rectangle matching for the desktop Loki FAB
    (56px at bottom:28, which the feedback FAB overlapped exactly), and an
    interactive hit-test below 480px for the mobile nav, which is inset-x-3
    and therefore too wide for the rectangle scan to treat as an obstacle.

  "in-app feedback already has Loki"
    Not true. insertSiteFeedback has exactly one caller — the widget's
    ingest route — and the word "feedback" does not appear in loki-core.ts.
    Telling the assistant "this button is broken" produces no site_feedback
    row, nothing in the triage inbox, nothing dispatchable. A signed-in
    user's only option was to tell the operator out of band.

So the rule is inverted: render everywhere EXCEPT a short list, each entry
carrying its reason — /terminal (a FAB over live PTY output covers what you
are reading), the auth routes (you are not in the product yet), and
/docs/feedback-widget (a launcher on the page documenting launchers is an
unanswerable "is this yours or the demo's?").

An allowlist meant every new page shipped with no way to report a bug on
it, and nobody noticed, because a missing feedback channel is invisible
exactly the way the problems it would have caught are.

PublicFeedbackWidget is now DogfoodFeedbackWidget: it is no longer public-
only, and a name that says otherwise is the kind of stale label this page
already had too much of.

Pinned by scripts/test/feedback-widget-reach.ts (42 assertions): every app
surface reachable, public ones still reachable, exclusions excluded
including nested paths, near-misses like /terminals and /settings NOT
swallowed by prefix matching, the widget mounted from the root layout so
new pages inherit it, and loki-core still unable to file feedback — the
premise that justified the old scoping.

Proven by mutation: restoring a public-only allowlist turns 20 assertions
red, including every app surface.
@github-actions
github-actions Bot merged commit 46c21c2 into main Sep 3, 2026
3 checks passed
@github-actions
github-actions Bot deleted the feat/in-app-feedback-widget branch September 3, 2026 13:12
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