Gate: WARN (exit 0)

New since the last forecast

6 new, 0 gone in the unclaimed set since the forecast of 2026-10-19T02:24:07.366Z (sha-83d4ccf), beside the same baseline 17.0.0. By artefact: metrics +2 −0 · startup +4 −0.

artefactscopewhat
metricstime/http_request_duration_seconds_counttime: new series on b: http_request_duration_seconds_count
metricstime/http_requests_totaltime: new series on b: http_requests_total
startupcatalogue/readycatalogue: ready slower on b: median 2490 ms → 5395 ms (+117%), p=0.012, n=5/5
startuplive/readylive: ready slower on b: median 2446 ms → 5439 ms (+122%), p=0.012, n=5/5
startupreader/readyreader: ready slower on b: median 2429 ms → 5462 ms (+125%), p=0.012, n=5/5
startuptime/readytime: ready slower on b: median 2384 ms → 5428 ms (+128%), p=0.012, n=5/5

Causes and the PRs behind them

6 causes, 6 with a PR named, 1 declared in that PR's CHANGELOG line (claimed from it when the release is cut, nothing owed on main). Merged since the forecast of sha-83d4ccf: #500, #501, #502. 2 causes are new since then, and only these PRs can have made them. The others are matched by path: the PRs whose files touch what the cause is about, ranked by the direct ones (the app's own source for a page, a Dockerfile for an image) before the indirect (the shared packages, a manifest). A lead to ask, never a verdict.

causedifferencesPRs
new startup: ready slower on b4#501 (1 file)
not declared: #501's CHANGELOG line says (image-hardening, image-manifest, metrics)
new metrics: new series on b2#500 (1 file), #501 (1 file, 0 direct)
declared by #501 (image-hardening, image-manifest, metrics)
dom: semantic DOM differs (+# −# lines at line #)41#483 (4 files), #500 (4 files), #478 (13 files, 1 direct) and 6 more
focus: keyboard order changed (# stops on a, # on b)41#483 (4 files), #500 (4 files), #478 (13 files, 1 direct) and 6 more
persistence: RPC realtime_claim_live_publish — # row(s) on a, # on b3#478 (13 files, 1 direct), #481 (6 files, 1 direct), #476 (1 file) and 6 more
persistence: RPC realtime_watch — # row(s) on a, # on b1#478 (13 files, 1 direct), #481 (6 files, 1 direct), #476 (1 file) and 6 more

RCS 37 Red: hold, open a 5 Whys, do not re-run hoping for a better number

Claims owed (5, and 1 declared)

1 of the 6 drafts is declared in a PR's CHANGELOG line (#501) and carries that line as the reason: nothing is owed on main, and the release author pastes it when the release is cut. 5 are owed. One draft claim per cause, its scope narrowed and checked against this forecast's unclaimed differences: together they cover all 92, and none takes another cause's. Paste them under claims: in release/claims.yaml and name the Rule that intends each (rule: "????" is refused until you do), or drop rule and give the CHANGELOG entry as the reason, or fix the difference and drop its draft. On a forecast this takes the glance's place; the glance stays for release candidates.

  # dom: semantic DOM differs (+# −# lines at line #): covers its 41 differences. Name the Rule that intends it, or fix it.
  - artefact: "dom"
    scope: "{catalogue:home,live-auth:rule-0589-courses,live-auth:rule-0589-students,live:home,reader-auth:course,reader-auth:rule-0582-course,reader-auth:rule-0582-lab-step,reader-auth:rule-0582-lab-step-2,reader-auth:rule-0582-lab-step-back,reader-auth:rule-0583-profile-menu,reader-auth:rule-0584-notebook-cell-2,reader-auth:rule-0584-quiz-results,reader-auth:rule-0584-talk-slide-2,reader-auth:rule-0585-course-dark,reader-auth:rule-0585-preferences-after-reload,reader-auth:rule-0586-turned-away,reader-auth:rule-0586-turned-away-again,reader-auth:rule-0587-llm,reader-auth:rule-0588-lecturer-locked,reader-auth:rule-0588-student-hidden,reader-auth:rule-0588-student-locked-card,reader-auth:rule-0592-stroke-saved,reader-auth:topic,reader:course,reader:home,reader:lab-step,reader:lab-step-2,reader:search,reader:search-results,reader:topic,reference:course,reference:lab,reference:note,reference:topic,time-auth:rule-0590-calendar-byday,time-auth:rule-0590-calendar-byweek,time-auth:rule-0590-medians,time-auth:rule-0591-lab-bylab,time-auth:rule-0591-lab-bystep,time-auth:rule-0591-learning-records,time-auth:rule-0591-student}"
    rule: "????"
    reason: "semantic DOM differs (+# −# lines at line #): 41 differences (reader, catalogue, live, time; 41 pages); likely #483, #500, #478"
  # focus: keyboard order changed (# stops on a, # on b): covers its 41 differences. Name the Rule that intends it, or fix it.
  - artefact: "focus"
    scope: "{catalogue:home,live-auth:rule-0589-courses,live-auth:rule-0589-students,live:home,reader-auth:course,reader-auth:rule-0582-course,reader-auth:rule-0582-lab-step,reader-auth:rule-0582-lab-step-2,reader-auth:rule-0582-lab-step-back,reader-auth:rule-0583-profile-menu,reader-auth:rule-0584-notebook-cell-2,reader-auth:rule-0584-quiz-results,reader-auth:rule-0584-talk-slide-2,reader-auth:rule-0585-course-dark,reader-auth:rule-0585-preferences-after-reload,reader-auth:rule-0586-turned-away,reader-auth:rule-0586-turned-away-again,reader-auth:rule-0587-llm,reader-auth:rule-0588-lecturer-locked,reader-auth:rule-0588-student-hidden,reader-auth:rule-0588-student-locked-card,reader-auth:rule-0592-stroke-saved,reader-auth:topic,reader:course,reader:home,reader:lab-step,reader:lab-step-2,reader:search,reader:search-results,reader:topic,reference:course,reference:lab,reference:note,reference:topic,time-auth:rule-0590-calendar-byday,time-auth:rule-0590-calendar-byweek,time-auth:rule-0590-medians,time-auth:rule-0591-lab-bylab,time-auth:rule-0591-lab-bystep,time-auth:rule-0591-learning-records,time-auth:rule-0591-student}"
    rule: "????"
    reason: "keyboard order changed (# stops on a, # on b): 41 differences (reader, catalogue, live, time; 41 pages); likely #483, #500, #478"
  # startup: ready slower on b: covers its 4 differences. Name the Rule that intends it, or fix it.
  - artefact: "startup"
    scope: "*/ready"
    rule: "????"
    reason: "ready slower on b: 4 differences (reader, catalogue, live, time; 1 name); likely #501"
  # persistence: RPC realtime_claim_live_publish — # row(s) on a, # on b: covers its 3 differences. Name the Rule that intends it, or fix it.
  - artefact: "persistence"
    scope: "*/realtime_claim_live_publish"
    rule: "????"
    reason: "RPC realtime_claim_live_publish — # row(s) on a, # on b: 3 differences; likely #478, #481, #476"
  # metrics: new series on b: covers its 2 differences. Declared by #501 in its CHANGELOG line: ready to paste when the release is cut.
  - artefact: "metrics"
    scope: "time/http_{request_duration_seconds_count,requests_total}"
    reason: "CHANGELOG: feat(image): declare a HEALTHCHECK and expose request SLIs from start (#501)"
  # persistence: RPC realtime_watch — # row(s) on a, # on b: covers its 1 difference. Name the Rule that intends it, or fix it.
  - artefact: "persistence"
    scope: "rule-0589-live/realtime_watch"
    rule: "????"
    reason: "RPC realtime_watch — # row(s) on a, # on b: 1 difference; likely #478, #481, #476"

weighted mean 37.65 over 6 of 8 dimensions measured (weight 85 of 100, renormalised); the rest are not measured and not counted.

dimensionweightscorefloorwhere it lost points
Claim coverage200−20 unclaimed: dom /: reader:home: semantic DOM differs (+1 −1 lines at line 10)
−20 unclaimed: dom /course/localhost:8080: reader:course: semantic DOM differs (+1 −1 lines at line 9)
−20 unclaimed: dom /topic/localhost:8080/unit-1/topic-01: reader:topic: semantic DOM differs (+1 −1 lines at line 8)
−20 unclaimed: dom /lab/localhost:8080/unit-1/topic-01/book-lab-01: reader:lab-step: semantic DOM differs (+1 −1 lines at line 8)
−20 unclaimed: dom /lab/localhost:8080/unit-1/topic-01/book-lab-01/Step-01: reader:lab-step-2: semantic DOM differs (+1 −1 lines at line 8) (and 87 more like it, not counted again: report.html#differences)
Noise health1540breached−40 the A/A of 2026-10-19T08:10:00.716Z had 1 diff: differences may be noise
−5 mask realtime-rest-fallback-warning fired nothing in this run (a mask that never fires is a mask to delete)
−5 mask chromium-compute-pressure-policy fired nothing in this run (a mask that never fires is a mask to delete)
−5 mask transport-encoding fired nothing in this run (a mask that never fires is a mask to delete)
−5 mask transport-transfer fired nothing in this run (a mask that never fires is a mask to delete)
Statistical margin10100—
Rehearsals10100—
Test signal1540breached−30 mutation score 72.73% on @tutors/i18n, below 80%
−30 mutation score 55.11% on @tutors/ui-navigators, below 80%
Requirements traceability10not measuredneeds the changelog, the EARS files and the claims side by side: pass --traceability <json>; changes.json already reports 12 orphan changes between the tags (a changelog entry with no diff, or a diff with no entry), a floor breach once it is measured
Change risk150−10 PR #476 changed Reader, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−3 PR #478 touches hotspot packages/svelte/connect/src/services/connect.svelte.ts (3 of the last 6 releases)
−10 PR #478 changed Reader, Shared Packages, Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−10 PR #480 changed Shared Packages, Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−10 PR #481 changed Reader, Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−10 PR #483 changed Infrastructure, Reader, Live, Catalogue, Time, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−10 PR #484 changed Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−10 PR #487 changed Reader, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−10 PR #504 changed Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−3 PR #505 touches 4 hotspots packages/svelte/utils/i18n/src/messages/fr.ts (3 of the last 6 releases), packages/svelte/utils/i18n/src/messages/es.ts (3 of the last 6 releases), packages/svelte/utils/i18n/src/messages/de.ts (3 of the last 6 releases) and 1 more
−10 PR #505 changed 11 production lines in packages/svelte/ui-navigators with 2 test lines (0.18): below 0.2
−10 PR #505 changed Reader, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−10 PR #500 changed Reader, Live, Catalogue, Time, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−10 PR #501 changed Infrastructure, Reader, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
−10 PR #502 changed Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
Post-deploy history5not measuredneeds the last release's post-deploy record: pass --post-deploy <its run dir or report.json>

Change risk per PR

Change risk 0 (100 − 136), v17.0.0..8534430cb0681d2f21383b56e7227bfbf35bfd2c: 12 of 14 PRs carry a finding.

PRtitlechurnfileshotspotstests ÷ productionreviewedfirst contributionpointswhere the points went
#505fix(a11y): button names contain their visible text471541.76yes−23−3 PR #505 touches 4 hotspots packages/svelte/utils/i18n/src/messages/fr.ts (3 of the last 6 releases), packages/svelte/utils/i18n/src/messages/es.ts (3 of the last 6 releases), packages/svelte/utils/i18n/src/messages/de.ts (3 of the last 6 releases) and 1 more
−10 PR #505 changed 11 production lines in packages/svelte/ui-navigators with 2 test lines (0.18): below 0.2
−10 PR #505 changed Reader, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#478Route every Realtime channel through a budgeted port13494111.46yes−13−3 PR #478 touches hotspot packages/svelte/connect/src/services/connect.svelte.ts (3 of the last 6 releases)
−10 PR #478 changed Reader, Shared Packages, Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#476Give each whiteboard room a Realtime budget37750no production linesyes−10−10 PR #476 changed Reader, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#480Tutors Time: read only the chosen days of a course's calendar92603.30yes−10−10 PR #480 changed Shared Packages, Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#481Tutors Live: publish from the reader's server within a daily Realtime budget14212303.38yes−10−10 PR #481 changed Reader, Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#483Release 17.0.0 to main and pin production to it424130no production linesyes−10−10 PR #483 changed Infrastructure, Reader, Live, Catalogue, Time, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#484ci(deploy): open the pin pull request when a release tag's images are published24750no production linesyes−10−10 PR #484 changed Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#487fix(community): show an empty catalogue without Supabase instead of logging errors67303.47yes−10−10 PR #487 changed Reader, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#504fix(nightly): make the three red Nightly jobs pass for real357180no production linesyes−10−10 PR #504 changed Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#500fix(deploy): immutable Cache-Control on /_app/immutable/* for Netlify3050no production linesyes−10−10 PR #500 changed Reader, Live, Catalogue, Time, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#501feat(image): declare a HEALTHCHECK and expose request SLIs from start (image-hardening, image-manifest, metrics)2567011.68yes−10−10 PR #501 changed Infrastructure, Reader, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
#502ci(image): attest SLSA v1 build provenance to every published image (build-provenance)20530no production linesyes−10−10 PR #502 changed Infrastructure, Development but no changelog entry under v8534430cb0681d2f21383b56e7227bfbf35bfd2c names it
2 moreno deductions: #485, #49357650

Not measured: orphan entries (a changelog entry with no diff) (CHANGELOG.md at 8534430cb0681d2f21383b56e7227bfbf35bfd2c has no "### v8534430cb0681d2f21383b56e7227bfbf35bfd2c" entries under a product section).

Contributor lines are for trends and glances, never for reviewing people: a first contribution is a fact and costs nothing on its own. Every deduction is in changes.json.

Tutors release harness — release warn

2026-10-19T08:41:29.517Z · clock 2026-09-16T09:05:00.000Z · 5 run(s) per side · harness 1.48.5

92 unclaimed differences, 6 causes

The unclaimed differences folded by kind across apps, pages and packages: a number, a hash or a package name does not make a new cause. Read beside the verdict; it never changes it.

causedifferencesappspagesexample
dom semantic DOM differs (+# −# lines at line #)41reader, catalogue, live, time41
catalogue:home, live-auth:rule-0589-courses, live-auth:rule-0589-students, live:home, reader-auth:course, reader-auth:rule-0582-course and 35 more
reader:home: semantic DOM differs (+1 −1 lines at line 10)
focus keyboard order changed (# stops on a, # on b)41reader, catalogue, live, time41
catalogue:home, live-auth:rule-0589-courses, live-auth:rule-0589-students, live:home, reader-auth:course, reader-auth:rule-0582-course and 35 more
reader:home: keyboard order changed (12 stops on a, 12 on b)
startup ready slower on b
1 name: ready
4reader, catalogue, live, time—catalogue: ready slower on b: median 2490 ms → 5395 ms (+117%), p=0.012, n=5/5
persistence RPC realtime_claim_live_publish — # row(s) on a, # on b3——rule-0589-live: RPC realtime_claim_live_publish — 0 row(s) on a, 4 on b
metrics new series on b
2 names: http_request_duration_seconds_count, http_requests_total
2time—time: new series on b: http_request_duration_seconds_count
persistence RPC realtime_watch — # row(s) on a, # on b1——rule-0589-live: RPC realtime_watch — 0 row(s) on a, 1 on b

Moved together on the same pages, so likely one change each:

The behaviour behind these Rules moved: their journeys' pages or ledgers differ (traffic/journeys/features):

ab
readerquay.io/tutors-sdk/tutors-reader:17.0.0quay.io/tutors-sdk/tutors-reader:sha-8534430
cataloguequay.io/tutors-sdk/tutors-catalogue:17.0.0quay.io/tutors-sdk/tutors-catalogue:sha-8534430
livequay.io/tutors-sdk/tutors-live:17.0.0quay.io/tutors-sdk/tutors-live:sha-8534430
timequay.io/tutors-sdk/tutors-time:17.0.0quay.io/tutors-sdk/tutors-time:sha-8534430
provenancea — pulled+verifiedb — pulled+verified
readerdigest sha256:15e3aa22476d608db97e05917b1990ade0a7871e7ec6e113da5fec741b427233
revision 432d46864626
version 17.0.0-rc.1
digest sha256:89ca1729eb2fdb53522bbe8903109c4b00c8d563bfba20149226fd6812c85a29
revision 8534430cb068
version sha-8534430
cataloguedigest sha256:e9f2764654cb074d7dd4412ca163bf4c2666870444d5520361d5425bda4cec0b
revision 432d46864626
version 17.0.0-rc.1
digest sha256:4eac027a536ceb22e8265d3a7459711189cea1c8d899be64f15c7cf938590f44
revision 8534430cb068
version sha-8534430
livedigest sha256:52740e55cfa7e7db3b2944137caada4e876990b937f1034c0c5e79796054f8a0
revision 432d46864626
version 17.0.0-rc.1
digest sha256:f922989906f59960be3b293604848dbd43ed551596ed090908e2acf448474b20
revision 8534430cb068
version sha-8534430
timedigest sha256:d0a9f4a2f4624038ecea3629d1a536567756d458410bee43b45e060d738d195d
revision 432d46864626
version 17.0.0-rc.1
digest sha256:60b3524d78783f90cba5e3d32b32b74d26e2a4c14373e6426a6018a14d1ae4eb
revision 8534430cb068
version sha-8534430

Image artefacts

Collected from the images, not the running apps. A cell that says NOT COLLECTED was not compared.

appartefactab
readermanifest10 layers, 309.2 MB, USER 1001, ports 3000/tcp (docker image inspect)10 layers, 308.9 MB, USER 1001, ports 3000/tcp (docker image inspect)
readersbom134 distinct package(s) (cosign attestation (signature verified))134 distinct package(s) (cosign attestation (signature verified))
readervulns94 advisories, db built 2026-10-18T06:27:17Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)94 advisories, db built 2026-10-18T06:27:17Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)
cataloguemanifest10 layers, 274.2 MB, USER 1001, ports 3000/tcp (docker image inspect)10 layers, 274.2 MB, USER 1001, ports 3000/tcp (docker image inspect)
cataloguesbom134 distinct package(s) (cosign attestation (signature verified))134 distinct package(s) (cosign attestation (signature verified))
cataloguevulns94 advisories, db built 2026-10-18T06:27:17Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)94 advisories, db built 2026-10-18T06:27:17Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)
livemanifest10 layers, 274.5 MB, USER 1001, ports 3000/tcp (docker image inspect)10 layers, 274.5 MB, USER 1001, ports 3000/tcp (docker image inspect)
livesbom134 distinct package(s) (cosign attestation (signature verified))134 distinct package(s) (cosign attestation (signature verified))
livevulns94 advisories, db built 2026-10-18T06:27:17Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)94 advisories, db built 2026-10-18T06:27:17Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)
timemanifest10 layers, 285.2 MB, USER 1001, ports 3000/tcp (docker image inspect)10 layers, 285.2 MB, USER 1001, ports 3000/tcp (docker image inspect)
timesbom143 distinct package(s) (cosign attestation (signature verified))143 distinct package(s) (cosign attestation (signature verified))
timevulns94 advisories, db built 2026-10-18T06:27:17Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)94 advisories, db built 2026-10-18T06:27:17Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)

Load (k6, 20 req/s for 30s)

siderequestsfailed5xxp50p95
a600001.33 ms2.77 ms
b601001.3 ms2.35 ms

Differences (153; 92 unclaimed)

artefactscopewhat changedclaimed by
domreader:home
/
reader:home: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "My courses":
       - /url: /
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreader:course
/course/localhost:8080
reader:course: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreader:topic
/topic/localhost:8080/unit-1/topic-01
reader:topic: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreader:lab-step
/lab/localhost:8080/unit-1/topic-01/book-lab-01
reader:lab-step: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreader:lab-step-2
/lab/localhost:8080/unit-1/topic-01/book-lab-01/Step-01
reader:lab-step-2: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreader:search
/search/localhost:8080
reader:search: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreader:search-results
/search/localhost:8080?q=reference+material
reader:search-results: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domcatalogue:home
/
catalogue:home: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Catalogue":
       - /url: /
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domlive:home
/
live:home: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Live":
       - /url: /
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domreader-auth:course
/course/localhost:8080
reader-auth:course: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Profile menu":
       - img "Harness Student"
unclaimed
domreader-auth:topic
/topic/localhost:8080/unit-1/topic-01
reader-auth:topic: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Profile menu":
       - img "Harness Student"
unclaimed
domreference:course
/course/reference-course
reference:course: semantic DOM differs (+1 −1 lines at line 10)
detail
     - text: A reference course containing all supported learning objects
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreference:topic
/topic/reference-course/topic-07-reference
reference:topic: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: A reference course containing all supported learning objects
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreference:lab
/lab/reference-course/topic-07-reference/book-a
reference:lab: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: A reference course containing all supported learning objects
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreference:note
/note/reference-course/topic-07-reference/note-1
reference:note: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: A reference course containing all supported learning objects
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Anonymous Tutors Profile"
 - complementary "Course navigation":
unclaimed
domreader-auth:rule-0588-lecturer-locked
/course/localhost:8081
reader-auth:rule-0588-lecturer-locked: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domreader-auth:rule-0588-student-hidden
/course/localhost:8081
reader-auth:rule-0588-student-hidden: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domreader-auth:rule-0588-student-locked-card
/course/localhost:8081
reader-auth:rule-0588-student-locked-card: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domlive-auth:rule-0589-courses
/
live-auth:rule-0589-courses: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Live":
       - /url: /
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domlive-auth:rule-0589-students
/
live-auth:rule-0589-students: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Live":
       - /url: /
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domtime-auth:rule-0590-medians
/harness-rules/medians
time-auth:rule-0590-medians: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Harness Rules Course":
       - /url: /harness-rules
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation "Class activity":
unclaimed
domtime-auth:rule-0590-calendar-byweek
/harness-rules/calendar/byweek
time-auth:rule-0590-calendar-byweek: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Harness Rules Course":
       - /url: /harness-rules
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation "Class activity":
unclaimed
domtime-auth:rule-0590-calendar-byday
/harness-rules/calendar/byday
time-auth:rule-0590-calendar-byday: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Harness Rules Course":
       - /url: /harness-rules
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation "Class activity":
unclaimed
domtime-auth:rule-0591-lab-bylab
/harness-rules/lab/bylab
time-auth:rule-0591-lab-bylab: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Harness Rules Course":
       - /url: /harness-rules
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation "Class activity":
unclaimed
domtime-auth:rule-0591-lab-bystep
/harness-rules/lab/bystep
time-auth:rule-0591-lab-bystep: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Harness Rules Course":
       - /url: /harness-rules
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation "Class activity":
unclaimed
domtime-auth:rule-0591-learning-records
/harness-rules/lab/learning-records
time-auth:rule-0591-learning-records: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Harness Rules Course":
       - /url: /harness-rules
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation "Class activity":
unclaimed
domtime-auth:rule-0591-student
/harness-rules/harness-quiet
time-auth:rule-0591-student: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "Harness Rules Course":
       - /url: /harness-rules
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation "Class activity":
unclaimed
domreader-auth:rule-0582-course
/course/localhost:8080
reader-auth:rule-0582-course: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Profile menu":
       - img "Harness Student"
unclaimed
domreader-auth:rule-0582-lab-step
/lab/localhost:8080/unit-1/topic-01/book-lab-01
reader-auth:rule-0582-lab-step: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Profile menu":
       - img "Harness Student"
unclaimed
domreader-auth:rule-0582-lab-step-2
/lab/localhost:8080/unit-1/topic-01/book-lab-01/Step-01
reader-auth:rule-0582-lab-step-2: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Profile menu":
       - img "Harness Student"
unclaimed
domreader-auth:rule-0582-lab-step-back
/lab/localhost:8080/unit-1/topic-01/book-lab-01/Setup
reader-auth:rule-0582-lab-step-back: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Profile menu":
       - img "Harness Student"
unclaimed
domreader-auth:rule-0583-profile-menu
/course/localhost:8080
reader-auth:rule-0583-profile-menu: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Profile menu" [expanded]:
       - img "Harness Student"
unclaimed
domreader-auth:rule-0584-talk-slide-2
/talk/localhost:8081/unit-1/topic-01/talk-01
reader-auth:rule-0584-talk-slide-2: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domreader-auth:rule-0584-notebook-cell-2
/notebook/localhost:8081/unit-1/topic-01/notebook-01
reader-auth:rule-0584-notebook-cell-2: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domreader-auth:rule-0584-quiz-results
/quiz/localhost:8081/unit-1/topic-01/quiz-01
reader-auth:rule-0584-quiz-results: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domreader-auth:rule-0585-course-dark
/course/localhost:8081
reader-auth:rule-0585-course-dark: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domreader-auth:rule-0585-preferences-after-reload
/course/localhost:8081
reader-auth:rule-0585-preferences-after-reload: semantic DOM differs (+1 −1 lines at line 9)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu" [expanded]: Preferences
+    - button "Preferences" [expanded]
 - complementary "Course navigation":
   - navigation:
unclaimed
domreader-auth:rule-0586-turned-away
/
reader-auth:rule-0586-turned-away: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "My courses":
       - /url: /
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Profile menu":
       - img "Harness Student"
unclaimed
domreader-auth:rule-0586-turned-away-again
/
reader-auth:rule-0586-turned-away-again: semantic DOM differs (+1 −1 lines at line 10)
detail
     - link "My courses":
       - /url: /
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
     - button "Profile menu":
       - img "Harness Student"
unclaimed
domreader-auth:rule-0587-llm
/llm/localhost:8081
reader-auth:rule-0587-llm: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
domreader-auth:rule-0592-stroke-saved
/whiteboard/localhost:8081/unit-1/topic-01/whiteboard-01
reader-auth:rule-0592-stroke-saved: semantic DOM differs (+1 −1 lines at line 8)
detail
     - text: Tutors CI
     - button "Search this course": Search
-    - button "Open Theme Menu": Preferences
+    - button "Preferences"
 - complementary "Course navigation":
   - navigation:
unclaimed
networkPOST /api/live/activity
/course/localhost:8080
reader-auth:course: new request on b: POST /api/live/activityRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: the reader sends each learning event to its own server (POST /api/live/activity) instead of broadcasting it from the browser (#481)
networkPOST /api/live/activity
/topic/localhost:8080/unit-1/topic-01
reader-auth:topic: new request on b: POST /api/live/activityRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: the reader sends each learning event to its own server (POST /api/live/activity) instead of broadcasting it from the browser (#481)
networkGET /_app/immutable/chunks/{{hash}}.js
/course/reference-course
reference:course: GET /_app/immutable/chunks/{{hash}}.js requested 43× on a, 44× on bRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: moving learning events from browser Realtime to the reader's server adds one immutable chunk on reference:course and reference:note (#478, #481)
networkGET /_app/immutable/chunks/{{hash}}.js
/note/reference-course/topic-07-reference/note-1
reference:note: GET /_app/immutable/chunks/{{hash}}.js requested 39× on a, 40× on bRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: moving learning events from browser Realtime to the reader's server adds one immutable chunk on reference:course and reference:note (#478, #481)
networkPOST /api/live/activity
/
live-auth:rule-0589-courses: new request on b: POST /api/live/activityRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: the reader sends each learning event to its own server (POST /api/live/activity) instead of broadcasting it from the browser (#481)
networkPOST /api/live/activity
/course/localhost:8080
reader-auth:rule-0582-course: new request on b: POST /api/live/activityRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: the reader sends each learning event to its own server (POST /api/live/activity) instead of broadcasting it from the browser (#481)
networkPOST /api/live/activity
/lab/localhost:8080/unit-1/topic-01/book-lab-01
reader-auth:rule-0582-lab-step: new request on b: POST /api/live/activityRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: the reader sends each learning event to its own server (POST /api/live/activity) instead of broadcasting it from the browser (#481)
networkPOST /api/live/activity
/lab/localhost:8080/unit-1/topic-01/book-lab-01/Step-01
reader-auth:rule-0582-lab-step-2: new request on b: POST /api/live/activityRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: the reader sends each learning event to its own server (POST /api/live/activity) instead of broadcasting it from the browser (#481)
networkPOST /api/live/activity
/lab/localhost:8080/unit-1/topic-01/book-lab-01/Setup
reader-auth:rule-0582-lab-step-back: new request on b: POST /api/live/activityRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: the reader sends each learning event to its own server (POST /api/live/activity) instead of broadcasting it from the browser (#481)
networkPOST /api/live/activity
/course/localhost:8080
reader-auth:rule-0583-profile-menu: new request on b: POST /api/live/activityRule 0330: When a student opens a learning object, the reader shall send the learning event to the reader's server without publishing it over Realtime from the browser. — Rule 0330: the reader sends each learning event to its own server (POST /api/live/activity) instead of broadcasting it from the browser (#481)
consolecatalogue:home
/
catalogue:home: console message gone on b
detail
error: {"app":"tutors-catalogue","environment":"production","error":"Cannot read properties of undefined (reading 'from')","stack":"TypeError: Cannot read properties of undefined (reading 'from')\n    at Object.getCatalogue ({{origin}}/_app/immutable/chunks/2lYorbfj.js:69:102918)\n    at V ({{origin}}/_app/immutable/nodes/2.NAkx_ofm.js:1:484)\n    at Wn ({{origin}}/_app/immutable/chunks/XgCIYxIE.js:2:24206)","timestamp":"2026-09-16T09:05:00.000Z","level":"error","message":"Error fetching courses:"}
informational
consolecatalogue:home
/
catalogue:home: console message gone on b
detail
error: {"app":"tutors-catalogue","environment":"production","error":"Cannot read properties of undefined (reading 'from')","stack":"TypeError: Cannot read properties of undefined (reading 'from')\n    at Object.getStudentCount ({{origin}}/_app/immutable/chunks/2lYorbfj.js:69:103346)\n    at {{origin}}/_app/immutable/nodes/2.NAkx_ofm.js:1:5193\n    at Cr ({{origin}}/_app/immutable/chunks/Cv2zGAZD.js:1:23871)\n    at {{origin}}/_app/immutable/chunks/Cv2zGAZD.js:2:2704\n    at mr ({{origin}}/_app/immutable/chunks/Cv2zGAZD.js:1:21611)\n    at vr ({{origin}}/_app/immutable/chunks/Cv2zGAZD.js:1:22749)\n    at Xt ({{origin}}/_app/immutable/chunks/Cv2zGAZD.js:1:12091)\n    at #_ ({{origin}}/_app/immutable/chunks/Cv2zGAZD.js:1:9277)\n    at e.flush ({{origin}}/_app/immutable/chunks/Cv2zGAZD.js:1:10794)\n    at Array.<anonymous> ({{origin}}/_app/immutable/chunks/Cv2zGAZD.js:1:11554)","timestamp":"2026-09-16T09:05:00.000Z","level":"error","message":"Error fetching course count:"}
informational
metricstime/http_request_duration_seconds_counttime: new series on b: http_request_duration_seconds_countunclaimed
metricstime/http_requests_totaltime: new series on b: http_requests_totalunclaimed
focusreader:home
/
reader:home: keyboard order changed (12 stops on a, 12 on b)
detail
 a "My courses"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreader:course
/course/localhost:8080
reader:course: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreader:topic
/topic/localhost:8080/unit-1/topic-01
reader:topic: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreader:lab-step
/lab/localhost:8080/unit-1/topic-01/book-lab-01
reader:lab-step: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreader:lab-step-2
/lab/localhost:8080/unit-1/topic-01/book-lab-01/Step-01
reader:lab-step-2: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreader:search
/search/localhost:8080
reader:search: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreader:search-results
/search/localhost:8080?q=reference+material
reader:search-results: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focuscatalogue:home
/
catalogue:home: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Catalogue"
-button "Open Theme Menu"
+button "Preferences"
 a "My courses"
unclaimed
focuslive:home
/
live:home: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Live"
-button "Open Theme Menu"
+button "Preferences"
 a "My courses"
unclaimed
focusreader-auth:course
/course/localhost:8080
reader-auth:course: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Profile menu"
unclaimed
focusreader-auth:topic
/topic/localhost:8080/unit-1/topic-01
reader-auth:topic: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Profile menu"
unclaimed
focusreference:course
/course/reference-course
reference:course: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreference:topic
/topic/reference-course/topic-07-reference
reference:topic: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreference:lab
/lab/reference-course/topic-07-reference/book-a
reference:lab: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreference:note
/note/reference-course/topic-07-reference/note-1
reference:note: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Anonymous Tutors Profile"
unclaimed
focusreader-auth:rule-0588-lecturer-locked
/course/localhost:8081
reader-auth:rule-0588-lecturer-locked: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 a "Course home"
unclaimed
focusreader-auth:rule-0588-student-hidden
/course/localhost:8081
reader-auth:rule-0588-student-hidden: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 a "Course home"
unclaimed
focusreader-auth:rule-0588-student-locked-card
/course/localhost:8081
reader-auth:rule-0588-student-locked-card: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 a "Course home"
unclaimed
focuslive-auth:rule-0589-courses
/
live-auth:rule-0589-courses: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Live"
-button "Open Theme Menu"
+button "Preferences"
 a "My courses"
unclaimed
focuslive-auth:rule-0589-students
/
live-auth:rule-0589-students: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Live"
-button "Open Theme Menu"
+button "Preferences"
 a "My courses"
unclaimed
focustime-auth:rule-0590-medians
/harness-rules/medians
time-auth:rule-0590-medians: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Harness Rules Course"
-button "Open Theme Menu"
+button "Preferences"
 a "Medians"
unclaimed
focustime-auth:rule-0590-calendar-byweek
/harness-rules/calendar/byweek
time-auth:rule-0590-calendar-byweek: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Harness Rules Course"
-button "Open Theme Menu"
+button "Preferences"
 a "Medians"
unclaimed
focustime-auth:rule-0590-calendar-byday
/harness-rules/calendar/byday
time-auth:rule-0590-calendar-byday: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Harness Rules Course"
-button "Open Theme Menu"
+button "Preferences"
 a "Medians"
unclaimed
focustime-auth:rule-0591-lab-bylab
/harness-rules/lab/bylab
time-auth:rule-0591-lab-bylab: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Harness Rules Course"
-button "Open Theme Menu"
+button "Preferences"
 a "Medians"
unclaimed
focustime-auth:rule-0591-lab-bystep
/harness-rules/lab/bystep
time-auth:rule-0591-lab-bystep: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Harness Rules Course"
-button "Open Theme Menu"
+button "Preferences"
 a "Medians"
unclaimed
focustime-auth:rule-0591-learning-records
/harness-rules/lab/learning-records
time-auth:rule-0591-learning-records: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Harness Rules Course"
-button "Open Theme Menu"
+button "Preferences"
 a "Medians"
unclaimed
focustime-auth:rule-0591-student
/harness-rules/harness-quiet
time-auth:rule-0591-student: keyboard order changed (12 stops on a, 12 on b)
detail
 a "Harness Rules Course"
-button "Open Theme Menu"
+button "Preferences"
 a "Medians"
unclaimed
focusreader-auth:rule-0582-course
/course/localhost:8080
reader-auth:rule-0582-course: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Profile menu"
unclaimed
focusreader-auth:rule-0582-lab-step
/lab/localhost:8080/unit-1/topic-01/book-lab-01
reader-auth:rule-0582-lab-step: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Profile menu"
unclaimed
focusreader-auth:rule-0582-lab-step-2
/lab/localhost:8080/unit-1/topic-01/book-lab-01/Step-01
reader-auth:rule-0582-lab-step-2: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Profile menu"
unclaimed
focusreader-auth:rule-0582-lab-step-back
/lab/localhost:8080/unit-1/topic-01/book-lab-01/Setup
reader-auth:rule-0582-lab-step-back: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Profile menu"
unclaimed
focusreader-auth:rule-0583-profile-menu
/course/localhost:8080
reader-auth:rule-0583-profile-menu: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 button "Profile menu"
unclaimed
focusreader-auth:rule-0584-talk-slide-2
/talk/localhost:8081/unit-1/topic-01/talk-01
reader-auth:rule-0584-talk-slide-2: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 a "← Topic 1"
unclaimed
focusreader-auth:rule-0584-notebook-cell-2
/notebook/localhost:8081/unit-1/topic-01/notebook-01
reader-auth:rule-0584-notebook-cell-2: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 summary "Notebook 1 Notebook"
unclaimed
focusreader-auth:rule-0584-quiz-results
/quiz/localhost:8081/unit-1/topic-01/quiz-01
reader-auth:rule-0584-quiz-results: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 a "← Topic 1"
unclaimed
focusreader-auth:rule-0585-course-dark
/course/localhost:8081
reader-auth:rule-0585-course-dark: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 a "Course home"
unclaimed
focusreader-auth:rule-0585-preferences-after-reload
/course/localhost:8081
reader-auth:rule-0585-preferences-after-reload: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 a "Course home"
unclaimed
focusreader-auth:rule-0586-turned-away
/
reader-auth:rule-0586-turned-away: keyboard order changed (12 stops on a, 12 on b)
detail
 a "My courses"
-button "Open Theme Menu"
+button "Preferences"
 button "Profile menu"
unclaimed
focusreader-auth:rule-0586-turned-away-again
/
reader-auth:rule-0586-turned-away-again: keyboard order changed (12 stops on a, 12 on b)
detail
 a "My courses"
-button "Open Theme Menu"
+button "Preferences"
 button "Profile menu"
unclaimed
focusreader-auth:rule-0587-llm
/llm/localhost:8081
reader-auth:rule-0587-llm: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 a "Course home"
unclaimed
focusreader-auth:rule-0592-stroke-saved
/whiteboard/localhost:8081/unit-1/topic-01/whiteboard-01
reader-auth:rule-0592-stroke-saved: keyboard order changed (12 stops on a, 12 on b)
detail
 button "Search this course"
-button "Open Theme Menu"
+button "Preferences"
 a "← Topic 1"
unclaimed
persistencestudent-signs-in/realtime_claim_live_publishstudent-signs-in: RPC realtime_claim_live_publish — 0 row(s) on a, 2 on bRule 0331: When the reader's server receives a learning event, the reader shall publish it only to the activity feeds a live dashboard has watched in the last 90 seconds. — Rule 0331: the reader's server claims the topics to publish to, and charges the day's Live budget, through realtime_claim_live_publish (#481)
persistencerule-0589-live/realtime_claim_live_publishrule-0589-live: RPC realtime_claim_live_publish — 0 row(s) on a, 4 on bunclaimed
persistencerule-0589-live/realtime_watchrule-0589-live: RPC realtime_watch — 0 row(s) on a, 1 on bunclaimed
persistencerule-0582-signed-in-lab/realtime_claim_live_publishrule-0582-signed-in-lab: RPC realtime_claim_live_publish — 0 row(s) on a, 5 on bunclaimed
persistencerule-0583-presence/realtime_claim_live_publishrule-0583-presence: RPC realtime_claim_live_publish — 0 row(s) on a, 2 on bunclaimed
realtimereader-auth:rule-0592-stroke-saved/websocket
/whiteboard/localhost:8081/unit-1/topic-01/whiteboard-01
reader-auth:rule-0592-stroke-saved: a reader page opened a Realtime websocket on b (1 socket(s), 5 data frame(s) sent); readers must be publish-only (production too)informing (reported, never gates)
realtimereader-auth/messagesreader-auth: Realtime messages per reader page view fell: a 1.09 / b 0.23 per reader page (broadcasts a 18 / b 0, socket data frames a 6 / b 5, over 22 page view(s))informational
runtimeruntime/summarycontainer posture collected for catalogue, live, reader, reader-auth, time on both sides (compose)
detail
catalogue: a — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
           b — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
live: a — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
      b — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
reader: a — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
        b — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
reader-auth: a — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
             b — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
time: a — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
      b — uid 1001:0, caps none, root fs ro, /tmp rw, no-new-privileges, seccomp filter
informational
startupcatalogue/readycatalogue: ready slower on b: median 2490 ms → 5395 ms (+117%), p=0.012, n=5/5unclaimed
startuplive/readylive: ready slower on b: median 2446 ms → 5439 ms (+122%), p=0.012, n=5/5unclaimed
startupreader/readyreader: ready slower on b: median 2429 ms → 5462 ms (+125%), p=0.012, n=5/5unclaimed
startuptime/readytime: ready slower on b: median 2384 ms → 5428 ms (+128%), p=0.012, n=5/5unclaimed
startupstartup/summarystartup time collected on both sides (compose, 5 restart(s) per app)
detail
catalogue: first healthy / 586 → 513 ms, ready 2490 → 5395 ms (median, a → b, n=5/5)
live: first healthy / 515 → 509 ms, ready 2446 → 5439 ms (median, a → b, n=5/5)
reader: first healthy / 661 → 797 ms, ready 2429 → 5462 ms (median, a → b, n=5/5)
time: first healthy / 570 → 563 ms, ready 2384 → 5428 ms (median, a → b, n=5/5)
informational
image-hardeningreader/summaryreader: image-hardening holds on b: USER 1001, HEALTHCHECK CMD node -e fetch('http://127.0.0.1:' + (process.env.PORT || 3000) + '/healthz/live').then((r) => process.exit(r.ok ? 0 : 1), () => process.exit(1)), 0 secret-looking environment variable(s), 0 in the layer historyinformational
image-hardeningcatalogue/summarycatalogue: image-hardening holds on b: USER 1001, HEALTHCHECK CMD node -e fetch('http://127.0.0.1:' + (process.env.PORT || 3000) + '/healthz/live').then((r) => process.exit(r.ok ? 0 : 1), () => process.exit(1)), 0 secret-looking environment variable(s), 0 in the layer historyinformational
image-hardeninglive/summarylive: image-hardening holds on b: USER 1001, HEALTHCHECK CMD node -e fetch('http://127.0.0.1:' + (process.env.PORT || 3000) + '/healthz/live').then((r) => process.exit(r.ok ? 0 : 1), () => process.exit(1)), 0 secret-looking environment variable(s), 0 in the layer historyinformational
image-hardeningtime/summarytime: image-hardening holds on b: USER 1001, HEALTHCHECK CMD node -e fetch('http://127.0.0.1:' + (process.env.PORT || 3000) + '/healthz/live').then((r) => process.exit(r.ok ? 0 : 1), () => process.exit(1)), 0 secret-looking environment variable(s), 0 in the layer historyinformational
build-provenancereader/summaryreader: build-provenance holds on b: SLSA provenance v1 by .github/workflows/image-build.yml@refs/heads/maininformational
build-provenancecatalogue/summarycatalogue: build-provenance holds on b: SLSA provenance v1 by .github/workflows/image-build.yml@refs/heads/maininformational
build-provenancelive/summarylive: build-provenance holds on b: SLSA provenance v1 by .github/workflows/image-build.yml@refs/heads/maininformational
build-provenancetime/summarytime: build-provenance holds on b: SLSA provenance v1 by .github/workflows/image-build.yml@refs/heads/maininformational
vuln-ceilingreader/summaryreader: vuln-ceiling holds on b: 94 advisories scanned, 20 critical or high, none with a fix availableinformational
vuln-ceilingcatalogue/summarycatalogue: vuln-ceiling holds on b: 94 advisories scanned, 20 critical or high, none with a fix availableinformational
vuln-ceilinglive/summarylive: vuln-ceiling holds on b: 94 advisories scanned, 20 critical or high, none with a fix availableinformational
vuln-ceilingtime/summarytime: vuln-ceiling holds on b: 94 advisories scanned, 20 critical or high, none with a fix availableinformational
asset-graphreaderreader: the asset graph changed: 173 → 173 immutable requests (JS 142 → 142, CSS 31 → 31), 1.6 MB → 1.6 MB; 0 network and 0 headers difference(s) are this churninforming (reported, never gates)
asset-graphcataloguecatalogue: the asset graph changed: 19 → 19 immutable requests (JS 15 → 15, CSS 4 → 4), 529 KB → 530 KB; 0 network and 0 headers difference(s) are this churninforming (reported, never gates)
asset-graphlivelive: the asset graph changed: 24 → 24 immutable requests (JS 19 → 19, CSS 5 → 5), 540 KB → 541 KB; 0 network and 0 headers difference(s) are this churninforming (reported, never gates)
asset-graphreader-authreader-auth: the asset graph changed: 1160 → 1160 immutable requests (JS 987 → 987, CSS 173 → 173), 12.7 MB → 12.7 MB; 0 network and 0 headers difference(s) are this churninforming (reported, never gates)
asset-graphreferencereference: the asset graph changed: 121 → 123 immutable requests (JS 99 → 101, CSS 22 → 22), 1.2 MB → 1.2 MB; 2 network and 0 headers difference(s) are this churninforming (reported, never gates)
asset-graphlive-authlive-auth: the asset graph changed: 179 → 179 immutable requests (JS 149 → 149, CSS 30 → 30), 2.1 MB → 2.1 MB; 0 network and 0 headers difference(s) are this churninforming (reported, never gates)
asset-graphtime-authtime-auth: the asset graph changed: 269 → 269 immutable requests (JS 235 → 235, CSS 34 → 34), 5.1 MB → 5.1 MB; 0 network and 0 headers difference(s) are this churninforming (reported, never gates)
replayreplay:talk-01 GET /_app/immutable/assets/1.{{hash}}.css
/talk/localhost:8080/unit-1/topic-01/talk-01
replay:talk-01: GET /_app/immutable/assets/1.{{hash}}.css requested 1× on a, 2× on binforming (reported, never gates)
replayreplay:talk-01 GET /_app/immutable/chunks/{{hash}}.js
/talk/localhost:8080/unit-1/topic-01/talk-01
replay:talk-01: GET /_app/immutable/chunks/{{hash}}.js requested 36× on a, 40× on binforming (reported, never gates)
replayreplay:talk-01 GET /_app/immutable/nodes/1.{{hash}}.js
/talk/localhost:8080/unit-1/topic-01/talk-01
replay:talk-01: GET /_app/immutable/nodes/1.{{hash}}.js requested 1× on a, 2× on binforming (reported, never gates)
replayreplay:talk-01 GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100
/talk/localhost:8080/unit-1/topic-01/talk-01
replay:talk-01: new request on b: GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100informing (reported, never gates)
replayreplay:note-01 GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100
/note/localhost:8080/unit-1/topic-01/note-01
replay:note-01: request no longer made on b: GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100informing (reported, never gates)
replayreplay:note-01 GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100
/note/localhost:8080/unit-1/topic-01/note-01
replay:note-01: new request on b: GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100informing (reported, never gates)
replayreplay:note-02 GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100
/note/localhost:8080/unit-1/topic-02/note-02
replay:note-02: request no longer made on b: GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100informing (reported, never gates)
replayreplay:note-02 GET {{course}}/tutors.json
/note/localhost:8080/unit-1/topic-02/note-02
replay:note-02: new request on b: GET {{course}}/tutors.jsoninforming (reported, never gates)
replayreplay:note-02 GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100
/note/localhost:8080/unit-1/topic-02/note-02
replay:note-02: new request on b: GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100informing (reported, never gates)
replayreplay:lab-02-step-03 GET /_app/immutable/assets/1.{{hash}}.css
/lab/localhost:8080/unit-1/topic-02/book-lab-01/Step-03
replay:lab-02-step-03: GET /_app/immutable/assets/1.{{hash}}.css requested 2× on a, 1× on binforming (reported, never gates)
replayreplay:lab-02-step-03 GET /_app/immutable/chunks/{{hash}}.js
/lab/localhost:8080/unit-1/topic-02/book-lab-01/Step-03
replay:lab-02-step-03: GET /_app/immutable/chunks/{{hash}}.js requested 39× on a, 38× on binforming (reported, never gates)
replayreplay:lab-02-step-03 GET /_app/immutable/nodes/1.{{hash}}.js
/lab/localhost:8080/unit-1/topic-02/book-lab-01/Step-03
replay:lab-02-step-03: GET /_app/immutable/nodes/1.{{hash}}.js requested 2× on a, 1× on binforming (reported, never gates)
replayreplay:lab-02-step-03 GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100
/lab/localhost:8080/unit-1/topic-02/book-lab-01/Step-03
replay:lab-02-step-03: request no longer made on b: GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100informing (reported, never gates)
sloreader-availabilityreader-availability: 100.0% of 62 reader requests not 5xx on b (its /metrics across the journeys), objective 99.90% (harness floor; monorepo 99.50%): holdsinformational
sloreader-availability/loadreader-availability: 100.0% of 601 reader requests not 5xx on b (the k6 load leg), objective 99.90% (harness floor; monorepo 99.50%): holdsinformational
sloreader-latencyreader-latency: 100.0% of 62 reader requests under 1s on b (its /metrics across the journeys), objective 99.0% (harness floor; monorepo 95.0%): holdsinformational
sloreader-latency/loadreader-latency: 100.0% of 601 reader requests under 1s on b (the k6 load leg), objective 99.0% (harness floor; monorepo 95.0%): holdsinformational
slocatalogue-availability/not-evaluatedcatalogue-availability: not evaluated on b: 5 request(s) from its /metrics across the journeys, fewer than 20informational
slocatalogue-latency/not-evaluatedcatalogue-latency: not evaluated on b: 5 request(s) from its /metrics across the journeys, fewer than 20informational
slolive-availability/not-evaluatedlive-availability: not evaluated on b: 5 request(s) from its /metrics across the journeys, fewer than 20informational
slolive-latency/not-evaluatedlive-latency: not evaluated on b: 5 request(s) from its /metrics across the journeys, fewer than 20informational
slotime-availability/not-evaluatedtime-availability: not evaluated on b: 0 request(s) from its /metrics across the journeys, fewer than 20informational
slotime-latency/not-evaluatedtime-latency: not evaluated on b: 0 request(s) from its /metrics across the journeys, fewer than 20informational
sloreader-latency-tailreader-latency-tail: 100.0% of 62 reader requests under 2.5s on b (its /metrics across the journeys), objective 99.0%: holdsinformational
sloreader-latency-tail/loadreader-latency-tail: 100.0% of 601 reader requests under 2.5s on b (the k6 load leg), objective 99.0%: holdsinformational

Policy: what b must be informing

Checks on the candidate alone, whatever production is: image hardening (root user, no healthcheck, a secret in the environment or the layer history), build provenance (SLSA provenance from image-build.yml) and the vulnerability ceiling (a critical or high advisory with a fix available). Informing: reported, never gates; a claim can still cover a finding. Hover a cell for what was checked.

appimage-hardeningbuild-provenancevuln-ceiling
readerholdsholdsholds
catalogueholdsholdsholds
liveholdsholdsholds
timeholdsholdsholds

Informing (21; 21 unclaimed) reported, never gates

18 of 27 engines are blocking; informing (reported, never gates): timing (no date set to block; load/errors still blocks), image-hardening (no date set to block), build-provenance (no date set to block), vuln-ceiling (no date set to block), timing-tolerance (no date set to block), asset-graph (no date set to block), replay (no date set to block), slo (no date set to block), realtime (no date set to block). An informing engine's findings are listed here and never change the verdict, the Gate or the exit code; a claim can still cover one.

enginescopewhat it foundlevelclaimed by
realtimereader-auth:rule-0592-stroke-saved/websocketreader-auth:rule-0592-stroke-saved: a reader page opened a Realtime websocket on b (1 socket(s), 5 data frame(s) sent); readers must be publish-only (production too)no date setunclaimed
asset-graphreaderreader: the asset graph changed: 173 → 173 immutable requests (JS 142 → 142, CSS 31 → 31), 1.6 MB → 1.6 MB; 0 network and 0 headers difference(s) are this churnno date setunclaimed
asset-graphcataloguecatalogue: the asset graph changed: 19 → 19 immutable requests (JS 15 → 15, CSS 4 → 4), 529 KB → 530 KB; 0 network and 0 headers difference(s) are this churnno date setunclaimed
asset-graphlivelive: the asset graph changed: 24 → 24 immutable requests (JS 19 → 19, CSS 5 → 5), 540 KB → 541 KB; 0 network and 0 headers difference(s) are this churnno date setunclaimed
asset-graphreader-authreader-auth: the asset graph changed: 1160 → 1160 immutable requests (JS 987 → 987, CSS 173 → 173), 12.7 MB → 12.7 MB; 0 network and 0 headers difference(s) are this churnno date setunclaimed
asset-graphreferencereference: the asset graph changed: 121 → 123 immutable requests (JS 99 → 101, CSS 22 → 22), 1.2 MB → 1.2 MB; 2 network and 0 headers difference(s) are this churnno date setunclaimed
asset-graphlive-authlive-auth: the asset graph changed: 179 → 179 immutable requests (JS 149 → 149, CSS 30 → 30), 2.1 MB → 2.1 MB; 0 network and 0 headers difference(s) are this churnno date setunclaimed
asset-graphtime-authtime-auth: the asset graph changed: 269 → 269 immutable requests (JS 235 → 235, CSS 34 → 34), 5.1 MB → 5.1 MB; 0 network and 0 headers difference(s) are this churnno date setunclaimed
replayreplay:talk-01 GET /_app/immutable/assets/1.{{hash}}.cssreplay:talk-01: GET /_app/immutable/assets/1.{{hash}}.css requested 1× on a, 2× on bno date setunclaimed
replayreplay:talk-01 GET /_app/immutable/chunks/{{hash}}.jsreplay:talk-01: GET /_app/immutable/chunks/{{hash}}.js requested 36× on a, 40× on bno date setunclaimed
replayreplay:talk-01 GET /_app/immutable/nodes/1.{{hash}}.jsreplay:talk-01: GET /_app/immutable/nodes/1.{{hash}}.js requested 1× on a, 2× on bno date setunclaimed
replayreplay:talk-01 GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100replay:talk-01: new request on b: GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100no date setunclaimed
replayreplay:note-01 GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100replay:note-01: request no longer made on b: GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100no date setunclaimed
replayreplay:note-01 GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100replay:note-01: new request on b: GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100no date setunclaimed
replayreplay:note-02 GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100replay:note-02: request no longer made on b: GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100no date setunclaimed
replayreplay:note-02 GET {{course}}/tutors.jsonreplay:note-02: new request on b: GET {{course}}/tutors.jsonno date setunclaimed
replayreplay:note-02 GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100replay:note-02: new request on b: GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100no date setunclaimed
replayreplay:lab-02-step-03 GET /_app/immutable/assets/1.{{hash}}.cssreplay:lab-02-step-03: GET /_app/immutable/assets/1.{{hash}}.css requested 2× on a, 1× on bno date setunclaimed
replayreplay:lab-02-step-03 GET /_app/immutable/chunks/{{hash}}.jsreplay:lab-02-step-03: GET /_app/immutable/chunks/{{hash}}.js requested 39× on a, 38× on bno date setunclaimed
replayreplay:lab-02-step-03 GET /_app/immutable/nodes/1.{{hash}}.jsreplay:lab-02-step-03: GET /_app/immutable/nodes/1.{{hash}}.js requested 2× on a, 1× on bno date setunclaimed
replayreplay:lab-02-step-03 GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100replay:lab-02-step-03: request no longer made on b: GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100no date setunclaimed

Claim hygiene

3 claim(s) cover 11 failing hunk(s): 3.67 per claim, at most 8 under one (flagged above 10).

Masks

Fired: response-date×272, request-id×272, etag×272, metrics-process×602, metrics-timing-histograms×22, third-party-requests×6771, persistence-stub-requests×2480, oauth-callback-state×110, media-range-status×47, hashed-assets×20131, footer-tutors-version×836, transport-length×272, transport-connection×272, transport-keepalive×272.
Silent this run: realtime-rest-fallback-warning, chromium-compute-pressure-policy, transport-encoding, transport-transfer — a mask that never fires is a mask to delete.