{
 "schemaVersion": 1,
 "generatedAt": "2026-11-09T12:03:53.273Z",
 "commit": {
  "sha": "3b98638a815ece7b64b0f553209260a3fffd708f",
  "short": "3b98638"
 },
 "environment": {
  "kind": "ci",
  "os": "linux 7.0.0-1017-azure",
  "node": "v22.23.4",
  "runner": "github-actions",
  "baseUrl": "[local]",
  "productionUrl": "https://raqueeb.dev"
 },
 "status": "warning",
 "checks": [
  {
   "id": "build",
   "name": "Production build",
   "category": "technical",
   "status": "passed",
   "tool": "astro build + scripts/verify-build.mjs",
   "version": "7.3.8",
   "command": "npm run build",
   "summary": "52 pages, all required files present",
   "metrics": {
    "pages": 52,
    "missingFiles": 0
   },
   "evidence": "evidence/ci/2026-11-09-3b98638-build.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": []
  },
  {
   "id": "typescript",
   "name": "TypeScript and Astro check",
   "category": "technical",
   "status": "passed",
   "tool": "astro check",
   "version": "7.3.8",
   "command": "npx astro check",
   "summary": "0 errors",
   "metrics": {
    "errors": 0
   },
   "evidence": "evidence/ci/2026-11-09-3b98638-typescript.json",
   "testedAt": "2026-11-09T12:02:47.738Z",
   "limitations": []
  },
  {
   "id": "lint",
   "name": "ESLint",
   "category": "technical",
   "status": "passed",
   "tool": "eslint",
   "version": "10.14.0",
   "command": "npx eslint .",
   "summary": "0 problems",
   "metrics": {
    "problems": 0
   },
   "evidence": "evidence/ci/2026-11-09-3b98638-lint.json",
   "testedAt": "2026-11-09T12:02:51.756Z",
   "limitations": []
  },
  {
   "id": "format",
   "name": "Prettier",
   "category": "technical",
   "status": "passed",
   "tool": "prettier",
   "version": "3.9.10",
   "command": "npx prettier --check .",
   "summary": "all files formatted",
   "metrics": {
    "clean": true
   },
   "evidence": "evidence/ci/2026-11-09-3b98638-format.json",
   "testedAt": "2026-11-09T12:02:54.127Z",
   "limitations": []
  },
  {
   "id": "unit-tests",
   "name": "Unit tests (scoring)",
   "category": "reliability",
   "status": "passed",
   "tool": "node --test",
   "command": "npm test",
   "summary": "20 passed, 0 failed",
   "metrics": {
    "passed": 20,
    "failed": 0
   },
   "evidence": "evidence/ci/2026-11-09-3b98638-unit-tests.json",
   "testedAt": "2026-11-09T12:02:54.424Z",
   "limitations": []
  },
  {
   "id": "structured-data",
   "name": "Structured data",
   "category": "seo",
   "status": "passed",
   "tool": "scripts/qa/jsonld.mjs",
   "command": "node scripts/qa/jsonld.mjs",
   "summary": "52 pages, 50 JSON-LD blocks, types {\"BreadcrumbList\":49,\"Person\":2,\"ProfilePage\":1,\"WebSite\":1,\"SoftwareSourceCode\":38,\"CreativeWork\":6}",
   "metrics": {
    "problems": 0
   },
   "evidence": "evidence/structured-data/2026-11-09-3b98638-structured-data.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": []
  },
  {
   "id": "seo-crawl",
   "name": "SEO crawl",
   "category": "seo",
   "status": "passed",
   "tool": "playwright crawl (scripts/qa/full.mjs)",
   "version": "1.64.1",
   "command": "node scripts/qa/full.mjs [local] <out>",
   "summary": "51 pages; unique titles and descriptions, canonical, Open Graph, Twitter card, one h1 and valid JSON-LD on every page; 44 RSS links canonical",
   "metrics": {
    "pages": 51,
    "seoIssues": 0,
    "rssItems": 44,
    "rssProblems": 0
   },
   "evidence": "evidence/seo/2026-11-09-3b98638-seo-crawl.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": []
  },
  {
   "id": "accessibility-axe",
   "name": "Accessibility (axe, dark and light)",
   "category": "accessibility",
   "status": "passed",
   "tool": "@axe-core/playwright, WCAG 2.0/2.1/2.2 A+AA and best-practice",
   "command": "node scripts/qa/full.mjs [local] <out>",
   "summary": "0 violations across 51 pages in both themes; 0 console messages; 0 failed requests",
   "metrics": {
    "pages": 51,
    "violations": 0,
    "consoleMessages": 0,
    "failedRequests": 0,
    "overflowPages": 0
   },
   "evidence": "evidence/accessibility/2026-11-09-3b98638-accessibility-axe.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": [
    "Automated rules only; no screen-reader session"
   ]
  },
  {
   "id": "links",
   "name": "Broken links",
   "category": "seo",
   "status": "warning",
   "tool": "fetch (scripts/qa/full.mjs)",
   "command": "node scripts/qa/full.mjs [local] <out>",
   "summary": "124 internal and 76 external links; 0 broken; 14 unverifiable (bot-walled hosts)",
   "metrics": {
    "internal": 124,
    "external": 76,
    "broken": 0,
    "unverifiable": 14
   },
   "evidence": "evidence/links/2026-11-09-3b98638-links.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": [
    "Unsplash and LinkedIn answer scripts with 401/999 and the source repository is private; those links are verified by hand"
   ]
  },
  {
   "id": "responsive",
   "name": "Responsive viewports",
   "category": "mobile",
   "status": "passed",
   "tool": "playwright (scripts/qa/viewports.mjs)",
   "version": "1.64.1",
   "command": "node scripts/qa/viewports.mjs [local]",
   "summary": "84/84 width and theme combinations pass (320, 375, 390, 768, 1024, 1440 px; dark and light)",
   "metrics": {
    "combinations": 84,
    "failing": 0
   },
   "evidence": "evidence/responsive/2026-11-09-3b98638-responsive.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": []
  },
  {
   "id": "keyboard",
   "name": "Keyboard and cross-browser",
   "category": "accessibility",
   "status": "passed",
   "tool": "playwright: Chromium, Firefox, WebKit (scripts/qa/kbd.mjs)",
   "version": "1.64.1",
   "command": "node scripts/qa/kbd.mjs [local]",
   "summary": "66/66 passed, 0 skipped by design",
   "metrics": {
    "passed": 66,
    "total": 66,
    "skipped": 0,
    "failed": 0
   },
   "evidence": "evidence/accessibility/2026-11-09-3b98638-keyboard.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": []
  },
  {
   "id": "lighthouse",
   "name": "Lighthouse (lab)",
   "category": "performance",
   "status": "passed",
   "tool": "lighthouse (scripts/qa/lh-batch.mjs)",
   "version": "13.5.0",
   "command": "node scripts/qa/lh-batch.mjs [local] <out> 1",
   "summary": "12 page/preset runs, medians of 1 mobile run(s): lowest performance 99, accessibility 100, best practices 100, SEO 100; slowest mobile LCP 2.0 s",
   "metrics": {
    "performanceScore": 99,
    "accessibilityScore": 100,
    "bestPracticesScore": 100,
    "seoScore": 100,
    "worstMobileLcpMs": 2035,
    "erroredRuns": 0,
    "mobileRuns": 1
   },
   "evidence": "evidence/lighthouse/2026-11-09-3b98638-lighthouse.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": [
    "Lab measurement under simulated throttling; not real-user data",
    "TBT is a lab diagnostic, not INP"
   ]
  },
  {
   "id": "security-headers",
   "name": "Security headers, redirects and exposure (production)",
   "category": "security",
   "status": "passed",
   "tool": "fetch",
   "command": "HTTPS requests to https://raqueeb.dev",
   "summary": "all 8 headers present; www, http and trailing-slash redirects 301; security.txt served; admin no-store and noindex; no source files exposed; production is d449f63",
   "metrics": {
    "missingHeaders": 0,
    "exposedFiles": 0,
    "securityTxt": 200,
    "productionCommit": "d449f63",
    "productionMatchesThisCommit": false
   },
   "evidence": "evidence/security/2026-11-09-3b98638-security-headers.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": [
    "Configuration checks against the production host as it is at run time, which may be the previous commit; not a penetration test"
   ]
  },
  {
   "id": "dependencies",
   "name": "Dependency audit",
   "category": "security",
   "status": "warning",
   "tool": "npm audit",
   "version": "10.9.9",
   "command": "npm audit --json (production and all)",
   "summary": "0 findings in shipped dependencies (0 high or critical); 14 including development tooling",
   "metrics": {
    "productionTotal": 0,
    "productionHighOrCritical": 0,
    "allTotal": 14
   },
   "evidence": "evidence/security/2026-11-09-3b98638-dependencies.json",
   "testedAt": "2026-11-09T12:03:53.273Z",
   "limitations": [
    "Findings are confined to development tooling that never reaches visitors"
   ]
  }
 ],
 "assessment": {
  "id": "2026-11-03",
  "date": "2026-11-03",
  "commit": {
   "sha": "4af6a7cec2d8a44aaee1630bb64183bf1dcdfcba",
   "short": "4af6a7c"
  },
  "relation": "historical",
  "commitsBehind": 13
 },
 "score": {
  "status": "scored",
  "methodologyVersion": 1,
  "overall": {
   "precise": 9.32,
   "rounded": 9.32
  },
  "formula": "overall = sum(category score × weight) / 100, weights in percent",
  "weights": {
   "design": 10,
   "ux": 10,
   "seo": 10,
   "performance": 10,
   "accessibility": 10,
   "mobile": 10,
   "content": 10,
   "branding": 5,
   "technical": 10,
   "conversion": 5,
   "security": 5,
   "reliability": 5
  },
  "categories": [
   {
    "id": "design",
    "score": 9.2,
    "weight": 10
   },
   {
    "id": "ux",
    "score": 9.2,
    "weight": 10
   },
   {
    "id": "seo",
    "score": 9.5,
    "weight": 10
   },
   {
    "id": "performance",
    "score": 9.7,
    "weight": 10
   },
   {
    "id": "accessibility",
    "score": 9.3,
    "weight": 10
   },
   {
    "id": "mobile",
    "score": 9.6,
    "weight": 10
   },
   {
    "id": "content",
    "score": 8.8,
    "weight": 10
   },
   {
    "id": "branding",
    "score": 9.3,
    "weight": 5
   },
   {
    "id": "technical",
    "score": 9.3,
    "weight": 10
   },
   {
    "id": "conversion",
    "score": 9,
    "weight": 5
   },
   {
    "id": "security",
    "score": 9.4,
    "weight": 5
   },
   {
    "id": "reliability",
    "score": 9.5,
    "weight": 5
   }
  ],
  "missing": []
 },
 "confidence": "low",
 "limitations": [
  "Gallery uses credited Unsplash photographs rather than original photography",
  "Al Safsaaf case study needs the owner's actual role and lessons learned",
  "LinkedIn profile URL requires manual verification",
  "Search Console verification and sitemap submission pending",
  "No real-user Core Web Vitals field data yet",
  "No screen-reader session or penetration test",
  "Automated rules only; no screen-reader session",
  "Unsplash and LinkedIn answer scripts with 401/999 and the source repository is private; those links are verified by hand",
  "Lab measurement under simulated throttling; not real-user data",
  "TBT is a lab diagnostic, not INP",
  "Configuration checks against the production host as it is at run time, which may be the previous commit; not a penetration test",
  "Findings are confined to development tooling that never reaches visitors"
 ]
}
