Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
eb395b7
Merge branch 'feature/system-audio-capture' into feature/mvp-ux-polish
jhosepmyr Oct 7, 2026
293d4c3
Merge branch 'feature/mvp-feature-flags' into feature/mvp-ux-polish
jhosepmyr Oct 7, 2026
85e6212
feat(ui): add provenance/review tokens and an AA-safe brand red
jhosepmyr Oct 7, 2026
c03af79
fix(ui): let textareas grow with their content and style span labels
jhosepmyr Oct 7, 2026
dbbc123
feat(i18n): add the copy for the MVP UX polish (es, en)
jhosepmyr Oct 7, 2026
5350bff
feat(discovery): add Gherkin steps and priority, status and origin ba…
jhosepmyr Oct 7, 2026
588454c
feat(discovery): dock the AI review tray to the feed and mark suggest…
jhosepmyr Oct 7, 2026
7256a92
feat(discovery): show what the AI is doing and separate the feed's st…
jhosepmyr Oct 7, 2026
a1586b6
feat(discovery): label the audio source picker and keep the bar's sta…
jhosepmyr Oct 7, 2026
1f98d3b
feat(discovery): make the backlog's order, status and origin explicit
jhosepmyr Oct 7, 2026
5b6fd19
feat(discovery): read-first story detail with Gherkin rows and unsave…
jhosepmyr Oct 7, 2026
26395e3
feat(workspace): group the optional project profile on create and set…
jhosepmyr Oct 7, 2026
2ff4184
feat(workspace): give the projects list a page header
jhosepmyr Oct 7, 2026
c01adbd
docs(screenshots): add the MVP screens for the report
jhosepmyr Oct 7, 2026
19e01e8
docs(changelog): note the MVP UX polish
jhosepmyr Oct 7, 2026
f395279
fix(ui): apply the lighter dark-mode red to text-primary
jhosepmyr Oct 7, 2026
b5b2b47
feat(i18n): add the short tray title and required-field copy
jhosepmyr Oct 7, 2026
7f6d756
feat(discovery): keep the review tray keyboard-friendly and the live …
jhosepmyr Oct 7, 2026
6c1caff
fix(discovery): let the backlog scroll on phones and flag empty story…
jhosepmyr Oct 7, 2026
ec9fa5f
fix(discovery): size the audio source options to their labels on desktop
jhosepmyr Oct 7, 2026
4cb41c5
docs(screenshots): refresh the MVP screens after the follow-up fixes
jhosepmyr Oct 7, 2026
f484246
docs(changelog): note the tray keyboard, focus and mobile backlog fol…
jhosepmyr Oct 7, 2026
410c4f5
Merge remote-tracking branch 'origin/develop' into feature/mvp-ux-polish
jhosepmyr Oct 7, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -217,6 +217,48 @@ _Feature module implementation (iam, billing, workspace, discovery) in progress.

### Changed

- **UX — MVP usability polish** (`feature/mvp-ux-polish`): a refinement pass on the MVP surfaces driven by
a heuristic evaluation with 6 users (Nielsen, impeccable critique: live session 20 → 26/40, stories
20 → 24/40), keeping the brand, behaviour and copy.
- *Live session*: the AI suggestion queue docks to the feed column as a framed **review tray** ("AI
suggestions to review", counter with prev/next, minimize) instead of floating over the session bar,
header actions and side panel; from `sm` it stops short of the feed bottom so the latest lines stay
visible. ←/→ browse it, Esc minimizes it, focus returns to it after a decision, and focusing a feed
control it covers minimizes it (WCAG 2.4.11). A status line at the live edge says what the AI is doing — listening
(with the last suggestion's age), paused, **processing the final stories after Stop**, or failed with
the backend reason. The transcript recedes into neutral bubbles with visible speaker/time
("Participante n" in Spanish); human decisions become compact "accepted/resolved by the analyst"
rows; accepting confirms that the story landed in the backlog as a draft.
- *AI vs human provenance*: new `ai` / `verified` / `pending` tokens. Everything the AI proposed reads
violet (suggestion cards, generated stories, "IA" origin chip); human-validated content reads emerald;
drafts awaiting review read amber. Priority gets its own glyph scale (critical red, high orange,
medium/low neutral), so red is no longer brand, AI, danger and priority at once.
- *Readable stories*: `hlmInput` textareas grow with their content (they were clipped at a fixed
height); stories read as their sentence and criteria as **Gherkin** steps with a keyword gutter in the
suggestion card, side panel, story detail and create page. The story detail leads with the title,
review status (with what it means) and origin, links an AI story to its capture session, and flags
unsaved story and criterion edits.
- *Backlog order*: sortable headers with a direction arrow and `aria-sort`, a visible "sorted by"
caption, priority re-ordered by meaning on the page (the API sorts the enum alphabetically), origin
and status chips (draft as an amber dashed outline), a page-scrolling chip-row layout below `sm`,
unambiguous dates, an empty state with next steps and retry on load errors. Story forms flag empty
required fields inline.
- *Audio source*: the picker is a labelled segmented control (In person / Virtual meeting) next to a
record button with a record dot and label; the virtual-meeting guidance is a calm two-step note
(share the meeting tab with its audio; wear headphones) and the missing-audio notice offers "Share
again" in place.
- *Project forms*: only the name is required and both forms say so; the optional technical profile is
one group (business context + tech stack, example placeholders, Enter-to-add hint). Settings go from
eight one-field cards to General and Technical profile, and the logo card is titled for the project.
- *Accessibility*: the brand red fill is `#dc2626` so white labels pass AA (4.83:1), red text in dark
uses a lighter step, muted text and the default focus outline meet AA, filter inputs show focus,
story titles are keyboard links, panel tabs/sort chips expose their state, the mobile session-bar
status stays announced, and new suggestions are announced politely. All measured chips are ≥ 4.5:1
in both themes.
- Report screenshots (light, 1440×900, Spanish demo data) in `docs/screenshots/mvp/`. New
`discovery.ai.*`, `discovery.queue.*`, `discovery.suggestion.*`, `stories.statusHint.*`,
`stories.origin.*`, `storyForm.*`, `projectCreate.*`, `projectSettings.*` and `common.optional/required`
keys (EN + ES); `discovery.source.hint` is replaced by `hintShare` / `hintHeadphones`.
- **Core — centralized backend error handling** (`feature/frontend-error-handling`): a shared
`messageForError` helper resolves backend errors by their machine-readable `code` against a single
top-level `errors.<CODE>` i18n block (network / per-status / generic fallback chain). Extended from the
Expand Down
Binary file added docs/screenshots/mvp/01-proyectos.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/mvp/02-nuevo-proyecto.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/mvp/03-ajustes-proyecto.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/mvp/11-backlog-historias.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added docs/screenshots/mvp/13-detalle-historia.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
101 changes: 86 additions & 15 deletions public/i18n/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@
"create": "Create",
"loading": "Loading",
"back": "Back",
"remove": "Remove"
"remove": "Remove",
"optional": "Optional",
"required": "Required"
},
"toast": {
"dismiss": "Dismiss",
Expand Down Expand Up @@ -374,8 +376,14 @@
"projectCreate": {
"title": "New project",
"subtitle": "Give it a name. You can add the tech profile later — it helps the AI but is optional.",
"advanced": "Advanced options",
"advancedHint": "Optional context the AI uses to tailor its suggestions."
"advanced": "Tech profile",
"advancedHint": "Optional context the AI uses to tailor its suggestions.",
"namePlaceholder": "e.g. Patient portal",
"descriptionPlaceholder": "What problem does it solve, and for whom?",
"contextGroup": "Business context",
"stackGroup": "Tech stack",
"chipHint": "Type a value and press Enter to add it.",
"example": "e.g. {{value}}"
},
"orgPicker": {
"title": "Choose an organization",
Expand Down Expand Up @@ -670,7 +678,10 @@
"saved": "Changes saved.",
"save": "Save changes",
"errorValidation": "Check the data and try again.",
"errorGeneric": "Could not save the changes."
"errorGeneric": "Could not save the changes.",
"logo": "Project logo",
"general": "General",
"techProfile": "Tech profile"
},
"projectRoles": {
"title": "Roles",
Expand Down Expand Up @@ -882,7 +893,23 @@
"REJECTED": "Rejected",
"MERGED": "Merged",
"EXPORTED": "Exported"
}
},
"statusHint": {
"DRAFT": "Draft: not approved yet; you can still edit it before approving.",
"APPROVED": "Approved: validated by the team.",
"REJECTED": "Rejected: discarded by the team.",
"MERGED": "Merged: folded into another story.",
"EXPORTED": "Exported: pushed to an external tracker (e.g. Jira)."
},
"origin": {
"ai": "AI",
"manual": "Manual",
"aiHint": "Generated by the AI in a capture session",
"manualHint": "Created manually"
},
"colOrigin": "Origin",
"sortedBy": "Sorted by: {{sort}}",
"emptyRecord": "Record a session"
},
"storyForm": {
"back": "Back to stories",
Expand Down Expand Up @@ -918,7 +945,16 @@
"criteriaSaved": "Criterion saved.",
"criteriaDeleted": "Criterion removed.",
"criteriaIncomplete": "Fill in Given, When and Then for each criterion.",
"criteriaPartial": "Story created, but {{count}} criterion(s) could not be saved. Add them here."
"criteriaPartial": "Story created, but {{count}} criterion(s) could not be saved. Add them here.",
"storySection": "User story",
"leadRole": "As a…",
"leadAction": "I want…",
"leadBenefit": "so that…",
"viewSession": "View source session",
"unsaved": "Unsaved changes",
"criteriaNew": "New · not saved",
"criteriaHint": "Write each criterion as a Gherkin scenario: Given (context), When (action), Then (expected outcome).",
"required": "Fill in this field."
},
"glossaryPage": {
"title": "Glossary",
Expand Down Expand Up @@ -1044,7 +1080,7 @@
"sessionSeparator": "Session",
"sessionStories": "{{count}} stories",
"sessionDefaultTitle": "Discovery session — {{date}}",
"generatedStory": "Generated story",
"generatedStory": "Generated by AI",
"speaker": "Speaker {{n}}",
"goToStory": "Go to story",
"time": {
Expand All @@ -1062,7 +1098,11 @@
},
"decision": {
"accepted": "Accepted",
"dismissed": "Dismissed"
"dismissed": "Dismissed",
"acceptedBy": "Accepted by the analyst",
"resolvedBy": "Resolved by the analyst",
"acceptedToast": "Suggestion accepted: the story is in the backlog as a draft.",
"resolvedToast": "Question marked as resolved."
},
"live": {
"banner": "Live session in progress — {{language}}"
Expand All @@ -1074,7 +1114,8 @@
"composer": {
"placeholder": "Message discovery…",
"comingSoon": "Text to pipeline is coming soon.",
"record": "Start recording"
"record": "Start recording",
"recordShort": "Record"
},
"language": {
"label": "Meeting language",
Expand All @@ -1087,7 +1128,10 @@
"mic": "In person (microphone)",
"meeting": "Virtual meeting (microphone + meeting audio)",
"unsupported": "Virtual meeting: available in desktop Chrome or Edge.",
"hint": "When sharing, pick the meeting tab and tick \"Share tab audio\". Use headphones to avoid a duplicated transcript."
"micShort": "In person",
"meetingShort": "Virtual meeting",
"hintShare": "When you press Record, pick the meeting tab and turn on “Share tab audio”.",
"hintHeadphones": "Wear headphones so your microphone doesn't pick up the meeting again and duplicate the transcript."
},
"bar": {
"recording": "Recording",
Expand All @@ -1097,7 +1141,8 @@
"stop": "Stop",
"meetingAudio": "Recording microphone + meeting audio",
"meetingAudioLost": "Meeting audio is not being captured. Share the meeting tab again.",
"reshare": "Share again"
"reshare": "Share again",
"meetingAudioShort": "Meeting audio"
},
"rec": {
"micDenied": "Microphone permission denied. Enable it in your browser settings.",
Expand All @@ -1113,13 +1158,17 @@
},
"queue": {
"pendingBadge": "{{count}} suggestions pending",
"pendingBadgeLabel": "pending suggestions",
"pendingBadgeLabel": "suggestions to review",
"counter": "{{n}} of {{m}}",
"prev": "Previous suggestion",
"next": "Next suggestion",
"collapse": "Collapse",
"minimize": "Minimize",
"dragHint": "Drag to browse suggestions"
"dragHint": "Drag to browse suggestions",
"title": "AI suggestions to review",
"announce": "{{count}} AI suggestions to review",
"expand": "Show the suggestions to review",
"titleShort": "AI · to review"
},
"suggestion": {
"type": {
Expand Down Expand Up @@ -1151,7 +1200,7 @@
"saveAndAccept": "Save & accept",
"dismiss": "Dismiss",
"edit": "Edit",
"cancelEdit": "Cancel",
"cancelEdit": "Cancel editing",
"done": "Done",
"titleField": "Title",
"scenario": "Scenario",
Expand All @@ -1165,7 +1214,16 @@
"removeCriterion": "Remove criterion",
"given": "Given",
"when": "when",
"then": "then"
"then": "then",
"aiLabel": "AI suggestion",
"aiHint": "Proposed by the AI from the conversation. Awaiting your review.",
"questionHint": "Resolving it only marks it as addressed; the backlog doesn't change.",
"changedHint": "Highlighted: what the AI proposes to change",
"criteriaCount": "Acceptance criteria ({{count}})",
"roleField": "Role · As a…",
"actionField": "Action · I want…",
"benefitField": "Benefit · so that…",
"scenarioPlaceholder": "Optional"
},
"panel": {
"stories": "Stories",
Expand Down Expand Up @@ -1227,6 +1285,19 @@
"body": "Leave this page anyway? The session keeps recording in the background and stays active.",
"stay": "Stay",
"leave": "Leave anyway"
},
"retry": "Retry",
"pendingReview": "Awaiting review",
"ai": {
"listening": "The AI is listening to the conversation",
"listeningHint": "It proposes stories, edge cases and questions as the meeting goes on; they appear above for your review.",
"lastSuggestion": "Last suggestion {{time}} · review it in the tray above.",
"paused": "Recording paused",
"pausedHint": "The AI resumes its analysis when you resume recording.",
"processing": "Processing the session",
"processingHint": "The AI is generating the final stories. This can take a few minutes.",
"failed": "The session could not be processed",
"failedHint": "Check the session history or try again later."
}
},
"integrations": {
Expand Down
Loading
Loading