Gate: WARN (exit 0)
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.
| artefact | scope | what |
|---|---|---|
metrics | time/http_request_duration_seconds_count | time: new series on b: http_request_duration_seconds_count |
metrics | time/http_requests_total | time: new series on b: http_requests_total |
startup | catalogue/ready | catalogue: ready slower on b: median 2490 ms → 5395 ms (+117%), p=0.012, n=5/5 |
startup | live/ready | live: ready slower on b: median 2446 ms → 5439 ms (+122%), p=0.012, n=5/5 |
startup | reader/ready | reader: ready slower on b: median 2429 ms → 5462 ms (+125%), p=0.012, n=5/5 |
startup | time/ready | time: ready slower on b: median 2384 ms → 5428 ms (+128%), p=0.012, n=5/5 |
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.
| cause | differences | PRs |
|---|---|---|
| new startup: ready slower on b | 4 | #501 (1 file) not declared: #501's CHANGELOG line says (image-hardening, image-manifest, metrics) |
| new metrics: new series on b | 2 | #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 b | 3 | #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 b | 1 | #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
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.
Change risk 0 (100 − 136), v17.0.0..8534430cb0681d2f21383b56e7227bfbf35bfd2c: 12 of 14 PRs carry a finding.
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.
release warn2026-10-19T08:41:29.517Z · clock 2026-09-16T09:05:00.000Z · 5 run(s) per side · harness 1.48.5
dom replay:talk-01: replay:talk-01: semantic DOM differs (+65 −0 lines at line 1)dom replay:note-01: replay:note-01: semantic DOM differs (+62 −0 lines at line 1)dom replay:note-02: replay:note-02: semantic DOM differs (+62 −0 lines at line 1)network GET {{course}}/tutors.json: replay:talk-01: GET {{course}}/tutors.json requested 1× on a, 2× on a2network GET /_app/immutable/assets/1.{{hash}}.css: replay:talk-01: GET /_app/immutable/assets/1.{{hash}}.css requested 1× on a, 2× on a2network GET /_app/immutable/chunks/{{hash}}.js: replay:talk-01: GET /_app/immutable/chunks/{{hash}}.js requested 36× on a, 40× on a2network GET /_app/immutable/nodes/1.{{hash}}.js: replay:talk-01: GET /_app/immutable/nodes/1.{{hash}}.js requested 1× on a, 2× on a2network GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100: replay:talk-01: new request on a2: GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100network GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100: replay:note-01: new request on a2: GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100network GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100: replay:note-02: new request on a2: GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100The 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.
| cause | differences | apps | pages | example |
|---|---|---|---|---|
dom semantic DOM differs (+# −# lines at line #) | 41 | reader, catalogue, live, time | 41catalogue: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) | 41 | reader, catalogue, live, time | 41catalogue: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 b1 name: ready | 4 | reader, 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 b | 3 | — | — | rule-0589-live: RPC realtime_claim_live_publish — 0 row(s) on a, 4 on b |
metrics new series on b2 names: http_request_duration_seconds_count, http_requests_total | 2 | time | — | time: new series on b: http_request_duration_seconds_count |
persistence RPC realtime_watch — # row(s) on a, # on b | 1 | — | — | 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:
dom, focus on 41 pages (82 differences): catalogue:home, live-auth:rule-0589-courses, live-auth:rule-0589-students, live:home, reader-auth:course, reader-auth:rule-0582-course and 35 moreThe behaviour behind these Rules moved: their journeys' pages or ledgers differ (traffic/journeys/features):
rule-0582-signed-in-lab: Rule 0582 (exercises 0011, 0250, 0252, 0260, 0303, 0330): 9 differences in dom, focus, persistencerule-0591-time-labs: Rule 0591 (exercises 0319): 8 differences in dom, focusrule-0584-quiz-notebook-talk: Rule 0584 (exercises 0047, 0049, 0050): 6 differences in dom, focusrule-0588-content-lock: Rule 0588 (exercises 0052, 0053, 0054): 6 differences in dom, focusrule-0589-live: Rule 0589 (exercises 0330, 0335): 6 differences in dom, focus, persistencerule-0590-time-calendar: Rule 0590 (exercises 0319): 6 differences in dom, focusrule-0585-preferences: Rule 0585 (exercises 0037, 0038, 0039): 4 differences in dom, focusrule-0586-private-course: Rule 0586 (exercises 0011, 0267): 4 differences in dom, focusrule-0583-presence: Rule 0583 (exercises 0046, 0064, 0280): 3 differences in dom, focus, persistencerule-0587-calendar-llm: Rule 0587 (exercises 0042, 0284): 2 differences in dom, focusrule-0592-whiteboard: Rule 0592 (exercises 0275, 0276): 2 differences in dom, focus| a | b | |
|---|---|---|
| reader | quay.io/tutors-sdk/tutors-reader:17.0.0 | quay.io/tutors-sdk/tutors-reader:sha-8534430 |
| catalogue | quay.io/tutors-sdk/tutors-catalogue:17.0.0 | quay.io/tutors-sdk/tutors-catalogue:sha-8534430 |
| live | quay.io/tutors-sdk/tutors-live:17.0.0 | quay.io/tutors-sdk/tutors-live:sha-8534430 |
| time | quay.io/tutors-sdk/tutors-time:17.0.0 | quay.io/tutors-sdk/tutors-time:sha-8534430 |
| provenance | a — pulled+verified | b — pulled+verified |
|---|---|---|
| reader | digest sha256:15e3aa22476d608db97e05917b1990ade0a7871e7ec6e113da5fec741b427233revision 432d46864626version 17.0.0-rc.1 | digest sha256:89ca1729eb2fdb53522bbe8903109c4b00c8d563bfba20149226fd6812c85a29revision 8534430cb068version sha-8534430 |
| catalogue | digest sha256:e9f2764654cb074d7dd4412ca163bf4c2666870444d5520361d5425bda4cec0brevision 432d46864626version 17.0.0-rc.1 | digest sha256:4eac027a536ceb22e8265d3a7459711189cea1c8d899be64f15c7cf938590f44revision 8534430cb068version sha-8534430 |
| live | digest sha256:52740e55cfa7e7db3b2944137caada4e876990b937f1034c0c5e79796054f8a0revision 432d46864626version 17.0.0-rc.1 | digest sha256:f922989906f59960be3b293604848dbd43ed551596ed090908e2acf448474b20revision 8534430cb068version sha-8534430 |
| time | digest sha256:d0a9f4a2f4624038ecea3629d1a536567756d458410bee43b45e060d738d195drevision 432d46864626version 17.0.0-rc.1 | digest sha256:60b3524d78783f90cba5e3d32b32b74d26e2a4c14373e6426a6018a14d1ae4ebrevision 8534430cb068version sha-8534430 |
Collected from the images, not the running apps. A cell that says NOT COLLECTED was not compared.
| app | artefact | a | b |
|---|---|---|---|
| reader | manifest | 10 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) |
| reader | sbom | 134 distinct package(s) (cosign attestation (signature verified)) | 134 distinct package(s) (cosign attestation (signature verified)) |
| reader | vulns | 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) | 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) |
| catalogue | manifest | 10 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) |
| catalogue | sbom | 134 distinct package(s) (cosign attestation (signature verified)) | 134 distinct package(s) (cosign attestation (signature verified)) |
| catalogue | vulns | 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) | 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) |
| live | manifest | 10 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) |
| live | sbom | 134 distinct package(s) (cosign attestation (signature verified)) | 134 distinct package(s) (cosign attestation (signature verified)) |
| live | vulns | 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) | 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) |
| time | manifest | 10 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) |
| time | sbom | 143 distinct package(s) (cosign attestation (signature verified)) | 143 distinct package(s) (cosign attestation (signature verified)) |
| time | vulns | 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) | 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) |
| side | requests | failed | 5xx | p50 | p95 |
|---|---|---|---|---|---|
| a | 600 | 0 | 0 | 1.33 ms | 2.77 ms |
| b | 601 | 0 | 0 | 1.3 ms | 2.35 ms |
| artefact | scope | what changed | claimed by |
|---|---|---|---|
dom | reader: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 |
dom | reader: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 |
dom | reader: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 |
dom | reader: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 |
dom | reader: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 |
dom | reader: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 |
dom | reader: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 |
dom | catalogue: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 |
dom | live: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 |
dom | reader-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 |
dom | reader-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 |
dom | reference: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 |
dom | reference: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 |
dom | reference: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 |
dom | reference: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 |
dom | reader-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 |
dom | reader-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 |
dom | live-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 |
dom | live-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 |
dom | time-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 |
dom | time-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 |
dom | time-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 |
dom | time-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 |
dom | time-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 |
dom | time-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 |
dom | time-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
dom | reader-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 |
network | POST /api/live/activity/course/localhost:8080 | reader-auth:course: new request on b: POST /api/live/activity | Rule 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) |
network | POST /api/live/activity/topic/localhost:8080/unit-1/topic-01 | reader-auth:topic: new request on b: POST /api/live/activity | Rule 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) |
network | GET /_app/immutable/chunks/{{hash}}.js/course/reference-course | reference:course: GET /_app/immutable/chunks/{{hash}}.js requested 43× on a, 44× on b | Rule 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) |
network | GET /_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 b | Rule 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) |
network | POST /api/live/activity/ | live-auth:rule-0589-courses: new request on b: POST /api/live/activity | Rule 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) |
network | POST /api/live/activity/course/localhost:8080 | reader-auth:rule-0582-course: new request on b: POST /api/live/activity | Rule 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) |
network | POST /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/activity | Rule 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) |
network | POST /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/activity | Rule 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) |
network | POST /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/activity | Rule 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) |
network | POST /api/live/activity/course/localhost:8080 | reader-auth:rule-0583-profile-menu: new request on b: POST /api/live/activity | Rule 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) |
console | catalogue:home/ | catalogue:home: console message gone on bdetailerror: {"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 |
console | catalogue:home/ | catalogue:home: console message gone on bdetailerror: {"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 |
metrics | time/http_request_duration_seconds_count | time: new series on b: http_request_duration_seconds_count | unclaimed |
metrics | time/http_requests_total | time: new series on b: http_requests_total | unclaimed |
focus | reader:home/ | reader:home: keyboard order changed (12 stops on a, 12 on b)detaila "My courses" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reader:course/course/localhost:8080 | reader:course: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reader:topic/topic/localhost:8080/unit-1/topic-01 | reader:topic: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reader: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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reader: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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reader:search/search/localhost:8080 | reader:search: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reader:search-results/search/localhost:8080?q=reference+material | reader:search-results: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | catalogue:home/ | catalogue:home: keyboard order changed (12 stops on a, 12 on b)detaila "Catalogue" -button "Open Theme Menu" +button "Preferences" a "My courses" | unclaimed |
focus | live:home/ | live:home: keyboard order changed (12 stops on a, 12 on b)detaila "Live" -button "Open Theme Menu" +button "Preferences" a "My courses" | unclaimed |
focus | reader-auth:course/course/localhost:8080 | reader-auth:course: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Profile menu" | unclaimed |
focus | reader-auth:topic/topic/localhost:8080/unit-1/topic-01 | reader-auth:topic: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Profile menu" | unclaimed |
focus | reference:course/course/reference-course | reference:course: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reference:topic/topic/reference-course/topic-07-reference | reference:topic: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reference:lab/lab/reference-course/topic-07-reference/book-a | reference:lab: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reference:note/note/reference-course/topic-07-reference/note-1 | reference:note: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Anonymous Tutors Profile" | unclaimed |
focus | reader-auth:rule-0588-lecturer-locked/course/localhost:8081 | reader-auth:rule-0588-lecturer-locked: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" a "Course home" | unclaimed |
focus | reader-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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" a "Course home" | unclaimed |
focus | live-auth:rule-0589-courses/ | live-auth:rule-0589-courses: keyboard order changed (12 stops on a, 12 on b)detaila "Live" -button "Open Theme Menu" +button "Preferences" a "My courses" | unclaimed |
focus | live-auth:rule-0589-students/ | live-auth:rule-0589-students: keyboard order changed (12 stops on a, 12 on b)detaila "Live" -button "Open Theme Menu" +button "Preferences" a "My courses" | unclaimed |
focus | time-auth:rule-0590-medians/harness-rules/medians | time-auth:rule-0590-medians: keyboard order changed (12 stops on a, 12 on b)detaila "Harness Rules Course" -button "Open Theme Menu" +button "Preferences" a "Medians" | unclaimed |
focus | time-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)detaila "Harness Rules Course" -button "Open Theme Menu" +button "Preferences" a "Medians" | unclaimed |
focus | time-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)detaila "Harness Rules Course" -button "Open Theme Menu" +button "Preferences" a "Medians" | unclaimed |
focus | time-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)detaila "Harness Rules Course" -button "Open Theme Menu" +button "Preferences" a "Medians" | unclaimed |
focus | time-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)detaila "Harness Rules Course" -button "Open Theme Menu" +button "Preferences" a "Medians" | unclaimed |
focus | time-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)detaila "Harness Rules Course" -button "Open Theme Menu" +button "Preferences" a "Medians" | unclaimed |
focus | time-auth:rule-0591-student/harness-rules/harness-quiet | time-auth:rule-0591-student: keyboard order changed (12 stops on a, 12 on b)detaila "Harness Rules Course" -button "Open Theme Menu" +button "Preferences" a "Medians" | unclaimed |
focus | reader-auth:rule-0582-course/course/localhost:8080 | reader-auth:rule-0582-course: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Profile menu" | unclaimed |
focus | reader-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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Profile menu" | unclaimed |
focus | reader-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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Profile menu" | unclaimed |
focus | reader-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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Profile menu" | unclaimed |
focus | reader-auth:rule-0583-profile-menu/course/localhost:8080 | reader-auth:rule-0583-profile-menu: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" button "Profile menu" | unclaimed |
focus | reader-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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" a "← Topic 1" | unclaimed |
focus | reader-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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" summary "Notebook 1 Notebook" | unclaimed |
focus | reader-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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" a "← Topic 1" | unclaimed |
focus | reader-auth:rule-0585-course-dark/course/localhost:8081 | reader-auth:rule-0585-course-dark: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" a "Course home" | unclaimed |
focus | reader-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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" a "Course home" | unclaimed |
focus | reader-auth:rule-0586-turned-away/ | reader-auth:rule-0586-turned-away: keyboard order changed (12 stops on a, 12 on b)detaila "My courses" -button "Open Theme Menu" +button "Preferences" button "Profile menu" | unclaimed |
focus | reader-auth:rule-0586-turned-away-again/ | reader-auth:rule-0586-turned-away-again: keyboard order changed (12 stops on a, 12 on b)detaila "My courses" -button "Open Theme Menu" +button "Preferences" button "Profile menu" | unclaimed |
focus | reader-auth:rule-0587-llm/llm/localhost:8081 | reader-auth:rule-0587-llm: keyboard order changed (12 stops on a, 12 on b)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" a "Course home" | unclaimed |
focus | reader-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)detailbutton "Search this course" -button "Open Theme Menu" +button "Preferences" a "← Topic 1" | unclaimed |
persistence | student-signs-in/realtime_claim_live_publish | student-signs-in: RPC realtime_claim_live_publish — 0 row(s) on a, 2 on b | Rule 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) |
persistence | rule-0589-live/realtime_claim_live_publish | rule-0589-live: RPC realtime_claim_live_publish — 0 row(s) on a, 4 on b | unclaimed |
persistence | rule-0589-live/realtime_watch | rule-0589-live: RPC realtime_watch — 0 row(s) on a, 1 on b | unclaimed |
persistence | rule-0582-signed-in-lab/realtime_claim_live_publish | rule-0582-signed-in-lab: RPC realtime_claim_live_publish — 0 row(s) on a, 5 on b | unclaimed |
persistence | rule-0583-presence/realtime_claim_live_publish | rule-0583-presence: RPC realtime_claim_live_publish — 0 row(s) on a, 2 on b | unclaimed |
realtime | reader-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) |
realtime | reader-auth/messages | reader-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 |
runtime | runtime/summary | container posture collected for catalogue, live, reader, reader-auth, time on both sides (compose)detailcatalogue: 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 |
startup | catalogue/ready | catalogue: ready slower on b: median 2490 ms → 5395 ms (+117%), p=0.012, n=5/5 | unclaimed |
startup | live/ready | live: ready slower on b: median 2446 ms → 5439 ms (+122%), p=0.012, n=5/5 | unclaimed |
startup | reader/ready | reader: ready slower on b: median 2429 ms → 5462 ms (+125%), p=0.012, n=5/5 | unclaimed |
startup | time/ready | time: ready slower on b: median 2384 ms → 5428 ms (+128%), p=0.012, n=5/5 | unclaimed |
startup | startup/summary | startup time collected on both sides (compose, 5 restart(s) per app)detailcatalogue: 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-hardening | reader/summary | reader: 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 history | informational |
image-hardening | catalogue/summary | catalogue: 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 history | informational |
image-hardening | live/summary | live: 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 history | informational |
image-hardening | time/summary | time: 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 history | informational |
build-provenance | reader/summary | reader: build-provenance holds on b: SLSA provenance v1 by .github/workflows/image-build.yml@refs/heads/main | informational |
build-provenance | catalogue/summary | catalogue: build-provenance holds on b: SLSA provenance v1 by .github/workflows/image-build.yml@refs/heads/main | informational |
build-provenance | live/summary | live: build-provenance holds on b: SLSA provenance v1 by .github/workflows/image-build.yml@refs/heads/main | informational |
build-provenance | time/summary | time: build-provenance holds on b: SLSA provenance v1 by .github/workflows/image-build.yml@refs/heads/main | informational |
vuln-ceiling | reader/summary | reader: vuln-ceiling holds on b: 94 advisories scanned, 20 critical or high, none with a fix available | informational |
vuln-ceiling | catalogue/summary | catalogue: vuln-ceiling holds on b: 94 advisories scanned, 20 critical or high, none with a fix available | informational |
vuln-ceiling | live/summary | live: vuln-ceiling holds on b: 94 advisories scanned, 20 critical or high, none with a fix available | informational |
vuln-ceiling | time/summary | time: vuln-ceiling holds on b: 94 advisories scanned, 20 critical or high, none with a fix available | informational |
asset-graph | reader | reader: 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 churn | informing (reported, never gates) |
asset-graph | catalogue | catalogue: 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 churn | informing (reported, never gates) |
asset-graph | live | live: 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 churn | informing (reported, never gates) |
asset-graph | reader-auth | reader-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 churn | informing (reported, never gates) |
asset-graph | reference | reference: 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 churn | informing (reported, never gates) |
asset-graph | live-auth | live-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 churn | informing (reported, never gates) |
asset-graph | time-auth | time-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 churn | informing (reported, never gates) |
replay | replay: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 b | informing (reported, never gates) |
replay | replay: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 b | informing (reported, never gates) |
replay | replay: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 b | informing (reported, never gates) |
replay | replay: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=100 | informing (reported, never gates) |
replay | replay: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=100 | informing (reported, never gates) |
replay | replay: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=100 | informing (reported, never gates) |
replay | replay: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=100 | informing (reported, never gates) |
replay | replay: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.json | informing (reported, never gates) |
replay | replay: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=100 | informing (reported, never gates) |
replay | replay: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 b | informing (reported, never gates) |
replay | replay: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 b | informing (reported, never gates) |
replay | replay: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 b | informing (reported, never gates) |
replay | replay: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=100 | informing (reported, never gates) |
slo | reader-availability | reader-availability: 100.0% of 62 reader requests not 5xx on b (its /metrics across the journeys), objective 99.90% (harness floor; monorepo 99.50%): holds | informational |
slo | reader-availability/load | reader-availability: 100.0% of 601 reader requests not 5xx on b (the k6 load leg), objective 99.90% (harness floor; monorepo 99.50%): holds | informational |
slo | reader-latency | reader-latency: 100.0% of 62 reader requests under 1s on b (its /metrics across the journeys), objective 99.0% (harness floor; monorepo 95.0%): holds | informational |
slo | reader-latency/load | reader-latency: 100.0% of 601 reader requests under 1s on b (the k6 load leg), objective 99.0% (harness floor; monorepo 95.0%): holds | informational |
slo | catalogue-availability/not-evaluated | catalogue-availability: not evaluated on b: 5 request(s) from its /metrics across the journeys, fewer than 20 | informational |
slo | catalogue-latency/not-evaluated | catalogue-latency: not evaluated on b: 5 request(s) from its /metrics across the journeys, fewer than 20 | informational |
slo | live-availability/not-evaluated | live-availability: not evaluated on b: 5 request(s) from its /metrics across the journeys, fewer than 20 | informational |
slo | live-latency/not-evaluated | live-latency: not evaluated on b: 5 request(s) from its /metrics across the journeys, fewer than 20 | informational |
slo | time-availability/not-evaluated | time-availability: not evaluated on b: 0 request(s) from its /metrics across the journeys, fewer than 20 | informational |
slo | time-latency/not-evaluated | time-latency: not evaluated on b: 0 request(s) from its /metrics across the journeys, fewer than 20 | informational |
slo | reader-latency-tail | reader-latency-tail: 100.0% of 62 reader requests under 2.5s on b (its /metrics across the journeys), objective 99.0%: holds | informational |
slo | reader-latency-tail/load | reader-latency-tail: 100.0% of 601 reader requests under 2.5s on b (the k6 load leg), objective 99.0%: holds | informational |
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.
| app | image-hardening | build-provenance | vuln-ceiling |
|---|---|---|---|
reader | holds | holds | holds |
catalogue | holds | holds | holds |
live | holds | holds | holds |
time | holds | holds | holds |
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.
| engine | scope | what it found | level | claimed by |
|---|---|---|---|---|
realtime | reader-auth:rule-0592-stroke-saved/websocket | 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) | no date set | unclaimed |
asset-graph | reader | reader: 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 churn | no date set | unclaimed |
asset-graph | catalogue | catalogue: 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 churn | no date set | unclaimed |
asset-graph | live | live: 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 churn | no date set | unclaimed |
asset-graph | reader-auth | reader-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 churn | no date set | unclaimed |
asset-graph | reference | reference: 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 churn | no date set | unclaimed |
asset-graph | live-auth | live-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 churn | no date set | unclaimed |
asset-graph | time-auth | time-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 churn | no date set | unclaimed |
replay | replay:talk-01 GET /_app/immutable/assets/1.{{hash}}.css | replay:talk-01: GET /_app/immutable/assets/1.{{hash}}.css requested 1× on a, 2× on b | no date set | unclaimed |
replay | replay:talk-01 GET /_app/immutable/chunks/{{hash}}.js | replay:talk-01: GET /_app/immutable/chunks/{{hash}}.js requested 36× on a, 40× on b | no date set | unclaimed |
replay | replay:talk-01 GET /_app/immutable/nodes/1.{{hash}}.js | replay:talk-01: GET /_app/immutable/nodes/1.{{hash}}.js requested 1× on a, 2× on b | no date set | unclaimed |
replay | replay:talk-01 GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100 | replay:talk-01: new request on b: GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100 | no date set | unclaimed |
replay | replay:note-01 GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100 | replay:note-01: request no longer made on b: GET /talk/localhost:8080/unit-1/topic-01/talk-01/__data.json?x-sveltekit-invalidated=100 | no date set | unclaimed |
replay | replay:note-01 GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100 | replay:note-01: new request on b: GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100 | no date set | unclaimed |
replay | replay:note-02 GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100 | replay:note-02: request no longer made on b: GET /note/localhost:8080/unit-1/topic-01/note-01/__data.json?x-sveltekit-invalidated=100 | no date set | unclaimed |
replay | replay:note-02 GET {{course}}/tutors.json | replay:note-02: new request on b: GET {{course}}/tutors.json | no date set | unclaimed |
replay | replay:note-02 GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100 | replay:note-02: new request on b: GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100 | no date set | unclaimed |
replay | replay:lab-02-step-03 GET /_app/immutable/assets/1.{{hash}}.css | replay:lab-02-step-03: GET /_app/immutable/assets/1.{{hash}}.css requested 2× on a, 1× on b | no date set | unclaimed |
replay | replay:lab-02-step-03 GET /_app/immutable/chunks/{{hash}}.js | replay:lab-02-step-03: GET /_app/immutable/chunks/{{hash}}.js requested 39× on a, 38× on b | no date set | unclaimed |
replay | replay:lab-02-step-03 GET /_app/immutable/nodes/1.{{hash}}.js | replay:lab-02-step-03: GET /_app/immutable/nodes/1.{{hash}}.js requested 2× on a, 1× on b | no date set | unclaimed |
replay | replay:lab-02-step-03 GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100 | 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=100 | no date set | unclaimed |
3 claim(s) cover 11 failing hunk(s): 3.67 per claim, at most 8 under one (flagged above 10).
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.