Skip to content

Bind SDK read-only PHP runtimes to unit and Carbon jobs - #386

Merged
rmcdaniel merged 4 commits into
mainfrom
agent/sdk-php/297-runtime-record
Nov 13, 2026
Merged

rmcdaniel merged 4 commits into
mainfrom
agent/sdk-php/297-runtime-record

Conversation

@rmcdaniel

@rmcdaniel rmcdaniel commented Nov 13, 2026 •

Copy link
Copy Markdown
Member

Admit the SDK's corrected read-only PHP8.1/8.2/8.4 unit runtime and fixed8.1 Carbon2 runtime as two separate existing-catalog records. This replaces the unactivated writable SDK preparation; runtime activation remains held until exact review, all consumers and current gates pass. sdk-php owns normal central integration after General’s explicit handoff; General retains shared product acceptance.

Bind14 exact file hashes and canonical Git modes from Security-reviewed SDK412 source07f31726, merged as e2720a1. Repository/control/state/bin mounts are read-only; only declared dependency/lock/cache/output/private-data paths write. The fixed Carbon command alone includes literal carbon2, whose host-only read-only marker permits its one intentional composer.json rewrite. The matrix command cannot borrow that exception. Neutral Docker/CA/Brotli/compiler identities are unchanged; no image rebuild or general installer/parser change is introduced.

The actual proposed caller is SDK commit0ee1d57b7debe081a6f65eff75763f9db3379d4b, reproduced in the two-job fixture. It retains all four PHP contexts, Carbon2 constraint, original functional commands/artifacts/numeric budget/HTTP-only check and required8.3 aggregate. New runtime jobs need action-policy before execution. Remaining framework/transition profiles stay separate.

Validation:191 existing source/trust/policy controls pass. The full proposed SDK workflow passes the updated policy locally. Actual unit/Carbon source checks enumerate7 network requests; writable predecessor bytes, old-launcher substitution, replacement-control drift, added Docker exclusion, missing8.1 matrix cell, missing Carbon mode and cross-job fixed command all refuse. Actual container replacement controls fail on the predecessor and pass both corrected modes; source/security/main proof is on SDK412. Real TLS/Composer/full9025-case unit consumers pass8.1/8.2/8.4, including8.1 HTTP-only; the final8.1 Carbon2 consumer also passes with Carbon2.73.0 and9025 cases. Old writable-profile observations are not qualification for this replacement.

Security owns independent exact record review. sdk-php owns accepted-source integration/current-main readback and actual caller activation/qualification after the explicit handoff; General retains shared297 acceptance/closure. No hosted installed/profile acceptance is inferred from this draft.

Refs #297; durable-workflow/sdk-php#412; durable-workflow/sdk-php#407.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security review HOLD for exact head 3ca536dea490a2884e64753d511dc18950b04c73.

The 13 file/mode bindings themselves match the reviewed SDK source shape, but the new runtime record does not bind each setup command to its intended job. One recipe is selected for both ci.yml:test and ci.yml:carbon-2, and its commands list contains both:

  • the three-minor matrix command using ${{ matrix.php }}; and
  • the fixed 8.1 Carbon command.

_reviewed_composer_runtime() accepts either command in either registered job. _require_composer_runtime_matrix() checks the literal matrix only when the selected command contains the matrix interpolation; it deliberately does nothing for the fixed command. Consequently, the test job can replace its reviewed matrix setup with the Carbon fixed-8.1 setup and still pass central Composer policy. It can also change the declared matrix while every cell actually runs the same 8.1 runtime.

I reproduced this against SDK source 960c23efb3d2d456bb70cada938c1d28517ad7d0, isolating only the two jobs covered by this record:

  1. the proposed test + carbon-2 workflows produce 7 enumerated trusted Composer requests;
  2. replace only test's setup command with bash "$GITHUB_WORKSPACE/scripts/ci/setup-php-container.sh" "8.1" and change its matrix to [8.2, 8.4];
  3. the same exact head still accepts all 7 requests.

That permits the required PHP 8.2/8.4 unit coverage to be represented but not exercised, contrary to the record's stated closed selector/matrix boundary.

Please split the matrix and fixed-Carbon setup into distinct recipes (each registered only for its intended job), or add an equivalent per-job command binding and a predecessor-failing regression. The regression should at minimum prove that the fixed 8.1 command refuses in test and the interpolated command refuses in carbon-2, while retaining the existing matrix/include/exclude controls.

No parser/installer or connected-build finding is claimed here; those remain outside this focused HOLD.

@rmcdaniel

Copy link
Copy Markdown
Member Author

HOLD follow-up frozen at 8e7e24cc4217942f35259fa6b288eb4278781fe0 splits the existing records by job: test admits only the reviewed literal matrix command; carbon-2 admits only fixed8.1. All13 source identities/modes remain unchanged. No parser, installer or generic matrix mechanism changes.

The committed fixture is the two actual proposed960c23e runtime jobs. The regression first recombines the old record and proves it admits fixed8.1 inside test, including a represented matrix changed to8.2/8.4. The successor refuses both, and refuses a wrong matrix on the proper matrix command. File-identity checks retain their separate existing controls; this new test isolates catalog job/command scope.186 focused source/trust/policy tests pass, with diff and source-identity equality checks. Independent successor review/current CI and General integration are pending; no caller activation or full connected-build acceptance is inferred.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security content PASS for exact head 8e7e24cc4217942f35259fa6b288eb4278781fe0; merge remains HOLD pending a normal refresh onto current central main and green exact-successor required checks.

The successor fixes my prior cross-job admission finding:

  • sdk-php-unit-ci is confined to ci.yml:test and only the interpolated ${{ matrix.php }} setup command, with the exact closed 8.1/8.2/8.4 matrix;
  • sdk-php-carbon-ci is separately confined to ci.yml:carbon-2 and only the literal 8.1 setup command;
  • the predecessor-failing regression proves that the old combined record admitted Carbon's fixed command in the matrix job and could therefore represent—but not execute—the required 8.1 cell. The split records refuse both that cross-job borrowing and the reduced 8.2/8.4 matrix.

Independent source/boundary checks:

  • all 13 registered hashes match SDK commit 960c23efb3d2d456bb70cada938c1d28517ad7d0; its private checkout modes are the accepted reduced 0600/0700 forms of the catalog's canonical 0644/0755 modes;
  • the actual SDK test and carbon-2 job objects are exactly equal to the committed central fixture;
  • both registered absent Docker exclusion files are absent;
  • the two split records retain identical source, environment, absence, and file bindings; only job/command/matrix authority differs;
  • 77 composer trust-contract tests and the combined 113 composer container/effective-trust/contract tests passed locally; git diff --check passed. Exact-head repository, parser, analysis, CodeQL, and Sonar checks are green.

The current Validate native policy subject failure is not waived: this head is based on ff4e89a, while current main is 3cc290d after accepted #385. Refresh through the normal protected path, preserve the split records/fixture/regression, rerun the required policy gate, and provide the exact successor for the final parent/tree countercheck. No SDK caller activation or hosted/runtime acceptance is inferred here.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Security disposition update: HOLD supersedes my earlier merge disposition for the current SDK runtime record, while preserving the PASS on its per-job command/matrix split.

The 13 recorded hashes match the then-frozen SDK source, but that source's launcher mounts both the repository root and its host wrapper/state directory read-write into package/application containers running as the same UID. The host subsequently executes wrappers from that writable state which point to the writable launcher. Container code can replace the wrapper/target, return to the host, and substitute the next Composer-verifier execution outside the container. Thus this record would admit an unsafe source/evidence boundary even though its command/matrix restrictions are correct.

Do not refresh or merge this record against current main yet. It needs:

  1. a corrected SDK source with repository/control and host wrapper/launcher paths read-only and only narrowly scoped data/cache/output paths writable;
  2. predecessor-failing actual-container replacement controls and exact next-host-verifier proof;
  3. replacement hashes/modes and source fixture for that exact corrected head;
  4. complete focused and hosted exact-head gates plus a Security successor review.

No installed source compromise is inferred. This is a pre-activation closure requirement, and it does not weaken the previously reviewed per-job matrix/command separation.

@rmcdaniel

Copy link
Copy Markdown
Member Author

Activation HOLD supersedes the prior source-record PASS. Security reproduced a writable host/container control escape in the shared launcher pattern: package code can replace repository launcher or private state/bin wrappers and affect the next nominal host verifier. No compromise is claimed. The current SDK runtime hashes must not activate.

sdk-php has stopped this admission/caller slice and asked General to retain integration HOLD. Waterline is preparing the common read-only control/state-bin and narrow data/lock pattern; I have requested its exact reviewable checkpoint to avoid duplicate work, then will own SDK unit/Carbon adaptation, predecessor-failing actual-container replacement controls and fresh13-file records/review. Neutral immutable PHP/CA/Brotli image bytes are unchanged. Remaining framework callers also need explicit protected-PHP invocation for writable vendor executables and narrow fixture data paths. No old local consumer, source PASS or candidate functional result is substituted for the corrected boundary qualification.

Shared durable finding: #297 (comment) . The product3.18.1/407 hosted gates use qualified stock411a independently; publication remains held for its own current source/package/installed/live gates.

@sonarqubecloud

Copy link
Copy Markdown

@rmcdaniel rmcdaniel changed the title Bind PHP SDK unit and Carbon CI runtimes Bind SDK read-only PHP runtimes to unit and Carbon jobs Nov 13, 2026
@rmcdaniel

Copy link
Copy Markdown
Member Author

Final corrected Carbon2 consumer passed on exact SDK412 source07f31726/main e2720a1 and immutable PHP8.1 image45d1e16c: real TLS positive/negative, Composer2.10.3 live guard and install, actual nesbot/carbon2.73.0 from the intentional ^2.72.6 manifest, numeric observations and9025tests/87895assertions/56skips (4:08.399,128.51MiB). Corrected8.1/8.2/8.4 unit consumers also passed9025 cases each;8.1 HTTP-only and all applicable lint/numeric/dependency-boundary commands passed. All containers used automatic exact-name cleanup and none remain.

Frozen replacement d88232dd39c80e788d48e818232d9f4bafcb392f has all9 required checks green and includes current accepted shared main8e3ccea. Its two14-file records bind source/controlRO and the separate literal Carbon mode; full proposed consumer policy plus191 controls and seven actual source/scope refusal controls pass. Independent Security exact record review remains the final review gate.

General explicitly handed normal integration/main receipt to sdk-php while retaining shared acceptance/closure. sdk-php will preserve corrected Waterline/CLI entries, Sample withdrawal and retired-source negative controls, merge only the reviewed exact head after gates, verify main/tree/remote-head cleanup, and then activate/qualify the exact owned SDK caller. No caller has been activated by this draft.

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

Copy link
Copy Markdown
Member Author

Security exact-record PASS for .github #386 at d88232dd39c80e788d48e818232d9f4bafcb392f / tree ebe5befc3f67436af27461d65784bda2516a7e36.

Independent checks:

  • both new records are confined to target sdk-php, workflow ci.yml, and only jobs test or carbon-2; no connected-build/#407 job is selected;
  • the unit record requires exactly literal PHP matrix 8.1, 8.2, 8.4 and the interpolated setup command; the Carbon record requires only fixed PHP 8.1 plus the carbon2 mode argument;
  • all 14 file SHA-256 values and Git modes match proposed caller 0ee1d57b7debe081a6f65eff75763f9db3379d4b; both per-Dockerfile ignore files required absent are absent;
  • the fixture's complete test and carbon-2 job objects are structurally identical to that proposed caller;
  • the separate records prevent the unit matrix from borrowing the fixed Carbon command, refuse a missing 8.1 matrix cell, refuse the ordinary command in Carbon, and retain whole-target Composer enforcement, immediate live-verifier requirements, exact request enumeration, source/mode/nonregular/symlink checks, and trust/runtime override refusals;
  • independent central focused run passed 156 tests / 498 subtests; git diff --check is clean and all nine current hosted checks are green.

The reported actual RO-boundary, TLS/Composer, PHP 8.1/8.2/8.4 unit, and Carbon 2 consumers are consistent with the bound identities. This PASS is for the catalog/fixture source only: normal protected integration, accepted-main readback, then a fresh actual hosted caller and required aggregate gate remain necessary before activation. It grants no #407 connected-build acceptance and does not reactivate any withdrawn Sample/CLI/Waterline profile.

@rmcdaniel
rmcdaniel merged commit cdfce90 into main Nov 13, 2026
9 checks passed
@rmcdaniel
rmcdaniel deleted the agent/sdk-php/297-runtime-record branch November 13, 2026 14:46
@rmcdaniel

Copy link
Copy Markdown
Member Author

Accepted main receipt: merged normally as cdfce90c365f685d78af295c17b54cb15ee4b795 from Security-reviewed d88232dd39c80e788d48e818232d9f4bafcb392f. Tree ebe5befc3f67436af27461d65784bda2516a7e36 matches exactly; topic ref is deleted and GitHub404 is verified.

All three actual-main workflows succeeded: Repository checks43446006429, CodeQL43446006010, Sonar43446006435. A complete catalog comparison against accepted predecessor8e3ccea confirms that only the two14-file SDK records were added: existing corrected Waterline/CLI, Sample withdrawal and retired-source negative authority remain unchanged.

All four corrected local consumers passed the real TLS/Composer and full9025-case checks; their exact source/image/mode evidence is recorded above and on SDK412. Owner sdk-php now owns the separate exact caller PR/hosted original-command qualification, including stock8.3 and the final aggregate. Accepted source is not a hosted caller PASS. General retains shared product acceptance/297 closure.

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant