Skip to content

Phase 1a.4: blocked — the footer cannot move alone (knowledge only) - #526

Merged
pftg merged 6 commits into
masterfrom
phase-1a4-rest-of-recolour
Aug 21, 2026
Merged

Phase 1a.4: blocked — the footer cannot move alone (knowledge only)#526
pftg merged 6 commits into
masterfrom
phase-1a4-rest-of-recolour

Conversation

@pftg

@pftg pftg commented Aug 21, 2026

Copy link
Copy Markdown
Member

First reviewable slice of Phase 1a.4. The scope item was "footer onto
surface-ink"
— five lines. It exposed twelve black SVG shape layers that had
to move with it, which is the substance of this PR.

What landed

Commit Change
1 footer.cssblack/white/#fffvar(--surface-ink) / var(--surface)
2 the two homepage shape layers (.home-proof, .home-why-us)
3 the remaining 10 shape layers across 8 more page bundles, baselines accepted
4 OKF sync

grep -rn 'fill: *#000' themes/beaver/assets/css/pages/ now returns nothing.

Untouched by design: /services/vibe-code-rescue/ keeps its dark variant
per site-palette, and carries no black shape fill.

Why the footer alone was not shippable

Moving it created a visible seam — the dark region above stayed pure black.
Measured, not eyeballed:

before fix:  band(50,200)=(0,0,0)      footer(50,700)=(20,17,15)
after fix:   band(50,200)=(20,17,15)   footer(50,700)=(20,17,15)

The culprit was an FL Builder SVG shape layer, and it was invisible to every
obvious instrument:

  • pointer-events: nonedocument.elementFromPoint is hit-testing, not
    painting, so it skipped the overlay and returned the white element beneath
  • paints via SVG fill, not background-color → no background grep matched
  • the rule lives in assets/css/**pages/**homepage.css, a different file from
    assets/css/homepage.css — one fix attempt edited the wrong file and changed
    nothing, which read as "not the cause"

What found it: enumerating document.styleSheets and asking
path.matches(rule.selectorText). Recorded in architecture/css-pipeline.md.

Gates

  • bin/test34 runs, 87 assertions, 0 failures, [snap_diff] 53 screenshots compared, no failures (after accepting baselines)
  • 10 baselines moved, each reviewed: homepage seam closed, services confirmed
    clean, rendered footer read as one coherent dark block
  • The three "unrelated" failures (blog codeblocks, pagination) are footer
    diffs — those section captures clamp at the page bottom and include the
    footer. Confirmed by reading the PNG.
  • bin/hugo-build clean
  • okf_validate .okf exits 0, conformant. --strict exits 1, as it does
    on this bundle by design — reported, not called green.
  • macOS only; Linux baselines belong to the parallel PR and were not touched

Deferred to part 2

One eyebrow style, three button roles, tags to ink across the remaining 17
bundles, and the --rr-* alias deletion (18 refs still live across 3 files, so
the block cannot go yet).

🤖 Generated with Claude Code

pftg and others added 4 commits August 21, 2026 03:09
Moving the footer to --surface-ink exposed a seam: the dark region directly
above it stayed pure black while the footer went warm. Measured, not eyeballed:
band(50,200)=(0,0,0) against footer(50,700)=(20,17,15).

The black was an FL Builder SVG SHAPE LAYER, not a CSS background - a
`path.fl-shape` filled #000000 by
`.home-proof .fl-builder-bottom-edge-layer .fl-shape-content .fl-shape` in
themes/beaver/assets/css/pages/homepage.css. Its sibling rule for
`.home-why-us` carried the same fill.

Three properties made it invisible to the obvious searches, which is why this
took several wrong turns and is worth recording:

* `pointer-events: none`, so `document.elementFromPoint` skips it entirely -
  every DOM probe reported the white `.fl-page-content` underneath.
* `fill`, not `background-color`, so every `background-color: #000` grep missed
  it.
* it lives in `pages/homepage.css`, a DIFFERENT file from
  `assets/css/homepage.css` - an earlier attempt edited the latter and changed
  nothing.

What found it: enumerating `document.styleSheets` and asking
`path.matches(rule.selectorText)` - letting the browser answer which rule wins
rather than inferring it from grep.

Verified: band(50,200) and footer(50,700) both (20,17,15) after the change.
Both fills moved together so the shape cannot drift from the footer again.

Gate: bin/test, 53 screenshots compared, 10 failures - all the intended footer/
shape recolour, baselines not yet accepted (next commit).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…s accepted

Completes the shape-layer sweep started for the homepage. Every
`.fl-builder-bottom-edge-layer .fl-shape-content .fl-shape` in pages/ now fills
`var(--surface-ink)` instead of #000000 - 12 rules across homepage, about-us,
services, single-service, use-cases, single-use-cases, clients, single-client
and careers. `grep -rn 'fill: *#000' themes/beaver/assets/css/pages/` returns
nothing.

Left deliberately alone: `/services/vibe-code-rescue/` keeps its own dark
variant per site-palette, and its CSS carries no black shape fill, so nothing
there was touched.

Baselines accepted for the 10 screenshots the recolour moved. Verified rather
than assumed:

* Homepage seam CLOSED - band(50,200) and footer(50,700) both (20,17,15),
  where they were (0,0,0) vs (20,17,15) before.
* Services page has no seam to close - band(50,200) is white there; its shape
  layer sits elsewhere on the page.
* The screenshot set is unchanged at 10 - the extra conversions moved no
  additional baselines, so no page regressed into the diff.
* Read the rendered homepage footer image: one coherent dark block, contrast
  and legibility intact, CTA and badge unaffected.

The three "unrelated" failures (blog codeblocks, blog pagination) ARE footer
diffs: those section captures clamp at the page bottom and include the footer.
Confirmed by reading the PNG, not inferred.

Gate: bin/test, 53 screenshots compared, 10 failures - all intended and now
accepted. macOS only; Linux baselines belong to the parallel PR and were not
touched.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…s it

architecture/css-pipeline.md already carried "computed style, not source,
proves the paint". Phase 1a.4 found the layer beyond it.

Moving the footer to --surface-ink exposed a black band above it. Every DOM
probe said WHITE; the screenshot said BLACK; the screenshot was right. It was an
FL Builder SVG shape layer, and three properties hid it:

* `pointer-events: none` - `document.elementFromPoint` is HIT-TESTING, not
  painting, so it skipped the overlay and returned the white element beneath.
* SVG `fill`, not `background-color` - no background grep could ever match it.
* the rule lives in `assets/css/PAGES/homepage.css`, a different file from
  `assets/css/homepage.css`. One attempted fix edited the wrong file and
  changed nothing, which read as "not the cause" and sent the hunt sideways.

What actually answers "which rule paints this pixel": enumerate
`document.styleSheets` and ask `el.matches(rule.selectorText)` - the browser
knows which rule wins, including overlays and SVG fills. Cheaper fallback:
sample the rendered pixel with `magick -format '%[pixel:p{x,y}]'`.

The layered form, now written down: source grep proves what the CSS SAYS,
computed style proves what an ELEMENT resolves to, only the pixel proves what
the USER sees. Each catches what the previous cannot, and a pointer-events:none
overlay defeats the middle one silently.

Timestamp anchored to a measured `date -u` (2026-08-21T01:43:19Z).

Gates: okf_validate .okf exits 0, conformant. `--strict` exits 1, as it does on
this bundle by design - reported rather than called green. bin/hugo-build clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: e647c49a-d7b3-4f41-aa57-9d4a47c172a8


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown
Contributor

pftg and others added 2 commits August 21, 2026 03:58
Reverting themes/ and the baselines to master. The OKF documentation commit
stays; the CSS does not. Reasons, all measured:

**The footer change is correct in isolation and unshippable in isolation.**
Moving `.footer-component` to --surface-ink (20,17,15) leaves every adjacent
dark surface at pure black, producing a visible tonal seam. Homepage:
band(50,200)=(0,0,0) against footer(50,700)=(20,17,15). Services: y250 and y350
both (0,0,0) against the same warm footer - confirmed identical in the live
render and the snapshot, so it is real and not a capture artifact.

**Neither scope produced a clean result:**

* Broad sweep (all 12 shape-layer fills -> token) closes the footer seams but
  OPENS internal ones. Verified in the browser: the `.home-proof` divider
  becomes (20,17,15) while the `.home-services` section it sits against stays
  (0,0,0). Review flagged this and it reproduces.
* Narrow (only the footer-adjacent divider) closes the homepage seam and leaves
  the services one open.

**The correct unit is bigger than "footer onto surface-ink".** Dividers and the
dark SECTIONS they abut have to migrate together, or the seam just moves. That
is a section-background migration across at least homepage, services,
single-service, use-cases, clients, careers and about-us - closer in size to
Phase 1b than to a 1a.4 line item.

**Also unresolved:** at least one painter on /services/ is invisible to DOM
inspection - `document.elementFromPoint` and a geometric scan of every element
both report white where the rendered pixel is black. The homepage instance
turned out to be a `pointer-events:none` SVG shape layer; the services one is
still unidentified. Migrating sections without knowing what paints them would
be guessing.

Shipping a seam is worse than shipping nothing, so nothing visual ships. What
survives is the css-pipeline knowledge, which is the durable part.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Review finding, verified and correct: my write-up claimed
`el.matches(rule.selectorText)` "returns the winning rule". It does not.
`matches()` proves only that a selector APPLIES - it resolves neither cascade
order nor specificity - and a pseudo-element selector can never match an
Element, so `::before`/`::after` painters need
`getComputedStyle(el, '::before')` separately. Following the recipe as written
would send a debugger confidently to the wrong rule.

Rewritten as: collect CANDIDATE rules with matches(), then decide between them
against the element's computed value, and handle pseudo-elements separately.

Also recorded, because it is the honest limit of the whole technique: the
candidate-rule method found the homepage painter and then FAILED on the
equivalent /services/ surface, where `elementFromPoint` and a geometric scan of
every element both report white against a rendered black pixel. That painter is
still unidentified. DOM inspection is evidence that can be silently incomplete;
the pixel is the fact.

Timestamp anchored to a measured `date -u` (2026-08-21T01:59:50Z).
bin/hugo-build clean. Bundle only.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@pftg pftg changed the title Phase 1a.4 (part 1): footer + 12 shape layers onto surface-ink Phase 1a.4: blocked — the footer cannot move alone (knowledge only) Aug 21, 2026
@pftg

pftg commented Aug 21, 2026

Copy link
Copy Markdown
Member Author

Scope changed during execution — all CSS and baselines reverted; this PR is now documentation only.

The scope item read "footer onto `surface-ink`". It is not a footer change:

Approach Result (measured)
Footer alone Seam on homepage AND services — adjacent dark surfaces stay (0,0,0) vs warm footer (20,17,15)
All 12 shape fills Closes footer seams, opens internal ones.home-proof divider (20,17,15) vs .home-services section (0,0,0)
Footer-adjacent only Closes homepage, leaves services

Dividers and the dark sections they abut must migrate together, or the seam relocates. That is a section-background migration across 7+ page bundles — Phase 1b in size, not a 1a.4 line item.

Unresolved blocker: at least one painter on /services/ is invisible to DOM inspection — elementFromPoint and a geometric scan of every element both report white where the rendered pixel is black. The homepage instance was a pointer-events:none SVG shape layer; this one is unidentified. Migrating sections without knowing what paints them is guessing.

Shipping a seam is worse than shipping nothing. What ships is the css-pipeline knowledge: computed style is not enough either, and the honest limits of each instrument.

@pftg
pftg merged commit ed82009 into master Aug 21, 2026
3 checks passed
@pftg
pftg deleted the phase-1a4-rest-of-recolour branch August 21, 2026 02:00
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant