Files
felhom.eu/documentation/audits/redesign-2026-10-10/PREFLIGHT.md
T
admin 0c86e698b0
gates / gates (push) Failing after 5m58s
docs: record the placement change and re-measure after it
Every document that described the biography as a home-page section would now be
wrong, so each is corrected rather than left:

  ki-all-mogotte.md  gains 'Where it ended up' with the operator's reasoning, the
                     rejected /rolam option, and why the home page keeps a trace
  AUDIT.md           lever 2 carries a dated revision note (the audit itself is a
                     record of what was found, so it is annotated, not rewritten)
  PREFLIGHT.md       re-measured on the deployed page after the move:
                       1440: 6 780 -> 6 385 px  (42% shorter than the old page)
                        390: 10 865 -> 10 145 px (49% shorter, 23.6 -> 12.0 screens)
                       sections 10 -> 9, layout families 10 -> 9, still no repeat
                       eyebrow allowance 4 -> 3, still 0 used
  website/CHANGELOG  the live change, with the layout bug that the deployed page
                     revealed and the markup did not
  REPORT + STATUS    what is live vs what is still waiting on the operator

The numbers moved because a whole section left the page; leaving the old ones in
place would have been a quiet overclaim in the other direction.
2026-10-11 09:29:47 +02:00

125 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Pre-flight — taste-skill §14 plus the Felhom additions
Run against the **deployed** preview at `https://felhom.eu/preview/`, 2026-10-10, not against the
file on disk. Every measurement came from the browser.
> **Updated 2026-10-11.** „Ki áll mögötte" moved to `/kapcsolat` + `/en/contact` at the operator's
> request, leaving a compact portrait-and-one-line row in the home page's closing call to action.
> The home page is therefore 9 sections rather than 10, and shorter than first measured. Every number
> below is re-measured on the deployed page after that move.
## Headline numbers
| | Old home page | New preview | |
|---|---|---|---|
| Page height, 1440 px | 10 922 px | **6 385 px** | 42% shorter |
| Page height, 390 px | 19 913 px | **10 145 px** | 49% shorter, 23.6 → 12.0 phone screens |
| Initial load (same conditions) | 13 requests, 308 KB | **11 requests, 260 KB** | |
| Fully loaded (all assets) | 16 requests, ~540 KB | 15 requests, ~545 KB | **essentially unchanged** |
| Third-party hosts | 0 | **0** | |
| Em dashes in the page's own copy | 18 | **0** | |
| Layout families for 11 / 9 sections | 8 (3 repeats) | **9 (no repeat)** | |
| JetBrains Mono fetched | yes, 31 KB, for 13 characters | **no** | |
**Honest reading of the weight.** The *initial* load is 48 KB lighter. The *fully scrolled* page is
about the same: the new 93 KB portrait is paid for by dropping the 49 KB decorative `logo.png` and
the 31 KB mono font. The redesign is not a weight win once you scroll; it is a weight win for the
first screen, which is the one most visitors see. R-931 (no gzip anywhere on the site) is worth far
more than anything on this page.
## taste-skill §14
| Check | Verdict |
|---|---|
| Brief inference declared (§0.B) | **Pass** — AUDIT.md §A |
| Dial values explicit and reasoned | **Pass** — 6 / 3 / 4, AUDIT.md §I |
| Design system chosen or aesthetic labelled honestly | **Pass** — Felhom design system v2, no new system |
| Redesign mode detected, audit performed (§11) | **Pass** — preserve; AUDIT.md |
| **ZERO em dashes** | **Pass with two stated exceptions** — 0 in the page's own copy. 6 remain in `<title>`/description/OG/Twitter/JSON-LD **by operator decision at STOP 1** (indexed strings), 1 in the shared footer, which gate 3 forces to be identical on 14 pages. Neither swept silently |
| Page Theme Lock — one theme | **Pass** — dark throughout, no section inverts |
| Color Consistency Lock — one accent | **Pass** — `--blue` / `--blue-bright` only |
| Shape Consistency Lock — one radius | **Pass** — `--radius: 2px` everywhere |
| Button Contrast Check | **FAIL, pre-existing, filed** — `.cta-button` is 4.01:1 (white on `#0083D8`, 16px/600) against a 4.5 floor. **Identical on the live page**, so not a regression. R-930, needs a brand decision |
| CTA Button Wrap — no 2-line label at desktop | **Pass** |
| Form Contrast Check | **n/a** — no form on this page |
| Serif discipline | **n/a** — no serif |
| Premium-consumer palette ban | **n/a** — not that brief |
| Italic descender clearance | **n/a** — no italic display type |
| Hero fits viewport, ≤2-line headline, ≤20-word subtext | **Pass** — headline 2 lines, subtext **20 words**, CTA and a real screenshot both above the fold at 1440 and at 390 |
| Hero top padding ≤ `pt-24` | **Pass** — 128 px, and the hero is sized by its content; the old one was a forced `100vh` band with the content floating in the middle |
| Hero stack ≤ 4 text elements | **Pass** — headline, subtext, CTA, figure caption. No eyebrow, no tagline under the CTA, no trust strip |
| **Eyebrow count ≤ ceil(sections/3)** | **Pass — 0 of an allowed 3.** The cluster headings are not eyebrows (no uppercase, no tracking, they head real groups), and the comparison's column headers were deliberately de-capitalised for this rule |
| Split-Header Ban | **Pass** — every section header stacks headline over body |
| Zigzag Alternation Cap | **Pass** — the two image+text splits (hero, portrait) are separated by two other families |
| No Duplicate CTA Intent | **Pass** — one label, „Jelentkezem tesztelőnek", used for the one intent in both places |
| Logo wall = logos only | **n/a** — no logo wall |
| Bento Background Diversity | **n/a** — no bento |
| „Used by" wall under the hero | **n/a** |
| **Copy Self-Audit** | **Pass** — every visible string re-read. The ten capability texts are **verbatim from the live page** on purpose: the audit's finding was that the writing is right and the layout is wrong, so no hedge („ha van", „szinte mind") was rewritten away |
| Motion motivated | **Pass** — there is no motion. The old hero's infinite float is gone |
| Marquee max one | **n/a** — none |
| Navigation one line, ≤80 px | **Pass** — unchanged from the live nav, spliced verbatim |
| **Section-Layout-Repetition** | **Pass** — 9 sections, 9 families. Was 11 sections over 8 families, `why-grid` ×3 and `apps-showcase` ×2 |
| Bento rhythm and exact cell count | **n/a** |
| Long lists use the right component | **Pass** — the ten-card grid became three labelled clusters (§4.9 „grouped chunks") |
| **Real images, no fake screenshots** | **Pass** — one real dashboard screenshot in the hero, four in the gallery, one real photograph of the operator. No AI image, no stock, no picsum, no div-built preview. The decorative logo is gone from the hero |
| No pills over images | **Pass** |
| No photo-credit decoration | **Pass** |
| No version footers | **Pass** |
| No micro-meta sentences under eyebrows | **Pass** |
| No hero-bottom decoration strip | **Pass** |
| No floating top-right sub-text | **Pass** |
| No filled progress-bar comparisons | **Pass** — the comparison is text in two columns |
| No locale / weather strips | **Pass** |
| No scroll cues | **Pass** |
| No version labels in the hero | **Pass** |
| **No section-numbering eyebrows / generic step labels** | **Pass** — `1..5` and `01..05` are gone; the steps are named by their verb-noun and ordered by layout |
| No decorative dots | **Pass** |
| No `border-t`+`border-b` on every row | **Pass** — the comparison uses one divider between rows, not a box per row |
| Content density sane | **Pass with a stated deviation** — the ten capability paragraphs run past §4.9's 25-word guide. Deliberate: see Copy Self-Audit |
| Quotes ≤3 lines | **n/a** — no testimonials |
| Motion claimed = motion shown | **Pass** — `MOTION_INTENSITY: 3` claims none and ships none |
| GSAP skeletons | **n/a** |
| No `window.addEventListener('scroll')` | **Pass** — the only JS is the existing nav toggle and `gallery.js` |
| Reduced motion honoured | **Pass** — the global `prefers-reduced-motion` block is present, and there is no animation to suppress |
| Dark mode tested | **Pass** — single locked dark theme, by brand decision |
| Mobile collapse explicit | **Pass** — every new multi-column rule has its `<900px` and `<600px` fallback written in the same block |
| Viewport stability, no `h-screen` | **Pass** — the new hero uses no viewport-height sizing at all; the old `.hero` used `100vh` |
| `useEffect` cleanup | **n/a** — no framework |
| Empty / loading / error states | **n/a** — static marketing page |
| Cards omitted in favour of spacing | **Pass** — the ten cards became three clustered lists; the comparison is a divided table, not eight boxes |
| Icons from an allowed library | **Pass, by the Felhom override** — the self-hosted `icons.svg` sprite is the library; no npm icon package |
| Motion isolated in client leaves | **n/a** |
| No AI tells from §9 | **Pass** |
| Core Web Vitals plausible | **Partly** — the hero image is `fetchpriority="high"` with width/height set, so LCP and CLS are in hand; **but nothing is compressed on the wire** (R-931), which is the real limiter |
| One design system | **Pass** |
## The Felhom additions (`felhom-web-design` §9)
| Check | Verdict |
|---|---|
| UTF-8 BOM on every page file | **Pass** — asserted by the builder and by `site_gates.py` gate 1 |
| Zero emoji | **Pass** — gate 2 |
| Zero `—` including meta | **Pass with the two stated exceptions above** |
| No `<style>` block; `site.css` `?v=` bumped | **Pass** — `?v=11` |
| **Every request to `felhom.eu` or `stats.felhom.eu`, listed from the browser** | **Pass** — 11 requests: `felhom.eu` 8, `stats.felhom.eu` 2, third-party **0**. Full list in the session report |
| Page weight compared and said out loud | **Pass** — table above, including the part that did not improve |
| Body contrast at or above baseline | **Pass after a fix.** Three new styles measured **3.88 / 3.14 / 3.57** on first pass, all under AA. Moved to `--text-2` and re-measured on the deployed file: **7.56 / 6.12 / 6.96**. One pre-existing failure remains and is filed (R-930) |
| Focus visible | **Pass** — `:focus-visible { outline: 2px solid var(--blue-bright) }` applies |
| Reduced motion honoured | **Pass** |
| **No horizontal scroll at 390 px** | **Pass** — `clientWidth == scrollWidth == 375` at 390, and `== 1425` at 1440 |
| English twin in the same commit | **Deferred to Part D by design** — a preview URL cannot be a `TWINS` pair (AUDIT.md §K.6). The twin is written in the switch commit, as a real twin |
| `repo_gates.py` green, new page registered | **Pass** — `site_gates.py` green; `preview/index.html` registered in `NO_TWIN` with its reason |
## A measurement that was wrong, and how it was caught
The first contrast pass reported `.limits p` at **1.17:1**, which would have been a severe failure.
It was an error in the measuring script, not in the page: the helper walked up for the first
non-transparent background and found `--warn-dim`, which is `rgba(224,169,62,.12)`, then treated that
translucent colour as if it were opaque. Compositing the whole ancestor stack over the page
background gives the true value, **5.67:1**, which passes. The three real failures in the same run
were real and were fixed.
The lesson is the project's own: an instrument that can report a wrong number silently is not a
measurement. The corrected helper is in the session transcript and composites every layer.