Skip to content

Pin PHP for Rust compatibility vectors and source parity - #155

Merged
rmcdaniel merged 3 commits into
mainfrom
cli/297-php-reference
Nov 14, 2026
Merged

rmcdaniel merged 3 commits into
mainfrom
cli/297-php-reference

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Nov 14, 2026 •

Copy link
Copy Markdown
Member

Rust parity checks installed PHP through an upstream action whose installer inputs were not bound. The Rust job now uses the exact admitted PHP 8.4 container profile for compatibility vectors and PHP source-reference cases, while retaining its original Cargo, pinned native-reference, Composer and parity commands.

Compiled Rust binaries and host controls remain read-only. The launcher permits writes only to the vector JSON file, dependencies and private runtime/config data; it excludes host credentials and PHP startup overrides. The profile explicitly checks production INI, no coverage, UTC, unlimited memory, disabled PHAR writes and disabled CLI OPcache.

Validation: four inert controls, six real replacement/data-write scenarios, actual Composer clean-trust/TLS checks, production install and 540-vector generation pass locally. Full local parity reports 919/947 matches, 28 intentional differences and zero unexpected differences. Central #398's exact 22-file admission is merged and all main checks pass; independent source/catalog/adoption reviews passed. Fresh hosted original-caller and aggregate/main verification are recorded in the PR comments.

This changes only build.yml:rust. Reproducibility, maintained 2.3.x release callers and wider shared #297 closure remain separate; the selected legacy macOS SPC refusal is preserved.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Frozen source for the next shared #297 caller: 8d85f0ac7f1e29000f75069cfd1e1ce68aa69bc1. Live build.yml remains unchanged until accepted central admission.

The new profile requires PHP8.4.27/Composer2.10.3, production INI, no coverage, UTC, memory=-1, phar.readonly=1 and CLI OPcache=0. It reuses the unchanged accepted base builder and its exact original 14-file input set. The inspected retained Linux/amd64 image is sha256:747afb163fc37bffdf92b327da725e606a0695ba984398d09dd4b7e5f2fcb8d5; there is no duplicate build or inherited caller acceptance.

Local source/runtime checks pass: four inert launcher controls, the real six-scenario predecessor/candidate launcher/wrapper/compiled-binary replacement control, required data writes and following real PHP calls, plus ambient-positive/selected-clean Composer curl60-before-HTTP TLS control. The actual Composer verifier reports2.10.3, CA SHA50f79f98…,120 roots and zero blocked roots. Production install and generation of540 cluster vectors pass. Full local parity is running separately; hosted original Cargo/vector/parity gates remain required.

The entire Rust target stays read-only except the existing owned single-link vector JSON file. Private parity config data is allowed only under the runtime temporary tree; role tokens, arbitrary DW/DURABLE_WORKFLOW variables and PHP startup overrides are excluded. The original pinned native2.3.5 reference and host Cargo/Python stages remain unchanged.

Source Mode SHA-256
docker/php-ci/README.md 0644 713a1ac8b43b300f7182aa2e55490e81c9e007f745417b815f3bc61ee9717c14
docker/php-ci/reference.ini 0644 94b40d9558a170b09785010b8016b19c32fadc2c43cd2b7518b2c74aac1d6b55
rust/parity/test_php_reference_container.py 0644 71b1e8207bc3e3df28e7b9210ed23226139e6cd896d2baf64592f1b0dc05017c
scripts/ci/prepare-php-reference-container.sh 0755 f82fb1434c1c0efbf198474c9174574c0690a946ae19a85925d7109bde1b9c5d
scripts/ci/probe-php-reference-runtime.php 0644 855e21c5d444038f116ea5523494d8b28c2cb59053e932cf1fff2e61c7efd1c2
scripts/ci/run-php-reference-container.sh 0755 b1ab4dc87b55bb6693f3e39dbd1b0ba8152c0f950984d70d62c9ab123693f8dd
scripts/ci/setup-php-reference-container.sh 0755 7daf89ec02bed806218c4c33d8746db921cb5d1a4ad415c03fdc1072c52f0480
scripts/ci/test_php_reference_container.py 0644 a6c2f0c1bd06d386f94876c0c5dcfe1278a1a13281270af7d43223730cc7f99c
tests/fixtures/php-reference-workflow.yml 0644 b4c31c7dbddce6ad7b00a010f8c1cb073acf28c2ef4a1969a32e8806595b8920

Independent Security source/profile review is requested before central catalog admission and hosted activation. Scope remains this caller only; no reproducibility, maintained2.3.x release, generic profile or whole #297 completion claim.

@rmcdaniel

rmcdaniel commented Nov 14, 2026 •

Copy link
Copy Markdown
Member Author

Security source/profile review: PASS for 032400b. The only change from reviewed 8d85f0a is removal of the final blank line in the inert proposed-caller fixture; every runtime, probe and control byte is unchanged.

The launcher keeps the repository, wrapper state, compiled Rust output and control sources read-only, then overlays only the existing dependency directories, private home/tmp/Composer data and the owned single-link php-vectors.json file as writable. The parity config path must be an owned real directory inside the private dw-parity temporary tree. The immutable image config ID, exact PHP 8.4.27 INI profile, container Composer PHAR substitution, CA mounts and environment allowlist are checked before invocation. Host token and PHP startup variables are not forwarded. The predecessor controls distinguish writable wrapper/source/native replacement from the candidate read-only mounts while retaining the intended data writes and following real-PHP invocation.

I independently matched all 22 cataloged file digests and Git modes in central #398 against this head, confirmed both prohibited Docker ignore files are absent, and confirmed the proposed central fixture is byte-identical. This review is limited to this PHP-reference caller and does not authorize the other #297 callers or a generic profile.

Activation remains held for accepted central-main readback and the first hosted original-caller result. Exact-head PHP 8.3 is runner-blocked before PHP installation or repository tests: the bound setup action reports HTTPError with status 403. That status alone does not establish an authentication cause. The failed check remains NONPASS and must be resolved through the normal owning workflow without inheriting the prior head.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Local PHP-reference functional observation PASS at runtime source 8d85f0ac7f1e29000f75069cfd1e1ce68aa69bc1. Successor 032400b changes only the inert fixture EOF. Linux/amd64 uses inspected retained PHP image sha256:747afb163fc37bffdf92b327da725e606a0695ba984398d09dd4b7e5f2fcb8d5; no duplicate build.

The exact profile, four inert tests, real six-scenario predecessor/candidate control-replacement test and Composer TLS control pass. Required dependency/vector/private-data writes work and following real PHP calls retain the reviewed launcher. The actual guarded Composer2.10.3 uses clean CA SHA50f79f98…,120 roots and zero blocked roots. Production dependency installation and540 cluster-vector generation pass.

The full original host suite completed at00:44:00 UTC on November14:63 unit cases pass with two explicit runtime-dependent skips, followed by919/947 parity matches,28 recorded intentional differences and zero unexpected differences. Actual runtime controls ran during preparation at00:36:20–00:36:28 UTC. The local candidate was the unchanged published CLI2.8 binary SHA da366c79c90978a3c0a92d723c66a96a2d0963f9dccbd41c8207f2c41848f814; the original pinned native2.3.5 reference was freshly fetched and checksum verified. Rust source/Cargo inputs are unchanged from2.8. This observation does not replace hosted current-source Cargo/vector tests.

The final own-container inventory is empty. All30 captured create-event IDs below independently return no-such-object. The finite Docker event history is an observation of captured IDs, not a complete execution receipt for every parity invocation.

0d894d78c5d9a2635be7a392d0834bc2063a7420d3eed0a924946aa78087e463
0e2e81f86ca8a07406a3670def1fd57e5874ad678e08630453dbf29208684134
1222bf9cfba038851d34a107978e904830a1cdf9d0d8d71b369be4b9f062ed4b
1b84a5766bf9ad588e14e7088bcdd6f2f4af8207314bdda2b470f1e2abb731de
291ee3f7d6cb67075fa86e8c1c4e9132e230ba89eac8b898a2d0852873c0c5f2
29824468f3234e969dc58a5fb37c53ac0697a6f3a5084635947c0e0255caee20
2e1616fff3ff6ced8ff11b6b31bcfd61186877e23282a53111eb8ea9a0b89549
2e960e4d7f58fa816eac82f9b1652738472fcf398fdda556ad33a664ac537a4a
2fc8f72914250fdb0899157e2c367a879188259200333e697a672ccad10cbbb3
4514297fe496255e9953e349b46fe1ccfc327c38e2c02c15c40af0e8a6b89d64
591e1261f6b990f580bb3f0d272053b3f34cd250e35d26838ebba83a38f687ca
59a92972ff63a96e8b0cd6df4607067e65471484ab93e95224868a4a1988a8f4
636dff44c86c2b4216a4ce7ea54f035b6e8907319e3e527e13d98477737beb54
7edaf1bc05c3348086a69ac324cc65b10ebbe1e9fce6e491a24eb3f525abff82
7ffac2fcfa2fa9c759696bc0e5e3f0f73dc67ae225561d92cf8ca5ce076c90d0
84a7749a4e23218ef229f71a19f773f9dfbd7b78dea64fa36a391171930144da
893fc7fd290567e4528b873c30f913d1d8fe7d153812518d6fdf9d4b7d68a891
8bbcf4c3d2735224f958fbf73b4aa204d4f5e68997d7e45b968a3a4058c2b070
8e77ab5108648832950f5454c06e5181417d5af2cc616d7d98a66ccb2d7d54e3
964200bbffb1117453a28946da78019aa836f5920050ec0ba7331814bff16eab
9b6a9c226417d5d5030ca02813146b389bf3f5efc98964792a2bec4bd49685e1
b288eeb8456eeabf12b1f3931a90eea65fec541c94bc9fbc40b520296f33d78d
ba0ce39585e285bdf115cfba10a423761cfb35616abe72f3a9625f5c0e676a22
c53025a6cdf3ddca0e13859cd7c378b673d68260cf3a965566538e2db5168cc4
d2c4cac5f4a1d6de7ae70fa33d1e847772d2107a9f057c45e85e8238faeff1de
da82754603b831e9e9c4d67d964bfa61052fb7a54242fc0736d3420d7929cce5
db3512132ab78125001bf5771580686be502bbc205f834160ff9dc301e42a544
e0cffeaa7bbf3e5e89c42d13cc9f5ef6561dc70e555be43442f0ed4a7b720d4f
f254d56db9630d7822dfef08bd83016321c3894280a191f6860d4b912302a16d
f72a5ca68f4c61ce11a59cbdb358299b38b34b1fc3506fe3d5c8203ae3b162ba

The unchanged PHP8.3 job132264245287 on032400b is pre-test runner-blocked/NONPASS: bound PHP setup refused HTTP403 before installation at00:40:50 UTC. Its job log is available through the API. No fallback or guard change is selected. A fresh exact-head result remains required.

Independent source/profile PASS: 6868705897. Central398 admission and its accepted-main verification precede hosted activation. Other #297 callers and release paths remain separate.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Workflow-only adoption is frozen at 3dbda322d3c07d0ae678988cf83472ede0352d98 / tree f944073b1caf99e038c12b99ba7532e340fd38aa. Only build.yml changed from passed032400b; its complete SHA256 is 099572ff5958a690324e1120c7976100121f6abf1b9f9089e76b3b5b0b35582b. The parsed Rust job exactly equals the admitted proposed fixture. Other jobs, all22 bound blobs/modes and both absences remain unchanged.

Central398 accepted main 57c23b63c77284371bfc83f2ba562bdf4230ddaf exactly matches reviewed tree d3d1d059; all three main workflows pass and topic absence is verified. Owner readback6868795701 and independent readback6868799650 close that gate.

The current full target validates eight guarded dependency requests. The Rust job now waits for action-policy and runs the fixed source-reference setup. The original Cargo checks/build, compatibility generator and ignored tests, pinned2.3.5 reference, actual Composer verifier/install, host unit tests and complete parity suite remain present. Fresh hosted results and terminal aggregate checks gate merge; the prior032 HTTP403 remains a separate NONPASS. No runtime replay is attributed to this workflow-only commit.

@sonarqubecloud

Copy link
Copy Markdown

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security exact workflow-adoption review: PASS for 3dbda32 / tree f944073b1caf99e038c12b99ba7532e340fd38aa.

The sole change from reviewed 032400b is .github/workflows/build.yml. I parsed the resulting rust job and the accepted central #398 fixture from merged main 57c23b63; their job objects are equal. The change adds the existing action-policy dependency, replaces the unqualified PHP setup with the pinned accepted-central checkout and the single admitted setup command, and preserves the Cargo, vector generation, native reference, live Composer verification, dependency install and parity commands. All 22 reviewed runtime/profile/control blobs remain byte-identical to 032400b.

This closes the adoption-source gate only. Fresh exact-head hosted execution, the original caller result and the aggregate checks remain required. The earlier 032400b PHP 8.3 pre-test HTTP 403 remains a separate NONPASS and is not inherited or relabeled.

@rmcdaniel
rmcdaniel marked this pull request as ready for review November 14, 2026 01:01
@rmcdaniel

Copy link
Copy Markdown
Member Author

Fresh original hosted caller PASS at exact 3dbda322d3c07d0ae678988cf83472ede0352d98: Build43536687894 / Rust job132267444663. All28 current checks, including the fail-closed aggregate, are terminal SUCCESS.

The job built its own pinned base/runtime pair:

  • Base config sha256:eadaa6f837dd0e2eee58193308b25ae4a903f1157a2bb16473938421abe6dff0.
  • Runtime config sha256:dec15e59de525d09c3ab64ea8da40bf00a64b916b3b77c850c6365009e060a05.
  • PHP8.4.27/Composer2.10.3, production INI, coverage none, PHAR writes disabled, memory=-1, UTC and CLI OPcache disabled. The actual Composer guard reports CA SHA50f79f98…,120 roots and zero blocked roots.

Original Cargo fmt/clippy/full test/build steps pass. The generator produces540 cluster vectors; both ignored PHP-vector comparison tests pass. Original checksum-verified native2.3.5 acquisition, production Composer install and63 host unit cases pass. Actual runtime/TLS/boundary controls run during preparation, so the host lane's two runtime-dependent skips do not stand in for that evidence. Full parity reports919/947 matches,28 recorded intentional differences and zero unexpected differences.

The fresh unchanged PHP8.3 job132267304511 also passes, resolving the current gate while preserving the earlier032 HTTP403 attempt as runner-blocked/NONPASS. Independent source/adoption review 6868825937 and accepted central398 remain exact. Normal merge/main/tree/branch and fresh actual-main caller checks follow; no other297/release/platform scope is inferred.

@rmcdaniel
rmcdaniel merged commit 5421757 into main Nov 14, 2026
28 checks passed
@rmcdaniel

Copy link
Copy Markdown
Member Author

Security exact-head hosted gate: PASS for 3dbda322d3c07d0ae678988cf83472ede0352d98 / tree f944073b783319a1ccf45d7b874fbf912db8ac35.

All 28 current checks are terminal SUCCESS, including the accepted central-policy preflight, PHP8.2–8.5, PHAR smoke and bit-identical rebuild, the exact Rust hosted original caller, unit/parity, published-Server parity, five-platform builds, assembled release assets, CodeQL, Sonar and target qualification. The earlier 032400b PHP8.3 setup HTTP403 remains a preserved predecessor NONPASS; it is not a current blocker because the exact successor job completed the same lane successfully.

This closes Security source/hosted workflow adoption review for this exact head. It does not approve a CLI release, generic caller admission, Server/SDK publication, profile expansion, or any merge mechanism. CLI retains ordinary normal merge and accepted-main readback ownership.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Delivered: build.yml:rust now uses the exact admitted PHP source-reference profile.

Normal merge 5421757314303952359c6a72ce74924bc699112e has reviewed tree f944073b1caf99e038c12b99ba7532e340fd38aa; merge-point main equality and remote topic deletion/absence were verified. All four workflows on that exact main commit are terminal SUCCESS:

The fresh actual-main Rust job 132271953829 built its own base sha256:3e2895ccf3b6010410d03ce246907f77acd430b19bed5db018a3e0a9cb97423f and runtime sha256:f6964f73aafa31cfb64216217a3a79b85cb8a55e9abf6a4244519916198e3548. Exact PHP 8.4.27 / Composer 2.10.3, INI, module, clean-trust/TLS and replacement controls pass. Original Cargo checks/build, 540-vector generation and both ignored comparisons, production install, 63 host unit cases and the full parity corpus pass: 919/947 matches, 28 intentional differences and zero unexpected differences.

Central398 is accepted with independent main readback; all 22 registered runtime blobs remain byte-identical, including after the subsequent fixture-only156 change. Independent terminal source/caller gate is 6868998683. The prior032 PHP8.3 HTTP403 remains recorded NONPASS; this exact main's PHP8.3 result passes.

This closes only the Rust PHP-reference caller on its observed hosted Linux/amd64 runner. Reproducibility, maintained2.3.x release callers, generic profiles and full shared297 closure remain separate. The selected legacy macOS SPC refusal is unchanged.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant