fix: portfolio consistency, truth and QA hardening v1 - #21
Merged
Conversation
The footer had drifted into three different components. 10 V2 pages had no social links at all (works, games, labs, now, blog, about, request, project-detail, sinama-case-study, merge-rush-case-study), index.html exposed only 3 of 5 platforms, and the positioning sentence existed in three different wordings across page families. Every public page now renders the same footer: brand linked home, the current Architecture V2 positioning statement, the full canonical set of five social destinations, and the copyright line. Social URLs are the ones already used by the established footer implementation; none were invented and no platform had a conflicting URL. Links stay static hrefs so the footer still works without JavaScript. Each icon-only link keeps its existing translated accessible name, the icon is aria-hidden, and external links carry target="_blank" plus rel="noopener noreferrer". The positioning sentence uses the V2 data-pv2-en/tr pattern so it switches EN/TR on every page, including the legacy boot path. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The registry still advertised Portfolio Architecture V2 as actively building even though it shipped, and updatedAt was two days stale. Build log now reflects what actually shipped, using the real merge dates from git rather than approximations: Architecture V2 (2026-08-20, shipped), the V2 production audit and the semantic card/accessibility cleanup (both 2026-08-22, shipped), plus the consistency and QA hardening currently in progress. SINAMA and Merge Rush entries are preserved so product work stays visible. Also adds the canonical social destinations and footer tagline to the registry so the consistency guard has a single source of truth to check rendered footers against. Ajoop's latest-build answer and Recruiter Mode's data-freshness stamp read from the registry and pick this up automatically (verified). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The QA devDependencies all used "latest", so the same git revision could install a different toolchain on any later day and silently change what CI enforces. They are now pinned to the exact versions that reproduce the current passing suite, and package-lock.json is committed so npm ci installs precisely that set. Adds two committed check scripts that CI previously improvised inline or did not have at all: - qa:js parses every root JS file, since the compatibility bootloader loads them at runtime with no build step to catch syntax errors - qa:links validates internal references deterministically: page targets, anchors, footer brand links, recruiter role deep links, project slugs and registry case-study routes Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The workflow was intentionally report-first while a clean baseline was
established. That baseline now holds, so the checks whose outcome is
fully determined by the repository become real gates:
BLOCKING JS syntax, portfolio consistency, internal links, HTML
structural errors, spelling, Pa11y WCAG2AA
REPORT Lighthouse, external link availability
HTML validation blocks without hiding anything: html-validate already
exits 0 when only warnings remain and 1 on structural errors, so no
wrapper or rule suppression was needed and the intentional canvas
warnings still print. Piped steps use set -o pipefail so tee cannot mask
a failure.
Lighthouse and Lychee stay report-only on purpose: runner load, CDN
latency and social sites that rate-limit bots must not gate a merge.
Deterministic internal links are covered by the new blocking step.
Install switches to npm ci so CI uses the committed lockfile.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Locks in everything this branch fixed so it cannot silently drift back:
FOOTER every page renders the footer; brand links home; each of the five
canonical platforms appears exactly once with the registry URL;
no non-canonical external footer URLs; target/rel/accessible name
on every icon link; canonical positioning copy present and the
three retired wordings absent; copyright kept.
TRUTH updatedAt cannot fall behind the newest build log entry;
Portfolio Architecture V2 cannot read as "building" now that it
shipped; build log stays in descending date order.
QA package-lock.json committed; no QA dependency pinned to "latest";
CI installs with npm ci; and no deterministic CI step may be
continue-on-error (only Lighthouse is allowed to be report-only).
Each of the 12 guards was verified to fail when its regression is
reintroduced, then restored.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
QA_BASELINE.md described a pre-V2 snapshot (7 Pa11y pages, ~90 HTML warnings) that no longer matched reality. It now records the measured state of this branch: 0 HTML errors with 3 accepted canvas warnings, 11/11 Pa11y pages, 0 spelling issues, 0 broken internal links across 453 references, and Lighthouse accessibility/best-practices/SEO at 100 on all 11 pages. Local Lighthouse performance is reported honestly as CDN-bound rather than presented as a regression. SITE_PREFLIGHT.md documented the workflow as report-first, which is no longer true. It now lists exactly which checks block and why, and which stay report-only because they depend on the network. CAREER_ALIGNMENT_REPORT.md is marked Historical / Superseded and points at the current sources of truth. Its "remaining work" list had already been completed or deliberately replaced, and future contributors could easily have read those stale TODOs as current instructions. README and PORTFOLIO_ARCHITECTURE gain the canonical footer contract and the updated QA enforcement model. cspell learns "lhci", the real @lhci/cli binary name. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
UAJOP
marked this pull request as ready for review
August 22, 2026 20:37
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.
Makes the current architecture internally consistent: one canonical footer everywhere, current portfolio truth, a reproducible QA toolchain, real CI gates, and documentation that no longer describes historical states as current.
The site should look almost identical — except that every page now has the same, complete footer.
1. Canonical footer
The footer had silently drifted into three different components:
All 19 pages now render one footer: brand linked home, the Architecture V2 positioning statement, all five canonical social destinations, copyright.
No URL was invented and no platform had a conflicting URL — each of the five appears exactly once across the repo. Links stay static
hrefs so the footer survives a JS failure; canonical values live inportfolio-data.js(profile.socials,profile.footerTagline) and the guard verifies every rendered footer against them. The positioning sentence uses the V2data-pv2-en/trpattern so it switches EN/TR on every page, including the legacy boot path.2. Portfolio truth
updatedAtwas two days stale and Architecture V2 still read as "building" after it shipped. Build log now uses the real merge dates from git rather than approximations — note the brief said V2 shipped 2026-08-19, but git says 2026-08-20; I used git.Ajoop's latest-build answer and Recruiter Mode's freshness stamp read from the registry and picked this up automatically (verified in-browser).
3. QA toolchain
Every QA dependency was
"latest", so the same revision could install a different toolchain any later day. Now pinned exactly to the versions that reproduce the passing suite, withpackage-lock.jsoncommitted and CI onnpm ci. Adds two committed scripts CI previously improvised inline or lacked:qa:jsandqa:links.4. CI enforcement
HTML validation blocks without hiding anything:
html-validatealready exits 0 on warnings-only and 1 on structural errors, so no wrapper or rule suppression was needed and the intentional canvas warnings still print. Piped steps useset -o pipefailsoteecan't mask a failure. Lighthouse and Lychee stay report-only on purpose — runner load, CDN latency and bot-blocking social sites must not gate a merge.5. Results
JS syntax 16/16 · consistency pass · internal links 0 broken / 453 refs · HTML 0 errors, 3 accepted canvas warnings · spelling 0 · Pa11y 11/11 · Lighthouse a11y/best-practices/SEO 100 on all 11 pages, CLS ≤0.017 · console 0 errors across 19 pages ·
git diff --checkclean.Browser-verified: 19/19 footers canonical, 54 viewport×page footer checks clean at 1440/1366/768/390/360/844×390 (including a chat-launcher overlap check), footer EN/TR, predictable footer tab order with unique accessible names, and no regression to Recruiter Mode, role deep links, Ajoop, Command Palette, Works filters/search, mobile nav, theme or the legacy boot path.
12 new regression guards, each verified to fail when its regression is reintroduced, then restored.
Local Lighthouse performance is 62–67; that's the pre-existing third-party CDN cost measured during the V2 audit (removing the two CDN stylesheets moves index 62→92; removing all V2 JS moves it 62→67). Deliberately untouched — that's the next asset pass.
No merge. Draft for review.
🤖 Generated with Claude Code
Career Title Consolidation
BEFORE: multiple competing target job titles were exposed across Recruiter Mode, the registry, homepage positioning and Ajoop.
AFTER:
?role=applied-ai,?role=solution-engineering,?role=softwareand?role=gamelinks remain compatible, but now select capability/evidence focus instead of changing the primary identity.Consistency, footer and QA hardeningBuild Log entry is now shipped with completed/past-tense EN/TR copy.Historical and project-specific truth deliberately preserved:
Fresh continuation QA:
npm cipass; deterministic QA pass; JavaScript syntax 16/16; internal links 453 references / 0 broken; spelling 0; HTML 0 errors (3 existing warnings); Pa11y 11/11; Lighthouse 11/11 with minimum scores Performance 93, Accessibility 100, Best Practices 100 and SEO 100; browser console 0 errors. Desktop 1440×900 and mobile 390×844 checks covered all four focus views in EN/TR, Ajoop role-fit, About and the requested footer page set.