Add a VERY simple bug filing modal that auto-opens issues here #114

Closed
opened 2026-08-19 02:23:16 +00:00 by Grandiras · 5 comments
Owner

Should be easy to understand for non-techies, so something like "Have a problem" or "Give feedback" with a very simple modal for only describing the issue, no complexity.

Should be easy to understand for non-techies, so something like "Have a problem" or "Give feedback" with a very simple modal for only describing the issue, no complexity.
Collaborator

🤖 On it — follow along in the action run; the reply will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the task runs.

🤖 On it — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/296); the reply will link the full session transcript. <!-- claude-run:comment --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-114/run-296.md) — updating every ~5 minutes while the task runs.
Collaborator

Added a Report a problem row to the account menu and a one-box dialog behind it, which files what a member writes as an issue on this repository.

The nav menu with the new "Report a problem" row, between "What's new" and the settings

The whole design is that the people on this board are not the people who build it. Asked to "file an issue" they would need an account on the forge, a repository and a guess at which parts matter — so the dialog asks for the one thing only they can supply, and FeedbackService attaches everything else: their username, the page they were standing on, the running version, and the language they were reading in. The title is the first line of what they wrote (cut on a word boundary at 72 chars), so reports don't all look alike in the issue list.

The dialog: a title, one sentence of intro, one textarea, the note about where it goes, and Cancel / Send

What it costs them is said before they press Send, in small type under the box: it lands in a list anyone can read, with their name on it. Success keeps the dialog open and says thank you — no issue number, no link to the tracker.

It needs configuring before it appears. Two settings, both required, and off until they are there:

  • FEEDBACK_REPOSITORY=https://git.grandiras.net/Grandiras/Ponente (the URL as it looks in a browser; the API endpoint is derived from it)
  • FEEDBACK_TOKEN= — a Forgejo access token with write:issue on that repository

Added to deploy/.env.example, deploy/.env.dev.example, both compose files and the README table. Unset, the menu row is simply not there — an offer that swallows a report is worse than no offer — and Program.cs logs one line at startup saying which of the three states it is in, on Mailer's rule. A refusal from the forge or a forge that is down is a translated sentence in the dialog and a warning in the log, never an exception on the circuit.

Also in the change: both locales, a Changelog.Unreleased bullet, a new Reporting a problem section in docs/ui.md (plus the service row in docs/orientation.md and the stub-forge note in docs/testing.md).

Verifieddotnet build clean (0 warnings) and dotnet test green, 312 passing including 11 new FeedbackServiceTests (endpoint derivation, the token auth scheme, the title cut, the body's context, the half-configuration warning, and that a refusal or an unreachable forge is a false rather than a throw). The two screenshots above are the app actually running against Postgres with a stub forge on :8092; that run also confirmed the German copy, that Escape closes without sending, and that the row disappears when the settings are removed. What the stub received:

{"title":"The board doesn't show my cards after I close the app and come back. It…",
 "body":"The board doesn't show my cards after I close the app and come back. It works again if I reload the page.\n\n---\nReported from Ponente by grandiras.net · version 2.4.0 · page `/` · language en"}

tests/e2e/feedback.spec.js pins the member-visible half; it needs the compose stack (docker-compose.test.yml now starts an issues stub on :8092), which this runner has no container engine for, so it has not been executed — run it locally with the rest of the suite.

Branch: claude/issue-114. No follow-up issues to file.


⏱ 16m 46s · 115 turns · tokens: 197.5k in / 59.9k out (+14658.6k cache-read)
📜 Full session transcript
→ Opened PR: #122

Added a **Report a problem** row to the account menu and a one-box dialog behind it, which files what a member writes as an issue on this repository. ![The nav menu with the new "Report a problem" row, between "What's new" and the settings](https://git.grandiras.net/attachments/3b9e6658-af85-4002-946a-a9e1e3eb426d) The whole design is that the people on this board are not the people who build it. Asked to "file an issue" they would need an account on the forge, a repository and a guess at which parts matter — so the dialog asks for the one thing only they can supply, and `FeedbackService` attaches everything else: their username, the page they were standing on, the running version, and the language they were reading in. The title is the first line of what they wrote (cut on a word boundary at 72 chars), so reports don't all look alike in the issue list. ![The dialog: a title, one sentence of intro, one textarea, the note about where it goes, and Cancel / Send](https://git.grandiras.net/attachments/132a2740-188a-4bcf-a1c2-d129d4328098) What it costs them is said **before** they press Send, in small type under the box: it lands in a list anyone can read, with their name on it. Success keeps the dialog open and says thank you — no issue number, no link to the tracker. **It needs configuring before it appears.** Two settings, both required, and off until they are there: - `FEEDBACK_REPOSITORY=https://git.grandiras.net/Grandiras/Ponente` (the URL as it looks in a browser; the API endpoint is derived from it) - `FEEDBACK_TOKEN=` — a Forgejo access token with `write:issue` on that repository Added to `deploy/.env.example`, `deploy/.env.dev.example`, both compose files and the README table. Unset, the menu row is simply not there — an offer that swallows a report is worse than no offer — and `Program.cs` logs one line at startup saying which of the three states it is in, on `Mailer`'s rule. A refusal from the forge or a forge that is down is a translated sentence in the dialog and a warning in the log, never an exception on the circuit. Also in the change: both locales, a `Changelog.Unreleased` bullet, a new *Reporting a problem* section in `docs/ui.md` (plus the service row in `docs/orientation.md` and the stub-forge note in `docs/testing.md`). **Verified** — `dotnet build` clean (0 warnings) and `dotnet test` green, 312 passing including 11 new `FeedbackServiceTests` (endpoint derivation, the `token` auth scheme, the title cut, the body's context, the half-configuration warning, and that a refusal or an unreachable forge is a `false` rather than a throw). The two screenshots above are the app actually running against Postgres with a stub forge on `:8092`; that run also confirmed the German copy, that Escape closes without sending, and that the row disappears when the settings are removed. What the stub received: ```json {"title":"The board doesn't show my cards after I close the app and come back. It…", "body":"The board doesn't show my cards after I close the app and come back. It works again if I reload the page.\n\n---\nReported from Ponente by grandiras.net · version 2.4.0 · page `/` · language en"} ``` `tests/e2e/feedback.spec.js` pins the member-visible half; it needs the compose stack (`docker-compose.test.yml` now starts an `issues` stub on `:8092`), which this runner has no container engine for, so it has not been executed — run it locally with the rest of the suite. Branch: `claude/issue-114`. No follow-up issues to file. --- ⏱ 16m 46s · 115 turns · tokens: 197.5k in / 59.9k out (+14658.6k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-114/run-296.md) → Opened PR: https://git.grandiras.net/Grandiras/Ponente/pulls/122
Author
Owner

@claude-bot The icon looks weird and there is far too much explanatory information in the modal.

@claude-bot The icon looks weird and there is far too much explanatory information in the modal.
Collaborator

🤖 On it — follow along in the action run; the reply will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the task runs.

🤖 On it — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/298); the reply will link the full session transcript. <!-- claude-run:comment --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-114/run-298.md) — updating every ~5 minutes while the task runs.
Collaborator

Both fixed on the same branch, so PR #122 picks them up.

The icon. It was a speech bubble drawn as a broken-off arc with a detached tail floating below it — at 18px that doesn't read as a bubble, it reads as the icon itself failing to render. It's now a closed circle with an exclamation, same stroke kit as Share, What's new and Install beside it:

The account menu: Share, What's new, and "Report a problem" with a circled exclamation icon

The words. Three things were explaining the same dialog. The intro sentence above the box ("Something broken, confusing or missing? Say it in your own words…") said what the title and the placeholder already say, so it's gone entirely — there is now nothing to read before you start typing. The note under the box listed the username, the page and the version; the page and the version are context about the app, not about the member, and spelling them out turned a disclosure into a paragraph nobody finishes. One line survives, because it is the only thing they couldn't work out for themselves: it lands somewhere public, with their name on it.

The dialog: title, one box, one line under it, Cancel and Send

German got the same cut ("Geht an die Leute, die Ponente bauen, in eine öffentliche Liste, mit deinem Benutzernamen."), and the thank-you shortened to "Thank you — somebody will take a look." Nothing else moved: the service, the config and the tests are untouched.

Verified by running it. dotnet build clean and dotnet test green (312, unchanged — the locale-parity test covers the removed key in both languages), and the screenshots above are the app against Postgres with the stub forge, where the send path still works end to end — the stub received {"title":"The board is empty after I come back to it, until I reload the page.", "body":"… Reported from Ponente by grandiras.net · version 2.4.0 · page / · language en"}. The German dialog and the thank-you state were checked in the same run. tests/e2e/feedback.spec.js asserts on classes rather than copy, so it needs no change; it still hasn't been executed here (no container engine for the compose stack).

Branch: claude/issue-114 — pushed onto the existing PR #122, no new one opened.


⏱ 6m 38s · 46 turns · tokens: 50.8k in / 14.7k out (+2149.3k cache-read)
📜 Full session transcript

Both fixed on the same branch, so PR #122 picks them up. **The icon.** It was a speech bubble drawn as a broken-off arc with a detached tail floating below it — at 18px that doesn't read as a bubble, it reads as the icon itself failing to render. It's now a closed circle with an exclamation, same stroke kit as Share, What's new and Install beside it: ![The account menu: Share, What's new, and "Report a problem" with a circled exclamation icon](https://git.grandiras.net/attachments/4dea6f17-5d73-4529-b15a-71bfb6ad2998) **The words.** Three things were explaining the same dialog. The intro sentence above the box ("Something broken, confusing or missing? Say it in your own words…") said what the title and the placeholder already say, so it's gone entirely — there is now nothing to read before you start typing. The note under the box listed the username, the page *and* the version; the page and the version are context about the app, not about the member, and spelling them out turned a disclosure into a paragraph nobody finishes. One line survives, because it is the only thing they couldn't work out for themselves: it lands somewhere public, with their name on it. ![The dialog: title, one box, one line under it, Cancel and Send](https://git.grandiras.net/attachments/22c8f79f-0a88-48bf-96b6-c4e254152fcf) German got the same cut ("Geht an die Leute, die Ponente bauen, in eine öffentliche Liste, mit deinem Benutzernamen."), and the thank-you shortened to "Thank you — somebody will take a look." Nothing else moved: the service, the config and the tests are untouched. **Verified** by running it. `dotnet build` clean and `dotnet test` green (312, unchanged — the locale-parity test covers the removed key in both languages), and the screenshots above are the app against Postgres with the stub forge, where the send path still works end to end — the stub received `{"title":"The board is empty after I come back to it, until I reload the page.", "body":"… Reported from Ponente by grandiras.net · version 2.4.0 · page `/` · language en"}`. The German dialog and the thank-you state were checked in the same run. `tests/e2e/feedback.spec.js` asserts on classes rather than copy, so it needs no change; it still hasn't been executed here (no container engine for the compose stack). Branch: `claude/issue-114` — pushed onto the existing PR #122, no new one opened. --- ⏱ 6m 38s · 46 turns · tokens: 50.8k in / 14.7k out (+2149.3k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-114/run-298.md)
248 KiB
239 KiB
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 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
Grandiras/Ponente#114
No description provided.