Repository navigation
ci: WU-1 whitespace gate, local parity and fail-closed MySQL residue check (F4-01, F4-02, F4-12) - #67
Conversation
…sed MySQL residue check (Ref #63, #37) - scripts/check-whitespace.sh checks HEAD against the empty tree plus staged/unstaged/untracked changes; verbatim study evidence is exempt per file via targeted -whitespace attributes. - scripts/check-php-syntax.sh, resolve-lowest-dependencies.sh and check-mysql-residue.php are exposed as composer check:* scripts and used by CI and local runs alike. - scripts/mysql-package-objects.php is the single source of package-owned object-name prefixes; the residue check is read-only and reports tables, views, triggers, routines and events. - CONTRIBUTING.md documents the CI-to-local gate mapping. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
مراجعة القيادة المستقلة — الجولة الأولى المجمّعة لـ WU-1 (2026-10-22)القرار: CHANGES REQUIRED / MERGE NO-GO. راجعت فرق الـ15 ملفًا بالكامل، والسكربتات والاختبارات الجديدة، و الأساس الثابت: Base جميع ملاحظات التصحيح المطلوبةF67-01 — فشل PHPStan في بوابة Lowest dependencies (BLOCKER). وظيفة F67-02 — حارس انحراف أسماء SQL لا يحقق الوعد الشامل. F67-03 — wildcard استثناءات whitespace ما زالت تسمح بملفات جديدة معيبة. F67-04 — مسارات فشل Git/Find صامتة في بوابات مطلوبة.
F67-05 — الـPR أدخل جداول اختبار جديدة غير ممتثلة لـSchema §6. F67-06 — اختبارات التصنيف الموسع للأجسام غير كافية لإثبات جميع الأنواع المعلن عنها. checker يسرد ما نجح فعلًا
تعليمات التسليم التاليةعالج كل F67-01..06 في جولة تصحيح واحدة، مع commit جديد بلا amend/force-push. حافظ على النطاق WU-1 فقط، ولا تبدأ WU-2 أو WU-3. قدم Base/HEAD/Tree، وأدلة RED/GREEN للفروع السلبية الجديدة، وPHPStan في lowest mode، وMySQL 8.4.10 وIntegration مرتين والـConsumer Harness مرتين، ثم 10/10 GitHub CI GREEN على نفس HEAD النهائي. بعد ذلك سأجري Fresh Full Re-Review للـdiff الكامل والشجرة التراكمية، وليس مجرد تأكيد إصلاح الملاحظات. لا Merge GO الآن، ولا Release/Tag أو Step 5. |
- F67-01: MysqlResidueScriptTest no longer reads proc_open pipes; output goes through temp files so PHPStan max passes on lowest and latest dependencies. - F67-02: the object-name guard also scans tests/examples *.sql fixtures and has a negative test for a new name family. - F67-03: replace the i42/run-6/run-7 directory wildcards with one exact -whitespace entry per verbatim file (134 files); new files are linted. - F67-04: whitespace and syntax scripts propagate Git/find failures (no `|| true`, no 2>/dev/null) and fail on missing required paths. - F67-05: probe tables in the new integration test carry column/table COMMENTs and a documented schema policy (PACKAGE_BUILDING_STANDARD §6). - F67-06: residue script test covers table, view, trigger, function, procedure and event under every registered prefix, with read-only and foreign-object negative proof. Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
Technical Lead — Fresh Full Re-Review #67 (2026-10-22)قرار القيادة: MERGE GO for WU-1, subject to explicit Owner approval. لا تصريح دمج ذاتي ولا Release GO. راجعت من الصفر الـdiff التراكمي كاملًا (15 ملفًا) لا commit التصحيح وحده: وصف PR وأدلة RED/GREEN، ملفات CI/Composer/README/CONTRIBUTING، السكربتات الخمسة، الاختبارين، سمات الأدلة الأربع، هوية المراجعة
المصالحة المستقلة لكل ملاحظة سابقة
CI — تحقق مستقل على HEAD المراجَعGitHub Actions run: https://github.com/Maatify/persistence/actions/runs/39736220973 10/10 required jobs SUCCESS: Workflow lint (1)، Quality (1)، Unit/Regression PHP 8.2/8.3/8.4/8.5 (4)، Lowest dependencies PHP 8.2 + MySQL 8.4.10 (1)، Integration PHP 8.2 و8.5 + MySQL 8.4.10 (2)، وCI Gate (1). تحققت من step conclusions والـlogs الحقيقية، لا من لون الواجهة وحده:
تفاوت عدد assertions في اختبار التزامن مفهوم ضمن حلقات polling المثبتة سابقًا؛ أعداد الاختبارات ثابتة ونتائج CI خضراء. أدلة الـRED/GREEN المحلية المحاكية للعيوب، و18/18 على MySQL محلي، وتنظيف الحاوية، هي أدلة المنفذ؛ لم أشغل MySQL محليًا من بيئة القيادة، ولم أدّعِ ذلك. عوضًا عن ذلك، تحققت استقلالًا من الكود ومن مخرجات/بوابات GitHub على الـHEAD النهائي. حدود القرار
نتيجة Fresh Full Re-Review: لا توجد ملاحظات مانعة جديدة على نطاق WU-1 في الـTree المراجَع؛ MERGE GO مع إبقاء قرار الدمج النهائي للمالك. |
الملخص
تنفيذ WU-1 فقط: F4-01 + F4-02 + F4-12 (بوابة المسافات / التكافؤ المحلي / فحص مخلّفات MySQL). يغلق عمل #63 ضمن متتبع الإصدار #37 (يبقى مفتوحًا، والإصدار RELEASE BLOCKED). المراجع المعيارية:
CI_WORKFLOW_STANDARD §2.1و§8و§11(Pinned44c8827095ab4007c355aa21c56b853f3b49d795، دون تغيير الـ Pin أو الملفات المثبتة).Ref #63, Ref #37
المراجع
aaafab6f89ac0d511190787eeb4a7f0c5e34608a(origin/main، لم يتحرك)727afd80726727d64fc383c3e46c1776af354ad0(الالتزام الأول:042effd4a3a40eb3a6a2f075d2d5e8903441e2dd، ثم التزام الإصلاحات727afd8؛ بلا amend/force-push)de85ce1edba60581c3b95793af0c57b3a5cf50b7ملخص الـ diff (15 ملفًا؛ التراكمي الحالي +706/−134)
scripts/check-whitespace.shHEADمقابل empty tree) + staged/unstaged/untrackedscripts/check-php-syntax.shphp -l(src, tests, examples, scripts,.php-cs-fixer.php)scripts/resolve-lowest-dependencies.shupdate --prefer-lowest --prefer-stable+ platform + auditscripts/check-mysql-residue.phpscripts/mysql-package-objects.phpmaa_persistence_test_،maa_persistence_consumer_،maa_example_composer.jsoncheck:syntax,check:whitespace,check:lowest,check:residue(لا dependencies ولاversion).github/workflows/ci.ymlCI Gateوneedsدون تغيير.gitattributes×4 (docs/studies)-whitespaceلـ 20 ملف دليل حرفي بأسمائها الدقيقة + تصحيح التعليق المضلِّل في issue-32CONTRIBUTING.md,README.mdtests/Unit/Tooling/MysqlPackageObjectPrefixesTest.phpmaa_خارج البادئات المسجلة (يمنع تجاهل أجسام جديدة بصمت)tests/Integration/Tooling/MysqlResidueScriptTest.phpلا تغيير في
src/ولا العقد العام ولا SQL المستهلك ولا Adoption ولا المعايير المثبتة.قرارات تصميم
base..HEADويعمل مع checkout سطحي (shallow) دونfetch-depth: 0. الاستثناءات-whitespaceبالأسماء الدقيقة للملفات الحرفية فقط (أو مجلداتi42/run-6/run-7الموجودة أصلًا)، فتبقى أي ملفات جديدة تحت الفحص. لم تُعدَّل بايتات الأدلة.maa_example_*_<hex>وmaa_persistence_consumer_<hex>وجداول/triggers الـlsp)، للقراءة فقط، داخل قاعدة الاختبار المخصصة، ولا يلمس أي اسم خارج البادئات.أدلة RED / GREEN
RED (baseline
aaafab6):git diff --checkعلى checkout نظيف → exit 0، بينماgit diff --check $(git hash-object -t tree /dev/null) HEAD→ exit 2 ويجد 79 سطرًا معيبًا (كلها تحتdocs/studies).maa_persistence_test_deadlock_retry_items،maa_persistence_test_lsp_plain، triggermaa_persistence_test_lsp_neutral،maa_example_items_deadbeef0001،maa_persistence_consumer_deadbeefdeadbeef؛ ويفشل فقط للجداول الأربعة/الـ triggers الاثنين المسرودة.GREEN (هذا الـ PR) على MySQL 8.4.10 حقيقي (
mysql:8.4.10مع--log-bin-trust-function-creators=1، docker على المنفذ 3399):composer check:residueعلى نفس الأجسام الخمسة غير المسرودة → exit 1 ويسردها كلها؛ وبعد التنظيف → exit 0.composer check:whitespaceعلى الشجرة الحالية → exit 0. وبعد commit عيوب جديدة (فرع تجريبي محلي لم يُدفع) فيsrc/وtests/وdocs/وexamples/→ exit 1 مع تحديد الملفات الأربعة؛ بينماgit diff --checkالقديم على نفس الشجرة → exit 0.نتائج البوابات المحلية (على HEAD أعلاه)
composer validate --strict/dump-autoload --optimize --strict-psr/check-platform-reqs/audit --abandoned=failcomposer analyse(PHPStan max)php-cs-fixer fix --dry-run --diffcomposer check:syntaxcomposer check:whitespacecomposer test:unit/test:regressioncomposer test:integration×2 (MySQL 8.4.10)composer test:consumer×2 (تشغيلان داخليان لكل أمر)composer check:residueبعد كل ما سبقrhysd/actionlint:1.7.12)ملاحظة صدق: في تشغيل سابق لـ
test:integrationفشل اختبار واحد (PdoDeadlockRetryRunnerIntegrationTest::testExhaustionAfterFourRealDeadlocksPropagatesTheExactFinalPdoException: محاولتان بدل أربع) أثناء حمل شديد على الجهاز المضيف (load average ≈ 48)، ونجح في التشغيل التالي مباشرة وفي كل التشغيلات اللاحقة؛ لا علاقة له بتغييرات هذا الـ PR (لا تغيير فيsrc/). تنظيف مخلّفات تشغيلات قُتلت بسبب توقف الجهاز تم يدويًا على حاوية الاختبار المؤقتة فقط، وكشفها فحص المخلّفات الجديد كما هو مقصود.الجولة الثانية — معالجة مراجعة القيادة F67-01..F67-06 (التزام واحد
727afd8)كل البنود في جولة واحدة. RED = على
042effd؛ GREEN = على727afd8.composer check:lowestثمphpstan analyse -c phpstan.neonعلى PHP 8.4 المحلي: 8 أخطاء (offsetAccess.nonOffsetAccessibleوargument.type) فيMysqlResidueScriptTest.php:70-73، مطابقة للـ CI$pipes: مخرجاتproc_openعبر ملفات مؤقتة (['file', ...]) بلا ignores ولا baseline ولا castsNo errorsعلى lowest وعلى latest (النسخة الأولى باستخدامassertIsArrayأخفقت على latest بـalreadyNarrowedTypeفاستُبدلت)tests/Fixtures/MySql/create_newfamily.sqlبـmaa_newfamily_items← الاختبار القديم OK*.sqlو*.phpتحتtests/وexamples/، مع اختبار سلبي بـ DDL يحوي اسمًا خارج البادئات (testScanFlagsAFixtureNameOutsideTheRegisteredPrefixes)run-6-i42-decision-a/← البوابة تنجح (exit 0)i42-phase-a-independent-mac/**وrun-6-i42-decision-a/**وrun-7-i42-decision-b/**بـ 134 سطرًا باسم ملف دقيق (بلا أي wildcard)src,tests,docs,examples,scripts,results/, الثلاثة المستثناة سابقًا (i42…,run-6…,run-7…),run-1-initial,run-4-decision-cell,issue-47/results,issue-48/results,issue-55,docs/studies(15/15 detected)، وعيب غير مُلتزَم (untracked) في مجلد مستثنى سابقًا يفشل أيضًا؛ والملفات الحرفية الموجودة تبقى مستثناة والبوابة تنجح على الشجرةmv examples examples.bak←check:syntaxينجح (104 ملفات، exit 0) بسبب2>/dev/nullcheck-whitespace.sh: إزالة `idبـ COMMENT وPRIMARY KEYوCOMMENT للجدول، وتوثيق السياسة في رأس الصنف (جدول مؤقت بمفتاح بديل فقط، بلا soft delete/ترتيب/FK/uniqueness إضافية، فلا حاجة لفهرس آخر) داخل WU-1 دون لمس جداول WU-2MysqlResidueScriptTestبـ data provider: table, view, trigger, function, procedure, event × البادئات الثلاث (18 حالة)؛ لكل حالة: exit 1، السطر الصحيحRemaining …:يحوي الاسم، لا يُبلَّغ عن الجدول الغريبhost_app_*، الجسم المُبلَّغ عنه وجدول Host يبقيان (قراءة فقط)، وبعد التنظيف لا يُبلَّغ الاسمنتائج GitHub CI على HEAD
727afd8: 10/10 PASS (Run 39736220973، بما فيها Lowest dependencies وCI Gate)نتائج البوابات (HEAD
727afd8، Treede85ce1edba60581c3b95793af0c57b3a5cf50b7)No errors(بعد إصلاح F67-01)؛ مع ملاحظة بيئية: على PHP 8.4 المحلي (Composer 2.8.6) يحل--prefer-lowestإلى phpunit/symfony-process أقدم مما يحله CI على PHP 8.2 (phpunit 11.5.50 / process 5.4.51، وaudit في CI نظيف)، فيُبلّغcomposer auditالمحلي عن advisories غير موجودة في CI؛ المرجع الملزم هو CI.check:residueبعد كل ذلك ناجح (قاعدة نظيفة). MySQL 8.4.10 حقيقي (docker).BC Impact
لا أثر: scripts/CI/tests/docs فقط. لا Tag ولا Release ولا version ولا تغيير في حالة #37.
🤖 Generated with Claude Code
Technical Lead Flowchart (English)
flowchart TD A[CI or local verification] --> B[Resolve dependencies and validate PHP] B --> C[PHP syntax and static quality gates] C --> D[Whitespace verification] D --> E{Committed, staged, unstaged, or untracked defects?} E -- Yes --> X[Fail the required gate] E -- No --> F[Run applicable unit, regression, integration, and consumer checks] F --> G[Inspect dedicated MySQL test schema] G --> H{Package-owned tables, views, triggers, routines, or events remain?} H -- Yes --> X H -- No --> I[Report residue check passed] I --> J{All required CI jobs successful?} J -- No --> X J -- Yes --> K[CI Gate succeeds]The workflow shows the intended verification flow; it is not acceptance evidence. Source details and red/green probes remain subject to the independent review on this PR.