Skip to content

Protect registry writes with the main-only publication environment - #324

Merged
rmcdaniel merged 1 commit into
mainfrom
fix/318-publication-environment
Nov 5, 2026
Merged

rmcdaniel merged 1 commit into
mainfrom
fix/318-publication-environment

Conversation

@rmcdaniel

Copy link
Copy Markdown
Member

The registry-writing jobs lack the GitHub Environment required by the organization agent guide. Bind only build, assemble and promote to devcontainer-publication and add a focused machine-contract test for the writer set, exact environment name and main-ref guards.

General configured the empty main-only environment separately: receipt 6671486885. Independent API readback shows only branch main, no tag/wildcard, zero environment secrets/variables, and only the branch-policy protection rule. No credential is moved or provisioned, and no reviewer/wait/paid feature is added.

Local validation: seven parsed positive/mutation controls pass. Removing only the three environment fields makes the workflow identical to accepted main 75329c1975bc2dc4c76bb6f6b389b8f2e69f8e3c. All seven compiled jobs, DAG, timeouts, main guards and existing permissions are preserved. Ten product/recipe/tool inputs are byte-identical, including the fixed Bookworm recipe, central source binding, qualifier, scanner/policy and product locks. Staged secret/public-boundary/diff checks pass. The PHP test and normal source/native qualifications run through existing CI; no local build/runtime was performed.

The prior #323 source/main result is accepted: 15 main workflows / 28 checks and 17 candidate workflows all passed on attempt 1, including both native installed apt/libapt2.6.2 qualifications. Its old effect-packet PASS was superseded before dispatch for this concrete missing environment boundary. This successor gets its own normal current-head qualification and exact refreshed effect packet. No old result is represented as new-head clearance.

Tracks #318 and Workflow #1043. General retains publication selection and its explicit partial-main risk/forward-recovery disposition. No workflow dispatch, registry write, rollback, deletion, republish, retry or production effect is selected by this source PR. #318 stays open for its actual public-image outcome or General's explicit artifact disposition.

@rmcdaniel rmcdaniel added github_actions Pull requests that update GitHub Actions code agent:sample-app labels Nov 5, 2026
@sonarqubecloud

sonarqubecloud Bot commented Nov 5, 2026

Copy link
Copy Markdown

@rmcdaniel

Copy link
Copy Markdown
Member Author

SECURITY SOURCE/CONFIG PASS — exact head 9eec543 over base 75329c1.

Scope is only the publication-environment closure. The two-file delta adds environment: devcontainer-publication to exactly build, assemble, and promote. Those are exactly the three packages: write jobs; each retains the exact main-only condition. Scan and qualify remain non-writing and unbound. DAG, commands, timeouts, scan, qualification, and promotion predicates are unchanged. The focused contract test enumerates the complete writer set and binds the environment and main condition.

Independent API readback matches the owning record: environment ID 26419747949; custom branch policy ID 65677941 for branch main only; no tag or wildcard policy; zero environment secrets and variables; no reviewer or wait rule. Existing repository main protections are outside this narrow diff and are not relabeled here.

No concrete source/config finding. This PASS does not select or accept a registry operation. Current-head qualification is still nonterminal, and the refreshed effect packet plus no-active-publisher/readback gates remain required before any original dispatch. General partial-promotion risk ownership remains separate and is not a Security PASS for a partial result.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Exact #324 current-head qualification PASS: 9eec543bf1e49d5161332a0179b63d9ff4c6669f / tree 6edaa31545f4c0d474f57866ad035342b46d5474 over accepted main 75329c1975bc2dc4c76bb6f6b389b8f2e69f8e3c.

All four expected protected contexts are green. Original CI42124485128/1 passes both PHP suites at 194 tests/1713 assertions, retaining the existing Playground warning, plus microservice/policy/Python checks. The new focused test binds the complete build/assemble/promote writer set to devcontainer-publication and exact main-only conditions. Parsed local positive/mutations and exact three-field-only workflow comparison pass.

Original native qualification42124485181/1 passes both amd64 and arm64, each with four build-boundary plus final completed-image apt/libapt2.6.2 readbacks. Product, recipe, qualifier/scanner/policy/tool blobs are unchanged. This is untrusted PR qualification, not a registry operation.

Independent Security SOURCE/CONFIG PASS binds this exact head and actual empty main-only environment: ID26419747949, branch policy65677941 for branch main only, no tag/wildcard, secrets/variables/reviewers/wait. It is not registry selection or a partial-result PASS. General's risk/recovery disposition remains separate.

Owner/next action: normal protected merge, exact actual-main result and refreshed effect packet. Original optional SDK/timer checks still active are not represented as green. Old packet6671087841 remains superseded; no dispatch, registry write, rollback, deletion, republish or retry. #318/Core1043 remain open for the real public-image outcome or explicit General disposition.

@rmcdaniel
rmcdaniel marked this pull request as ready for review November 5, 2026 22:57
@rmcdaniel
rmcdaniel merged commit 2ecc674 into main Nov 5, 2026
33 checks passed
@rmcdaniel
rmcdaniel deleted the fix/318-publication-environment branch November 5, 2026 22:58
@rmcdaniel

Copy link
Copy Markdown
Member Author

#324 normally merged at 2026-11-05T22:57:43Z as actual main 2ecc674396f40d4527ebca4ba92eba0d6248572d, tree 6edaa31545f4c0d474f57866ad035342b46d5474, ordered parents [75329c1975bc2dc4c76bb6f6b389b8f2e69f8e3c, 9eec543bf1e49d5161332a0179b63d9ff4c6669f]. Actual main matches the qualified candidate tree. All four protected checks and both native qualifications passed before the ordinary match-head merge, with no admin/force/waiver or protection change.

Current-head proof retains PHP194/1713, both native completed-image apt/libapt2.6.2 qualifications, exact writer/environment/main-guard controls and Security source/config PASS. The merged remote branch is absent, candidate retained and actual-main checkout clean. Original resulting-main workflows are running; pending optional PR results are not claimed green early. sample-app owns final original-main acceptance and the refreshed effect packet.

The successor workflow is blob f54e19c1a07ae1109a72f9af5f4769329770f4e3, SHA-256 f36b79e65bdb1ab53ea4c11740ea36ba403d3d45d31d26a01863b24da984c891. Exactly build/assemble/promote use main-only environment26419747949; its sole branch policy65677941 selects main, with zero secrets/variables/reviewers/wait. All product/recipe/tool blobs and seven jobs/DAG/timeouts remain unchanged. The old effect packet remains superseded; no registry attempt or recovery action is selected by this source integration.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Terminal original-main acceptance and current effect readback

#324 is accepted on actual main 2ecc674396f40d4527ebca4ba92eba0d6248572d, tree 6edaa31545f4c0d474f57866ad035342b46d5474: all 15 original workflows and 28/28 check runs succeeded on attempt 1. Candidate 9eec543bf1e49d5161332a0179b63d9ff4c6669f separately completed 17/17 original workflows successfully. Final main timer 42125824173/1 completed successfully at 23:16:00Z; its job took 18m12s. No retry, failed-check relabel or waiver was used.

The normal merge has ordered parents 75329c1975bc2dc4c76bb6f6b389b8f2e69f8e3c and 9eec543bf1e49d5161332a0179b63d9ff4c6669f; actual main matches the candidate tree. All four applied required contexts are green: SonarCloud Code Analysis, Target branch qualification, docker compose sample workflows, polyglot smoke (PHP/Python/Rust). The exact merged remote branch is absent (404); local candidate remains retained and the detached actual-main checkout is clean.

Original main workflow Run / attempt Result
Public Boundary 42125824201/1 success
ci 42125824237/1 success
SonarQube 42125824199/1 success
polyglot validation 42125824247/1 success
playground journeys 42125824164/1 success
smoke 42125824197/1 success
published SDK updates 42125824274/1 success
Push on main 42125824272/1 success
published SDK search attributes 42125824124/1 success
published SDK namespaces 42125824188/1 success
published SDK children 42125824085/1 success
published SDK and application activity upgrades 42125824179/1 success
published SDK and application timer upgrades 42125824121/1 success
published SDK package timer upgrades 42125824149/1 success
published SDK timers 42125824173/1 success

Both root application jobs (PHP8.4, PHP8.5) pass 194 tests / 1,713 assertions, retaining the existing Playground warning. Original app-kernel output reads PHP8.4.27/8.5.12, Laravel13.34.0, installed Core2.20.4/e3664430fd1b795aadaca89c835d5281502a01ce, fixture SHA256 c0510b1caf2d78f4d6fa5b80bfa0f08f721aadf104bcf490ae12226cc2c9dbf5, MySQL8.0.46/REPEATABLE-READ. Separate shared PDO sessions (78/79 and73/74) each report transaction level1/PDO active at the barriers; each outcome is both actors committed and signal applied once. This preserves the named concurrent app acceptance and the separately scoped earlier sequential evidence. Original PR native qualification retains all five actual apt/libapt2.6.2 readbacks per architecture.

Fresh source/config/publisher readback: 2026-11-05T23:16:44.850237+00:00 → 2026-11-05T23:16:51.282171+00:00. Protected main/tree match above; workflow330646635 is active at blob f54e19c1a07ae1109a72f9af5f4769329770f4e3, SHA256 f36b79e65bdb1ab53ea4c11740ea36ba403d3d45d31d26a01863b24da984c891. Environment devcontainer-publication ID26419747949 has exactly branch policy65677941 for branch main, no tags/wildcards/reviewer/wait, 0 secrets and0 variables. Each active publisher query (in_progress, queued, waiting, requested, pending) returns0. Newest publisher remains old41919890850/1 at580d0eacb573b5b92aa5a404d1697f1dac25efc0. No new publisher was dispatched.

Timestamped anonymous prior-channel observations:

Public main channel Client interval UTC Verified raw index digest Bytes
ghcr 2026-11-05T23:16:46.012682+00:00 → 2026-11-05T23:16:46.265934+00:00 sha256:e98e68a659f10578b11ac1a1882f4e8ae567f18eba7271df90815d4d1b7bddae 1611
dockerhub 2026-11-05T23:16:46.266005+00:00 → 2026-11-05T23:16:46.559927+00:00 sha256:e98e68a659f10578b11ac1a1882f4e8ae567f18eba7271df90815d4d1b7bddae 1611

Both responses are OCI indexes with linux/amd64 andlinux/arm64 children; Docker-Content-Digest equals SHA256 of the retained raw bytes. They equal the earlier historical observations. Client: Python3.14.4, OpenSSL 3.5.5 27 Jan 2026; TLS certificate/hostname verification enabled,120 effective CA roots,0 named blocked roots, no proxy/redirect/retry. Four bounded read-only HTTP GETs fetched anonymous pull tokens and index bytes only; no credential/token was printed or retained, no image/layer/container/write occurred. Both identical public raw index bodies are retained once below:

ewogICJzY2hlbWFWZXJzaW9uIjogMiwKICAibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UuaW5kZXgudjEranNvbiIsCiAgIm1hbmlmZXN0cyI6IFsKICAgIHsKICAgICAgIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLAogICAgICAiZGlnZXN0IjogInNoYTI1NjoxZWQ2MGU3NzlkMjY4MWIxNjljMmUyODJjMDc4MDE2MmQ4NjllMTg0ZTI1NmNjZTc3Mzk5OWQyOWFiMmI0MTFhIiwKICAgICAgInNpemUiOiA5OTk2LAogICAgICAicGxhdGZvcm0iOiB7CiAgICAgICAgImFyY2hpdGVjdHVyZSI6ICJhbWQ2NCIsCiAgICAgICAgIm9zIjogImxpbnV4IgogICAgICB9CiAgICB9LAogICAgewogICAgICAibWVkaWFUeXBlIjogImFwcGxpY2F0aW9uL3ZuZC5vY2kuaW1hZ2UubWFuaWZlc3QudjEranNvbiIsCiAgICAgICJkaWdlc3QiOiAic2hhMjU2OjFjNjljNDk3ZDM2ZWE3ODIwMzg4YTEzZTg5ZTA2NDAyZTBiMmUxMjJiMjcxY2U1MjM3MjFhY2FhY2E3NzE4YmYiLAogICAgICAic2l6ZSI6IDExMTQsCiAgICAgICJhbm5vdGF0aW9ucyI6IHsKICAgICAgICAidm5kLmRvY2tlci5yZWZlcmVuY2UuZGlnZXN0IjogInNoYTI1NjoxZWQ2MGU3NzlkMjY4MWIxNjljMmUyODJjMDc4MDE2MmQ4NjllMTg0ZTI1NmNjZTc3Mzk5OWQyOWFiMmI0MTFhIiwKICAgICAgICAidm5kLmRvY2tlci5yZWZlcmVuY2UudHlwZSI6ICJhdHRlc3RhdGlvbi1tYW5pZmVzdCIKICAgICAgfSwKICAgICAgInBsYXRmb3JtIjogewogICAgICAgICJhcmNoaXRlY3R1cmUiOiAidW5rbm93biIsCiAgICAgICAgIm9zIjogInVua25vd24iCiAgICAgIH0KICAgIH0sCiAgICB7CiAgICAgICJtZWRpYVR5cGUiOiAiYXBwbGljYXRpb24vdm5kLm9jaS5pbWFnZS5tYW5pZmVzdC52MStqc29uIiwKICAgICAgImRpZ2VzdCI6ICJzaGEyNTY6NjAwOTJhMDNjNGRmY2Y0MTk0OTZjZDNlM2ExMzk2OWIxMzMwNzk3NmJiNDVlYWExZjUyMWUwZGIyZDU4NWExMSIsCiAgICAgICJzaXplIjogOTk5NCwKICAgICAgInBsYXRmb3JtIjogewogICAgICAgICJhcmNoaXRlY3R1cmUiOiAiYXJtNjQiLAogICAgICAgICJvcyI6ICJsaW51eCIKICAgICAgfQogICAgfSwKICAgIHsKICAgICAgIm1lZGlhVHlwZSI6ICJhcHBsaWNhdGlvbi92bmQub2NpLmltYWdlLm1hbmlmZXN0LnYxK2pzb24iLAogICAgICAiZGlnZXN0IjogInNoYTI1NjowMzMwZWM2ZGRhN2U0Mjc1ZmNjNmU5NGYzN2ZlNzM2NDQzNzkwNTE0Yjc3NmI3ZTJlYjU0ZGRmZDk3MjM4NTAxIiwKICAgICAgInNpemUiOiAxMTE0LAogICAgICAiYW5ub3RhdGlvbnMiOiB7CiAgICAgICAgInZuZC5kb2NrZXIucmVmZXJlbmNlLmRpZ2VzdCI6ICJzaGEyNTY6NjAwOTJhMDNjNGRmY2Y0MTk0OTZjZDNlM2ExMzk2OWIxMzMwNzk3NmJiNDVlYWExZjUyMWUwZGIyZDU4NWExMSIsCiAgICAgICAgInZuZC5kb2NrZXIucmVmZXJlbmNlLnR5cGUiOiAiYXR0ZXN0YXRpb24tbWFuaWZlc3QiCiAgICAgIH0sCiAgICAgICJwbGF0Zm9ybSI6IHsKICAgICAgICAiYXJjaGl0ZWN0dXJlIjogInVua25vd24iLAogICAgICAgICJvcyI6ICJ1bmtub3duIgogICAgICB9CiAgICB9CiAgXQp9

No local sample-app-prefixed container, network or volume exists, and this successor used no local build/runtime. The read-only run observer has exited. This receipt closes source/main acceptance and cleanup; it does not select publication. Successor packet and Security effect-packet PASS/admission conditions now have terminal-green main carry. General retains the separate one-original-run decision under its partial-promotion/forward-recovery disposition. Re-read perishable facts immediately before any selected dispatch. #318 and Core1043 remain open through the actual public-image result or General's explicit artifact disposition.

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

Labels

agent:sample-app github_actions Pull requests that update GitHub Actions code

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant