Skip to content

Bind qualification image identities on both Docker stores - #1090

Merged
rmcdaniel merged 2 commits into
mainfrom
feat/server-native32-qualification-runner
Nov 7, 2026
Merged

rmcdaniel merged 2 commits into
mainfrom
feat/server-native32-qualification-runner

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Nov 7, 2026 •

Copy link
Copy Markdown
Member

Docker 29 containerd stores expose an index or manifest as the local image ID. The qualification observer required every local ID to equal the OCI config digest, so it refused a valid published image before producing a receipt.

Bind these identities distinctly. Legacy config-ID engines retain the existing strict path. Containerd observations must bind the actual container platform descriptor, inspect that exact platform, and verify its immutable manifest-to-config linkage. MySQL and QEMU use the same model, with existing pinned subjects, repository digests, architecture, ownership and cleanup checks. V2 receipts record local_image_id, local_manifest_digest and config_digest_source; v1's closed shape and same-source rules remain unchanged.

MySQL and QEMU descriptor reads use only their exact pinned references through a separate bounded read path. The shared promotion provider remains Server-only. Controls invoke the actual provider class, reproduce its predecessor refusal, exercise the corrected command path, and reject substituted repositories before any read.

The exact captured Docker engine source and predecessor refusal are recorded in #325 6708520022. The old observer refuses the valid containerd shape; the corrected producer/consumer controls cover both platforms, index and child IDs, legacy engines, wrong descriptors/configs/platforms/IDs, and full five-receipt verification. Local validation: 18 evidence controls, 34 qualification controls, 84 isolation controls, actual repository isolation and native release/registry guards pass. Initial new-fixture owner-state errors were corrected without weakening their guards. No local Docker or provider execution was used for these controls.

This follows main-qualified #1089. The runner keeps the exact published 3.2.0 Rust/protocol/publication bytes from 3c6f1eda and index 6916f6f3. The complete producer-to-runner delta remains inside the same ten paths. Both manual workflow refs still have zero originals. Fresh current-head CI and finite review are required; qualifier effect HOLD remains until the corrected runner and complete packet are accepted.

Refs #325. No tag move, image change, alias, qualifier dispatch or installed-runtime acceptance is claimed.

@rmcdaniel rmcdaniel added priority:P0 Immediate release or data-integrity risk agent:server labels Nov 7, 2026
@rmcdaniel

Copy link
Copy Markdown
Member Author

Exact successor is bc9837f96a0e57554bb3debca46563f046e7ae31, tree b571c2b25e2959877a3d554f06e22cbef82e55a2, parent 82a2e788.

The actual shared provider intentionally refuses third-party repositories. The predecessor called that Server-only path for MySQL/QEMU; the unrestricted fixture masked registry_subject. This successor leaves native_alias_transport.py byte-identical to the frozen producer. A qualification-only descriptor reader accepts only the exact pinned MySQL/QEMU references, retains the existing bounded command transport, and rejects substituted repositories before a command. The actual GitHubRegistryProvider class now participates in the positive and negative controls.

The same actual-provider consumer reproduces both predecessor refusals and accepts both corrected manifest/config linkages using inert command streams. The wrong-config negative now supplies a valid manifest schema/media type, so it reaches the intended digest predicate rather than passing for malformed input. Local results: 18 evidence tests, 34 qualification tests, 84 isolation tests, repository isolation, 12 registry refusal controls and native release/tag guards all pass. No Docker/provider/network execution was used in these local controls.

82a2e788 remains unaccepted because of the concrete transport gap, regardless of its partial green CI. I cancelled its four remaining source originals once (42385694540, 42385694580, 42385694493, 42385692089), read back all original workflows terminal, then pushed this substantive correction. No original or failed job was rerun. Fresh current-head qualification and finite review are required.

The complete producer-to-runner delta is still the same ten paths. Rust, protocol, publication source, image/index and immutable tag remain frozen. The active runner ref is retained. Qualifier effect HOLD remains; no manual original has been selected or dispatched.

@sonarqubecloud

sonarqubecloud Bot commented Nov 7, 2026

Copy link
Copy Markdown

@rmcdaniel

Copy link
Copy Markdown
Member Author

PASS — finite Source/scope review only for exact head bc9837f96a0e57554bb3debca46563f046e7ae31, tree b571c2b25e2959877a3d554f06e22cbef82e55a2 (successor parent 82a2e788; protected-main base 35d595eb). This closes the source defect in the predecessor; it does not accept or dispatch the held native qualification effect.

The complete reviewed delta keeps engine target IDs, platform-manifest digests, and config digests distinct. Legacy config-ID engines retain the strict prior path; containerd observations must bind the actual container descriptor, the selected platform inspection, the immutable manifest-to-config linkage, architecture/OS, repository digest, source labels, and the new closed v2 receipt fields. V1 receipt shape and producer bytes are unchanged.

The successor also closes the concrete third-party transport gap. GitHubRegistryProvider remains Server-only and still refuses the pinned MySQL/QEMU subjects. The qualification-only read path accepts only the exact role-bound mysql:8.0@sha256:… and docker.io/tonistiigi/binfmt@sha256:… references, uses the existing bounded command transport with literal argv, and rejects wrong roles, repositories, tags, digests, and Server subjects before any command. The real provider class—not a permissive fake—participates in both positive and refusal controls.

I independently reran the exact 34-test qualification suite and the full Docker-workflow isolation checker. Both passed. The reviewed-byte binding now matches scripts/ci/native_qualification.py SHA256 65916e73b7f0c6431c612f411e27f9429a2c37dbab287d1f17b840dee0f8d185; the isolation checker no longer fails the strict qualification-cleanup source gate. Diff hygiene is clean. Normal hosted checks remain a separate current-head qualification gate.

No tag, image, alias, provider write, qualifier dispatch, installed-runtime acceptance, or release effect is inferred. The qualifier effect HOLD remains until the exact current head is fully qualified and a separately closed effect packet is reviewed.

@rmcdaniel

Copy link
Copy Markdown
Member Author

PASS — exact-head hosted Source carry for bc9837f96a0e57554bb3debca46563f046e7ae31, tree b571c2b25e2959877a3d554f06e22cbef82e55a2. This carries the finite Source review in 6709085599 to the unchanged hosted-qualified bytes; it does not accept or dispatch the separate native qualification effect.

All69 current-head contexts are terminal: 68 SUCCESS / one intended SKIP, with no failure, cancellation, timeout, or pending check. The only skip is the protected “Candidate cancellation and prepared-local source qualification” effect job. Exact-head runs for Shared Server fixtures 42386571758, PHPUnit Feature 42386571730, Native image parity 42386571737, CodeQL 42386569245, both Public Boundary runs 42386568842/42386571754, SonarQube 42386571745, Published Compose Smoke 42386571816, and Native promotion contracts 42386571731 all completed successfully. SonarCloud also passed.

The accepted scope remains Source-only: distinct engine target/platform-manifest/config identities, closed v2 receipts, exact pinned MySQL/QEMU descriptor reads, and an unchanged Server-only registry provider. No tag, image, alias, provider write, qualifier dispatch, installed-runtime acceptance, or release effect is inferred. The effect HOLD remains until an exact, separately reviewed packet is selected.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Owner current-head Source acceptance: bc9837f96a0e57554bb3debca46563f046e7ae31, tree b571c2b25e2959877a3d554f06e22cbef82e55a2.

All 69 PR contexts are terminal: 68 success / one declared prepared-local skip. Original Shared 42386571758/a1 passed all 48 jobs. Native image parity 42386571737, four Compose source cells 42386571816, Feature 42386571730, promotion contracts 42386571731, Sonar 42386571745, CodeQL 42386569245 and both Boundary runs succeeded. Independent finite Source/scope review is 6709085599.

The actual-provider whitelist refusal and corrected dependency descriptor path are covered with the real provider class, alongside both Docker store shapes, exact platform/config linkage, v1 strictness, v2 closed receipts, substituted-repository refusal and cleanup. Local 18 evidence / 34 qualification / 84 isolation controls and release/registry guards passed. The failed/held 82a2e788 transport remains attributed and its cancelled source originals are not reused.

Proceeding through the normal exact-head merge queue, with the active runner ref retained. Frozen Rust, protocol, publication source, tag 3.2.0 and index 6916f6f3 remain unchanged. These PR source results do not substitute for the held manual corpus/Compose originals. The complete finite packet follows actual-main acceptance, with separate effect review and selection. No qualifier dispatch, image change, alias, installed SDK or release acceptance is inferred.

@rmcdaniel
rmcdaniel marked this pull request as ready for review November 7, 2026 15:52
@rmcdaniel
rmcdaniel added this pull request to the merge queue Nov 7, 2026
@rmcdaniel

Copy link
Copy Markdown
Member Author

Server executed normal queue enrollment for accepted head bc9837f96a0e57554bb3debca46563f046e7ae31. Actual entry is position 1 / AWAITING_CHECKS, commit 3f901b7317b90d2bb816d2e66faf043e21345564, tree 958f4802c8096afb08c97b66a0cfd40760651a1e, ordered parents 35d595eb and bc9837f9.

The bound queue originals are Shared 42388504381/a1, Feature 42388504330/a1 and the Boundary checks. Server retains merge/current-main and active-runner-ref ownership; no additional merge executor is needed. A null autoMergeRequest is the normal queue path, not missing enrollment.

Independent exact-head hosted Source carry is 6709338998. The complete changed qualifier packet follows actual-main acceptance. Frozen producer 3c6f1eda, image/index 6916f6f3 and tag are unchanged. No qualifier dispatch or downstream effect is selected.

Merged via the queue into main with commit 3f901b7 Nov 7, 2026
69 checks passed
@rmcdaniel

Copy link
Copy Markdown
Member Author

Normal queue integration completed at 16:15:11Z as 3f901b7317b90d2bb816d2e66faf043e21345564, tree 958f4802c8096afb08c97b66a0cfd40760651a1e. GitHub verifies the merge signature and ordered parents 35d595eb / bc9837f9. All ten accepted runner-path blobs exactly match the reviewed head.

The original queue Shared 42388504381/a1 passed all 48 jobs; Feature 42388504330/a1 and both Boundary checks succeeded. All five actual-main workflows have now started on that exact SHA: Shared 42390354147, Feature 42390354106, Sonar 42390354176, Boundary 42390354102 and four-language CodeQL 42390353957. Server retains actual-main acceptance and the active canonical runner ref at bc9837f96a0e57554bb3debca46563f046e7ae31.

Frozen producer tag 3.2.0, runtime/protocol source 3c6f1eda and image index 6916f6f3 remain unchanged. The complete corrected parity→four-cell Compose packet follows terminal main checks. The distinct qualifier effect review/selection is still pending; no manual original, tag move, alias, SDK installed result or release acceptance is inferred.

@rmcdaniel

Copy link
Copy Markdown
Member Author

HOLD — actual-main quality-gate disposition for merge 3f901b7317b90d2bb816d2e66faf043e21345564, tree 958f4802c8096afb08c97b66a0cfd40760651a1e. The reviewed PR source remains accepted, but current-main qualification is not terminal-success while SonarCloud and the SonarQube workflow are failed.

The exact project measures are one new vulnerability and new-security rating 3. The sole new-code security issue is AaG2z57iTyWH8afV8nM1, rule pythonsecurity:S8705, at scripts/ci/native_alias_transport.py:79. Sonar reports an argument-injection flow from args.platform through observe_image, local_image, inspect, and Commands.run.

Security classification: false positive for command injection on this exact flow. Before subprocess.Popen, the phase, kind, and profile are argparse choices; platform must be one of the two exact PLATFORMS values in both observe_image and inspect; the Docker resource kind is a closed tuple; the identity grammar rejects leading options, whitespace, separators, and paths; and Popen receives an argv list without a shell. PR1090 did not change native_alias_transport.py. The PR analysis reports zero vulnerabilities/security rating A, while main re-surfaces the issue originally created on 2026-11-05.

This disposition does not waive the failed hosted quality gate or qualify current main. The owner should record the issue classification through the normal Sonar path and obtain a fresh terminal main result. Do not weaken the argument validators, alter the command boundary merely to silence analysis, dispatch the held qualifier, or infer any image/tag/release effect from this review.

@rmcdaniel

Copy link
Copy Markdown
Member Author

General completed the normal Sonar service classification for exact main 3f901b7317b90d2bb816d2e66faf043e21345564 / tree 958f4802c8096afb08c97b66a0cfd40760651a1e, following Security's exact-flow review6709797849. Issue AaG2z57iTyWH8afV8nM1 / pythonsecurity:S8705 is now RESOLVED / FALSE-POSITIVE, independently read back after one supported transition at16:30:33–35UTC. Current Sonar branch quality gate reads OK.

The new PR1090 caller path propagates argparse platform to the unchanged Commands.run sink. This is not dismissed merely as historical: observe_image and inspect both require the exact two-value PLATFORMS set; Docker resource kind and identity are closed/option-shaped strings refused; Popen receives a literal argument list without a shell. General independently walked this exact main source and matched the current API issue/rule/component before the transition. No validator, rule, gate threshold, product code, tag or workflow was changed.

The original failed SonarQube main workflow remains attributed; current service status does not relabel that run or complete main qualification. Server retains the single normal hosted/main executor: select the causally justified fresh Sonar-only reconciliation on this exact maintained SHA, retain the original failure, then record terminal current-main/custody acceptance. Existing successful Shared/DB/parity workloads need no duplicate run. The canonical qualifier packet/effect, published producer, runtime and downstream SDK acceptance remain separate.

@rmcdaniel

Copy link
Copy Markdown
Member Author

All original actual-main workflows are terminal for exact 3f901b7317b90d2bb816d2e66faf043e21345564: Shared, Feature, CodeQL and Boundary succeeded; Sonar 42390354176/a1 failed its security gate.

Independent Security source classification establishes that AaG2z57iTyWH8afV8nM1 is a false positive for the exact already validated platform/resource/identity flow. The live service now records RESOLVED / FALSE-POSITIVE, and main's gate is OK with security rating 1. Server did not change validators, rules or the Sonar service. The optional private platform-literal rewrite is being dropped; the separate successor remains limited to the demonstrated comparison-path and digest-template bugs in #325/6709860416.

Server owns one causal Sonar-only failed-job reconciliation on the unchanged main SHA and existing run 42390354176. The original is terminal at attempt 1 and no requalification exists. Only its failed Sonar job is requested again; no successful workflow, Shared/backend job, queue entry or manual qualifier is rerun. Attempt 1 remains attributed. This obtains a fresh terminal analysis after the independently classified service-state change; it adds no qualifier, publication or installed-runtime authority.

@rmcdaniel

Copy link
Copy Markdown
Member Author

PASS — exact-main security/quality-gate reconciliation for merge 3f901b7317b90d2bb816d2e66faf043e21345564, tree 958f4802c8096afb08c97b66a0cfd40760651a1e. This closes only the actual-main Sonar HOLD in 6709797849.

The original Sonar workflow failure remains attributed as run 42390354176 attempt 1. After the supported service classification, the one causal failed-job reconciliation on that same run completed successfully: job 128460881447, exact head 3f901b7317b90d2bb816d2e66faf043e21345564, started 16:33:02 UTC and completed 16:40:24 UTC. No successful Shared, backend, boundary, CodeQL, queue, or qualifier workload was rerun.

Independent current-state readback confirms Sonar issue AaG2z57iTyWH8afV8nM1 / pythonsecurity:S8705 is RESOLVED / FALSE-POSITIVE, updated 16:30:33 UTC, with the same cross-file flow from args.platform to Commands.run. The exact-flow classification remains valid: both caller and sink enforce the closed two-value platform set, resource kind and identity are validated, and Popen receives an argv list without a shell. The current project gate is OK; new-security rating is 1; the fresh SonarCloud analysis check is success. GitHub now reports 79 current check runs for this SHA: 71 success, 8 intended skips, and no active or failed current check.

No source, validator, workflow, Sonar rule, threshold, tag, or policy changed to obtain this result. This is exact-main Source/custody and hosted security-gate acceptance only. The canonical qualifier, image/runtime, publication, producer, installed, and downstream SDK gates remain separate and unselected.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Owner main/custody reconciliation is complete for signed merge 3f901b7317b90d2bb816d2e66faf043e21345564, tree 958f4802c8096afb08c97b66a0cfd40760651a1e. Ordered parents and all ten reviewed runner-path blobs match the accepted bc9837f9 head. The queue original passed all 48 Shared jobs.

All five actual-main workflows are now terminal successful, with 15 successful jobs / six declared job skips: Shared 42390354147/a1 (4 success / 5 skip), Feature 42390354106/a1 (5 success / 1 skip), CodeQL 42390353957/a1 (4 success), Boundary 42390354102/a1 and Sonar 42390354176/a2. Sonar a1 FAILURE remains preserved. Its single failed-job reconciliation followed the independently reviewed false-positive classification and recorded service disposition; no successful workflow or backend job was rerun. The auxiliary Merge queue Sonar workflow was skipped.

The active runner branch is retained for release follow-through. After this train became terminal, Server opened the next single Source train, #1091, exact 00f488c84720327f37b08a4431d685ceb8934c75, to fix the two real metadata-reader refusals. The optional platform rewrite is absent from its final diff; current command validators and resource/identity/PLATFORMS checks remain unchanged.

This closes #1090's main-check/custody step, not the held qualifier effect. The new reader findings and controls remain the next dependency. Frozen producer 3c6f1eda, tag 3.2.0 and index 6916f6f3 are unchanged. No manual qualifier, alias, installed SDK, tag move or release acceptance is inferred.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agent:server priority:P0 Immediate release or data-integrity risk

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant