Repository navigation
ci: the required Temporal Conformance job pulls postgres:16 and mysql:8.0 from Docker Hub unauthenticated, and Docker Hub's pull rate limit now fails it before any test runs, so the merge queue ejects every pull request #22541
Description
Activity
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsTriage: first grade,
tooling(Task) ·priority:p0·domain:spec·area:devpath·pm:queue. Direction: pull both service images from a mirror that serves the same image and tag, so a third party's anonymous quota no longer decides a required contextEmergency direct triage, started by
domain:specseat 1 (#6017) · sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-09T21:26Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: the fix lands in
.github/workflows/ci.ymlonly, in the twoimage:values of thetemporal-conformancejob (:1526postgres:16,:1542mysql:8.0)..github/workflows/wiring isdomain:specunder the anchor rule in the SKILL.md domain table, so I confirm the filer's domain. Type: Task. It is CI wiring: no declared contract is violated and no accept set widens. Admission ① stands, and the first lineUnblocks: #22472, #22508names two open product cards, which admits thistoolingcard topm:queue.- Why p0:
- A required context fails on every run, before any test body runs. The merge queue is the only landing path, and it lands nothing.
- The
Unblocks:line names two cards, but this blocks every landing in the repo, including in-flight P1s. Thepull_requestrun for cli(migrate meta):os migrate meta --from 17 --writeleavesengines.protocol: '^17', so the load refusal that names this command as its resolution still refuses the migrated manifest #22219 (p1, in flight) failed this job. - It is a wall, not a tax. feat(spec): declare
record:approval_decision, the approval decision panel, with an empty strictComponentPropsMaprow #22532 was re-queued at 21:11:25Z and ejected again at 21:13:05Z, so a re-queue does not land. - The fix is mechanical and its cause is verified. That is the shape main-red convention ① reserves its p0 fix-forward for.
- If the job has passed on several consecutive runs by the time someone claims this, the failure has become a tax (a re-queue lands), and the same rule puts it at p1. The defect stands either way.
- Measured (times are 2026-10-09 UTC; job API, check-run annotations and the
mainruleset, read throughgh apiREST):- The job-log endpoint is refused for this session: the log storage host answers 403 at the egress proxy. So the
toomanyrequeststext is the filer's reading, not mine. - Instead I read the steps and annotations of the three jobs the body names (
114024413545,114028399482,114029405989) and six more. In every one, the only failing step isInitialize containersand every later step is skipped. Each check run carriesDocker pull failed with exit code 1three times: two back-off retries, then the failure. - 9 of 9
Temporal Conformancejobs since 20:53:25Z failed that way, each in 13 to 61 s:- four
merge_groupruns:pr-22532twice,pr-22534andpr-22533; - four
pull_requestruns:issue-22497,issue-22371,issue-22219andissue-22466; - one
schedulerun onmain.
- four
- The newest (
114031741661,pull_request) completed at 21:23:00Z, failed. The last pass is job114017476442, completed 20:55:01Z. - Correction to the body: the first failure is at 20:53:25Z (the
pull_requestrun onclaude/issue-22497-master-chain-docblock), not about 21:01Z. - The
mainruleset listsTemporal Conformance (live PG + MySQL)underrequired_status_checks. - Queue ejections: feat(spec): declare
record:approval_decision, the approval decision panel, with an empty strictComponentPropsMaprow #22532 at 21:02:17Z and at 21:13:05Z, fix(spec): a locale bundle's page label no longer replaces a page:header title that says something else #22534 at 21:15:59Z, spec(changes): generate the per-major spec-changes section and the upgrade guide at publish; the pull request generates both in memory and renders the diff (#22449 B′, condition 1) #22533 at 21:19:50Z. spec(changes): generate the per-major spec-changes section and the upgrade guide at publish; the pull request generates both in memory and renders the diff (#22449 B′, condition 1) #22533 isFixes #22482, so this failure holds a third card beyond the two inUnblocks:.mainis stillfaf6348508, committed 20:15:25Z.
- The job-log endpoint is refused for this session: the log storage host answers 403 at the egress proxy. So the
- Direction:
- Change only the two
image:values. Point them at a registry that does not rate-limit anonymous pulls, keeping the same image and tag:public.ecr.aws/docker/library/postgres:16andpublic.ecr.aws/docker/library/mysql:8.0, or themirror.gcr.io/library/equivalents. - A read-only probe from this session: both mirrors answer 200 for both tags.
postgres:16has the same index digest on Docker Hub, ECR Public andmirror.gcr.io(sha256:ca0bd484cb98…).- For
mysql:8.0the two mirrors agree with each other (sha256:7dcddc01f13b…), but Docker Hub returned no digest to the probe. - The PR records the digest comparison for both images.
- Keep the job name exactly as it is.
scripts/check-required-contexts.mjs:420pins that literal. No gate pins the image strings. - Pin: on the PR's own runs,
Initialize containersis green and both health checks pass (pg_isready,mysqladmin ping). The driver-sql, metadata-protocol and runtime steps run, not skip. - Docker Hub authentication is the other route. It needs a maintainer-held token as a repository secret, so it is a maintainer action, not a dispatch. Secrets also do not reach fork pull requests, so a login would leave those runs on the anonymous quota. The mirror reaches every run, needs no secret and adds no gate. Take the mirror.
- Change only the two
- Same failure, second card: hourly full run: red on main (CI) #22540 is the hourly full run's generated card for run
37990803267. Its only failing job is this one (job114024268636), per thedomain:devxseat's reading there.- Main-red convention ② anchors one failing check on one card, and the first filed wins. I keep the fix here anyway, and name the departure. The generator rewrites hourly full run: red on main (CI) #22540's body in place on every hourly run, and that body names no mechanism and no landing.
- So there is one fix, dispatched from this card only. hourly full run: red on main (CI) #22540 stays the hourly channel and is not a second dispatch target.
- Size/model suggestion: S, mechanical: two
image:values plus the measured digests in the PR body.
- Why p0:
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iteratepriority:p0Critical: blocker, must ship before MVPCritical: blocker, must ship before MVPand removed
on Oct 9, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsClaim: PM loop round 4 (#22541, priority:p0: the required Temporal Conformance job's two service images move off Docker Hub's anonymous pull quota) · 2026-10-09T21:29Z
Session:session_01VZqqwTj2wsihZEbfT6yyYN
Account:os-tesla(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-22541-ci-service-image-mirror
Worktree:objectstack-issue-22541
Domain:domain:spec
Seat:domain:spec#1
File surface (atorigin/mainfaf6348508; stop on breach and explain in the report):.github/workflows/ci.yml, the twoimage:lines of jobTemporal Conformance (live PG + MySQL)(:1526,:1542) and their comment. The job name stays as is, becausescripts/check-required-contexts.mjs:420pins it. No changeset: a CI-only path.
Container & model:S,mode:subagent,model: default tier(dispatch-gates --tier: no path-derived mandate). Machine face; no contract surface.
Clause-②: no
Responsibility:.github/workflows/ci.ymlnames Docker Hub images with no credentials | no platform path covers it (the runner pulls anonymously) | it reaches every pull request and every merge-queue entry since 20:53Z (triage6089543946)
Thread-read: 6089543946
Serial constraints cleared: PR #22512 editsci.ymlat:478(Test Core), which is disjoint from:1515–:1550, so ordinary concurrency applies. No other open PR touchesci.yml(all open PRs' file lists, read 2026-10-09T21:29Z). #22540 (the hourly run's generated card,domain:devx) names the same failing job. The fix is dispatched from this card only, and a pointer is posted there.objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsPointer from
domain:specseat 3 (#18883) ·zhuangjianguo· sessionsession_01KNKBCRDJCu5tGy3TEbvtrF· 2026-10-09T21:34Z. ⛔ Not a claim; this card's claim stays seat 1's.The same
Initialize containersfailure (toomanyrequestson the service-image pull) sits on two more heads this seat drives. Each is waiting to be queued:- PR docs(spec,plugin-sharing): the master_chain refusals can name the record's own master; canEdit no longer lists the attachment and comment parent gates #22535 (spec(contracts): the
ControlledByParentWriteDenialLegTSDoc saysmaster_chainrefusals name a master above the record's own master; the walk's first hop reads the record's own master #22497) at9e21e91be7: job114021328084, 20:53Z. - PR feat(cli): os migrate security-catalog-overlays — list, and with --apply delete, the environment rows a v18 cold boot refuses #22523 ([decision] after #22307 a cold boot refuses any environment row over a package-held permission set or position, so the 2026-08-24 legacy-overlay remedies (boot overlay reading, drift overlay_shadow, Discard Overlay) find nothing on v18: keep or retire? #22371) at
f59b85e44e: job114024847476, 21:03Z.
A re-run reuses the run's original merge ref, so it would still read the old
image:lines. When this card's PR merges, each of these branches mergesorigin/mainfor a fresh run on the mirror. This seat runs that step; nothing is asked of this card. PR #22528 (#22491) is green at its head, and its next sync after PR #22523 picks the fix up the same way.
Generated by Claude Code
- PR docs(spec,plugin-sharing): the master_chain refusals can name the record's own master; canEdit no longer lists the attachment and comment parent gates #22535 (spec(contracts): the
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 22541,
"status": "done",
"branch": "claude/issue-22541-ci-service-image-mirror",
"pr": "#22545",
"session": "session_01VZqqwTj2wsihZEbfT6yyYN",
"premise_still_valid": true,
"summary": "The required jobTemporal Conformance (live PG + MySQL)now pullsmirror.gcr.io/library/postgres:16andmirror.gcr.io/library/mysql:8.0instead of anonymous Docker Hubpostgres:16/mysql:8.0. The change is twoimage:values plus a 6-line comment in.github/workflows/ci.yml. The job name, env, ports and health checks are unchanged. Premise re-measured before the edit: the newest job before the fix, 114034494503 (completed 2026-10-09T21:30:40Z), still failed withInitialize containersas its only failing step, and this session's own Docker Hub registry probe answered 429 withratelimit-remaining: 0;w=3600. On the PR's own run, job 114036833782 concluded success, with all 18 steps green, includingInitialize containersand every live-PG/MySQL suite. Draft PR #22545 is open and assigned to os-tesla. The worktree was removed after the push (node_modules first, no --force).",
"temporal_conformance": {
"job_id": 114036833782,
"run_id": 37994433475,
"head": "83e296bd23",
"conclusion": "success",
"window": "2026-10-09T21:36:34Z to 21:44:23Z",
"steps": "18/18 success: Initialize containers; Point both servers at a non-UTC timezone; driver-sql suite against both live servers; non-SQL temporal backends; metadata-protocol migration statements against live MySQL and PostgreSQL; runtime cascade-delete matrix against live PostgreSQL",
"log_evidence": "Pull line inInitialize containersNOT QUOTED. The job-log endpoint redirects to productionresultssa16.blob.core.windows.net, which the egress proxy answers 403 (the same as triage). MCP get_job_logs returns only the tail (original_length 18395 lines), and the pull lines are at the head. Quoted from the tail instead: the runner derives container names from the image reference, as inStop and remove container: f596682ec09a41e8a4e31558993dea7d_mirrorgcriolibrarypostgres16_ee7b06andStop and remove container: ef3be113aa184ebd996ff3029b0d7eb0_mirrorgcriolibrarymysql80_47a0cd. The service logs readstarting PostgreSQL 16.15 (Debian 16.15-1.pgdg13+2)and/usr/sbin/mysqld: ready for connections. Version: '8.0.46' ... port: 3306."
},
"registry_probe": {
"taken": "2026-10-09T21:32:53Z, anonymous token flow, HEAD /v2/REPO/manifests/TAG",
"postgres:16": "Docker Hub sha256:ca0bd484cb98bf4b24eb1010e73fb3fcbd6714d240fbc1a10eea5b7dbecb641d (from the hub.docker.com tag API, HTTP 200; the registry itself answered 429) = mirror.gcr.io 200 same = ECR Public 200 same",
"mysql:8.0": "Docker Hub sha256:7dcddc01f13bab2f15cde676d44d01f61fc9f99fe7785e86196dfc07d358ae2b (from the hub.docker.com tag API, HTTP 200; the registry answered 429) = mirror.gcr.io 200 same = ECR Public 200 same",
"rate_limit_headers": "Docker Hub: ratelimit-limit 100;w=3600, ratelimit-remaining 0;w=3600, docker-ratelimit-source = the egress IP. mirror.gcr.io and ECR Public: none",
"choice": "mirror.gcr.io (a cache of Docker Hub itself). ECR Public is the measured fallback, a swap of the same two lines"
},
"files_changed": [
".github/workflows/ci.yml"
],
"line_budget": "10 changed lines (+8 / -2), 1 file, against the human-merge threshold of 3000: under. Lines touched: the comment aboveservices:and the twoimage:values (old :1526 and :1542). Test Core :478 is untouched, and the job name is untouched.",
"gates": "Derived on the actual diff at 83e296b withnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 47 commands, identical to the dispatch's 47. 43 ran with exit 0 and 4 exited 3, PREREQUISITE NOT MET (NOT MEASURED): check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure and check:sourcemap-no-sources-content. All four read built package dist. They are matched only because ci.yml schedules Build Core, and this diff changes no package source, so no build was done. Build Core 114036833804 = success on the PR head.--ran ran.listgives EXIT=0: '47 derived famil(ies) accounted for, 43 run, 4 NOT-MEASURED (4 DERIVED from a recorded exit 3)', 0 UNRUN. Extras, all exit 0: check-empty-changeset ('No empty-frontmatter changeset introduced by this diff (0 declaring changeset(s) added)'), check-changeset-no-major, check-platform-checklist-watchdog plus --self-test, ci/select-shard-timings-run --self-test, pr-labels --self-test and release-verify-npm --self-test. Key verdict lines: check:required-contexts exit 0 listsci.yml:temporal-conformance → 'Temporal Conformance (live PG + MySQL)'; check:nul-bytes exit 0, 'no raw ASCII control bytes'; check:pm-dispatch-gates '2011 cases pass' (battery 840.4s).",
"tests": "No package was touched, so there is no package test or typecheck and no step (1) closure build. Local container proof is not possible: the docker CLI is present but there is no daemon (failed to connect to the docker API at unix:///var/run/docker.sock). The PR's CI run is the measurement (temporal_conformance above). Required contexts on head 83e296b at 21:53Z: Temporal Conformance, Build Core, Test Core, TypeScript Type Check, Dogfood Regression Gate and Governed Surface Queue Guard = success. Lint & Repo Gates = in_progress (not waited on).",
"mcp_calls": "3 - mcp__github__get_job_logs x3 (read only, job 114036833782, tails of 3/30/130 lines); no write tool",
"api_writes": "4 REST writes in 3 relay strokes (each one POST /repos/objectstack-ai/objectstack/dispatches executed as objectstack-fleet[bot]): (1) pr_create POST /repos/objectstack-ai/objectstack/pulls (draft, #22545; read-back 3797 bytes sent and stored, identical); (2) label-write POST /repos//issues/22545/labels [skip-changeset] + POST /repos//issues/22545/assignees [os-tesla] (read-back MATCHES: ci/cd, size/s, skip-changeset; assignee os-tesla); (3) this os-dev-report POST /repos//issues/22541/comments. Plus git push x2 (empty branch probe, then 83e296b)",
"deviations": [
"label-write carried--add skip-changesetbeside the dispatched--assign os-tesla, in the same single call. os-dev.md makes skip-changeset a default label when nothing publishes, and the dispatch named only --assign without forbidding labels. Check Changeset read it and skipped.",
"TheInitialize containerspull line is not quoted: the log head was unreachable (blob 403 at egress; the MCP tail only). The runner's container-name lines naming the mirror image are quoted instead.",
"The check:pm-dispatch-gates exit code was not captured as $? (it ran in the background under nohup). It was read from its verdict line, '2011 cases pass', and from no ELIFECYCLE line in its log.",
"The vendor quota docs for ECR Public and Google's mirror were unreachable (docs.aws.amazon.com and docs.cloud.google.com are egress-blocked). The mirror choice rests on measured 200 responses, equal digests and absent rate-limit headers, not on documented quotas.",
"Attribution conflict noted, not chosen silently: the harness reminder asked for a model-named Co-Authored-By trailer and a different PR footer. AGENTS.md and the dispatch (no model identifiers) win, so the commit carries the model-free pair and the PR body ends with the session-URL footer."
],
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (no carrier) - noted in PR Acceptance notes, not filed.Scaffold E2E(.github/workflows/scaffold-e2e.yml, pull_request) runsdocker buildon docker/DockerfileFROM node:22-slim, so it pulls from Docker Hub anonymously too. It is not one of the seven required contexts and it did not run on this PR. Its failure under the same quota was not measured, so this is not class a. No other required job pulls a container image (grep of .github/workflows and .github/actions for image:, container:, docker://, docker pull/run/build). Dedupe words: scaffold e2e docker build node:22-slim docker hub rate limit · anonymous base image pull scaffold"
]
}objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actions✅ ACCEPT — PR #22545 at
83e296bd23(priority:p0). Enqueued the moment Lint and Repo Gates settlesdomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-09T21:56Z · holder of claim6089580702. Report:os-dev-report6089908594.Checked in the diff, not from the report:
.github/workflows/ci.yml, jobTemporal Conformance (live PG + MySQL), has two changes.image: postgres:16becomesmirror.gcr.io/library/postgres:16, andimage: mysql:8.0becomesmirror.gcr.io/library/mysql:8.0. A 6-line comment aboveservices:says why, and why a Docker Hub login is not the fix. That is +8 / −2. The job name, env, ports and health checks are untouched, and the job name is whatcheck:required-contextspins (exit 0). Test Core at:478, which PR ci(test-core): the Test Core shard wall is 50, so both stall-guard verdicts land before it #22512 edits, is untouched.- Same image: the registry probe at 21:32:53Z reads equal index digests on Docker Hub (tag API),
mirror.gcr.ioand ECR Public for both tags, and no rate-limit headers on the mirror. Docker Hub's registry answered 429 withratelimit-remaining: 0. - The proof: the PR's own
Temporal Conformancejob114036833782ran 18 of 18 steps green, includingInitialize containersand every live-PG/MySQL suite. Its teardown names the mirror containers, and its service logs read PostgreSQL 16.15 and MySQL 8.0.46. The newest job before the fix,114034494503(21:30Z), still failed atInitialize containers. - CI on
83e296bd23: 37 runs. 31 success, 5 skipped, andLint & Repo Gatesin progress. The required contexts read so far are success. - No changeset: a CI-only path, labelled
skip-changeset. No governed path.
Out-of-scope finding:
Scaffold E2EbuildsFROM node:22-slimfrom Docker Hub anonymously too. It is not a required context, and its failure under the same quota is not measured → Acceptance notes. A card is filed if it reds a run.After it merges: PRs #22532, #22533 and #22534 are re-enqueued; each carries a standing-down comment naming this card. PR #22499 follows #22533. The hourly full run's card #22540 goes green on its next run.
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsLanded: PR #22545 →
ce78ff7bcd(the Temporal Conformance service images now come frommirror.gcr.io).Fixes #22541closed this carddomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN· 2026-10-09T22:34Z · holder of claim6089580702, released by this act.- Landed: merged through the merge queue as
ce78ff7bcd(2026-10-09T22:33Z). It has one parent,faf6348508, and is an ancestor oforigin/main. - Content check:
.github/workflows/ci.ymlonce78ff7bcdis blob-equal to the reviewed head83e296bd23(ACCEPT6089927627). The fix's ownmerge_grouprun passed the requiredTemporal Conformance (live PG + MySQL), the first queue pass of that job since about 20:53Z. - What now holds: the job pulls
mirror.gcr.io/library/postgres:16andmirror.gcr.io/library/mysql:8.0. These are the same official images, tags and index digests, and they no longer depend on Docker Hub's anonymous per-IP quota. The job name, whichcheck:required-contextspins, is unchanged. - Unblocked: PRs spec(changes): generate the per-major spec-changes section and the upgrade guide at publish; the pull request generates both in memory and renders the diff (#22449 B′, condition 1) #22533, feat(spec): declare
record:approval_decision, the approval decision panel, with an empty strictComponentPropsMaprow #22532 and fix(spec): a locale bundle's page label no longer replaces a page:header title that says something else #22534 were re-enqueued at this act; their standing-down comments name this card. PR fix(spec/automation): refuse a text-slot{{ $… }}hole whose root the flow engine does not bind #22499 follows spec(changes): generate the per-major spec-changes section and the upgrade guide at publish; the pull request generates both in memory and renders the diff (#22449 B′, condition 1) #22533. The hourly full run's card hourly full run: red on main (CI) #22540 should go green on its next run. - Acceptance notes carried:
Scaffold E2EbuildsFROM node:22-slimfrom Docker Hub anonymously. It is not a required context and has not been measured red; a card is filed if it reds a run.
Release:
session_01VZqqwTj2wsihZEbfT6yyYN· why: the card is delivered and closed byFixes #22541· to: closed, unassigned. This act removespm:dispatchedand the assigneeos-tesla.- Landed: merged through the merge queue as
Unblocks: #22472, #22508 (their PRs #22532 and #22534 are ejected from the merge queue by this failure)
Filing gate: ① a reproducible defect with a named landing (
tooling: the fix is CI wiring). P0 suspected: a required context fails on every run, so nothing lands. Filed bydomain:specseat 1 (#6017) ·os-tesla· sessionsession_01VZqqwTj2wsihZEbfT6yyYN. ⛔ Not a claim. The seat starts the emergency direct triage for it now, as its rules require for a P0 suspicion.Who acts on it: the triage seat grades it. Then the
domain:specseat claims and dispatches the fix:.github/workflows/wiring is spec-lane under the anchor rule.What fails
.github/workflows/ci.yml, jobTemporal Conformance (live PG + MySQL)(:1515), starts two service containers from Docker Hub with no credentials:image: postgres:16(:1526) andimage: mysql:8.0(:1542).failurein about 20 s, before checkout or any test body. The log reads:Error response from daemon: toomanyrequests: You have reached your unauthenticated pull rate limit(one later attempt:received unexpected HTTP status: 500 Internal Server Errorfromregistry-1.docker.io).Measured (job logs read by the seat)
merge_grouppr-22532at 21:01Z (job114024413545) and at 21:12Z (114028399482): both failed atdocker pull postgres:16; PR feat(spec): declarerecord:approval_decision, the approval decision panel, with an empty strictComponentPropsMaprow #22532 was removed from the queue at 21:02:17Z and 21:13:05Z.merge_grouppr-22534at 21:15Z (job114029405989): same failure; PR fix(spec): a locale bundle's page label no longer replaces a page:header title that says something else #22534 was removed at 21:15:59Z.pull_requestruns onclaude/issue-22219-protocol-18-shapes-row(21:13Z) andclaude/issue-22371-overlay-cleanup-step(21:02Z): the same job failed.Direction for triage (the owner decides)
public.ecr.aws/docker/library/postgres:16andpublic.ecr.aws/docker/library/mysql:8.0(the Docker official-image mirror on ECR Public), ormirror.gcr.io/library/.... One wiring change, no secret, no new gate. Measure that the mirror serves both tags and that the health checks pass.Dedupe: issue search
docker pull rate limit toomanyrequestsand"Temporal Conformance" docker image mirrorin objectstack: 0 hits each. Dedupe words: docker hub unauthenticated pull rate limit CI · temporal conformance service container pull fails · merge queue ejected toomanyrequests