Canvas LMS 2026-05-20.143-CE-ubuntu24.04-r2 build trail
How ReadyStack built readystack/canvas:2026-05-20.143-CE-ubuntu24.04-r2 and its build kit, copied record by record: why the release exists, every chain, drive and stage it went through, the model work, the review rounds, the defects, the checks that verified it and when it was published. Each line names the record it comes from in brackets; a record that does not exist for this release says so.
This trail
As JSON- Image
readystack/canvas:2026-05-20.143-CE-ubuntu24.04-r2 - Index digestsha256:79b1ec971c178dd8c078b5cdb7099b5bb3514f5352c02619a1b3b8b1b4bcaf8c
- linux/amd64 digestsha256:3535e722ffb3d4e850e8aa266a00beb5f94dada56dea624ea2d3640a5b922163
- Archive
ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.tar.gz - Archive SHA-256 nowf6b94829ae292214de9ac87f57ab782cae7ff4ba6b3fa3c1e024cbc9be624527
- Pins record
docs/PINS.md,docs/provenance/PINS.jsonin the archive (since 2026-11-03T00:28:31Z) - Generated2026-11-02T23:33:35Z by KitForge release/build_trail.py
- Sections9 sections, 4 fully recorded; 11 items not recorded
Signed with the release key The trail's signature is a Sigstore bundle beside it. Check it is ours before you rely on it:
cosign verify-blob --key https://readystack.dev/keys/cosign.pub \ --bundle ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.trail.json.sigstore ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.trail.json
IdentityWhy this release existsThe path through the harnessModel work per stageReviewDefectsVerificationPublicationPackages and CPU level
Identity
1 item not recorded- ProductCanvas LMS (canvas) [MANIFEST.json]
- Release tag2026-05-20.143-CE-ubuntu24.04-r2 [MANIFEST.json]
- Imagereadystack/canvas:2026-05-20.143-CE-ubuntu24.04-r2 [MANIFEST.json]
- Image index digestsha256:79b1ec971c178dd8c078b5cdb7099b5bb3514f5352c02619a1b3b8b1b4bcaf8c [docs/provenance/LOCKED_DIGEST.txt]
- linux/amd64 image digestsha256:3535e722ffb3d4e850e8aa266a00beb5f94dada56dea624ea2d3640a5b922163 [ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.rebuild.json, subject.image_manifest_digest]
- ArchiveReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.tar.gz (bytes 1006396097) [MANIFEST.json]
- Archive sha256 at publish11f0b26c637927aa8c84214a7bb580bdb98aaf697996ae7f40def9ff76b473ee [MANIFEST.json, repack_history[0].previous_tarball_sha256]
- Archive sha256 now3130d80f0bdb50aa518df25d7cfbe572db139c3544a7ffc9cc6127a361fc79c6 [MANIFEST.json, tarball_sha256]
- Archive records agreeyes [MANIFEST.json, PUBLISH_MANIFEST.json and .cutover.json name the same sha256]
- Repack history
- at 2026-11-01 · label kitfix · reason customer kit files brought up to the current engine: BUILD_OFFLINE.sh (kit root, docs/offline, docs/docker); the header of BUILD_OFFLINE.sh no longer says a --provenance rebuild meets a SLSA build level, comment lines only; not image inputs; image and every build input unchanged · previous sha256 11f0b26c637927aa8c84214a7bb580bdb98aaf697996ae7f40def9ff76b473ee · sha256 3130d80f0bdb50aa518df25d7cfbe572db139c3544a7ffc9cc6127a361fc79c6 · replaced BUILD_OFFLINE.sh, docs/docker/BUILD_OFFLINE.sh, docs/offline/BUILD_OFFLINE.sh, rebuild.json
- Upstream repositoryhttps://github.com/instructure/canvas-lms [docs/provenance/SOURCE_TREE_HASH.json]
- Upstream refrelease/2026-05-20.143 [docs/provenance/SOURCE_TREE_HASH.json]
- Upstream commit2e2b4a46d08e32667d4845f7b78e1214250345d3 [docs/provenance/SOURCE_TREE_HASH.json]
- Source tree hash222ae1df10656048500098d09530d7337d8bb8fb99e7e3676629165870c2e1af (files 22662) [docs/provenance/SOURCE_TREE_HASH.json, tree_listing_sha256 (sha256 of the sorted file listing)]
- Kit tree hashsha256:d9a7e28bd451197589b2d0c490ca2db48341a22b022a14899b1c3d7daa8287c5 [ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.rebuild.json, inputs.tree_hash]
- SOURCE_DATE_EPOCH1777557004 (utc 2026-04-30T13:50:04Z) [ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.rebuild.json, inputs.source_date_epoch]
- Base images
- ref ubuntu:24.04@sha256:fe81560990fae86dc4743202b2cb4d3df98d0bcf949173cecef15ce1127ef852 · platform digest sha256:78d4744ead1f5b19b04d0df558ab182a5300903900755e515b2ca4d10eb2044d
- BuildKitmoby/buildkit:v0.31.2 (image digest sha256:e0e67ea9c4bb07bdef683e29f70f3b623d1eb9c82274a9ec04e6bb0511449fb0) [ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.rebuild.json, engine]
- Not recorded: the engine commit(s) that built it (drive_runs records them for drives from 2026-11-02; this release's drives were rebuilt from line logs, which do not name it)
Why this release exists
Fully recorded- Chain679 (created 2026-10-27T09:17:49Z · trigger customer_request · upstream version 2026-05-20.143) [chains, chains #679]
- Requestbuild request #356 (rebuild) (requested at 2026-10-27T02:36:25Z · requested by kitforge-agent · version 2026-05-20.143) [build_requests, build_requests #356]
- Reasonrevision 2026-05-20.143-CE-ubuntu24.04-r2: same upstream version rebuilt (retarget.py --rev-bump) [build_requests, build_requests #356 request_reason]
- Supersedesreadystack/canvas:2026-05-20.143-CE-ubuntu24.04-r1 (chain 617) [chains, chains #617]
The path through the harness
2 items not recorded1 chain · 9 drives · 18 stages · 6 rewinds
Chain 679 release · shipped
Created 2026-10-27T09:17:49Z, upstream 2026-05-20.143, build request 356 [chains, chains #679]
| Drive | Started | Minutes | Build host | How it stopped |
|---|---|---|---|---|
| 958 | 2026-10-27T09:20:25Z | 82.3 | build host 5 withhold-publish | stage_failed at package_archive [drive_runs, drive_runs #958] rebuilt from a build line's log |
| 965 | 2026-10-27T12:16:53Z | 32.5 | build host 5 withhold-publish | ready_to_ship [drive_runs, drive_runs #965] rebuilt from a build line's log |
| 979 | 2026-10-27T16:46:09Z | 17.1 | build host 5 withhold-publish | ready_to_ship [drive_runs, drive_runs #979] rebuilt from a build line's log |
| 997 | 2026-10-28T03:36:20Z | 10.7 | build host 5 publish-held | stage_failed at package_archive [drive_runs, drive_runs #997] rebuilt from a build line's log |
| 1019 | 2026-10-29T19:53:00Z | 115.5 | build host 5 withhold-publish | ready_to_ship [drive_runs, drive_runs #1019] rebuilt from a build line's log |
| 1021 | 2026-10-29T22:35:40Z | 14.9 | build host 5 withhold-publish | ready_to_ship [drive_runs, drive_runs #1021] rebuilt from a build line's log |
| 1023 | 2026-10-29T23:29:29Z | 15 | build host 5 withhold-publish | ready_to_ship [drive_runs, drive_runs #1023] rebuilt from a build line's log |
| 1026 | 2026-10-30T00:14:43Z | 15.1 | build host 5 withhold-publish | ready_to_ship [drive_runs, drive_runs #1026] rebuilt from a build line's log |
| 1028 | 2026-10-30T01:33:39Z | 20.3 | build host 5 publish-held | shipped [drive_runs, drive_runs #1028] rebuilt from a build line's log |
Stages, in order
| Stage | First start | Passed | Attempts | Gate checks passed | Artifacts (SHA-256) |
|---|---|---|---|---|---|
intake |
2026-10-27T09:20:30Z | 2026-10-27T09:20:31Z | 1 | 4
|
— |
acquire |
2026-10-27T09:21:01Z | 2026-10-27T09:21:02Z | 1 | 12
|
— |
plan |
2026-10-27T09:21:41Z | 2026-10-27T09:21:42Z | 1 | 10
|
— |
assemble_kit |
2026-10-27T09:38:19Z | 2026-10-29T20:40:06Z | 2 | 27
|
— |
remediate |
2026-10-27T09:39:12Z | 2026-10-29T20:40:09Z | 2 | 8
|
— |
build_kit |
2026-10-27T10:07:00Z | 2026-10-29T21:07:13Z | 2 | 9
|
— |
verdict |
2026-10-27T10:16:14Z | 2026-10-29T21:12:04Z | 2 | 8
|
— |
publish_image |
2026-10-27T10:19:41Z | 2026-10-29T21:14:04Z | 2 | 7
|
— |
boot_instance |
2026-10-27T10:22:28Z | 2026-10-29T21:16:42Z | 4 | 3
|
— |
sbom |
2026-10-27T10:23:53Z | 2026-10-29T21:17:47Z | 2 | 5
|
— |
schema_discovery |
2026-10-27T10:23:56Z | 2026-10-29T21:17:50Z | 2 | 7
|
— |
admin_handbook |
2026-10-27T10:30:41Z | 2026-10-29T21:17:56Z | 2 | 7
|
— |
db_handbook |
2026-10-27T10:36:54Z | 2026-10-29T21:18:05Z | 2 | 8
|
— |
seed_data |
2026-10-27T10:37:06Z | 2026-10-29T21:18:15Z | 2 | 6
|
— |
seed_validate |
2026-10-27T10:37:09Z | 2026-10-29T21:18:17Z | 2 | 3
|
— |
usecase_validate |
2026-10-27T10:37:39Z | 2026-10-29T21:18:30Z | 2 | 10
|
— |
finalize_docs |
2026-10-27T10:41:49Z | 2026-10-29T21:18:36Z | 2 | 9
|
— |
package_archive |
2026-10-27T10:42:40Z | 2026-10-30T01:53:52Z | 9 | 33 (final gate PASS)
|
— |
[stage_runs]
Rewinds
- 2026-10-28T03:35:47Z:
package_archivetopackage_archiveon docs_redo (scripts/redo-docs.py) [stage_events, stage_events #1181] - 2026-10-29T19:53:10Z:
package_archivetoassemble_kiton strategy_changed (chain 679: strategy changed — rewound from 'package_archive' to assemble_kit and dropped the vendored tree so the change actually reaches the build.) [stage_events, stage_events #2364] - 2026-10-29T22:30:44Z:
package_archivetopackage_archiveon docs_redo (scripts/redo-docs.py) [stage_events, stage_events #2000] - 2026-10-29T23:24:23Z:
package_archivetopackage_archiveon docs_redo (scripts/redo-docs.py) [stage_events, stage_events #2001] - 2026-10-30T00:09:01Z:
package_archivetopackage_archiveon docs_redo (scripts/redo-docs.py) [stage_events, stage_events #2002] - 2026-10-30T01:33:11Z:
package_archivetopackage_archiveon docs_redo (scripts/redo-docs.py) [stage_events, stage_events #1218]
- Not recorded: each drive's ticks and first failed check (drive_runs records them for drives from 2026-11-02; these drives were rebuilt from line logs)
- Not recorded: the sha256 of each stage's artifacts (stage_events records them for stages passed from 2026-11-02; this chain's events were rebuilt from stage_runs and logs) — the archive's CHECKSUMS.sha256 lists the sha256 of every file it ships
Model work per stage
3 items not recordedRole: writer model. Calls up to 2026-10-30T01:53:52Z.
100 calls over 6 stages
| Stage | Calls | Refused | Errors | Max attempt | Forced commits | Real tokens | Lesson rules shown |
|---|---|---|---|---|---|---|---|
plan | 2 | 0 | 0 | 1 | not recorded | not recorded | — |
remediate | 2 | 0 | 0 | 1 | not recorded | not recorded | — |
admin_handbook | 31 | 3 | 0 | 2 | not recorded | not recorded | — |
db_handbook | 37 | 8 | 0 | 3 | not recorded | not recorded | — |
usecase_validate | 2 | 0 | 0 | 1 | not recorded | not recorded | — |
finalize_docs | 26 | 2 | 0 | 2 | not recorded | not recorded | — |
[micro_step_runs]
- Not recorded: forced commits (micro_step_runs records them for calls from 2026-11-02)
- Not recorded: real token counts (recorded per call from 2026-11-02; earlier rows hold only an estimate, which is not shown)
- Not recorded: the lesson rules shown to the writer model (lesson_recalls holds no rows for this chain: its recorder was silent from 2026-06-06 to 2026-11-02)
Review
3 items not recordedRole: review model.
7 rounds, 6 counted, $16.90 recorded cost
| Round | Started | Critical | Major | Minor | Verdict | Cost | Cap in force | Archive reviewed |
|---|---|---|---|---|---|---|---|---|
| 1 not counted | 2026-10-27T12:51:27Z | — | — | — | blocked to blocked [held_rounds, held_rounds #9] rebuilt from a held-review state file | — | not recorded | not recorded |
| 2 | 2026-10-27T14:17:39Z | 0 | 4 | 16 | blocked to blocked [held_rounds, held_rounds #10] rebuilt from a held-review state file | $2.34 | not recorded | not recorded |
| 3 | 2026-10-27T17:04:21Z | 0 | 0 | 19 | clean to publish [held_rounds, held_rounds #11] rebuilt from a held-review state file | $2.72 | not recorded | not recorded |
| 4 | 2026-10-29T21:49:50Z | 0 | 2 | 10 | findings to repackage [held_rounds, held_rounds #12] rebuilt from a held-review state file | $2.11 | not recorded | not recorded |
| 5 | 2026-10-29T22:52:25Z | 0 | 2 | 15 | findings to repackage [held_rounds, held_rounds #13] rebuilt from a held-review state file | $3.55 | not recorded | not recorded |
| 6 | 2026-10-29T23:45:02Z | 0 | 1 | 7 | findings to repackage [held_rounds, held_rounds #14] rebuilt from a held-review state file | $2.25 | not recorded | not recorded |
| 7 | 2026-10-30T00:31:42Z | 0 | 0 | 3 | clean to publish [held_rounds, held_rounds #15] rebuilt from a held-review state file | $3.94 | not recorded | not recorded |
Overrides
max_rounds: — to 7; by not recorded; why: not recorded predates override recording (2026-11-02): found in runstate/held-auto/canvas.json, last written 2026-10-30T01:32Z; who set it, why, when and the value before are not known [review_overrides, review_overrides #1]
- Not recorded: the sha256 of the archive each round reviewed (held_rounds records it for rounds from 2026-11-02; these rounds were rebuilt from state files)
- Not recorded: the round cap in force at each round (the state files did not keep it)
- Not recorded: who raised max_rounds to 7 and why (review_overrides #1 was backfilled from a state file; overrides are recorded with who and why from 2026-11-02)
Defects
Fully recorded- Ledger entries81 [defects, defects where product_slug=canvas and this tag or chain]
- Disclosed in the archive80 [docs/defects/defects.json, entries]
81 ledger entries: by severity medium 2, critical 1, high 9, low 69; by status fixed-before-release 79, fixed-in-release 1, open 1.
| Defect | Severity | Status | Found by | Fixed in |
|---|---|---|---|---|
RSD-canvas-5aa740820eThe Docker Hub run example passes CANVAS_LMS_ADMIN_PASSWORD with -e, so the administrator password stays in the container's environment after setup [defects, defects #108140] | medium | fixed-before-release | agent case study | — |
RSD-canvas-7b9e7018eeOffline rebuild does not reproduce the published image digest [defects, defects #108692] | critical | fixed-before-release | clean-room rebuild | — |
RSD-canvas-021fd9776dRelease notes: The Reproducibility paragraph states the offline rebuild reaches the identical digest, while the Known issues of the same file list a critical open row saying the offline rebuild does not reproduce… [defects, defects #112566] | high | fixed-before-release | held review (review model) | — |
RSD-canvas-25c92773b1API guide: Tells the customer to remove the encryption keys from the container environment after setup. [defects, defects #112567] | high | fixed-before-release | held review (review model) | — |
RSD-canvas-b692a288d0Admin handbook: The example runs a bare new container with no network, no CANVAS_DATABASE_*/CANVAS_REDIS_URL/CANVAS_ENCRYPTION_KEY and no -it. [defects, defects #112568] | high | fixed-before-release | held review (review model) | — |
RSD-canvas-8ff9b24efcDatabase handbook: The default is true, not false (the same handbook says "CANVAS_SSL (default true)" at line 186 and in the Domain and tls fact). [defects, defects #112569] | high | fixed-before-release | held review (review model) | — |
RSD-canvas-8855d83789Admin handbook: CANVAS_SSL=false does not prevent sign-in; the documented start command uses it. [defects, defects #112570] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-765a9c34b0Database handbook: Plain HTTP is not rejected: it is answered 200 without a session cookie, which line 581 of the same handbook states ("no redirect, no error"). [defects, defects #112571] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-1a69077799Database handbook: Contradicts the same handbook (lines 485, 755, 988) and the measured behaviour. [defects, defects #112572] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-7f6fe64a01Database handbook: With CANVAS_SKIP_MIGRATE=1 the entrypoint skips both rake steps and execs Puma regardless of pending migrations; it never refuses to start. [defects, defects #112573] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-b0d3790890Database handbook: The image contains setuid binaries. [defects, defects #112574] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-e76bed8d15Database handbook: A restart keeps the container's environment, so the old first-start password stays in `docker inspect` and /proc; only recreating the container removes it (as the Operating facts say). [defects, defects #112575] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-693a43abaeDatabase handbook: Sessions are signed cookies (lines 458 and 566 of the same handbook), not stored in PostgreSQL. [defects, defects #112576] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-1ef3ef7c04Database handbook: The entrypoint does not read CANVAS_DATABASE_HOST, CANVAS_REDIS_URL or CANVAS_DOMAIN into security.yml; that file holds only the encryption keys and the lti issuer, and the same handbook says at… [defects, defects #112577] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-de6828c42cAdmin handbook: The image does not set CANVAS_JOB_WORKERS; the default of 2 comes from config/delayed_jobs.yml. [defects, defects #112578] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-443ebe9d4cAdmin handbook: A waiting jobs container does not exit; it loops with a 10-second sleep. [defects, defects #112579] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-66024d1530Admin handbook: Authentication is keyed on CANVAS_SMTP_USER_NAME alone (the password defaults to empty); "set both" contradicts the next bullet and the same section's earlier text. [defects, defects #112580] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-a2ef33b95cAPI guide: GET / and GET /login/canvas need no token; the guide says so itself ("All endpoints except /health_check and /login/canvas require authentication", line 481). [defects, defects #112581] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-82e303e077API guide: Contradicts the token sections of the same guide (lines 549, 572, 600): an expiration date can be set and Canvas then refuses the token. [defects, defects #112582] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-dc17dfe438API guide: With CANVAS_SSL=false (the documented run command) the session cookie is issued over plain HTTP and sign-in works. [defects, defects #112583] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-f6facd3e14API guide: Docs audit: the guide never names the runtime user; IMAGE_CONFIG.json User is "canvas". [defects, defects #112584] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-3b691e7fdbAdmin handbook: Nothing writes the keys into security.yml: it is an ERB file evaluated from the environment, and the handbook says "read from config/security.yml" at lines 331 and 751. [defects, defects #112585] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-8d4c355c69Release notes: A Known issues row quotes the round-2 review finding about this file. [defects, defects #116802] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-5a3683bc99Admin handbook: The published patch is not a single-line file: it is 438 lines and changes two upstream files. [defects, defects #116803] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-67f75dac9bAdmin handbook: 'One modification' understates the patch and the image label's own disclosure (lockfile changes, removed directories). [defects, defects #116804] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-af72d74c7dDatabase handbook: Same understatement: the diff also changes Gemfile.lock. [defects, defects #116805] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-b67f84c20cAPI guide: Same understatement: the diff also changes Gemfile.lock (and line 112 of this guide already mentions the gepub update). [defects, defects #116806] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-91345cb258Database handbook: Perl is in the image, so 'language runtime beyond Ruby' is false. [defects, defects #116807] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-6e42de8d4aAdmin handbook: The sentence promises --entrypoint and the block that follows is `docker exec -it canvas rails console`; the two disagree. [defects, defects #116808] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-646310d873Admin handbook: The bare `docker run IMAGE web` shown does not start a web server. [defects, defects #116809] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-21731d4983Database handbook: Under 'Starting the web server' the bare command exits at once. [defects, defects #116810] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-b364ffaf2aDatabase handbook: The bare command exits 64 before the worker starts. [defects, defects #116811] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-404204e5f0API guide: Canvas answers 403 unless the setting is on. [defects, defects #116812] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-32b87a8991API guide: The records do not show courses or users/self verified by the build: validation/test-results.json records /api/v1/courses as 'pruned-needs-credentials-401' (not exercised) and has no users/self… [defects, defects #116813] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-478d70a75cAPI guide: GET / needs no token (line 198 of the same guide says so); measured: unauthenticated GET / -> 302 Location /login. [defects, defects #116814] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-61c9f092bfAPI guide: The Purpose given to /login/canvas is the title of the build's separate GET / check; the page is the sign-in form, not an API gateway. [defects, defects #116815] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-a293d4fec6Database handbook: The entrypoint checks three variables; the list names only two here, while lines 597 and 605 of the same handbook name three. [defects, defects #116816] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-526e8d76f7Admin handbook: 142 s is 2 min 22 s, not 2 min 40 s; the same handbook states 142 s and 111 s at lines 163, 319 and 739. [defects, defects #116817] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-7b02d72051Database handbook: Every other statement of this key in the three guides, the Operating facts and security.yml say it encrypts the tokens; this section's heading and sentence say it signs them. [defects, defects #116818] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-f3dffa4cfcAdmin handbook: The API guide (lines 157, 549, 590) says the expiration date is optional and that a token without one does not expire. [defects, defects #116819] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-e9a119343bDatabase handbook: The documented start command mounts a named volume (canvas-files), which has no host path to copy to; files copied in as root are not writable by uid 9999. [defects, defects #116820] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-6b72baa175CVE-2026-111497 in libbrotli1 1.1.0-2build2 is on CISA's Known Exploited Vulnerabilities list [defects, defects #139738] | medium | fixed-in-release | image scan | 2026-05-20.143-CE-ubuntu24.04-r2 |
RSD-canvas-4cf0e7f754API guide: Not true for the administrator this guide tells the reader to use: a token created without an expiration date expires after one week, so an integration built on it stops working with 401. [defects, defects #140686] | high | fixed-before-release | held review (review model) | — |
RSD-canvas-dbc06bd35fAPI guide: Not true for the administrator this guide tells the reader to use: a token created without an expiration date expires after one week, so an integration built on it stops working with 401. [defects, defects #140687] | high | fixed-before-release | held review (review model) | — |
RSD-canvas-59479ab479API guide: Presents the expiration date as optional for any user; students must set one (tokens_controller.rb:119-127) and an administrator's token without one still expires after a week. [defects, defects #140688] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-327fbd60fdDatabase handbook: Round 3 finding not fixed: this sentence says the keys sign the JSON web tokens, every other statement (and the curated fact) says the JWT key encrypts them. [defects, defects #140689] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-0bf1e7e6f8Database handbook: Round 3 finding not fixed: heading calls the key a signing key while the section text and all other documents say it encrypts the tokens. [defects, defects #140690] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-066389d304Database handbook: Round 3 understatement persists: names only the Gemfile.d/app.rb line although the diff also changes Gemfile.lock and the build removes directories. [defects, defects #140691] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-05d313257aDatabase handbook: 'The modification' (singular) understates the diff, which also changes Gemfile.lock. [defects, defects #140692] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-1acbca477dAPI guide: Round 3 understatement persists: the diff also changes Gemfile.lock. [defects, defects #140693] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-6bb95f3382API guide: Contradicts lines 198 and 211: GET / needs no token. [defects, defects #140694] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-c16afbeabeAPI guide: Same contradiction: GET / needs no token. [defects, defects #140695] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-332ce8c874Admin handbook: Names two of the three variables the entrypoint requires on a first start. [defects, defects #140696] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-3be5d38747Admin handbook: Says the web container requires the JWT key; line 997 and the entrypoint say it is optional. [defects, defects #140697] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-9cc81b2387API guide: False for the administrator this guide tells the reader to use: the date entered is honoured only when it is earlier than one week after creation, so an integration built on a token with a date… [defects, defects #141224] | high | fixed-before-release | held review (review model) | — |
RSD-canvas-dad6862ce8Database handbook: The two listed items are not all of the state a restore needs. [defects, defects #141225] | high | fixed-before-release | held review (review model) | — |
RSD-canvas-f802fd11dcAPI guide: Implies that an administrator who sets a date keeps the token until that date; the one-week cap applies to a date too. [defects, defects #141226] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-c095e5a472API guide: Presents the date as a way around the one-week expiry for the administrator; a later date is capped to one week. [defects, defects #141227] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-5eee0982c1API guide: Same one-week cap omitted for a date set by the site administrator. [defects, defects #141228] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-c6f30b04f3Admin handbook: Same one-week cap omitted; a reader who sets a long expiration date for an integration still loses the token after a week. [defects, defects #141229] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-65d0207b22API guide: The section the reader is told to scroll to does not exist under that name. [defects, defects #141230] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-c1db6999d6API guide: Same: no 'Access Tokens' section on the settings page. [defects, defects #141231] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-3bf7c70186API guide: Same: no 'Access Tokens' section on the settings page. [defects, defects #141232] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-30dc37b82dAPI guide: Presented as a common pattern of this API, but the only list endpoint the guide documents ignores them. [defects, defects #141233] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-3ebce7c6b0API guide: No record of this release shows a Canvas dashboard that reports API usage; what the API returns is the X-Rate-Limit-Remaining / X-Request-Cost headers (measured: x-rate-limit-remaining: 600.0,… [defects, defects #141234] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-a6ce6f30acAPI guide: Round 4 finding not fully fixed: 'The modification' (singular) still understates the diff, which changes two files (Gemfile.d/app.rb and Gemfile.lock) and the build removes directories. [defects, defects #141235] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-714171d164Docker Hub README: Round 3/4 understatement persists: the line names only the Gemfile.d/app.rb line although the diff also changes Gemfile.lock and the build removes directories. [defects, defects #141236] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-07ac7263d7Database handbook: Lists the JWT key as something the jobs container requires; round 4 finding paraphrased: the entrypoint requires only CANVAS_ENCRYPTION_KEY (20+ characters) and the JWT key is optional (security.yml… [defects, defects #141237] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-1700e77d2fAdmin handbook: Unsupported and contradicted by measurement; also contradicts line 884 ('continues to process jobs'). [defects, defects #141238] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-9aef3c8efbDatabase handbook: Unsupported 'cannot function correctly'; a queued job ran with Redis down. [defects, defects #141239] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-2d9755fff7Database handbook: 'Much faster' is not what the documents' own measurements show (142 s first start, 111 s restart). [defects, defects #141240] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-6dad251786Database handbook: A reader who plans backups from this paragraph omits the encryption key; the restored database then cannot be used with a new key. [defects, defects #141904] | high | fixed-before-release | held review (review model) | — |
RSD-canvas-f46ba58308Database handbook: 'The only data kept outside the database' and 'the database backups handle everything else' are false for the encryption key; same class as the line 397 finding. [defects, defects #141905] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-4d67e1068eAPI guide: Round 5 one-week-cap finding paraphrased in the Token Expiration subsection: for the administrator the guide tells the reader to use, a later date does not keep the token until that date. [defects, defects #141906] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-cad0b53da7API guide: Same one-week cap omitted as in the round 5 findings; this paragraph follows line 590 but contradicts it for a later date. [defects, defects #141907] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-651c6ccb48API guide: The only filtering example is a request that does not filter: 'active' is not a course state and the parameter is state[]. [defects, defects #141908] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-7e9883800aAPI guide: No response header reports when the limit resets; the sentence promises information Canvas does not send. [defects, defects #141909] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-f0f2520212API guide: Round 5 'JWT key required' finding paraphrased: the lead-in tells the reader to set two keys while the list marks one optional. [defects, defects #141910] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-b49ddbc643Docker Hub README: The Docker Hub README names only the Gemfile.d/app.rb line although the diff also changes Gemfile.lock and the build removes spec/, .github/ and the workspace package.json files. [defects, defects #141911] | low | open | held review (review model) | — |
RSD-canvas-d098900f98Database handbook: Same class as the round 6 backup findings, repeated in the Redis section: the sentence says only PostgreSQL holds recoverable state, which omits the files volume and the encryption key that the… [defects, defects #142835] | low | fixed-before-release | held review (review model) | — |
RSD-canvas-5337ef40e3Admin handbook: The handbooks call Redis a disposable cache and describe starting over on an empty database, but do not say that a Redis left over from an earlier database makes db:initial_setup fail; the customer… [defects, defects #142836] | low | fixed-before-release | held review (review model) | — |
Verification
2 items not recorded- Reproduced before publishingyes (rebuilt digest sha256:3535e722ffb3d4e850e8aa266a00beb5f94dada56dea624ea2d3640a5b922163 · published digest sha256:3535e722ffb3d4e850e8aa266a00beb5f94dada56dea624ea2d3640a5b922163 · digest match yes · builder moby/buildkit:v0.31.2 · build seconds 780) [docs/provenance/REPRO_VERIFICATION.json, verified]
- Final contract gate (G8)PASS (checks cosign, scan_grade, tag_base_os, vex_shipped, scout_grade_a, script_copies, three_way_sha, offline_rebuild, rebuild_manifest, artifact_coverage, assetchain_coverage) [stage_runs, stage_runs chain 679 package_archive gate_result.g8.result]
- Grade at releaseA (percent 94 · docker grade B · docker percent 83 · tool docker scout policy 1.26.0 · config docker-default · org vex no · at 2026-10-30T01:34:47Z · failing Docker Scout counts 119 packages with copyleft licences (AGPL, GPL, LGPL, MPL), 111 of them operating-system packages (it counts only packages whose licence it can read; the SBOM lists every component). AGPL: academic_benchmarks. · corrections No outdated base images) [SCOUT_EVIDENCE.json, docker_scout_policy.corrected]
- First own scan of the releaseA (at 2026-10-30T01:55:00Z · score 100 · rubric cerodeo-v1 · fixable critical 0 · fixable high 0 · syft 1.54.1 · grype 0.120.1 · grype db v6.1.10@2026-10-29T06:23:34Z) [image_scans, image_scans #1574]
- Image signatureverified on the index and the linux/amd64 manifest (key fingerprint 04daa92344a52dbc · at 2026-10-30T01:33:47Z) [docs/provenance/IMAGE_EVIDENCE.json, signed]
- Image signature transparency-log entries
- log index 3576547486 · transparency-log entry
- log index 3576548464 · transparency-log entry
- rebuild.json signatureSigstore bundle, release key (key fingerprint 04daa92344a52dbc · log index 3621068065 · transparency-log entry · integrated 2026-11-01T05:19:10Z) [ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.rebuild.json.sigstore, verificationMaterial.tlogEntries[0]]
- Signed attestations
- kind provenance · digest sha256:79b1ec971c178dd8c078b5cdb7099b5bb3514f5352c02619a1b3b8b1b4bcaf8c · state attached · log index 3581735449 · transparency-log entry
- kind sbom · digest sha256:79b1ec971c178dd8c078b5cdb7099b5bb3514f5352c02619a1b3b8b1b4bcaf8c · state attached · log index 3581737389 · transparency-log entry
- kind vsa · digest sha256:79b1ec971c178dd8c078b5cdb7099b5bb3514f5352c02619a1b3b8b1b4bcaf8c · state attached · log index 3581740054 · transparency-log entry
- kind provenance · digest sha256:3535e722ffb3d4e850e8aa266a00beb5f94dada56dea624ea2d3640a5b922163 · state attached · log index 3581742830 · transparency-log entry
- kind sbom · digest sha256:3535e722ffb3d4e850e8aa266a00beb5f94dada56dea624ea2d3640a5b922163 · state attached · log index 3581745704 · transparency-log entry
- kind vsa · digest sha256:3535e722ffb3d4e850e8aa266a00beb5f94dada56dea624ea2d3640a5b922163 · state attached · log index 3581749153 · transparency-log entry
Offline clean-room rebuilds
- 2026-10-27T12:51:30Z on build host 5 (Docker-in-Docker daemon with --network none): bit for bit no, digest match no, customer verify no, first failure digest_match
rebuilt sha256:2906e116edd710712051d022b2946579a51c19ed54691044712cfcba3842ee29 [clean-room rebuild ledger, runs[456]] - 2026-10-27T14:17:43Z on build host 4 (Docker-in-Docker daemon with --network none): bit for bit yes, digest match yes, customer verify yes
rebuilt sha256:8eb2bcca4d1f167e72f8913e8906909b8da25420def326430e4f2aebc974e0ee [clean-room rebuild ledger, runs[464]] - 2026-10-29T21:49:54Z on build host 5 (Docker-in-Docker daemon with --network none): bit for bit yes, digest match yes, customer verify yes
rebuilt sha256:3535e722ffb3d4e850e8aa266a00beb5f94dada56dea624ea2d3640a5b922163 [clean-room rebuild ledger, runs[556]]
- Not recorded: the policy tool's --result-file itself (its per-policy results are copied into SCOUT_EVIDENCE.json and the archive's IMAGE_EVIDENCE.json; the file is not kept)
- Not recorded: the pins record (docs/PINS.md is not in this archive as generated; a repack that adds it is appended to this trail's history)
Publication
Fully recorded- Image pushed (internal tag), publish_image passed2026-10-29T21:14:04Z [stage_runs, stage_runs chain 679 stage publish_image]
- Release tag promoted2026-10-30T01:51:32Z (method imagetools_create_retag_by_digest_no_rebuild · digest sha256:79b1ec971c178dd8c078b5cdb7099b5bb3514f5352c02619a1b3b8b1b4bcaf8c · tag readystack/canvas:2026-05-20.143-CE-ubuntu24.04-r2) [deliverables/provenance/PROMOTION_RECORD.json, promoted_at]
- Archive manifests written2026-10-30T01:42:25Z [PUBLISH_MANIFEST.json, published_at]
- Archive cut over on prodasset, package_archive passed2026-10-30T01:53:52Z [stage_runs, stage_runs chain 679 stage package_archive]
- Cut-over markerpresent (chain 679) [.cutover.json]
- Release checklist and site event2026-10-30T01:53:50Z (status complete · site event 298 · steps grade a verified done · release tag promoted done · cosign signed done · release evidence recorded done · contract gate passed done · archive published done · hub readme live done · reproducibility recorded done · defects ledger published done · catalog available done · build request fulfilled done · seo regenerated skipped · site catalogue refreshed done · site grade recorded done · site queue synced done · customer requests charged done · owners notified done) [deliverables/provenance/RELEASE_CHECKLIST.json, run_at]
Packages and CPU level
Fully recorded- Packages in the image492 (scanned 2026-11-02T06:30:04Z · source backfill:daily-scan) [release_images, package_count]
- x86-64 level the image needsv1 (used v4 · baseline v2 · elf files 1044 · probed 2026-11-02T17:08:51Z · source backfill) [release_images, isa_level_hard]
History
2 events- 2026-11-02T23:33:35Z generated: by KitForge release/build_trail.py · generator commit 916780cc218cf013bd623a8c085aaf73d3b053d0 · note backfill: built after the release from its records
- 2026-11-03T00:28:31Z repack: previous sha256 3130d80f0bdb50aa518df25d7cfbe572db139c3544a7ffc9cc6127a361fc79c6 · sha256 f6b94829ae292214de9ac87f57ab782cae7ff4ba6b3fa3c1e024cbc9be624527 · reason customer kit files brought up to the current engine: every pinned input's reason (docs/PINS.md, docs/provenance/PINS.json) and docs/PROVENANCE.md's section pointing at it, rendered by release/pin_reasons.py; docs/PROVENANCE.md's 'Build trail' section pointing at the signed build trail beside the archive (release/build_trail.py); not image inputs; image and every build input unchanged · label kitfix · replaced docs/PROVENANCE.md · added docs/PINS.md, docs/provenance/PINS.json · record MANIFEST.json repack_history
Records
26 records| Record | Where it is | Rows |
|---|---|---|
docs/defects/defects.json | inside the archive (ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.tar.gz) | — |
docs/provenance/IMAGE_EVIDENCE.json | inside the archive (ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.tar.gz) | — |
docs/provenance/LOCKED_DIGEST.txt | inside the archive (ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.tar.gz) | — |
docs/provenance/REPRO_VERIFICATION.json | inside the archive (ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.tar.gz) | — |
docs/provenance/SOURCE_TREE_HASH.json | inside the archive (ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.tar.gz) | — |
.cutover.json | beside the archive (prodasset /data/production/canvas/2026-05-20.143-CE-ubuntu24.04-r2/) | — |
MANIFEST.json | beside the archive (prodasset /data/production/canvas/2026-05-20.143-CE-ubuntu24.04-r2/) | — |
PUBLISH_MANIFEST.json | beside the archive (prodasset /data/production/canvas/2026-05-20.143-CE-ubuntu24.04-r2/) | — |
ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.rebuild.json | beside the archive (prodasset /data/production/canvas/2026-05-20.143-CE-ubuntu24.04-r2/) | — |
ReadyStack-canvas-2026-05-20.143-CE-ubuntu24.04-r2.rebuild.json.sigstore | beside the archive (prodasset /data/production/canvas/2026-05-20.143-CE-ubuntu24.04-r2/) | — |
SCOUT_EVIDENCE.json | beside the archive (prodasset /data/production/canvas/2026-05-20.143-CE-ubuntu24.04-r2/) | — |
clean-room rebuild ledger | the clean-room rebuild ledger (runstate/audit-2026-09/bit4bit.json, not published) | — |
build_requests | sadb, ReadyStack's engine database (not published) | 356 |
chains | sadb, ReadyStack's engine database (not published) | 679 |
defects | sadb, ReadyStack's engine database (not published) | canvas 2026-05-20.143-CE-ubuntu24.04-r2 |
drive_runs | sadb, ReadyStack's engine database (not published) | chain 679 |
held_rounds | sadb, ReadyStack's engine database (not published) | chain 679 |
image_scans | sadb, ReadyStack's engine database (not published) | 1574 |
micro_step_runs | sadb, ReadyStack's engine database (not published) | chain 679 |
release_images | sadb, ReadyStack's engine database (not published) | canvas 2026-05-20.143-CE-ubuntu24.04-r2 |
review_overrides | sadb, ReadyStack's engine database (not published) | 1 |
stage_events | sadb, ReadyStack's engine database (not published) | chain 679 |
stage_runs | sadb, ReadyStack's engine database (not published) | chain 679 |
attestations.json | the chain's workspace on the controller (not published) | — |
deliverables/provenance/PROMOTION_RECORD.json | the chain's workspace on the controller (not published) | — |
deliverables/provenance/RELEASE_CHECKLIST.json | the chain's workspace on the controller (not published) | — |