Skip to content

fix: portfolio consistency, truth and QA hardening v1 - #21

Merged
UAJOP merged 8 commits into
mainfrom
fix/portfolio-consistency-qa-v1
Aug 22, 2026
Merged

fix: portfolio consistency, truth and QA hardening v1#21
UAJOP merged 8 commits into
mainfrom
fix/portfolio-consistency-qa-v1

Conversation

@UAJOP

@UAJOP UAJOP commented Aug 22, 2026

Copy link
Copy Markdown
Owner

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:

Family Pages Socials Positioning copy
Legacy 8 5 ✅ "…practical AI workflows and software products."
V2 10 0 "…reliable AI systems and product-minded software."
Minimal 3 (labs, now, project-detail) 0 "AI Designer & Software Developer."
index.html 1 3 ❌ (no Instagram/X) V2 wording

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 in portfolio-data.js (profile.socials, profile.footerTagline) and the guard verifies every rendered footer against them. The positioning sentence uses the V2 data-pv2-en/tr pattern so it switches EN/TR on every page, including the legacy boot path.

2. Portfolio truth

updatedAt was 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, with package-lock.json committed and CI on npm ci. Adds two committed scripts CI previously improvised inline or lacked: qa:js and qa:links.

4. CI enforcement

Blocking Report-only
JS syntax, portfolio consistency, internal links, HTML structural errors, spelling, Pa11y WCAG2AA Lighthouse, external link availability

HTML validation blocks without hiding anything: html-validate already 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 use set -o pipefail so tee can'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 --check clean.

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:

  • Primary target: Forward Deployed Engineer
  • Professional background: AI Designer & Software Developer
  • Evidence focuses: Applied AI / AI Reliability, Solution Engineering, Software / Product Engineering, Interactive Systems
  • Existing ?role=applied-ai, ?role=solution-engineering, ?role=software and ?role=game links remain compatible, but now select capability/evidence focus instead of changing the primary identity.
  • Public alternate-role chip arrays were removed from the registry and Recruiter Mode.
  • Homepage, About, SEO/current-profile copy, all 19 canonical footers and Ajoop now retain one coherent primary target.
  • Ajoop role-fit answers always state the Forward Deployed Engineer direction before mapping relevant evidence.
  • The Consistency, footer and QA hardening Build Log entry is now shipped with completed/past-tense EN/TR copy.

Historical and project-specific truth deliberately preserved:

  • SINAMA — Product Designer & Full-Stack Developer
  • Merge Rush — Game Developer & Product Designer
  • CBOT — AI Designer
  • Hospital System — Software Developer
  • Outlier AI — AI Training Specialist

Fresh continuation QA: npm ci pass; 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.

UAJOP and others added 8 commits August 22, 2026 21:52
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
UAJOP marked this pull request as ready for review August 22, 2026 20:37
@UAJOP
UAJOP merged commit 559ffdd into main Aug 22, 2026
2 checks passed
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