Gate: FAIL (exit 1)

New since the last forecast

The first kept forecast beside 17.0.0: nothing earlier to compare with.

Causes and the PRs behind them

4 causes, 4 with a PR named. Each is matched by path: the PRs whose files touch what the cause is about, ranked by the direct ones (the app's own source for a page, a Dockerfile for an image) before the indirect (the shared packages, a manifest). A lead to ask, never a verdict.

causedifferencesPRs
network: GET {{asset}} requested #× on a, #× on b2#478 (13 files, 1 direct), #481 (6 files, 1 direct), #476 (1 file) and 3 more
network: new request on b: POST /api/live/activity2#478 (13 files, 1 direct), #481 (6 files, 1 direct), #476 (1 file) and 3 more
persistence: RPC realtime_claim_live_publish — # row(s) on a, # on b1#478 (13 files, 1 direct), #481 (6 files, 1 direct), #476 (1 file) and 3 more
timing: journey student-signs-in slower on b1#483 (4 files), #478 (13 files, 1 direct), #481 (6 files, 1 direct) and 3 more

No RCS: Gate FAIL. The Gate wins: no number talks a FAIL back on. The dimensions are shown for the 5 Whys, not for a decision.

Claims owed (4)

One draft claim per cause, its scope narrowed and checked against this forecast's unclaimed differences: together they cover all 6, 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.

  # network: GET {{asset}} requested #× on a, #× on b: covers its 2 differences. Name the Rule that intends it, or fix it.
  - artefact: "network"
    scope: "GET /_app/immutable/chunks/\\{\\{hash\\}\\}.js"
    rule: "????"
    reason: "GET {{asset}} requested #× on a, #× on b: 2 differences (reader; 2 pages; 1 name); likely #478, #481, #476"
  # network: new request on b: POST /api/live/activity: covers its 2 differences. Name the Rule that intends it, or fix it.
  - artefact: "network"
    scope: "POST /api/live/activity"
    rule: "????"
    reason: "new request on b: POST /api/live/activity: 2 differences (reader; 2 pages); likely #478, #481, #476"
  # persistence: RPC realtime_claim_live_publish — # row(s) on a, # on b: covers its 1 difference. Name the Rule that intends it, or fix it.
  - artefact: "persistence"
    scope: "student-signs-in/realtime_claim_live_publish"
    rule: "????"
    reason: "RPC realtime_claim_live_publish — # row(s) on a, # on b: 1 difference; likely #478, #481, #476"
  # timing: journey student-signs-in slower on b: covers its 1 difference. Name the Rule that intends it, or fix it.
  - artefact: "timing"
    scope: "student-signs-in"
    rule: "????"
    reason: "journey student-signs-in slower on b: 1 difference (1 name); likely #483, #478, #481"

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

dimensionweightscorefloorwhere it lost points
Claim coverage200breached−20 unclaimed: network /course/localhost:8080: reader-auth:course: new request on b: POST /api/live/activity
−20 unclaimed: network /topic/localhost:8080/unit-1/topic-01: reader-auth:topic: new request on b: POST /api/live/activity
−20 unclaimed: network /course/reference-course: reference:course: GET /_app/immutable/chunks/{{hash}}.js requested 43× on a, 44× on b
−20 unclaimed: network /note/reference-course/topic-07-reference/note-1: reference:note: GET /_app/immutable/chunks/{{hash}}.js requested 39× on a, 40× on b
−20 unclaimed: timing student-signs-in: journey student-signs-in slower on b: median 4280ms → 22701ms (+430%, p=0.012, n=5/5; smallest slowdown 5/5 runs could detect: about 58%) (and 1 more like it, not counted again: report.html#differences)
−15 stale claim axe reader-auth:sign-in: matched nothing (sign-in button text contrast (color-contrast, serious) fixed by #313; page title added (document-title, serious))
−15 stale claim axe reference:course: matched nothing (navigation dialog trigger no longer wraps a control (nested-interactive, serious) fixed by #313)
−15 stale claim axe reference:topic: matched nothing (navigation dialog trigger no longer wraps a control (nested-interactive, serious) fixed by #313)
−15 stale claim axe reference:note: matched nothing (code block copy buttons are named "Copy code" (button-name, critical) fixed by #313)
−15 stale claim sbom */{@isaacs/cliui,@isaacs/fs-minipass,@isaacs/string-locale-compare,@npmcli/agent,@npmcli/arborist,@npmcli/config,@npmcli/fs,@npmcli/git,@npmcli/installed-package-contents,@npmcli/map-workspaces,@npmcli/metavuln-calculator,@npmcli/name-from-folder,@npmcli/node-gyp,@npmcli/package-json,@npmcli/promise-spawn,@npmcli/query,@npmcli/redact,@npmcli/run-script,@pkgjs/parseargs,@sigstore/bundle,@sigstore/core,@sigstore/protobuf-specs,@sigstore/sign,@sigstore/tuf,@sigstore/verify,@tufjs/canonical-json,@tufjs/models,abbrev,agent-base,ansi-regex,ansi-styles,aproba,archy,balanced-match,bin-links,binary-extensions,brace-expansion,cacache,chalk,chownr,ci-info,cidr-regex,cli-columns,cmd-shim,color-convert,color-name,common-ancestor-path,corepack,cross-spawn,cssesc,debug,diff,eastasianwidth,emoji-regex,encoding,env-paths,err-code,exponential-backoff,fastest-levenshtein,fdir,foreground-child,fs-minipass,glob,graceful-fs,hosted-git-info,http-cache-semantics,http-proxy-agent,https-proxy-agent,iconv-lite,ignore-walk,imurmurhash,ini,init-package-json,ip-address,ip-regex,is-cidr,is-fullwidth-code-point,isexe,jackspeak,json-parse-even-better-errors,json-stringify-nice,jsonparse,just-diff,just-diff-apply,libnpmaccess,libnpmdiff,libnpmexec,libnpmfund,libnpmhook,libnpmorg,libnpmpack,libnpmpublish,libnpmsearch,libnpmteam,libnpmversion,lru-cache,make-fetch-happen,minimatch,minipass,minipass-collect,minipass-fetch,minipass-flush,minipass-pipeline,minipass-sized,minizlib,ms,mute-stream,negotiator,node-gyp,nopt,normalize-package-data,npm,npm-audit-report,npm-bundled,npm-install-checks,npm-normalize-package-bin,npm-package-arg,npm-packlist,npm-pick-manifest,npm-profile,npm-registry-fetch,npm-user-validate,p-map,package-json-from-dist,pacote,parse-conflict-json,path-key,path-scurry,picomatch,postcss-selector-parser,proc-log,proggy,promise-all-reject-late,promise-call-limit,promise-retry,promzard,qrcode-terminal,read,read-cmd-shim,read-package-json-fast,retry,safer-buffer,semver,shebang-command,shebang-regex,signal-exit,sigstore,smart-buffer,socks,socks-proxy-agent,spdx-correct,spdx-exceptions,spdx-expression-parse,spdx-license-ids,ssri,string-width,strip-ansi,supports-color,text-table,tiny-relative-date,tinyglobby,treeverse,tuf-js,unique-filename,unique-slug,util-deprecate,validate-npm-package-license,validate-npm-package-name,walk-up-path,which,wrap-ansi,write-file-atomic,yallist,yarn}: matched nothing (runtime image ships no package manager: npm, npx, corepack and yarn removed by #143 (4070315), rationale in tests/bdd/features/developer/runtime-image.feature)
−15 stale claim persistence */record_page_view: matched nothing (a page view is recorded against the learning object and the day's calendar in one request (#475))
−10 stale claim persistence */{learning_records,calendar,get_count_learning_records}: matched nothing (the per-table page-view requests are replaced by record_page_view (#475)) (and 36 more like it, not counted again)
Noise health1585−5 mask realtime-rest-fallback-warning 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 vd3d72277634afc7370a4432eb3fdd64d57e5bf9a 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 vd3d72277634afc7370a4432eb3fdd64d57e5bf9a names it
−10 PR #480 changed Shared Packages, Infrastructure, Development but no changelog entry under vd3d72277634afc7370a4432eb3fdd64d57e5bf9a names it
−10 PR #481 changed Reader, Infrastructure, Development but no changelog entry under vd3d72277634afc7370a4432eb3fdd64d57e5bf9a names it
−10 PR #483 changed Infrastructure, Reader, Live, Catalogue, Time, Development but no changelog entry under vd3d72277634afc7370a4432eb3fdd64d57e5bf9a names it
−10 PR #484 changed Infrastructure, Development but no changelog entry under vd3d72277634afc7370a4432eb3fdd64d57e5bf9a names it
−10 PR #487 changed Reader, Development but no changelog entry under vd3d72277634afc7370a4432eb3fdd64d57e5bf9a 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..d3d72277634afc7370a4432eb3fdd64d57e5bf9a: 7 of 8 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 vd3d72277634afc7370a4432eb3fdd64d57e5bf9a names it
#476Give each whiteboard room a Realtime budget37750no production linesyes−10−10 PR #476 changed Reader, Development but no changelog entry under vd3d72277634afc7370a4432eb3fdd64d57e5bf9a 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 vd3d72277634afc7370a4432eb3fdd64d57e5bf9a 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 vd3d72277634afc7370a4432eb3fdd64d57e5bf9a 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 vd3d72277634afc7370a4432eb3fdd64d57e5bf9a 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 vd3d72277634afc7370a4432eb3fdd64d57e5bf9a 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 vd3d72277634afc7370a4432eb3fdd64d57e5bf9a names it
1 moreno deductions: #4857930

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

2026-10-15T18:04:41.578Z · clock 2026-09-16T09:05:00.000Z · 5 run(s) per side · harness 1.37.3

6 unclaimed differences, 4 causes

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

causedifferencesappspagesexample
network GET {{asset}} requested #× on a, #× on b
1 route: GET /_app/immutable/chunks/{{hash}}.js
2reader2
reference:course, reference:note
reference:course: GET /_app/immutable/chunks/{{hash}}.js requested 43× on a, 44× on b
network new request on b: POST /api/live/activity2reader2
reader-auth:course, reader-auth:topic
reader-auth:course: new request on b: POST /api/live/activity
persistence RPC realtime_claim_live_publish — # row(s) on a, # on b1——student-signs-in: RPC realtime_claim_live_publish — 0 row(s) on a, 2 on b
timing journey student-signs-in slower on b
1 name: median 4280ms → 22701ms (+430%, p=0.012, n=5/5; smallest slowdown 5/5 runs could detect: about 58%)
1——journey student-signs-in slower on b: median 4280ms → 22701ms (+430%, p=0.012, n=5/5; smallest slowdown 5/5 runs could detect: about 58%)
ab
readerquay.io/tutors-sdk/tutors-reader:17.0.0quay.io/tutors-sdk/tutors-reader:sha-d3d7227
cataloguequay.io/tutors-sdk/tutors-catalogue:17.0.0quay.io/tutors-sdk/tutors-catalogue:sha-d3d7227
livequay.io/tutors-sdk/tutors-live:17.0.0quay.io/tutors-sdk/tutors-live:sha-d3d7227
timequay.io/tutors-sdk/tutors-time:17.0.0quay.io/tutors-sdk/tutors-time:sha-d3d7227
provenancea — pulled+verifiedb — pulled+verified
readerdigest sha256:15e3aa22476d608db97e05917b1990ade0a7871e7ec6e113da5fec741b427233
revision 432d46864626
version 17.0.0-rc.1
digest sha256:bc7ca09526ac59b2f936dd27a68ad7a9527cb8dc3be17ca41f8ec8c79c4c7abd
revision d3d72277634a
version sha-d3d7227
cataloguedigest sha256:e9f2764654cb074d7dd4412ca163bf4c2666870444d5520361d5425bda4cec0b
revision 432d46864626
version 17.0.0-rc.1
digest sha256:fbae335184067b5763c61c60b419c8a7293903f7a8eff6f85c0acf93b279bcf5
revision d3d72277634a
version sha-d3d7227
livedigest sha256:52740e55cfa7e7db3b2944137caada4e876990b937f1034c0c5e79796054f8a0
revision 432d46864626
version 17.0.0-rc.1
digest sha256:95666ae77a2816d74629566810ebcbeae8a3d7647140e449083fd8fac78a52bb
revision d3d72277634a
version sha-d3d7227
timedigest sha256:d0a9f4a2f4624038ecea3629d1a536567756d458410bee43b45e060d738d195d
revision 432d46864626
version 17.0.0-rc.1
digest sha256:accb1ea9807d95df261cbd5244ecfd98a419903011d00d84f49eaccccd026236
revision d3d72277634a
version sha-d3d7227

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.19 ms1.95 ms
b600001.3 ms1.9 ms

Differences (42; 6 unclaimed)

artefactscopewhat changedclaimed by
domanonymous-student-reads-coursejourney "anonymous-student-reads-course" failed on a but completed on b (fixed)
detail
locator.waitFor: Timeout 15000ms exceeded.
informational
networkPOST /api/live/activity
/course/localhost:8080
reader-auth:course: new request on b: POST /api/live/activityunclaimed
networkPOST /api/live/activity
/topic/localhost:8080/unit-1/topic-01
reader-auth:topic: new request on b: POST /api/live/activityunclaimed
networkGET /_app/immutable/chunks/{{hash}}.js
/course/reference-course
reference:course: GET /_app/immutable/chunks/{{hash}}.js requested 43× on a, 44× on bunclaimed
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 bunclaimed
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
timingstudent-signs-injourney student-signs-in slower on b: median 4280ms → 22701ms (+430%, p=0.012, n=5/5; smallest slowdown 5/5 runs could detect: about 58%)unclaimed
persistencestudent-signs-in/realtime_claim_live_publishstudent-signs-in: RPC realtime_claim_live_publish — 0 row(s) on a, 2 on bunclaimed
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 / 396 → 390 ms, ready 2286 → 2284 ms (median, a → b, n=5/5)
live: first healthy / 394 → 400 ms, ready 2295 → 2336 ms (median, a → b, n=5/5)
reader: first healthy / 447 → 417 ms, ready 2315 → 2299 ms (median, a → b, n=5/5)
time: first healthy / 450 → 395 ms, ready 2366 → 2277 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 bc7ca09526ac (production too)informing (reported, never gates)
build-provenancecatalogue/slsacatalogue: carries no SLSA provenance verified under the publishing identity on fbae33518406 (production too)informing (reported, never gates)
build-provenancelive/slsalive: carries no SLSA provenance verified under the publishing identity on 95666ae77a28 (production too)informing (reported, never gates)
build-provenancetime/slsatime: carries no SLSA provenance verified under the publishing identity on accb1ea9807d (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
timing-tolerancestudent-signs-injourney student-signs-in slower on b beyond the 10% tolerance: 4280ms → 22701ms (+430%, p=0.012, n=5/5 runs; smallest detectable about 58%); timing fails it too (its floor is 20%)informing (reported, never gates)
asset-graphreaderreader: the asset graph changed: 62 → 62 immutable requests (JS 50 → 50, CSS 12 → 12), 564 KB → 565 KB; 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)
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 600 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 600 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 600 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 (14; 14 unclaimed) reported, never gates

19 of 27 engines are blocking; informing (reported, never gates): 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 bc7ca09526ac (production too)no date setunclaimed
build-provenancecatalogue/slsacatalogue: carries no SLSA provenance verified under the publishing identity on fbae33518406 (production too)no date setunclaimed
build-provenancelive/slsalive: carries no SLSA provenance verified under the publishing identity on 95666ae77a28 (production too)no date setunclaimed
build-provenancetime/slsatime: carries no SLSA provenance verified under the publishing identity on accb1ea9807d (production too)no date setunclaimed
timing-tolerancestudent-signs-injourney student-signs-in slower on b beyond the 10% tolerance: 4280ms → 22701ms (+430%, p=0.012, n=5/5 runs; smallest detectable about 58%); timing fails it too (its floor is 20%)no date setunclaimed
asset-graphreaderreader: the asset graph changed: 62 → 62 immutable requests (JS 50 → 50, CSS 12 → 12), 564 KB → 565 KB; 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

Stale claims (43)

Claim hygiene

43 claim(s) cover 0 failing hunk(s): 0 per claim, at most 0 under one (flagged above 10).

Masks

Fired: response-date×90, request-id×90, etag×90, metrics-process×599, metrics-timing-histograms×12, third-party-requests×1509, persistence-stub-requests×140, oauth-callback-state×10, media-range-status×45, chromium-compute-pressure-policy×1, hashed-assets×4903, footer-tutors-version×330, transport-length×90, transport-connection×90, transport-keepalive×90.
Silent this run: realtime-rest-fallback-warning, transport-encoding, transport-transfer — a mask that never fires is a mask to delete.