Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
e5abbf4
fix(seo): use locale-prefixed URL for JSON-LD and twitter:url
MaryWylde Apr 28, 2026
b29ca2a
chore: replace Cypress with Playwright and add internal QA agent
MaryWylde May 11, 2026
0bf40af
Merge pull request #103 from keepsimpleio/chore/playwright-and-qa-too…
MaryWylde May 11, 2026
cbd5a90
chore: sync yarn.lock with package.json
MaryWylde May 11, 2026
3e5ba3f
Merge pull request #104 from keepsimpleio/chore/playwright-and-qa-too…
MaryWylde May 11, 2026
ccf9ea2
feat(auth): add magic-link sign-in and Twitter/Yandex/Mail.ru/LinkedI…
MaryWylde May 11, 2026
a4f8300
Merge pull request #105 from keepsimpleio/feat/auth-providers-and-mag…
MaryWylde May 11, 2026
96f2000
feat(longevity): animate brain age, workout, and nav with reduced-mot…
MaryWylde May 11, 2026
720f015
Merge pull request #106 from keepsimpleio/feat/longevity-animations
MaryWylde May 11, 2026
ecb3f27
fix: guard mixpanel calls without token and correct avatar fallback path
MaryWylde May 11, 2026
a034a34
Merge pull request #107 from keepsimpleio/fix/mixpanel-and-avatar
MaryWylde May 11, 2026
640b55e
Merge pull request #92 from keepsimpleio/fix/seo-locale-canonical-url
MaryWylde May 11, 2026
397bb3b
chore(security): sanitize CMS HTML, add security headers, refine auth UI
MaryWylde May 12, 2026
48053ea
Merge pull request #109 from keepsimpleio/security/cms-xss-headers-auth
MaryWylde May 12, 2026
4691c08
merge: phase 1-3 — fold UXCoreOSS src/ into src/uxcore/, namespace im…
manager May 14, 2026
445d87e
merge: phase 2b-2e + top-level lib bridge — build now passes typechec…
manager May 14, 2026
d350403
fix(articles): wrap getArticleNewPaths in try/catch so build survives…
manager May 14, 2026
b86dd87
fix(build): monkey-patch fetch during build to absorb Strapi HTML res…
manager May 14, 2026
c12d0f3
fix(build): wrap getStaticPaths in /uxcore/[slug] and /uxcg/[slug] wi…
manager May 14, 2026
ccfa5c3
fix(build): scope fetch monkey-patch to *.keepsimple.io, drop NEXT_PH…
manager May 14, 2026
7e146e1
fix(build): inject fetch patch via NODE_OPTIONS=--require so workers …
manager May 14, 2026
72cb6b7
fix(uxcore-context): safe default Proxy so useContext doesnt return null
manager May 14, 2026
c3ebb6b
fix(layout): route-split _app so UX Core pages use UX Core's own Layout
manager May 14, 2026
ef27a11
fix(fonts): load UX Core @font-face declarations + scope Lato default
manager May 14, 2026
58a8308
fix(uxc-slug): pass biases as prop to /uxcore/[slug] + /uxcg/[slug]
manager May 14, 2026
399b1e6
fix(uxc-context): real UX Core GlobalContext.Provider bridged in _app…
manager May 14, 2026
f207762
fix(uxc-dark): restore bias-modal questions section + UXCG dark contrast
manager May 15, 2026
463d651
fix(uxc-dark): polish dropdown/button/icon/login contrast in dark mode
manager May 15, 2026
010358e
fix(uxc-dark): drop App-Router usePathname() from Pages-Router layout
manager May 15, 2026
fb2fe14
fix(uxc-dark): more router.asPath hydration leaks on /uxcore#hr
manager May 15, 2026
77085ad
fix(uxc): make View-type + Use-cases switcher buttons clickable
manager May 15, 2026
2fa2586
fix(fonts): consolidate UX Core @font-face into globals.scss
manager May 15, 2026
c8c48a4
Merge branch 'fix/uxc-layout-route-split' into feat/uxc-dark-2
manager May 15, 2026
4621907
fix(uxc-dark): keep lang flags coloured + dark bias-popup tooltip
manager May 15, 2026
5dd51b3
fix(uxc-dark): keep selected navbar icons visible on hover
manager May 15, 2026
6bb7c21
fix(uxc): unblock View-type + Use-cases switcher clicks
manager May 15, 2026
f606465
fix(uxc-dark): make UXCG stage filter buttons visible
manager May 15, 2026
55f030d
fix(uxc-dark): dark theme for Our Projects + Log In modals; kill layo…
manager May 15, 2026
95b7e6d
feat(uxc-dark): Contact Us dark theme + cross-realm theme sync
manager May 15, 2026
b52387b
fix(uxc-dark): unbreak DEV build — pure-selector rule for dark <hr>
manager May 15, 2026
a540f37
fix(uxc-dark): visible X icon + dark + scrollable keepsimple Log In m…
manager May 15, 2026
44a4ff8
feat(uxc-dark): polish modal scroll + fade transitions + UXCP dark mode
manager May 15, 2026
062cbc1
fix(uxc-dark): kill modal-open layout shift; polish UXCP dark theme
manager May 15, 2026
d33b4ed
fix(uxc-dark): unbreak UXCP dark page bg + allow flag CDN
manager May 15, 2026
b7d8f1a
fix(uxc-dark): close the rest of the UXCP dark-mode gaps
manager May 15, 2026
74fea32
fix(uxc-dark): unbreak Decision Table cells + pagination + stage chip
manager May 15, 2026
90da069
fix(uxc-dark): make UXCP cycling subtitle word visible on dark
manager May 15, 2026
c9bf087
fix(uxc-dark): force stage-pill label visible + lift question row text
manager May 15, 2026
f35d16b
feat(uxc-dark): dark theme for the UX Core Awareness Test (/uxcat)
manager May 15, 2026
8f1c6b9
fix(uxc-dark): close the rest of the UXCP dark-mode gaps
manager May 15, 2026
902577b
fix(uxc-dark): visible /uxcat accordion chevron, section titles, tool…
manager May 15, 2026
415dbd0
fix(uxc-dark): address Mary's PR #114 review
manager May 15, 2026
30996bf
Merge pull request #114 from keepsimpleio/feat/uxc-dark-2
MaryWylde May 15, 2026
88bcd4f
chore(uxc): import-sort autofix + Oswald-Bold path
manager May 15, 2026
a0f2a9a
Merge pull request #115 from keepsimpleio/chore/uxc-dark-followups
MaryWylde May 15, 2026
6910b08
feat(widget): global concierge pill + spatial-aware RAG widget
manager May 15, 2026
c659b86
Merge pull request #110 from keepsimpleio/feat/global-widget
MaryWylde May 15, 2026
dff743b
feat(widget): homepage starter Q&A carve-out + UXCAT auth-gate
manager May 15, 2026
c17b6ab
fix(widget): drop in-card pick highlight + correct bias count to 100+
manager May 15, 2026
29873a4
fix(widget): starter thinking-stream + dark-mode bold visibility
manager May 15, 2026
3e51668
fix(widget): bump starter thinking pause to 1.5s
manager May 15, 2026
234f3e8
feat(widget): typewrite ALL bot text through one throttle
manager May 15, 2026
683d81d
fix(widget): trim Q1 answer + 2.2s think pause + drop card hover halo
manager May 15, 2026
c256772
fix(widget): exclude widget anchors from host-highlight scan
manager May 15, 2026
94829d5
revert(widget): restore card hover + picked + YOUR PICK badge
manager May 15, 2026
1e1d8ae
feat(widget): curated per-page landing for 5 surface pages
manager May 15, 2026
c1ca445
fix(concierge): SPATIAL intent drops off-family surface + library cards
manager May 16, 2026
700840d
fix(concierge): catch generic SPATIAL intent ("what should I do", "th…
manager May 16, 2026
4ba21a6
feat(concierge): UXCG sibling-question bridge for /uxcg/<slug> pages
manager May 16, 2026
b4bbabf
chore(widget): public name "Copilot" + thinner host highlight
manager May 16, 2026
9f5226e
feat(widget): identity query-trigger short-circuits — 8 clusters bili…
manager May 16, 2026
1cade46
fix(widget): slower, char-by-char typewriter
manager May 16, 2026
9812178
feat(concierge): zero-card rule on meta / conversational turns
manager May 17, 2026
709bec5
fix(widget): UXCAT Begin-Test CTA stays on curated landing turn
manager May 17, 2026
69d726b
feat(copilot): Strapi session-log analytics + spec
manager May 17, 2026
0d6c6a4
chore(widget): pill label "Your Copilot" (EN + RU)
manager May 17, 2026
b36222b
feat(copilot): four pre-rollout guardrails
manager May 17, 2026
5ea61bb
feat(headline): add dark-theme leaves video
MaryWylde May 18, 2026
0174f32
feat(why-do-this-tooltip): swap static bg image for brain video
MaryWylde May 18, 2026
a754262
Merge pull request #117 from keepsimpleio/chore/dark-video
MaryWylde May 18, 2026
16e315f
docs: add copilot-not-search article draft
manager May 18, 2026
4635feb
feat(copilot): swap analytics sink from Strapi to copilot-events Post…
manager May 18, 2026
f03af71
feat(admin): DEV-only Copilot session viewer at /admin/copilot-sessions
manager May 18, 2026
07204d2
copilot analytics spec update
manager May 18, 2026
a4cfcba
Dev compose + CLAUDE.md
manager May 18, 2026
84c12a2
fix(widget): keep collapse chevron in the header row
manager May 18, 2026
f6533d8
chore(admin): diagnostic on copilot-session detail empty state
manager May 18, 2026
ac65d71
chore(admin): unconditional debug pre + DBG-v3 marker on empty session
manager May 18, 2026
4babfbb
chore(admin): surface lib revision + keys to diagnose stale cache
manager May 18, 2026
d16d938
chore(admin): dump full result from getSessionDetail to diagnose null…
manager May 18, 2026
820b6c0
chore(admin): in-render diagnostic for session prop visibility
manager May 18, 2026
0ab3383
fix(admin): sanitize copilot-session props via JSON round-trip
manager May 18, 2026
a1be93f
fix(admin): pass session detail as a single JSON string prop
manager May 18, 2026
1a4bceb
fix(copilot): drop redundant session_start events
manager May 18, 2026
bced493
fix(admin): hide legacy session_start rows in session detail timeline
manager May 18, 2026
9d7e65d
feat(copilot): visibility-aware dwell + tab_close + return-gap markers
manager May 18, 2026
ef5d039
fix(copilot): accept tab_close kind at the event endpoint
manager May 18, 2026
b7d638c
chore(copilot): address PR review — types, cleanup, gitignore
manager May 19, 2026
b2d7c5b
Merge pull request #118 from keepsimpleio/feat/global-widget-enhancem…
MaryWylde May 19, 2026
e154781
minor improvements
MaryWylde May 22, 2026
f659653
Merge pull request #119 from keepsimpleio/chore/minor-improvements
MaryWylde May 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
42 changes: 42 additions & 0 deletions .claude/commands/qa-canonical.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
You are running a QA pass on keepsimple.io.

Profile: **canonical** — the desktop half of a full pass. Source of truth for desktop findings.

Scope: all sections × all locales × desktop.
Time budget: 90-120 min, 30-min hard cap per section.
Output: reports/YYYY-MM-DD.md (and rendered .html)
Diff target: previous canonical run.

Note: canonical alone is incomplete. Pair with mobile-followup for a full-matrix pass.

SETUP

1. Read .claude/keepsimple-qa/SKILL.md in full. This is your playbook for method.
2. Read qa-config.yml for routes, locales, viewports, and any per-section `auth_required:` lists.
3. Read known-issues.md — do not refile anything listed there.
4. Read .claude/keepsimple-qa/PROFILES.md and confirm the canonical profile spec matches what's above. Treat the profile as authoritative for scope; treat the skill as authoritative for method.
5. Confirm Playwright MCP is connected before proceeding. If not, stop and report what's missing.

EXECUTION

Run the pass per the skill. Honor the profile's scope exactly. Routes listed under `auth_required:` in their section are recorded as `skipped — auth required (configured)` and never visited. If you must cut scope mid-run, follow the skill's "Run is incomplete" rule — explicit, loud, in the report header.

OUTPUT

Produce the report at reports/YYYY-MM-DD.md following the skill's report structure:

- Metadata header
- Coverage report table
- Findings summary
- Diff vs prior canonical
- Routes covered
- Routes skipped with reason
- Fixed-pass checklist
- JSON finding blocks
- Out-of-scope observations

Then render HTML: `node .claude/keepsimple-qa/render-report.js reports/YYYY-MM-DD.md`.

Do NOT auto-update qa-runs/findings-register.md or any other tracking file. The user updates those manually after reviewing the report.

Return a 5-8 line summary in chat when done: profile, route coverage %, finding counts by severity, persistent vs new breakdown, run status.
53 changes: 53 additions & 0 deletions .claude/commands/qa-deploy-check.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
You are running a **post-deploy regression check** on keepsimple.io. This is the most token-efficient profile — it only audits routes that could have broken (changed since last run) or were already broken (open findings from the prior run).

Profile: **deploy-check** — surgical regression pass.

Scope:

- **Always include:** every route with an open finding in the most recent canonical / smoke / mobile-followup / full-matrix report.
- **Always include:** every route whose fingerprint differs from the prior batch (i.e. `changed` or `new` per `batch-fingerprint`).
- **Skip:** routes that are both `unchanged` AND have zero open prior findings.

Time budget: 5 min per route, 30 min hard cap total. Designed to run after every deploy.
Output: reports/YYYY-MM-DD-deploy-check.md (and rendered .html)
Diff target: most recent canonical (or full-matrix) run.

SETUP

1. Read .claude/keepsimple-qa/SKILL.md in full.
2. Read qa-config.yml for routes, locales, viewports, and any per-section `auth_required:` lists.
3. Read known-issues.md — do not refile anything listed there.
4. Read .claude/keepsimple-qa/PROFILES.md and confirm the deploy-check profile spec matches what's above.
5. Confirm Playwright MCP is connected before proceeding. If not, stop and report what's missing.

DECIDE THE SCOPE

1. Run `node .claude/keepsimple-qa/helper.mjs batch-fingerprint keepsimple --save`. This reads every route from qa-config.yml, fetches each, computes a fingerprint, and compares against the prior batch stored in `qa-runs/state/fingerprints.json`. Output is a JSON array with per-route verdicts: `unchanged | changed | new | errored`.
2. Read the most recent prior report under `reports/`. Extract every finding whose status is open (`persistent`, `persistent (unchanged route)`, `new`, `confirmed`, `not seen this run`). Note their routes.
3. Build the **deploy-check route set** = (routes with `verdict: changed | new` from step 1) ∪ (routes with open prior findings from step 2).
4. Subtract any routes listed under `auth_required:` in their section — those are configured-skip.
5. If the resulting set is empty, write a 5-line "All clear — nothing changed and no open findings" report and exit. This is the happy path post-deploy.

EXECUTION

For every route in the deploy-check route set, run the per-route checklist from the skill (snapshot, console+network, click primary elements, fill any forms without submit, scroll, resize) plus the must-work fixed-pass items for any section whose hub route is in the set. Cap at 5 min per route; if you hit the cap mid-route, mark it `partial` and move on.

For routes NOT in the deploy-check set (unchanged + no open findings), include them in the coverage table with status `unchanged-skip` and `Source: <prior report date>`.

OUTPUT

Produce the report at reports/YYYY-MM-DD-deploy-check.md following the skill's report structure:

- Metadata header (build IDs, change summary from batch-fingerprint)
- **Deploy verdict** at the top: `pass | regressions found | inconclusive` based on whether any new high/critical findings appeared or any prior open findings persisted on changed routes
- Coverage table (every route from qa-config.yml, with per-route status: deep-audited / unchanged-skip / configured-skip)
- Findings summary
- Diff vs prior canonical (status of each prior finding: refuted / persistent / changed)
- JSON finding blocks
- Out-of-scope observations

Then render HTML: `node .claude/keepsimple-qa/render-report.js reports/YYYY-MM-DD-deploy-check.md`.

Do NOT auto-update qa-runs/findings-register.md or any other tracking file. The user updates those manually after reviewing the report.

Return a 5-7 line summary in chat: deploy verdict, route counts (re-audited / skipped-unchanged / skipped-auth-required), prior-findings status (X resolved / Y persistent / Z new), run status.
40 changes: 40 additions & 0 deletions .claude/commands/qa-full-matrix.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
You are running a QA pass on keepsimple.io.

Profile: **full-matrix** — single pass covering everything: every section, every locale, every viewport.

Scope: all sections × all locales × desktop+mobile.
Time budget: 3-4 hours. May need to be split across multiple Claude Code sessions; if so, sequence them and produce sub-reports per session, then a consolidated final report.
Output: reports/YYYY-MM-DD-full-matrix.md (or reports/YYYY-MM-DD-full-matrix-part-N.md for split runs) (and rendered .html)
Diff target: previous full-matrix run, or most recent canonical+mobile-followup pair.

SETUP

1. Read .claude/keepsimple-qa/SKILL.md in full. This is your playbook for method.
2. Read qa-config.yml for routes, locales, viewports, and any per-section `auth_required:` lists.
3. Read known-issues.md — do not refile anything listed there.
4. Read .claude/keepsimple-qa/PROFILES.md and confirm the full-matrix profile spec matches what's above. Treat the profile as authoritative for scope; treat the skill as authoritative for method.
5. Confirm Playwright MCP is connected before proceeding. If not, stop and report what's missing.

EXECUTION

Run the pass per the skill. Honor the profile's scope exactly. Routes listed under `auth_required:` in their section are recorded as `skipped — auth required (configured)` and never visited. If the run needs to be split across sessions due to time/context limits, produce part-N reports and call out clearly that a final consolidated report is needed. If you must cut scope mid-run, follow the skill's "Run is incomplete" rule — explicit, loud, in the report header.

OUTPUT

Produce the report at reports/YYYY-MM-DD-full-matrix.md (or part-N variant) following the skill's report structure:

- Metadata header
- Coverage report table
- Findings summary
- Diff vs prior full-matrix or canonical+mobile-followup pair
- Routes covered
- Routes skipped with reason
- Fixed-pass checklist
- JSON finding blocks
- Out-of-scope observations

Then render HTML: `node .claude/keepsimple-qa/render-report.js reports/YYYY-MM-DD-full-matrix.md` (or the part-N variant).

Do NOT auto-update qa-runs/findings-register.md or any other tracking file. The user updates those manually after reviewing the report.

Return a 5-8 line summary in chat when done: profile, route coverage %, finding counts by severity, persistent vs new breakdown, run status.
136 changes: 136 additions & 0 deletions .claude/commands/qa-init.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
---
description: Configure (or re-configure) the QA agent for keepsimple.io. Walks through site URL, locales, routes, viewports, and writes qa-config.yml.
---

You are the QA agent's setup wizard. Your job is to interactively configure the QA pass by writing or updating `qa-config.yml` at the repo root.

Do NOT start any QA pass during this wizard. Your only output is the config file (and a friendly recap at the end).

## Pre-check

If `qa-config.yml` already exists, ask: "qa-config.yml already exists. Back it up to `qa-config.yml.bak` and rewrite, edit in place, or cancel?" Do NOT silently overwrite.

If the user picks "edit in place," surface the existing values as defaults at each step so they can keep what's there with a one-word reply.

## Steps

Walk the user through these questions a few at a time. Don't dump the whole list. Ask, wait for the answer, ask the next.

### 1. Site URL

Ask: "Production site URL? (default: https://keepsimple.io)"

Then ask: "Staging URL too? (or 'skip')"

### 2. Locales

Ask: "Locales to test? (default: en, ru, hy)"

If non-default, ask: "How are locales URL-prefixed?"

- **A) default-unprefixed** — en routes are `/uxcore`, ru routes are `/ru/uxcore` _(current default for keepsimple)_
- **B) all-prefixed** — every route has a locale segment
- **C) no-prefix** — single-locale, no segments

### 3. Route discovery

Ask: "How should we discover routes?"

- **A) Pull from `/sitemap.xml`**
- **B) Crawl from the homepage** (one click deep from `/`)
- **C) Keep the routes in the existing qa-config.yml** _(default if you're re-running)_
- **D) I'll paste the routes manually**

If A/B: fetch via Playwright MCP, group discovered URLs by inferred section (path's first segment), present them back, ask: "Confirm these sections + routes? (yes / I want to edit)"

If D: prompt for routes one section at a time:

- "Section name (e.g. 'uxcore', 'site'):"
- "Routes for that section, one per line, leading slash, blank line to finish:"
- "Add another section? (yes/no)"

### 4. Per-section options

For each section, ask:

- "Mark this section as `default: true` for smoke runs? (only one section gets this)"
- "Any `primary_interaction:` worth declaring? (e.g. 'open the bias modal on a card', or 'skip')"
- "Any routes in this section that require auth? (comma-separated paths, or 'none')"

### 5. Viewports

Ask: "Viewports? (default: desktop 1920×1080, mobile 390×844)"

### 6. Timezone

Ask: "Timezone for report timestamps? (default: Asia/Yerevan)"

### 7. Design system reference

Ask: "Path to design-system reference doc? (default: uxcore-visual-design-system.md, or 'skip')"

### 8. Confirm and write

Show the user the proposed `qa-config.yml` content as a code block. Ask: "Write this to qa-config.yml? (yes/edit)"

Use this template (fill in the captured values):

```yaml
# QA agent configuration — read by .claude/skills/keepsimple-qa/SKILL.md
# Generated by /qa-init on YYYY-MM-DD.

environment:
production: <site_url>
staging: <staging_url or empty>

locales:
- <locale_1>
# ...

locale_url_strategy: <strategy>

viewports:
desktop: { width: 1920, height: 1080 }
mobile: { width: 390, height: 844 }

report_timezone: <tz>

design_system: <path or omit>

sections:
<section_name>:
# default: true # uncomment on exactly one section
routes:
- /<route_a>
- /<route_b>
# auth_required:
# - /<route_b>
# primary_interaction: "..."
# ... repeat for each section
```

### 9. Recap

Print:

```
✓ qa-config.yml written ({N} sections, {M} locales, {V} viewports)
✓ Default smoke section: <section>

Next steps:
/qa-smoke — quick render check
/qa-locale-smoke — locale routing only
/qa-canonical — desktop pass across all locales
/qa-mobile-followup — mobile pass to pair with canonical
/qa-full-matrix — everything in one report
/qa-deploy-check — surgical post-deploy regression
/qa-retest F#,F# — verify specific finding IDs after a fix
```

## Constraints

- Do NOT begin a QA pass during this wizard. The user must invoke a profile separately.
- Do NOT auto-discover routes by visiting EVERY page on the site — keep discovery to sitemap or a single homepage crawl.
- Do NOT silently overwrite `qa-config.yml`. If one exists, ask first.
- Do NOT install Playwright MCP for the user. If it's not connected, just tell them how to install it (`claude mcp add playwright npx -- @playwright/mcp@latest`) and stop.
- Keep the conversation tight. Two or three questions per turn maximum.
40 changes: 40 additions & 0 deletions .claude/commands/qa-locale-smoke.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
You are running a QA pass on keepsimple.io.

Profile: **locale-smoke** — confirm locale-prefix routing works across all configured locales.

Scope: one section × all locales × desktop. Default section is the one marked `default: true` in `qa-config.yml` (or the first section if none is marked).
Time budget: 25 min hard cap.
Output: reports/YYYY-MM-DD-locale-smoke.md (and rendered .html)
Diff target: most recent canonical run.

SETUP

1. Read .claude/keepsimple-qa/SKILL.md in full. This is your playbook for method.
2. Read qa-config.yml for routes, locales, viewports, `locale_url_strategy:`, and any per-section `auth_required:` lists.
3. Read known-issues.md — do not refile anything listed there.
4. Read .claude/keepsimple-qa/PROFILES.md and confirm the locale-smoke profile spec matches what's above. Treat the profile as authoritative for scope; treat the skill as authoritative for method.
5. Confirm Playwright MCP is connected before proceeding. If not, stop and report what's missing.

EXECUTION

Run the pass per the skill. Honor the profile's scope exactly. Routes listed under `auth_required:` in their section are recorded as `skipped — auth required (configured)` and never visited. If you must cut scope mid-run, follow the skill's "Run is incomplete" rule — explicit, loud, in the report header.

OUTPUT

Produce the report at reports/YYYY-MM-DD-locale-smoke.md following the skill's report structure:

- Metadata header
- Coverage report table
- Findings summary
- Diff vs prior canonical
- Routes covered
- Routes skipped with reason
- Fixed-pass checklist
- JSON finding blocks
- Out-of-scope observations

Then render HTML: `node .claude/keepsimple-qa/render-report.js reports/YYYY-MM-DD-locale-smoke.md`.

Do NOT auto-update qa-runs/findings-register.md or any other tracking file. The user updates those manually after reviewing the report.

Return a 5-8 line summary in chat when done: profile, route coverage %, finding counts by severity, persistent vs new breakdown, run status.
42 changes: 42 additions & 0 deletions .claude/commands/qa-mobile-followup.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
You are running a QA pass on keepsimple.io.

Profile: **mobile-followup** — the mobile half of a full pass. Pairs with canonical to close the full matrix.

Scope: all sections × all locales × mobile.
Time budget: 90 min, 30-min hard cap per section.
Output: reports/YYYY-MM-DD-mobile.md (and rendered .html)
Diff target: paired canonical run from the same day or build.

Note: mobile-followup alone is incomplete. Pair with canonical for a full-matrix pass.

SETUP

1. Read .claude/keepsimple-qa/SKILL.md in full. This is your playbook for method.
2. Read qa-config.yml for routes, locales, viewports, and any per-section `auth_required:` lists.
3. Read known-issues.md — do not refile anything listed there.
4. Read .claude/keepsimple-qa/PROFILES.md and confirm the mobile-followup profile spec matches what's above. Treat the profile as authoritative for scope; treat the skill as authoritative for method.
5. Confirm Playwright MCP is connected before proceeding. If not, stop and report what's missing.

EXECUTION

Run the pass per the skill. Honor the profile's scope exactly. Routes listed under `auth_required:` in their section are recorded as `skipped — auth required (configured)` and never visited. If you must cut scope mid-run, follow the skill's "Run is incomplete" rule — explicit, loud, in the report header.

OUTPUT

Produce the report at reports/YYYY-MM-DD-mobile.md following the skill's report structure:

- Metadata header
- Coverage report table
- Findings summary
- Diff vs paired canonical run
- Routes covered
- Routes skipped with reason
- Fixed-pass checklist
- JSON finding blocks
- Out-of-scope observations

Then render HTML: `node .claude/keepsimple-qa/render-report.js reports/YYYY-MM-DD-mobile.md`.

Do NOT auto-update qa-runs/findings-register.md or any other tracking file. The user updates those manually after reviewing the report.

Return a 5-8 line summary in chat when done: profile, route coverage %, finding counts by severity, persistent vs new breakdown, run status.
Loading
Loading