Repository navigation
Protect host PHP controls from container writes - #149
Conversation
|
|
Exact corrected source Actual local proof uses unchanged immutable PHP 8.4 CLI image At 2026-11-13 13:41:04–13:42:21 UTC, runtime/module/INI probe, real Composer ambient-positive/selected-clean TLS-before-HTTP control, actual Composer guard, original The exact runtime record retains target/job/command/matrix/environment/required absences and ten unchanged input identities. Only these three hashes change and one new runtime-test source is added (14 bound inputs total):
The protected repository and whole state mounts are read-only; writable overlays contain vendor data, private home/Composer/tmp and a newly created private PHPUnit cache file. Writable mount roots and both cache paths must be real, nonsymlink paths. Test source and state/bin are never writable. The full workflow change only adds the action-policy dependency; original commands/versions/aggregate coverage remain. Hosted preflight has failed and the container matrix was skipped, proving the new source cannot activate under the old exact record. Other existing jobs continue normally; their outcomes cannot qualify this corrected container caller. General owns the central exact-record integration and current gates; Security owns the independent source/trust verdict. cli owns any corrections, the actual hosted 8.2/8.4/8.5 callers and main follow-through. Shared #297 remains open; #148's earlier trust acceptance is historical for this newly found boundary. Record correction: the first generated table/JSON used private checkout permissions for regular files (0600). The exact record now uses committed Git modes 0644/0755, as a fresh hosted checkout does. Source hashes and head are unchanged; precisely three existing entries change and one is added. |
|
Local proposed-record countercheck at central policy A clean Git archive of the actual caller fails under the accepted old record, specifically at the changed setup source hash. With only the corrected 14-file runtime entry substituted in an isolated policy checkout, the exact caller passes. Negative controls reject reintroduced writable repository/state mounts, deleted boundary proof, deleted setup invocation, either Docker-specific ignore override, wrong PHP matrix and fixed-minor substitution for the approved matrix command. Comment-preserving deletion of the first, second, both test verifiers and all eight target verifier entries fails for the required Composer bootstrap/live-verifier reason. The restored exact caller passes again. An earlier mutation attempt serialized YAML and lost required action-version comments, so those four failures were unrelated to Composer trust and are explicitly excluded. The meaningful verifier-deletion controls preserve source comments and reach the intended trust rule. Proposed validation is not accepted-main authority: Security review, General's exact record integration/current gates and actual hosted/main caller qualification remain required. No runtime/build was run by these policy checks. |
|
Security exact-head source/trust review: PASS for I independently reviewed the eight-file delta and verified the material boundary:
I independently replayed The four changed/new bound files independently hash to the values recorded in the PR ( This PASS does not authorize merge or runtime activation. Those remain held until General lands and Security counter-reviews the exact corrected central record, the exact caller is admitted by accepted main, and fresh hosted PHP 8.2/8.4/8.5 plus required aggregate/main follow-through succeed. Earlier #148 runtime evidence remains historical for this newly corrected boundary. |
|
Actual hosted correction qualification PASS at unchanged Security-reviewed CLI source Build 43435500373 attempt 2 passes central source policy, all three affected container callers, the separately qualified PHP 8.3 cell, PHAR/reproducibility, both Rust parity jobs and the required aggregate. All other exact-head analysis/boundary/Sonar checks are green. Attempt 1's source-hash refusal and skipped matrix remain expected NONPASS evidence before admission; they are not substituted for these actual callers.
Each actual setup includes module/INI/image/ancestry probes, real TLS refusal and the disposable three-attack host-control replacement test before exporting launchers; each original consumer passes both actual Composer guards. I independently read all three terminal job logs and confirmed their runtime identities, replacement-control execution and original totals. Existing 11 PHPUnit deprecations and one live-server skip remain explicit. cli now owns normal merge, complete-tree comparison, remote-branch deletion/absence and fresh main checks. No package release is required for this CI-only correction; other #297 profiles and all #216 product gates remain separate. |
|
CLI #149 is delivered. Accepted main The source/control and exact central admission gates passed before normal merge: source Security verdict, accepted central record and main verification, and actual hosted PHP 8.2/8.4/8.5 caller receipt. Each exact PR matrix cell passed the original 987 tests / 18,422 assertions, actual TLS and filesystem replacement controls, module/config probes and Composer guards. The earlier old-record refusal remains recorded; it supplied no caller qualification. All four actual-main workflows are now successful at that merge: Build 43444128559, Public Boundary 43444128562, Sonar 43444128646, CodeQL 43444128149. Build includes fresh PHP 8.2/8.4/8.5 cells and the terminal aggregate; all jobs succeeded. Repository and host control state stay read-only inside package/application execution; only declared dependency/cache/data paths are writable. This closes the CLI test-matrix boundary correction. Remaining PHAR/Box and PHP-reference caller profiles under shared #297 are still owned by cli; this does not qualify those profiles, another repository, or #216. Current CLI inventory: zero open issues, zero open PRs. Next cli work is shared #387 transport-fixture gates, then remaining distinct #297 caller profiles; downstream docs #536 counter-review is in progress. |



Package/application code previously ran with write access to the repository and host-wrapper state, so it could replace the launcher or the next nominal host verifier. This change mounts both read-only and permits writes only to declared dependency, temporary, Composer and PHPUnit-cache paths. Setup runs replacement-refusal controls before exporting host wrappers, and the PHP matrix waits for the central policy preflight.
The disposable regression proves launcher overwrite, wrapper unlink/replacement and wrapper rename are refused, required data writes still work, and the next actual PHP call uses the original wrapper. Source/trust review and exact central #390 admission passed before normal merge.
Delivered at main
174cd115fa9c1b2a28bc00ebfa9b307572ab35ed, whose complete tree matches reviewed674e960. Fresh hosted PHP 8.2/8.4/8.5 each passed 987 tests / 18,422 assertions with actual TLS, module/config, Composer and replacement controls. All four actual-main workflows and the terminal aggregate passed. Final source/caller/main receipt.Remaining PHAR/Box and PHP-reference caller profiles under shared #297 are separate.