Repository navigation
demo(#327): disposable grant job and denied REST write - #339
Conversation
Disposable WordPress and WooCommerce lab. One in-policy price change goes through the grant job route. A direct product write is denied and the protection report counts it. The run removes the containers and volumes.
wp eval-file does not load the admin filesystem API. The report reader now requires that connection, so the lab loads it before counting denials.
|
QA verdict: FAIL at Mergeable and CLEAN against The recorded story is the right shape: grant job HTTP 201, price 40.00 to 30.00, direct REST PUT HTTP 403 |
The containers ran that commit. This commit only stores the evidence and the version note. The plugin tree hash is unchanged.
|
Re-ran
|
Scope
Disposable demo for #327. Depends on #338. This pull request's base is
feat/326-protection-reportso the diff is only the lab. Retarget it tomainafter #338 merges. Do not close #327.Invariant / Current Spec Reference
No change to perimeter denial or grant enforcement. No version, Stable tag, or 0.3.0 tag bump. No
readme.txtordocs/marketing/**edit.Relevant Canonical CC-* Tests (
docs/test-plan.md)No legacy CC-* experiment ID. The lab is
bash demo/327-protection/run.sh.What Changed
demo/327-protection/brings up disposable WordPress, WooCommerce, and this worktree's plugin:POST /wp-json/writeleash/v1/grants/{id}/jobsas the issuing administrator sets Northwind Mug from 40.00 to 30.00. The target stays inside the grant job's 50 percent decrease cap. WP-Cron is off, so the lab invokes the queuedwriteleash_process_jobhook, which is the Action Scheduler callback.PUT /wp-json/wc/v3/products/{id}on Harborline Notebook returns 403writeleash_perimeter_denied. The product row stays 25.00.blocked1, surfacerest1) and shows the grant budget used 1 / remaining 0. Loading the report made 0 HTTP requests.run.shrunsdocker compose down -vandassert-compose-clean.sh.Security Impact
No production credentials. MySQL passwords are the existing disposable fixture values. Generated WordPress and application passwords stayed in gitignored
runtime/and were removed with the container.out/evidence.jsonhas no passwords.WP_HTTP_BLOCK_EXTERNALis on.The REST denial row stores actor id 2 in the product column. That is the object id
Perimeter_Guardalready logs for REST. This demo does not change that.PostgreSQL Semantics Considered
Not applicable. The lab is MySQL 8.0.44.
Adversarial / Bypass Testing
bash demo/327-protection/run.shon plugin commit141d439598890e7b446f111b0f6ae7c2ac602df1(plugin treeef809180e3f98b9c1a215b921be253a83cc19940):QUEUED->COMPLETED/ALL_ITEMS_CLEANwriteleash_perimeter_denied30.0025.00, full post/meta/lookup snapshot unchangedblocked1,rest1,http_requests_during_report0Compose cleanup writeleash_demo327: PASS (no containers, networks or volumes)An earlier attempt with target 12.50 was refused
GRANT_SCOPE_DENIEDbecause that decrease is over the 50 percent grant cap. The recorded run uses 30.00. Evidence isdemo/327-protection/out/evidence.json. Versions aredemo/327-protection/VERSIONS.md.Limitations / Unknowns
writeleash_process_jobdirectly becauseDISABLE_WP_CRONis true. The job had already been queued (status_reasonSCHEDULED).Out-of-Scope Work Explicitly Not Included