{
  "url": "https://divar.ir",
  "auditedAt": "2026-07-22T18:34:19.976Z",
  "mode": "report",
  "status": "completed",
  "statusDetail": "Atomic coverage complete. External fetches occasionally received HTTP 429, so the HAR is not used for byte conclusions; browser trace, Lighthouse, DOM, screenshots, and successful crawler fetches provide the judgements.",
  "page": {
    "appType": "hybrid",
    "framework": "React-like bundled SPA with server-rendered detail pages",
    "notes": "Public Persian classifieds marketplace. Entry and listing/detail/auth templates were sampled. Search variants and private post-auth/account/payment states were not covered because they duplicate the listing template or require a real account; no destructive contact or posting action was performed."
  },
  "evidenceUsed": [
    "screenshot",
    "dom",
    "layout-metrics",
    "evaluate-probe",
    "discoverability",
    "trace",
    "har (429-limited, not used for weight verdicts)",
    "headers",
    "cookies",
    "trackers",
    "images",
    "heap-summary comparison",
    "Lighthouse",
    "direct HTTP fetch",
    "Modern Web Guidance 0.0.172"
  ],
  "guidanceConsulted": [
    "dark-mode",
    "component-specific-light-dark-theme",
    "accessibility",
    "adapt-scrollbar-to-contrast-preferences",
    "same-document-transitions",
    "cross-document-transitions",
    "group-element-transitions",
    "faster-spa-view-transitions",
    "scrollytelling",
    "parallax-scroll-effects",
    "scroll-entry-exit-effects",
    "carousel-slide-effects",
    "physics-based-easing",
    "individual-transform-properties",
    "animate-element-entry-exit",
    "animate-to-from-top-layer",
    "animate-to-intrinsic-sizes",
    "dynamic-sibling-animations",
    "interactive-content-reveal",
    "pull-to-reveal",
    "swipe-to-remove",
    "shrinking-header-on-scroll",
    "scroll-progress-indicator",
    "scroll-position-aware-elements",
    "scroll-snap-realtime-feedback",
    "scroll-snap-state-sync",
    "scroll-target-on-load",
    "soft-edge-content-fade",
    "scrollability-affordance-hints",
    "anchor-positioning-tab-underline",
    "position-aware-tooltips",
    "interest-triggered-tooltips",
    "interest-triggered-action-previews",
    "directional-navigation-transitions",
    "carousel-snap-highlights",
    "navigation-drawer",
    "stack-drill-down",
    "persistent-app-tours",
    "persistent-toast-notifications",
    "light-dismiss-a-dialog",
    "platform-controls-dismiss-dialog",
    "declarative-dialog-popover-control",
    "animated-select-picker",
    "branded-select-styling",
    "brand-consistent-forms",
    "custom-select-picker-layouts",
    "rich-media-picker",
    "complex-shapes",
    "shaped-cutouts",
    "overflow-clipping-control",
    "visually-texture-content",
    "apply-webgl-shaders",
    "interactive-content-in-3d-scenes",
    "highlight-text-ranges",
    "prevent-text-wrapping",
    "customize-scrollbar-color-and-thickness",
    "export-html-media-from-canvas",
    "fluid-scaling",
    "calculate-with-intrinsic-sizes",
    "css-layout",
    "size-aware-styling",
    "content-based-styling",
    "child-state-based-styling",
    "design-token-reactivity",
    "dynamic-sibling-styling",
    "form-fields-automatically-fit-contents",
    "improve-text-layout-and-legibility",
    "forms",
    "accessible-error-announcement",
    "required-field-feedback",
    "validate-input-after-interaction",
    "identify-inp-causes",
    "schedule-tasks-by-priority",
    "optimize-preload-priority",
    "improve-next-page-load-performance",
    "interactions-in-complex-layouts",
    "performance",
    "visually-stable-font-fallbacks",
    "break-up-long-tasks",
    "identify-heavy-scripts",
    "optimize-script-priority",
    "defer-rendering-heavy-content",
    "defer-work-until-scroll-ends",
    "optimize-image-priority",
    "conditional-async-dependencies",
    "expose-canvas-content-to-browser-features",
    "move-dom-element-without-losing-state",
    "precise-text-alignment",
    "visually-stable-mixed-fonts",
    "css",
    "html",
    "reduce-style-repetition",
    "security",
    "privacy",
    "batch-analytics-events",
    "full-session-analytics",
    "calculate-total-foreground-time",
    "passkeys",
    "passkey-registration",
    "passkey-authentication",
    "passkey-reauthentication",
    "passkey-conditional-create",
    "passkey-management",
    "flicker-free-client-side-ab-testing",
    "consistent-cross-document-transitions",
    "stabilize-reactive-state",
    "resilient-context-menus-and-nested-dropdowns",
    "persistent-top-layer-ui",
    "detect-initial-visibility-state",
    "sequence-distributed-events",
    "translator",
    "language-detection",
    "support-global-calendar-systems",
    "capture-location-agnostic-data",
    "format-human-readable-durations",
    "manage-recurring-intervals",
    "calculate-event-differentials",
    "coordinate-global-events",
    "model-partial-time-concepts",
    "search-hidden-content",
    "select-menu-interaction",
    "style-parent-with-has",
    "autofill-address-form",
    "autofill-payment-form",
    "autofill-sign-in-form",
    "autofill-sign-up-form",
    "autofill-highlight-inputs",
    "deliver-optimized-decorative-images",
    "resolution-optimized-pseudo-elements",
    "deprioritize-background-fetches",
    "efficient-background-processing",
    "webmcp",
    "agentic-forms",
    "agentic-javascript-tools",
    "language-model",
    "summarizer"
  ],
  "artifacts": [
    {
      "type": "other",
      "path": "evidence/cookies.json",
      "caption": "cookies",
      "findingIds": [
        "F19"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/detail-desktop.png",
      "caption": "detail desktop"
    },
    {
      "type": "screenshot",
      "path": "evidence/detail-discoverability-crawler.png",
      "caption": "detail discoverability crawler"
    },
    {
      "type": "screenshot",
      "path": "evidence/detail-discoverability-rendered.png",
      "caption": "detail discoverability rendered"
    },
    {
      "type": "discoverability",
      "path": "evidence/detail-discoverability.json",
      "caption": "detail discoverability",
      "findingIds": [
        "F21"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/detail-dom.json",
      "caption": "detail dom",
      "findingIds": [
        "F03"
      ]
    },
    {
      "type": "other",
      "path": "evidence/headers.json",
      "caption": "headers",
      "findingIds": [
        "F20"
      ]
    },
    {
      "type": "heap",
      "path": "evidence/heap-baseline.json",
      "caption": "heap baseline"
    },
    {
      "type": "heap",
      "path": "evidence/heap-comparison.json",
      "caption": "heap comparison"
    },
    {
      "type": "heap",
      "path": "evidence/heap-post-scroll.json",
      "caption": "heap post scroll"
    },
    {
      "type": "screenshot",
      "path": "evidence/home-desktop.png",
      "caption": "home desktop"
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-crawler.png",
      "caption": "home discoverability crawler"
    },
    {
      "type": "screenshot",
      "path": "evidence/home-discoverability-rendered.png",
      "caption": "home discoverability rendered"
    },
    {
      "type": "discoverability",
      "path": "evidence/home-discoverability.json",
      "caption": "home discoverability"
    },
    {
      "type": "dom",
      "path": "evidence/home-dom.json",
      "caption": "home dom"
    },
    {
      "type": "layout",
      "path": "evidence/home-mobile-layout.json",
      "caption": "home mobile layout",
      "findingIds": [
        "F06",
        "F14"
      ],
      "condition": "viewport: 360x800"
    },
    {
      "type": "screenshot",
      "path": "evidence/home-mobile.png",
      "caption": "home mobile",
      "findingIds": [
        "F06",
        "F14"
      ],
      "condition": "viewport: 360x800"
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-details.json",
      "caption": "lighthouse details",
      "findingIds": [
        "F11",
        "F13",
        "F16"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-listing.json",
      "caption": "lighthouse listing",
      "findingIds": [
        "F11"
      ]
    },
    {
      "type": "lighthouse",
      "path": "evidence/lighthouse-summary.json",
      "caption": "lighthouse summary",
      "findingIds": [
        "F08",
        "F09"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/listing-dark.png",
      "caption": "listing dark",
      "findingIds": [
        "F01"
      ],
      "condition": "prefers-color-scheme: dark"
    },
    {
      "type": "screenshot",
      "path": "evidence/listing-desktop.png",
      "caption": "listing desktop"
    },
    {
      "type": "screenshot",
      "path": "evidence/listing-discoverability-crawler.png",
      "caption": "listing discoverability crawler",
      "findingIds": [
        "F17",
        "F21"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/listing-discoverability-rendered.png",
      "caption": "listing discoverability rendered",
      "findingIds": [
        "F17"
      ]
    },
    {
      "type": "discoverability",
      "path": "evidence/listing-discoverability.json",
      "caption": "listing discoverability",
      "findingIds": [
        "F17",
        "F21"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/listing-dom.json",
      "caption": "listing dom",
      "findingIds": [
        "F03",
        "F04"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/listing-forced-colors.png",
      "caption": "listing forced colors",
      "condition": "forced-colors: active, prefers-contrast: more"
    },
    {
      "type": "other",
      "path": "evidence/listing-images.json",
      "caption": "listing images",
      "findingIds": [
        "F10",
        "F15",
        "F22"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/listing-mobile.png",
      "caption": "listing mobile",
      "findingIds": [
        "F13"
      ],
      "condition": "viewport: 360x800"
    },
    {
      "type": "other",
      "path": "evidence/listing-probe.json",
      "caption": "listing probe",
      "findingIds": [
        "F02"
      ]
    },
    {
      "type": "har-summary",
      "path": "evidence/listing-summary.json",
      "caption": "listing summary"
    },
    {
      "type": "trace-summary",
      "path": "evidence/listing-trace-summary.json",
      "caption": "listing trace summary",
      "findingIds": [
        "F08",
        "F09"
      ]
    },
    {
      "type": "trace",
      "path": "evidence/listing-trace.json",
      "caption": "listing trace",
      "findingIds": [
        "F08"
      ]
    },
    {
      "type": "har",
      "path": "evidence/listing.har",
      "caption": "listing"
    },
    {
      "type": "other",
      "path": "evidence/manifest.json",
      "caption": "manifest"
    },
    {
      "type": "screenshot",
      "path": "evidence/new-desktop.png",
      "caption": "new desktop",
      "findingIds": [
        "F05",
        "F12"
      ]
    },
    {
      "type": "dom",
      "path": "evidence/new-dom.json",
      "caption": "new dom"
    },
    {
      "type": "other",
      "path": "evidence/new-form-probe.json",
      "caption": "new form probe",
      "findingIds": [
        "F05",
        "F07",
        "F12",
        "F23"
      ]
    },
    {
      "type": "screenshot",
      "path": "evidence/new-invalid.png",
      "caption": "new invalid",
      "findingIds": [
        "F07",
        "F23"
      ]
    },
    {
      "type": "other",
      "path": "evidence/robots-headers.txt",
      "caption": "robots headers"
    },
    {
      "type": "other",
      "path": "evidence/robots.txt",
      "caption": "robots",
      "findingIds": [
        "F18"
      ]
    },
    {
      "type": "other",
      "path": "evidence/sitemap-headers.txt",
      "caption": "sitemap headers",
      "findingIds": [
        "F18"
      ]
    },
    {
      "type": "other",
      "path": "evidence/sitemap.xml",
      "caption": "sitemap",
      "findingIds": [
        "F18"
      ]
    },
    {
      "type": "other",
      "path": "evidence/trackers.json",
      "caption": "trackers"
    }
  ],
  "config": {
    "loaded": false
  },
  "paths": [
    {
      "id": "home",
      "description": "City-selection landing page, the entry point before locality selection. Audited at desktop, 360x800, and crawler/no-JS conditions.",
      "url": "https://divar.ir/",
      "conditions": [
        "desktop 1440x900",
        "mobile 360x800",
        "crawler without JavaScript"
      ],
      "result": "issues"
    },
    {
      "id": "listing",
      "description": "Tehran listings/search archetype, representing category, search, filtering, navigation, and repeated scrolling.",
      "url": "https://divar.ir/s/tehran",
      "conditions": [
        "desktop 1440x900",
        "mobile 360x800",
        "prefers-color-scheme: dark",
        "prefers-reduced-motion: reduce",
        "forced-colors: active",
        "crawler without JavaScript",
        "Lighthouse mobile",
        "repeated scroll x10"
      ],
      "result": "issues"
    },
    {
      "id": "detail",
      "description": "Representative listing detail, covering item metadata, media, seller contact actions, and crawler rendering.",
      "url": "https://divar.ir/v/%D9%81%D8%B1%D8%B4-%DB%B6-%D9%85%D8%AA%D8%B1%DB%8C-%DA%A9%D8%B1%DA%A9-%D8%A7%DA%A9%D8%A8%D9%86%D8%AF/gan0-VJd",
      "conditions": [
        "desktop 1440x900",
        "crawler without JavaScript"
      ],
      "result": "pass"
    },
    {
      "id": "post-ad-auth",
      "description": "Primary post-an-ad route through its phone/OTP authentication boundary, including blank submission.",
      "url": "https://divar.ir/new",
      "conditions": [
        "desktop 1440x900",
        "blank Next activation"
      ],
      "result": "issues"
    },
    {
      "id": "site-controls",
      "description": "robots.txt, sitemap.xml, web app manifest, response headers, cookies, service worker, and third-party surface.",
      "url": "https://divar.ir/",
      "conditions": [
        "direct HTTP fetch",
        "browser network/security inspection"
      ],
      "result": "issues"
    }
  ],
  "findings": [
    {
      "id": "F01",
      "severity": "medium",
      "confidence": "high",
      "summary": "Dark preference leaves the listings UI in its light palette",
      "evidence": "A screenshot captured with prefers-color-scheme: dark remains white with the same light surfaces and grey controls as the ordinary desktop view.",
      "suggestedFix": "Drive surface and content tokens from color-scheme/prefers-color-scheme (or light-dark()) and set the browser color-scheme.",
      "effort": "medium",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-color-scheme",
      "guidanceId": "dark-mode",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/listing-dark.png"
      ]
    },
    {
      "id": "F02",
      "severity": "medium",
      "confidence": "high",
      "summary": "Animations continue when reduced motion is requested",
      "evidence": "The reduced-motion evaluate probe reported eight running animations, each with a 360 ms duration, while prefers-reduced-motion: reduce matched.",
      "suggestedFix": "Disable or substantially shorten non-essential transitions inside a prefers-reduced-motion: reduce media query.",
      "effort": "small",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "respect-user-preferences",
      "principleCheckId": "respects-reduced-motion",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/listing-probe.json"
      ]
    },
    {
      "id": "F03",
      "severity": "low",
      "confidence": "high",
      "summary": "Route changes do not use View Transitions",
      "evidence": "DOM/CSS inspection across the listing and detail templates found no authored view-transition-name or ::view-transition styling; navigation swaps the route abruptly.",
      "suggestedFix": "Wrap same-document route updates in document.startViewTransition and assign stable names to shared listing imagery and headings, with a no-transition fallback.",
      "effort": "medium",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "implement-natural-interactions",
      "principleCheckId": "view-transitions",
      "guidanceId": "same-document-transitions",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/listing-dom.json",
        "evidence/detail-dom.json"
      ]
    },
    {
      "id": "F04",
      "severity": "low",
      "confidence": "high",
      "summary": "The category overlay is manually positioned rather than anchor-aware",
      "evidence": "Rendered CSS places the category menu with position:absolute; top:100%; right:0; left:0 and does not use anchor-name, position-anchor, or position-try fallbacks.",
      "suggestedFix": "Anchor the overlay to its trigger and provide position-try fallbacks so it remains attached and visible at constrained edges.",
      "effort": "small",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "provide-guided-navigation",
      "principleCheckId": "anchored-positioning",
      "guidanceId": "position-aware-tooltips",
      "guidanceCategory": "css",
      "artifacts": [
        "evidence/listing-dom.json"
      ]
    },
    {
      "id": "F05",
      "severity": "medium",
      "confidence": "high",
      "summary": "Authentication overlays are duplicated custom role=dialog sections without dialog semantics",
      "evidence": "The /new form probe found four SECTION elements with role=dialog, none with aria-modal or an accessible label; the visible panel is a modal authentication interruption.",
      "suggestedFix": "Use one native <dialog> (or popover where non-modal), label it, set initial focus, and rely on platform close/light-dismiss behavior.",
      "effort": "medium",
      "pathId": "post-ad-auth",
      "url": "https://divar.ir/new",
      "principleId": "maximize-content-reduce-noise",
      "principleCheckId": "semantic-dismissible-primitives",
      "guidanceId": "declarative-dialog-popover-control",
      "guidanceCategory": "user-experience",
      "artifacts": [
        "evidence/new-form-probe.json",
        "evidence/new-desktop.png"
      ]
    },
    {
      "id": "F06",
      "severity": "high",
      "confidence": "high",
      "summary": "The landing page is clipped at 360 px",
      "evidence": "The mobile layout primitive reported a 992 px layout/content width in a 360 px visual viewport, with 632 px horizontal overflow; the screenshot shows most navigation and content off-screen.",
      "suggestedFix": "Use width=device-width and fluid/intrinsic sizing on the landing template; remove its 992 px minimum width and verify at 320-360 px.",
      "effort": "small",
      "pathId": "home",
      "url": "https://divar.ir/",
      "principleId": "adapt-to-the-form-factor",
      "principleCheckId": "responsive-no-horizontal-scroll",
      "guidanceId": "fluid-scaling",
      "guidanceCategory": "css",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "id": "F07",
      "severity": "medium",
      "confidence": "high",
      "summary": "Blank phone submission gives no field-level recovery guidance",
      "evidence": "After activating “Next” with the phone field blank, the captured state shows no error text, and the probe reports aria-invalid=false; only a generic login-required toast remains.",
      "suggestedFix": "Validate after interaction, set aria-invalid, associate a specific error with aria-describedby, announce it, and keep focus on the phone field.",
      "effort": "small",
      "pathId": "post-ad-auth",
      "url": "https://divar.ir/new",
      "principleId": "support-core-task-success",
      "principleCheckId": "clear-system-state-and-recovery",
      "guidanceId": "accessible-error-announcement",
      "guidanceCategory": "forms",
      "artifacts": [
        "evidence/new-invalid.png",
        "evidence/new-form-probe.json"
      ]
    },
    {
      "id": "F08",
      "severity": "high",
      "confidence": "high",
      "summary": "The listings path misses the good LCP range",
      "evidence": "Lighthouse measured LCP 4.8 s, FCP 3.6 s, TBT 280 ms, and performance 0.67; the independent trace measured LCP 2.98 s, showing material cold-load variability.",
      "suggestedFix": "Profile the LCP request chain, prioritise the actual LCP resource, reduce critical JavaScript/CSS, and validate against field p75 data.",
      "effort": "large",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "good-core-web-vitals",
      "guidanceId": "performance",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/listing-trace-summary.json",
        "evidence/listing-trace.json"
      ]
    },
    {
      "id": "F09",
      "severity": "medium",
      "confidence": "high",
      "summary": "Main-thread work delays interaction readiness",
      "evidence": "The trace recorded two long tasks (116 ms longest) and 72.53 ms TBT; Lighthouse measured 280 ms TBT, 350 ms max potential FID, a 10.6 s TTI, and flagged forced reflow.",
      "suggestedFix": "Break long work into prioritized tasks, eliminate forced synchronous layout, and defer non-critical initialization.",
      "effort": "medium",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-main-thread",
      "guidanceId": "break-up-long-tasks",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/listing-trace-summary.json",
        "evidence/lighthouse-summary.json"
      ]
    },
    {
      "id": "F10",
      "severity": "medium",
      "confidence": "high",
      "summary": "Listing images lack delivery and stability hints",
      "evidence": "The images primitive found 17/19 images without width/height, 13 below-fold images without lazy loading, and 14 without responsive srcset.",
      "suggestedFix": "Reserve image geometry, lazy-load below-fold thumbnails, add responsive sources, and explicitly prioritize only the LCP image.",
      "effort": "medium",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "efficient-resource-delivery",
      "guidanceId": "optimize-image-priority",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/listing-images.json"
      ]
    },
    {
      "id": "F11",
      "severity": "medium",
      "confidence": "high",
      "summary": "The mobile bundle ships substantial unused code",
      "evidence": "Lighthouse estimated 584 KiB of unused JavaScript and 47 KiB of unused CSS on a 1,666 KiB transfer.",
      "suggestedFix": "Code-split route and widget bundles, conditionally import maps/account features, and remove duplicate or legacy payload.",
      "effort": "large",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "be-fast-and-stable",
      "principleCheckId": "trim-unused-and-duplicate-code",
      "guidanceId": "identify-heavy-scripts",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/lighthouse-listing.json"
      ]
    },
    {
      "id": "F12",
      "severity": "medium",
      "confidence": "high",
      "summary": "The login modal has no programmatic name or modal state",
      "evidence": "The form probe reports four role=dialog SECTION elements with no aria-label/aria-labelledby and no aria-modal, while one is visibly presented as the login dialog.",
      "suggestedFix": "Use a labelled native dialog, expose one active modal only, and connect its visible title with aria-labelledby.",
      "effort": "small",
      "pathId": "post-ad-auth",
      "url": "https://divar.ir/new",
      "principleId": "be-inclusive",
      "principleCheckId": "names-roles-labels",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/new-form-probe.json",
        "evidence/new-desktop.png"
      ]
    },
    {
      "id": "F13",
      "severity": "medium",
      "confidence": "high",
      "summary": "Mobile bottom-navigation text narrowly fails WCAG contrast",
      "evidence": "Lighthouse identified three bottom-nav controls at 4.39:1 (#71717a on #f4f4f5), below the 4.5:1 requirement for 12 px normal text.",
      "suggestedFix": "Darken the neutral text token or lighten its surface so all bottom-nav labels reach at least 4.5:1 in every state.",
      "effort": "trivial",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "be-inclusive",
      "principleCheckId": "sufficient-contrast",
      "guidanceId": "accessibility",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/listing-mobile.png"
      ]
    },
    {
      "id": "F14",
      "severity": "high",
      "confidence": "high",
      "summary": "The landing template does not reflow to a mobile viewport",
      "evidence": "At 360x800 the page maintains a 992 px layout viewport and clips core city selection and navigation, preventing one-dimensional reflow.",
      "suggestedFix": "Adopt a device-width viewport and responsive layout without a desktop minimum width; retest at 400% zoom and 320 CSS px.",
      "effort": "small",
      "pathId": "home",
      "url": "https://divar.ir/",
      "principleId": "be-inclusive",
      "principleCheckId": "zoom-reflow-targets-and-media",
      "guidanceId": "fluid-scaling",
      "guidanceCategory": "accessibility",
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "id": "F15",
      "severity": "low",
      "confidence": "high",
      "summary": "Most listing images omit intrinsic dimensions",
      "evidence": "The image audit found width and height attributes missing on 17 of 19 images, despite the document otherwise having a valid doctype and UTF-8 charset.",
      "suggestedFix": "Emit width/height or an equivalent aspect ratio from image metadata for every card and trust badge.",
      "effort": "small",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "follow-best-practices",
      "principleCheckId": "sound-document-and-assets",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "artifacts": [
        "evidence/listing-images.json"
      ]
    },
    {
      "id": "F16",
      "severity": "low",
      "confidence": "high",
      "summary": "Large scripts have unavailable source maps",
      "evidence": "Lighthouse reports one large inline/first-party script without a source map and 17 mobile bundle maps returning 403.",
      "suggestedFix": "Publish deploy-matched source maps to authorized tooling or remove unreachable sourceMappingURL references.",
      "effort": "small",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "follow-best-practices",
      "principleCheckId": "browser-platform-hygiene",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "artifacts": [
        "evidence/lighthouse-details.json"
      ]
    },
    {
      "id": "F17",
      "severity": "high",
      "confidence": "high",
      "summary": "The primary listing is empty to a non-JavaScript crawler",
      "evidence": "The discoverability primitive fetched the listing with HTTP 200 but found 0% rendered-content coverage: raw HTML had 10 text characters, no title, H1, or description, while the browser rendered 2,226 characters and an H1.",
      "suggestedFix": "Server-render the listing heading, introductory content, and crawlable item links; hydrate them for interaction rather than replacing an empty shell.",
      "effort": "large",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "be-discoverable",
      "principleCheckId": "crawlable-and-mobile-friendly",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "artifacts": [
        "evidence/listing-discoverability.json",
        "evidence/listing-discoverability-rendered.png",
        "evidence/listing-discoverability-crawler.png"
      ]
    },
    {
      "id": "F18",
      "severity": "low",
      "confidence": "high",
      "summary": "The conventional sitemap endpoint returns 404",
      "evidence": "A direct fetch of /sitemap.xml returned HTTP/2 404 and robots.txt declares no Sitemap location, although canonical and robots meta signals exist on listing pages.",
      "suggestedFix": "Publish a sitemap index at a stable URL and reference it from robots.txt.",
      "effort": "small",
      "pathId": "site-controls",
      "url": "https://divar.ir/",
      "principleId": "be-discoverable",
      "principleCheckId": "canonical-and-indexing-signals",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "artifacts": [
        "evidence/sitemap-headers.txt",
        "evidence/sitemap.xml",
        "evidence/robots.txt"
      ]
    },
    {
      "id": "F19",
      "severity": "medium",
      "confidence": "high",
      "summary": "All observed first-party cookies omit Secure",
      "evidence": "The cookie primitive found 8/8 cookies without Secure; seven are long-lived for 400 days. HSTS is present, but explicit Secure protects cookies against downgrade and non-HTTPS edge cases.",
      "suggestedFix": "Set Secure on every HTTPS cookie, review whether 400-day identifiers are necessary, and retain SameSite=Lax or stricter.",
      "effort": "small",
      "pathId": "site-controls",
      "url": "https://divar.ir/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "secure-transport-and-headers",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "artifacts": [
        "evidence/cookies.json"
      ]
    },
    {
      "id": "F20",
      "severity": "low",
      "confidence": "high",
      "summary": "Browser policy headers leave avoidable gaps",
      "evidence": "Headers include HSTS, nosniff, DENY/frame-ancestors, and CSP, but Permissions-Policy is missing and CSP permits unsafe-inline for scripts and styles.",
      "suggestedFix": "Deploy a restrictive Permissions-Policy and migrate inline script/style execution to nonces or hashes before removing unsafe-inline.",
      "effort": "medium",
      "pathId": "site-controls",
      "url": "https://divar.ir/",
      "principleId": "be-private-and-secure",
      "principleCheckId": "defensive-browser-policies",
      "guidanceId": "security",
      "guidanceCategory": "security",
      "artifacts": [
        "evidence/headers.json"
      ]
    },
    {
      "id": "F21",
      "severity": "high",
      "confidence": "high",
      "summary": "The listings core experience depends entirely on JavaScript",
      "evidence": "The no-JS crawler view of /s/tehran contains no listing heading or cards despite an HTTP 200 response; the detail template, by contrast, provides 100% raw-content coverage.",
      "suggestedFix": "Apply the existing detail-page server-rendering approach to listing essentials, with enhancement layered on top.",
      "effort": "large",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "be-resilient",
      "principleCheckId": "progressive-enhancement",
      "guidanceId": "html",
      "guidanceCategory": "html",
      "artifacts": [
        "evidence/listing-discoverability.json",
        "evidence/listing-discoverability-crawler.png",
        "evidence/detail-discoverability.json"
      ]
    },
    {
      "id": "F22",
      "severity": "medium",
      "confidence": "high",
      "summary": "The listing does not minimize image transfer work",
      "evidence": "Although thumbnails use modern formats and are not oversized, 13 below-fold images load eagerly and 14 lack responsive source selection, increasing avoidable requests and bytes.",
      "suggestedFix": "Lazy-load below-fold media and provide size-appropriate responsive variants while preserving explicit dimensions.",
      "effort": "medium",
      "pathId": "listing",
      "url": "https://divar.ir/s/tehran",
      "principleId": "be-sustainable",
      "principleCheckId": "optimised-assets",
      "guidanceId": "deliver-optimized-decorative-images",
      "guidanceCategory": "performance",
      "artifacts": [
        "evidence/listing-images.json"
      ]
    },
    {
      "id": "F23",
      "severity": "medium",
      "confidence": "high",
      "summary": "Phone validation does not explain how to recover",
      "evidence": "Activating “Next” with an empty phone field produced no inline error, no announced message, and no aria-invalid state; the user remains at the same field without actionable guidance.",
      "suggestedFix": "Validate after the attempted submission, explain the required phone format next to the field, set aria-invalid, and announce the linked message.",
      "effort": "small",
      "pathId": "post-ad-auth",
      "url": "https://divar.ir/new",
      "principleId": "be-trustworthy",
      "principleCheckId": "humane-error-handling",
      "guidanceId": "validate-input-after-interaction",
      "guidanceCategory": "forms",
      "artifacts": [
        "evidence/new-invalid.png",
        "evidence/new-form-probe.json"
      ]
    }
  ],
  "taskList": [
    {
      "id": "T01",
      "title": "Use width=device-width and fluid/intrinsic sizing on the landing template; remove its 992 px minimum width and verify at 320-360 px.",
      "priority": 1,
      "findingIds": [
        "F06"
      ],
      "guidanceId": "fluid-scaling",
      "status": "open"
    },
    {
      "id": "T02",
      "title": "Profile the LCP request chain, prioritise the actual LCP resource, reduce critical JavaScript/CSS, and validate against field p75 data.",
      "priority": 2,
      "findingIds": [
        "F08"
      ],
      "guidanceId": "performance",
      "status": "open"
    },
    {
      "id": "T03",
      "title": "Adopt a device-width viewport and responsive layout without a desktop minimum width; retest at 400% zoom and 320 CSS px.",
      "priority": 3,
      "findingIds": [
        "F14"
      ],
      "guidanceId": "fluid-scaling",
      "status": "open"
    },
    {
      "id": "T04",
      "title": "Server-render the listing heading, introductory content, and crawlable item links; hydrate them for interaction rather than replacing an empty shell.",
      "priority": 4,
      "findingIds": [
        "F17"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T05",
      "title": "Apply the existing detail-page server-rendering approach to listing essentials, with enhancement layered on top.",
      "priority": 5,
      "findingIds": [
        "F21"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T06",
      "title": "Drive surface and content tokens from color-scheme/prefers-color-scheme (or light-dark()) and set the browser color-scheme.",
      "priority": 6,
      "findingIds": [
        "F01"
      ],
      "guidanceId": "dark-mode",
      "status": "open"
    },
    {
      "id": "T07",
      "title": "Disable or substantially shorten non-essential transitions inside a prefers-reduced-motion: reduce media query.",
      "priority": 7,
      "findingIds": [
        "F02"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T08",
      "title": "Use one native <dialog> (or popover where non-modal), label it, set initial focus, and rely on platform close/light-dismiss behavior.",
      "priority": 8,
      "findingIds": [
        "F05"
      ],
      "guidanceId": "declarative-dialog-popover-control",
      "status": "open"
    },
    {
      "id": "T09",
      "title": "Validate after interaction, set aria-invalid, associate a specific error with aria-describedby, announce it, and keep focus on the phone field.",
      "priority": 9,
      "findingIds": [
        "F07"
      ],
      "guidanceId": "accessible-error-announcement",
      "status": "open"
    },
    {
      "id": "T10",
      "title": "Break long work into prioritized tasks, eliminate forced synchronous layout, and defer non-critical initialization.",
      "priority": 10,
      "findingIds": [
        "F09"
      ],
      "guidanceId": "break-up-long-tasks",
      "status": "open"
    },
    {
      "id": "T11",
      "title": "Reserve image geometry, lazy-load below-fold thumbnails, add responsive sources, and explicitly prioritize only the LCP image.",
      "priority": 11,
      "findingIds": [
        "F10"
      ],
      "guidanceId": "optimize-image-priority",
      "status": "open"
    },
    {
      "id": "T12",
      "title": "Code-split route and widget bundles, conditionally import maps/account features, and remove duplicate or legacy payload.",
      "priority": 12,
      "findingIds": [
        "F11"
      ],
      "guidanceId": "identify-heavy-scripts",
      "status": "open"
    },
    {
      "id": "T13",
      "title": "Use a labelled native dialog, expose one active modal only, and connect its visible title with aria-labelledby.",
      "priority": 13,
      "findingIds": [
        "F12"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T14",
      "title": "Darken the neutral text token or lighten its surface so all bottom-nav labels reach at least 4.5:1 in every state.",
      "priority": 14,
      "findingIds": [
        "F13"
      ],
      "guidanceId": "accessibility",
      "status": "open"
    },
    {
      "id": "T15",
      "title": "Set Secure on every HTTPS cookie, review whether 400-day identifiers are necessary, and retain SameSite=Lax or stricter.",
      "priority": 15,
      "findingIds": [
        "F19"
      ],
      "guidanceId": "security",
      "status": "open"
    },
    {
      "id": "T16",
      "title": "Lazy-load below-fold media and provide size-appropriate responsive variants while preserving explicit dimensions.",
      "priority": 16,
      "findingIds": [
        "F22"
      ],
      "guidanceId": "deliver-optimized-decorative-images",
      "status": "open"
    },
    {
      "id": "T17",
      "title": "Validate after the attempted submission, explain the required phone format next to the field, set aria-invalid, and announce the linked message.",
      "priority": 17,
      "findingIds": [
        "F23"
      ],
      "guidanceId": "validate-input-after-interaction",
      "status": "open"
    },
    {
      "id": "T18",
      "title": "Wrap same-document route updates in document.startViewTransition and assign stable names to shared listing imagery and headings, with a no-transition fallback.",
      "priority": 18,
      "findingIds": [
        "F03"
      ],
      "guidanceId": "same-document-transitions",
      "status": "open"
    },
    {
      "id": "T19",
      "title": "Anchor the overlay to its trigger and provide position-try fallbacks so it remains attached and visible at constrained edges.",
      "priority": 19,
      "findingIds": [
        "F04"
      ],
      "guidanceId": "position-aware-tooltips",
      "status": "open"
    },
    {
      "id": "T20",
      "title": "Emit width/height or an equivalent aspect ratio from image metadata for every card and trust badge.",
      "priority": 20,
      "findingIds": [
        "F15"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T21",
      "title": "Publish deploy-matched source maps to authorized tooling or remove unreachable sourceMappingURL references.",
      "priority": 21,
      "findingIds": [
        "F16"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T22",
      "title": "Publish a sitemap index at a stable URL and reference it from robots.txt.",
      "priority": 22,
      "findingIds": [
        "F18"
      ],
      "guidanceId": "html",
      "status": "open"
    },
    {
      "id": "T23",
      "title": "Deploy a restrictive Permissions-Policy and migrate inline script/style execution to nonces or hashes before removing unsafe-inline.",
      "priority": 23,
      "findingIds": [
        "F20"
      ],
      "guidanceId": "security",
      "status": "open"
    }
  ],
  "budget": {
    "pathCount": 5,
    "auditPasses": 1
  },
  "coverage": {
    "catalogVersion": "modern-web-guidance@0.0.172",
    "catalogChecksum": "sha256:78ccfdb2d483f4c57d9dafed80fd86c6265585a56457c8dcfddc254b80fb44d7",
    "expected": 58,
    "recorded": 58,
    "judged": 58,
    "blocked": 0,
    "notRun": 0,
    "missing": 0,
    "unknown": 0,
    "duplicates": 0,
    "complete": true
  },
  "checkOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-color-scheme",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-dark.png.",
      "evidence": "A screenshot captured with prefers-color-scheme: dark remains white with the same light surfaces and grey controls as the ordinary desktop view.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-dark.png"
      ],
      "findingIds": [
        "F01"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-reduced-motion",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-probe.json.",
      "evidence": "The reduced-motion evaluate probe reported eight running animations, each with a 360 ms duration, while prefers-reduced-motion: reduce matched.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-probe.json"
      ],
      "findingIds": [
        "F02"
      ]
    },
    {
      "principleId": "respect-user-preferences",
      "checkId": "respects-contrast",
      "status": "pass",
      "confidence": "medium",
      "method": "Visual inspection under forced-colors: active and prefers-contrast: more.",
      "evidence": "Forced-colors screenshot preserves distinct borders, labels, controls, focus affordances, and readable system colors.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-forced-colors.png"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "view-transitions",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-dom.json, evidence/detail-dom.json.",
      "evidence": "DOM/CSS inspection across the listing and detail templates found no authored view-transition-name or ::view-transition styling; navigation swaps the route abruptly.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-dom.json",
        "evidence/detail-dom.json"
      ],
      "findingIds": [
        "F03"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "scroll-driven-animations",
      "status": "pass",
      "confidence": "medium",
      "method": "Rendered CSS inspection plus repeated native scrolling.",
      "evidence": "DOM/CSS inspection found no authored scroll-linked animation or parallax effect, and scrolling remains native; therefore no main-thread scroll-animation anti-pattern is present.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-dom.json"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "checkId": "physical-gestures",
      "status": "pass",
      "confidence": "medium",
      "method": "Visual interaction review of mobile listing and detail carousel.",
      "evidence": "Mobile listing scrolling and the detail media carousel retain native scrolling/button behavior; no interaction that fights pointer or touch scrolling was observed.",
      "pathIds": [
        "listing",
        "detail"
      ],
      "artifacts": [
        "evidence/listing-mobile.png",
        "evidence/detail-desktop.png"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "scroll-state-aware-chrome",
      "status": "pass",
      "confidence": "medium",
      "method": "DOM/CSS inspection and mobile screenshot.",
      "evidence": "The rendered listing CSS defines a sticky 64 px navigation bar and the mobile capture keeps primary navigation reachable while content scrolls.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-dom.json",
        "evidence/listing-mobile.png"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "anchored-positioning",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-dom.json.",
      "evidence": "Rendered CSS places the category menu with position:absolute; top:100%; right:0; left:0 and does not use anchor-name, position-anchor, or position-try fallbacks.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-dom.json"
      ],
      "findingIds": [
        "F04"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "checkId": "directs-attention",
      "status": "pass",
      "confidence": "medium",
      "method": "Desktop/mobile screenshots across listing and detail.",
      "evidence": "Visual review shows clear red primary actions, active listing cards, breadcrumbs on detail, and persistent navigation cues without competing animation.",
      "pathIds": [
        "listing",
        "detail"
      ],
      "artifacts": [
        "evidence/listing-desktop.png",
        "evidence/detail-desktop.png"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "no-intrusive-interruptions",
      "status": "pass",
      "confidence": "medium",
      "method": "Load-state screenshots on four representative paths.",
      "evidence": "Home, listing, and detail load directly into core content with no consent wall or promotional interstitial; the /new login modal appears only after choosing the protected posting route.",
      "pathIds": [
        "home",
        "listing",
        "detail",
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/listing-desktop.png",
        "evidence/detail-desktop.png",
        "evidence/new-desktop.png"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "semantic-dismissible-primitives",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/new-form-probe.json, evidence/new-desktop.png.",
      "evidence": "The /new form probe found four SECTION elements with role=dialog, none with aria-modal or an accessible label; the visible panel is a modal authentication interruption.",
      "pathIds": [
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/new-form-probe.json",
        "evidence/new-desktop.png"
      ],
      "findingIds": [
        "F05"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "checkId": "reduced-chrome",
      "status": "pass",
      "confidence": "medium",
      "method": "Visual proportion review at 1440x900 and 360x800.",
      "evidence": "Listing and detail screenshots devote the majority of the viewport to cards, imagery, attributes, and actions; navigation/filter chrome remains compact.",
      "pathIds": [
        "listing",
        "detail"
      ],
      "artifacts": [
        "evidence/listing-desktop.png",
        "evidence/listing-mobile.png",
        "evidence/detail-desktop.png"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "responsive-no-horizontal-scroll",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/home-mobile.png, evidence/home-mobile-layout.json.",
      "evidence": "The mobile layout primitive reported a 992 px layout/content width in a 360 px visual viewport, with 632 px horizontal overflow; the screenshot shows most navigation and content off-screen.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-mobile-layout.json"
      ],
      "findingIds": [
        "F06"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "component-level-responsiveness",
      "status": "pass",
      "confidence": "medium",
      "method": "Paired desktop/mobile screenshots and responsive CSS inspection.",
      "evidence": "The same listing card template changes from a three-column desktop grid to a single-column mobile card with appropriately rearranged image and text.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-desktop.png",
        "evidence/listing-mobile.png",
        "evidence/listing-dom.json"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "checkId": "input-modality-aware",
      "status": "pass",
      "confidence": "medium",
      "method": "Lighthouse accessibility audit plus mobile visual review.",
      "evidence": "Lighthouse accessibility scored 0.96 with no target-size or focus-order failure, and visible controls use large button/card hit areas in the mobile capture.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/lighthouse-listing.json",
        "evidence/listing-mobile.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-purpose-and-primary-action",
      "status": "pass",
      "confidence": "medium",
      "method": "First-viewport screenshots across entry, listing, and detail.",
      "evidence": "The entry explains city selection; listings expose search and “ثبت آگهی”; detail presents title, price, chat, and contact actions prominently.",
      "pathIds": [
        "home",
        "listing",
        "detail"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/listing-desktop.png",
        "evidence/detail-desktop.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "primary-flow-completion",
      "status": "pass",
      "confidence": "medium",
      "method": "Representative journey walkthrough.",
      "evidence": "The browse journey proceeds from city to listings to a server-rendered detail with visible contact/chat controls; posting reaches a clearly identified OTP authentication step.",
      "pathIds": [
        "home",
        "listing",
        "detail",
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/home-desktop.png",
        "evidence/listing-desktop.png",
        "evidence/detail-desktop.png",
        "evidence/new-desktop.png"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "checkId": "clear-system-state-and-recovery",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/new-invalid.png, evidence/new-form-probe.json.",
      "evidence": "After activating “Next” with the phone field blank, the captured state shows no error text, and the probe reports aria-invalid=false; only a generic login-required toast remains.",
      "pathIds": [
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/new-invalid.png",
        "evidence/new-form-probe.json"
      ],
      "findingIds": [
        "F07"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "good-core-web-vitals",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/lighthouse-summary.json, evidence/listing-trace-summary.json, evidence/listing-trace.json.",
      "evidence": "Lighthouse measured LCP 4.8 s, FCP 3.6 s, TBT 280 ms, and performance 0.67; the independent trace measured LCP 2.98 s, showing material cold-load variability.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/listing-trace-summary.json",
        "evidence/listing-trace.json"
      ],
      "findingIds": [
        "F08"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "visual-stability",
      "status": "pass",
      "confidence": "medium",
      "method": "Lighthouse CLS and layout-shift observer.",
      "evidence": "Lighthouse measured CLS 0.055 and the independent mobile landing layout observer recorded CLS 0 during its observation window.",
      "pathIds": [
        "home",
        "listing"
      ],
      "artifacts": [
        "evidence/lighthouse-summary.json",
        "evidence/home-mobile-layout.json"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-main-thread",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-trace-summary.json, evidence/lighthouse-summary.json.",
      "evidence": "The trace recorded two long tasks (116 ms longest) and 72.53 ms TBT; Lighthouse measured 280 ms TBT, 350 ms max potential FID, a 10.6 s TTI, and flagged forced reflow.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-trace-summary.json",
        "evidence/lighthouse-summary.json"
      ],
      "findingIds": [
        "F09"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "efficient-resource-delivery",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-images.json.",
      "evidence": "The images primitive found 17/19 images without width/height, 13 below-fold images without lazy loading, and 14 without responsive srcset.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-images.json"
      ],
      "findingIds": [
        "F10"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "checkId": "trim-unused-and-duplicate-code",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/lighthouse-details.json, evidence/lighthouse-listing.json.",
      "evidence": "Lighthouse estimated 584 KiB of unused JavaScript and 47 KiB of unused CSS on a 1,666 KiB transfer.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/lighthouse-listing.json"
      ],
      "findingIds": [
        "F11"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "names-roles-labels",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/new-form-probe.json, evidence/new-desktop.png.",
      "evidence": "The form probe reports four role=dialog SECTION elements with no aria-label/aria-labelledby and no aria-modal, while one is visibly presented as the login dialog.",
      "pathIds": [
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/new-form-probe.json",
        "evidence/new-desktop.png"
      ],
      "findingIds": [
        "F12"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "sufficient-contrast",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/lighthouse-details.json, evidence/listing-mobile.png.",
      "evidence": "Lighthouse identified three bottom-nav controls at 4.39:1 (#71717a on #f4f4f5), below the 4.5:1 requirement for 12 px normal text.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/listing-mobile.png"
      ],
      "findingIds": [
        "F13"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "structure-and-focus",
      "status": "pass",
      "confidence": "medium",
      "method": "DOM heading probe and Lighthouse accessibility audit.",
      "evidence": "The listing has one H1 followed by card H2s, semantic navigation, and Lighthouse found no heading-order, focus-order, or keyboard trap failure.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-probe.json",
        "evidence/lighthouse-listing.json"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "legible-text",
      "status": "pass",
      "confidence": "medium",
      "method": "Visual review at desktop and mobile widths.",
      "evidence": "Desktop and mobile captures show readable Persian body text, clear heading hierarchy, comfortable card line lengths, and no text overlap.",
      "pathIds": [
        "listing",
        "detail"
      ],
      "artifacts": [
        "evidence/listing-mobile.png",
        "evidence/detail-desktop.png"
      ]
    },
    {
      "principleId": "be-inclusive",
      "checkId": "zoom-reflow-targets-and-media",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/home-mobile.png, evidence/home-mobile-layout.json.",
      "evidence": "At 360x800 the page maintains a 992 px layout viewport and clips core city selection and navigation, preventing one-dimensional reflow.",
      "pathIds": [
        "home"
      ],
      "artifacts": [
        "evidence/home-mobile.png",
        "evidence/home-mobile-layout.json"
      ],
      "findingIds": [
        "F14"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "no-console-errors",
      "status": "pass",
      "confidence": "medium",
      "method": "Lighthouse best-practices audit.",
      "evidence": "Lighthouse best-practices scored 1.00 and did not report a browser-errors audit failure during the representative listing load.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/lighthouse-listing.json"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "sound-document-and-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-images.json.",
      "evidence": "The image audit found width and height attributes missing on 17 of 19 images, despite the document otherwise having a valid doctype and UTF-8 charset.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-images.json"
      ],
      "findingIds": [
        "F15"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "checkId": "browser-platform-hygiene",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/lighthouse-details.json.",
      "evidence": "Lighthouse reports one large inline/first-party script without a source map and 17 mobile bundle maps returning 403.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json"
      ],
      "findingIds": [
        "F16"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "title-and-description",
      "status": "pass",
      "confidence": "medium",
      "method": "DOM metadata probe and detail discoverability comparison.",
      "evidence": "Rendered listing has a specific Persian title and description; the detail crawler test confirms title, H1, and meta description are present in raw HTML.",
      "pathIds": [
        "listing",
        "detail"
      ],
      "artifacts": [
        "evidence/listing-probe.json",
        "evidence/detail-discoverability.json"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "crawlable-and-mobile-friendly",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-discoverability.json, evidence/listing-discoverability-rendered.png, evidence/listing-discoverability-crawler.png.",
      "evidence": "The discoverability primitive fetched the listing with HTTP 200 but found 0% rendered-content coverage: raw HTML had 10 text characters, no title, H1, or description, while the browser rendered 2,226 characters and an H1.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-discoverability.json",
        "evidence/listing-discoverability-rendered.png",
        "evidence/listing-discoverability-crawler.png"
      ],
      "findingIds": [
        "F17"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "canonical-and-indexing-signals",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/sitemap-headers.txt, evidence/sitemap.xml, evidence/robots.txt.",
      "evidence": "A direct fetch of /sitemap.xml returned HTTP/2 404 and robots.txt declares no Sitemap location, although canonical and robots meta signals exist on listing pages.",
      "pathIds": [
        "site-controls"
      ],
      "artifacts": [
        "evidence/sitemap-headers.txt",
        "evidence/sitemap.xml",
        "evidence/robots.txt"
      ],
      "findingIds": [
        "F18"
      ]
    },
    {
      "principleId": "be-discoverable",
      "checkId": "structured-and-shareable-metadata",
      "status": "pass",
      "confidence": "medium",
      "method": "Rendered metadata probe.",
      "evidence": "The listing probe found three JSON-LD blocks and ten Open Graph tags; visible title/content correspond to the listing archetype.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-probe.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "secure-transport-and-headers",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/cookies.json.",
      "evidence": "The cookie primitive found 8/8 cookies without Secure; seven are long-lived for 400 days. HSTS is present, but explicit Secure protects cookies against downgrade and non-HTTPS edge cases.",
      "pathIds": [
        "site-controls"
      ],
      "artifacts": [
        "evidence/cookies.json"
      ],
      "findingIds": [
        "F19"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "data-minimisation-and-third-parties",
      "status": "pass",
      "confidence": "medium",
      "method": "Tracker and cookie primitives.",
      "evidence": "Tracker capture found no known tracker domains; five non-site origins were primarily Divar CDN/Sentry/map infrastructure plus one trust seal, with no third-party cookies.",
      "pathIds": [
        "site-controls"
      ],
      "artifacts": [
        "evidence/trackers.json",
        "evidence/cookies.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "in-context-permissions-and-modern-auth",
      "status": "pass",
      "confidence": "medium",
      "method": "Load-state screenshots and auth form probe.",
      "evidence": "No permission prompt appeared on load; authentication is requested only when entering /new and uses a tel-national OTP field in context.",
      "pathIds": [
        "listing",
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/new-desktop.png",
        "evidence/new-form-probe.json"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "checkId": "defensive-browser-policies",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/headers.json.",
      "evidence": "Headers include HSTS, nosniff, DENY/frame-ancestors, and CSP, but Permissions-Policy is missing and CSP permits unsafe-inline for scripts and styles.",
      "pathIds": [
        "site-controls"
      ],
      "artifacts": [
        "evidence/headers.json"
      ],
      "findingIds": [
        "F20"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "progressive-enhancement",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-discoverability.json, evidence/listing-discoverability-crawler.png, evidence/detail-discoverability.json.",
      "evidence": "The no-JS crawler view of /s/tehran contains no listing heading or cards despite an HTTP 200 response; the detail template, by contrast, provides 100% raw-content coverage.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-discoverability.json",
        "evidence/listing-discoverability-crawler.png",
        "evidence/detail-discoverability.json"
      ],
      "findingIds": [
        "F21"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "resilient-runtime-behaviour",
      "status": "pass",
      "confidence": "medium",
      "method": "DOM/CSS state inspection and route walkthrough.",
      "evidence": "Rendered CSS includes explicit offline/back-online connection-banner states, while listing and detail routes completed without broken overlay placement.",
      "pathIds": [
        "listing",
        "detail"
      ],
      "artifacts": [
        "evidence/listing-dom.json",
        "evidence/detail-desktop.png"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "offline-and-installable",
      "status": "pass",
      "confidence": "medium",
      "method": "Service-worker probe and manifest fetch.",
      "evidence": "The page is controlled by a service worker and exposes a standalone manifest with start_url, theme/background colors, RTL language metadata, and icons.",
      "pathIds": [
        "site-controls"
      ],
      "artifacts": [
        "evidence/listing-probe.json",
        "evidence/manifest.json"
      ]
    },
    {
      "principleId": "be-resilient",
      "checkId": "network-and-http-failure-states",
      "status": "pass",
      "confidence": "medium",
      "method": "Rendered CSS/DOM inspection.",
      "evidence": "The authored connection banner has distinct offline and back-online states and the listing template includes an explicit post-list error message and load-more recovery control.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-dom.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "lang-dir-and-logical-properties",
      "status": "pass",
      "confidence": "medium",
      "method": "DOM metadata/CSS probe and screenshots.",
      "evidence": "The document declares lang=fa-IR and dir=rtl; representative CSS and screenshots use RTL layout consistently.",
      "pathIds": [
        "listing",
        "detail"
      ],
      "artifacts": [
        "evidence/listing-probe.json",
        "evidence/listing-desktop.png"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "locale-aware-data",
      "status": "pass",
      "confidence": "medium",
      "method": "Visual content review and form probe.",
      "evidence": "Prices, relative times, placeholders, and OTP copy are rendered in Persian conventions; the phone input uses a localized placeholder and tel-national autocomplete.",
      "pathIds": [
        "listing",
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/listing-mobile.png",
        "evidence/new-form-probe.json"
      ]
    },
    {
      "principleId": "be-internationalised",
      "checkId": "time-zone-correctness",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Surface inventory across representative paths.",
      "evidence": "The audited marketplace surfaces show relative listing ages and no scheduled cross-time-zone event or user-entered time value to validate.",
      "pathIds": [
        "listing",
        "detail"
      ],
      "reason": "The audited marketplace surfaces show relative listing ages and no scheduled cross-time-zone event or user-entered time value to validate."
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "no-dark-patterns",
      "status": "pass",
      "confidence": "medium",
      "method": "Visual review of listing, detail, and authentication states.",
      "evidence": "Posting authentication states the OTP action and links terms/privacy without preselected upsells; listing and contact CTAs are plainly labelled.",
      "pathIds": [
        "listing",
        "detail",
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/detail-desktop.png",
        "evidence/new-desktop.png"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "humane-error-handling",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/new-invalid.png, evidence/new-form-probe.json.",
      "evidence": "Activating “Next” with an empty phone field produced no inline error, no announced message, and no aria-invalid state; the user remains at the same field without actionable guidance.",
      "pathIds": [
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/new-invalid.png",
        "evidence/new-form-probe.json"
      ],
      "findingIds": [
        "F23"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "trustworthy-input-assistance",
      "status": "pass",
      "confidence": "medium",
      "method": "Auth form probe.",
      "evidence": "The phone input is type=tel with autocomplete=tel-national, a localized example, and an associated accessible label.",
      "pathIds": [
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/new-form-probe.json"
      ]
    },
    {
      "principleId": "be-trustworthy",
      "checkId": "safe-commercial-and-account-flows",
      "status": "pass",
      "confidence": "medium",
      "method": "Authentication-state walkthrough.",
      "evidence": "The audited account boundary clearly explains OTP delivery, exposes terms/privacy before continuation, and does not request a password or payment details out of context.",
      "pathIds": [
        "post-ad-auth"
      ],
      "artifacts": [
        "evidence/new-desktop.png",
        "evidence/new-form-probe.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "optimised-assets",
      "status": "issues",
      "confidence": "high",
      "method": "Active audit using evidence/listing-images.json.",
      "evidence": "Although thumbnails use modern formats and are not oversized, 13 below-fold images load eagerly and 14 lack responsive source selection, increasing avoidable requests and bytes.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-images.json"
      ],
      "findingIds": [
        "F22"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "no-wasteful-work",
      "status": "pass",
      "confidence": "medium",
      "method": "Trace summary and tracker capture.",
      "evidence": "The six-second trace contained two bounded long tasks and no continuous animation/media workload; tracker capture found no known analytics tracker.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-trace-summary.json",
        "evidence/trackers.json"
      ]
    },
    {
      "principleId": "be-sustainable",
      "checkId": "third-party-and-media-budget",
      "status": "pass",
      "confidence": "medium",
      "method": "Lighthouse network details, tracker capture, and screenshots.",
      "evidence": "Lighthouse transferred 1,666 KiB for an image-rich marketplace feed; third-party capture was mostly Divar-operated infrastructure, with no autoplay media or known trackers.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/lighthouse-details.json",
        "evidence/trackers.json",
        "evidence/listing-desktop.png"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "structured-agent-capabilities",
      "status": "not-applicable",
      "confidence": "high",
      "method": "DOM/global capability probe and site-purpose review.",
      "evidence": "No declared agent-facing workflow or WebMCP surface was found, and a public classifieds browser does not inherently require agent tool registration.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-probe.json"
      ],
      "reason": "No declared agent-facing workflow or WebMCP surface was found, and a public classifieds browser does not inherently require agent tool registration."
    },
    {
      "principleId": "be-agent-ready",
      "checkId": "on-device-inference",
      "status": "not-applicable",
      "confidence": "high",
      "method": "Site-purpose and capability review.",
      "evidence": "The audited core marketplace journeys do not require on-device inference; the browser API presence is not evidence of site intent.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/listing-probe.json"
      ],
      "reason": "The audited core marketplace journeys do not require on-device inference; the browser API presence is not evidence of site intent."
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-leak-under-repeated-interaction",
      "status": "pass",
      "confidence": "medium",
      "method": "Baseline/post heap-summary comparison after repeated scrolling.",
      "evidence": "After ten bottom/top scroll cycles the snapshot grew 3.48 MB while additional feed content loaded, but no Detached* constructor appeared; this is bounded content growth rather than direct leak evidence.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/heap-comparison.json",
        "evidence/heap-baseline.json",
        "evidence/heap-post-scroll.json"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "bounded-footprint",
      "status": "pass",
      "confidence": "medium",
      "method": "Heap totals comparison.",
      "evidence": "The loaded feed used 38.3 MB heap self-size at baseline and 41.8 MB after loading more cards, proportionate to an image-rich interactive listing.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/heap-comparison.json"
      ]
    },
    {
      "principleId": "be-memory-efficient",
      "checkId": "no-detached-dom-or-unbounded-listeners",
      "status": "pass",
      "confidence": "medium",
      "method": "Constructor-level heap-summary comparison.",
      "evidence": "Neither heap summary exposed a Detached* constructor among retained populations after repeated scrolling, and growth was dominated by ordinary Objects/Arrays.",
      "pathIds": [
        "listing"
      ],
      "artifacts": [
        "evidence/heap-comparison.json"
      ]
    }
  ],
  "principleOutcomes": [
    {
      "principleId": "respect-user-preferences",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F01",
        "F02"
      ]
    },
    {
      "principleId": "implement-natural-interactions",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F03"
      ]
    },
    {
      "principleId": "provide-guided-navigation",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F04"
      ]
    },
    {
      "principleId": "maximize-content-reduce-noise",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F05"
      ]
    },
    {
      "principleId": "adapt-to-the-form-factor",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F06"
      ]
    },
    {
      "principleId": "support-core-task-success",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F07"
      ]
    },
    {
      "principleId": "be-fast-and-stable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F08",
        "F09",
        "F10",
        "F11"
      ]
    },
    {
      "principleId": "be-inclusive",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F12",
        "F13",
        "F14"
      ]
    },
    {
      "principleId": "follow-best-practices",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F15",
        "F16"
      ]
    },
    {
      "principleId": "be-discoverable",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F17",
        "F18"
      ]
    },
    {
      "principleId": "be-private-and-secure",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F19",
        "F20"
      ]
    },
    {
      "principleId": "be-resilient",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F21"
      ]
    },
    {
      "principleId": "be-internationalised",
      "expectation": "contextual",
      "status": "pass"
    },
    {
      "principleId": "be-trustworthy",
      "expectation": "default",
      "status": "issues",
      "findingIds": [
        "F23"
      ]
    },
    {
      "principleId": "be-sustainable",
      "expectation": "contextual",
      "status": "issues",
      "findingIds": [
        "F22"
      ]
    },
    {
      "principleId": "be-agent-ready",
      "expectation": "contextual",
      "status": "not-applicable",
      "reason": "No declared agent-facing workflow or WebMCP surface was found, and a public classifieds browser does not inherently require agent tool registration. The audited core marketplace journeys do not require on-device inference; the browser API presence is not evidence of site intent."
    },
    {
      "principleId": "be-memory-efficient",
      "expectation": "default",
      "status": "pass"
    }
  ],
  "agent": "pi",
  "runId": "2026-07-22T18-34-19-976Z"
}
