Implement a GitHub ticket end-to-end. The acceptance criteria are the spine: pin them first, aim every test at them, stop only when they are met.
Steps
- Pin the acceptance criteria.
gh issue view <number>; restate what "done" means before writing code. Done when you can name each criterion the change must satisfy. - Build and prove, in a loop. Implement, then prove the behaviour in the fast
test layer (browserless / Vitest /
@SpringBootTest) — cheaper than a browser, so carry as much as possible here. Loop until the suite proves every acceptance criterion; a green suite that doesn't is not done. - Visually verify — only when appearance changed. Browserless tests prove a
component is present and behaves; they cannot judge spacing, alignment,
overflow, colour, or responsive layout. So visually verify exactly when the
change alters something only the eye can catch — new or restyled layout/
component, a changed theme token, a field added to a form. When it doesn't —
data, logic, or config rendered through existing, already-styled UI — skip it:
the green suite plus a direct check (SQL query,
flyway validate) is the verification. When you visually verify, follow thevisual-verificationskill and view every route the ticket touches. - Design spec — conform or author, depending on origin. When the change
touches a component's appearance, check
docs/design/components/and let the spec's Origin decide which way authority runs.designorigin — the spec is the contract. Take tokens and states from it rather than choosing values; a difference is a bug in your code. Never edit the spec to match what you built — that turns the contract into a transcript and makes the drift invisible. Where the design has moved, or a component you are building has no file, runfigma-survey, which owns design-origin specs.codeorigin, or a new shared component the design never drew — an error summary, an empty state, a dialog scaffold you are inventing to satisfy an ADR — the code is the source, so you author the spec, in this change. There is no design to survey. Follow the template indocs/design/components/README.md, and account for all six states withn/aplus a reason where one cannot occur.- Either way, leave Implementation for the audit. Asserting
conformsabout your own change is asserting something you did not independently check.
- Commit on a feature branch off
main.
While you work
- Vaadin specifics come from the docs, not memory. Unsure about an API, component, theme token, or styling — look it up on the Vaadin MCP server.
- Findings log tooling friction only. In
docs/findings.md(F-NNN): friction with the agent tooling (a skill or MCP server that was missing, wrong, or misleading) or with Vaadin (a missing, misleading, or broken API). A bug in the app you're building (e.g. a wrong VAT rate) is a product ticket, not a finding.