Faber-Ludens Pro · for Coopers Digital · Hearing Matters (Ribbon)

Usability Evaluation of the Built Site

Version 2.0 · 2 September 2026 · three independent evaluators · client-facing report. The bound handoff package (PDF, v1.1) carries this document as Part 5.1 and the 28 August single-evaluator evaluation as Part 5.2.

Change log

Version Date What changed
2.0 2026-09-02 Full re-evaluation under /usability-evaluation Mode A. Three independent evaluators on three different models, findings merged by root cause, severity rated after aggregation by three independent raters and averaged. Supersedes the single-evaluator assessment of 2026-08-28 as the current reading of the site; §9 carries the remediation comparison against it.
1.0 2026-08-28 Initial evaluation of the built site.

1. Method

Standard: Nielsen’s 10 Usability Heuristics + Dieter Rams’ 10 Principles + Morville’s UX Honeycomb. Brand surface — 27 criteria applied, identically, by every evaluator.

Evaluators: three independent evaluators on three different models (Opus 5, Sonnet 5, Fable 5.1). Each was freshly instantiated with no inherited context, received an md5-identical brief, and inspected the live site without sight of any other evaluator’s findings and without access to any prior evaluation of this site. Passes were run one at a time, never in parallel.

Severity scale: NN/g 0–4. 0 = not a problem · 4 = usability catastrophe. HIGHER IS WORSE. Severity was not collected during detection. It was rated afterwards, over the full merged list, by three independent raters on three different models, each of whom walked the site before rating and rated every item — including items they would not themselves have reported. Reported as mean and spread. The found-by count was deliberately withheld from raters so that a finding’s popularity could not leak into its severity.

Access: https://dev-hearingmatters-now.pantheonsite.io/ — 1 and 2 September 2026.

Scope — 13 pages. Homepage and all its sections; /hearing-health/ and its three articles; /privacy/; /imprint/; the six /hearoes/ detail pages.

Out of scope, by the client’s decision: the German site and everything under /de/; anything beyond our own page edges, including the destination and labelling of outbound controls, the downloadable PDF, and the visitor’s mail client.

Two client decisions were confirmed from the record (MED-EL, 2026-08-07) and govern this report: - The story-submission form ships in Phase 1 and is the single data capture on the entire site. No finding about it is written as conditional. - The FAQ was deliberately postponed, to be introduced later as a dedicated section in the footer area. Its absence is a decision correctly implemented and is not reported as a defect.

Coverage — stated in counts, not adjectives

Method limits — read these before acting on any number

  1. This is an inspection, not a user test. It predicts problems; it does not observe them. It cannot establish that a finding impedes a real visitor, nor that a recommendation would help.
  2. The evaluators are AI models. Aggregation improves reliability over a single pass. The fraction of human multi-rater reliability that three model instances recover is unmeasured — this is an inference, not a measured finding.
  3. The count is not a quality measure. “64 findings” is a function of how finely problems were split and which tasks were walked. Do not compare it to any other evaluation’s total.
  4. Cross-screen problems are this method’s weakest category. Absence of them here is not evidence of their absence.
  5. The site was deployed to twice during the third evaluator’s pass. Evaluators A and B inspected one build; evaluator C inspected two later ones. Every contested item was re-verified by the lead against the current build before this report was written, and one finding is recorded below as fixed during the run. Where an item was found by some evaluators and not others, the deploys are a sufficient explanation and no claim is made that one model out-detected another.
  6. One evaluator submitted the story form once during inspection, writing a test record (“Test Person”, test@example.com, body text stating it came from an automated inspection) into the development environment’s capture. It is disclosed here rather than left to be discovered.

Criteria — where each code comes from

H1–H10
Nielsen’s 10 Usability Heuristics for User Interface Design — Nielsen Norman Group
R1–R10
Dieter Rams’ Ten Principles of Good Design — published by Vitsœ
M1–M7
Peter Morville’s User Experience Honeycomb — useful · usable · desirable · findable · accessible · credible · valuable (Semantic Studios, 2004)

Every finding names the criterion it was judged against. Click a criterion to open its source in a new tab.

Instrument note — what the audits measured

Dark full-screen notice: This website is hosted in a sandbox environment. Continue button.
The Hearing Matters homepage: hero over video, navigation, Join the Initiative section.
Left: what any browser receives without the bypass cookie — an 8.5 KB, 7-element page titled “Sandbox Environment Notice”. Right: the site, same URL, same minute, with the cookie. A browser-based audit run against the left page returns plausible scores for a document that is not the site. Validate every run by title, not by element count — element counts differ by instrument on identical bytes. The right-hand capture shows the German homepage: since the client's approval on 2 September the site launches German-only, with / redirecting to /de/; English follows in December. The evaluation itself was run while both locales were served.
The Hearing Matters homepage at 375 pixels wide, hero over video.
The homepage at 375 px (German, as now served). Both breakpoints were inspected during the evaluation; 375 px and 1280–1440 px are the two the findings cite.

Automated baseline (Lighthouse)

DE · desktop
Performance100
Accessibility100
Best practices100
SEO69
DE · mobile · 3 runs
Performance75–83
Accessibility100
Best practices100
SEO69
EN · desktop
Performance100
Accessibility100
Best practices100
SEO61
EN · mobile · 3 runs
Performance85–96
Accessibility100
Best practices100
SEO61

Lighthouse 12.8.2, headless Chrome, harvested 2026-09-01T21:24–21:38Z with the sandbox bypass cookie and, for German, the browser forced to de-DE. Lab measurement on emulated hardware — a range is shown where mobile runs varied. Every figure is re-derivable from the retained JSON.

2. The fixes that matter, first

Ordered by severity weighed against ease of correction. Severity is never restated to match priority.

# Fix Item Severity Effort
1 Add a consent step and a privacy link to the story form, and block submission until ticked M40 3.33 S
2 Fill the Imprint template — five placeholders are live M02 3.00 S
3 Resolve the Privacy Policy’s unresolved draft text M03 3.00 S
4 Give the hero intro paragraph its own contrast surface M16 3.00 M
5 Add author / reviewer / date / sources to the health articles M06 3.00 M
6 Put funding and governance where the content is, not only in an About panel M07 3.00 M
7 Give the six HEARo pages a route in from the homepage M10 2.67 S
8 Fix the Ribbon accordion’s missing and duplicated download targets M21 2.67 S
9 Move the hero pause control on-screen M17 2.33 S
10 Give the third Join card its title M32 2.67 S

Verdict: Requires revision before handover.

Veto: none issued. A veto requires a confirmed severity-4 finding. The highest mean in this evaluation is 3.33 (M40). One rater of three placed M40 at 4; the other two placed it at 3. That is a major problem to be fixed with high priority — it is not, on this evidence, a catastrophe, and this report will not describe it as one. The distinction changes nothing about its position: it is still the first thing to fix.

Distribution — for weighing this report, not for scoring the product

Severity band (mean) Confirmed Candidate Total
3 — Major 13 6 19
2 — Minor 15 26 41
1 — Cosmetic 0 4 4
Total 28 36 64

Confirmed = surfaced independently by two or more evaluators. Candidate = surfaced by one, and retained for review rather than counted toward the verdict.

A caution about the confirmed column, produced by this run’s own evidence. Two evaluators, on different models, working from identical briefs, independently reported that the hero text sits over the video with no contrast-stabilising layer. A scrim element exists. Both were wrong, in the same way, and the item would have carried “CONFIRMED” on two independent sightings. Agreement between evaluators is not proof of correctness, and the found-by count in this report should be read as a measure of salience, not of truth.


Major — severity band 3 (19 findings)

M40 · Story form collects special-category health data with no consent step or privacy link

Criterion: M6 — Credible
Location: dialog.hearo-modal — the entire form, and #hearo-story in particular
Severity: mean 3.33 · spread 1 (ratings 3/4/3) · found by 3 of 3 · CONFIRMED ⚠ UNCONDITIONAL-PER-CLIENT-DECISION

The Share your story dialog: full name, email address, country, your story, and a Send my story button. No consent checkbox and no privacy link.
The story form as served on 2 September 2026. Name, email, country and a free-text account of a hearing journey — special-category data under GDPR Article 9 — with no consent step and no link to the privacy policy. Captured logged out, desktop viewport, sandbox bypass set.

M02 · Imprint published from an unfilled legal template

Criterion: M6 — Credible
Location: https://dev-hearingmatters-now.pantheonsite.io/imprint/ — “Represented by”, “Contact”, “VAT ID”, “Responsible for content”
Severity: mean 3.00 · spread 0 (ratings 3/3/3) · found by 3 of 3 · CONFIRMED

M03 · Privacy policy published with unresolved draft queries

Criterion: M6 — Credible
Location: https://dev-hearingmatters-now.pantheonsite.io/privacy/ — “Data shared with Matomo” and “Third-party services” sections
Severity: mean 3.00 · spread 0 (ratings 3/3/3) · found by 2 of 3 · CONFIRMED

M06 · Article template has no provenance layer (author/reviewer/citation/date)

Criterion: M6 — Credible
Location: /hearing-health/ (hub intro); /hearing-health/the-invisible-nature-of-hearing-loss/ (para. 2); /hearing-health/hearing-loss-why-action-matters/ (para.
Severity: mean 3.00 · spread 0 (ratings 3/3/3) · found by 3 of 3 · CONFIRMED

M07 · Funding and governance disclosure does not travel with the content

Criterion: M6 — Credible
Location: Homepage #about panel 5 “Initiators”; homepage #hearoes carousel; the six /hearoes/ pages; the three /hearing-health/ articles
Severity: mean 3.00 · spread 0 (ratings 3/3/3) · found by 2 of 3 · CONFIRMED

M12 · Navigation modelled as a one-page anchor menu; sub-pages have no slot in the IA

Criterion: M4 — Findable
Location: Primary navigation (header and footer, all 13 pages); /hearing-health/
Severity: mean 3.00 · spread 0 (ratings 3/3/3) · found by 2 of 3 · CONFIRMED

M16 · Hero text sits over moving video with a STATIC scrim that cannot guarantee a contrast floor

Criterion: M5 — Accessible
Location: Homepage hero — h1.hero__title and the subtitle beneath it, over video.hero__media
Severity: mean 3.00 · spread 0 (ratings 3/3/3) · found by 3 of 3 · CONFIRMED ⚠ ROOT-CAUSE-RESTATED

M20 · Accordion uses opacity as de-emphasis with no contrast floor on closed rows

Criterion: M5 — Accessible
Location: Homepage #ribbonbutton.asset-row__head, rows 02–05 in their collapsed state
Severity: mean 3.00 · spread 0 (ratings 3/3/3) · found by 1 of 3 · candidate

M34 · Governance and initiators buried as one panel in a rotating carousel

Criterion: M4 — Findable
Location: Homepage #about.about-panels__track, panel 5 of 5 (“Initiators”)
Severity: mean 3.00 · spread 0 (ratings 3/3/3) · found by 2 of 3 · CONFIRMED

M37 · Submit handler renders error.message verbatim as user-facing copy

Criterion: H9 — Help users recognise, diagnose and recover from errors
Location: dialog.hearo-modalp.hearo-modal__error[data-form-error][role="alert"]
Severity: mean 3.00 · spread 2 (ratings 3/4/2) · found by 1 of 3 · candidate

M04 · Consent mechanism described in policy and footer was never implemented

Criterion: R6 — Honest
Location: /privacy/ “Cookies” and “Data we collect (browsing)” sections; footer “Cookie Settings” link on all 13 pages (href=".../privacy/#cookies")
Severity: mean 2.67 · spread 1 (ratings 3/3/2) · found by 3 of 3 · CONFIRMED

M10 · Story carousel renders HEARo records as static cards, not links to permalinks

Criterion: M4 — Findable
Location: Homepage #hearoes carousel (div.story-slide, six instances); primary nav item “HEARoes” (href="/#hearoes"); the six /hearoes// pages
Severity: mean 2.67 · spread 1 (ratings 3/3/2) · found by 2 of 3 · CONFIRMED

M21 · Ribbon accordion asset mapping incomplete: missing target and duplicated target

Criterion: R6 — Honest
Location: Homepage #ribbon — accordion row 04 “Postcard”, panel #asset-panel-3
Severity: mean 2.67 · spread 1 (ratings 3/3/2) · found by 3 of 3 · CONFIRMED

M26 · Shared carousel manages visual state only; no live region, no accessible position

Criterion: H1 — Visibility of system status
Location: Homepage — .carousel__track (#hearoes), .about-panels__track (#about), .events-slider (#events), .advisory-carousel (#about)
Severity: mean 2.67 · spread 1 (ratings 3/3/2) · found by 1 of 3 · candidate

M31 · Events section has no event-detail destination; CTA points at the generic join anchor

Criterion: H2 — Match between system and the real world
Location: Homepage #eventsa.button--primary-square “Discover & Take Part”; the event card’s Date field
Severity: mean 2.67 · spread 1 (ratings 3/3/2) · found by 1 of 3 · candidate

M32 · Third join card’s title field is empty and the template renders it without one

Criterion: M4 — Findable
Location: Homepage #join — the third article.join-card
Severity: mean 2.67 · spread 1 (ratings 3/3/2) · found by 2 of 3 · CONFIRMED

M38 · Submit button manages disabled only; no pending state, label change or aria-busy

Criterion: H1 — Visibility of system status
Location: dialog.hearo-modalbutton.hearo-modal__submit (“Send my story”)
Severity: mean 2.67 · spread 1 (ratings 3/3/2) · found by 1 of 3 · candidate

M39 · Form has no validation layer; relies on one transient native reportValidity bubble

Criterion: H9 — Help users recognise, diagnose and recover from errors
Location: form.hearo-modal__form[novalidate] — fields #hearo-name, #hearo-email, #hearo-country, #hearo-story
Severity: mean 2.67 · spread 1 (ratings 3/3/2) · found by 2 of 3 · CONFIRMED

M57 · No stylesheet rules for the hearo-story hero/breadcrumb block

Criterion: R8 — Thorough down to the last detail
Location: /hearoes// — nav.breadcrumb, header.hearo-story__hero, footer.hearo-story__readmore
Severity: mean 2.67 · spread 1 (ratings 3/2/3) · found by 1 of 3 · candidate

Minor — severity band 2 (41 findings)

M09 · Operations and legal contact addresses maintained unreconciled

Criterion: H4 — Consistency and standards
Location: Homepage #ribbon and #partners and #join (mailto CTAs); <footer> on all 13 pages; /privacy/ “Your rights”; /imprint/ “Contact”
Severity: mean 2.33 · spread 1 (ratings 2/3/2) · found by 2 of 3 · CONFIRMED

M13 · Legal-page template renders a header variant carrying no primary navigation

Criterion: H4 — Consistency and standards
Location: /imprint/ and /privacy/ headers, compared against /, /hearing-health/, and /hearoes/
Severity: mean 2.33 · spread 1 (ratings 2/3/2) · found by 2 of 3 · CONFIRMED

M17 · Hero media pause control uses an off-screen-until-focused pattern, unreachable by pointer

Criterion: H3 — User control and freedom
Location: Homepage hero — button.media-toggle (“Pause background video”)
Severity: mean 2.33 · spread 1 (ratings 2/3/2) · found by 2 of 3 · CONFIRMED ⚠ AMBIG-WITH-M18

M18 · Hero pause control position depends on a scroll-triggered animation that never fires

Criterion: M5 — Accessible (WCAG 2.2.2 Pause, Stop, Hide)
Location: / (homepage), hero section, button.media-toggle (“Pause background video”)
Severity: mean 2.33 · spread 1 (ratings 2/3/2) · found by 1 of 3 · candidate ⚠ AMBIG-WITH-M17

M23 · Story carousel shuffles client-side each load, no stable order, no permalinks

Criterion: H6 — Recognition rather than recall
Location: Homepage #hearoesdiv.carousel__track[data-shuffle]
Severity: mean 2.33 · spread 1 (ratings 2/3/2) · found by 2 of 3 · CONFIRMED

M25 · HEARo detail template never outputs the biography the teaser already reads

Criterion: M1 — Useful
Location: /hearoes/christiane-olk/ (and, by the same template, the other five HEARo pages)
Severity: mean 2.33 · spread 1 (ratings 2/3/2) · found by 2 of 3 · CONFIRMED

M30 · Events copy written for a multi-event programme that does not exist

Criterion: R6 — Honest
Location: Homepage #events.events__body and the single event card
Severity: mean 2.33 · spread 1 (ratings 2/3/2) · found by 3 of 3 · CONFIRMED

M45 · Footer link rows sized by line box only; hit area below minimum at 390px

Criterion: M5 — Accessible
Location: Footer on all 13 pages at 390 px — ul.site-footer__links a (“Imprint”, “Privacy Policy”, “Cookie Settings”) and .site-footer__nav a
Severity: mean 2.33 · spread 1 (ratings 3/2/2) · found by 1 of 3 · candidate

M50 · Interactive init is scroll-gated, so handlers are unbound on a fresh unscrolled load

Criterion: H1 — Visibility of system status
Location: / (homepage), #join section, button “Become a HEARo” (data-modal-open= "become-a-hearo")
Severity: mean 2.33 · spread 2 (ratings 3/1/3) · found by 1 of 3 · candidate ⚠ WITHIN-MODEL-DUP

M64 · Article cards render an image slot with no image assigned

Criterion: R8 — Thorough down to the last detail
Location: /hearing-health/ — the three a.article-card
Severity: mean 2.33 · spread 1 (ratings 2/3/2) · found by 1 of 3 · candidate

M08 · No single controlled name for the story-submission flow

Criterion: H4 — Consistency and standards
Location: Homepage #joinbutton.join-card__row-trigger, button.join-card__cta, dialog.hearo-modal heading and submit button; /privacy/ “Data we collec
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 2 of 3 · CONFIRMED

M11 · Article back-link label and target hard-coded to one homepage section

Criterion: H2 — Match between system and the real world
Location: /hearing-health/why-hearing-matters/, /hearing-health/the-invisible-nature-of- hearing-loss/, /hearing-health/hearing-loss-why-action-matters/ — the t
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 2 of 3 · CONFIRMED

M14 · Campaign strapline reused as nav label, page title and back-link label

Criterion: H4 — Consistency and standards
Location: Primary nav item “Why Hearing Matters” (/#why) vs the article /hearing-health/why-hearing-matters/ (<h1>Why Hearing Matters</h1>)
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M15 · Scroll-spy sets a CSS class only and never mirrors state into aria-current

Criterion: H1 — Visibility of system status
Location: Header nav on the homepage, [data-scroll-spy] behaviour
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M19 · Hero video ships as one unconditioned 1080p file with no responsive source set

Criterion: R9 — Environmentally friendly
Location: Homepage — video.hero__media source /wp-content/uploads/2026/08/hero-background.mp4; materials-collage.png
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M22 · Collapsed accordion panels are never removed from assistive-technology exposure

Criterion: M5 — Accessible
Location: Homepage #ribbonbutton.asset-row__head[aria-expanded="false"] and their #asset-panel-N targets
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M24 · Story identity overlay sits on a photo under a teal scrim that REDUCES contrast with white text

Criterion: M5 — Accessible
Location: Homepage #hearoesspan.story-slide__name and span.story-slide__country, overlaid on img.story-slide__portrait
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate ⚠ ROOT-CAUSE-RESTATED

M27 · Carousel edge-state handled per instance rather than in the shared component

Criterion: H4 — Consistency and standards
Location: Homepage — the three prev/next control pairs: “Previous story”/“Next story” (#hearoes), “Previous”/“Next” (#about panels), “Previous member”/“Next
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M28 · Partner marquee ships no in-page pause control, relying only on OS reduced-motion

Criterion: M5 — Accessible
Location: Homepage #partners.partners__marquee > .partners__track
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 2 of 3 · CONFIRMED

M29 · Partners modelled as a logo wall rather than records carrying name and role

Criterion: M6 — Credible
Location: Homepage #partnersul.partners__logos
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 2 of 3 · CONFIRMED

M33 · Join cards promise distinct paths while sharing one contact action

Criterion: H4 — Consistency and standards
Location: Homepage #join — the a.join-card__cta in cards 1 and 2
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M35 · About-panel heading has no type-scale rule and falls below the body scale

Criterion: R3 — Aesthetic
Location: Homepage #about — the <h3> in each of the five .about-panels panels
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M36 · Advisory board label marked up presentationally as a span, not a heading

Criterion: M5 — Accessible
Location: Homepage #aboutspan.about__board-label (“Our Advisory Board”) and the eleven-member advisory carousel beneath it
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M41 · Discard guard uses browser confirm(), is not tied to clearing, and backdrop-close bypasses it

Criterion: H4 — Consistency and standards
Location: dialog.hearo-modal — the unsaved-changes guard on close and on Escape
Severity: mean 2.00 · spread 2 (ratings 1/3/2) · found by 2 of 3 · CONFIRMED

M49 · Mobile menu overlay does not mark background content inert/aria-hidden

Criterion: M5 — Accessible (content hidden from sighted users must also be hidden from assistive tech)
Location: / (homepage and all pages sharing the header), mobile navigation overlay, 390×844 viewport
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M54 · Download-link label is a hard-coded generic string, not derived per asset

Criterion: H4 — Consistency and standards
Location: / (homepage) #ribbon accordion, items “03 Flyer” and “02 Digital Ribbon” versus item “01 Get the Ribbon”
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 2 of 3 · CONFIRMED

M55 · #cookies anchor id attached to the wrong heading

Criterion: H4 — Consistency and standards
Location: /privacy/ — h2#cookies
Severity: mean 2.00 · spread 2 (ratings 3/2/1) · found by 1 of 3 · candidate

M56 · Pointer cursor styled on a non-interactive story slide

Criterion: R6 — Honest
Location: / — #hearoes .story-slide (computed cursor: pointer)
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M58 · Partners pill uses near-white text on a translucent light-teal background

Criterion: M5 — Accessible
Location: / — #partners h2.partners__pill (“PARTNERS FOR HEARING AWARENESS”)
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M62 · Off-centre carousel slides shown at full opacity and clipped by the viewport

Criterion: R8 — Thorough down to the last detail
Location: / — #hearoes .carousel__track (off-centre .story-slide.is-off-center at the viewport edges)
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M65 · Old hashed assets removed at deploy while cached HTML still references them

Criterion: M2 — Usable (whole-product)
Location: the site as a whole — build state during inspection
Severity: mean 2.00 · spread 0 (ratings 2/2/2) · found by 1 of 3 · candidate

M05 · Footer accessibility control wired to the skip-link anchor, no statement page

Criterion: H2 — Match between system and the real world
Location: All 13 pages, <footer>, a.accessibility-pill
Severity: mean 1.67 · spread 1 (ratings 1/2/2) · found by 2 of 3 · CONFIRMED ⚠ RECHECK-BUILD

M42 · Form layout reserves no clearance for a validation message anywhere

Criterion: R8 — Thorough down to the last detail
Location: dialog.hearo-modal — the native validation bubble’s position relative to label[for="hearo-country"]
Severity: mean 1.67 · spread 1 (ratings 2/2/1) · found by 1 of 3 · candidate

M44 · Events teaser rendered by the global footer template without its data or CTA

Criterion: R8 — Thorough down to the last detail
Location: All 13 in-scope pages — the events teaser paragraph immediately above the footer
Severity: mean 1.67 · spread 1 (ratings 2/2/1) · found by 2 of 3 · CONFIRMED

M46 · Dialog relies on the native top-layer focus cycle, which includes the document root

Criterion: M5 — Accessible
Location: dialog.hearo-modal — the Tab cycle while the dialog is open
Severity: mean 1.67 · spread 1 (ratings 2/1/2) · found by 2 of 3 · CONFIRMED

M47 · Dialog open state not paired with role/aria-modal wiring

Criterion: M5 — Accessible (name/role/value of dialog)
Location: / (homepage), “Share your story” dialog (dialog.hearo-modal)
Severity: mean 1.67 · spread 2 (ratings 1/3/1) · found by 1 of 3 · candidate

M51 · HEARo portrait alt attribute not populated from the existing name field

Criterion: M5 — Accessible (WCAG 1.1.1 Non-text Content)
Location: Homepage #hearoes cards and story-grid modules; each individual /hearoes/<name>/ page’s own portrait and its “Read more stories” grid
Severity: mean 1.67 · spread 1 (ratings 2/2/1) · found by 1 of 3 · candidate

M52 · Article body renders as undifferentiated paragraphs with no subheadings

Criterion: H8 — Aesthetic and minimalist design (progressive disclosure / scannability)
Location: /hearing-health/why-hearing-matters/, /hearing-health/the-invisible-nature-of- hearing-loss/, /hearing-health/hearing-loss-why-action-matters/ (articl
Severity: mean 1.67 · spread 1 (ratings 2/2/1) · found by 1 of 3 · candidate

M59 · Campaign neologism used as a UI label with no in-place definition

Criterion: H2 — Match between system and the real world
Location: / — nav item “HEARoes”, #hearoes h2 “HEARoes Stories”, #join CTA “Become a HEARo”, .about__board-label; every sub-page nav
Severity: mean 1.67 · spread 1 (ratings 2/2/1) · found by 1 of 3 · candidate

M60 · Missing advisory portraits fall back to an empty dark container

Criterion: R8 — Thorough down to the last detail
Location: / — #about ul.carousel__track[aria-label="Advisory Board members"], cards for Prof. Javier Gavilan, Oliver Hupka, Pieter Van Lent, Marisa Strobel
Severity: mean 1.67 · spread 1 (ratings 2/2/1) · found by 1 of 3 · candidate

M61 · Anchor nav and breadcrumb target different destinations for the same section

Criterion: H4 — Consistency and standards
Location: /hearoes// — nav.breadcrumb item “HEARoes Stories” (href="/hearoes/") vs header/footer item “HEARoes” (href="/#hearoes")
Severity: mean 1.67 · spread 1 (ratings 2/2/1) · found by 1 of 3 · candidate

Cosmetic — severity band 1 (4 findings)

M53 · ‘Read more stories’ module shows a subset with no see-all control

Criterion: M4 — Findable
Location: /hearoes/christiane-olk/ (and, by the same template, all six HEARoes bio pages) — “Read more stories:” module
Severity: mean 1.33 · spread 1 (ratings 1/2/1) · found by 1 of 3 · candidate

M63 · Form placeholder colour set at 45% alpha of the text colour

Criterion: M5 — Accessible
Location: / — dialog.hearo-modal placeholders (“Write your full name”, “Write your email”, “Write your story”)
Severity: mean 1.33 · spread 1 (ratings 1/2/1) · found by 1 of 3 · candidate

M43 · Eyebrow and heading render independently; nothing prevents identical strings

Criterion: R10 — As little design as possible
Location: Homepage #hearoesspan.eyebrow and the <h2> inside the same .section__head
Severity: mean 1.00 · spread 0 (ratings 1/1/1) · found by 1 of 3 · candidate

M48 · Neither overlay binds an Escape-key handler

Criterion: H3 — User control and freedom
Location: / (homepage), “Share your story” dialog, and separately the mobile navigation overlay
Severity: mean 0.67 · spread 1 (ratings 0/1/1) · found by 1 of 3 · candidate


7. Disagreement register

Items where the three raters differed by 2 or more points. Reported rather than averaged away — a split of 1/3/1 conceals total disagreement behind a tidy mean.

Item Ratings (R1/R2/R3) Mean Spread Note
M37 · submit handler shows the raw error message to the visitor 3/4/2 3.00 2 The only item any rater placed at 4 besides M40. One rater judged it catastrophic, one minor.
M50 · interactive init is scroll-gated, so handlers are unbound on a fresh load 3/1/3 2.33 2 Two raters treat it as a broken primary action; one as cosmetic. Likely turns on whether the rater reproduced it.
M41 · discard guard uses a native confirm(), not tied to clearing 1/3/2 2.00 2 Confirmed by two evaluators; raters disagree on whether it costs the visitor anything.
M55 · #cookies anchor points at the wrong heading 3/2/1 2.00 2 Verified live: #cookies resolves to the H2 “Third-party services”.
M47 · dialog open state not paired with role/aria-modal wiring 1/3/1 1.67 2 Probably a false positive. The live <dialog> carries aria-labelledby="hearo-modal-heading", and a native dialog opened modally has an implicit role and modal semantics. Retained, flagged, and recommended for removal at adjudication.

Rater behaviour, stated because it bears on every mean in this report. The three raters used the scale differently: R1 spread across 0–3 (mean 2.23), R2 across 1–4 (mean 2.42), R3 across 1–3 with 62% of items on a single value (mean 1.98). R3 never used 0 or 4. No rating was re-weighted or adjusted — doing so would be editing the result — but a reader comparing two means that differ by 0.33 should know that much of that distance is rater calibration rather than the findings.


8. What works well

Documented so it is not removed in a later iteration. A Faber-Ludens Pro standard, not an NN/g requirement. Each was independently verified by at least one evaluator; the first four were reported by all three.


9. Remediation against the 2026-08-28 baseline

This section was produced by a party that did not run Phase 1. The lead performed it after the merged list was closed and severity was rated, and after opening the earlier internal record for the first time. The evaluators never saw the baseline.

Items are matched by ROOT CAUSE, not by title or ID. A remediation that changed the symptom while leaving the cause in place reads as “Fixed” under title-matching and “Partial” under cause-matching. The second is the true answer, and this table gives it.

Baseline item Root cause then Status Evidence today
P-04 form captures health data with no consent step No consent affordance or privacy link at the point of collection Unfixed Live dialog fields are name, email, country, story, plus a honeypot. Zero consent checkboxes and zero privacy links inside the dialog. Now unconditional — the client confirmed on 07/08 that the form ships. → M40, mean 3.33
P-05 hero video autoplays and loops with no pause control No usable mechanism to pause moving content ⚠️ Partial A control now exists — button.media-toggle, “Pause background video” — but its bounding box is at y = −748.8, entirely above the viewport, reachable only by keyboard focus. Under title-matching this is “Fixed”. Under cause-matching it is Partial: a pointer or touch visitor still has no way to stop the video.M17, mean 2.33
N-01 hero copy fails contrast at every scrim setting One scrim control governing two text colours with opposite needs Unfixed Independently re-measured this run on the true rendered composite: the white intro paragraph measures 1.88:1 median at t = 16 s, far below the 4.5:1 its size requires. The scrim is still a single white radial gradient. → M16, mean 3.00
P-07 Join card 3 has no title; duplicate CTAs in one section Empty title field rendered without fallback; cards wired to one shared action Unfixed Third card still renders with no heading. → M32, mean 2.67; M33, mean 2.00
P-03.2 / P-03.3 / P-06 form error and success states unusable and unannounced Nothing announced to assistive technology; raw server strings shown Fixed (announcement) / ⚠️ Partial (content) role="alert" now on .hearo-modal__error and role="status" on .hearo-modal__state — the baseline measured zero of these. The announcement defect is genuinely resolved. The content defect is not: the handler still renders the raw message. → M37, mean 3.00
N-04 modal has no accessible name Dialog not associated with its heading Fixed <dialog class="hearo-modal" aria-labelledby="hearo-modal-heading">.
P-03.4 * marks required fields but is never explained No legend for the convention Unfixed No required-field explanation anywhere in the dialog.
N-09 hero poster named hero-placeholder.jpg Placeholder asset never replaced Unfixed poster="…/hero-placeholder.jpg". ⚠ Not surfaced by any evaluator this run — second recorded detection gap.
N-05 / N-06 untranslated strings and divergent labels on /de/ German build not brought to parity Not assessed German is out of scope by the client’s decision for this evaluation. No claim is made about its current state.
P-01 / P-02 / N-07 / N-08 anchor mis-landing, logged-in-only defect, touch targets, unnamed carousel tracks Partially superseded Related causes appear this run as M45 (footer hit areas) and M26 (carousel state not exposed). The anchor mis-landing was not reproduced: one evaluator recorded the fixed header not covering anchor targets as a positive finding.

One item fixed during this evaluation

Footer accessibility control. Evaluators A and B found it wired to the skip-link anchor with no accessibility statement behind it. Evaluator C, inspecting a later build, found a working preferences dialog and recorded it as a positive. Verified: the control is now <button class="accessibility-pill" data-prefs-open aria-haspopup="dialog">. Fixed during the run — it is not a case of one evaluator missing what another saw.

Summary

Of the baseline items within this document’s reporting scope: 2 fixed, 1 fixed during this evaluation, 2 partial, 4 unfixed, 2 not assessed (German, out of scope).

Two further baseline items are tracked in Faber-Ludens Pro’s internal record and sit outside this document’s reporting scope. The two “partial” rows are the ones worth the client’s attention — in both, work was done and the visitor’s problem remains.


10. Return path

What Who To whom When
Confirm which findings were acted on Carlos Gonçalo (Faber-Ludens Pro) Before the MED-EL handover
Legal wording for the consent statement (M40) MED-EL / DPO Coopers + Faber-Ludens Pro Blocking — before the form ships
Plain-language consent copy (M40) Faber-Ludens Pro Carlos On request; ready
Re-evaluation of corrected items Faber-Ludens Pro Mode C, after remediation

On M40 specifically, the three owners are different people and it should not wait on the wrong desk. The mechanism is Carlos’s, the plain-language copy is ours and is available on request, and the confirmation that the stated lawful basis is one MED-EL’s DPO will stand behind is MED-EL’s. It is neither ours nor Coopers’ to decide.