Gate: PASS (exit 0)

New since the last forecast

0 new, 1 gone in the unclaimed set since the forecast of 2026-10-15T19:51:41.408Z (sha-c867ee8), beside the same baseline 17.0.0. By artefact: timing +0 −1. The previous forecast was judged by harness 1.37.4, this one by 1.39.0: a harness change can move differences too.

Gone since then: timing student-signs-in: journey student-signs-in slower on b: median 3435ms → 8479ms (+147%, p=0.012, n=5/5; smallest slowdown 5/5 runs could detect: about 70%).

RCS 80 Amber: ship only after the reviewer's glance is recorded verified

Claims owed

None: no unclaimed difference.

weighted mean 80.07 over 5 of 8 dimensions measured (weight 70 of 100, renormalised); the rest are not measured and not counted.

dimensionweightscorefloorwhere it lost points
Claim coverage20100—
Noise health1580−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 signal15not measuredquality.json has no mutation scores for 7c4028a (the monorepo's Nightly wrote no Stryker report) and no harness mutants
Requirements traceability10not measuredneeds the changelog, the EARS files and the claims side by side: pass --traceability <json>; changes.json already reports 7 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 risk1527−10 PR #476 changed Reader, Development but no changelog entry under vc867ee87107a603c3d1ea34be9ff70beab119ee2 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 vc867ee87107a603c3d1ea34be9ff70beab119ee2 names it
−10 PR #480 changed Shared Packages, Infrastructure, Development but no changelog entry under vc867ee87107a603c3d1ea34be9ff70beab119ee2 names it
−10 PR #481 changed Reader, Infrastructure, Development but no changelog entry under vc867ee87107a603c3d1ea34be9ff70beab119ee2 names it
−10 PR #483 changed Infrastructure, Reader, Live, Catalogue, Time, Development but no changelog entry under vc867ee87107a603c3d1ea34be9ff70beab119ee2 names it
−10 PR #484 changed Infrastructure, Development but no changelog entry under vc867ee87107a603c3d1ea34be9ff70beab119ee2 names it
−10 PR #487 changed Reader, Development but no changelog entry under vc867ee87107a603c3d1ea34be9ff70beab119ee2 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 27 (100 − 73), v17.0.0..c867ee87107a603c3d1ea34be9ff70beab119ee2: 7 of 9 PRs carry a finding.

PRtitlechurnfileshotspotstests ÷ productionreviewedfirst contributionpointswhere the points went
#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 vc867ee87107a603c3d1ea34be9ff70beab119ee2 names it
#476Give each whiteboard room a Realtime budget37750no production linesyes−10−10 PR #476 changed Reader, Development but no changelog entry under vc867ee87107a603c3d1ea34be9ff70beab119ee2 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 vc867ee87107a603c3d1ea34be9ff70beab119ee2 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 vc867ee87107a603c3d1ea34be9ff70beab119ee2 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 vc867ee87107a603c3d1ea34be9ff70beab119ee2 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 vc867ee87107a603c3d1ea34be9ff70beab119ee2 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 vc867ee87107a603c3d1ea34be9ff70beab119ee2 names it
2 moreno deductions: #485, #49357650

Not measured: orphan entries (a changelog entry with no diff) (CHANGELOG.md at c867ee87107a603c3d1ea34be9ff70beab119ee2 has no "### vc867ee87107a603c3d1ea34be9ff70beab119ee2" 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 pass

2026-10-15T21:21:41.791Z · clock 2026-09-16T09:05:00.000Z · 5 run(s) per side · harness 1.39.0

ab
readerquay.io/tutors-sdk/tutors-reader:17.0.0quay.io/tutors-sdk/tutors-reader:sha-c867ee8
cataloguequay.io/tutors-sdk/tutors-catalogue:17.0.0quay.io/tutors-sdk/tutors-catalogue:sha-c867ee8
livequay.io/tutors-sdk/tutors-live:17.0.0quay.io/tutors-sdk/tutors-live:sha-c867ee8
timequay.io/tutors-sdk/tutors-time:17.0.0quay.io/tutors-sdk/tutors-time:sha-c867ee8
provenancea — pulled+verifiedb — pulled+verified
readerdigest sha256:15e3aa22476d608db97e05917b1990ade0a7871e7ec6e113da5fec741b427233
revision 432d46864626
version 17.0.0-rc.1
digest sha256:d72750b7cc2f11aa0cb60226f8fbcd434cbb07da9a867715a98c897426b757e0
revision c867ee87107a
version sha-c867ee8
cataloguedigest sha256:e9f2764654cb074d7dd4412ca163bf4c2666870444d5520361d5425bda4cec0b
revision 432d46864626
version 17.0.0-rc.1
digest sha256:21ce90483d4de95247f85c1e2593ac7caedd87adb65215367805bc9e638eae3d
revision c867ee87107a
version sha-c867ee8
livedigest sha256:52740e55cfa7e7db3b2944137caada4e876990b937f1034c0c5e79796054f8a0
revision 432d46864626
version 17.0.0-rc.1
digest sha256:5aee8b0d07dc699002d64e28f2cf42c28045c64d3d9e638ff32bc432021cc51a
revision c867ee87107a
version sha-c867ee8
timedigest sha256:d0a9f4a2f4624038ecea3629d1a536567756d458410bee43b45e060d738d195d
revision 432d46864626
version 17.0.0-rc.1
digest sha256:13b46ba247e41534e91796cfde73f929d086e62f633501cc6b22c4475eb919f3
revision c867ee87107a
version sha-c867ee8

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-15T06:30:36Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)94 advisories, db built 2026-10-15T06:30:36Z 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-15T06:30:36Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)94 advisories, db built 2026-10-15T06:30:36Z 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-15T06:30:36Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)94 advisories, db built 2026-10-15T06:30:36Z 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-15T06:30:36Z schema v6.1.10, OpenVEX openvex.json (0 statement(s)): none set aside (grype 0.119.0)94 advisories, db built 2026-10-15T06:30:36Z 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
a601001.42 ms2.83 ms
b601001.42 ms2.46 ms

Differences (58; 0 unclaimed)

artefactscopewhat changedclaimed by
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)
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
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)
realtimereader-auth/messagesreader-auth: Realtime messages per reader page view fell: a 1.33 / b 0 per reader page (broadcasts a 4 / b 0, socket data frames a 0 / b 0, over 3 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
startupstartup/summarystartup time collected on both sides (compose, 5 restart(s) per app)
detail
catalogue: first healthy / 488 → 482 ms, ready 2376 → 2370 ms (median, a → b, n=5/5)
live: first healthy / 454 → 493 ms, ready 2311 → 2339 ms (median, a → b, n=5/5)
reader: first healthy / 598 → 612 ms, ready 2362 → 2367 ms (median, a → b, n=5/5)
time: first healthy / 471 → 453 ms, ready 2436 → 2326 ms (median, a → b, n=5/5)
informational
image-hardeningreader/healthcheckreader: declares no HEALTHCHECK (production too)informing (reported, never gates)
image-hardeningcatalogue/healthcheckcatalogue: declares no HEALTHCHECK (production too)informing (reported, never gates)
image-hardeninglive/healthchecklive: declares no HEALTHCHECK (production too)informing (reported, never gates)
image-hardeningtime/healthchecktime: declares no HEALTHCHECK (production too)informing (reported, never gates)
build-provenancereader/slsareader: carries no SLSA provenance verified under the publishing identity on d72750b7cc2f (production too)informing (reported, never gates)
build-provenancecatalogue/slsacatalogue: carries no SLSA provenance verified under the publishing identity on 21ce90483d4d (production too)informing (reported, never gates)
build-provenancelive/slsalive: carries no SLSA provenance verified under the publishing identity on 5aee8b0d07dc (production too)informing (reported, never gates)
build-provenancetime/slsatime: carries no SLSA provenance verified under the publishing identity on 13b46ba247e4 (production too)informing (reported, never gates)
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 → 542 KB; 0 network and 0 headers difference(s) are this churninforming (reported, never gates)
asset-graphreader-authreader-auth: the asset graph changed: 96 → 96 immutable requests (JS 83 → 83, CSS 13 → 13), 1.0 MB → 1.0 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)
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 35× on a, 39× on binforming (reported, never gates)
replayreplay:talk-01 GET {{course}}/tutors.json
/talk/localhost:8080/unit-1/topic-01/talk-01
replay:talk-01: new request on b: GET {{course}}/tutors.jsoninforming (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: new request on b: GET /_app/immutable/assets/1.{{hash}}.cssinforming (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: new request on b: GET /_app/immutable/nodes/1.{{hash}}.jsinforming (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 {{course}}/tutors.json
/note/localhost:8080/unit-1/topic-01/note-01
replay:note-01: GET {{course}}/tutors.json requested 2× on a, 1× on binforming (reported, never gates)
replayreplay:note-01 GET /_app/immutable/assets/1.{{hash}}.css
/note/localhost:8080/unit-1/topic-01/note-01
replay:note-01: GET /_app/immutable/assets/1.{{hash}}.css requested 2× on a, 1× on binforming (reported, never gates)
replayreplay:note-01 GET /_app/immutable/chunks/{{hash}}.js
/note/localhost:8080/unit-1/topic-01/note-01
replay:note-01: GET /_app/immutable/chunks/{{hash}}.js requested 39× on a, 38× on binforming (reported, never gates)
replayreplay:note-01 GET /_app/immutable/nodes/1.{{hash}}.js
/note/localhost:8080/unit-1/topic-01/note-01
replay:note-01: GET /_app/immutable/nodes/1.{{hash}}.js requested 2× on a, 1× on binforming (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-02 GET {{course}}/tutors.json
/note/localhost:8080/unit-1/topic-02/note-02
replay:note-02: request no longer made on b: GET {{course}}/tutors.jsoninforming (reported, never gates)
replayreplay:note-02 GET /_app/immutable/assets/1.{{hash}}.css
/note/localhost:8080/unit-1/topic-02/note-02
replay:note-02: request no longer made on b: GET /_app/immutable/assets/1.{{hash}}.cssinforming (reported, never gates)
replayreplay:note-02 GET /_app/immutable/chunks/{{hash}}.js
/note/localhost:8080/unit-1/topic-02/note-02
replay:note-02: GET /_app/immutable/chunks/{{hash}}.js requested 38× on a, 37× on binforming (reported, never gates)
replayreplay:note-02 GET /_app/immutable/nodes/1.{{hash}}.js
/note/localhost:8080/unit-1/topic-02/note-02
replay:note-02: request no longer made on b: GET /_app/immutable/nodes/1.{{hash}}.jsinforming (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: 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)
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 1× on a, 2× 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 38× on a, 39× 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 1× on a, 2× 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: new request 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: its /metrics across the journeys carries no availability SLI for timeinformational
slotime-latency/not-evaluatedtime-latency: not evaluated on b: its /metrics across the journeys carries no latency SLI for timeinformational
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
reader1 finding (1 on production too)1 finding (1 on production too)holds
catalogue1 finding (1 on production too)1 finding (1 on production too)holds
live1 finding (1 on production too)1 finding (1 on production too)holds
time1 finding (1 on production too)1 finding (1 on production too)holds

Informing (32; 32 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
image-hardeningreader/healthcheckreader: declares no HEALTHCHECK (production too)no date setunclaimed
image-hardeningcatalogue/healthcheckcatalogue: declares no HEALTHCHECK (production too)no date setunclaimed
image-hardeninglive/healthchecklive: declares no HEALTHCHECK (production too)no date setunclaimed
image-hardeningtime/healthchecktime: declares no HEALTHCHECK (production too)no date setunclaimed
build-provenancereader/slsareader: carries no SLSA provenance verified under the publishing identity on d72750b7cc2f (production too)no date setunclaimed
build-provenancecatalogue/slsacatalogue: carries no SLSA provenance verified under the publishing identity on 21ce90483d4d (production too)no date setunclaimed
build-provenancelive/slsalive: carries no SLSA provenance verified under the publishing identity on 5aee8b0d07dc (production too)no date setunclaimed
build-provenancetime/slsatime: carries no SLSA provenance verified under the publishing identity on 13b46ba247e4 (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 → 542 KB; 0 network and 0 headers difference(s) are this churnno date setunclaimed
asset-graphreader-authreader-auth: the asset graph changed: 96 → 96 immutable requests (JS 83 → 83, CSS 13 → 13), 1.0 MB → 1.0 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
replayreplay:talk-01 GET /_app/immutable/chunks/{{hash}}.jsreplay:talk-01: GET /_app/immutable/chunks/{{hash}}.js requested 35× on a, 39× on bno date setunclaimed
replayreplay:talk-01 GET {{course}}/tutors.jsonreplay:talk-01: new request on b: GET {{course}}/tutors.jsonno date setunclaimed
replayreplay:talk-01 GET /_app/immutable/assets/1.{{hash}}.cssreplay:talk-01: new request on b: GET /_app/immutable/assets/1.{{hash}}.cssno date setunclaimed
replayreplay:talk-01 GET /_app/immutable/nodes/1.{{hash}}.jsreplay:talk-01: new request on b: GET /_app/immutable/nodes/1.{{hash}}.jsno 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 {{course}}/tutors.jsonreplay:note-01: GET {{course}}/tutors.json requested 2× on a, 1× on bno date setunclaimed
replayreplay:note-01 GET /_app/immutable/assets/1.{{hash}}.cssreplay:note-01: GET /_app/immutable/assets/1.{{hash}}.css requested 2× on a, 1× on bno date setunclaimed
replayreplay:note-01 GET /_app/immutable/chunks/{{hash}}.jsreplay:note-01: GET /_app/immutable/chunks/{{hash}}.js requested 39× on a, 38× on bno date setunclaimed
replayreplay:note-01 GET /_app/immutable/nodes/1.{{hash}}.jsreplay:note-01: GET /_app/immutable/nodes/1.{{hash}}.js requested 2× on a, 1× on bno 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-02 GET {{course}}/tutors.jsonreplay:note-02: request no longer made on b: GET {{course}}/tutors.jsonno date setunclaimed
replayreplay:note-02 GET /_app/immutable/assets/1.{{hash}}.cssreplay:note-02: request no longer made on b: GET /_app/immutable/assets/1.{{hash}}.cssno date setunclaimed
replayreplay:note-02 GET /_app/immutable/chunks/{{hash}}.jsreplay:note-02: GET /_app/immutable/chunks/{{hash}}.js requested 38× on a, 37× on bno date setunclaimed
replayreplay:note-02 GET /_app/immutable/nodes/1.{{hash}}.jsreplay:note-02: request no longer made on b: GET /_app/immutable/nodes/1.{{hash}}.jsno date setunclaimed
replayreplay:note-02 GET /note/localhost:8080/unit-1/topic-02/note-02/__data.json?x-sveltekit-invalidated=100replay:note-02: request no longer made 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 1× on a, 2× 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 38× on a, 39× 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 1× on a, 2× 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: new request 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 5 failing hunk(s): 1.67 per claim, at most 2 under one (flagged above 10).

Masks

Fired: response-date×92, request-id×92, etag×92, metrics-process×602, metrics-timing-histograms×12, third-party-requests×1518, persistence-stub-requests×140, oauth-callback-state×10, media-range-status×46, hashed-assets×5011, footer-tutors-version×340, transport-length×92, transport-connection×92, transport-keepalive×92.
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.