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
+[](https://github.com/evanpaul90/cinetrace/actions/workflows/test.yml)
+[](LICENSE)
+[](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.
+[](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.
+
+
+
+
+
+
Forward control / desktop
+
fingerprint 1273464af6848e6b
+
+
+
Harbour road 0%
+
Stoa approach 25%
+
Agora of routes 50%
+
The tholos 75%
+
The summit 100%
+
+ forward 0 → 1 state and pixels sampled reverse 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 state pass
+ Reduced motion pass
+ No-JavaScript semantics pass
+ Forced WebGL failure pass
+ Horizontal overflow pass
+ Page errors pass
+
+
+
+
+
+ Phone-sized browser contexts are not physical-device evidence. Automated checks are not WCAG certification. See the repository for the complete evidence boundaries.
+
+
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));
+ }
+});