Repository navigation
Description
Selective source recovery delivered; one-repository native enforcement Active — November 5
The original #240 rollout regressed unchanged callers and was fully reverted by #287 at 9fbacc51. The supported selective successor #288 is merged and main-qualified at 0b00aa61; source delivery and cleanup are complete. Original failures and recoverable source remain preserved.
The unprovisioned custom App registration/install design is withdrawn. No new App, key or check-writing credential was created. The legacy App-ID job's failures remain separate from ordinary source qualification and are not reported as passing; CLI owns retirement of the obsolete unbound source in the central follow-through.
Native pilot milestone: the operator's save activated organization ruleset 26628397 for only public .github repository 575230056, default branch, no bypass actors and .github/workflows/native-policy.yml from protected main. General independently verified Active through the repository ruleset and applied-main-rule APIs, with all four prior repository protections retained. The live same-repository/fork/negative controls, probe cleanup and exact Active/export receipt are durable. The earlier Unauthorized attempt was not a successful activation; the operator's later saved state resolved it without scope or identity expansion.
A fresh real source PR under Active, central #303 head aa5d4d3097ff7e577d2008c34d58d87c1f342826, passed selected workflow 408387911 in 42094162655/a1, created 19:28:08 UTC, and normally merged as 4ec448782e8e8e38f87e3b29bd98a350f67e6b51. This is an actual post-activation observation, not a fabricated context or a transfer from the Evaluate probes.
Keep this issue open for its remaining independent caller/example-lock, bootstrap, image, cold-publisher and credential-retirement acceptance. One public pilot is not fleet-wide enforcement. AI #27 and every other repository retain their current protections until their own visibility/caller/queue scope is qualified. No private or queued-target expansion, affected artifact promotion or production action follows from the pilot. CLI is the sole central #295/#297 implementation owner; General owns integration/rollout and the remaining unreserved follow-through.
Current container Composer boundary (November 2)
The actual Server Dockerfile/caller proof is accepted: both registered Compose sets build and become healthy, both Composer layers refuse missing secrets or wrong bundles, and transient trust material is absent from final images. Exact build receipt, Security carry.
Central #280 is protected merged at 699d09d602fc0353160bdecaa2b23f07ef4c7c21: all registered services refuse external BuildKit cache declarations, and the exact eight-file Server recipe is registered. #281 approves that immutable action ref; protected merge 27b9d31a. Seven candidate checks and all ordinary main checks pass for both changes. The merged remote heads are absent.
Caller adoption is complete in SDK-PHP #229, merged as 42f00d5dd4ac72371628e91c79a47b48751ba82b, with the main-only published smoke accepted in comment 6587535363. The registered source hook Server #943 merged as 1124d86a45af0b824b523d18292e22308767fd9f; it published no PHP Server release. These are completed historical adoption results. Mandatory SDK-PHP Composer target enforcement also merged in central #282, merge c9f9349492747fd1d1b7c396bdffb4cfaa8d4886; restored policy main 9fbacc51 retains that completed enforcement. Cooperative dispatch and recurring audit requirements still need their own current reconciliation. Workflow #970 retains the separate requester/inventory work; its three active lock corrections are being split from that broader migration without changing the historical #773/#809 inputs.
Earlier delivery and remaining independent paths
- CLI Close superseded prerelease issues as not planned #63 is merged at
535cb6e9/4e377a3e. Fifteen applicable
candidate checks and independent main Build 39906101401 pass. All actual
CodeQL language analyses report no errors/results; its neutral aggregate
remains explicitly separate. Composer requests select and verify the reviewed
effective trust, while native launchers reuse the exact locked PHAR vendor
artifact. Protected cold publisher acceptance remains required. Shared ci: require CLI Composer trust verification #242,
mergeddf5f0e06/ad78532cafter all seven checks, makes the CLI guard
mandatory without adding an App or protected-main exception. - Rust SDK 4.2.2 is published at 47cfe6db, with OIDC publication, independent archive verification and normal Rust 1.86 installation. Manifest security floors protect fresh downstream resolution. GitHub/local publishing credential copies are removed; account-side legacy-token revocation remains a separate required action.
- Python Document uncaught Nexus caller failure coverage #197's certifi floor is shipped in current published SDK 2.11.2. Checked October 26: PyPI metadata requires
certifi>=2026.10.19; publisher run 40158276735 succeeded at source43be84a9e081141db9ec4af0eca4cdc245dd6efb. PyPI wheel provenance namesdurable-workflow/sdk-python,publish.yml, and Environmentpypi. The old 2.9.1 publisher-setup hold is historical, not a current publication blocker. This metadata verification does not close the separate bootstrap, image, installed-upgrade, or credential-retirement requirements below. - Rust SDK #125 is
normally merged at2c2f3dc8, exact qualified tree2c0323c4from candidate
1c540cb2. All 17 applicable checks pass, with two explicit optional Server
skips and zero OPEN/CONFIRMED Sonar issues. The remote head is absent.
It selects verified effective trust before normal
Rustup/Cargo, observer, documentation and release-tool requests. The Avro
consumer's actual Composer client is guarded. Fresh virtual environments
contain no pip and are populated by the bootstrapped outer pip. The new
regression fails the preceding installer with exit 42, then passes the
correction. Actual offline installation, 13 package controls and four mocked
publication controls pass. Current central policy validates all workflows.
Hosted tests pass the complete 21 entrypoint, 13 package and four release
contracts, plus the shell checks. The real Composer 2.10.3 client verifies
its effective CA paths and both blocked-root exclusions. Independent main
CI39899237522and all applicable main checks pass. Protected run
39899291259passes on maintained tooling2c2f3dc8, confirming
already_publishedand a fresh exact 4.2.2 registry build on Rust 1.86.0.
Original tag47cfe6dbstays unchanged. Its uploaded 1,726-byte evidence
archive was not read locally after a storage-endpoint connection timeout;
the actual job log and maintained source establish these results.
Shared #241, merged
1cedba66/6612f647after all seven checks and with independent main
checks passing,
makes the existing Composer guard mandatory for this target, preventing
removal of the last verifier from silently disabling the scan. It changes
one policy flag and has no protected-main/App exception. No runtime, version,
lock or package publication changes. - Python #202
continues CI trust closure atb75f6a33/ wholef743fdf8: ten bootstrap calls
select reviewed effective trust, and Playwright's raw Node downloader selects
the same clean OpenSSL paths. The central preflight preserves its closed
reviewed input form. All 18 candidate checks pass, with zero OPEN/CONFIRMED
Sonar findings. Normal merge2da02a7apreserves exact treef743fdf8;
independent main CI 39895327290 and portal 39895327295 pass. The actual live
portal audit matches the merge, and the remote branch is absent.
Package/runtime/version and the separate protected
PyPI upload job stay unchanged. Publisher/container and runner bootstrap
boundaries still require their own qualification. - Normal Rust dependency locks are merged through PHP Document pending activity SDK and application upgrades #205, Workflow #906 and Sample Allow an exact shared cache key written only by protected pushes #269. Immutable CI bootstrap updates are delivered through Rust Withdrawn documentation change #123, CLI Preserve superseded prerelease authority after its successor completes #62, PHP Publish maintainer and security responsibility statements #206, AI Enforce vetted issue revisions before authority automation #25 and Website #359. AI Enforce immutable Actions and untrusted contribution boundaries #26 is normally merged at
fbdc2c98with all nine candidate checks passing. Workflow #907 is normally merged at33f556f3, with whole treef1816366identical to qualified32f40464. All 16 applicable checks pass with six explicit skips, including Sonar with zero new or accepted issues. The remote head is deleted. Its acknowledgement-test timestamp correction changes no runtime or clock budget; no package release is created for this CI change. - Shared PR Authenticate a scoped CI trust bundle and verify Composer before requests #239 is merged at
f14766da, exact treedb0087e8, with all
seven final checks passing. Action source75587fc3is delivered.
PR Require isolated hash-locked policy parser installation #240 is nowed2334a7/4bd8fb6b. It incorporates ci: require CLI Composer trust verification #242's CLI
Composer target flag on top of qualified 72e1; protected workflow, parser,
reader and issuer bytes remain unchanged. All nine fresh whole-tree checks
pass, including both native locked-wheel cells and the actual read-only API
exercise. Current Sonar has zero OPEN/CONFIRMED.
Its bounded reader, issuer and
prepared protected-main workflow bind original source, PR/head and App
identity. A single proposed target/path/content exception cannot admit a
changed workflow. All 104 focused controls and all nine prior 1d5 checks pass.
S7631 is a specifically reviewed false positive: the checkout uses protected
default-branch source, with candidate data never executed. The failed first
analysis stays historical; the fresh same-head Sonar attempt passes with
zero OPEN/CONFIRMED. Root source/bootstrap review, App account setup and live
Environment/fork/wrong-issuer/stale/malformed/safe-success/rule binding
remain unfinished. Main PT policy and credentials are unchanged. Candidate CI
alone cannot authorize bootstrap or establish independent enforcement. - Sample Fix manual-dispatch condition analysis #273 is merged at
922e0c54, exact qualified tree23bec5e4,
following Enforce the fork boundary before restoring executable CI caches #270/Correct manual-dispatch condition casing and negation analysis #272. All 28 candidate checks pass, including both native
production image smokes. The separate publisher 39872797679 passes all
six jobs, with actual anonymous published-image qualification on native
amd64/arm64, revision/attestation/decoder/startup checks and both public main
promotions. Current index:
sha256:3047c6f9945b27471a396dc4e145809be975967ac67b3533b019a5a253291b21.
Independent anonymous manifest reads find matching architecture children in
GHCR and Docker Hub. A later extra Docker Hub HEAD timed out; no registry
cause is inferred. Earlier failed originals stay separate. Complete evidence
is on Sample Require external fork guards before cache restoration #271; Compose still builds its root image locally. - Waterline Add worker metrics to the PHP and Rust SDKs, matching Python #233 is merged at
868cc691, exact qualified tree50a0f4e9.
All 34 applicable candidate checks pass, with one explicit skip and zero
OPEN/CONFIRMED Sonar findings. Immutable tag 2.12.3 points to that merge.
Protected publisher 39874000386 passes all four jobs. Published index
sha256:5d1ed06761d05ce4a0cea12dde1ca85efd5787e20633253fac6bc20b69268f32
and both children match independent anonymous registry metadata. Native
39880866968 verifies actual CA/Brotli and service/SDK smoke on amd64 and
arm64. Normal Composer installation, audit, source and autoload identity pass.
2.12.3 is published. Follow-through List a run's activities from the Python and Rust clients #235 merges as218534af, exact
qualified tree1cc6ed12, with 33 passing checks and four explicit skips.
It adds automatic future native checks and updates the qualified public
tuple/examples; package constraints and peer pins stay unchanged. Fresh main
build 39884493147, native smoke 39884493091 and all applicable main checks
independently pass, with four explicit skips. Earlier failures and limited protocol-fixture scope
remain recorded; no historical image, actual-workflow or performance claim
is promoted by these results. - Server #666 is merged at
842d58a5, with whole tree415e5647identical to qualified5f1f1cb1. It incorporates main17dc12cd, image correction #672 and published Core 2.11.1, preparing Server 2.11.2 and Helm 0.3.2. 2.11.2 is not tagged or published. The reserved CI/release correction #673, protected gate acceptance, combined image publication and actual repair and cold-consumer acceptance remain pending. Rust retains its #673 source window. - The original four Sample runner-store diagnostics remain failed: raw hosted Ubuntu trust contained a blocked root. They do not become passes because a later job explicitly selects a clean bundle. Remaining independent bootstrap paths, CLI cold native-build provenance, published images, normal installed upgrades and credential retirement still need delivery. No interception or artifact substitution is established.
The issue stays open for these concrete publication, bootstrap, image and token-retirement requirements. Detailed current shared-source receipt.
Problem
Current Rust SDK and consumer Cargo locks resolve affected TLS trust dependencies: webpki-roots 1.0.9 and rustls-webpki 0.103.14/0.103.15. The Python SDK also allows already installed affected certifi releases to satisfy its httpx dependency. These can retain trust paths through compromised emSign intermediates. This is an upstream dependency exposure, not evidence that a Durable Workflow installation was intercepted.
Upstream advisories and fixed versions:
- RUSTSEC-2026-0381:
webpki-roots >=1.0.10. - RUSTSEC-2026-0382: stable
rustls-webpki >=0.103.16. - GHSA-6q48-6c7w-9gw2: Python
certifi>=2026.10.19.
Accepted fix and verification
- Require patched dependency floors in the Rust SDK manifest, not only its local lock: downstream library consumers must also resolve the safe versions.
- Require the fixed certifi floor in the Python SDK manifest, and prove upgrading from an already installed affected bundle selects the patched dependency. Explicit caller-supplied trust contexts remain the caller's responsibility.
- Update the SDK lock and the normal Rust fixture/worker/template locks in PHP SDK, Workflow and Sample App without changing their existing SDK pins or historical evidence.
- Preserve the Rust 1.86 minimum, normal TLS verification and configured private-CA behavior; do not disable certificate or hostname checks.
- Run locked tests and fresh-consumer dependency resolution. Publish a compatible Rust SDK patch and verify the normally installed package and rebuilt consumers.
- Keep immutable historical evidence separate. Native Server and its benchmark dependencies require their owning source qualification.
- Inspect each independent image/build trust path, including OS, Composer, Node, pip and SDK certifi. A fixed library or one clean store does not establish the others. Bootstrap active networked pip clients from the reviewed hash-pinned fixed wheel or prove their effective store is clean. Pin supported image/toolchain identities and qualify published architectures before adoption.
The published dependency floors and rebuilt artifacts, not a passing source edit alone, complete this security follow-through.
Activity
[-]Require patched emSign trust dependencies in Rust SDK and consumer builds[/-][+]Require patched emSign trust dependencies in SDKs and consumer builds[/+]rmcdaniel commentedon Oct 22, 2026
Current delivery
webpki-roots >=1.0.10/rustls-webpki >=0.103.16floors are verified. A normally installed Rust 1.86 consumer resolves both fixed versions and builds. OIDC publication passes from maintained tooling 92a474ec, including short-lived-token revocation. The old GitHub publishing secret is removed; legacy-token account revocation remains pending because that scoped token cannot revoke itself.certifi>=2026.10.19, bootstraps patched pip trust and publishes through OIDC only. 2.9.1 is not yet published or tagged. The remaining dependency is PyPI Trusted Publisher configuration, followed by exact registry/provenance and installed-upgrade checks. There is no long-lived-token fallback.cooperative_cancellationAPI mismatch; that is not reported as a CA or runtime fix.Normal TLS and hostname verification remain enabled. Explicit caller-supplied trust stores, native Server locks, supported runtime images and Cloud deployment retain their separate owners and verification requirements. In particular, the shipped Server Node trust store requires a supported-runtime correction; a clean OS bundle does not prove that embedded store is fixed. No exploitation is established by these findings.
The issue stays open for Python publication/installed acceptance, remaining current-image adoption and legacy registry-token retirement. Earlier failed originals remain recorded on their PRs.
rmcdaniel commentedon Oct 22, 2026
Security all-ecosystem trust review, 2026-10-22 17:4x UTC:
Current product manifests contain Python/pip, PHP/Composer, Rust/Cargo, Node/npm and OS-native curl/Git/OCI paths. A repository-wide manifest check found no Go module, Maven/Gradle, Ruby/Bundler or .NET project, so those are not current product exposures; future support should remain fail-closed rather than being claimed from an untested environment variable.
Verified findings by TLS backend:
PIP_CERTalone is additive. The durable regression is accepted.CARGO_HTTP_CAINFOalone is additive onrust:1.86@sha256:300ec56abce8cc9448ddea2172747d048ed902a3090e6b57babb2bf19f754081. With a synthetic withdrawn root in the system hashed directory and an unrelated clean CAINFO file, Cargo completed TLS to the local test sparse index. Adding an emptySSL_CERT_DIRrefused before HTTP. Server #673 must correct the complete effective store and encode the actual-Cargo counterfactual; its static pip inventory also has demonstrated false negatives. Review: Start every Server pip install from the patched, bundle-only pip (GHSA-6q48-6c7w-9gw2) server#673 (comment).node:22.23.4-slim@sha256:de170b39…bundle has 116 roots and 0/0 blocked subjects. On that image, raw npm with a synthetic affectedNODE_EXTRA_CA_CERTSreached a local HTTPS registry, while the central action'sNPM_CONFIG_CAFILE=<clean bundle>refused withUNABLE_TO_VERIFY_LEAF_SIGNATURE; the mechanism is sound. Encode that actual-npm regression before relying on the advertised npm client. Cloud's current verifier checks onlyemSign ECC Root CA - G3, notAAA Certificate Services; the exact image is clean today, but the regression must cover both. Cloud CI also retains mutablenode:22npm/npx request paths outside the current sink contract.composer:2happens to resolve to qualified 2.10.3 with 0/0 blocked roots, but the tag is mutable. Pin executable Composer images by digest and verify effective trust before package requests. OCI digest pins prevent byte substitution but do not by themselves protect registry credentials or non-digest bootstrap requests.No interception or substituted artifact was observed. Closure remains effective-store proof plus immutable source/image identity, request-sink inventory, exact-head hosted qualification, consumer adoption and installed artifact acceptance—not package versions alone.
rmcdaniel commentedon Nov 2, 2026
General's container-contract decision for #237, unblocking SDK-PHP #223 and Workflow #970:
Retain exact-source qualification. The SDK-PHP cooperative build remains a build of its selected Server source. The host verifier does not authorize the Composer request inside that build.
Reuse the reviewed central
verify-composer-trust/verify.phpinside the actual requesting container/build step, immediately before the unchanged Composer command. The selected clean CA file and empty additional-root directory must be effective for that request, with the existingDW_CI_CA_SHA256check. The contract binds the selected source commit, actual Dockerfile bytes, approved digest-pinned Composer stage, working directory and request command. An unknown or missing hook fails before the dependency request.The BuildKit integration interface to prepare on feature branches is:
dwf_composer_trust, containing the reviewed verifier code;dwf_ci_ca, containing the authenticated public CA bundle;DW_CI_CA_SHA256, binding the bundle selected by the clean bootstrap;General owns the central preparation/validation contract and actual-container negative control. The Server owner owns the Dockerfile hook.
sdk-php-swarmowns the SDK-PHP caller wiring, source/provenance binding and host migration. These components can be prepared independently on feature branches, then qualified together. Security reviews the combined boundary.composer_trust_requiredand the recurring example-lock audit follow only after that complete boundary passes.The counterfactual must exercise the real Composer client: a request trusted by a synthetic ambient withdrawn-root store succeeds in the baseline, and the selected clean store refuses it before HTTP. Effective project/global configuration overrides, missing/changed verifier or source binding, wrong bundle/hash, extra roots, and final-image leakage are negative controls. This decision authorizes implementation within the existing CI scope; it does not claim that these controls have already run or change release/production authority.
rmcdaniel commentedon Nov 2, 2026
Combined qualification checkpoint and source handoff for SDK-PHP #223 / Server #943.
The exact Server source
c4fc6c105f26a4496e9c92dad900c6abbc7a9700passes the central clean-context and reviewed-file checks against a qualification-only candidate catalog, using central54cce4c6a814c8137dafbee594a1e0bdcf0ba60c. Actual Compose rendering accepted the four expected build services. Both.dockerignoreandDockerfile.dockerignoreare included; omitting the latter correctly refused preparation.The published recipe catalog remains empty. The local candidate object is test input, not a registered recipe or dispatch authorization.
The full registered build did not reach either Composer layer: Alpine package-index requests failed DNS resolution before the phpredis-stage Brotli update. This is a runner failure, not a Composer-trust pass or a demonstrated missing package. Its existing minimum patched Brotli requirement was kept. A prior attempt also lacked registry-auth network access in the outer test client; that setup was corrected before the Alpine failure. The isolated application project was removed.
The SDK-PHP owner now takes the bounded actual local caller/BuildKit qualification on the existing available Docker runtime, with General retaining final review, catalog publication and mandatory-policy ownership. Bind current caller
dc7a4e740f67e773bc3387a201ee540041d7aa01(whose accepted trust delta is unchanged), exact #943c4fc6c10, the approved central action/verifier, authenticated clean CA outputs and both registered Compose file sets. Required evidence remains: exact registered enabled build succeeds, each Composer-capable layer refuses missing/wrong trust inputs before its Composer request, and transient CA/verifier/root material and trust variables do not persist in the final image. Retain actual-image versus extracted-hook control scopes separately. No recipe weakening, base-image change, cooperative workflow dispatch, mandatory flag or audit is admitted by this handoff.Candidate recipe identities (SHA-256):
{ "files": { "Dockerfile": "1f717d14c4ab950a46457b67aa4034328706f5871342ffabca5847d8ed17e336", ".dockerignore": "9ae64622b015a660f64c594f6948540e224255ffe64ab1a766ee0633f1d5f5c4", "Dockerfile.dockerignore": "e7bf60d34720f0639193f44ce715d74165bba3355c0dacb5445fe5e82c64ba33", "composer.json": "e22b3c192ac024781142c44a6cc2c81deb6abdd364cf84cba5f15381be98c4f5", "composer.lock": "387eefcb2ae81d08d0ee79dd911a97fb0758ba13640265caeb687a6135d1c1ea", "scripts/ci/WorkflowPackageAuthority.php": "24960bb0afe9078ee0522c81f6be45aa85122e76655fe0a1dfabd5f4ee4de9a3", "scripts/ci/resolve-workflow-package-authority.php": "53ae520195192c20efe6531c3c2a50aef599ff0dcf99ebaf0933cbb6b5a04f86", "scripts/ci/prepare-release-workflow-composer-metadata.php": "a96f9a3d0472646de3476fc1a07ba4754b5832f8cf8739223b16ca8d57a122fd" }, "composer_image": "composer:2.10.3@sha256:da624c2c705d54e2f5a9bb77a5dc6c7d091711433ebefd7035672e84c2010fee", "composer_stage": "composer" }Verifier SHA-256
d7eea290e04e4eef382cc977584a736b1781b18994c5f462f600c0c47e8c5371. Bundle-provenance correction: the local source/render fixture used standalone certifi from an installed SDK application, SHA-2562ef52ad56b4803e264045c915e55c236cbfa045b84b81efefc218a19eb44bd2b. That is not the clean bootstrap's exported bundle and does not qualify the bootstrap-output binding. The unchanged reviewed bootstrap's pinned pip 26.2.2 wheel exports50f79f98dac192b20dbf73f35c56f0b0c557ab267ff5199d1117cc1180b70785(120 roots, blocked counts 0/0), independently checked by the SDK-PHP owner against pip's vendored certifi bytes. The actual combined build must use those bootstrap outputs directly. No Composer layer ran in the local fixture. Final combined evidence and Security review remain required.rmcdaniel commentedon Nov 2, 2026
Security combined-boundary disposition for SDK-PHP #229 / Server #943: the exact-source BuildKit mechanism and final-image evidence are sufficient, but catalog registration remains held on one central fail-closed correction. BuildKit secret contents do not participate in cache keys, and the current
verify_compose_build()accepts extra Composecache_from/cache_tofields. The present caller is safe only because it is a fresh GitHub-hosted job with no external cache import/export; its child-overlay cache hit is same-job reuse of the exact verified base. Before adding the recipe, rejectcache_fromandcache_tofor every registered service and preserve the fresh-hosted/no-external-cache caller boundary, with negative controls. Existing exact proof carries across that bounded validator-only restriction; no full image rerun is required. Detailed receipt: durable-workflow/sdk-php#229 (comment) .rmcdaniel commentedon Nov 4, 2026
General open-item pass, November 4. Owner: General; Security for trust-boundary review; each consumer owner for its graph.
Next action: Finish the remaining Composer trust migration and recurring committed-lock audit without reactivating the withdrawn issuer pilot or changing frozen evidence.
Action taken in this pass: Preserved accepted rollback9fbacc51 and retained e97b028; source inventory/23 controls and focused style/static checks advance Workflow970, and current Symfony fixes use the authenticated public verifier. No App/key/settings activation is admitted.
General retains the cross-repository follow-through. Existing operator stops and exact source/release/production gates remain binding; the item stays open until its actual acceptance is evidenced.
rmcdaniel commentedon Nov 5, 2026
Concrete disabled-pilot App/setup proposal for review. General owns this preparation under #237; this packet does not create an identity, install an App, generate a key, populate credentials or activate a required check.
The accepted issuer is on main through
efcae72a398998af5216ce3873abdea4f0bba834. Fresh repository metadata binds the pilot todurable-workflow/.github, repository ID575230056. The existingprotected-policy-gateenvironment permits only the literalmainbranch. It currently has no variables or secrets, so the protected job refuses at the numeric App-ID assertion before minting or using any App token. That empty prerequisite remains separate from ordinary source qualification.The proposed organization-owned private App is Durable Workflow Policy Gate, installed only on
.github. Repository permissions are Checks: read and write, plus GitHub's mandatory metadata read; all other repository, organization, account and enterprise permissions remain absent. It has no webhook, subscribed events, OAuth/user authorization, callback, setup URL or device-flow use. The issuer uses the App token only for its bound check-run create/update endpoints; its separate Actions token supplies contents/pull-request reads. No content/workflow/administration/secret/action/package permission is requested for the App.The operator-reviewable registration form is pre-filled here. Opening it preselects fields; no form has been submitted. The public slug lookup currently returns 404, which is not a reservation. Any collision returns for review rather than silently selecting another identity or broadening access.
The human-only new-identity step, after review/approval, would be registration under the organization and installation on Only select repositories:
.github. Record only nonsecret App/installation IDs and the observed permission/repository inventory. Do not generate or deliver a private key yet. Keep both environment entries absent, so installation alone cannot start this workflow's issuer.Later bounded activation is a separate decision. Before placing any key, bind the exact reviewed base/issuer and actual App/installation identity; prepare the live same-head/fork, stale-head/base, wrong-App, wrong-repository and malformed-input refusal cases. A private key must travel only through the approved secret mechanism, never chat, issue text, logs or command arguments.
POLICY_GATE_APP_IDandPOLICY_GATE_APP_KEYbelong only in the reviewed environment, after that decision; adding them would make subsequent eligible events capable of minting tokens and is not a passive setup step. No ruleset or required-check activation is implied. Keep the rollout reversible by removing the environment key/ID and uninstalling only this exact App if its future acceptance fails; retain original failed evidence without reruns or check spoofing.Security is asked to review the concrete permission, isolation and staged-activation boundary before General requests the operator's new-identity action. Existing product P1 review keeps priority. No human action is pending from this draft yet.
Primary references: GitHub's pre-filled registration parameters, permission selection, and authentication-only Apps can disable webhooks.
rmcdaniel commentedon Nov 5, 2026
CLI #101 / draft #114 adds an explicit PHP metadata inspector to each native installed verifier. General's independent review correctly holds the new networked
setup-phpprerequisite until its effective trust is established. Current source head649a159 has16 passing checks, but those checks and a later executable SHA do not prove bootstrap HTTPS trust. No release/installed acceptance follows.Exact upstream paths to close: the approved shared exporter75587fc3 provides the authenticated pip26.2.2 CA bundle and Linux-client bindings; setup-php f3e473d1 Darwin
get()usessudo curl, whose CA environment preservation is unproved, while WindowsGet-FileusesInvoke-WebRequest/PHP-manager native fetches. A Linux-only environment export is not a demonstrated Windows native-store policy. There is no qualified cross-platform authority identified by this audit yet.Next owner/action: General selects the existing reviewed cross-platform authority or the bounded source plan; cli owns the actual correction and four-platform source proof. One proposed alternative is a private verifier-PHP CLI from the existing pinned SPC/PHP producer, with exact original artifact ID/digest/recipe binding, instead of adding this independent tool-fetch path. That proposal is not selected and grants no producer/build/release action. Security review/future exact-artifact installed qualification remain separate. No native store, credential, host policy, tag, release asset or Latest was changed.
rmcdaniel commentedon Nov 5, 2026
Security setup-design disposition: PASS for the disabled registration/install stage described in #237 (comment), with the following exact boundary.
Independent current reads confirm repository ID
575230056;protected-policy-gatehas one custom branch policy, literalmain; and the environment still has zero variables and zero secrets. The proposed slug currently returns 404. At accepted issuerefcae72a398998af5216ce3873abdea4f0bba834, the protected job checks protected-main context and a canonical positive App ID before the token action. The App token is requested only for ownerdurable-workflow, repository.github, andchecks:write; the separate Actions token supplies read access. The focused issuer/snapshot suites pass 52/52 locally.The human form must be re-read before submission and retain exactly: organization-owned private App; Checks read/write plus mandatory Metadata read only; no other repository/organization/account/enterprise permission; no webhooks or subscribed events; no OAuth/user authorization, callback/setup URL, device flow or public installation. Install with Only select repositories:
.github. Record the actual App ID, installation ID, owner/slug, permission inventory, event inventory and selected repository ID. A name/slug collision or any UI-added permission/event returns for review.Do not generate a private key or client secret during this stage. Installation alone must leave
POLICY_GATE_APP_IDandPOLICY_GATE_APP_KEYabsent, so the existing workflow continues to refuse before token creation. GitHub documents that private keys are generated only by a separate explicit action, that Checks write is the permission needed for check-run create/update, and that webhooks can remain disabled for authentication-only Apps: https://docs.github.com/en/apps/creating-github-apps/authenticating-with-a-github-app/managing-private-keys-for-github-apps , https://docs.github.com/en/rest/authentication/permissions-required-for-github-apps#repository-permissions-for-checks , https://docs.github.com/en/apps/creating-github-apps/registering-a-github-app/using-webhooks-with-github-apps .Registration/install is a new external identity and therefore still needs General/operator approval; this review supplies no authority to perform it. Key generation, environment secret/variable placement, live token/check issuance, ruleset activation and required-check rollout remain separate gated decisions.
rmcdaniel commentedon Nov 5, 2026
The new App registration/install request is withdrawn. Use the organization's native required-workflow ruleset route for the pilot instead of introducing a custom check issuer and key. No App, key, secret, environment entry or ruleset has been created or activated.
The custom issuer was intended to prevent a caller-controlled workflow from satisfying a same-named ordinary status-check requirement. GitHub's native required-workflow rule binds enforcement to a selected central workflow and therefore removes that custom identity requirement for this case. Native workflow support and the current plan have now been verified; this should have been checked before the App proposal.
General owns the concrete source/ruleset pilot proposal. Reuse protected central checker/read-only data boundaries, with
pull_requestandmerge_groupsupport, exact central workflow/source selection, no candidate code execution or secrets, and a one-repository evaluate-first rollout. Keep existing protections until the positive/fork/negative and queue behavior are qualified. This changes the design, not live enforcement.Applying an organization ruleset requires existing organization-admin authority; the current CLI token cannot enumerate organization rulesets because it lacks
admin:org. Do not automatically widen OAuth scopes. Prepare the exact workflow and importable rule first, then use existing authorized admin access for the bounded pilot. No new external identity is needed.Primary references: required-workflow rules, supported events, source access and merge queues, organization ruleset setup and evaluate mode.
rmcdaniel commentedon Nov 5, 2026
The operator authorized the existing browser-admin session to carry out the reviewed Evaluate-only pilot. The delegated UI readback reports Central workflow policy pilot, ruleset 26628397, saved disabled, verified, then switched to Evaluate. Target is only public repository575230056 (.github), default branch, no exclusions/bypass actors, and the sole required workflow is
.github/workflows/native-policy.ymlfromrefs/heads/main; do-not-enforce-on-create remains true. No Active selection, App, key, secret, account or existing protection change was reported. The exact saved-JSON export is requested for the qualification record. Current CLI cannot independently read this non-active organization rule because it lacks admin:org; scopes remain unchanged.First actual protected-source observation: after the fresh PR298 head2466201 event, native run42066306268/attempt1 bound that exact PR/base58893e29 and ran the main workflow's literal central runtime0525af66. The candidate workflow names runtime46a4b8d instead. Its job completed all read-only setup and refused with
Protected pilot requires closed literal commands or exact reviewed workflow bytes, as expected because the new CI bytes have not entered that protected runtime's allowlist. This records protected-source selection and a real refusal; it is not a passing positive case or completed enforcement qualification. The ordinary candidate's same workflow/job name does not establish authority.Positive, fork and remaining negative observations are still required. Live merge-group proof remains unbound and must precede expansion to a queued target. No probe is to merge unsafe candidate changes. Keep Evaluate; no Active or wider repository selection is made by this checkpoint. Existing required checks remain in place and the separate APT/setup trust work retains its gates.
rmcdaniel commentedon Nov 5, 2026
The browser supplied the saved ruleset export. Comparing its semantic fields with the reviewed import at 58893e2 confirms that the only configured enforcement change is
disabledtoevaluate. Export identity is ruleset 26628397, organization durable-workflow, target branch. It contains exactly repository ID 575230056,~DEFAULT_BRANCH, no ref exclusions, no bypass actors, and one workflow requirement for repository 575230056 /.github/workflows/native-policy.yml/refs/heads/main, withdo_not_enforce_on_create: true.This is the browser's saved-export readback, not an independent organization-admin API read by the CLI. The CLI scope limitation remains unchanged. The actual protected-source refusal in 6664151832 remains the current live observation. No Active selection, target expansion, or completed positive/fork/merge-group qualification is asserted.
rmcdaniel commentedon Nov 5, 2026
Next bounded pilot observation: create one draft same-repository PR from an empty commit on the exact accepted main tree 58893e2. Its head carries
[skip ci]so ordinary package-installing push/PR workflows remain suppressed. No workflow, helper, policy or package bytes change. Observe whether GitHub starts the organization-required workflow in Evaluate for this fresh PR event and record its actual protected workflow/runtime and outcome. A skip or absence is not a pass.This is a disposable observation, not a merge, synthetic Check Run, protection change or Active selection. Existing required checks remain unchanged and may remain pending. Close the probe and remove only its owned ref after terminal evidence. Positive/fork/negative/queue proof remains incomplete until actually observed. The operator has requested a DM when the pilot is ready for an Active decision; no such request is due yet.
rmcdaniel commentedon Nov 5, 2026
The unchanged-tree observation is draft #299, head
5d050288cc31cfb419251a1baecd0448d4c4d8b6, exactly main tree0d225b3ded99b4b75be01d9944fe15f9735b54d3, zero changed files. At readback, its skip marker suppressed ordinary PR package workflows and no organization-required workflow run is present. Dynamic CodeQL passed; the separatepull_request_targetlegacy issuer run failed independently. Neither outcome supplies native required-workflow qualification.This safe skip-marked route has not produced a positive native observation. Do not remove the skip marker while doing so could invoke the unqualified setup path. The next positive observation waits for the accepted closed no-APT setup/caller source; it does not justify changing protections or selecting Active. The first unskipped PR298 native refusal remains the actual protected-source observation. The operator will be contacted by DM when an Active decision is supported by completed qualification.
The probe is now closed without merge. Its exact owned remote head was deleted after identity checks; independent Git readback is empty and the GitHub ref endpoint returns 404. Its clean worktree and exact local branch ref are removed. No source or protection changed.
rmcdaniel commentedon Nov 5, 2026
The next native pilot observation may use normal ordinary source CI under General's narrowed process scope. Reopen the same disposable unchanged-tree probe with a new empty head commit that has no skip marker. Protected main remains 58893e2. An independent data-only comparison confirms its five complex workflow byte hashes all match the actual protected runtime 0525af6's closed table.
This fresh unskipped event replaces the intentionally skipped observation, not its historical result. Record the actual platform-required workflow/source identity and outcome. No source, protection, rule enforcement, App or publishing setting changes, and no merge of the probe. Existing required checks remain unchanged. Evaluate stays selected; positive/fork/negative evidence must be observed before the operator is asked for Active.
rmcdaniel commentedon Nov 5, 2026
Actual same-repository positive observation PASS: run 42085911016, attempt 1, workflow ID 408387911, check suite 114042340945, job 127450822411, 18:36:51–18:37:15 UTC. PR #299 head
49f150da8e760e838d30b8b266cd9e6388031e97is an unchanged tree on base58893e29b535d49cdbfd262c2cabf57b32212f6e; API event metadata binds repository/head-repository 575230056 and the exact PR/head/base.The actual job checked out only protected runtime
0525af66c835d1b952df0255a3afef0c55bbf128. Its result binds all ten read-only inputs, input SHA-2566e7ffca6865627778dafcca6a19b2bd4e3e09f6de2123260be8f3f9fd599a939, policy SHA-256dbc221cea1b928b1afdffeb0812cc46a7d0d1a34c90a0e24210d2c0a82e534d3, nine approved action identities and subject pull_request. Ordinary Shared and Sonar also pass; the obsolete empty-App-ID job remains separately failed. No new App is needed and no failed result is relabeled.This completes the first fresh same-repository positive. The earlier skipped attempt remains non-evidence. A public-fork observation and the same-name negative/source-substitution control remain outstanding. Queue proof is still not claimed; the one current target has no selected merge queue. Keep Evaluate and every existing protection. No probe merge or Active decision is selected.
rmcdaniel commentedon Nov 5, 2026
Next two bounded live controls: an ordinary same-named job whose workflow body is a harmless no-op, and a genuine public fork PR from the unchanged accepted source. Both are nonmerging qualification PRs with read-only token permissions; no customer artifact, tag, release or image is created.
The same-name control adds a separate ordinary workflow/job with the pilot's display names but no policy check. The actual organization-required workflow must still select protected main and refuse that unsupported candidate workflow; a successful ordinary job is not policy acceptance. Preserve both original results.
The fork uses one temporary public fork under the existing maintainer account, not a new identity or organization repository. Its own Actions remain disabled. After the original test evidence, close the probe/owned branch and retain it archived pending final cleanup through existing administrative access. No credential scope is expanded. The final Active request will name any remaining cleanup, and the rule stays Evaluate meanwhile.
rmcdaniel commentedon Nov 5, 2026
The bounded public
.githubEvaluate pilot has completed its live positive and negative controls. This is evidence for the existing one-repository pilot; enforcement remains Evaluate until the operator selects Active.Protected source throughout these controls: main
58893e29b535d49cdbfd262c2cabf57b32212f6e, workflow.github/workflows/native-policy.yml, workflow ID408387911, literal runtime0525af66c835d1b952df0255a3afef0c55bbf128. The actual logs show only that runtime checkout, with Contents/PullRequests read permission. Candidate workflow/helper bytes were read as data.49f150da8e760e838d30b8b266cd9e6388031e97127450822411.ee67b592c44e8325bec8337c63d960f4fdc07430, head repositoryrmcdaniel/dw-native-policy-pilot, ID1447393140127461351748, suite114050403108.6d5825be88e5cc4ecec61718798dd3e0f2d2d784408522163, pathnative-pilot-counterfeit.yml, run 42088770510/a1, job127460921662, succeeded. The distinct selected required workflow ID408387911, run 42088770278/a1, job127460920480, failed on the unsupported candidate workflow.2466201The fork result binds repository ID
575230056, head repository ID1447393140, base/head SHAs, PR302 and subjectpull_request. Both positive receipts bind input count 10/action count 9, input SHA6e7ffca6865627778dafcca6a19b2bd4e3e09f6de2123260be8f3f9fd599a939and policy SHAdbc221cea1b928b1afdffeb0812cc46a7d0d1a34c90a0e24210d2c0a82e534d3. The negative required run preservedProtected pilot requires closed literal commands or exact reviewed workflow bytes; it did not become a successful skip. The legacy App-ID workflow failures are separate and have not been waived or reported as passing.Read-only GraphQL reports no merge queue for this
.githubtarget. A live merge-group result therefore remains required before any expansion to a queued repository. Local stale/base/repository refusal controls are source evidence, not additional live observations. Evaluate does not enforce a merge block; no merge-block claim is made and none of the probe PRs will be merged.Recommended next operator action: select Active for existing organization ruleset
26628397, retaining only public repository ID575230056,~DEFAULT_BRANCH, no bypass actors and the exact central workflow path/ref already exported. Keep every existing protection. Rollback disables only this pilot rule. No App, key, scope expansion, repository expansion or queue change is required.Probe closure and resource cleanup are recorded in a follow-up. The temporary public fork's own Actions were disabled before its PR and remain disabled. The current CLI credential has no
delete_reposcope; no scope expansion will be requested to remove the inert evidence fork.rmcdaniel commentedon Nov 5, 2026
All three General-owned qualification PRs (#299, #301, #302) are now closed without merge. Immediately before cleanup their exact heads, closed/unmerged states and clean local worktrees were rechecked. Their three exact remote branches are deleted (404 verified), and their local branches/worktrees are absent. No other owner's branch or worktree was changed.
The genuine public test fork
rmcdaniel/dw-native-policy-pilot(ID1447393140) is archived, with its own Actions disabled and its probe branch removed. It retains public source/evidence only. It was not deleted because the existing CLI credential lacksdelete_repo; no scope expansion or browser-session authority was assumed. There are no live probe jobs or further qualification dispatches selected.The complete live Evaluate result is ready for the operator's one-target Active selection. General will send the promised direct message. The rule has not been changed by General.
rmcdaniel commentedon Nov 5, 2026
The browser-admin activation attempt did not commit. The browser agent reported GitHub returned Unauthorized after the enforcement-only Active save. A fresh browser reload restored the saved header and selector to Evaluate and discarded the unsaved change; the bypass list remains empty. The fresh pre-change export matched the reviewed one-repository/default-branch/exact-workflow field set. This is an attributed browser observation, not a claim that the CLI can read the organization-admin rule.
The existing CLI's read-only repository ruleset list still does not show this rule as active. General has not changed credentials, scopes, identities or protections, and no successful activation is claimed. The live qualification and probe cleanup remain complete.
Next action is the operator restoring their existing browser organization-admin session/access. The browser owner will not retry until that restoration is explicit in its own operator conversation. After any successful save, obtain a fresh saved-state export and compare only enforcement changed before declaring Active. General sent the operator this concrete access blocker by DM. No technical requalification, new App or broader token scope is requested merely to recover the existing session.
rmcdaniel commentedon Nov 5, 2026
One-repository native pilot is Active
At 2026-11-05 19:25:14 UTC, General's independent GitHub repository API changed from the four existing repository rules to those same four plus organization ruleset
26628397, enforcementactive. Direct repository-rule read now succeeds and verifies the default-branch selector, exact workflow repository/path/ref,do_not_enforce_on_create:trueand empty bypass list.The browser agent attributes the successful save to the operator's direct action and returned a fresh saved-state export: 725 bytes / SHA-256
6378bb3263434f1af5fb574aea56353b9e0b0bace9d7928513c9faa4cc718291. General reconstructed and rehashed the supplied exact JSON and the earlier Evaluate JSON (727 bytes /d96dba4bd8748acb89e418ac3b6b6142e975df9640cb41211e33ffa7db73b6c0): the sole semantic change isenforcement: evaluate → active. The export retains only repository ID575230056,~DEFAULT_BRANCH, no excludes and no bypass actors.The selected workflow remains
.github/workflows/native-policy.ymlfromrefs/heads/mainin repository575230056. Existing repository protections25910824,19069610,25908992and25290868remain active. General did not mutate settings or change any identity, credential or scope. The organization-admin API still correctly requires the unavailableadmin:orgscope; no expansion was attempted. Repository-level readback independently proves Active on the intended repository, while the exact exported organization selector supplies its one-target scope.The earlier Unauthorized save and fresh Evaluate reload remain historical failed observations; they are not activation evidence. The later successful save and independent API response supersede that access blocker. Live positive/negative qualification and probe cleanup remain unchanged.
No new probe is needed merely to repeat the completed qualification. Observe the next real central source PR's native result and normal protected integration under Active. Do not expand to private or queued targets without their separately qualified visibility/merge-group behavior. Rollback disables only this exact pilot rule; no other protection is part of rollback. CLI owns its current central source successors and the real existing required checks. This milestone does not close unrelated central setup, publishing or consumer acceptance work.
rmcdaniel commentedon Nov 9, 2026
Caller-adoption finding (General, Nov 9): Cloud Dependabot PRs #677/#678 bumped
bootstrap-patched-pip/verify-composer-trusttoedba47c8and failed on hostedubuntu-latest, which now resolves to Ubuntu 26.04. There/optis root-owned mode 0777, soselected_loaderrefuses/opt/hostedtoolcache/...(Runtime directory refused: path=/opt uid=0 mode=0777). This is the intended no-relaxation behavior, but the central repo has no workflow running the current action on that image with setup-python, so source CI stayed green. Adoption in each repository must dropactions/setup-pythonahead of this action and use the host/usr/bin/python3, or pin a runner image where the toolcache chain is safe. I closed the two Dependabot PRs; Cloud main stays on76f33380until a deliberate caller-adoption change.rmcdaniel commentedon Nov 9, 2026
General completed the hosted private-pip bootstrap correction in #357, main
85d3cf817714fa781b05c5f5aa1c7efdaa199385. Its ten source checks and all protected-main trains passed, including actual Python3.13 bootstrap with the authenticated CA and pip26.2.2. The exact cataloged action source is52283e2e8ea9a2cf7e3865ee30f2a72a38b098a2; its action subtree is identical to the hosted-qualified subject. Both original permission and generated-entrypoint refusals remain attributed.Consumer follow-through is active in SampleApp#333 at
e17bfcb0: current main/Native3.3.2 tuple, eleven central references pinned to52283e2, and unchanged exact-pin contract checks updated to that qualified source. At21:38,33checks are complete, one timer lane is live and none have failed. General owns terminal verification/merge and the remaining maintained-consumer adoption. This does not close #237’s broader dependency/consumer scope or waive #297’s separate PHP setup/release qualifications.rmcdaniel commentedon Nov 9, 2026
Sample App caller adoption is now source-qualified on protected main through333 and332 (a39f0d17); all push/source workflows pass, with the original child-cleanup failure retained and its single failed-job rerun passing. Published developer-image follow-through is blocked by GHCR write authorization, tracked with General ownership and the concrete admin next action in durable-workflow/sample-app#335 . No scan/anonymous image qualification/channel promotion ran in the failed publication. This does not close the broader bootstrap/image/cold-publisher/issuer/fork acceptance here.
rmcdaniel commentedon Nov 11, 2026
Security, Nov 11: closing. The emSign trust exposure is fixed for users.
The current published SDKs enforce the patched floors in their manifests, so fresh and upgraded downstream installs resolve the safe versions:
durable-workflow4.12.0 (crates.io):rustls-webpki ^0.103.16,webpki-roots ^1.0.10(RUSTSEC-2026-0381/0382).durable-workflow2.15.0 (PyPI):certifi>=2026.10.19(GHSA-6q48-6c7w-9gw2).The CI-trust work that accumulated here (bootstrap, image and publisher qualification) is hardening, not this finding. Its open pieces are tracked elsewhere: GHCR publish authorization in sample-app#335, the APT gate in #295, and setup-php byte binding in #297.
One item may still be open and needs the operator: revoking the old crates.io publishing token after the move to OIDC ("account-side legacy-token revocation" above). If it's done, nothing further; if not, revoke it in the crates.io account settings.
rmcdaniel commentedon Nov 11, 2026
Waterline (2026-11-11): no Waterline slice.