Repository navigation
feat(quality): untimed output quality pass with Lighthouse and SEO signals (spec 009) - #25
Merged
Merged
Conversation
…a11y, links, weight) Untimed quality pass over the output of one build per generator, as proposed in #22. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…t mounts on Playwright's Chromium The toolset runs in a container, so the site goes in with put_archive instead of a bind mount; Chrome for Testing has no Linux arm64 build, so Chromium comes from the pinned Playwright. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Join text nodes without a separator, as textContent does, so "<p>See <a>x</a>.</p>" yields "See x." instead of "See x .". Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…ork (spec 009 R-3..R-5) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ld (spec 009 R-1, R-2, R-6, R-17) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…v (spec 009 R-18, R-19) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…round input (spec 009 goal 4) Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
…-validate, lychee (spec 009 R-4, R-5) Pinned: lighthouse 13.5.0, chrome-launcher 1.2.2, playwright 1.64.0 (Chromium 156.0.8078.4), axe-core 4.14.0, html-validate 11.16.2, lychee 0.24.2, Node 24.21.0. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…(spec R-16) A malformed percent-escape or a read error now answers 404/500 instead of an unhandled rejection that killed the process before raw.json was written. Adds quality/test/bad-url.mjs as a regression check. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ct the build, CI checks Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
… reference site Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
4 tasks
…c 009 R-7) Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements spec 009 (closes #22).
--qualityadds an untimed pass that audits what each generator ships. It runs Lighthouse, collects SEO signals, validates the HTML, checks accessibility and broken links, and measures weight and JS. It does not change how builds are timed.How it works
Export: after a successful build,
DockerHelper.benchmarkcopies<WorkingDir>/<output_folder>out of the generator container before removing it.Collection:
quality/, runsquality/run.mjswithnetwork_mode="none"and no mounts.put_archive, andraw.jsoncomes out withget_archive. The toolset itself runs in a container, so bind mounts would need host paths.404.html. It runs Lighthouse with the mobile and desktop presets, 3 runs each, plus axe-core, html-validate, lychee (offline) and gzip/brotli sizes.Reduction: pure Python in
toolset/quality/(site,seo,reduce,runner) turnsraw.jsonintoquality.json. That covers the medians and ranges, 12 per-page SEO signals plus site-wide ones, HTML/axe/link counts, weight,jsClass,worksWithoutJsand extra output.Results:
results/<ts>/quality/<fw>/quality.json;results.json:quality.<fw>andenvironment.quality(the tool versions and the image id);summary.mdand aquality-summary.csv.There is no combined score and no ranking.
--parsekeepsquality.Isolation: the pass runs only after an
okbuild. With--suiteit runs only in thenf50-cs5cell. A failing check is recorded asstatus: errorand never changes a timing, a status or a ranking. Tests pin this.Pinned versions: lighthouse 13.5.0, chrome-launcher 1.2.2, playwright 1.64.0 (Chromium 156.0.8078.4), axe-core 4.14.0, html-validate 11.16.2, lychee 0.24.2, Node 24.21.0.
Spec changes found while planning
put_archiveinstead of a bind mount.Testing
pytest: 341 passed, 1 skipped.ruffis clean.quality/test/check-shape.mjson the fixture site, andquality/test/bad-url.mjspassed: a malformed URL does not crash the collector.quality-imageruns the collector on the fixture for amd64 and arm64.qualityruns./ssgberk --test hugo -nf 50 -cs 5 -mr 1 --qualityand checks every section, the 6 Lighthouse entries, scores in [0, 1],environment.qualityand the summaries.benchmark-round.ymlgets aqualityinput.Each of the 8 tasks had its own review, followed by a whole-branch review. Its findings were fixed in 5a712be:
out;bad-urlcheck was not in CI.🤖 Generated with Claude Code