diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..03460f4 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,39 @@ +name: Bug report +description: Report a reproducible CineTrace failure or false verdict. +title: "[bug] " +labels: [bug] +body: + - type: textarea + id: observed + attributes: + label: What happened? + description: Include the command, exit code and unexpected verdict. + validations: + required: true + - type: textarea + id: expected + attributes: + label: What should have happened? + validations: + required: true + - type: textarea + id: reproduction + attributes: + label: Minimal reproduction + description: Link a public fixture or paste the smallest safe example. + validations: + required: true + - type: input + id: environment + attributes: + label: Environment + placeholder: CineTrace 0.3.0, Node 22, Chromium 151, macOS arm64 + validations: + required: true + - type: checkboxes + id: security + attributes: + label: Security check + options: + - label: This report does not disclose a vulnerability or private target data. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..e76be85 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Private security report + url: https://github.com/evanpaul90/cinetrace/security/advisories/new + about: Report vulnerabilities without disclosing them publicly. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..bfa4f02 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,33 @@ +name: Oracle proposal +description: Propose a new machine-checkable failure condition. +title: "[oracle] " +labels: [enhancement] +body: + - type: textarea + id: failure + attributes: + label: What real failure should CineTrace catch? + description: Describe the user-visible or structural failure, not only an implementation idea. + validations: + required: true + - type: textarea + id: oracle + attributes: + label: Proposed oracle + description: State the machine-checkable pass/fail condition. + validations: + required: true + - type: textarea + id: controls + attributes: + label: Clean and mutated controls + description: Explain how a clean fixture passes and a deliberate mutation fails. + validations: + required: true + - type: textarea + id: boundary + attributes: + label: Evidence boundary + description: What must this check not claim to prove? + validations: + required: true diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..f12a684 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,15 @@ +## Failure or opportunity + +Describe the behaviour this change addresses. + +## Evidence + +- [ ] Clean fixture passes +- [ ] Deliberate mutation fails for the intended reason +- [ ] `npm test` passes in the affected engines +- [ ] `npm run evidence:verify` passes +- [ ] Evidence boundaries remain accurate + +## Public contract + +List any CLI, adapter, schema, report or package-surface change. Write `none` when unchanged. diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..dc3d5dd --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,40 @@ +name: pages + +on: + push: + branches: [main] + paths: + - docs/** + - evidence/** + - .github/workflows/pages.yml + workflow_dispatch: + +permissions: + contents: read + pages: write + id-token: write + +concurrency: + group: pages + cancel-in-progress: true + +jobs: + deploy: + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/configure-pages@v5 + - name: Assemble public evidence site + run: | + mkdir -p _site/evidence + cp -R docs/. _site/ + cp evidence/*.json evidence/*.mjs evidence/SHA256SUMS _site/evidence/ + - uses: actions/upload-pages-artifact@v3 + with: + path: _site + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fcdb33b..685d1a6 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -21,5 +21,6 @@ jobs: - run: npm ci - run: npx playwright install --with-deps chromium firefox webkit - run: npm test + - run: npm run evidence:verify - run: npm audit --audit-level=moderate - run: npm pack --dry-run diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8c3735c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,14 @@ +# Changelog + +## 0.3.0 - 2026-09-02 + +- Added deterministic same-build control runs with screenshot, state, environment and oracle + fingerprints. +- Added pre-navigation adapter preparation for clocks, seeded randomness and public capture seams. +- Added Firefox and WebKit coverage for the generic audit corpus. +- Added forced WebGL failure, no-JavaScript, keyboard, overlay, reduced-motion and page-error checks. +- Added explicit detection for late scroll-geometry mutation and screenshot-path collisions. +- Published the exact Odessis production adapter, complete sanitized control reports, SHA-256 + manifest and inspectable sample filmstrip. + +The project remains source-distributed. No npm package is published for this release. diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..e5ec49b --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,17 @@ +# Code of conduct + +CineTrace contributors and maintainers commit to a respectful, harassment-free project space. + +## Expected behaviour + +- Discuss code, evidence and trade-offs without attacking people. +- Give specific, reproducible feedback and accept correction when the evidence changes. +- Respect different backgrounds, identities, experience levels and accessibility needs. +- Keep private vulnerability reports and personal information private. + +Harassment, discriminatory language, threats, sustained disruption and publishing another person's +private information are not accepted. Maintainers may edit or remove contributions and restrict +participation when this policy is violated. Serious abuse should also be reported through GitHub's +Report abuse mechanism so it can be handled privately. + +This policy applies in repository issues, pull requests, discussions and other project spaces. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..5c6bb2a --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,28 @@ +# Contributing to CineTrace + +CineTrace is a focused audit tool. Contributions should preserve deterministic evidence, honest +scope boundaries and compatibility with Chromium, Firefox and WebKit. + +## Before opening a pull request + +1. Open an issue for a new oracle or report-contract change so its failure condition can be agreed + before implementation. +2. Add one clean fixture and one deliberate mutation for any new oracle. A check without a known + failing control is not release evidence. +3. Run the local release checks: + + ```sh + npm ci + npx playwright install chromium firefox webkit + npm test + npm run evidence:verify + npm audit --audit-level=moderate + npm pack --dry-run + ``` + +4. Keep product-specific adapters and proof outside the distributable package payload. +5. Document evidence limits. Do not turn a sampled browser check into a claim about physical + devices, complete accessibility conformance or universal renderer behavior. + +Small bug fixes can go straight to a pull request. Explain the failure, the oracle that catches it +and the evidence that proves the fix. diff --git a/PROOF.md b/PROOF.md index db106c4..9a4ef6b 100644 --- a/PROOF.md +++ b/PROOF.md @@ -100,6 +100,12 @@ same-build control. Both controls produced fingerprint `1273464af6848e6b` under `evidence/odessis-production-control-2026-09-02.json`; the exact public application adapter used by the command is preserved at `evidence/odessis-adapter.mjs`. +The two complete sanitized reports are preserved as +`evidence/odessis-production-control-run-1-report.json` and +`evidence/odessis-production-control-run-2-report.json`. Sanitization changed only the private local +adapter pathname to its public repository path. `evidence/SHA256SUMS` binds those reports, the +adapter and the compact summary; `npm run evidence:verify` verifies the manifest. + CineTrace's reverse, screenshot and control oracles were not weakened. The earlier premature green remains invalid evidence; the final result passed only after the target's real readiness and determinism defects were corrected. @@ -109,7 +115,7 @@ determinism defects were corrected. - `npm audit --audit-level=moderate`: 0 vulnerabilities - `node --check` on every source file: PASS - `report.schema.json` JSON syntax: PASS -- `npm pack --dry-run`: PASS, 10 distributable files, 20.4 kB packed / 72.0 kB unpacked +- `npm pack --dry-run`: PASS, 10 distributable files, 20.9 kB packed / 73.5 kB unpacked - Product-coupling scan over the distributable package payload: no Odessis references - Readiness scan: no `networkidle` dependency - `git diff --check`: PASS diff --git a/README.md b/README.md index 201b31b..855665b 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,15 @@ # CineTrace +[![test](https://github.com/evanpaul90/cinetrace/actions/workflows/test.yml/badge.svg)](https://github.com/evanpaul90/cinetrace/actions/workflows/test.yml) +[![license: MIT](https://img.shields.io/badge/license-MIT-2f7f73.svg)](LICENSE) +[![Node 22+](https://img.shields.io/badge/node-%3E%3D22-35506b.svg)](package.json) + CineTrace turns a progress-driven web experience into a deterministic filmstrip, then checks whether the experience remains structurally sound in both directions. It is a small, MIT-licensed Node 22+ CLI built on Playwright. +[![Five real CineTrace checkpoints from the Odessis production audit](docs/assets/cinetrace-filmstrip.webp)](https://evanpaul90.github.io/cinetrace/) + +**[Inspect the live sample report](https://evanpaul90.github.io/cinetrace/)** · **[Read the raw production evidence](evidence/README.md)** + It reports: - horizontal overflow, including likely offending elements; @@ -17,10 +25,15 @@ It reports: ## Install and run +The npm name is reserved for a future package release but is **not published today**. Run the +tagged source release directly: + ```sh -npm install +git clone --depth 1 --branch v0.3.0 https://github.com/evanpaul90/cinetrace.git +cd cinetrace +npm ci npx playwright install chromium firefox webkit -npx cinetrace audit https://example.test \ +node src/cli.js audit https://example.test \ --viewports desktop,mobile \ --steps 15 \ --reverse \ @@ -130,10 +143,17 @@ The test corpus proves native-scroll checkpoint accuracy, bounded readiness with ## Production evidence -The repository includes the exact public adapter and a machine-readable summary for the 2 September -2026 Odessis production control under `evidence/`. That audit covered five checkpoints forward and -reverse at desktop and phone-sized viewports, repeated the entire run in a fresh same-build control, -and returned zero defects with matching fingerprint `1273464af6848e6b`. `PROOF.md` records both the +The repository includes the [exact public adapter](evidence/odessis-adapter.mjs), +[machine-readable summary](evidence/odessis-production-control-2026-09-02.json), complete sanitized +[run 1](evidence/odessis-production-control-run-1-report.json) and +[run 2](evidence/odessis-production-control-run-2-report.json) reports, and a checked +[SHA-256 manifest](evidence/SHA256SUMS). That audit covered five checkpoints forward and reverse at +desktop and phone-sized viewports, repeated the entire run in a fresh same-build control, and +returned zero defects with matching fingerprint `1273464af6848e6b`. + +The [live sample report](https://evanpaul90.github.io/cinetrace/) uses five unaltered frames from +that production audit. The `v0.3.0` GitHub Release carries the complete evidence bundle, including +all 40 original PNG captures and both generated static reports. [PROOF.md](PROOF.md) records both the passing evidence and the earlier premature green result that CineTrace rejected after a longer audit crossed a real late-layout mutation. diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..e2db3bb --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,19 @@ +# Security policy + +## Supported version + +Security fixes are applied to the latest tagged release. CineTrace is currently in the 0.x series, +so fixes may ship with a minor version change. + +## Report a vulnerability + +Do not open a public issue for a vulnerability. Use GitHub's private vulnerability reporting form: + +https://github.com/evanpaul90/cinetrace/security/advisories/new + +Include the affected version, a minimal reproduction, impact and any suggested mitigation. You can +expect an acknowledgement within five business days. No bounty programme is currently offered. + +Project adapters are executable JavaScript supplied by the operator and run with the local Node and +browser permissions of the CineTrace process. Only run adapters you trust. CineTrace is a local CLI, +not a hosted URL-scanning service. diff --git a/docs/.nojekyll b/docs/.nojekyll new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/docs/.nojekyll @@ -0,0 +1 @@ + diff --git a/docs/assets/cinetrace-filmstrip.webp b/docs/assets/cinetrace-filmstrip.webp new file mode 100644 index 0000000..cc89366 Binary files /dev/null and b/docs/assets/cinetrace-filmstrip.webp differ diff --git a/docs/assets/frame-0.webp b/docs/assets/frame-0.webp new file mode 100644 index 0000000..882a5ee Binary files /dev/null and b/docs/assets/frame-0.webp differ diff --git a/docs/assets/frame-0_25.webp b/docs/assets/frame-0_25.webp new file mode 100644 index 0000000..7abc82d Binary files /dev/null and b/docs/assets/frame-0_25.webp differ diff --git a/docs/assets/frame-0_5.webp b/docs/assets/frame-0_5.webp new file mode 100644 index 0000000..36ff89f Binary files /dev/null and b/docs/assets/frame-0_5.webp differ diff --git a/docs/assets/frame-0_75.webp b/docs/assets/frame-0_75.webp new file mode 100644 index 0000000..3656c50 Binary files /dev/null and b/docs/assets/frame-0_75.webp differ diff --git a/docs/assets/frame-1.webp b/docs/assets/frame-1.webp new file mode 100644 index 0000000..bd8abc7 Binary files /dev/null and b/docs/assets/frame-1.webp differ diff --git a/docs/index.html b/docs/index.html new file mode 100644 index 0000000..b6280b8 --- /dev/null +++ b/docs/index.html @@ -0,0 +1,166 @@ + + + + + + + + CineTrace / production filmstrip + + + +
+
CineTrace / recorded 02 Sep 2026
+

One journey. Both directions.

+

A real production filmstrip from five sampled states. CineTrace replayed the same scroll-driven WebGL experience forward and reverse, then repeated the entire audit in a fresh browser context.

+
+ 0 defects2 controls40 PNG captures + Source on GitHub +
+
+
+
+
+

Forward control / desktop

+
fingerprint 1273464af6848e6b
+
+
+
Odessis harbour scene at 0 percent progress
Harbour road0%
+
Odessis city scene at 25 percent progress
Stoa approach25%
+
Odessis agora scene at 50 percent progress
Agora of routes50%
+
Odessis tholos scene at 75 percent progress
The tholos75%
+
Odessis summit scene at 100 percent progress
The summit100%
+
+
forward 0 → 1state and pixels sampledreverse 1 → 0
+
+
+
+
Release evidence / Chromium 151
+

The report is the product.

+
+
+

Both same-build controls returned the identical fingerprint. The downloadable reports retain every state digest, screenshot digest, browser/runtime field, check and recorded diagnostic. The gallery above is an editorial sample, not a substitute for the raw evidence.

+
    +
  • Forward / reverse statepass
  • +
  • Reduced motionpass
  • +
  • No-JavaScript semanticspass
  • +
  • Forced WebGL failurepass
  • +
  • Horizontal overflowpass
  • +
  • Page errorspass
  • +
+ +
+
+
+ + + diff --git a/evidence/README.md b/evidence/README.md new file mode 100644 index 0000000..a9d7cc0 --- /dev/null +++ b/evidence/README.md @@ -0,0 +1,26 @@ +# Production evidence + +This directory preserves the public, machine-checkable portion of the CineTrace 0.3.0 production +control against `https://odessis.in/` on 2 September 2026. + +## Files + +- `odessis-adapter.mjs` is the exact project adapter used by both controls. +- `odessis-production-control-2026-09-02.json` is the compact evidence index. +- `odessis-production-control-run-1-report.json` is the complete sanitized baseline report. +- `odessis-production-control-run-2-report.json` is the complete sanitized fresh-context report. +- `SHA256SUMS` binds the public adapter and all three JSON records. + +The only sanitization replaces the private local adapter pathname recorded by the CLI with the +public repository path `./evidence/odessis-adapter.mjs`. Verdicts, fingerprints, states, screenshot +digests, browser/runtime metadata, checks and errors are unchanged. + +Run the integrity check from the repository root: + +```sh +npm run evidence:verify +``` + +The `v0.3.0` GitHub Release also carries a compressed evidence bundle containing both generated +static reports and all 40 original PNG frames. The production target can change after the recorded +run; these artifacts prove the sampled state at the recorded time, not the target's future state. diff --git a/evidence/SHA256SUMS b/evidence/SHA256SUMS new file mode 100644 index 0000000..4a8684a --- /dev/null +++ b/evidence/SHA256SUMS @@ -0,0 +1,4 @@ +4b352d09a4d0e7863ca7b813d0b9acec59994262032081f74926404c807e818e odessis-adapter.mjs +9afe13e8dc387b4d569d8389cf460c323ca37e7b2616594b5fa8b2c22fafd1e3 odessis-production-control-2026-09-02.json +5f154cf28cbb5f28dea2749e6d840933b33bdd77a4e8e56eee9fc89533a364c6 odessis-production-control-run-1-report.json +7414def94cda6443a7bfe03be18de16102b3f5ae885696e8e257903a9fa42a2b odessis-production-control-run-2-report.json diff --git a/evidence/odessis-production-control-run-1-report.json b/evidence/odessis-production-control-run-1-report.json new file mode 100644 index 0000000..c2e8d25 --- /dev/null +++ b/evidence/odessis-production-control-run-1-report.json @@ -0,0 +1,2591 @@ +{ + "schemaVersion": "2.0.0", + "tool": { + "name": "CineTrace", + "version": "0.3.0" + }, + "environment": { + "browser": { + "engine": "chromium", + "version": "151.0.7922.34" + }, + "os": { + "platform": "darwin", + "arch": "arm64", + "release": "25.4.0" + }, + "runtime": { + "name": "node", + "version": "v26.0.0" + }, + "renderer": { + "metricScope": "webgl-specific", + "available": true, + "api": "webgl2", + "vendor": "WebKit", + "renderer": "WebKit WebGL", + "unmaskedVendor": "Google Inc. (Google)", + "unmaskedRenderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (LLVM 10.0.0) (0x0000C0DE)), SwiftShader driver)" + }, + "metricLabels": { + "generic": [ + "overflow", + "heading", + "keyboard", + "semantic-content", + "primary-action", + "overlay-collision", + "reverse-drift", + "reduced-motion", + "page-errors" + ], + "engineSpecific": [ + "renderer-metadata", + "forced-webgl-failure" + ] + } + }, + "target": "https://odessis.in/", + "generatedAt": "2026-09-02T02:16:55.846Z", + "configuration": { + "viewports": [ + { + "name": "desktop", + "width": 1440, + "height": 900, + "deviceScaleFactor": 1 + }, + { + "name": "mobile", + "width": 390, + "height": 844, + "deviceScaleFactor": 1 + } + ], + "steps": [ + 0, + 0.25, + 0.5, + 0.75, + 1 + ], + "direction": "both", + "adapter": "./evidence/odessis-adapter.mjs", + "selectors": { + "primaryAction": "a[href], button", + "noJsPrimaryAction": "a[href], button", + "semanticContent": "main, body", + "noJsSemanticContent": "main, body", + "overlay": "[data-cinetrace-overlay]", + "overlayTarget": "[data-cinetrace-protected]" + }, + "forceWebglFailure": true, + "checkReducedMotion": true, + "controlRuns": 2, + "browser": "chromium" + }, + "verdict": { + "pass": true, + "defectCount": 0 + }, + "defects": [], + "viewports": [ + { + "viewport": { + "name": "desktop", + "width": 1440, + "height": 900, + "deviceScaleFactor": 1 + }, + "frames": [ + { + "direction": "forward", + "progress": 0, + "screenshot": "images/0-desktop-forward-0.png", + "screenshotDigest": "5de0848dcc53214f41b66f0ab25376acb6cb58d7a32f9b63d7c191a5704c02ec", + "state": { + "target": 0, + "chapter": 0, + "chapterId": "harbour", + "foreground": "harbour-rope", + "portraitFactor": 0, + "camera": { + "position": [ + -1, + 2.6, + 92 + ], + "fov": 48, + "aspect": 1.6 + } + }, + "stateDigest": "df086c4ca43bd0e2", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.25, + "screenshot": "images/0-desktop-forward-0_25.png", + "screenshotDigest": "8ce40094217f68c990eadb1b30cb0d8baf1213b3780df89c2b00fec569990a78", + "state": { + "target": 1.7506, + "chapter": 2, + "chapterId": "stoa", + "foreground": "stoa-curtain", + "portraitFactor": 0, + "camera": { + "position": [ + -2.4, + 10.93, + -48.14 + ], + "fov": 52.79, + "aspect": 1.6 + } + }, + "stateDigest": "669e03adbfb011d1", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.5, + "screenshot": "images/0-desktop-forward-0_5.png", + "screenshotDigest": "9ed3648fb49db14d7ca606bbc9849c8b6888a121e2e1a615d0c7fe8fc5c6680d", + "state": { + "target": 3.5002, + "chapter": 4, + "chapterId": "agora", + "foreground": "agora-awning", + "portraitFactor": 0, + "camera": { + "position": [ + -7.96, + 38.62, + -250.07 + ], + "fov": 53.9, + "aspect": 1.6 + } + }, + "stateDigest": "6bd4a6c5368f5600", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.75, + "screenshot": "images/0-desktop-forward-0_75.png", + "screenshotDigest": "82ab8044ae0c804a92ff9df09d55a1c632f69e040970ea33e5a19d8240cc31b6", + "state": { + "target": 5.2505, + "chapter": 5, + "chapterId": "tholos", + "foreground": "tholos-mist", + "portraitFactor": 0, + "camera": { + "position": [ + -24.02, + 66, + -413.34 + ], + "fov": 46.9, + "aspect": 1.6 + } + }, + "stateDigest": "278b3c991a01dfdb", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 1, + "screenshot": "images/0-desktop-forward-1.png", + "screenshotDigest": "47ec145f41e9129d4bf74a5e30cbbc910b026312b61481490997a19e4763310b", + "state": { + "target": 7, + "chapter": 7, + "chapterId": "temple", + "foreground": "temple-laurel", + "portraitFactor": 0, + "camera": { + "position": [ + 0, + 101.5, + -648 + ], + "fov": 52, + "aspect": 1.6 + } + }, + "stateDigest": "6e77641abce89d58", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 1, + "screenshot": "images/0-desktop-reverse-1.png", + "screenshotDigest": "47ec145f41e9129d4bf74a5e30cbbc910b026312b61481490997a19e4763310b", + "state": { + "target": 7, + "chapter": 7, + "chapterId": "temple", + "foreground": "temple-laurel", + "portraitFactor": 0, + "camera": { + "position": [ + 0, + 101.5, + -648 + ], + "fov": 52, + "aspect": 1.6 + } + }, + "stateDigest": "6e77641abce89d58", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.75, + "screenshot": "images/0-desktop-reverse-0_75.png", + "screenshotDigest": "82ab8044ae0c804a92ff9df09d55a1c632f69e040970ea33e5a19d8240cc31b6", + "state": { + "target": 5.2505, + "chapter": 5, + "chapterId": "tholos", + "foreground": "tholos-mist", + "portraitFactor": 0, + "camera": { + "position": [ + -24.02, + 66, + -413.34 + ], + "fov": 46.9, + "aspect": 1.6 + } + }, + "stateDigest": "278b3c991a01dfdb", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.5, + "screenshot": "images/0-desktop-reverse-0_5.png", + "screenshotDigest": "9ed3648fb49db14d7ca606bbc9849c8b6888a121e2e1a615d0c7fe8fc5c6680d", + "state": { + "target": 3.5002, + "chapter": 4, + "chapterId": "agora", + "foreground": "agora-awning", + "portraitFactor": 0, + "camera": { + "position": [ + -7.96, + 38.62, + -250.07 + ], + "fov": 53.9, + "aspect": 1.6 + } + }, + "stateDigest": "6bd4a6c5368f5600", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.25, + "screenshot": "images/0-desktop-reverse-0_25.png", + "screenshotDigest": "8ce40094217f68c990eadb1b30cb0d8baf1213b3780df89c2b00fec569990a78", + "state": { + "target": 1.7506, + "chapter": 2, + "chapterId": "stoa", + "foreground": "stoa-curtain", + "portraitFactor": 0, + "camera": { + "position": [ + -2.4, + 10.93, + -48.14 + ], + "fov": 52.79, + "aspect": 1.6 + } + }, + "stateDigest": "669e03adbfb011d1", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0, + "screenshot": "images/0-desktop-reverse-0.png", + "screenshotDigest": "5de0848dcc53214f41b66f0ab25376acb6cb58d7a32f9b63d7c191a5704c02ec", + "state": { + "target": 0, + "chapter": 0, + "chapterId": "harbour", + "foreground": "harbour-rope", + "portraitFactor": 0, + "camera": { + "position": [ + -1, + 2.6, + 92 + ], + "fov": 48, + "aspect": 1.6 + } + }, + "stateDigest": "df086c4ca43bd0e2", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + } + ], + "checks": { + "overflow": { + "pass": true, + "failingFrames": [] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "primaryActionFallback": { + "status": 200, + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 38, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "keyboardReachability": { + "pass": true, + "selector": "a[href], button", + "targetCount": 47, + "focusableCount": 61, + "tabsRequired": 1, + "maxTabs": 62, + "key": "Tab", + "engine": "chromium" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "failingFrames": [] + }, + "semanticFallback": { + "status": 200, + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2490 + }, + "reverseDrift": { + "checked": true, + "pass": true, + "mismatches": [] + }, + "reducedMotion": { + "checked": true, + "pass": true, + "status": 200, + "mediaQueryMatches": true, + "activeAnimations": [], + "errors": [] + }, + "webglFailure": { + "checked": true, + "metricScope": "engine-specific", + "pass": true, + "status": 200, + "patchActive": true, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2767 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 39, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "errors": [ + { + "type": "console", + "critical": false, + "message": "THREE.WebGLRenderer: Error creating WebGL context." + }, + { + "type": "console", + "critical": false, + "message": "[odessis] spatial renderer unavailable Error: Error creating WebGL context.\n at new Ua (https://odessis.in/assets/vendor/three.module.min.js:6:320086)\n at boot (https://odessis.in/js/main.js:67:20)\n at https://odessis.in/js/main.js:31:1" + } + ], + "fatalErrors": [] + }, + "pageErrors": { + "pass": true, + "status": 200, + "errors": [] + } + } + }, + { + "viewport": { + "name": "mobile", + "width": 390, + "height": 844, + "deviceScaleFactor": 1 + }, + "frames": [ + { + "direction": "forward", + "progress": 0, + "screenshot": "images/1-mobile-forward-0.png", + "screenshotDigest": "383bad29b80360b49b09ae2e7de55ff1d484074ed560134ae9e2ea12b7fecd17", + "state": { + "target": 0, + "chapter": 0, + "chapterId": "harbour", + "foreground": "harbour-rope", + "portraitFactor": 1, + "camera": { + "position": [ + 0, + 2.8, + 96 + ], + "fov": 58, + "aspect": 0.462 + } + }, + "stateDigest": "6c3bd85188814fcd", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.25, + "screenshot": "images/1-mobile-forward-0_25.png", + "screenshotDigest": "db3c65d0a27d519e55d3177383a2f5cc04202274ef885a500d00d88bed9ad362", + "state": { + "target": 1.7501, + "chapter": 2, + "chapterId": "stoa", + "foreground": "stoa-curtain", + "portraitFactor": 1, + "camera": { + "position": [ + 2.5, + 13.54, + -73.07 + ], + "fov": 61.79, + "aspect": 0.462 + } + }, + "stateDigest": "3a94a2a7e9d5409e", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.5, + "screenshot": "images/1-mobile-forward-0_5.png", + "screenshotDigest": "d3819c5d266e916906b089f0b2ea3a80d3a97ae8b72055651e7df7a3afbb2836", + "state": { + "target": 3.4998, + "chapter": 3, + "chapterId": "theatre", + "foreground": "theatre-rim-grass", + "portraitFactor": 1, + "camera": { + "position": [ + -9.06, + 38.42, + -252.76 + ], + "fov": 64.4, + "aspect": 0.462 + } + }, + "stateDigest": "acdd60092dd8ff8c", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.75, + "screenshot": "images/1-mobile-forward-0_75.png", + "screenshotDigest": "a416f03f48b847a8889ae6b674b897884261f01f81146aef212e7d0c7f978e28", + "state": { + "target": 5.25, + "chapter": 5, + "chapterId": "tholos", + "foreground": "tholos-mist", + "portraitFactor": 1, + "camera": { + "position": [ + -16.87, + 64.65, + -421.77 + ], + "fov": 61.4, + "aspect": 0.462 + } + }, + "stateDigest": "d36cfd92d3414883", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 1, + "screenshot": "images/1-mobile-forward-1.png", + "screenshotDigest": "8bd25ef0007df6ad4f582c70e2e7fdd2289bf585bfcf3eb2747ab2c62e33d1a3", + "state": { + "target": 7, + "chapter": 7, + "chapterId": "temple", + "foreground": "temple-laurel", + "portraitFactor": 1, + "camera": { + "position": [ + 0, + 99, + -634 + ], + "fov": 38, + "aspect": 0.462 + } + }, + "stateDigest": "4ce4503938073aea", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 1, + "screenshot": "images/1-mobile-reverse-1.png", + "screenshotDigest": "8bd25ef0007df6ad4f582c70e2e7fdd2289bf585bfcf3eb2747ab2c62e33d1a3", + "state": { + "target": 7, + "chapter": 7, + "chapterId": "temple", + "foreground": "temple-laurel", + "portraitFactor": 1, + "camera": { + "position": [ + 0, + 99, + -634 + ], + "fov": 38, + "aspect": 0.462 + } + }, + "stateDigest": "4ce4503938073aea", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.75, + "screenshot": "images/1-mobile-reverse-0_75.png", + "screenshotDigest": "a416f03f48b847a8889ae6b674b897884261f01f81146aef212e7d0c7f978e28", + "state": { + "target": 5.25, + "chapter": 5, + "chapterId": "tholos", + "foreground": "tholos-mist", + "portraitFactor": 1, + "camera": { + "position": [ + -16.87, + 64.65, + -421.77 + ], + "fov": 61.4, + "aspect": 0.462 + } + }, + "stateDigest": "d36cfd92d3414883", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.5, + "screenshot": "images/1-mobile-reverse-0_5.png", + "screenshotDigest": "d3819c5d266e916906b089f0b2ea3a80d3a97ae8b72055651e7df7a3afbb2836", + "state": { + "target": 3.4998, + "chapter": 3, + "chapterId": "theatre", + "foreground": "theatre-rim-grass", + "portraitFactor": 1, + "camera": { + "position": [ + -9.06, + 38.42, + -252.76 + ], + "fov": 64.4, + "aspect": 0.462 + } + }, + "stateDigest": "acdd60092dd8ff8c", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.25, + "screenshot": "images/1-mobile-reverse-0_25.png", + "screenshotDigest": "db3c65d0a27d519e55d3177383a2f5cc04202274ef885a500d00d88bed9ad362", + "state": { + "target": 1.7501, + "chapter": 2, + "chapterId": "stoa", + "foreground": "stoa-curtain", + "portraitFactor": 1, + "camera": { + "position": [ + 2.5, + 13.54, + -73.07 + ], + "fov": 61.79, + "aspect": 0.462 + } + }, + "stateDigest": "3a94a2a7e9d5409e", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0, + "screenshot": "images/1-mobile-reverse-0.png", + "screenshotDigest": "383bad29b80360b49b09ae2e7de55ff1d484074ed560134ae9e2ea12b7fecd17", + "state": { + "target": 0, + "chapter": 0, + "chapterId": "harbour", + "foreground": "harbour-rope", + "portraitFactor": 1, + "camera": { + "position": [ + 0, + 2.8, + 96 + ], + "fov": 58, + "aspect": 0.462 + } + }, + "stateDigest": "6c3bd85188814fcd", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + } + ], + "checks": { + "overflow": { + "pass": true, + "failingFrames": [] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "primaryActionFallback": { + "status": 200, + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 38, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "keyboardReachability": { + "pass": true, + "selector": "a[href], button", + "targetCount": 47, + "focusableCount": 61, + "tabsRequired": 1, + "maxTabs": 62, + "key": "Tab", + "engine": "chromium" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "failingFrames": [] + }, + "semanticFallback": { + "status": 200, + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2490 + }, + "reverseDrift": { + "checked": true, + "pass": true, + "mismatches": [] + }, + "reducedMotion": { + "checked": true, + "pass": true, + "status": 200, + "mediaQueryMatches": true, + "activeAnimations": [], + "errors": [] + }, + "webglFailure": { + "checked": true, + "metricScope": "engine-specific", + "pass": true, + "status": 200, + "patchActive": true, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2730 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 39, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "errors": [ + { + "type": "console", + "critical": false, + "message": "THREE.WebGLRenderer: Error creating WebGL context." + }, + { + "type": "console", + "critical": false, + "message": "[odessis] spatial renderer unavailable Error: Error creating WebGL context.\n at new Ua (https://odessis.in/assets/vendor/three.module.min.js:6:320086)\n at boot (https://odessis.in/js/main.js:67:20)\n at https://odessis.in/js/main.js:31:1" + } + ], + "fatalErrors": [] + }, + "pageErrors": { + "pass": true, + "status": 200, + "errors": [] + } + } + } + ], + "controls": { + "checked": true, + "requestedRuns": 2, + "completedRuns": 2, + "pass": true, + "baselineFingerprint": "1273464af6848e6b", + "runs": [ + { + "run": 1, + "fingerprint": "1273464af6848e6b", + "match": true, + "sameBuild": true, + "report": "report.json" + }, + { + "run": 2, + "fingerprint": "1273464af6848e6b", + "match": true, + "sameBuild": true, + "report": "controls/run-2/report.json" + } + ] + } +} diff --git a/evidence/odessis-production-control-run-2-report.json b/evidence/odessis-production-control-run-2-report.json new file mode 100644 index 0000000..f855f49 --- /dev/null +++ b/evidence/odessis-production-control-run-2-report.json @@ -0,0 +1,2584 @@ +{ + "schemaVersion": "2.0.0", + "tool": { + "name": "CineTrace", + "version": "0.3.0" + }, + "environment": { + "browser": { + "engine": "chromium", + "version": "151.0.7922.34" + }, + "os": { + "platform": "darwin", + "arch": "arm64", + "release": "25.4.0" + }, + "runtime": { + "name": "node", + "version": "v26.0.0" + }, + "renderer": { + "metricScope": "webgl-specific", + "available": true, + "api": "webgl2", + "vendor": "WebKit", + "renderer": "WebKit WebGL", + "unmaskedVendor": "Google Inc. (Google)", + "unmaskedRenderer": "ANGLE (Google, Vulkan 1.3.0 (SwiftShader Device (LLVM 10.0.0) (0x0000C0DE)), SwiftShader driver)" + }, + "metricLabels": { + "generic": [ + "overflow", + "heading", + "keyboard", + "semantic-content", + "primary-action", + "overlay-collision", + "reverse-drift", + "reduced-motion", + "page-errors" + ], + "engineSpecific": [ + "renderer-metadata", + "forced-webgl-failure" + ] + } + }, + "target": "https://odessis.in/", + "generatedAt": "2026-09-02T02:22:59.217Z", + "configuration": { + "viewports": [ + { + "name": "desktop", + "width": 1440, + "height": 900, + "deviceScaleFactor": 1 + }, + { + "name": "mobile", + "width": 390, + "height": 844, + "deviceScaleFactor": 1 + } + ], + "steps": [ + 0, + 0.25, + 0.5, + 0.75, + 1 + ], + "direction": "both", + "adapter": "./evidence/odessis-adapter.mjs", + "selectors": { + "primaryAction": "a[href], button", + "noJsPrimaryAction": "a[href], button", + "semanticContent": "main, body", + "noJsSemanticContent": "main, body", + "overlay": "[data-cinetrace-overlay]", + "overlayTarget": "[data-cinetrace-protected]" + }, + "forceWebglFailure": true, + "checkReducedMotion": true, + "controlRuns": 1, + "browser": "chromium" + }, + "verdict": { + "pass": true, + "defectCount": 0 + }, + "defects": [], + "viewports": [ + { + "viewport": { + "name": "desktop", + "width": 1440, + "height": 900, + "deviceScaleFactor": 1 + }, + "frames": [ + { + "direction": "forward", + "progress": 0, + "screenshot": "images/0-desktop-forward-0.png", + "screenshotDigest": "5de0848dcc53214f41b66f0ab25376acb6cb58d7a32f9b63d7c191a5704c02ec", + "state": { + "target": 0, + "chapter": 0, + "chapterId": "harbour", + "foreground": "harbour-rope", + "portraitFactor": 0, + "camera": { + "position": [ + -1, + 2.6, + 92 + ], + "fov": 48, + "aspect": 1.6 + } + }, + "stateDigest": "df086c4ca43bd0e2", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.25, + "screenshot": "images/0-desktop-forward-0_25.png", + "screenshotDigest": "8ce40094217f68c990eadb1b30cb0d8baf1213b3780df89c2b00fec569990a78", + "state": { + "target": 1.7506, + "chapter": 2, + "chapterId": "stoa", + "foreground": "stoa-curtain", + "portraitFactor": 0, + "camera": { + "position": [ + -2.4, + 10.93, + -48.14 + ], + "fov": 52.79, + "aspect": 1.6 + } + }, + "stateDigest": "669e03adbfb011d1", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.5, + "screenshot": "images/0-desktop-forward-0_5.png", + "screenshotDigest": "9ed3648fb49db14d7ca606bbc9849c8b6888a121e2e1a615d0c7fe8fc5c6680d", + "state": { + "target": 3.5002, + "chapter": 4, + "chapterId": "agora", + "foreground": "agora-awning", + "portraitFactor": 0, + "camera": { + "position": [ + -7.96, + 38.62, + -250.07 + ], + "fov": 53.9, + "aspect": 1.6 + } + }, + "stateDigest": "6bd4a6c5368f5600", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.75, + "screenshot": "images/0-desktop-forward-0_75.png", + "screenshotDigest": "82ab8044ae0c804a92ff9df09d55a1c632f69e040970ea33e5a19d8240cc31b6", + "state": { + "target": 5.2505, + "chapter": 5, + "chapterId": "tholos", + "foreground": "tholos-mist", + "portraitFactor": 0, + "camera": { + "position": [ + -24.02, + 66, + -413.34 + ], + "fov": 46.9, + "aspect": 1.6 + } + }, + "stateDigest": "278b3c991a01dfdb", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 1, + "screenshot": "images/0-desktop-forward-1.png", + "screenshotDigest": "47ec145f41e9129d4bf74a5e30cbbc910b026312b61481490997a19e4763310b", + "state": { + "target": 7, + "chapter": 7, + "chapterId": "temple", + "foreground": "temple-laurel", + "portraitFactor": 0, + "camera": { + "position": [ + 0, + 101.5, + -648 + ], + "fov": 52, + "aspect": 1.6 + } + }, + "stateDigest": "6e77641abce89d58", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 1, + "screenshot": "images/0-desktop-reverse-1.png", + "screenshotDigest": "47ec145f41e9129d4bf74a5e30cbbc910b026312b61481490997a19e4763310b", + "state": { + "target": 7, + "chapter": 7, + "chapterId": "temple", + "foreground": "temple-laurel", + "portraitFactor": 0, + "camera": { + "position": [ + 0, + 101.5, + -648 + ], + "fov": 52, + "aspect": 1.6 + } + }, + "stateDigest": "6e77641abce89d58", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.75, + "screenshot": "images/0-desktop-reverse-0_75.png", + "screenshotDigest": "82ab8044ae0c804a92ff9df09d55a1c632f69e040970ea33e5a19d8240cc31b6", + "state": { + "target": 5.2505, + "chapter": 5, + "chapterId": "tholos", + "foreground": "tholos-mist", + "portraitFactor": 0, + "camera": { + "position": [ + -24.02, + 66, + -413.34 + ], + "fov": 46.9, + "aspect": 1.6 + } + }, + "stateDigest": "278b3c991a01dfdb", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.5, + "screenshot": "images/0-desktop-reverse-0_5.png", + "screenshotDigest": "9ed3648fb49db14d7ca606bbc9849c8b6888a121e2e1a615d0c7fe8fc5c6680d", + "state": { + "target": 3.5002, + "chapter": 4, + "chapterId": "agora", + "foreground": "agora-awning", + "portraitFactor": 0, + "camera": { + "position": [ + -7.96, + 38.62, + -250.07 + ], + "fov": 53.9, + "aspect": 1.6 + } + }, + "stateDigest": "6bd4a6c5368f5600", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.25, + "screenshot": "images/0-desktop-reverse-0_25.png", + "screenshotDigest": "8ce40094217f68c990eadb1b30cb0d8baf1213b3780df89c2b00fec569990a78", + "state": { + "target": 1.7506, + "chapter": 2, + "chapterId": "stoa", + "foreground": "stoa-curtain", + "portraitFactor": 0, + "camera": { + "position": [ + -2.4, + 10.93, + -48.14 + ], + "fov": 52.79, + "aspect": 1.6 + } + }, + "stateDigest": "669e03adbfb011d1", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--rope", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0, + "screenshot": "images/0-desktop-reverse-0.png", + "screenshotDigest": "5de0848dcc53214f41b66f0ab25376acb6cb58d7a32f9b63d7c191a5704c02ec", + "state": { + "target": 0, + "chapter": 0, + "chapterId": "harbour", + "foreground": "harbour-rope", + "portraitFactor": 0, + "camera": { + "position": [ + -1, + 2.6, + 92 + ], + "fov": 48, + "aspect": 1.6 + } + }, + "stateDigest": "df086c4ca43bd0e2", + "overflow": { + "pass": true, + "viewportWidth": 1440, + "documentWidth": 1440, + "bodyWidth": 1483, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -720, + "right": 2160, + "width": 2880 + }, + { + "selector": "div.fg.fg--gate", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -43.2, + "right": 1483.2, + "width": 1526.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + } + ], + "checks": { + "overflow": { + "pass": true, + "failingFrames": [] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2558 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "primaryActionFallback": { + "status": 200, + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 38, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "keyboardReachability": { + "pass": true, + "selector": "a[href], button", + "targetCount": 47, + "focusableCount": 61, + "tabsRequired": 1, + "maxTabs": 62, + "key": "Tab", + "engine": "chromium" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "failingFrames": [] + }, + "semanticFallback": { + "status": 200, + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2490 + }, + "reverseDrift": { + "checked": true, + "pass": true, + "mismatches": [] + }, + "reducedMotion": { + "checked": true, + "pass": true, + "status": 200, + "mediaQueryMatches": true, + "activeAnimations": [], + "errors": [] + }, + "webglFailure": { + "checked": true, + "metricScope": "engine-specific", + "pass": true, + "status": 200, + "patchActive": true, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2767 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 39, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "errors": [ + { + "type": "console", + "critical": false, + "message": "THREE.WebGLRenderer: Error creating WebGL context." + }, + { + "type": "console", + "critical": false, + "message": "[odessis] spatial renderer unavailable Error: Error creating WebGL context.\n at new Ua (https://odessis.in/assets/vendor/three.module.min.js:6:320086)\n at boot (https://odessis.in/js/main.js:67:20)\n at https://odessis.in/js/main.js:31:1" + } + ], + "fatalErrors": [] + }, + "pageErrors": { + "pass": true, + "status": 200, + "errors": [] + } + } + }, + { + "viewport": { + "name": "mobile", + "width": 390, + "height": 844, + "deviceScaleFactor": 1 + }, + "frames": [ + { + "direction": "forward", + "progress": 0, + "screenshot": "images/1-mobile-forward-0.png", + "screenshotDigest": "383bad29b80360b49b09ae2e7de55ff1d484074ed560134ae9e2ea12b7fecd17", + "state": { + "target": 0, + "chapter": 0, + "chapterId": "harbour", + "foreground": "harbour-rope", + "portraitFactor": 1, + "camera": { + "position": [ + 0, + 2.8, + 96 + ], + "fov": 58, + "aspect": 0.462 + } + }, + "stateDigest": "6c3bd85188814fcd", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.25, + "screenshot": "images/1-mobile-forward-0_25.png", + "screenshotDigest": "db3c65d0a27d519e55d3177383a2f5cc04202274ef885a500d00d88bed9ad362", + "state": { + "target": 1.7501, + "chapter": 2, + "chapterId": "stoa", + "foreground": "stoa-curtain", + "portraitFactor": 1, + "camera": { + "position": [ + 2.5, + 13.54, + -73.07 + ], + "fov": 61.79, + "aspect": 0.462 + } + }, + "stateDigest": "3a94a2a7e9d5409e", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.5, + "screenshot": "images/1-mobile-forward-0_5.png", + "screenshotDigest": "d3819c5d266e916906b089f0b2ea3a80d3a97ae8b72055651e7df7a3afbb2836", + "state": { + "target": 3.4998, + "chapter": 3, + "chapterId": "theatre", + "foreground": "theatre-rim-grass", + "portraitFactor": 1, + "camera": { + "position": [ + -9.06, + 38.42, + -252.76 + ], + "fov": 64.4, + "aspect": 0.462 + } + }, + "stateDigest": "acdd60092dd8ff8c", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 0.75, + "screenshot": "images/1-mobile-forward-0_75.png", + "screenshotDigest": "a416f03f48b847a8889ae6b674b897884261f01f81146aef212e7d0c7f978e28", + "state": { + "target": 5.25, + "chapter": 5, + "chapterId": "tholos", + "foreground": "tholos-mist", + "portraitFactor": 1, + "camera": { + "position": [ + -16.87, + 64.65, + -421.77 + ], + "fov": 61.4, + "aspect": 0.462 + } + }, + "stateDigest": "d36cfd92d3414883", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "forward", + "progress": 1, + "screenshot": "images/1-mobile-forward-1.png", + "screenshotDigest": "8bd25ef0007df6ad4f582c70e2e7fdd2289bf585bfcf3eb2747ab2c62e33d1a3", + "state": { + "target": 7, + "chapter": 7, + "chapterId": "temple", + "foreground": "temple-laurel", + "portraitFactor": 1, + "camera": { + "position": [ + 0, + 99, + -634 + ], + "fov": 38, + "aspect": 0.462 + } + }, + "stateDigest": "4ce4503938073aea", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 1, + "screenshot": "images/1-mobile-reverse-1.png", + "screenshotDigest": "8bd25ef0007df6ad4f582c70e2e7fdd2289bf585bfcf3eb2747ab2c62e33d1a3", + "state": { + "target": 7, + "chapter": 7, + "chapterId": "temple", + "foreground": "temple-laurel", + "portraitFactor": 1, + "camera": { + "position": [ + 0, + 99, + -634 + ], + "fov": 38, + "aspect": 0.462 + } + }, + "stateDigest": "4ce4503938073aea", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.75, + "screenshot": "images/1-mobile-reverse-0_75.png", + "screenshotDigest": "a416f03f48b847a8889ae6b674b897884261f01f81146aef212e7d0c7f978e28", + "state": { + "target": 5.25, + "chapter": 5, + "chapterId": "tholos", + "foreground": "tholos-mist", + "portraitFactor": 1, + "camera": { + "position": [ + -16.87, + 64.65, + -421.77 + ], + "fov": 61.4, + "aspect": 0.462 + } + }, + "stateDigest": "d36cfd92d3414883", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.5, + "screenshot": "images/1-mobile-reverse-0_5.png", + "screenshotDigest": "d3819c5d266e916906b089f0b2ea3a80d3a97ae8b72055651e7df7a3afbb2836", + "state": { + "target": 3.4998, + "chapter": 3, + "chapterId": "theatre", + "foreground": "theatre-rim-grass", + "portraitFactor": 1, + "camera": { + "position": [ + -9.06, + 38.42, + -252.76 + ], + "fov": 64.4, + "aspect": 0.462 + } + }, + "stateDigest": "acdd60092dd8ff8c", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0.25, + "screenshot": "images/1-mobile-reverse-0_25.png", + "screenshotDigest": "db3c65d0a27d519e55d3177383a2f5cc04202274ef885a500d00d88bed9ad362", + "state": { + "target": 1.7501, + "chapter": 2, + "chapterId": "stoa", + "foreground": "stoa-curtain", + "portraitFactor": 1, + "camera": { + "position": [ + 2.5, + 13.54, + -73.07 + ], + "fov": 61.79, + "aspect": 0.462 + } + }, + "stateDigest": "3a94a2a7e9d5409e", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--rope", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + }, + { + "direction": "reverse", + "progress": 0, + "screenshot": "images/1-mobile-reverse-0.png", + "screenshotDigest": "383bad29b80360b49b09ae2e7de55ff1d484074ed560134ae9e2ea12b7fecd17", + "state": { + "target": 0, + "chapter": 0, + "chapterId": "harbour", + "foreground": "harbour-rope", + "portraitFactor": 1, + "camera": { + "position": [ + 0, + 2.8, + 96 + ], + "fov": 58, + "aspect": 0.462 + } + }, + "stateDigest": "6c3bd85188814fcd", + "overflow": { + "pass": true, + "viewportWidth": 390, + "documentWidth": 390, + "bodyWidth": 433, + "overflowPixels": 0, + "clippedBodyOverflowPixels": 43, + "scrollingElement": "html", + "rootOverflowX": "hidden", + "bodyOverflowX": "hidden", + "offenders": [ + { + "selector": "#grain", + "left": -195, + "right": 585, + "width": 780 + }, + { + "selector": "div.fg.fg--gate", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--curtain", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--grass", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--awning", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--mist", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--vine", + "left": -11.7, + "right": 401.7, + "width": 413.4 + }, + { + "selector": "div.fg.fg--laurel", + "left": -11.7, + "right": 401.7, + "width": 413.4 + } + ] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "overlayCount": 0, + "protectedCount": 0, + "collisions": [] + } + } + ], + "checks": { + "overflow": { + "pass": true, + "failingFrames": [] + }, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2376 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 47, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "primaryActionFallback": { + "status": 200, + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 38, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "keyboardReachability": { + "pass": true, + "selector": "a[href], button", + "targetCount": 47, + "focusableCount": 61, + "tabsRequired": 1, + "maxTabs": 62, + "key": "Tab", + "engine": "chromium" + }, + "overlayCollision": { + "checked": false, + "pass": true, + "overlaySelector": "[data-cinetrace-overlay]", + "protectedSelector": "[data-cinetrace-protected]", + "failingFrames": [] + }, + "semanticFallback": { + "status": 200, + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2490 + }, + "reverseDrift": { + "checked": true, + "pass": true, + "mismatches": [] + }, + "reducedMotion": { + "checked": true, + "pass": true, + "status": 200, + "mediaQueryMatches": true, + "activeAnimations": [], + "errors": [] + }, + "webglFailure": { + "checked": true, + "metricScope": "engine-specific", + "pass": true, + "status": 200, + "patchActive": true, + "semantics": { + "pass": true, + "selector": "main, body", + "h1Count": 1, + "hasMainLandmark": true, + "meaningfulTextCharacters": 2730 + }, + "primaryAction": { + "pass": true, + "selector": "a[href], button", + "found": true, + "matchCount": 39, + "visible": true, + "enabled": true, + "named": true, + "destination": "#harbour", + "tagName": "a" + }, + "errors": [ + { + "type": "console", + "critical": false, + "message": "THREE.WebGLRenderer: Error creating WebGL context." + }, + { + "type": "console", + "critical": false, + "message": "[odessis] spatial renderer unavailable Error: Error creating WebGL context.\n at new Ua (https://odessis.in/assets/vendor/three.module.min.js:6:320086)\n at boot (https://odessis.in/js/main.js:67:20)\n at https://odessis.in/js/main.js:31:1" + } + ], + "fatalErrors": [] + }, + "pageErrors": { + "pass": true, + "status": 200, + "errors": [] + } + } + } + ], + "controls": { + "checked": false, + "requestedRuns": 1, + "completedRuns": 1, + "pass": null, + "baselineFingerprint": "1273464af6848e6b", + "runs": [ + { + "run": 1, + "fingerprint": "1273464af6848e6b", + "match": true, + "sameBuild": true, + "report": "report.json" + } + ] + } +} diff --git a/package.json b/package.json index bd68282..a51c09b 100644 --- a/package.json +++ b/package.json @@ -8,14 +8,17 @@ "scroll-animation", "visual-regression", "reduced-motion", - "progressive-enhancement" + "progressive-enhancement", + "browser-testing", + "web-animation", + "cli" ], "author": "Evan D'Souza", "repository": { "type": "git", "url": "git+https://github.com/evanpaul90/cinetrace.git" }, - "homepage": "https://github.com/evanpaul90/cinetrace#readme", + "homepage": "https://evanpaul90.github.io/cinetrace/", "bugs": { "url": "https://github.com/evanpaul90/cinetrace/issues" }, @@ -40,7 +43,8 @@ ], "scripts": { "audit": "node ./src/cli.js audit", - "test": "node --test ./test/*.test.js" + "test": "node --test ./test/*.test.js", + "evidence:verify": "node ./scripts/verify-evidence.mjs" }, "dependencies": { "playwright": "^1.58.2" diff --git a/scripts/verify-evidence.mjs b/scripts/verify-evidence.mjs new file mode 100644 index 0000000..0f05927 --- /dev/null +++ b/scripts/verify-evidence.mjs @@ -0,0 +1,55 @@ +import { createHash } from 'node:crypto'; +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import process from 'node:process'; +import assert from 'node:assert/strict'; +import Ajv from 'ajv/dist/2020.js'; +import addFormats from 'ajv-formats'; + +const root = path.resolve(import.meta.dirname, '..'); +const manifestPath = path.join(root, 'evidence', 'SHA256SUMS'); +const manifest = await readFile(manifestPath, 'utf8'); +const rows = manifest.split('\n').filter(Boolean); + +if (rows.length === 0) throw new Error('Evidence manifest is empty'); + +for (const row of rows) { + const match = /^(?[a-f0-9]{64}) (?.+)$/.exec(row); + if (!match) throw new Error(`Malformed evidence manifest row: ${row}`); + const filePath = path.resolve(root, 'evidence', match.groups.file); + if (!filePath.startsWith(`${path.join(root, 'evidence')}${path.sep}`)) { + throw new Error(`Evidence path escapes its directory: ${match.groups.file}`); + } + const content = await readFile(filePath); + const digest = createHash('sha256').update(content).digest('hex'); + if (digest !== match.groups.digest) { + throw new Error(`Evidence digest mismatch: ${match.groups.file}`); + } +} + +const parseJson = async (file) => JSON.parse(await readFile(path.join(root, 'evidence', file), 'utf8')); +const summary = await parseJson('odessis-production-control-2026-09-02.json'); +const baseline = await parseJson('odessis-production-control-run-1-report.json'); +const control = await parseJson('odessis-production-control-run-2-report.json'); +const schema = JSON.parse(await readFile(path.join(root, 'report.schema.json'), 'utf8')); +const ajv = new Ajv({ allErrors: true }); +addFormats(ajv); +const validate = ajv.compile(schema); + +for (const [name, report] of [['baseline', baseline], ['control', control]]) { + if (!validate(report)) throw new Error(`${name} report failed schema validation: ${ajv.errorsText(validate.errors)}`); + assert.deepEqual(report.verdict, { pass: true, defectCount: 0 }); +} + +assert.equal(summary.verdict.pass, true); +assert.equal(summary.verdict.defects, 0); +assert.equal(summary.controls.pass, true); +assert.equal(summary.controls.requested, 2); +assert.equal(summary.controls.completed, 2); +assert.equal(baseline.controls.pass, true); +assert.equal(baseline.controls.completedRuns, 2); +assert.equal(summary.controls.run1Fingerprint, baseline.controls.runs[0].fingerprint); +assert.equal(summary.controls.run2Fingerprint, baseline.controls.runs[1].fingerprint); +assert.equal(control.controls.baselineFingerprint, summary.controls.run2Fingerprint); + +process.stdout.write(`Verified ${rows.length} evidence files, 2 report schemas and matching control fingerprints.\n`); diff --git a/test/public-surface.test.js b/test/public-surface.test.js new file mode 100644 index 0000000..96de9f4 --- /dev/null +++ b/test/public-surface.test.js @@ -0,0 +1,29 @@ +import test from 'node:test'; +import assert from 'node:assert/strict'; +import { access, readFile } from 'node:fs/promises'; +import path from 'node:path'; + +const root = path.resolve(import.meta.dirname, '..'); + +test('public demo and source installation stay bound to the recorded evidence', async () => { + const [html, readme, summary] = await Promise.all([ + readFile(path.join(root, 'docs', 'index.html'), 'utf8'), + readFile(path.join(root, 'README.md'), 'utf8'), + readFile(path.join(root, 'evidence', 'odessis-production-control-2026-09-02.json'), 'utf8').then(JSON.parse), + ]); + + assert.equal(summary.verdict.pass, true); + assert.equal(summary.verdict.defects, 0); + assert.equal(summary.controls.run1Fingerprint, summary.controls.run2Fingerprint); + assert.match(html, new RegExp(summary.controls.run1Fingerprint)); + assert.match(html, /0 defects/i); + assert.match(html, /40 PNG captures/i); + assert.match(readme, /not published today/i); + assert.match(readme, /git clone --depth 1 --branch v0\.3\.0/); + assert.doesNotMatch(readme, /^npx cinetrace audit/m); + + for (const frame of ['frame-0.webp', 'frame-0_25.webp', 'frame-0_5.webp', 'frame-0_75.webp', 'frame-1.webp']) { + assert.match(html, new RegExp(frame.replace('.', '\\.'))); + await access(path.join(root, 'docs', 'assets', frame)); + } +});