# Persian Kit comparison lab — 2026-10-08 Commissioned and run by Eram, the author of Persian Kit. This is a local, exploratory comparison, not an independent certification. Results apply only to the versions, settings and fixtures recorded here. Recheck after releases; never silently carry measurements forward to a new version. ## Inputs - Persian Kit 1.0.0 source: https://github.com/eramhq/persian-kit/tree/f05b63e90caf57d6ff74d02e11360ccb1f66b50d - Parsi Date 6.4: https://downloads.wordpress.org/plugin/wp-parsidate.6.4.zip - Persian WooCommerce 10.0.5: https://downloads.wordpress.org/plugin/persian-woocommerce.10.0.5.zip (original download used latest-stable; header and SHA-256 recorded) - WooCommerce 9.9.7: https://downloads.wordpress.org/plugin/woocommerce.9.9.7.zip - Plugin Check 2.1.0: https://downloads.wordpress.org/plugin/plugin-check.2.1.0.zip - WordPress 7.0.2, PHP 8.3.33, MariaDB 11.8.8; image digests in environment.json. - Locale fa_IR, timezone Asia/Tehran. Post title collation utf8mb4_unicode_520_ci. Database default utf8mb4_uca1400_ai_ci. - Docker Desktop on Apple silicon (arm64), Docker engine 29.6.2. Shared workstation, not dedicated benchmark hardware. ## What ran `seed.php` creates 105 synthetic posts, a virtual product and a classic shortcode checkout. WooCommerce stays active in every profile, including baseline. HPOS is enabled. The minimal theme is in theme.php. No real orders or payments were made. Behavior profile: enable relevant search/text options where available. Preserve stored legacy Arabic spelling; Persian Kit normalize-on-save is off. `observer.php` reads actual WordPress filter and main-query results over HTTP. It captures exact date output, stored dates, search IDs and a small HTML fixture. The runner requires fa_IR; an initial run before the language pack was installed was discarded and replaced. Persian/Arabic digit search matched under the baseline collation too, so it is not claimed as an advantage. Performance profile: focus on date display, disabling selectable unrelated options where practical. Persian Kit has date_conversion plus WooCommerce admin dates; Parsi Date has persian_date; Persian WooCommerce has enable_jalali_datepicker. See configure.php and per-profile JSON for exact settings. Plugins have different architecture and unconditional behavior; this is not identical work or factory-default comparison. Search spelling normalization is disabled in the Persian Kit performance profile, so the search timings do not measure its expanded spelling search. Three deterministic shuffled rounds (seed 20261008), each with three warm-ups and ten sequential requests per screen and profile: 30 measured requests per cell, 480 overall. Screens: homepage, search, authenticated admin post list, and classic checkout with a cart. Status, login and checkout rendering are asserted. PHP time runs from REQUEST_TIME_FLOAT to a shutdown hook; includes WordPress, theme and enabled plugins. It excludes browser rendering, CSS/JS downloads and network. HTTP response timing is retained separately. Peak PHP memory uses memory_get_peak_usage(true); DB queries use wpdb->num_queries. The observer adds a small common overhead. Median and nearest-rank p95 are descriptive, not significance tests. No concurrency/load test or confidence intervals. Shared host variance is visible in p95; do not infer a universal winner or publish speedup percentages. External HTTP and mail are blocked and scheduled cron disabled; caches are warmed rather than flushed between requests. No added persistent object cache/page cache/CDN. No browser performance score measured. Asset records are queue/registry observations, not transferred bytes. The simple theme does not represent every real site. Raw samples preserve their original order; assets are deduplicated into assets.json for download size. ## Standards / tests Persian Kit development checkout: composer install, npm ci, npm run build. - `vendor/bin/phpunit --no-progress` in the PHP 8.3.33 container: 1,428 counted, 443 skipped, 985 executed; 2,951 assertions, no failures. Skipped integration tests are not compatibility evidence. - `npm run test:js` with Node 24.8.0: 163 passed, 3 skipped. - `vendor/bin/phpcs -q --no-colors --report=json`: 0 errors/warnings under the project's phpcs.xml.dist. Selected WordPress security, prepared-SQL, translation, deprecated/alternative-function and DontExtract rules. It is not full WPCS formatting; the project specifies PSR-12. Bundled third-party code is excluded by that project configuration. - Plugin Check 2.1.0 was activated before `wp plugin check SLUG --format=json` on each packaged plugin. Static checks only, default checks; no AI/manual triage, no runtime flag, outbound HTTP blocked. Raw output retained. Persian Kit 0 errors/8 warnings (integration hook naming); Parsi Date 131 errors/316 warnings; Persian WooCommerce 157 errors/215 warnings. These are tool severities, NOT confirmed vulnerabilities, a security score, or evidence of WordPress.org rejection. Bundled code, scope and false positives affect counts. Do not rank security by them. - Competitor development test suites were not run; published distributions were used. Not covered: checkout submission, payment gateways, block checkout behavior, real migrations, large datasets, every theme, every integration, multisite or a PHP/WordPress version matrix. Date-format results describe get_the_date(DATE_W3C) in this setup, not every feed, API or SEO plugin. ## Reproduce Use only a disposable environment. compose.yaml binds localhost:4326 and uses the fixed scratch directory /tmp/eram-plugin-lab-20261008. Passwords in it are lab-only values. If changing the directory/port, also adjust run.py and compose mounts. Pin Docker images to environment.json digests for the reviewed environment; floating tags can change. 1. Create scratch directories `wordpress`, `plugins`, `harness`, `downloads`. Download and unpack the versioned plugin distributions above into plugins. Clone Persian Kit at the exact commit, run composer install, npm ci and npm run build; copy its distribution files into plugins/persian-kit using its .distignore. Do not copy development vendor/node_modules directories. 2. Run `docker compose -f compose.yaml up -d db wordpress`; wait for DB and WordPress files. CLI commands below use `docker compose -f compose.yaml run --rm -T cli` as their prefix. 3. Run `core install --url=http://127.0.0.1:4326 --title=Comparison --admin_user=lab --admin_password=lab-only-local-password --admin_email=lab@example.test --skip-email`. 4. Download https://downloads.wordpress.org/translation/core/7.0.2/fa_IR.zip and unpack into wordpress/wp-content/languages. Copy observer.php to wordpress/wp-content/mu-plugins/eram-lab.php. Create the directories if needed. Copy configure.php and seed.php into harness. Make harness writable by the Apache user for fixture and metric output. 5. Create wordpress/wp-content/themes/eram-lab, copy theme.php to index.php and create style.css with `/* Theme Name: Eram Lab */`. Run `theme activate eram-lab`, `plugin activate woocommerce`, then `eval-file /harness/seed.php` exactly once on the fresh DB. Confirm `option get WPLANG` is fa_IR. Seed is not idempotent. 6. Optional static checks: activate plugin-check and run the command above for each plugin, capturing stdout/stderr. Do this before benchmarking. The runner removes Plugin Check from active_plugins. 7. Run `python3 run.py` from this extracted lab directory. It reads harness/fixtures.json, configures profiles, captures behavior and measures all scenarios. Generated settings and results appear in results/. A complete run has 480 samples; inspect behavior before interpreting measurements. 8. Stop only this lab with `docker compose -f compose.yaml down`. Remove its named volume with `down --volumes` only if you want to discard the disposable DB. Retain exported evidence first. The downloadable report contains environment, checksums, observed behavior, settings, summaries and static check summaries. lab.zip contains these scripts plus individual samples, deduplicated assets and test/check output. No third-party plugin source is redistributed in it.