Skip to content

architecture: establish PHP 8.4 persistence package contract, standards adoption and migration design #1

Open

Description

@megyptm

Architecture & Standards Study — foundational decision gate (READ-ONLY)

0. Status / authority

This is the first Work Unit for a separate new PHP package, not permission to port source or publish a release. The Owner has created Maatify/php-persistence, which is currently completely empty: GitHub default branch is described as main, but no Git commit / actual branch yet, no prior Issues/PRs, no PHP code. Do not initialize main, publish a work branch or write files during this study. Present decision-ready architecture for Owner acceptance first. Technical Lead reviews; Owner authorizes subsequent implementation boundaries.

1. Frozen factual input baseline (do not confuse source code with a released artifact)

  • Old source repository: Maatify/persistence, main@1f6a7aafe601090b7e55f60d83794364afdefe67 / Git Tree c1e25e7653a3173c3339a269b1ad23b26f335b9d. Exact-main CI #39985574051 10/10 successful, MySQL 8.4.10 Integration on PHP 8.2/8.5, consumers, audit and residue; #68, #69, #76 completed.
  • Old published Composer package maatify/persistence, PSR-4 Maatify\\Persistence\\, declared PHP >=8.2, ext-pdo, maatify/exceptions:^1.0; latest actually tagged/published version v1.4.0. Its current main contains UNRELEASED API and behavioral changes. Preserve the explicit distinction: Published v1.4.0 vs Old main Unreleased vs Proposed New Package.
  • Old source consists of 26 src/ PHP files spanning Ordering, Pagination, Transaction and Exceptions (plus tests/CI/docs). The old PageResult public DTO-like naming mismatch is tracked in old #66, NON-COMPLIANCE / Owner policy conflict, not a permission to break the published old package.
  • Old release-readiness umbrella old #37 is OPEN / RELEASE NO-GO; this new architecture work does not authorize old v1.5.0, renaming/removing the old repo, changing installed consumers, tagging, publishing or a Composer replace.

2. Governing standards — independent new-package adoption, not old repo's stale pin

  • Central standards source: Maatify/php-engineering-standards. Snapshot observed at kickoff: main@5b69c03419ad09369ad207a9a7976cc9cc0617d3. This snapshot is an investigation input, not an automatic approved consumer pin; verify current authoritative, stable exact upstream commit and any applicable finalized/versioned status before proposing an Adoption Commit.
  • Read current central AGENTS.md, standards/STANDARDS_ADOPTION_STANDARD_AR.md in full, decision governance + decision index/current ACTIVE decisions relevant to package/initial bootstrap, and the full canonical Engineering Standards of the resolved candidate set, especially Package Building, Composer Package, CI Workflow, Testing, Library Presentation, PHP Source Documentation, PHP Coding Style, Documentation Lifecycle, AI Collaboration and GitHub Phase Stack.
  • Candidate Profiles: composer-package + repository-governance scoped to /. Perform actual structural/transitive profile resolution → canonical applicability → final applicable set for a standalone PDO/MySQL package. Evaluate conditional external-provider rules; do not automatically include every central standard or copy the entire standards tree. Define the exact Pinned Adoption Control Set + Pinned Applicable Standards Set, local manifest and precedence. Initial source of truth for rules remains central pinned canonical standards, not a duplicated interpretation in project instructions.
  • The current canonical Package Building Standard explicitly sets PHP 8.4 minimum for new libraries; Composer Package Standard prescribes "php": "^8.4". Published old package must keep its separate >=8.2 promise. New-package identity is intended to be maatify/php-persistence, not maatify/persistence.

3. Architecture decisions to present (do not silently choose by porting files)

  1. Identity & namespaces: Evaluate Maatify\\{PackageName}\\ under current naming rules; propose a distinct PSR-4 namespace and concrete public FQCN naming such that old Maatify\\Persistence\\ and new artifact may coexist. State aliases/bridges only if justified; no Composer replace, forced conflicts, deceptive compatibility promise or silent in-place upgrade.
  2. Exact contract inventory / 3-way matrix: For every currently observable old public class/interface/enum/exception/method, distinguish (A) published v1.4.0, (B) old main unreleased, and (C) new-package proposed KEEP / RENAME / REDESIGN / OMIT, with exact source references, semantics (especially caller-owned transactions, savepoints, deadlock 1213 retries, ordering, pagination), dependent consumers/risks and SemVer migration consequences. Don't label behavior unchanged without actual test/source support.
  3. Architecture / structure: Choose one source topology (single vs multi-capability vs multi-domain) grounded in actual Ordering/Pagination/Transaction responsibilities and documented boundaries; comply with current DTO *DTO, Interface *Interface, Enum *Enum, Exception *Exception naming rules for new/unpublished APIs. Address PageResult correctly in the new artifact without retroactive changes to the old published API.
  4. Runtime dependencies & DB contract: Review ext-pdo, shared exceptions package, direct PDO, no ORM, MySQL/MariaDB support claims only with verified test coverage. Old project CI verifies MySQL 8.4.10; MariaDB is not independently verified and old evidence identifies an engine-specific caller-owned-transaction caveat. Document precisely what the new library will support, exclude, or qualify; do not promise MariaDB by textual SQL similarity.
  5. Testing/CI/package readiness: Specify PHP version matrix consistent with ^8.4, real DB Integration, deterministic transaction/retry/deadlock tests, unit/regression, static analysis PHPStan max, coding style, lowest/latest security-clean Composer resolution, actual external Composer consumer twice from clean environments, DB residue, CI Gate, documentation and release-artifact checks. Do not extrapolate published support from untested engines or versions.
  6. Consumer migration strategy: Explicit migration table for composer require maatify/persistence → maatify/php-persistence, FQCN/import changes, behavior exceptions, gradual coexistence or conflict, rollback strategy, compatibility policy and staged adoption plan. Identify actual consumers only from permitted verified evidence; don't invent projects or assume automatic migration.
  7. Bootstrap governance: Repo is EMPTY: specify how first main Commit will safely establish necessary AGENTS.md, pinned standards control/applicable set and manifest, decision/architecture doc, Composer skeleton, CI etc in separately authorized and reviewable steps without pretending existing branch/PR gates can operate before a first commit. Separate Owner decisions from Executor tasks.
  8. Release boundary: First RC and first stable SemVer must follow exact artifact verification and Owner approval; no tag/release or claim of automatic migration. Keep the old umbrella and standards correction decisions separate.

4. Deliverable & acceptance

Return a READ-ONLY decision-ready Architecture Study in the Issue discussion (no repository files, branches, commits, PRs or source changes). Include:

  • exact refs/hash and a reproducible inventory with source evidence and all unverified items identified explicitly;
  • applicable standards matrix with section refs, profile resolution, canonical ownership and selected candidate pinned commit (pending Owner approval);
  • public API + contract and migration matrices across published old, unreleased old main and proposed new;
  • architecture options with tradeoffs, one recommended design and specifically which decisions Owner must ratify;
  • ordered, small independent bootstrap/implementation Work Units with exit gates and rollback/compatibility controls;
  • risks/open decisions clearly distinguished from tested facts; no ambiguous multi-source truth;
  • handoff stops at Owner/Lead architecture acceptance. No coding, migration, first commit, PR, tags, releases, new Composer package registration, or mutation of old repository in this issue.

Completion = Lead's independent architectural review and Owner's approved decision record, not implementation.

Activity

  1. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    Technical Lead — START AUTHORIZATION: Issue #1 READ-ONLY Architecture Study

    Authorization applies ONLY to analysis and a decision-ready report submitted as GitHub Issue comment(s). It does not authorize initial Git commit, branch, PR, source extraction, Composer publication, any Tag/Release, or modifications in the old repository. Owner ratification follows an independent Lead architecture review.

    Preflight verified directly on GitHub (2026-10-23)

    • New repo Maatify/php-persistence is empty (size 0, no branches despite default_branch=main metadata); Issue architecture: establish PHP 8.4 persistence package contract, standards adoption and migration design #1 is the first issue.
    • Old source Maatify/persistence@1f6a7aafe601090b7e55f60d83794364afdefe67, Tree c1e25e7653a3173c3339a269b1ad23b26f335b9d, final reconciled 10/10 CI #39985574051.
    • Central Maatify/php-engineering-standards observation: main@5b69c03419ad09369ad207a9a7976cc9cc0617d3 (not yet Owner-approved as an adoption pin). Re-check governance/version status before proposing the exact adoption commit; never use a floating source as the effective pin.
    • Old published maatify/persistence is v1.4.0, PHP >=8.2; old main contains separate UNRELEASED behavior/API changes. Old issue #37 remains RELEASE NO-GO and F4-04/#66 is unresolved. Do not conflate these three baselines.

    Execute the study defined in the Issue body

    1. Read current central AGENTS.md, Adoption Standard in full, Decision Governance Standard + ACTIVE decision records relevant to the task, and the actual current candidate Profile/Canonical Standards text in full (not only headings). Resolve composer-package and repository-governance for / via structural/transitive references then canonical applicability; list required local files and candidate exact pin, with version/frozen-state caveats.
    2. Inventory the old src/ public types and actual signatures/behavior, using exact source files and relevant contract tests. Supply a three-column, evidence-cited matrix: Published v1.4.0 vs old main@1f6a7aa Unreleased vs Proposed maatify/php-persistence API. Explicitly classify unchanged vs renamed vs intentionally redesigned vs omitted; do not silently port PageResult or assume a compatibility namespace.
    3. Produce at least two architecture options and defend a recommendation, including distinct PSR-4 namespace, source topology, PHP ^8.4, Composer dependency/replace/conflict policy, PDO/MySQL and honest MariaDB qualification, consumer coexistence/migration & rollback, CI/real DB/consumer harness, docs and phase-specific gates. The proposed API must satisfy the current naming and architecture standards unless explicitly rejected by Owner.
    4. Present a numbered Owner Decision Register with alternatives and consequences (identity, public naming, behavior compatibility, DB support, standards pin, bootstrap mechanics, first stable/RC intent) and a sequential Work Unit plan: first empty-repo bootstrap, then standard adoption and architecture/contract approvals, then code/tests/CI, then independent consumer verification and separate release. Define what evidence is needed before accepting each next WU; avoid making all bootstrap steps one unreviewable mega-PR.
    5. Distinguish verified facts, executor inference, proposed design, unverified dependencies/consumers, and decisions requiring Owner sign-off. No undocumented changes or assumptions. If a canonical rule or current repository fact conflicts with the intended design, highlight the contradiction rather than inventing an exception.

    Delivery contract / hard stop

    • Post the full Architecture Study and Decision Register in the discussion of this Issue architecture: establish PHP 8.4 persistence package contract, standards adoption and migration design #1, with explicit document sections, cross-links to exact commit/source lines, reproducible inventory, a provisional compliance/adoption matrix, alternatives, risks, and proposed staged task order. Large analysis may be posted as contiguous numbered comments; no committed files in this empty repo.
    • Return to Lead with exact links to the report comments, what was verified vs unverified, and do not start implementation, initialize main, create branches, modify either repo, open PR, or publish.
    • Lead will conduct independent review and issue explicit decision-ready / needs-remediation ruling; then Owner ratifies design. The next coding mandate is a separate authorization.

    Current status: Issue #1 ACTIVE — READ-ONLY ARCHITECTURE STUDY ONLY.

  2. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    📐 Architecture Study & Decision Register — Issue #1 (READ-ONLY) · [1/6] الملخص التنفيذي وقاعدة الأدلة

    READ-ONLY. لم يُنشأ Commit أو Branch أو PR أو Tag/Release، ولم تُنقل ملفات، ولم يُعدَّل المستودع الجديد ولا القديم، ولم تُسجَّل حزمة على Packagist. هذه التعليقات الستة هي الكتابة الوحيدة على GitHub. تمت القراءة عبر gh وgit clone إلى مجلد مؤقت محلي خارج المستودعين. بعد هذا التسليم أتوقف بانتظار المراجعة المعمارية المستقلة من Lead.

    0. فهرس التسليم

    # المحتوى
    1 (هذا التعليق) الأدلة المثبتة، التوصية المختصرة، أهم النتائج التي تحتاج انتباه Lead
    2 دراسة المعايير: سجل القراءة، Profile Resolution، Canonical Applicability، Pinned Adoption المقترح، تناقضات/فجوات المعايير
    3 الجرد الشامل: مصفوفة العقود الثلاثية (Published v1.4.0 / Old main Unreleased / Proposed) + مصفوفة السلوك
    4 ما لا يُنقل للمكتبة الجديدة، البدائل المعمارية، التوصية، التصميم المقترح (Namespace/Topology/Composer/PHP/DB/Exceptions)
    5 CI والاختبارات والإصدار، هجرة المستهلكين والتعايش والتراجع
    6 Work Units وشروط قبول كل مرحلة، Owner Decision Register، المخاطر، الفصل بين Verified/Unverified، وحدود التوقف

    1. قاعدة الأدلة المثبتة [V]

    البند القيمة المرصودة طريقة التحقق
    المستودع الجديد Maatify/php-persistence — PUBLIC، isEmpty=true، defaultBranchRef=""، 0 branches، Issue #1 هي الوحيدة gh repo view · gh api repos/Maatify/php-persistence/branches
    المصدر القديم (main) 1f6a7aafe601090b7e55f60d83794364afdefe67 · Tree c1e25e7653a3173c3339a269b1ad23b26f335b9d git rev-parse 1f6a7aa^{tree}
    CI الدقيق run 39985574051: success على headSha=1f6a7aa…؛ 10 jobs ناجحة: Quality(8.2) · Unit/Regression(8.2/8.3/8.4/8.5) · Integration(8.2 وَ 8.5, MySQL 8.4.10) · Lowest(8.2, MySQL 8.4.10) · Workflow lint · CI Gate gh run view 39985574051 -R Maatify/persistence
    المنشور tag v1.4.0 → commit fc1459b49fe5af5ead17814eeb3ada7a3fa81791 · Tree b477b06d23fc2101581513ca97c0948259079b67؛ GitHub Release "Latest" (2026-09-18)؛ Packagist: v1.4.0 الأحدث، php: >=8.2 git rev-parse v1.4.0 · gh release list · repo.packagist.org/p2/maatify/persistence.json
    الفرق بين المنشور والـ main 21 commit؛ src/: 21 → 26 ملف؛ 10 ملفات متغيرة (+843/−60): 5 مضافة، 5 معدلة git diff --name-status v1.4.0 1f6a7aa -- src
    ملفات الاختبار main: Unit 18 · Regression 11 · Integration 22 · Consumer 1 — v1.4.0: 11 · 6 · 10 · 1 git ls-tree
    المعايير Maatify/php-engineering-standards@5b69c03419ad09369ad207a9a7976cc9cc0617d3 = HEAD لحظة الدراسة (commit date 2026-10-23 14:47 +0300)؛ لا توجد tags في المستودع (git tag فارغ) ⇒ لا حالة finalized/versioned على مستوى المستودع git log -1 · git tag
    maatify/exceptions tags: v1.0.0, v1.1.0؛ php: ^8.2 (v1.1.0) gh api …/tags · Packagist
    maatify/php-persistence على Packagist غير مسجلة (HTTP 404) curl repo.packagist.org/p2/maatify/php-persistence.json

    اصطلاح الإحالات: A@path:L = المنشور v1.4.0 (fc1459b) · B@path:L = الـ main غير المنشورة (1f6a7aa) · S@path:L = المعايير (5b69c03). الرابط الدائم: https://github.com/Maatify/persistence/blob/<SHA>/<path>#L<n> وَ https://github.com/Maatify/php-engineering-standards/blob/5b69c03419ad09369ad207a9a7976cc9cc0617d3/<path>#L<n>.

    تصنيفات الحقائق: [V] مثبت بمصدر/أمر قابل للإعادة · [I] استنتاج المنفذ · [P] تصميم مقترح · [U] غير مُتحقق منه · [OD-n] يحتاج اعتماد المالك.

    2. التوصية المختصرة [P]

    اختيار البديل B (مفصّل في [4/6]): حزمة جديدة مستقلة maatify/php-persistence (repo php-persistence) بدلًا من ترقية maatify/persistence أو محاكاتها:

    1. الهوية: maatify/php-persistence (مفروضة بنص Composer §7.1 للحزم الجديدة — لا بديل ولا انحراف مسموح).
    2. Namespace: Maatify\PhpPersistence\ متميز عن Maatify\Persistence\ القديم ⇒ تعايش فعلي دون replace/conflict/aliases/bridges [OD-02].
    3. Topology: حزمة واحدة، Multi Capability: Ordering/ · Pagination/ · Transaction/، مع اتجاه التبعية Ordering → Transaction فقط؛ بلا جذر تقني Pdo/ وبلا Internal/ [OD-04].
    4. API: إعادة تصميم تسمية فقط حيث تفرضها المعايير الحالية (PageResult→PageResultDTO، marker→…ExceptionInterface، توزيع Responsibilities)، والإبقاء على أسماء/توقيعات بقية الأنواع لتقليل كلفة الهجرة؛ كل تغيير مصنّف KEEP/RENAME/REDESIGN/OMIT مع دليله [OD-05].
    5. خط الأساس السلوكي: سلوك الـ main غير المنشورة (lazy savepoint، clamp من locking read، getNextPositionForUpdate، deadlock-retry) كأساس للتصميم، لا v1.4.0 وحدها؛ والـ runners القديمة المهملة تُحذف وتُدمج أجيالها تحت الأسماء البسيطة [OD-07] [OD-08].
    6. PHP/DB: php: ^8.4؛ ادعاء الدعم MySQL 8.4 فقط (المُتحقَّق منه فعلًا)، وMariaDB غير مدعومة/غير مُتحقق منها مع توثيق الفروق كمعلومة لا كوعد [OD-10].
    7. التنفيذ: سلسلة Work Units صغيرة قابلة للمراجعة تبدأ بـ commit أولي بإذن مالك ثم تبنّي المعايير ثم القرارات ثم الهيكل ثم CI ثم القدرات واحدة واحدة ثم الوثائق ثم Harness ثم هجرة مستهلكين ثم RC (1.0.0-rc.1) ثم Stable [OD-13] [OD-18].

    3. أهم النتائج التي تستحق انتباه Lead قبل أي قرار

    # النتيجة الأثر التفصيل
    F-1 **المعيار المركزي يُثبّت maatify/persistence وَ`Maatify\Persistence\Pdo\Ordering Pagination كمالك وحيد** لآليات ordering/pagination: PB §2 (S@standards/packages/PACKAGE_BUILDING_STANDARD.md:73-76)، §11 (:699-818)، §16 (:959-973، ويثبّت رابط المرجع على fc1459b). لا يوجد نص استثناء أو مسار "خلافة" [V]`. بناء الحزمة ممكن، لكن هجرة أي مستهلك إليها تخالف نص المعيار الحالي ما لم يُعدَّل مركزيًا بقرار مالك.
    F-2 {PackageName} (PB §4 :141-150) غير معرَّف لمستودعات php-*. الممارسة المرصودة في 8 حزم عامة: Maatify\Category, Slug, I18n, RateLimiter, Eligibility, EventLogging, ReturnTarget, Seo (دون Php) [V] ⇒ الاشتقاق الحرفي = Maatify\Persistence\ = جذر القديمة نفسه. يتعارض مع شرط التعايش في هذا الـ Issue؛ يحتاج قرارًا + توضيحًا upstream. [2/6] §2.6 · [4/6] §3 · OD-02
    F-3 لا يوجد في المعايير عقد bootstrap لمستودع فارغ. Phase Stack وAI Collab يفترضان base branch وPR لكل branch منشورة (S@standards/GITHUB_PHASE_STACK_WORKFLOW_AR.md:33-61، AI_COLLABORATION…:529-551)، بينما لا يمكن فتح PR دون base [V: defaultBranchRef=""]. أول Commit يحتاج استثناءً صريحًا وضيّق النطاق من المالك (لا يُخترع). [6/6] WU-1 · OD-13
    F-4 ست معايير مرشّحة Mutable Candidate عند 5b69c03 (Adoption 5.0.1، Composer 5.0.0، CI 5.0.0، Library Presentation 5.0.1، AI Collab 13.0.0، Phase Stack 5.0.0) وحالة تجميد PB 4.0.0/Testing 3.0.0/Doc-Lifecycle 3.1.0 غير قابلة للإثبات [U]. Adoption أول سيُجمّدها فعليًا (Adoption §5.1.1). قواعد PHP 8.4 والتسمية والـtopology موجودة أيضًا في commit أقدم (2ea426a, PB 3.0.2) [V]؛ ما يضيفه 5b69c03 للإصدار هو خصوصًا Release/Published Artifact Verification (CI/LP 5.0.0). الـ pin "غير معتمد تلقائيًا"؛ ثلاثة مسارات مقترحة. [2/6] §2.4 · OD-11
    F-5 الـ main القديمة تحمل تغييرات سلوكية غير منشورة (#33 clamp، #55 savepoint، API جديد، runners جديدة) — لا يجوز تسميتها "unchanged" مقابل v1.4.0. يحدد أي سلوك "تصميميًا" في الحزمة الجديدة. [3/6] · OD-07
    F-6 CI القديم لا يطبق عقد CI الحالي §11: لا Compose (لا ملف compose في الشجرة؛ يستخدم services: + docker exec)، ولا Integration على PHP 8.4 (8.2/8.5 فقط)، وMySQL 8.4.10 فقط. لا يُنقل CI كما هو؛ يُعاد بناؤه وفق المعيار. [5/6] §1
    F-7 مفردات Responsibility لا تُسمّي مكانًا واضحًا لـ "منفّذات PDO عديمة الحالة": PB §13 (:902-905) يمنع SQL في Service بينما PdoPaginator/ScopedOrderingManager يبنيان وينفذان SQL. تفسير مقترح (Repository) يحتاج اعتماد. [4/6] §4 · OD-04
    F-8 الاستهلاك الفعلي (5 مستودعات عامة مفحوصة): PageRequest/PageResult الأكثر استخدامًا؛ PdoTransactionRunner/PdoSavepointTransactionRunner مستخدمة مباشرة؛ مستهلك واحد على الأقل خاص (غير مُسمّى هنا لأن هذا Issue عام). أثر PageResult→PageResultDTO وَ runners على الهجرة حقيقي. [5/6] §3
    F-9 رابط داخل COMPOSER_PACKAGE_PROFILE.md (ضمن Control Set) يشير إلى EXTERNAL_PROVIDER_VERIFICATION_STANDARD.md المستبعد بـ Stage 2؛ وفحص الإغلاق الميكانيكي يُغلق كل المعايير المنطبقة بلا أي خروج؛ فهذا الرابط هو الاستثناء الوحيد [V]. تفسير لإغلاق المراجع المحلية يلزم توثيقه عند Adoption. [2/6] §2.3

    4. حدود هذا التقرير

    • لم أجرِ تنفيذ الحزمة الجديدة ولا أي نسخ لملفات المصدر. جميع المراجع قراءات فقط.
    • الاستنتاجات [I] والتصميم [P] ليست حقائق؛ كل ما يحتاج اعتمادًا مرقّم OD-n في [6/6].
    • المستهلكون الخاصون لم تُفصّل أسماؤهم أو محتواهم هنا (المستودع عام)؛ يمكن لـ Lead/المالك التحقق منها داخليًا.

    الروابط: 2/6 · 3/6 · 4/6 · 5/6 · 6/6. بعد [6/6] أتوقف.

  3. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    [2/6] دراسة المعايير: Profile Resolution · Canonical Applicability · Pinned Adoption المقترح

    المصدر: Maatify/php-engineering-standards@5b69c03419ad09369ad207a9a7976cc9cc0617d3 (HEAD لحظة الدراسة، ليس Pin معتمدًا). الإحالات S@path:L.

    2.1 سجل القراءة (Reading Ledger) — بصدق

    الملف الإصدار التغطية
    AGENTS.md — كامل
    standards/STANDARDS_ADOPTION_STANDARD_AR.md 5.0.1 (748 سطر) كامل بما فيه §16 وسجل التغييرات
    standards/profiles/COMPOSER_PACKAGE_PROFILE.md · REPOSITORY_GOVERNANCE_PROFILE.md 4.0.0 · 3.0.0 كاملان
    packages/PACKAGE_BUILDING_STANDARD.md 4.0.0 (1211) كامل
    packages/COMPOSER_PACKAGE_STANDARD.md 5.0.0 (1489) كامل
    packages/CI_WORKFLOW_STANDARD.md 5.0.0 (523) كامل
    packages/LIBRARY_PRESENTATION_STANDARD.md 5.0.1 (936) كامل
    testing/TESTING_STANDARD.md 3.0.0 (170) كامل
    governance/DOCUMENTATION_LIFECYCLE_STANDARD_AR.md 3.1.0 (171) كامل
    governance/DECISION_GOVERNANCE_STANDARD_AR.md 1.0.0 (314) كامل
    php/PHP_CODING_STYLE_STANDARD.md · php/PHP_SOURCE_DOCUMENTATION_STANDARD.md 1.0.1 · 1.0.0 كاملان
    integrations/EXTERNAL_PROVIDER_VERIFICATION_STANDARD.md 1.0.0 (191) كامل (لتحديد عدم الانطباق)
    ai/AI_COLLABORATION_WORKFLOW_AR.md 13.0.0 (2041) كامل المتن المعياري §1–§16 (الأسطر 1–1856)؛ لم أقرأ سجل التغييرات التاريخي بعد السطر 1856 (غير معياري)
    GITHUB_PHASE_STACK_WORKFLOW_AR.md 5.0.0 (657) كامل المتن §1–§9؛ سجل التغييرات (من السطر 594) مقروء جزئيًا
    docs/decisions/DECISIONS_INDEX.md — كامل (47 قرارًا)
    سجلات القرارات DEC-005، DEC-009، DEC-013، DEC-025، DEC-046 مقروءة جزئيًا (Context/Decision/Consequences الافتتاحية؛ DEC-025 كاملة تقريبًا)؛ بقية القرارات ACTIVE استُخدم فيها صف الـIndex والمعيار المالك المقروء كاملًا؛ سجلات DEC-023/030/031/032 وغيرها لم تُقرأ [U]
    governance/STANDARD_VERSIONING_POLICY_AR.md — غير مقروءة عمدًا: ليست ضمن Adoption Set (Adoption §3.B :101)
    معايير Module/Project/Slim/HTTP وَ Profiles الخاصة بها — خارج Resolved Set (لا Host ولا Module) — لم تُقرأ

    2.2 Stage 1 — Structural / Transitive Resolution

    Activations المقترحة (Adoption §6 :250-307):

    Profile Version Scope Extends حقائق الـartifact المبنية عليها
    composer-package 4.0.0 / None مكتبة PHP/Composer مستقلة قابلة لإعادة الاستخدام، تملك سلوك SQL/PDO
    repository-governance 3.0.0 / None مستودع يعمل بدورة Lead/Executor وPhase Stack وPR (Issue #1 نفسه)
    project-host — — — غير منطبق: ليس Host/Application (Adoption §6.1 :263-277)

    لا يوجد Extends ⇒ لا Profiles موروثة ⇒ Control Set = 3 ملفات.

    Candidate Standard References (اتحاد المراجع المباشرة، بترتيب Profile):

    # المرجع مصدره
    1 Package Building 4.0.0 composer-package
    2 Composer Package 5.0.0 composer-package
    3 CI Workflow 5.0.0 composer-package
    4 Library Presentation 5.0.1 composer-package
    5 Testing 3.0.0 composer-package
    6 External Provider Verification 1.0.0 composer-package (شرطي)
    7 Documentation Lifecycle 3.1.0 composer-package وَ repository-governance (مكرر)
    8 PHP Source Documentation 1.0.0 composer-package
    9 PHP Coding Style 1.0.1 composer-package
    10 AI Collaboration Workflow 13.0.0 repository-governance
    11 GitHub Phase Stack 5.0.0 repository-governance
    12 Decision Governance 1.0.0 repository-governance

    13 مرجعًا مباشرًا ⇒ 12 مرشحًا فريدًا. سلامة بنيوية: كل المراجع موجودة عند 5b69c03 [V] (فحص os.path.exists على الشجرة المستنسخة).

    2.3 Stage 2 — Canonical Applicability ⇒ Final Resolved Applicable Standards Set

    المعيار الحكم الأساس canonical (Section)
    Package Building ✅ منطبق (+ القواعد الشرطية للـPersistence) §1 :18-35: مكتبات PHP/Composer قابلة لإعادة الاستخدام؛ القواعد الشرطية تنطبق لأن الحزمة تملك سلوك SQL/PDO. DEC-005
    Composer Package ✅ §3 :89-93: "standalone reusable PHP Composer libraries"
    CI Workflow ✅ مقدمة :9: standalone Composer packages
    Library Presentation ✅ §3 :57-63
    Testing ✅ (§3.4 Harness إلزامي؛ §4.7 غير منطبق) §3.4 :75-94: "Every standalone reusable Package"؛ §4.7 Host فقط
    External Provider Verification ❌ مستبعد deterministically §1 :14-16: ينطبق فقط على Provider Contract Owner؛ MySQL خدمة repository-controlled/provisionable (§3 :32). استبعاد Stage 2 ليس Exception (Adoption §7 :345، §16.3 :679)
    Documentation Lifecycle ✅ §1 :15-21
    PHP Source Documentation ✅ §3
    PHP Coding Style ✅ §3
    AI Collaboration ✅ [I] Profile repository-governance: أي Repository تتبع Maatify workflow؛ #1 نفسه يعمل بدور Lead/Executor
    GitHub Phase Stack ✅ [I] نفسه
    Decision Governance ✅ Applicability :13-17: وجود docs/decisions/DECISIONS_INDEX.md إلزامي ولو دون قرارات

    ⇒ Final Resolved Applicable Standards Set = 11 معيارًا. الـ Final Set + Control Set = 14 ملفًا upstream + STANDARDS_MANIFEST.md (محلي).

    Local Reference Closure (Adoption §7.1 :347-363) — فحص ميكانيكي [V]: كتبتُ سكربتًا مؤقتًا (خارج المستودعين) يستخرج الروابط النسبية من كل ملف في المجموعة (بعد حذف كتل الكود) ويتحقق من أن الهدف ضمن Control Set ∪ Final Set.

    السكربت والنتيجة (قابلان للإعادة)
    import re,os
    final=['standards/packages/PACKAGE_BUILDING_STANDARD.md','standards/packages/COMPOSER_PACKAGE_STANDARD.md','standards/packages/CI_WORKFLOW_STANDARD.md','standards/packages/LIBRARY_PRESENTATION_STANDARD.md','standards/testing/TESTING_STANDARD.md','standards/governance/DOCUMENTATION_LIFECYCLE_STANDARD_AR.md','standards/php/PHP_SOURCE_DOCUMENTATION_STANDARD.md','standards/php/PHP_CODING_STYLE_STANDARD.md','standards/ai/AI_COLLABORATION_WORKFLOW_AR.md','standards/GITHUB_PHASE_STACK_WORKFLOW_AR.md','standards/governance/DECISION_GOVERNANCE_STANDARD_AR.md']
    control=['standards/STANDARDS_ADOPTION_STANDARD_AR.md','standards/profiles/COMPOSER_PACKAGE_PROFILE.md','standards/profiles/REPOSITORY_GOVERNANCE_PROFILE.md']
    allowed=set(final+control); link=re.compile(r'\]\(([^)\s]+)\)')
    for f in final+control:
        t=re.sub(r'```.*?```','',open(f).read(),flags=re.S)
        miss={(m.group(1),os.path.normpath(os.path.join(os.path.dirname(f),m.group(1).split('#')[0])))
              for m in link.finditer(t) if not m.group(1).startswith(('http','#','mailto')) and m.group(1).split('#')[0]}
        miss={x for x in miss if x[1] not in allowed}
        print(f,'OUT-OF-SET' if miss else 'closed',sorted(miss))

    النتيجة: كل الـ11 معيارًا + Adoption + REPOSITORY_GOVERNANCE_PROFILE = closed؛ الاستثناء الوحيد COMPOSER_PACKAGE_PROFILE.md ⇒ ../integrations/EXTERNAL_PROVIDER_VERIFICATION_STANDARD.md (موجود upstream، مستبعد من Final Set).

    [I] الرابط الخارج عن المجموعة موجود في Profile manifest (جزء من Control Set) وليس في Standard منطبقة؛ نص §7.1 يخص "Standard منطبقة" ويصرّح (:159) بأن مراجع Profiles اللازمة للحل البنيوي تبقى ظاهرة في الملفات المثبتة. أرى هذا Resolved لكنه يستحق تثبيتًا صريحًا عند Adoption: إن عامله الـvalidator كـ"broken closure" فهو عيب upstream (Adoption يمنع نسخ المستبعد لإبقاء رابط حيًا :349-351) ويُرفع كـFinding upstream لا كاستثناء (DEC-045).

    2.4 Pinned Adoption المقترح (بانتظار قرار المالك)

    الملفات المحلية (Adoption §8 :369-404؛ لا يُنسخ docs/decisions/ ولا Profiles/Standards غير المنطبقة، ولا STANDARD_VERSIONING_POLICY_AR.md):

    AGENTS.md
    docs/php-engineering-standards/
    ├── STANDARDS_MANIFEST.md                       # محلي، لا يُنسخ من upstream
    └── standards/
        ├── STANDARDS_ADOPTION_STANDARD_AR.md       # Control Set
        ├── profiles/{COMPOSER_PACKAGE_PROFILE,REPOSITORY_GOVERNANCE_PROFILE}.md
        ├── ai/AI_COLLABORATION_WORKFLOW_AR.md
        ├── GITHUB_PHASE_STACK_WORKFLOW_AR.md
        ├── governance/{DECISION_GOVERNANCE_STANDARD_AR,DOCUMENTATION_LIFECYCLE_STANDARD_AR}.md
        ├── packages/{PACKAGE_BUILDING,COMPOSER_PACKAGE,CI_WORKFLOW,LIBRARY_PRESENTATION}_STANDARD.md
        ├── php/{PHP_CODING_STYLE,PHP_SOURCE_DOCUMENTATION}_STANDARD.md
        └── testing/TESTING_STANDARD.md
    docs/decisions/DECISIONS_INDEX.md               # repository-local (Decision Governance)
    

    محتوى STANDARDS_MANIFEST.md المطلوب (Adoption §9 :406-440): Upstream Repository · Adoption Commit · تاريخ · Control Set · Active Profiles + Versions + Scope · Final Resolved Applicable Standards Set (11 فقط + إصداراتها، دون المستبعد) · Explicit Additional Standards: None · Explicit Exceptions/Overrides: None · Pinned Operational Assets Set: غائب (= لا Operational Assets، صحيح بنص :105-111) [OD-12].

    AGENTS.md المحلي (AI Collab §1.2 :38-46، Adoption §10 :459-461): يشير إلى STANDARDS_MANIFEST.md وAdoption Standard فقط، يُلزم بقراءة AI Collaboration، ويسجّل قواعد المشروع الخاصة دون تكرار قواعد عامة. الأولوية: تعليمات المالك ← AGENTS.md ← مصادر المشروع (المعايير/ADRs/Package Reference) ← توجيه المهمة ← المعيار العام (AI Collab §1.3 :48-60).

    خيارات الـPin (جدول مقارنة [V] من git show <commit>:<file>):

    المعيار 7dd9d1d (2026-09-22) 5f872d3 (2026-10-01) 2ea426a (2026-10-04) 5b69c03 (2026-10-23)
    Adoption 4.0.0 4.0.0 4.0.0 5.0.1
    Package Building 3.0.1 3.0.2 3.0.2 4.0.0
    Composer Package 4.0.0 4.0.0 4.1.0 5.0.0
    CI Workflow 3.0.0 3.0.0 4.0.0 5.0.0
    Library Presentation 3.0.0 4.0.0 4.0.0 5.0.1
    Testing 1.1.1 1.1.1 2.0.0 3.0.0
    AI Collaboration 8.0.0 9.0.0 10.0.0 13.0.0
    Phase Stack 4.0.0 4.0.0 4.0.0 5.0.0
    Profile composer-package 3.0.0 3.0.0 4.0.0 4.0.0
    الخيار الوصف التقييم
    P-A 5b69c03 الـHEAD الحالي يتضمن كل قواعد الدراسة (PHP 8.4 :27-29، topology، التسمية) وعقد الإصدار الأحدث: Release Artifact Verification وPublished Artifact Verification (CI 5.0.0 :79-117) وهوية Release Artifact (LP 5.0.0 :260-278، DEC-030) وهي غير موجودة في 2ea426a [V: grep]. الثمن: ستة معايير Mutable Candidate + حالة تجميد PB/Testing/Doc-Lifecycle غير قابلة للإثبات [U] ⇒ Adoption أول يجمّدها فعليًا (Adoption §5.1.1 :218-240)
    P-B 2ea426a آخر commit تدل عليه أدلة ترقية مستهلك (CP Std :1487، CI Std :521) صالح ومحافظ: يحتوي PHP 8.4 baseline وSource Topology وقواعد التسمية وCompose وHarness وllms.txt وStrict Acceptance [V: grep عند 2ea426a]، وبعض إصداراته مثبتة كـFrozen Baseline بأدلة مستهلك (Composer 4.1.0، CI 4.0.0). لكن يفتقد RAV/PAV وهوية Release Artifact (CI/LP 5.0.0) ومعها Adoption 5.0.x وواجبات AI Collab 11–13 ⇒ يستلزم Upgrade عند الاقتراب من RC. فرق PB 3.0.2→4.0.0 نفسه تصحيح لحدود Ordering الخاصة بالمستهلكين فقط (§11) [V: git diff]
    P-C تأجيل تنسيق مع upstream لتجميد/وسم المرشحين ثم Pin على commit نهائي الأسلم معياريًا، لكن يُعطّل WU-2 حتى قرار upstream

    توصيتي [P]: (P-B بديل محافظ مشروع إن فضّل المالك Frozen Baselines وقبل Upgrade لاحق). المرشح للاعتماد = 5b69c03419ad09369ad207a9a7976cc9cc0617d3 بشروط: (1) قبول المالك الصريح أن Adoption يجمّد المرشحات (OD-11)؛ (2) عند بداية WU-2 يُعاد التحقق من HEAD upstream والـ version table وسكربت الإغلاق، وإن تحرك HEAD يُقيَّم الفرق ولا يُرقّى تلقائيًا (Phase Stack §7 :371-378 يثبت الـSnapshot طوال الـTrain)؛ (3) التحقق byte-for-byte لكل ملف مقابل git show <commit>:<path> (سابقة المستهلكين). حالة تجميد Profiles (4.0.0/3.0.0): [I] مدعومة بنصوص السجل، غير مثبتة بمقارنة blob مع manifest مستهلك ⇒ إن تعذر الإثبات تكون النتيجة نصًّا OWNER DECISION REQUIRED — VERSION BASELINE STATUS (Adoption :234-240).

    2.5 مصفوفة امتثال/تبنٍّ مؤقتة (Provisional) — ما يشكّل التصميم

    المعيار الالتزامات المؤثرة على التصميم أين تُعالج الحالة
    PB 4.0.0 PHP 8.4 (:27-29) · تسمية *Interface/*Enum/*DTO/*Exception (:152-171) · topology موحّدة معلنة في Package Reference (:175-229) · Responsibility vocabulary (:231-269) · لا جذر تقني Pdo/ (:291-308) · لا Internal/ (:310-312) · marker {PackageName}ExceptionInterface (:443-455) · rollback + إعادة رمي الأصل (:524-549) · SQLSTATE vs driver-code (:498-505) · final readonly DTO (:591-629) · PHPStan max بلا baseline (:1044-1067) · txn/concurrency (:1191-1203) · تصنيف Operational Read/Reporting (:917-955) [3/6]، [4/6] تصميم متوافق؛ فجوات F-1/F-2/F-7
    Composer 5.0.0 maatify/php-{domain} (:237-244) · PSR-4 src/ · ^8.4 (:549-569) · require للـext-pdo (+ext-pdo_mysql؟) · لا version ولا composer.lock (:1122-1137) · لا replace بلا موافقة معمارية (:749-763) · scripts القياسية (:861-931) · config.policy fail-closed (:1036-1096) · archive لا يستبعد ملفات إلزامية (:810-819, :1141-1171) [4/6] §5 متوافق بالتصميم
    CI 5.0.0 بوابات محلية = CI (:26-32) · Compose للـIntegration (:317-343) · matrix 8.4+latest (:228-246) · lowest/latest · audit fail-closed (:272-296) · actions مثبتة بالـSHA (:365-386) · stable gate (:424-437) · Release Artifact Verification وPAV (:79-117) [5/6] يحتاج إعادة بناء كامل (F-6)
    Testing 3.0.0 Harness خارجي مرتين من حالة نظيفة (:75-94) · Unit/Integration/System · RED/GREEN للعيوب المثبتة (:134-137) [5/6] متوافق بالتصميم
    Library Presentation 5.0.1 README, CHANGELOG, SECURITY, CONTRIBUTING, CODE_OF_CONDUCT, LICENSE, Package Reference, docs/guides/USAGE_GUIDE.md, examples/, llms.txt (:126-148) · RC → Harness → ≥2 Hosts → Stable (:572-594) · Release Artifact identity (:260-278) [5/6]، [6/6] متوافق بالتصميم؛ شرط "Hostين مستقلين" [U]
    Doc Lifecycle 3.1.0 وثائق دائمة بالإنجليزية افتراضيًا (:46-54) وPHPDoc بالإنجليزية (:56-81) · لا ملفات لكل Work Unit (:139-151) كل الوثائق متوافق؛ هذا التقرير عربي لأنه Communication artifact (AI Collab §2.1) ولا يُودَع كملف
    PHP Style 1.0.1 PER-CS 3.1 مثبت + أمر تحقق غير معدِّل (:66-98) [5/6] معرّف قاعدة php-cs-fixer المطابق لـ3.1 [U] — يُتحقق منه في WU الهيكل
    PHP Source Doc 1.0.0 DocBlock دلالي للعقود العامة والاستثناءات والـside effects (§4–§5) كل WU كود متوافق؛ مرجع الجودة الحالي في القديم جيد
    AI Collab 13.0.0 Lead لا ينفذ دون إسناد · كل GitHub Merge بإذن مالك · لا amend/force · Fresh Full Acceptance · Pre-Release Strict Lead Acceptance قبل RC/Stable (§13.1.2 :1414-1655) WU gates متوافق
    Phase Stack 5.0.0 Branch لكل Work Branch منشورة تملك PR (:33-61) · Batch/Draft · Standards Freeze (:371-378) · بوابات الدمج الأربع (:461-555) · Post-Merge Verification (:565) [6/6] فجوة F-3 للمستودع الفارغ
    Decision Governance 1.0.0 كل Material Decision ⇒ ADR + Index قبل أو ذريًّا مع التنفيذ (:73-87) WU-3 متوافق

    2.6 تناقضات وفجوات في المعايير نفسها (لا اختراع استثناءات)

    # الفجوة/التناقض الدليل [V] ما أقترحه
    S-1 PB يسمّي maatify/persistence مالكًا وحيدًا لـordering/pagination ويحظر "نسخًا محلية" ويجعل القدرة الناقصة تُقترح داخله PB :73-76 ("Persistence Utilities … must depend on maatify/persistence")، :76 (Rule: لا duplicates)، :703-708 (Authoritative owner)، :806-812 (Missing Capability)، :816-818 (Source of Truth)، :973 (مرجع مثبّت على fc1459b) [I] النص يخاطب الحزم المستهلِكة ولا يتناول حزمة خلف تحل محل المالك؛ لكنه يعبّر عن افتراض تصميمي "حزمة مشتركة واحدة". لا يوجد استثناء متاح (Decision Governance :269-275: قرار المستودع لا يجعل انحرافًا ممنوعًا متوافقًا). المسار الصحيح: قرار مالك + تعديل معياري مستقل يسجّل الخلافة، بعد/مع الإصدار الأول (يتسق مع ترتيب #37: "أصدر الحزمة أولًا ثم حدّث حقائق المعايير") OD-03
    S-2 {PackageName} غير معرَّف لـphp-* PB :143-150، Composer :237-244؛ 8 حزم عامة تستخدم الاسم بدون Php (composer.json لـphp-category/slug/i18n/rate-limiter/eligibility/event-logging/return-target/seo) OD-02؛ ويُرفع توضيح upstream
    S-3 لا عقد لمستودع فارغ/أول Commit Phase Stack :33-61, :95-103؛ AI Collab :529-551؛ لا ذكر لـ"initial/first commit" أو "empty repository" في أي معيار من المجموعة (grep -i على AI Collab وPhase Stack وAdoption وgovernance/ وpackages/؛ كلمة "bootstrap" ترد فقط بمعنى إصدار تأسيسي للمعيار أو DI) استثناء مالك ضيق لمرة واحدة يُسجَّل لاحقًا كـADR (لا backfill مُختلق: Decision Governance :296-304) OD-13
    S-4 لا مكان صريح لـ"منفّذ PDO عديم الحالة" ضمن Responsibility PB :231-269 مقابل :902-905 (Services never contain raw SQL) Repository/ للمنفّذات التي تبني/تنفذ SQL، Service/ للـrunners التي تنفذ أوامر تحكم (SAVEPOINT, DO 0) فقط — تفسير يُعتمد OD-04
    S-5 Internal/ غير canonical لكن الحاجة لأنواع @internal قائمة PB :310-312 تُوضع في Responsibility المالكة مع @internal في PHPDoc، لا مجلد Internal/
    S-6 Profile manifest (Control Set) يربط بمعيار مستبعد §2.3 أعلاه توثيق التفسير عند Adoption
    S-7 حالة التجميد غير قابلة للإثبات من نص الملفات لعدة معايير §2.4 OD-11
    S-8 شرط "Real Host Validation في ≥2 Host مستقلين" لحزمة بنية تحتية LP :572-594 [U] أي Hostين؟ (admin-control-panel عام؛ الثاني خاص) — يحتاج تحديد المالك OD-18
    S-9 نمط CI القديم (job-level services) مقابل Compose المعتمد CI :317-343 مقابل ci.yml القديم يعاد بناؤه؛ لا يُعامل كانتهاك للقديم المنشور (pin قديم 1.1.0) بل كسبب لعدم النقل

    2.7 قرارات مركزية ACTIVE ذات صلة (من DECISIONS_INDEX.md)

    DEC-002 (Profiles مستقلة) · DEC-005 (Persistence Applicability) · DEC-008 (Final-class testing) · DEC-009 (Selective Pinned Adoption) · DEC-012 (llms.txt) · DEC-013 (Profile resolution) · DEC-017 (PR لكل branch منشورة) · DEC-018 (إسناد التنفيذ للـLead صريح) · DEC-023 (Strict Acceptance قبل RC/Stable) · DEC-025 (Optional Runtime Capability: لا ينطبق—ext-pdo أساسي) · DEC-030 (Release Artifact Self-Consistency) · DEC-031/032 (Operational Assets—غير معتمدة افتراضيًا) · DEC-033/041 (سلامة الأدلة/Post-Merge) · DEC-038/043/044/045/047 (Lead/Executor duties) · DEC-046 (عمليات الحالة المشتركة: تسجيل Packagist ونشر الحزمة خارج الاختبارات المعزولة تحتاج تفويض مالك) · DEC-042 (عدم ذكر مشاريع مستهلِكة بعينها في المعايير المركزية — لا يقيّد هذا التقرير).

  4. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    [3/6] الجرد الشامل: مصفوفة العقود الثلاثية + مصفوفة السلوك

    الأعمدة: A = Published v1.4.0 (fc1459b) · B = Old main Unreleased (1f6a7aa) · C = Proposed maatify/php-persistence (P\ = Maatify\PhpPersistence\ — الاسم نفسه قيد OD-02).
    المسارات نسبية إلى src/؛ Pdo/… يعني src/Pdo/…؛ :N = رقم السطر في الملف نفسه عند ذلك الـSHA. الأعمدة الخاصة بالتصنيف: KEEP = نفس الاسم القصير والتوقيع العام (لكن الـFQCN يتغير دائمًا) · RENAME · REDESIGN · OMIT.
    قابلية الإعادة: git ls-tree -r --name-only v1.4.0 -- src (21 ملف) · … 1f6a7aa -- src (26) · git diff --name-status v1.4.0 1f6a7aa -- src (5 مضافة + 5 معدلة) · التوقيعات: git show <sha>:<path> | grep -nE '^(final readonly class|interface|enum) |^ public (static )?function'.

    3.1 مصفوفة الأنواع العامة (26 ملفًا في B)

    أ) Exceptions

    ID A (v1.4.0) B (main) Δ A→B C — Proposed التصنيف الأساس / الدليل
    T-01 Exception/PersistenceException.php:17 interface … extends \Throwable نفسه :17 — P\Exception\PhpPersistenceExceptionInterface RENAME PB §4 :163-167 وَ §7 :443-455: {PackageName}ExceptionInterface. استثناء "Legacy Published Marker" :457-471 خاص بالحزمة ولا يُنسخ لحزم جديدة (:468). المرجع القديم يوثّق الاحتفاظ بالاسم طوال 1.x (PERSISTENCE_PACKAGE_REFERENCE.md:719-734). اختبارات النقل: tests/Regression/Exception/*
    T-02 Exception/InvalidOrderingConfigurationException.php:22 final … extends SystemMaatifyException :22 — P\Ordering\Exception\InvalidOrderingConfigurationException KEEP PB §5 :322 (استثناء خاص بقدرة تحت {Capability}/Exception/). ErrorCodeEnum::MAATIFY_ERROR. tests/Regression/Exception/InvalidOrderingConfigurationExceptionTest.php:17,24,36,51
    T-03 …/InvalidOrderingOperationException.php:20 extends ValidationMaatifyException (INVALID_ARGUMENT) :22 تعليق فقط: يضيف حالة "precondition غير متحققة" P\Ordering\Exception\InvalidOrderingOperationException KEEP يُرمى من getNextPositionForUpdate خارج معاملة (B@Pdo/Ordering/ScopedOrderingManager.php:174-178)
    T-04 …/InvalidPaginationConfigurationException.php:11 :11 — P\Pagination\Exception\InvalidPaginationConfigurationException KEEP tests/Regression/Exception/PaginationExceptionContractTest.php:25
    T-05 …/InvalidPaginationQueryException.php:11 :11 — P\Pagination\Exception\InvalidPaginationQueryException KEEP نفسه
    T-06 …/PaginationExecutionException.php:11 :11 — P\Pagination\Exception\PaginationExecutionException KEEP نفسه؛ …ExceptionTest.php:44 يثبت عدم وجود marker خاص بالـpagination
    T-07 …/TransactionExecutionException.php:11 :11 — P\Transaction\Exception\TransactionExecutionException KEEP B@Pdo/Transaction/Internal/OwnedTransactionExecutor.php:104-139
    T-08 — (غير موجود) …/InvalidTransactionConfigurationException.php:20 مضاف (#32) P\Transaction\Exception\InvalidTransactionConfigurationException KEEP (جديد على الحزمة الجديدة) OwnedTransactionExecutor.php:77-83؛ DeadlockRetryRunnerPublicApiRegressionTest.php:129
    T-09 …/OrderingTransactionException.php:18 @deprecated (UnsupportedMaatifyException) :18 نفسه — — OMIT "لم تعد تُرمى" (docblock :12-16)؛ OrderingPublicApiRegressionTest.php:127,157 تثبت بقاءها عامة ومهملة وعدم استخدامها. صفر قيمة لحزمة جديدة (PB :349: لا استثناء legacy لبنية لم تُنشر)

    ب) Ordering

    ID A B Δ A→B C التصنيف الأساس / الدليل
    T-10 Pdo/Ordering/ScopedOrderingConfig.php:29 final readonly; ctor :40 (table, scopeColumn, idColumn, orderColumn, deletedAtColumn, nullableScope, updatedAtColumn)؛ quoted*() :79-125 نفسه — P\Ordering\Config\ScopedOrderingConfig KEEP يتحقق ويقتبس المعرّفات (backticks) :147-216؛ OrderingPublicApiRegressionTest.php:28؛ tests/Unit/…/ScopedOrderingConfigTest.php
    T-11 Pdo/Ordering/ScopedOrderingManager.php:31؛ getNextPosition:46 · moveWithinScope:97 · rowExistsInScope:176 :48؛ getNextPosition:79 · getNextPositionForUpdate:167 · moveWithinScope:270 · rowExistsInScope:365 سلوك وAPI (انظر 3.2: B-02..B-05) P\Ordering\Repository\ScopedOrderingManager KEEP (الاسم/التوقيعات) · REDESIGN داخلي يعتمد في B على PdoTransactionRunner المهملة (B:9, B:298) ⇒ يُعاد توصيله بالجيل الثاني؛ OrderingPublicApiRegressionTest.php:59,94
    T-12 — Pdo/Ordering/Internal/OperationSavepoint.php:30 (@internal :28) مضاف (#55) helper @internal يُدمج مع منطق savepoint في Transaction REDESIGN ADR 0005؛ تكرار control-statement helpers بين OperationSavepoint وَPdoSavepointTransactionRunner وَPdoDeadlockRetrySavepointTransactionRunner [V] (قراءة المصدر) ⇒ ثلاث نسخ متقاربة

    ج) Pagination

    ID A B Δ A→B C التصنيف الأساس / الدليل
    T-13 Pdo/Pagination/PageRequest.php:7 ctor :9 (int|string|null $page, $perPage; ?string $sortBy, $sortDirection) نفسه — P\Pagination\Criteria\PageRequest KEEP (اسم) PB §8 :581: مدخلات query تذهب إلى Criteria؛ لا قاعدة لاحقة. OD-05
    T-14 …/PageResult.php:13 final readonly … implements JsonSerializable (@template T)؛ toArray:38 · jsonSerialize:59 نفسه — P\Pagination\DTO\PageResultDTO RENAME PB §9 :593-629 (DTO نتيجة، final readonly, JsonSerializable) وَ §4 :159-161. المنشور مخالف (old #66 F4-04 مفتوحة). شكل toArray()/jsonSerialize() ثابت (انظر B-08)
    T-15 …/PaginationConfig.php:9 ctor :13 نفسه — P\Pagination\Config\PaginationConfig KEEP تحقق :23-31
    T-16 …/PdoPaginationQueryDescriptor.php:9 ctor :19 نفسه — P\Pagination\Criteria\PdoPaginationQueryDescriptor KEEP رفض ; والبادئة المحجوزة :35-55
    T-17 …/PdoPaginator.php:11; paginate:25 نفسه (+سطر تعليق) — P\Pagination\Repository\PdoPaginator KEEP S-4 في [2/6]؛ يعيد PageResultDTO
    T-18 …/SortDirectionEnum.php:7 enum … : string نفسه — P\Pagination\Enum\SortDirectionEnum KEEP متوافق مع *Enum (PB :160)
    T-19 …/SortWhitelist.php:9; contains:24 · quotedIdentifierFor:32 نفسه — P\Pagination\ValueObject\SortWhitelist KEEP اقتباس backtick حتى 3 مقاطع :74-88

    د) Transaction

    ID A B Δ A→B C التصنيف الأساس / الدليل
    T-20 Pdo/Transaction/TransactionRunnerInterface.php:7; run(callable):mixed :15 نفسه — P\Transaction\Service\TransactionRunnerInterface KEEP DeadlockRetryRunnerPublicApiRegressionTest.php:111 (غير مهملة)
    T-21 …/SavepointTransactionRunnerInterface.php:7 نفسه — P\Transaction\Service\SavepointTransactionRunnerInterface KEEP —
    T-22 …/PdoTransactionRunner.php:14 ctor (PDO) :16 :20 — @deprecated لصالح PdoDeadlockRetryTransactionRunner وسم فقط P\Transaction\Service\PdoTransactionRunner بسلوك الجيل الثاني وctor (PDO $pdo, int $maxDeadlockRetries = 0) REDESIGN OD-08؛ delta سلوكي موصوف في B-10
    T-23 …/PdoSavepointTransactionRunner.php:16 :23 — @deprecated وسم فقط P\Transaction\Service\PdoSavepointTransactionRunner (جيل ثانٍ) REDESIGN نفسه
    T-24 — …/PdoDeadlockRetryTransactionRunner.php:44 مضاف (#32) يُدمج في T-22 (الاسم لا يُنقل) REDESIGN/OMIT-name ADR 0004
    T-25 — …/PdoDeadlockRetrySavepointTransactionRunner.php:39 مضاف يُدمج في T-23 REDESIGN/OMIT-name نفسه
    T-26 — …/Internal/OwnedTransactionExecutor.php:51 (@internal :49), MAX_DEADLOCK_RETRIES = 3 :53 مضاف P\Transaction\Service\OwnedTransactionExecutor (@internal في PHPDoc) KEEP (منطق) S-5 في [2/6]؛ لا مجلد Internal/

    ملخص الجرد

    • A: 21 نوعًا عامًا (8 exceptions · 2 ordering · 7 pagination · 4 transaction). B: 26 ملفًا = 24 عامًا + 2 @internal.
    • C المقترح: 21 نوعًا عامًا + 2 internal. التوزيع مقابل A: KEEP 16 · RENAME 2 (T-01, T-14) · REDESIGN 2 (T-22, T-23) · OMIT 1 (T-09). لا نوع يحتفظ بالـFQCN؛ وبالتالي "KEEP" هنا لا تعني توافق استيراد.
    • لا يوجد replace/alias/class_alias/bridge [P] (Composer :749-763).

    3.2 مصفوفة العقد السلوكي

    ملاحظة مراجع: أرقام أسطر PdoPaginator.php في B-08 هي أرقام B؛ الفرق عن A سطر تعليق واحد عند :203 فقط (تُزاح الأسطر اللاحقة −1 في A). بقية الملفات المشار إليها بلا فرق بين A وB ما لم يُذكر.

    ID العقد A (v1.4.0) B (main) C — Proposed الدليل
    B-01 getNextPosition MAX(order)+1 بقراءة عادية، بلا معاملة ولا قفل، مع تجاهل المحذوف ناعمًا A@Pdo/Ordering/ScopedOrderingManager.php:46 نفس المنطق بعد استخراج buildScopeWhere B:79-97 KEEP. التوثيق يبقى صريحًا: ليست آمنة للتزامن ولا تتجاوز snapshot REPEATABLE READ (B docblock :61-75) OrderingPublicApiRegressionTest.php:94 (القراءتان مدعومتان وغير مهملتين)؛ tests/Integration/…/ScopedOrderingManagerReadOperationsTest.php
    B-02 getNextPositionForUpdate غير موجودة تتطلب معاملة نشطة وإلا InvalidOrderingOperationException :174-178؛ SELECT … ORDER BY order DESC, id DESC LIMIT 1 FOR UPDATE :185-192 تتكرر حتى تتطابق قراءتان :199-214 ⇒ ≥2 قراءة قفل حتى لنطاق فارغ؛ نطاق فارغ بلا صف لقفله :125-127؛ تأخذ lock footprint واسعًا بلا فهرس (scope, order) :128-141 KEEP (قدرة جديدة على الحزمة الجديدة، لا "Unchanged") B docblock :100-166؛ tests/Integration/Pdo/Ordering/ScopedOrderingManagerStaleSnapshotTest.php؛ أمثلة examples/next-position/01–05؛ فاعلية MariaDB 1020 موثقة (:148-160)
    B-03 moveWithinScope — الـclamp قفل النطاق A:123 ثم getMaxPosition A:131 (A:286-303) = SELECT COALESCE(MAX(order),0) بلا قفل ⇒ clamp قديم داخل snapshot أقدم في معاملة مستدعٍ REPEATABLE READ الـclamp من نفس قراءة القفل B:300,308 (#33) KEEP B ScopedOrderingManagerMoveStaleSnapshotTest.php:55,73,90,107,124,141,158,180,196,213,227,253,267,285 · commit a75a41a · #37 يذكر #33 كتغيير سلوكي ناجح يجب أن يظهر في ملاحظات الترقية
    B-04 moveWithinScope — معاملة المستدعي والفشل يشارك معاملة المستدعي؛ عند استثناء/false بعد الإزاحات لا يتراجع عن إزاحاته (يبقى القرار للمستدعي) savepoint محلي كسول بعد قفل النطاق وقبل أول mutation B:295,315؛ cleanupAfterFailure :332-336 · undoOrFail عند false :338-342 · releaseOrUndo :344؛ لا savepoint للـno-op أو الصف المفقود؛ يرمي TransactionExecutionException قبل أي mutation إن كانت المعاملة انتهت OperationSavepoint.php:49-51 KEEP B ScopedOrderingManagerLazySavepointTest.php:116,136,155,180,206,240,276,298,316,340,353,365,379,391 · ADR 0005 · #37 يصف #55 "published-behavior failure-path change" [V: نص #37]
    B-05 moveWithinScope — المسار المملوك PdoTransactionRunner (v1): begin → callback → commit؛ false ⇒ sentinel ⇒ rollback ⇒ يعيد false نفسه B:298 الجيل الثاني (fail-closed): فرق وحيد عند beginTransaction()/commit() يعيدان false بدل رمي (نمط ERRMODE_SILENT) ScopedOrderingManagerTransactionTest.php:160,171,184؛ LazySavepointTest.php:379,391
    B-06 قيم الإرجاع true عند النجاح، true إن كان الصف في الموضع المطلوب، false إن غاب الصف نفسه (B docblock :231-235) KEEP —
    B-07 rowExistsInScope A:176 B:365 نفس المنطق KEEP —
    B-08 الترقيم — الخوارزمية والنتيجة — — KEEP حرفيًا (+rename DTO)
    ↳ تطبيع page/perPage صحيح غير موجب/غير رقمي ⇒ 1؛ perPage يُقيَّد بـ[min,max]؛ تحليل نصي بحدود PHP_INT_* PdoPaginator.php:74-119 نفسه KEEP Unit: PdoPaginatorNormalizationTest.php:21,56,79,113
    ↳ الترتيب whitelist فقط وإلا الافتراضي :121-143؛ ORDER BY مقتبس + tie-breaker مختلف إن لزم :262-269 نفسه KEEP PaginationSqlContractRegressionTest.php:21
    ↳ العدّادات استعلامان (total, filtered) صفّ/عمود واحد فقط، سالب/أكبر من PHP_INT_MAX مرفوض :146-164,240-260 نفسه KEEP PdoPaginatorFailureTest · …FailureContractTest
    ↳ حدود الصفحة filtered=0 ⇒ نتيجة فارغة صفحة 1 بلا استعلام بيانات :42-44؛ page>totalPages ⇒ صفحة 1 :46-48 نفسه KEEP PaginationSqlContractRegressionTest.php:58
    ↳ الربط LIMIT/OFFSET بـPARAM_INT وأسماء محجوزة __pagination_* :15-16,54-55,190-197 نفسه KEEP PdoPaginationQueryDescriptorTest
    ↳ المعاملة لا تملك معاملة ولا تغيّر حالتها نفسه KEEP tests/Integration/Pdo/Pagination/PdoPaginatorTransactionTest.php:14
    ↳ اتساق اللقطة [I] ثلاث جمل متتابعة (total, filtered, data) — لا ضمان لقطة واحدة خارج معاملة المستدعي نفسه KEEP + يوثَّق صراحة في Package Reference قراءة PdoPaginator.php:38-57
    B-09 PageResult — الثوابت والشكل assertValid :79-98 (قائمة، عناصر array|object، page≥1، perPage≥1، count≤perPage، صيغة totalPages، حالة فارغة، أعلام التنقل)؛ مفاتيح JSON: data + pagination{page, per_page, total, filtered, total_pages, has_next, has_previous, sort_by, sort_direction} :38-53 نفسه RENAME فقط؛ شكل المصفوفة/JSON ثابت PB :793: لا تغيير صامت لشكل الاستجابة؛ PageResultTest · PaginationPublicApiRegressionTest.php:80
    B-10 تشغيل المعاملة (الجيل 1 مقابل 2) A@Pdo/Transaction/PdoTransactionRunner.php:26-44: يشارك إن كانت المعاملة نشطة؛ وإلا begin→callback→commit؛ Throwable ⇒ rollback-if-active (فشل rollback يُبتلع) ⇒ إعادة رمي الأصل. قيمة إرجاع begin/commit غير مفحوصة الجيل 2: OwnedTransactionExecutor.php:99-143: begin()==false ⇒ TransactionExecutionException قبل الـcallback؛ commit()==false ⇒ rollback best-effort ثم TransactionExecutionException الجيل 2 PdoDeadlockRetryRunnerIntegrationTest.php:216 · DeadlockRetryRunnerFailClosedTest
    B-11 runner الـsavepoint داخل معاملة: SAVEPOINT maatify_persistence_sp_<32hex> → callback → RELEASE؛ فشل callback ⇒ ROLLBACK TO + RELEASE best-effort وإعادة رمي الأصل؛ فشل RELEASE ⇒ cleanup ثم رمي فشل RELEASE A@Pdo/Transaction/PdoSavepointTransactionRunner.php:33-59 نفسه + المسار المملوك بالجيل 2 الجيل 2؛ صيغة الاسم maatify_persistence_sp_<32 hex> موثّقة وتُختبر ⇒ تُبقى كما هي (انظر ملاحظة التصميم 4.6) PdoSavepointTransactionRunnerTest.php:92 · …ParityTest.php:99 · …RetryTest.php:124,147,148
    B-12 إعادة المحاولة عند deadlock — maxDeadlockRetries ∈ [0,3] وإلا InvalidTransactionConfigurationException :77-83؛ لا إعادة افتراضيًا (0)؛ لا إعادة إلا إذا: المعاملة مملوكة، والـcallback رمى PDOException بـerrorInfo[0]='40001' وerrorInfo[1]===1213 :145-156، وبقي عدد محاولات، والسائق ما زال يُبلغ معاملة ثم DO 0 ينجح ويُبلغ لا معاملة :166-181؛ تأخير: لا شيء / 0–10ms / 0–20ms :194-207؛ لا إعادة: معاملة المستدعي · فشل BEGIN/COMMIT · 1205 · غير ذلك؛ المحاولة الأخيرة تُعيد رمي الاستثناء الأصلي KEEP (بلا أسماء PdoDeadlockRetry*) وحدات: PdoDeadlockRetryTransactionRunnerTest.php:50…321 (14+)؛ تكامل حقيقي: PdoDeadlockRetryRunnerIntegrationTest.php:35,57,81,111,145,182,216,238 · OwnedTransactionExecutorTest · ADR 0004 ("Owner-accepted limit")
    B-13 سياسة الاستثناءات PDOException/Throwable الخارجية تمر كما هي؛ rollback للمملوك فقط؛ فشل التنظيف لا يستبدل الأصل؛ الاستثناءات المسماة للتكوين/التنفيذ/المدخلات فقط نفسه KEEP + توثيق "propagate vs wrap" صراحة (PB §7 :437-441) OperationSavepoint.php:21-25 · runners
    B-14 لهجة DB اقتباس backtick (ScopedOrderingConfig.php:189, SortWhitelist.php:87)، FOR UPDATE، SAVEPOINT، DO 0 (OwnedTransactionExecutor.php:57) ⇒ لهجة MySQL/MariaDB؛ require فيه ext-pdo فقط (composer.json) نفسه ext-pdo + (ext-pdo_mysql؟) OD-10 schema/README.md؛ المرجع القديم :49-57
    B-15 التبعيات php >=8.2 · ext-pdo · maatify/exceptions ^1.0 نفسه php ^8.4 · ext-pdo · (ext-pdo_mysql) · maatify/exceptions ^1.0؛ صلاحية الحد الأدنى على 8.4 تُثبت بوظيفة lowest [U] Composer :549-569
    B-16 ما يدخل الأرشيف A: كل المستودع تقريبًا B: .gitattributes export-ignore لنتائج Issue #32 الخام (commit aaafab6, PR #62) .gitattributes أدنى؛ ملفات Composer §26 لا تُستبعد Composer :1141-1171

    3.3 أثر الهجرة بحسب النوع (SemVer / Consumer)

    التغيير نوعه للمستهلك ما يفعله المستهلك ملاحظات
    composer require maatify/persistence → maatify/php-persistence تغيير هوية استبدال السطر + الـuse حزمتان متعايشتان؛ لا replace
    Maatify\Persistence\Pdo\{Ordering,Pagination,Transaction}\X → Maatify\PhpPersistence\{Ordering,Pagination,Transaction}\<Resp>\X تغيير FQCN لكل الأنواع (إعادة كتابة use ميكانيكية قابلة للتحقق بـPHPStan) جدول 3.1 يعطي الخريطة الحتمية 1:1 لا يوجد نوع بدون تغيير
    PageResult → PageResultDTO اسم نوع الإرجاع/الـtype-hint يتغير تعديل type-hints/instanceof؛ المصفوفة/JSON ثابتان الأكثر استخدامًا في المستهلكين العامّين (F-8)
    PersistenceException → PhpPersistenceExceptionInterface catch-site تغيير catch يوجد دوال catch على النوع القديم؟ [U] لم يُحصَ
    PdoTransactionRunner(PDO) → نفس الاسم، ctor (PDO, int=0) متوافق مصدريًا بعد تغيير namespace لا شيء إضافي الفرق: fail-closed عند begin/commit=false (B-10)
    moveWithinScope سلوك ناجح/فاشل (B-03، B-04) قراءة ملاحظات الترقية تغيير مصدره الـmain غير المنشورة، ويُصبح "مسلَّمًا" في الحزمة الجديدة
    OrderingTransactionException يختفي حذف أي catch عليه — لا يُرمى منذ v1.3.0 (CHANGELOG.md §[1.3.0] Deprecated؛ OrderingPublicApiRegressionTest.php:157)
    وجود getNextPositionForUpdate إضافة اختياري تتطلب معاملة

    ملاحظة صدق: "Unchanged" تُستعمل في هذا التقرير حصرًا حين يدعمها تطابق نصي في git diff v1.4.0 1f6a7aa وَ اختبار مسمّى. أي عقد آخر موصوف كـ"سلوك مصمَّم" أو "delta" وليس "unchanged".

  5. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    [4/6] ما لا يُنقل · البدائل المعمارية · التوصية · التصميم المقترح

    4.1 ما لا يُنقل إلى المكتبة الجديدة (ومبرراته)

    # العنصر القديم لماذا لا يُنقل الدليل [V] التعويض في C
    N-1 PageResult بلا لاحقة DTO مخالف لتسمية DTO (PB §4 :159-161, §9 :593-629)؛ منشور منذ v1.1.0؛ old #66 (F4-04) مفتوحة (NON-COMPLIANCE / Owner policy conflict) ولا استثناء مسجل B@Pdo/Pagination/PageResult.php:13؛ نص #66 PageResultDTO (T-14) — بلا تغيير في القديمة
    N-2 marker PersistenceException بلا Interface PB §4 :163-167؛ استثناء "Legacy Published Marker" لا يُنسخ لحزم جديدة :468 …Exception/PersistenceException.php:17؛ المرجع القديم :719-734 PhpPersistenceExceptionInterface (T-01)
    N-3 جذر تقني src/Pdo/… "New code MUST NOT introduce technology-rooted alternatives such as src/Pdo/" (PB :308)؛ التقنية جوهرية لهوية الحزمة كلها فلا تتكرر كمجلد (:308) بنية src/Pdo/{Ordering,Pagination,Transaction} Ordering/ · Pagination/ · Transaction/
    N-4 مجلدات Internal/ "Shared/, Helpers/, Utils/, Internal/ are not canonical" (PB :312) Pdo/Ordering/Internal/, Pdo/Transaction/Internal/ @internal في PHPDoc داخل Responsibility المالكة (S-5)
    N-5 src/Exception/ مجمّع لكل القدرات الاستثناء الخاص بقدرة يقع تحت {Capability}/Exception/ والجذر للـmarker فقط (PB :314-322) 9 استثناءات في مجلد واحد تفريع حسب القدرة
    N-6 ملفات مسطحة دون مفردات Responsibility PB :231-269 (Config/Criteria/DTO/ValueObject/Enum/Repository/Service) أنواع الـPagination السبعة في مجلد واحد توزيع T-10..T-26
    N-7 OrderingTransactionException ميتة (لا تُرمى منذ v1.3.0) CHANGELOG.md [1.3.0] Deprecated؛ OrderingPublicApiRegressionTest.php:157 — (OMIT)
    N-8 PdoTransactionRunner / PdoSavepointTransactionRunner (الجيل 1) @deprecated في B لصالح الجيل 2؛ لا تتحقق من إرجاع begin/commit B:Pdo/Transaction/PdoTransactionRunner.php:14-18 الأسماء البسيطة بسلوك الجيل 2 (T-22/T-23)
    N-9 أسماء PdoDeadlockRetry* الاسم يُضلل لأن الافتراضي 0 = لا إعادة؛ لم تُنشر قط PdoDeadlockRetryTransactionRunner.php:53 تُدمج في T-22/T-23 (OD-08)
    N-10 تكرار ثلاث نسخ من helpers تحكم savepoint + اعتماد الـManager على runner مهمل تكرار وانجراف محتمل الدالتان executeControlStatement/tryControlStatement مكررتان في OperationSavepoint.php:98-114 وPdoSavepointTransactionRunner.php:73-78,106-115 وPdoDeadlockRetrySavepointTransactionRunner.php:94-99,127-136 (+ منطق cleanup المتقارب)؛ ScopedOrderingManager.php:9,298 helper واحد @internal (T-12)
    N-11 docs/php-engineering-standards/ (Adoption قديم) pin قديم 44c8827 (Adoption 2.0.0 / PB 1.4.0 …) ⇒ الحزمة الجديدة تتبنى مستقلة docs/php-engineering-standards/STANDARDS_MANIFEST.md Adoption جديد (WU-2)
    N-12 docs/studies/** (+ harness/*.php داخل docs/)، docs/adr/* وثائق تاريخية/أدلة؛ لا تُنسخ ADR قديمة كقرارات جديدة (لا backfill مُختلق: Decision Governance :296-304)؛ كود PHP داخل docs ليس مكانه قائمة git ls-tree تُحال بالروابط الدائمة من ADR جديدة
    N-13 ادعاء "MySQL/MariaDB-compatible" بلا CI لـMariaDB PB :41-45: الدعم المُعلن يلزمه تنفيذ واختبار حقيقيان؛ توفر driver ≠ دعم schema/README.md, المرجع القديم :49-57; #51 أُغلقت ضمن نطاق MySQL فقط ادعاء مقيّد (OD-10)
    N-14 php >=8.2 · platform.php 8.2.0 PB :27-29 + Composer :549-569 للحزم الجديدة composer.json ^8.4 · 8.4.0
    N-15 بنية CI القديمة (job services، 8.2/8.5 للتكامل، لا Compose) CI §11 :317-343؛ وPHP 8.4 بلا Integration ci.yml (jobs المسرودة في [1/6]) إعادة بناء (5/6)
    N-16 جذر Maatify\Persistence\ يُصادم القديمة (F-2) composer.json القديم Maatify\PhpPersistence\ (OD-02)

    ما يستحق النقل عبر WUs مراجَعة (مع provenance: SHA المصدر في PR): منطق الأنواع بعد إعادة التموضع (T-10…T-26)، اختبارات Unit/Regression/Integration ذات الصلة بعد إعادة التسمية، tests/Fixtures/MySql/*.sql وَtests/Support/MySql/* (بعد مراجعة أسماء الجداول وفق maa_{package_short_name}_ PB :414)، Consumer Harness (يُكتب من جديد على Composer root خارجي)، أمثلة examples/* (بعد تكييف)، ومحتوى المرجع/الأدلة (إعادة صياغة للهوية الجديدة؛ منع النسخ الحرفي وفق LP §22 :850-865).

    4.2 البدائل المعمارية

    الوصف يحل F-1؟ تعايش/رجوع التقييم
    A البقاء في maatify/persistence: إما v1.5.0 additive (PageResultDTO جديد + إهمال PageResult، php >=8.2) أو v2.0.0 Major (^8.4 + إعادة تسمية كاملة) نعم (لا حزمة ثانية) لا حاجة لتعايش؛ الرجوع = تثبيت الإصدار السابق يستوفي معظم المعايير بكلفة هجرة أقل، لكنه ينقض المقرَّر في Issue #1: هوية الحزمة الجديدة، وPHP ^8.4 بلا كسر وعد >=8.2. يبقى جذر Pdo/ المحمي بتوافق v1 ما لم يصدر Major (PB «Deferred Structural Obligation» :343-406). مرجع للمقارنة فقط
    B ✅ حزمة جديدة maatify/php-persistence، namespace مميز، إعادة تموضع كاملة وفق المعايير الحالية، سلوك أساسه B، تعايش بلا replace، حزمة واحدة Multi-Capability لا (تحتاج OD-03) تعايش حقيقي؛ الرجوع = إعادة سطر require القديم الموصى بها
    C حزمة جديدة بنفس الجذر Maatify\Persistence\ (اشتقاق حرفي) لا هش: حزمتان تملكان prefix PSR-4 واحدًا؛ لا يعرف المستهلك/الأدوات أي حزمة وراء الاستيراد؛ أي تصادم FQCN مستقبلي يكسر التثبيت المشترك مرفوضة: تخالف شرط التعايش الصريح في الـIssue §3.1
    D ثلاث حزم (php-ordering · php-pagination · php-transaction) لا تعايش ممكن مرفوضة: Ordering يعتمد على Transaction؛ يضاعف CI/RC/Hosts ×3؛ مخالفة لافتراض مستودع واحد php-persistence؛ لا أدلة حدودية مستقلة تدعمها
    E B + طبقة توافق (class_alias/bridge/replace/provide) لا تعايش مخادع مرفوضة: replace يحتاج موافقة معمارية صريحة ولا يجوز إخفاء الازدواج به (Composer :749-763)؛ والـIssue يحظر وعد توافق مخادع

    مقارنة معللة (B مقابل A):

    المعيار A (داخل القديمة) B (جديدة)
    تطابق المعايير الحالية (تسمية/topology/8.4) ✗ جزئيًا حتى Major؛ Pdo/ وPageResult محميان بالتوافق ✓ كاملًا من اليوم الأول
    أثر على المستهلكين أقل (ترقية داخل الحزمة) أعلى (هجرة FQCN) لكنه اختياري ومتدرج
    وعد >=8.2 للمنشور يتعارض مع ^8.4 ما لم يصدر Major محفوظ تمامًا (حزمة منفصلة)
    مخاطرة الانحدار (regression) منخفضة متوسطة؛ تُعوَّض بنقل الاختبارات + Harness + تعايش
    الكلفة الحوكمية تصحيح #66 + #37 إطلاق مستودع كامل + F-1 + F-2 + F-3 + OD-11
    قرار المالك القائم يلغي فكرة المستودع الجديد يتسق مع الإنشاء الفعلي لـphp-persistence

    4.3 التصميم المقترح [P] (يُجمَّد في Package Reference/ADR بعد اعتماد المالك)

    4.3.1 الهوية والـ Namespace

    • Composer: maatify/php-persistence · repo: php-persistence (Composer :237-244؛ لا انحرافات).
    • PSR-4: "Maatify\\PhpPersistence\\": "src/" · dev: "Maatify\\PhpPersistence\\Tests\\": "tests/" (COMPOSER :478-537).
    • Marker: Maatify\PhpPersistence\Exception\PhpPersistenceExceptionInterface.
    • ملاحظة: الاشتقاق من الـslug (php-persistence → PhpPersistence) تفسير لـ{PackageName} غير منصوص (F-2/S-2) فيُعتمد صراحةً ويُرفع توضيح upstream.
    • ملف المرجع: PHP_PERSISTENCE_PACKAGE_REFERENCE.md (الجذر، الصيغة {PACKAGE_NAME}_PACKAGE_REFERENCE.md PB :96-137) لتمييزه عن PERSISTENCE_PACKAGE_REFERENCE.md القديم.

    4.3.2 Source Topology (يُعلن حرفيًا في Package Reference — PB :183-201)

    Source Topology: Multi Capability
    
    Capabilities:
    - Ordering
    - Pagination
    - Transaction
    
    src/
    ├── Exception/PhpPersistenceExceptionInterface.php        # package-wide marker فقط
    ├── Ordering/
    │   ├── Config/ScopedOrderingConfig.php
    │   ├── Exception/{InvalidOrderingConfigurationException,InvalidOrderingOperationException}.php
    │   └── Repository/ScopedOrderingManager.php
    ├── Pagination/
    │   ├── Config/PaginationConfig.php
    │   ├── Criteria/{PageRequest,PdoPaginationQueryDescriptor}.php
    │   ├── DTO/PageResultDTO.php
    │   ├── Enum/SortDirectionEnum.php
    │   ├── Exception/{InvalidPaginationConfigurationException,InvalidPaginationQueryException,PaginationExecutionException}.php
    │   ├── Repository/PdoPaginator.php
    │   └── ValueObject/SortWhitelist.php
    └── Transaction/
        ├── Exception/{InvalidTransactionConfigurationException,TransactionExecutionException}.php
        └── Service/{TransactionRunnerInterface,SavepointTransactionRunnerInterface,PdoTransactionRunner,PdoSavepointTransactionRunner,OwnedTransactionExecutor}.php   # + helper savepoint @internal
    
    • اتجاه التبعية: Ordering → Transaction فقط؛ Pagination وTransaction مستقلان؛ لا Common/.
    • لا يُنشأ مجلد فارغ/احتفالي (PB :229).
    • تفسير الـResponsibility (OD-04، يعالج S-4): المنفّذات التي تبني/تنفذ SQL (ScopedOrderingManager, PdoPaginator) ⇒ Repository/ (حدود persistence/query)؛ الـrunners تنسّق callback داخل معاملة وتنفذ فقط أوامر تحكم (SAVEPOINT, RELEASE, ROLLBACK TO, DO 0) ⇒ Service/. البديل: وضع الجميع في Service/ مع تفسير موثّق لـPB :902-905.

    4.3.3 Composer (مخطط مقترح؛ الحقول بالترتيب القانوني COMPOSER :173-211)

    {
      "name": "maatify/php-persistence",
      "description": "Direct-PDO ordering, pagination, and transaction utilities for MySQL.",
      "keywords": ["persistence","pdo","mysql","ordering","pagination","transaction","savepoint","php","maatify"],
      "homepage": "https://github.com/Maatify/php-persistence",
      "type": "library",
      "license": "MIT",                                   // OD-14
      "authors": [{"name":"Maatify","email":"support@maatify.dev","homepage":"https://maatify.dev"}],
      "support": {"issues":"…/php-persistence/issues","source":"…/php-persistence","security":"…/security/policy"},
      "autoload": {"psr-4": {"Maatify\\PhpPersistence\\": "src/"}},
      "autoload-dev": {"psr-4": {"Maatify\\PhpPersistence\\Tests\\": "tests/"}},
      "require": {"ext-pdo":"*", /* "ext-pdo_mysql":"*"  ← OD-10 */ "maatify/exceptions":"^1.0", "php":"^8.4"},
      "require-dev": { /* phpstan, php-cs-fixer, phpunit, (symfony/process إن لزم Partner-process) — أحدث مستقر متوافق */ },
      "scripts": {"analyse":…, "format":…, "test":…, "test:unit":…, "test:regression":…, "test:integration":…, "test:consumer":…},
      "config": {"optimize-autoloader":true,"sort-packages":true,"platform":{"php":"8.4.0"} /* + policy.* Composer §23.5 */},
      "minimum-stability":"stable","prefer-stable":true
    }

    لا version ولا composer.lock ولا repositories ولا replace/conflict/provide (بلا حاجة مبرَّرة). ext-pdo أساسي فلا ينطبق DEC-025 (Optional Capability). حد maatify/exceptions ^1.0 موروث ومُجرَّب lowest على PHP 8.2 في القديمة؛ على 8.4 [U] ويُثبت بوظيفة lowest الجديدة (v1.0.0 على Packagist لا يعلن قيد php في البيانات الوصفية المقروءة).

    4.3.4 PHP 8.4

    php ^8.4 فقط (لا حد أعلى، Composer :567). لا إعادة كتابة مجانية بميزات 8.4؛ final readonly class موجودة. مصفوفة CI: الحد الأدنى 8.4 + أحدث مستقر (8.5 عند الدراسة [U] يُعاد التحقق عند WU-CI) + أي minor وسيط. خطر معروف [U]: منطق إعادة المحاولة يعتمد على أن pdo_mysql يشتق PDO::inTransaction() من آخر رد خادم (OwnedTransactionExecutor.php:28-35)؛ القديمة اختبرت Integration على 8.2 وَ8.5 فقط ⇒ لا دليل Integration على 8.4 ⇒ يلزم الجديد تشغيله على 8.4 و8.5.

    4.3.5 قاعدة البيانات

    • المدعوم الذي يُعلن: MySQL 8.4 عبر pdo_mysql (المُتحقق منه فعلًا: 8.4.10 في CI القديمة [V]).
    • غير مدعوم/غير متحقق: MariaDB — بيانات الدراسات (Issue #47/#48: MariaDB 11.8 innodb_snapshot_isolation=ON ⇒ 1020، ورد savepoint guard على 11.8.9 دون 11.4.7) معلومات سلوكية وليست دعمًا (المرجع القديم :124,145,151)؛ لا تُوعد بمجرد تشابه SQL. فتح الدعم يتطلب قرار مالك + مصفوفة Compose بصورة MariaDB + اختبارات مخصصة (WU مستقلة لاحقة).
    • MySQL 8.0: خارج النطاق المعلن (قِيس في دراسات القديمة المرجع :151 لكنه ليس ضمن مصفوفة CI).
    • ينعكس ذلك في keywords (mysql فقط، لا mariadb) والوصف (Composer :320).

    4.3.6 الاستثناءات (PB §7 :426-549)

    • Marker واحد + استثناءات مسماة للتكوين/المدخلات/تنفيذ التحكم؛ PDOException وغيرها تُمرَّر دون تغليف (موثق)، التراجع للمملوك فقط ثم إعادة رمي الأصل، ولا يُبتلع أو يُستبدل الأصل بفشل التنظيف (B-13).
    • كلها تمتد من هرمية maatify/exceptions كما هي (SystemMaatifyException للتكوين/التنفيذ، ValidationMaatifyException لمدخلات العملية).

    4.3.7 عقد Ordering/Pagination/Transactions (يُجمَّد حرفيًا من B-01…B-13)

    • Ordering: getNextPosition (عادية)، getNextPositionForUpdate (تتطلب معاملة)، moveWithinScope (قفل نطاق ثم clamp من قراءة القفل؛ savepoint كسول عند المشاركة)، rowExistsInScope. الضمانات مشروطة بالمحرك (MySQL 8.4) وتُوثَّق.
    • Pagination: كما هي B-08/B-09 (شكل JSON ثابت).
    • Transactions: runner واحد لكل نوع؛ maxDeadlockRetries ∈ [0,3]؛ replay فقط للمعاملة المملوكة وبشروط B-12؛ المعاملة التي يملكها المستدعي لا تُعاد أبدًا.
    • صيغة اسم savepoint maatify_persistence_sp_<32 hex> تبقى (موثقة ومُختبرة؛ العشوائية 128-bit تمنع التصادم بين الحزمتين المتعايشتين).

    4.3.8 تصنيفات الحزمة المطلوبة في Package Reference [I]

    • Operational Read/Reporting (PB :917-955): Out of Scope — الحزمة آلية بنية تحتية لا تملك حالة تشغيلية/نطاقية خاصة بها (لا جداول مملوكة؛ schema/README.md القديم يقول ذلك)، فلا تُخترع واجهات تقارير.
    • Translation / Media / Decimal / Clock / Admin-Customer: غير منطبقة (لا حقول ولا أزمنة؛ updatedAtValue نص يمرره المستدعي).
    • Factory/Facade: لا (خدمات عديمة الحالة تُنشأ مباشرة؛ PB :993-1002).
    • Schema (PB :410-422): schema/README.md فقط يشرح أن الحزمة لا تملك جداول وأن ما تحتاجه من أعمدة/فهارس يوفره المستهلك؛ جداول الاختبار بالبادئة maa_….
    • العقد التقني لـ"Host Input → Public API → Domain Service → Integration Boundary → Observable Result" (PB :1191-1203) يُوثَّق بمثال Ordering/Pagination/Transaction.

    4.4 نقاط تصميم تُحسَم داخل WUs (ليست قرارات مالك)

    1. الدمج الدقيق لـ helpers الـsavepoint دون تغيير سلوك أي اختبار قائم (سلوك undoOrFail/cleanupAfterFailure يُحفظ).
    2. معرّف ruleset المطابق لـPER-CS 3.1 في php-cs-fixer (PHP_CODING_STYLE :66-98).
    3. إصدار PHPUnit/PHPStan/php-cs-fixer (أحدث مستقر متوافق، COMPOSER :687).
    4. تسمية جداول الاختبار والـCompose project والـenv vars (Integration-scoped، CI :319).
  6. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    [5/6] CI والاختبارات والإصدار · هجرة المستهلكين والتعايش والتراجع

    5.1 CI المقترح (مطابق لـ CI_WORKFLOW_STANDARD 5.0.0) [P]

    ما لا يُنقل: workflow القديم كما هو (F-6/N-15). ما يُعاد استخدامه كفكرة: أسماء الأبواب الناجحة في القديم (Workflow lint، Quality، Unit/Regression، Lowest، Integration، CI Gate).

    Job المحتوى مرجع المعيار ملاحظة
    Workflow lint actionlint بإصدار مثبت + checksum (يغطي كل .github/workflows/*) CI :298-306 non-mutating
    Quality (PHP 8.4) composer validate --strict · dump-autoload --optimize --strict-psr · resolve · composer check-platform-reqs (بلا --ignore-platform-req) · audit fail-closed (Composer ≥ 2.10) · syntax لكل PHP (src/tests/examples/config) · PHPStan max على src tests بلا baseline/ignoreErrors · php-cs-fixer --dry-run --diff (PER-CS 3.1) · whitespace · validation للأمثلة CI :165-195, :248-296; Composer :1036-1096 الأمر المحلي المكافئ لكل بوابة موثّق (CI :26-32)
    Unit/Regression (PHP 8.4 · latest) suites unit وregression بلا Docker CI :228-246, :264 fail-fast: false
    Lowest dependencies (PHP 8.4) composer update --prefer-lowest --prefer-stable ثم الفحوص والاختبارات CI :213-226 يُثبت maatify/exceptions ^1.0 على 8.4 [U→WU]
    Integration (PHP 8.4 · latest) × MySQL 8.4.x تعريف Compose واحد يُمرَّر له صورة/إصدار كمعامل؛ lifecycle: تحقق المتطلبات ← تشغيل ← health check (لا sleep) ← مخطط جديد ← suite ← فحص residue/repeatability (تشغيل ثانٍ) ← down -v عند النجاح والفشل؛ منفذ loopback ديناميكي؛ بلا container_name ثابت؛ project identity لكل run؛ بيانات اعتماد مؤقتة؛ composer test:integration هو المدخل CI :307-363 الـrunner يبقى على PHP المضيف لا داخل Docker
    Consumer Verification Harness Composer root خارجي يعتمد الحزمة كـdependency، production autoload فقط، workflow حقيقي على MySQL، مرتان من حالة نظيفة Testing :75-94; CI :34-44 يعيد استخدام Compose نفسه
    Coexistence Harness (إضافة مقترحة) يثبّت maatify/persistence:^1.4 وmaatify/php-persistence معًا في root نظيف ويستعمل الاثنين على اتصال PDO واحد + اختبار تفاضلي (انظر 5.2) — (طلب هذا الـIssue §3 «consumer coexistence») لا يستبدل Harness المعياري
    Archive/Distribution check فحص أرشيف composer archive/git archive الفعلي: الملفات الإلزامية موجودة، لا أسرار/dev artifacts Composer :1141-1171; CI :79-97 يتوسع عند Release Artifact Verification
    CI Gate أبواب نهائية ثابتة الاسم، if: always()، تفحص needs.*.result CI :424-437 هو الوحيد المطلوب في branch protection
    • التشغيل: pull_request إلى الافتراضي + push إلى الافتراضي (+workflow_dispatch) (CI :439-446). Model A (دائمًا يعمل) لأن الحزمة صغيرة (CI :127).
    • أمن: permissions: contents: read؛ كل action خارجي مثبت بـ full SHA (يُعاد التحقق من كل SHA عند الكتابة، لا نسخ تلقائي من القديمة)؛ لا pull_request_target؛ timeout-minutes وَconcurrency (:365-416).
    • Branch protection: يختار "CI Gate" فقط، ولا تظهر أسماء الـchecks إلا بعد أول run على الـdefault branch ⇒ تُضبط بعد دمج CI الأول [I] (فعل مالك).

    5.2 خطة الاختبارات

    الطبقة المصدر (القديمة، main) المقترح
    Unit (18 ملف) tests/Unit/** يُنقل بعد إعادة التسمية؛ يشمل OwnedTransactionExecutorTest, OperationSavepointTest (يتبع قرار دمج الـhelper)
    Regression (11) tests/Regression/** تُعاد كتابتها من مصفوفة C (3.1) لتثبيت FQCN/modifiers/ctors/النوع المُرجع؛ اختبارات Docs/* (4 ملفات تفحص نص التوثيق) تُنقل فقط إن بقي نصها صحيحًا (قرار WU)
    Integration (22) tests/Integration/** + Support/MySql/** + Fixtures/MySql/*.sql تُنقل بعد مراجعة أسماء الجداول (maa_{short}_ PB :414) على MySQL 8.4 و PHP 8.4 + latest (ثغرة الدليل F-6)؛ تشمل partner-process للـdeadlock الحقيقي
    Consumer Harness (1) tests/Consumer/run.php يُعاد كتابته للحزمة الجديدة
    جديد 1 — Differential/Equivalence: على fixtures مشتركة، PdoPaginator القديم مقابل الجديد ⇒ toArray() متطابق حرفيًا؛ والـOrdering: نتائج متطابقة إلا في deltas B-03/B-04/B-10 الموثقة
    جديد 2 — Coexistence: تثبيت الحزمتين معًا؛ استخدام runner قديم + Manager جديد على اتصال واحد؛ أسماء savepoint فريدة
    جديد 3 — PHP 8.4/8.5 deadlock semantics لـPDO::inTransaction() على pdo_mysql (ثغرة الدليل)
    تزامن PB :1201 الاختبارات الحالية بـpartner process كافية كنقطة بداية؛ لا تُستبدل بـmocks
    RED/GREEN (Testing :137) — ينطبق فقط على عيب مثبت يُكتشف أثناء النقل؛ ليس على النقل نفسه

    5.3 مسار الإصدار والحوكمة

    Development (غير منشور) ── WU gates ──► candidate release SHA (rc.1)
      → Mandatory Pre-Release Strict Lead Acceptance (DEC-023; AI Collab §13.1.2) = PASS
      → Full Applicable CI + Release Artifact Verification على SHA نفسه (CI §2.4–2.5)
      → Owner Release Authorization (صريحة)  → Tag + Release على SHA المؤهَّل
      → تسجيل Packagist (فعل مالك) → Published Artifact Verification (CI §2.6)
      → Consumer Verification Harness على RC المنشور فعلًا
      → Real Host Validation في ≥ 2 Host مستقلين (LP §14.1)
      → Strict Lead Acceptance (مستقل) → Stable 1.0.0 → PAV
    
    • 1.0.0-rc.1 يُحسب «RC» حقًا فقط بعد نشره وقابليته للتثبيت (LP :588)؛ قبل ذلك: Status = Development، لا Latest/Stable/Install badges (LP :195-205)، وSECURITY.md «لا خط Stable مدعوم» (LP :596-598).
    • لا ادعاء نشر قبل الإثبات؛ CHANGELOG يحوي قسمًا غير مؤرخ للهدف قبل الـtag (LP :651-688).
    • Tag/Release/Packagist/أي دمج GitHub: إذن مالك صريح لكل منها (AI Collab :178-186, :547-569, :1643-1653؛ DEC-046). لا شيء منها يحدث في هذه الدراسة.
    • شرط «Hostين مستقلين» [U]: Hostان فعليان يستهلكان php-persistence RC — مرشحان محتملان admin-control-panel (عام) وHost خاص؛ يحدده المالك (OD-18).

    5.4 هجرة المستهلكين

    5.4.1 الأدلة المرصودة [V] (خمس مستودعات عامة، HEAD عند الدراسة؛ عد تكرارات FQCN داخل *.php — ليس تحليل استخدام شاملًا)

    المستهلك (HEAD) قيد maatify/persistence قيد PHP لديه الأنواع المستخدمة (عدد المرات) يكشف نوعًا من persistence في API العام؟ حالة إصداره
    php-slug (787f3f6) ^1.1 ^8.4 PageRequest(12) PageResult(5) SortWhitelist SortDirectionEnum PdoPaginator PdoPaginationQueryDescriptor PaginationConfig نعم — listAliases(...): PageResult… (PdoSlugManagementQueryRepository.php:59-107) Pre-Stable: v1.0.0-rc.1/rc.2
    php-i18n (d3579c7) ^1.4 ^8.4 PageRequest(13) PageResult(10) PdoTransactionRunner(8) TransactionRunnerInterface(7) +Paginator types(3 كلٌّ) InvalidOrderingOperationException(2) ScopedOrderingManager(1) نعم — DomainRepositoryInterface::search(): PageResult (:53-63) وغيرها Pre-Stable: v1.0.0-rc.1
    php-eligibility (bdb5e57) ^1.4 ^8.4 PageRequest(12) PageResult(6) PdoSavepointTransactionRunner(6) SavepointTransactionRunnerInterface(3) PdoTransactionRunner(1) … نعم — RuleManagementQueryInterface::findByCriteria(): PageResult (:40-42) Pre-Stable: v1.0.0-rc.1/rc.2
    php-event-logging (8044125) ^1.1.0 ^8.2 PaginationExecutionException(12) SortWhitelist(10) SortDirectionEnum(10) PdoPaginationQueryDescriptor(10) PaginationConfig(10) InvalidPaginationQueryException(10) InvalidPaginationConfigurationException(7) PdoPaginator(6) PageRequest(6) لا (يعيد DTOs خاصة به؛ لا PageResult) لا tags مرصودة
    admin-control-panel (f15c00f) ^1.4 ^8.4 ScopedOrderingManager(3) ScopedOrderingConfig(3) PdoTransactionRunner(2) PageResult(1) PageRequest(1) يستهلك PageResult عبر PackageListMapper.php:41 (نتيجة من php-i18n) Host
    • مستهلك خاص واحد على الأقل يطابق maatify/persistence في composer.json (بحث كود GitHub) — غير مفصَّل هنا لأن الـIssue عام [V]؛ باقي المستهلكين الخاصين غير محصورين [U].
    • نتائج حاسمة:
      1. ثلاثة مستهلكين عامّين يكشفون PageResult في واجهاتهم العامة ⇒ هجرتهم تغيّر API العام الخاص بهم (PB :793-804: يسمح بـthin adapter يحفظ العقد، أو إصدار Major مُبرَّر LP :641-649). لحسن الحظ هم Pre-Stable (rc) ⇒ لا وعد Stable يُكسر [I] — نافذة زمنية مناسبة قبل أول Stable لهم (مع مراعاة أن كلًا منهم سيمر بشرط Hostين).
      2. تكلفة الهجرة تتركز في PageResult→PageResultDTO وفي تغيير use الميكانيكي؛ أما Transaction/Ordering فسلوكيًا متوافقة (B-05/B-10).
      3. php-event-logging على ^8.2 ⇒ لا يستطيع طلب php-persistence ^8.4 دون رفع حد PHP لديه (تغيير عام لديه) [I].
      4. الاعتماد المتبادل: Host (admin-control-panel) يستهلك PageResult الصادر عن php-i18n ⇒ ترتيب الهجرة يجب أن يتبع اتجاه التبعية (مكتبة ← Host)، أو يستخدم Host adapter مؤقتًا.

    5.4.2 التعايش

    • الحزمتان تُثبّتان معًا بلا تعارض لأن الـnamespace مميز؛ لا replace ولا conflict ولا class_alias. المستهلك الذي يهاجر جزئيًا يبقى على القديمة في أجزاء وعلى الجديدة في أخرى.
    • نقطة تفاعل واحدة: اتصال PDO مشترك — لا حالة مشتركة بين الحزمتين غير حالة PDO نفسها (المعاملة النشطة)؛ ما سبق يُثبَّت بـCoexistence Harness.
    • معيار المعايير: PB §2/§11 تُلزم المستهلك بـmaatify/persistence (F-1) ⇒ قبل أول هجرة مستهلك يلزم قرار OD-03 + تعديل معياري مستقل (أو قبول المالك صراحة لحالة انتقالية موثقة).

    5.4.3 مراحل التبني (كل مرحلة = قرار/تفويض مستقل في مستودع المستهلك)

    المرحلة المحتوى شرط الدخول بوابة الخروج
    M0 لا شيء — الحزمة الجديدة غير منشورة — RC منشور
    M1 Pilot على أصغر سطح (php-slug: Pagination فقط) في branch/PR داخل مستودعه OD-03 محسوم + RC منشور + تفويض مالك للمستودع CI المستهلك أخضر + مقارنة JSON تفاضلية + Harness
    M2 مستهلك يملك Transactions/Savepoints (php-eligibility أو php-i18n) M1 نفس + اختبار deadlock حقيقي من جهة المستهلك إن وُجد
    M3 Host (admin-control-panel: Ordering + Transactions) M2 هو أحد Real Host Validations المشروطة لـStable
    M4 بقية المستهلكين (بما فيها الخاصة) M3 —

    5.4.4 جدول هجرة الإجراءات (للمستهلك)

    قبل بعد
    "maatify/persistence": "^1.x" "maatify/php-persistence": "^1.0" (بعد النشر) — وقد يبقى القديم أثناء الانتقال
    use Maatify\Persistence\Pdo\Ordering\ScopedOrderingConfig; use Maatify\PhpPersistence\Ordering\Config\ScopedOrderingConfig;
    …Pdo\Ordering\ScopedOrderingManager …PhpPersistence\Ordering\Repository\ScopedOrderingManager
    …Pdo\Pagination\{PageRequest,PdoPaginationQueryDescriptor} …PhpPersistence\Pagination\Criteria\{PageRequest,PdoPaginationQueryDescriptor}
    …Pdo\Pagination\PageResult …PhpPersistence\Pagination\DTO\PageResultDTO (type-hints وdocblocks @return PageResult<T>)
    …Pdo\Pagination\{PaginationConfig} / SortWhitelist / SortDirectionEnum / PdoPaginator …\Pagination\Config\PaginationConfig / …\ValueObject\SortWhitelist / …\Enum\SortDirectionEnum / …\Repository\PdoPaginator
    …Pdo\Transaction\{TransactionRunnerInterface,SavepointTransactionRunnerInterface,PdoTransactionRunner,PdoSavepointTransactionRunner} …PhpPersistence\Transaction\Service\<نفس الاسم>
    …Pdo\Transaction\PdoDeadlockRetry{,Savepoint}TransactionRunner (غير منشورة) PdoTransactionRunner / PdoSavepointTransactionRunner مع maxDeadlockRetries
    catch (PersistenceException $e) catch (PhpPersistenceExceptionInterface $e)
    Maatify\Persistence\Exception\X (X ≠ OrderingTransactionException) …PhpPersistence\{Ordering|Pagination|Transaction}\Exception\X
    OrderingTransactionException يُحذف أي استعمال

    ملاحظة آلية [P]: يمكن توليد خريطة FQCN 1:1 من جدول 3.1 وتنفيذها بأداة مراجعة (Rector/sed) ثم التحقق بـPHPStan max؛ لا يُنفَّذ ذلك في هذه الدراسة.

    5.4.5 التراجع (Rollback) والسياسة

    • مستهلك: إلغاء PR الهجرة وإعادة سطر require القديم؛ لا بيانات ولا مخطط يتغيران لأن أيًّا من الحزمتين لا تملك جداول (schema/README.md القديم) [V] ⇒ التراجع كودي فقط.
    • الحزمة الجديدة: قبل النشر لا شيء للتراجع عنه. بعد النشر: tag منشور لا يُحرَّك ولا يُستبدل (CI :115-117)؛ العلاج بإصدار جديد.
    • القديمة: لا تتغير؛ استمرارها على 1.x (بما فيه مرشح v1.5.0 المعلق في old #37) قرار منفصل OD-19. لا إشعار deprecate ولا abandoned ولا إعادة تسمية للمستودع القديم ضمن هذا العمل.
    • سياسة التوافق: لا وعد "drop-in". كل delta سلوكي معلن (B-03، B-04، B-10) في ملاحظات إصدار منسقة؛ وكل مستهلك يقرر توقيته.
  7. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    [6/6] Work Units وشروط القبول · Owner Decision Register · المخاطر · Verified/Unverified · حدود التوقف

    6.1 سلسلة Work Units المقترحة (متتابعة، صغيرة، قابلة للمراجعة)

    مبادئ التسلسل: كل WU = وحدة هندسية كاملة (Runtime + اختباراتها + توثيقها المتأثر، Phase Stack §4.1)؛ لا PR لتسجيل PASS فقط (:223-233)؛ لا mega-PR؛ كل GitHub Merge بإذن مالك صريح ومنفصل (AI Collab :547-569)؛ بعد كل Merge: Post-Merge Main Verification (DEC-041). لا تبدأ أي WU بغير تفويض كتابي مستقل (الاستخدام الحالي = دراسة فقط). Standards Freeze يسري من دمج WU-2 (Phase Stack :371-378).

    WU الهدف النوع/المنفِّذ التفويض المطلوب المخرجات شروط قبول الخروج (الدليل المطلوب قبل التالي) الرجوع/التحكم بالتوافق
    WU-0 قرار معماري Lead (مراجعة مستقلة) ← Owner قائم حكم Lead (Decision-ready/Needs-remediation) ثم اعتماد المالك لكل OD-n كتعليق في #1 كل OD المحجوب لـWU-1..3 محسوم؛ تعارضات F-1…F-9 لها قرار؛ تحديد المنفِّذ لكل WU (DEC-018) لا تغيير مستودع
    WU-1 Commit أول على main (المستودع فارغ ⇒ لا PR ممكن) Owner أو منفِّذ بإذن Owner الصريح لعملية Push واحدة استثناء مالك ضيق لمرة واحدة (OD-13) 3 ملفات فقط: LICENSE (OD-14) · .gitignore (vendor/, composer.lock, caches, IDE) · README.md تمهيدي (Status = Development، بلا شارات نشر/تثبيت، يحيل #1) Commit واحد · الشجرة = تلك الملفات فقط (تُسجَّل hash الشجرة) · لا workflows ولا كود ولا ادعاءات معيارية · main موجود وهو الافتراضي · لا branches أخرى · بعده يضبط المالك حماية main (PR مطلوب، منع force/delete) لا amend/force (AI Collab :602-608)؛ الخطأ يُصحَّح بـPR لاحق؛ المستودع بلا مستهلكين فإعادة إنشائه (فعل مالك) هو أقصى تراجع
    WU-2 Standards Adoption منفِّذ + Lead بداية Train؛ PR AGENTS.md · docs/php-engineering-standards/** (14 ملفًا + STANDARDS_MANIFEST.md) · docs/decisions/DECISIONS_INDEX.md Adoption Review Checklist كاملة (Adoption :550-584) · Overall Resolution Status = VALID مع تشخيص لكل Activation · مطابقة byte-for-byte لكل ملف مقابل git show <AdoptionCommit>:<path> · سكربت الإغلاق المحلي closed (مع توثيق S-6) · لا floating main · لا نسخ Standards غير منطبقة أو docs/decisions/ المركزية · قبول المالك لتجميد المرشحات (OD-11) · Lead Fresh Full Acceptance + Merge مالك + Post-Merge Verification Revert PR (لا شيء يعتمد عليه بعد)
    WU-3 ADRs + وثيقة المعمارية (توثيق فقط) منفِّذ + Lead PR ADR لكل Material Decision معتمدة (هوية، namespace، topology/placement، قائمة التسمية، خط الأساس السلوكي، دعم DB، بوابة Commit الأول (استثناء مالك مسجَّل)، pin/freeze، سياسة CI، سياسة التعايش، نية الإصدار) + docs/architecture/… يجمّد العقود B-01…B-16 + تحديث Index كل قرار مادي ⇒ ADR + Index قبل أي كود يعتمد عليه (Decision Governance :73-87) · لا ADR «تاريخية مختلقة» (:296-304): الدليل = تعليقات المالك في #1 · اللغة وفق OD-16 ADR قابلة للـsupersession (:235-257)
    WU-4 هيكل Composer وأدوات الجودة منفِّذ PR composer.json · .gitattributes · phpstan.neon · phpunit.xml (suites) · .php-cs-fixer.php · scripts/* · tests/bootstrap.php · marker interface + اختبار smoke composer validate --strict · dump-autoload --optimize --strict-psr · PHPStan max بلا baseline · php-cs-fixer dry-run (PER-CS 3.1) · git diff --check · لا composer.lock ولا version · الأوامر المحلية القياسية تعمل (Composer :861-931) مجرد ملفات؛ revert
    WU-5 CI + بنية Integration منفِّذ + Lead PR ثم Merge مالك .github/workflows/ci.yml · Compose واحد parameterized · أوامر composer test:integration / harness · اختبار Integration تمهيدي (اتصال/مخطط/residue/تكرار) PR CI كل الجوب خضراء (lint، Quality، Unit/Regression 8.4+latest، Lowest، Integration × MySQL 8.4 مرتين، Gate) · تكافؤ المحلي/CI مثبت (CI :26-32) · actions مثبتة بالـSHA · بعد الدمج: run على main أخضر (DEC-041) ثم يضبط المالك «CI Gate» كـrequired check revert (CI فقط)؛ الحماية الإلزامية تُفعَّل بعد النجاح لا قبله
    WU-6 قدرة Transaction منفِّذ + Lead PR T-07, T-08, T-20…T-26 + اختباراتها (Unit/Regression/Integration مع partner-process deadlock) كل صف B-10…B-13 مرتبط باختبار مسمّى في جدول تتبع بالـPR · PHPStan max · Unit/Regression/Integration خضراء على 8.4 وlatest · فحص الأدلة inTransaction() على pdo_mysql (R-1) · DocBlocks دلالية (PHP Source Doc) · Lead Fresh Full revert PR؛ لا مستهلكين
    WU-7 قدرة Pagination منفِّذ + Lead PR T-04…T-06, T-13…T-19 (+PageResultDTO) + اختباراتها صفوف B-08/B-09 مغطاة؛ شكل toArray()/jsonSerialize() مطابق لقيم golden من القديمة؛ نفس بوابات WU-6 نفسه
    WU-8 قدرة Ordering منفِّذ + Lead PR (تعتمد WU-6) T-02, T-03, T-10…T-12 + اختبارات (stale snapshot، lazy savepoint، rollback، soft-delete، nullable scope) صفوف B-01…B-07 مغطاة؛ مقارنة السلوك بالقديمة موثقة (deltas B-03/B-04/B-05 فقط) نفسه
    WU-9 الوثائق وفق Library Presentation منفِّذ + Lead PR PHP_PERSISTENCE_PACKAGE_REFERENCE.md (Source Topology، قوائم API، الاستثناءات، دعم DB، التصنيفات، workflow) · README.md (Development) · docs/guides/USAGE_GUIDE.md · examples/ · llms.txt · CHANGELOG.md · SECURITY.md · CONTRIBUTING.md · CODE_OF_CONDUCT.md · schema/README.md Checklist LP §23 (البنود غير المرتبطة بالنشر) · الأمثلة: syntax + static + smoke على Compose في CI · llms.txt §10.4 · لا روابط/أسماء من القديمة (LP §22) · الإنجليزية افتراضيًا (Doc Lifecycle :46-54) docs فقط
    WU-10 Consumer Verification Harness + Coexistence/Differential منفِّذ + Lead PR Harness مرتان من حالة نظيفة · Coexistence job · اختبار تفاضلي (5.2) Harness يمر مرتين بلا vendor/ سابق · Coexistence أخضر · داخل CI Gate —
    WU-11 جاهزية الإصدار 1.0.0-rc.1 منفِّذ + Lead PR أدوات Release Artifact Verification + PAV (محلية = CI) · تجهيز قسم [1.0.0-rc.1] غير مؤرخ · README/SECURITY لحالة «الهدف مُجهَّز وغير منشور» RAV على candidate SHA: PASS · Mandatory Pre-Release Strict Lead Acceptance = PASS (Coverage Matrix كاملة؛ DEC-023) —
    WU-12 إصدار RC Owner (أفعال) + Lead Release Authorization صريحة + تفويض Packagist (DEC-046) tag v1.0.0-rc.1 على SHA المؤهَّل · Release · تسجيل الحزمة نفس SHA في Full CI + RAV · PAV على تثبيت خارجي نظيف (وضع dist/source مثبت) · إتاحة التثبيت فعليًا (LP §14 تعريف Published) إصدار جديد فقط (CI :115-117)
    WU-13 تحقق مستقل من المستهلكين منفِّذون في مستودعات المستهلكين تفويض مالك لكل مستودع Harness على RC المنشور · Pilot M1→M3 (5.4.3) · Real Host Validation في ≥2 Host مستقلين مع أدلة أدلة تحدد RC والـHostين (LP :590) · لا إعادة عد لنفس Harness أو بيئتين لـHost واحد تراجع كودي في مستودع المستهلك
    WU-14 Stable 1.0.0 Lead + Owner Strict Acceptance جديدة (RC≠Stable) + Release Authorization إصدار Stable، SECURITY لخط مدعوم، badges Published AI Collab :1619-1625، :1639-1655؛ PAV إصدار جديد فقط
    Track S تعديل المعايير المركزية (F-1، S-2، S-3، S-6) Lead/Owner في php-engineering-standards قرار مالك + مساره الخاص اقتراح تعديل/توضيح لا يحجب بناء الحزمة؛ يحجب هجرة المستهلكين (OD-03) —
    لا WU المستودع القديم — — لا تغيير v1.4.0 وmain و#37 و#66 كما هي —

    التوازي: لا أقترح توازيًا قبل WU-5. WU-6/7 مستقلان فنيًا لكنهما يشتركان tests/Support وCI ⇒ تتابع (AI Collab :407-416 منع التداخل).

    6.2 Owner Decision Register

    ID القرار المطلوب البدائل نتيجة كل بديل التوصية يحجب
    OD-01 هوية الحزمة (أ) maatify/php-persistence / repo php-persistence النص يفرضها للحزمة الجديدة بلا انحراف (Composer :237-244)؛ القديمة تحتفظ بهويتها (:263) اعتماد (أ) — قرار شكلي —
    OD-02 Root namespace + marker N2 Maatify\PhpPersistence\ · N1 Maatify\Persistence\ · غيرهما N2: تعايش حقيقي، يخالف ممارسة 8 حزم php-* التي حذفت Php لكنه اشتقاق حرفي من الـslug. N1: يوافق الممارسة لكنه يصادم القديمة (F-2). غيرهما: لا أساس معياري N2 + طلب توضيح upstream لتعريف {PackageName} (S-2) WU-3, WU-4
    OD-03 تعارض المعايير المركزية (F-1/S-1) وتوقيت التعامل (أ) مسار تعديل معياري مستقل بعد أول Stable + حجب هجرة المستهلكين حتى يصدر · (ب) تعديل قبل RC · (ج) لا تعديل (قبول عدم امتثال دائم) (أ) متسق مع ترتيب #37؛ لا يعطل البناء. (ب) يُبطئ لكن يوضح مبكرًا. (ج) لا يوجد آلية استثناء مسموحة؛ يخلق مستهلكين غير ممتثلين (أ)، مع تفويض Lead لصياغة المقترح عند اكتمال WU-9 الهجرة (M1)، لا البناء
    OD-04 Topology + تفسير Responsibility (أ) حزمة واحدة Multi Capability؛ Repository/ للمنفّذات وService/ للـrunners · (ب) كلها Service/ مع تفسير PB :902-905 · (ج) ثلاث حزم (أ) أقرب لنص PB :231-269 ويحفظ فصل SQL؛ (ب) أبسط لكنه يخالف روح :902-905؛ (ج) كلفة ×3 بلا مكسب (أ) WU-3
    OD-05 مجموعة التسمية العامة (أ) مصفوفة C كما هي · (ب) (أ) + PageRequest→PageCriteria · (ج) (أ) + حذف بادئة Pdo من PdoPaginator/PdoPaginationQueryDescriptor (ب)/(ج) تحسينات تسمية لا يفرضها نص، وكلها تزيد كلفة الهجرة. المصفوفة تشمل: PageResultDTO، marker بـInterface، حذف OrderingTransactionException، الاستثناءات حسب القدرة (أ) WU-3
    OD-06 طريقة النقل/الأصل (provenance) (أ) نقل مُراجَع للكود والاختبارات مع تسجيل SHA المصدر في كل PR · (ب) إعادة كتابة من العقد دون نسخ (أ) أسرع وأقل خطرًا (نفس المالك، MIT)؛ (ب) أنقى لكنه يهدر الاختبارات المجرَّبة (أ)؛ مع منع نقل الوثائق حرفيًا (LP :850-865) WU-6+
    OD-07 خط الأساس السلوكي (أ) main غير المنشورة (B) · (ب) v1.4.0 (A) فقط · (ج) A + انتقاء من B (أ) يعتمد إصلاحات #33/#55 وgetNextPositionForUpdate وإعادة المحاولة؛ هذه الأخيرة لم تُنشر قط وتحمل خطر الاستقرار (#37 RELEASE NO-GO، #68 root cause غير متحقق). (ب) أضيق لكنه يبقي clamp قديمًا وفشل بلا savepoint. (ج) تعقيد تقييم (أ) مع اختبارات WU-6/8 كبوابة؛ وإعلان deltas (B-03/04/05) WU-3
    OD-08 جيل الـrunners وتسميته (أ) جيل 2 تحت الأسماء البسيطة PdoTransactionRunner/PdoSavepointTransactionRunner بـctor (PDO, int=0) · (ب) إبقاء الأسماء الطويلة PdoDeadlockRetry* + حذف القديمة · (ج) نقل الجيلين (أ) أقل كلفة هجرة وأوضح؛ فرق fail-closed محدود. (ب) اسم مضلل (افتراضي بلا إعادة). (ج) إرث مهمل في حزمة جديدة (أ) WU-3, WU-6
    OD-09 PHP ^8.4 (مفروض) + matrix: 8.4 وأحدث مستقر (+ أي minor وسيط) الدنيا والأحدث غير قابلتين للإعفاء (CI :237) اعتماد —
    OD-10 ادعاء قاعدة البيانات + امتداد (أ) MySQL 8.4 فقط؛ MariaDB غير مدعومة؛ ext-pdo + ext-pdo_mysql · (ب) (أ) لكن ext-pdo فقط · (ج) MySQL + MariaDB مع مصفوفة Compose واختبارات مخصصة · (د) إبقاء «MySQL/MariaDB-compatible» نصًّا (أ)(ب) صادق ومُتحقق. (ج) صحيح فقط بعد عمل إضافي (1020, savepoint guard)، يؤخر الإصدار. (د) ممنوع: توفر السائق/تشابه SQL ≠ دعم (PB :41-45) (أ) — وفتح (ج) كـWU لاحقة مستقلة إن رغب المالك WU-3, WU-4
    OD-11 pin المعايير P-A 5b69c03 (يجمّد المرشحات) · P-B 2ea426a (محافظ: Frozen Baselines لبعض المعايير، لكن بلا RAV/PAV وهوية Release Artifact ⇒ Upgrade قبل RC) · P-C تأجيل حتى تجميد upstream انظر [2/6] §2.4 P-A بشرط قبول التجميد وإعادة التحقق عند بداية WU-2 (وإلا P-C) WU-2
    OD-12 Operational Assets (skills/helpers) (أ) لا شيء (الافتراضي) · (ب) اعتماد المختار منها (أ) صحيح تمامًا (Adoption :105-111)؛ (ب) يتطلب جرد Kind/Path/SHA-256 (أ) WU-2
    OD-13 آلية Commit الأول + حماية main (أ) Commit أول مباشر من Owner/منفِّذ مفوَّض بمحتوى 3 ملفات ثم PR لكل ما عداه · (ب) إنشاء README عبر واجهة GitHub · (ج) استيراد تاريخ من القديمة (أ)(ب) متكافئتان معياريًا (استثناء ضيق لعدم إمكان PR)؛ (ج) يخلط الهوية والتاريخ ويقتضي مراجعة أكبر ولا حاجة له (أ) + تسجيل الاستثناء كـADR في WU-3 WU-1
    OD-14 الترخيص وكتلة المؤلف MIT (كالقديمة وphp-category) · غيره يطابق LICENSE وComposer وGitHub (Composer :389-403)؛ تغيير الترخيص قرار قانوني MIT (تأكيد) WU-1
    OD-15 بنية CI (أ) Compose واحد + matrix 8.4/latest × MySQL 8.4.x + Model A · (ب) service containers مع إثبات تكافؤ موثق (أ) يطابق CI :317-343؛ (ب) استثناء مشروط بعدم إمكان Compose فعليًا (أ) WU-5
    OD-16 لغة ADR/وثائق المعمارية الدائمة الإنجليزية (الافتراضي Doc Lifecycle :46-54) · العربية الافتراضي إنجليزي للوثائق التقنية الدائمة؛ العربي يحتاج Owner-approved requirement صريحًا الإنجليزية للمستودع؛ العربية تبقى للتواصل/تقارير Issue WU-3
    OD-17 سياسة التعايش والهجرة (أ) تعايش بلا replace/conflict/alias؛ هجرة مرحلية؛ تفويض مالك لكل مستودع؛ إصدار Major/adapter لكل مستهلك يكشف النوع · (ب) هجرة شاملة منسقة · (ج) إبقاء القديمة دائمًا (أ) يتيح الإيقاع المناسب، ويستفيد من أن 3 مستهلكين عامّين Pre-Stable. (ب) تنسيق ثقيل. (ج) يلغي مبرر الحزمة الجديدة (أ) M1+
    OD-18 نية الإصدار الأول و«Hostين» (أ) 1.0.0-rc.1 → Harness على المنشور → Hostان مستقلان → 1.0.0 · (ب) 0.x · (ج) Stable مباشر (أ) المسار المعياري الوحيد لحزمة لم تنشر Stable (LP :572-594). (ب)(ج) يخالفان أو يلتفان على الشرط (أ)؛ وتحديد الHostين (مرشح: admin-control-panel + Host خاص) WU-12/13
    OD-19 مصير المستودع القديم (أ) لا تغيير ضمن هذا العمل؛ v1.x وقرار v1.5.0/#37/#66 مسارات منفصلة · (ب) إعلان deprecate/migration بعد Stable · (ج) تجميد (أ) يلتزم نص الـIssue (لا تعديل/تسمية/Tag)؛ (ب)(ج) قرارات لاحقة بعد الإصدار (أ) —
    OD-20 تصنيفات الحزمة التي أستنتجها [I] (أ) Operational Read/Reporting = Out of Scope؛ Translation/Media/Decimal/Clock/Admin-Customer = غير منطبقة؛ بلا Factory/Facade؛ schema/README.md بلا جداول مملوكة (أ) يتسق مع طبيعة الحزمة الأداتية (PB :917-955) ويتجنب اختراع واجهات (أ) — تأكيد المالك/Lead WU-9

    6.3 سجل المخاطر

    ID الخطر الأثر التخفيف / البوابة
    R-1 سلوك PDO::inTransaction() على pdo_mysql في PHP 8.4/8.5 يعتمد عليه منطق الـdeadlock replay؛ القديمة لم تُجرِ Integration على 8.4 [U] replay خاطئ أو فاشل WU-6: Integration حقيقي على 8.4 وlatest قبل القبول
    R-2 حد maatify/exceptions ^1.0 الأدنى على PHP 8.4 غير مُثبت [U] فشل lowest وظيفة Lowest في WU-5
    R-3 اختبارات partner-process للـdeadlock هشة تاريخيًا (old #68/#76: السبب الأصلي لـ2 vs 4 غير متحقق) CI متقطع الإبقاء على التحصين المنقول + فحص تكرار + RED/GREEN إن ثبت عيب
    R-4 هجرة PageResult→PageResultDTO تمسّ API عامًا لثلاثة مستهلكين عامّين SemVer/كسر نافذة Pre-Stable؛ adapter أو Major (PB :793-804)؛ M1→M4
    R-5 F-1: المعايير تُلزم المستهلكين بالقديمة عدم امتثال أثناء الهجرة OD-03 + Track S + حجب M1
    R-6 انجراف المعايير أثناء التنفيذ عدم تطابق pin Standards Freeze (:371-378) + إعادة تحقق عند WU-2
    R-7 تجميد المرشحات بالـAdoption الأول تثبيت صياغات قد تتغير OD-11؛ تحقق/اتفاق مع upstream قبل WU-2
    R-8 ازدواج الصيانة (إصلاح عيب في القديمة لا يُنقل) انجراف OD-19 + قائمة تتبع Issues بين المستودعين (DEC-045)
    R-9 مستهلكون خاصون غير محصورين هجرة ناقصة حصر داخلي من Lead/المالك قبل M4 [U]
    R-10 ادعاء دعم MariaDB بالتشابه وعد غير مُتحقق OD-10(أ)؛ لا keyword mariadb
    R-11 شرط Hostين مستقلين لحزمة بنية تحتية قد يتعذر تأخير Stable تحديد الHostين مبكرًا (OD-18)
    R-12 لا Integration على 8.4 يعني أن ثقة «UNCHANGED» لا تمتد دعوى غير مدعومة بوابات WU-6/8 + الاختبار التفاضلي

    6.4 الحقائق: مُتحقق منها مقابل غير مُتحقق منها

    [V] مُتحقق (قابل للإعادة): حالة المستودع الجديد (فارغ، 0 branches، Issue #1) · SHAs/Trees للقديمة وv1.4.0 · نجاح CI #39985574051 وقائمة jobs · 21→26 ملفًا وقائمة الفروق · التوقيعات ومواضعها · محتوى المعايير عند 5b69c03 وإصداراتها عبر 4 commits · غياب tags في المستودع المركزي · غياب أي عقد bootstrap لمستودع فارغ · إغلاق المراجع المحلية للمجموعة (باستثناء رابط Profile) · أسماء 8 حزم php-* ونمط namespace · استخدام 5 مستودعات عامة لأنواع القديمة وتعرّض 3 منها لـPageResult · حالة Pre-Stable للثلاثة · Packagist (v1.4.0 الأحدث؛ php-persistence غير مسجل) · غياب Compose في شجرة القديمة وCI على 8.2/8.5 للتكامل.

    [I] استنتاج المنفذ: تجميد Profiles 4.0.0/3.0.0 · انطباق AI Collab/Phase Stack على المستودع · تفسير الـResponsibility (Repository/Service) · عدم ارتباط §7.1 بروابط Profile · تصنيف Operational Read Out of Scope · نافذة Pre-Stable للمستهلكين · أن ترتيب الهجرة يتبع اتجاه التبعية · أن CI Gate لا يظهر كخيار حماية قبل أول run.

    [U] غير مُتحقق منه — يجب إثباته أو حسمه: حالة تجميد PB/Testing/Doc-Lifecycle · معرّف ruleset المطابق لـPER-CS 3.1 · سلوك maatify/exceptions ^1.0 الأدنى على 8.4 · Integration على PHP 8.4 · أحدث PHP مستقر وقت التنفيذ · الHostان المستقلان · المستهلكون الخاصون (عددهم ومحتواهم) · وجود catch (PersistenceException) في المستهلكين · سجلات DEC غير المقروءة كاملة · جدوى مطابقة Profile blobs مع manifest مستهلك لإثبات التجميد · عدد الاختبارات الفعلي بالتشغيل (لم أشغّل أي suite؛ هذه دراسة قراءة فقط).

    6.5 التزامات هذا التسليم وحدوده

    • لم أنفّذ: أي commit/branch/PR/tag/release، أي نقل ملفات، أي تعديل في المستودعين، أي تسجيل Packagist، أي تشغيل لاختبارات المستودع القديم.
    • المخرجات هنا = دراسة وقرارات قابلة للمراجعة فقط. كل ما ورد بصيغة [P] تصميم مقترح لا يُنفَّذ قبل: حكم Lead المستقل ← اعتماد المالك لـOD-n ← تفويض تنفيذ منفصل لكل WU.
    • لا أُصدر حكم decision-ready؛ ذلك لـLead بعد مراجعته المستقلة.

    ⏸ توقفت هنا بانتظار Independent Architecture Review الكاملة.

  8. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    Technical Lead — Independent Architecture Review #1 (all six report comments): NEEDS REMEDIATION / OWNER DECISION NO-GO

    Independent scope and evidence

    Read the complete six-part Issue #1 study (1/6, 2/6, 3/6, 4/6, 5/6, 6/6). Independently checked old published tag fc1459b49fe5af5ead17814eeb3ada7a3fa81791 and Tree b477b06d23fc2101581513ca97c0948259079b67; old source main@1f6a7aafe601090b7e55f60d83794364afdefe67, Tree c1e25e7653a3173c3339a269b1ad23b26f335b9d; old composer.json, representative public API/exception/runner source, and the current canonical standards text. New repo remains empty, 0 branches, Issue #1 OPEN, no implementation PR/commit. No tests were executed independently as this is a source/architecture review, not runtime acceptance.

    At review time central main advanced from study's 5b69c03419ad09369ad207a9a7976cc9cc0617d3 to 1d75e56e8a40b33a707110f288842f9b94d036bb; independent commit comparison: one file only, standards/modules/MODULE_SLIM_BUILDING_STANDARD.md, outside this standalone library's proposed applicable set. Therefore study's 5b69c03419ad09369ad207a9a7976cc9cc0617d3 remains a valid immutable study snapshot, not a silently approved adoption pin. Verify final snapshot/frozen baselines at WU-2.

    Accepted as solid study input, not yet authorized design

    • Distinguishes genuinely Published old v1.4.0, Old main Unreleased, and Proposed new instead of promoting main behavior as a published contract.
    • Proposed distinct namespace Maatify\\PhpPersistence\\ gives true Composer/PSR-4 coexistence if ratified; maatify/php-persistence identity and php:^8.4 align with new-package standards; no replace/alias assumed.
    • Three-capability proposal (Ordering/Pagination/Transaction), PageResultDTO rather than copying legacy PageResult, genuine MySQL 8.4 verification plan, conservative MariaDB support claims, and explicit consumer-migration risks are reasonable architectural proposals.
    • Profile Stage 1 (composer-package + repository-governance) yields 12 unique candidate standards, including conditional External Provider. Stage 2 proposed 11 applicable standards is plausible on the proven PDO/MySQL artifact facts. The single Profile-to-excluded-standard link is not automatically proven a closure defect: §7.1's normative local-link constraint expressly concerns applicable Standards, not ordinary structural references retained in a Profile; require validator evidence rather than inventing an Exception.
    • A large amount of API, DB and consumer evidence is honestly marked UNVERIFIED rather than fabricated. The study is useful and should be amended in place via a bounded addendum, not discarded or rewritten from scratch.

    AR-01 — BLOCKER: mandatory Host-validation path contradicts proposed standards-update timing

    Sources: study 6/6 OD-03 recommends changing central standards after first Stable while blocking consumer migration until then. The same study's WU-13 and 5/6 §§5.3–5.4 require published RC adoption/pilot M1→M3 and two independent real Hosts before Stable. The canonical Package Building §2 / §11 and §11 lines 699–818 explicitly assign reusable ordering/pagination to maatify/persistence and prescribe old FQCN/dependency in consumer packages. A consumer/Host cannot be called standards-compliant with the new package merely by recording an Issue-level Owner preference or an unsupported exception.

    Required: correct the dependency graph and OD-03: the central ownership/integration policy must be reconciled under its own authorized independent PR before any standards-governed consumer/Host RC pilot whose adoption conflicts with the published rule. Account explicitly for the controlled RC-stage validation needed before Stable, rather than deferring the fix until after Stable. An upstream change must correctly distinguish legacy published consumers, successor development/RC verification, and stable successor distribution; do not make unreleased APIs consumable by fiction. Treat conflict in implementing duplicate shared capability as an unresolved architectural ownership boundary too, not just a future consumer-doc polish. No central edits in this study; propose a distinct Owner-controlled Track S gating WU-13 (possibly earlier), with clear standard version/adoption implications. Do not reuse old #37's release-then-standard-facts rule automatically for a different package identity and consumer migration.

    AR-02 — BLOCKER: initial-commit 'exception' is asserted without proving normative violation; durable decision is scheduled too late

    Sources: study 2/6 S-3 and 6/6 WU-1, WU-3, OD-13. But canonical Phase Stack §1.1 and ACTIVE DEC-017 make the Branch→PR obligation about published non-default governed work branches. DEC-017 explicitly states it does not require a PR for the default branch itself. The inability to open a PR before the very first commit does not by itself prove an exception to that narrow rule. However AI Collaboration §6.3–6.4 still requires operation-specific authority and a reviewed integration result. Decision Governance §3 requires any approved material decision to be stored in durable repository Decision Record + index before or atomically with implementation, not held only in a GitHub issue until a later WU-3.

    Required: replace the unproven 'mandatory waiver from DEC-017' with an explicit, bounded first-default-branch-bootstrap procedure that identifies exactly which Git operations are Owner-authorized, proves the reviewed initial Tree/contents and no runtime changes, and says precisely whether a real deviation from any other governing rule exists (cite it if so). If first-bootstrap is indeed a material cross-WU policy/architecture decision, include its ADR/Decision Index in that first commit (or find an equally compliant before/atomic boundary); do not postpone a material record to WU-3. Update WU-1 contents and WU-3 accordingly. Do not add an artificial PR where there is no base.

    AR-03 — VERIFICATION HOLD: active decision-record preflight incomplete for the authority being recommended

    The executor's own 2/6 Reading Ledger explicitly leaves relevant ACTIVE decision records only partially read or unread, including DEC-023 (strict RC/Stable acceptance), DEC-030 (exact target release artifact and live publication truth), DEC-031/032 (operational/adoption pin rules) and authorization/post-merge decisions. The Issue #1 mandate expressly required checking applicable ACTIVE records, not only Index rows. Lead has independently checked canonical §3 for material decisions and reviewed complete DEC-023/030 plus other representative records; the study's own recommended Release/Pin/Bootstrap plan still needs its own explicit completed applicable decision evidence.

    Required: finish a targeted preflight of the records actually relevant to the design (DEC-009,013,017,018,023,030,031,032,033,041,046 as applicable, plus related active records justified by concerns). Update decision applicability/evidence matrix; clearly mark irrelevant ones N/A by scope. Inspect central Versioning Governance as an external authoritative verification source if needed for claims about Frozen/Mutable status: 'not in the local Pinned Set' means not copied, not that its content can never inform a claim about central version baselines. For unresolved frozen-status evidence maintain the mandated OWNER DECISION REQUIRED — VERSION BASELINE STATUS, and never create STANDARDS_MANIFEST.md claiming VALID prematurely.

    AR-04 — DESIGN COMPLETENESS: tighten exception-marker and decision ownership boundaries

    • Canonical Package Building §7.443–455 requires every new package-defined exception to implement the new PhpPersistenceExceptionInterface directly/indirectly. The proposed T-01/T-02…T-08 mapping establishes a marker/name and shared hierarchy but does not clearly map/verify marker conformance for every new exception. Add it explicitly to the contract matrix and regression acceptance; external propagated PDOException must not implement it.
    • The 20-item Owner Decision Register mixes real material architectural tradeoffs with standard-mandated facts and lower-level implementation choices (e.g. PHP ^8.4, absence of Operational Assets, formatter rules). Reclassify into a compact Owner material decisions set, standard-determined defaults, and Executor design details. Do not ask the Owner to make a redundant personal decision on each standard requirement. Keep the technical evidence and alternatives; only reduce unnecessary approvals.
    • Ensure OD-04 Repository-vs-Service placement is treated as a real design interpretation against PB §5 (SQL only at persistence/query boundary); make OperationSavepoint helper ownership and tests explicit before final API freeze. Do not silently preserve a public FQCN under a superficial 'KEEP' label.

    Disposition / next exact action

    Issue #1 stays OPEN; study = NEEDS REMEDIATION, NOT OWNER-DECISION-READY. Preserve original six comments and their history; publish one ordered amendment/addendum linking each AR-01…04, replacing only affected OD/WU/decision-readiness assertions, with a fixed dependency timeline and focused decision evidence. The rest of the 3-way inventory can remain intact unless your re-verification finds a material delta. Supply a revised concise Owner Decision Register and state which decisions block WU-1 versus later WUs.

    Strict READ-ONLY boundary continues: No new repo branch/commit/PR, no code port, no mutation of old repo or central standards, no automatic tag/release/Packagist. Lead will independently review the corrected addendum before presenting any specific material decisions to Owner. This review is a report, not authorization for implementation or waiver.

  9. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    🛠️ Addendum 1/2 — معالجة AR-01 … AR-04 (READ-ONLY) · Re-Review Package

    يعدّل هذا الـAddendum تأكيدات محددة فقط في التقرير الأصلي (1/6 · 2/6 · 3/6 · 4/6 · 5/6 · 6/6) استجابةً لـمراجعة Lead. التعليقات الأصلية باقية دون تعديل؛ أي تأكيد يتعارض معها يُستبدل بما هنا (جدول Errata §6 في Addendum 2/2). الجرد الثلاثي (3/6) سليم عدا ما يُذكر.
    READ-ONLY مستمر: لا commit/branch/PR، لا تعديل لأي مستودع أو معيار مركزي، ولم أُنشئ أي Issue (انظر DEC-045 في §3.3).

    ملاحظة Lead المعالجة الموضع
    AR-01 BLOCKER توقيت المعيار مقابل Host Validation OD-03 مسحوب؛ Track S يسبق أي consumer/Host RC pilot؛ Dependency Timeline ثابت §1 + جدول §2
    AR-02 BLOCKER الـFirst Commit سحب «الاستثناء الإلزامي من DEC-017»؛ إجراء Bootstrap محدود بعمليات Git مسماة؛ ADR/Index داخل الـcommit الأول؛ إعادة توقيت القرارات المادية §2
    AR-03 VERIFICATION HOLD Preflight مستهدف للقرارات ACTIVE + دليل تجميد قاطع بمطابقة blobs + UNRESOLVED الصحيح §3
    AR-04 اكتمال التصميم مصفوفة Marker conformance + تصنيف القرارات 20→(9 / 12 / تفاصيل) + OD-04 وOperationSavepoint + إلغاء وسم «KEEP» Addendum 2/2

    حالة المعايير المركزية عند الإعداد: main تقدمت إلى 1d75e56e8a40b33a707110f288842f9b94d036bb؛ تحققتُ [V] (git diff --stat 5b69c03 origin/main) أن الفرق ملف واحد standards/modules/MODULE_SLIM_BUILDING_STANDARD.md خارج المجموعة المنطبقة ⇒ 5b69c03 يبقى لقطة دراسة غير معتمدة كـpin، كما حكم Lead.


    1. AR-01 — تصحيح التعارض بين توقيت تعديل المعيار وشرط Host Validation

    1.1 الاعتراف وسحب التوصية

    التوصية السابقة (OD-03 أ: تعديل معياري بعد أول Stable مع حجب هجرة المستهلكين) مسحوبة. سبب التناقض [V]:

    • LP §14.1 (standards/packages/LIBRARY_PRESENTATION_STANDARD.md:572-594) يوجب قبل أول Stable: RC منشور ← Harness على ذلك RC ← Real Host Validation في ≥2 Host مستقلين على RC نفسه.
    • PB §2 (PACKAGE_BUILDING_STANDARD.md:73-78) وَ§11 (:699-818) تُلزم المستهلك بـmaatify/persistence وتمنع «نسخ محلية»، وتشترط «minimum stable dependency version» (:78) وتحظر استهلاك contracts غير منشورة كأنها API.
      ⇒ لا يمكن أن يكون أي Host/Consumer ملتزمًا بمعاييره المثبتة إذا اعتمد RC الخلف قبل أن تُوفّق المعايير. ولا ترث هذه الخطة قاعدة old #37 «أصدر ثم حدّث المعايير» لأنها سُنّت لإصدار نفس الهوية (maatify/persistence) لا لهوية وهجرة مختلفتين.

    1.2 النموذج المصحَّح (يُقترح تعديلًا مركزيًا مستقلًا Track S — لا يُنفَّذ هنا)

    يجب أن يميّز تعديل PB §2/§11/§16 بين أربع حالات للمالك المشترك لقدرة ordering/pagination/transaction:

    الحالة ما يسمح به النص المعدَّل (مقترح) سبب
    L — Legacy published مستهلكون مثبتون على المعايير الحالية يبقون على maatify/persistence ^1.x بلا تغيير لا كسر للمنشور
    D — Successor in development maatify/php-persistence غير قابلة للاستهلاك؛ ممنوع نسخ APIs غير منشورة (PB:78 يبقى) لا «fiction» لـAPIs غير منشورة
    R — Successor RC published يُسمح باستهلاكه للتحقق فقط (Harness + Real Host Validation) ضمن شروط يحددها النص نفسه، لا كاستثناء مُسجَّل ولا كعقد إنتاج يحل شرط LP §14.1 دون وعد Stable
    S — Successor Stable المالك المشترك الكنسي الواحد للأعمال الجديدة؛ هجرة المستهلكين الموجودين وفق سياسة المالك يعالج ازدواج القدرة (PB :76) بملكية واحدة لا اثنتين

    حدود الملكية (يُعالج «الازدواج كحد ملكية غير محسوم»): النموذج المقترح = Successor: بعد S تصبح php-persistence المالك الكنسي للأعمال الجديدة، وmaatify/persistence في صيانة قديمة بقرار مالك منفصل. بدائل رُفضت: ملكيتان متوازيتان (يخالف «مصدر حقيقة واحد» PB :814-818 و:76)، أو ترك التعارض بلا معالجة (لا آلية استثناء متاحة: Decision Governance :269-275). القرار للمالك (M-1).

    آثار الإصدار/التبنّي [I] (تحسمها Version Finalization المركزية لا هذا التقرير): PB 4.0.0 Mutable Candidate (لا لقطة مستهلك مطابقة، §3.2) ⇒ التعديل غالبًا يُمتص في Candidate قائمة بلا bump متسلسل (Versioning Policy §3.4)؛ لكن أي مستهلك/Host يريد الاستفادة يحتاج Upgrade لـAdoption إلى commit يحتويه.

    1.3 قيود مضافة على مرحلة RC (تصحيح لخطة M1→M3 السابقة)

    • المستهلكون المكتبات يلتزمون بـ«stable dependency version» (PB :78) وbـminimum-stability: stable (Composer :1109-1117) ⇒ لا هجرة مكتبة قبل 1.0.0 Stable؛ تسقط فكرة «Pilot على RC» لمكتبة ما لم يغطّه نص Track S صراحةً. هذه المكتبات لا تُحسب شرطًا لأول Stable.
    • شرط الـHostين يتحقق بـHosts (تطبيقات) تستهلك RC؛ ولا يعفيهما من معاييرهم المثبتة [U] (لم أقرأ معايير Host المثبتة): لذلك يلزم قبل أي Real Host Validation: (1) Track S مدموج، (2) Upgrade Adoption للـHost إلى commit يحتويه، (3) تفويض مالك لمستودع الـHost.

    2. Dependency Timeline المثبَّت (يستبدل أي ترتيب سابق)

    G0  Lead re-review → Owner ratifies M-1…M-9 (+ acknowledges Defaults D-1…D-12)       [لا تغيير مستودع]
    │
    ├── Track S  (php-engineering-standards · تفويض مالك مستقل · PR مركزي منفصل)
    │     S1 Owner authorization (نطاق: PB §2/§11/§16 state-model L/D/R/S + توضيح {PackageName})
    │     S2 PR مركزي + Lead Fresh Acceptance + Owner Merge + Post-Merge Verification (DEC-041) ⇒ commit C_S
    │     S3 [اختياري، توثيقي] توضيح فجوة «المستودع الفارغ» (لا يحجب شيئًا)
    │
    ├── WU-1  First commit (يحتاج M-6 + M-7 فقط)  ── مستقل عن Track S
    │
    ├── WU-2  Standards Adoption   ◄── يحتاج M-5 ؛ ويُفضَّل: pin ≥ C_S  (وإلا Upgrade لاحق قبل RC)
    │                                   ملاحظة: Standards Freeze يبدأ هنا (Phase Stack §7) ⇒ لذلك يسبق Track S
    ├── WU-3  ADRs المتبقية (قبل أي اعتماد عليها)  ◄── يحتاج M-1…M-4, M-8, M-9
    ├── WU-4 … WU-11  بناء الهيكل/CI/القدرات/الوثائق/Harness/جاهزية RC (Strict Lead Acceptance)
    ├── WU-12 نشر RC (Owner Release Authorization + Packagist)
    │
    ├── WU-13a Harness على RC المنشور
    ├── WU-13b Real Host Validation × ≥2 Host   ◄── يشترط: C_S مدموج + Upgrade Adoption للـHost + تفويض مالك للمستودع
    ├── WU-14 Stable 1.0.0 (Strict Acceptance جديدة؛ RC≠Stable)
    └── M-wave  هجرة المستهلكين-المكتبات (بعد Stable فقط) وفق M-9
    
    الاعتماد لماذا
    WU-13b ← Track S مدموج بدونه لا Host ملتزم بمعايير تسمح بـR (AR-01)
    WU-2 ← Track S (تفضيل) يتجنب Upgrade فور البداية ويتجنب «Refresh أثناء Train» (Phase Stack :371-378)
    M-wave ← WU-14 PB :78 + Composer stability
    Track S لا يحجب WU-1/WU-3…WU-12 تغيير معياري لا يمس ما تبنيه الحزمة خارج PB-text، لكن تأخره يؤخر WU-2 إن اختير التفضيل

    3. AR-02 / AR-03 — انظر الأقسام التالية

    3.1 (AR-02) إجراء الـFirst-Default-Branch Bootstrap — بديلًا عن «الاستثناء الإلزامي»

    إقرار: سحبتُ ادعاء أن Commit الأول يحتاج waiver من DEC-017. الفحص [V]:

    القاعدة هل تُنتهك؟ الدليل
    DEC-017 / Phase Stack §1.1 (:33-61): PR لكل non-default governed work branch منشورة لا — إنشاء الفرع الافتراضي الأول ليس branch عمل غير افتراضي نص DEC-017 §1 و«Explicit Non-Decisions»: «require a PR for the default branch itself» ليس مطلوبًا
    Phase Stack §8.4(1): لا عمل ناقص/غير مراجع إلى main لا، إذا روجعت الـpatch المرحلية قبل Commit AI Collab §6.2/§6.6 (:513-644)
    §8.4(3) كل GitHub Merge بإذن مالك لا — لا Merge يحدث —
    §8.3 بوابات الدمج الميكانيكية (base/merge-base) غير منطبقة (لا PR ولا base) —
    AI Collab §6.3–6.4 صلاحيات مستقلة ومصرح بها لكل عملية تُستوفى بتفويض مالك مسمّى لكل عملية أدناه :529-583
    §6.5 لا amend/force تُستوفى (commit واحد؛ لا force) :602-608
    Decision Governance §3 (:73-87): السجل الدائم قبل/مع التنفيذ تُستوفى بإدراج ADR+Index داخل الـcommit الأول أدناه
    DEC-041 (Post-Merge Main Verification) غير منطبقة حرفيًا (لا Merge)؛ يُطبَّق مثيلها للتحقق من أن شجرة main البعيدة = الشجرة المراجَعة ممارسة، لا ادعاء امتثال
    DEC-046 (حالة production/مشتركة) Push الجذر ليس من فئة تشغيلية (data/migration/job/config)؛ ضبط حماية الفرع وتسجيل Packagist عمليتان مشتركتان تُترك للمالك [I] — انظر UNRESOLVED-2 §3.3

    ⇒ لا يوجد انتهاك مثبت لقاعدة معيارية؛ الموجود فجوة توثيق في المعايير (S-3)، لذلك يُعامل الإجراء كـمجموعة عمليات مفوَّضة صراحة ومحددة وليس «استثناءً/waiver».

    الإجراء المقترح (يُنفَّذ فقط بتفويض منفصل):

    # العملية من تفويض Git (AI Collab §6.3)
    1 git init/استنساخ المستودع الفارغ في مجلد عمل محلي وإنشاء الفرع المحلي main المنفِّذ المسمّى (DEC-018) Branch: YES (مسماة)
    2 كتابة 6 ملفات فقط (أدناه) وReview Staging بمسارات صريحة المنفِّذ Staging: YES
    3 git diff --cached --check/--name-status/--stat + تسجيل git write-tree (Tree المرشح) المنفِّذ —
    4 Direct Lead Review للـpatch المرحلية والـTree؛ DEC-033: الأدلة صالحة للمحتوى النهائي Lead —
    5 git commit واحد (بلا amend) المنفِّذ بإذن Owner الصريح المرتبط بقيمة Tree Commit: YES
    6 git push origin main (إنشاء main البعيدة، بلا force) المنفِّذ بإذن Owner Push: YES · PR: N/A · Tag: NO · Merge: N/A
    7 تحقق بعدي: git ls-remote ⇒ main = الـcommit؛ Tree البعيد = Tree المراجَع؛ ref وحيد Lead (مماثل DEC-041)
    8 ضبط حماية main (PR مطلوب، منع force/delete) Owner (إعدادات GitHub) خارج صلاحيات المنفِّذ

    محتوى الـcommit الأول (6 ملفات، بلا كود ولا workflows ولا ادعاءات معيارية):
    LICENSE · .gitignore · README.md (Status = Development، يحيل #1، بلا شارات نشر/تثبيت — LP :195-205) · docs/decisions/DECISIONS_INDEX.md · docs/decisions/DEC-001-…md (Bootstrap: العمليات المفوَّضة + المحتوى + الدليل = تعليق تفويض المالك) · docs/decisions/DEC-002-…md (الترخيص).

    • AGENTS.md ليست في الـcommit الأول (تُشير إلى STANDARDS_MANIFEST.md غير الموجود قبل WU-2).
    • لا يُدرج docs/decisions المركزي؛ ID محلي DEC-NNN (Adoption §9.1 :451 يفصل المركزي عن المحلي).
    • اللغة: الإنجليزية (D-5).

    ملاحظة تراجع محدثة (تصحيح WU-1 السابق): «إعادة إنشاء المستودع» غير مقبولة كتراجع عادي لأنها تحذف Issue #1 وتاريخ هذه المراجعة؛ التصحيح = commit تصحيحي عبر PR بعد حماية main. وقبل حماية main يبقى أي تصحيح بلا force/amend (AI Collab :602-608).

    3.2 إعادة توقيت القرارات المادية (Decision Governance §3)

    القرار المادي أول WU يعتمد عليه حد تسجيل ADR+Index
    إجراء Bootstrap + عمليات Git المفوضة (M-7) WU-1 داخل الـcommit الأول (DEC-001)
    الترخيص (M-6) WU-1 (LICENSE) داخل الـcommit الأول (DEC-002)
    Pin المعايير وقبول التجميد (M-5) WU-2 (Manifest) ذريًا داخل PR الـAdoption
    نموذج الملكية/Track S وسياسة الهجرة (M-1، M-9) WU-3/WU-9 (ادعاءات Package Reference/README) WU-3
    Namespace/Marker (M-2)، دعم DB (M-4)، خط الأساس والـrunners (M-3)، topology/placement/naming (قرارات Lead) WU-4 (أول composer.json/src/) WU-3 — سابقة لـWU-4
    مسار الإصدار وتحديد الHostين (M-8) WU-11 WU-3
    قاعدة بوابة: لا تبدأ WU إن كان في «reliance set» قرار بلا ADR+Index. هذا يلغي ما كتبتُه سابقًا من أن بوابة commit الأول بلا سجل دائم حتى WU-3.

    3.3 (AR-03) Preflight القرارات ACTIVE + دليل التجميد

    أ) أدلة التجميد (Frozen vs Mutable) — طريقة قاطعة قابلة للإعادة. Versioning Policy §3.3 (STANDARD_VERSIONING_POLICY_AR.md:158-170) : الـFreeze يحدث فقط بـCompleted VALID Adoption/Upgrade يثبت الـartifact snapshot. قارنتُ blob كل ملف عند 1d75e56 (يساوي 5b69c03 للمجموعة) بنفسه عند commits Adoption الموثقة لمستهلكين عامّين (ebcf55b php-product وphp-rate-limiter · 73abc86 php-return-target · 5f872d3 php-i18n · 7dd9d1d php-slug/eligibility · 2ea426a) عبر git rev-parse <commit>:<path>:

    الملف الإصدار blob (قصير) يطابق لقطة مستهلك VALID الحكم
    DECISION_GOVERNANCE 1.0.0 2c21ee8 ebcf55b 73abc86 5f872d3 7dd9d1d 2ea426a Frozen [V]
    PHP_SOURCE_DOCUMENTATION 1.0.0 92864c0 نفسها Frozen [V]
    PHP_CODING_STYLE 1.0.1 a4cfae0 نفسها Frozen [V]
    REPOSITORY_GOVERNANCE_PROFILE 3.0.0 ef7e133 نفسها Frozen [V]
    COMPOSER_PACKAGE_PROFILE 4.0.0 9c7bf19 ebcf55b 2ea426a Frozen [V] (manifest php-product: Overall VALID)
    STANDARDS_ADOPTION 5.0.1 071b764 لا شيء Mutable Candidate (لا لقطة)
    PACKAGE_BUILDING 4.0.0 df57ba1 لا شيء Mutable Candidate
    COMPOSER_PACKAGE 5.0.0 1cbcbfa لا شيء Mutable Candidate
    CI_WORKFLOW 5.0.0 24ca8e4 لا شيء Mutable Candidate
    LIBRARY_PRESENTATION 5.0.1 cc936b9 لا شيء Mutable Candidate
    TESTING 3.0.0 6d74329 لا شيء Mutable Candidate
    DOCUMENTATION_LIFECYCLE 3.1.0 3c508e1 لا شيء Mutable Candidate
    AI_COLLABORATION 13.0.0 589b446 لا شيء Mutable Candidate
    GITHUB_PHASE_STACK 5.0.0 c1bbc75 لا شيء Mutable Candidate
    • حدود الدليل: المسح غطى مستهلكين عامّين فقط (manifests عامة مقروءة وسلسلة commits موثقة). المستهلكون الخاصون غير مفحوصين ⇒ لا يمكن نفي أن مستهلكًا خاصًا جمّد إصدارًا بمحتوى مختلف تحت نفس رقم الإصدار (وهو known frozen-version/content mismatch ⇒ INVALID لو ثبت، Adoption :654-656).
    • الحالة الصحيحة: للتسعة «Mutable» أعلاه: OWNER DECISION REQUIRED — VERSION BASELINE STATUS (Adoption :234-240، Versioning §3.3) إلى أن يُثبت Lead بمسح المستهلكين الخاصين أو يقرّ المالك. لا يُنشأ STANDARDS_MANIFEST.md بحالة VALID قبل زوالها (يعالجه WU-2 كشرط دخول).
    • اتساق مع Lead: الرابط في Profile لا يُعتبر عيب إغلاق مثبتًا؛ المطلوب دليل validator عند WU-2: تشغيل المساعد المركزي read-only .agents/helpers/maatify-governance-context.php على المرشح (مع بقائه Operational Asset غير مُتبنّى).

    ب) مصفوفة انطباق القرارات ACTIVE (preflight مستهدف):

    DEC القراءة منطبق؟ الأثر على التصميم الدليل / الحالة
    009 Selective Pinned كاملة نعم نفس الـcommit، لا floating main، لا نسخة كاملة، Control Set + Applicable Set + Manifest يطابق §2.4/2.3 في [2/6] ✔
    013 Resolution/Closure كاملة تقريبًا (§1–§6 + العلاقات) نعم Stage1/2 منفصلتان؛ closure شرط بنيوي؛ لا Reference Support Set الاستثناء الوحيد = رابط Profile ⇒ يحتاج validator (WU-2)
    017 PR لكل branch منشورة كاملة نعم بحدوده الضيقة كل WU بعد الأول عبر PR؛ لا يشمل الفرع الافتراضي §3.1
    018 إسناد التنفيذ كاملة نعم لا تنفيذ بيد Lead دون إسناد صريح لكل WU؛ WU-0 يسمّي المنفِّذ يُضاف شرطًا للـWU
    023 Strict Acceptance كاملة نعم (WU-11 وWU-14) Coverage Matrix تشمل كل معيار منطبق وكل DEC منطبق؛ RC≠Stable؛ staleness هذه المصفوفة مدخل Matrix المستقبلية
    030 Release Artifact كاملة تقريبًا نعم (WU-9/11/12) هوية artifact قبل النشر؛ قسم CHANGELOG غير مؤرخ؛ RAV على SHA؛ PAV؛ لا إعادة tag مغطى في WU-11/12
    031 Operational Assets كاملة N/A بالنطاق لا Assets مُتبنّاة ⇒ غياب المجموعة حالة صحيحة D-3
    032 Mixed-pinning record كاملة N/A بالنطاق لا mixed pinning —
    033 سلامة الأدلة كاملة نعم (كل Commit/قبول) أدلة صالحة للمحتوى النهائي؛ تغيير مادي ⇒ إعادة تحقق يطبق على الـTree المرشح للـcommit الأول
    041 Post-Merge Main كاملة نعم (كل PR مدموج) تحقق Commit/Tree البعيد بعد Merge بوابة خروج كل WU
    046 حالة مشتركة/إنتاج الأجزاء المعيارية كاملة جزئيًا [I] تسجيل Packagist وضبط حماية الفرع ⇒ Owner-only؛ CI بقاعدة بيانات مؤقتة خارج النطاق (Non-Decision) UNRESOLVED-2: النص يصف «production أو non-disposable shared environment»؛ لا يسمّي صراحةً إعدادات المستودع/Packagist — أعاملها احتياطيًا Owner-only
    005 Persistence applicability مقروءة نعم القواعد الشرطية للـSQL تنطبق ✔
    025 Optional Runtime Capability كاملة تقريبًا N/A ext-pdo أساسي —
    012 llms.txt الأجزاء الافتتاحية نعم (WU-9) /llms.txt إلزامي LP §10.3
    035/045 تتبع Findings كاملة (045) نعم انظر DEC-045 handoff أدناه —
    002، 008، 016، 037، 038، 042–044، 047 صف الـIndex + المعيار المالك تشغيلية/عرضية لا أثر تصميمي مستقل UNRESOLVED-3 (سجلات غير مقروءة كاملة؛ لا أثر متوقع)
    003، 006، 007، 010، 011، 014، 015، 027، 028، 029، 036 صف الـIndex N/A بالنطاق (Slim/Module/Host/Jules/Provider/Repo مركزي) — Scope/Concern في الـIndex

    DEC-045 handoff (لم تُنشأ Issues لأن الحدود READ-ONLY ولا تفويض إنشاء): مسودات مقترحة للـLead: (1) php-engineering-standards: PB §2/§11/§16 ملكية Successor (L/D/R/S)؛ (2) تعريف {PackageName} لحزم php-*؛ (3) فجوة توثيقية: لا عقد لأول commit في مستودع فارغ؛ (4) توضيح أن رابط Profile لمعيار مستبعد ليس خرقًا لإغلاق Adoption §7.1.

    الحالات UNRESOLVED المتبقية: U-1 تجميد التسعة (مستهلكون خاصون) · U-2 انطباق DEC-046 الحرفي على إعدادات GitHub/Packagist · U-3 سجلات DEC غير المقروءة (لا أثر متوقع) · U-4 معايير الـHost المثبتة (لشرط WU-13b).

  10. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    🛠️ Addendum 2/2 — AR-04 · Owner Decision Register المحدَّث · WU المعدّلة · Errata

    (يكمل Addendum 1/2: AR-01 + Timeline + AR-02 + AR-03.)

    4. AR-04 — اكتمال التصميم

    4.1 Exception Marker conformance (PB §7 :443-455)

    القاعدة: كل exception يعرّفها الحزمة تُنفّذ PhpPersistenceExceptionInterface مباشرة أو غير مباشرة، وPDOException/الـThrowables الخارجية لا تُنفّذه (:455).
    الدليل في القديمة [V]: grep "implements PersistenceException" src/Exception/*.php = 8 من 8 كلاسًا مباشرةً (الملف التاسع هو الـinterface نفسه).

    FQCN المقترح الأصل (B) يمتد من (maatify/exceptions) Marker تغطية الاختبار القائمة
    P\Ordering\Exception\InvalidOrderingConfigurationException T-02 SystemMaatifyException مباشر InvalidOrderingConfigurationExceptionTest.php:17
    P\Ordering\Exception\InvalidOrderingOperationException T-03 ValidationMaatifyException مباشر لا اختبار marker صريح [V] (فجوة)
    P\Pagination\Exception\InvalidPaginationConfigurationException T-04 SystemMaatifyException مباشر PaginationExceptionContractTest.php:25
    P\Pagination\Exception\InvalidPaginationQueryException T-05 SystemMaatifyException مباشر نفسه
    P\Pagination\Exception\PaginationExecutionException T-06 SystemMaatifyException مباشر نفسه
    P\Transaction\Exception\TransactionExecutionException T-07 SystemMaatifyException مباشر TransactionPublicApiRegressionTest.php:67
    P\Transaction\Exception\InvalidTransactionConfigurationException T-08 SystemMaatifyException مباشر DeadlockRetryRunnerPublicApiRegressionTest.php:136
    (محذوف) OrderingTransactionException T-09 — — OrderingPublicApiRegressionTest.php:141 (يسقط مع الحذف)
    PDOException / \Throwable خارجي — — لا يُنفّذ اختبارات assertSame للاستثناء الأصلي المعاد رميه (PdoDeadlockRetryRunnerIntegrationTest.php:111)

    شروط قبول (تُضاف إلى بوابات WU-4/6/7/8):

    1. اختبار شامل بالمسح (reflection على src/**/Exception/*Exception.php): كل كلاس يُنفّذ الـmarker ويمتد من هرمية maatify/exceptions؛ الـmarker interface ويمتد \Throwable — يمنع تجاوز استثناء مستقبلي (الاختبارات القديمة جزئية لا شاملة).
    2. اختبار سلبي: استثناء PDO المعاد رميه assertNotInstanceOf(marker).
    3. فحص بنيوي: لا كلاس *Exception خارج مجلد Exception/ للقدرة، ولا marker ثانٍ (PB :466-468).
    4. اسم الملف = اسم النوع (PB :169).

    4.2 مراجعة التصنيف: إلغاء وسم «KEEP»

    وسم KEEP كان مضللًا لأن كل FQCN يتغير. الاستبدال: RELOCATE = نفس الاسم القصير/التوقيع، FQCN جديد (ليس توافق استيراد).

    التصنيف العدد (من 21 نوعًا في A) الأنواع
    RELOCATE 16 T-02…T-08 (6 من A)، T-10، T-11 (+ إعادة وصل داخلية)، T-13، T-15…T-19، T-20، T-21
    RENAME 2 T-01 → PhpPersistenceExceptionInterface، T-14 → PageResultDTO
    REDESIGN 2 T-22، T-23 (جيل الـrunner الثاني تحت الاسم القديم)
    OMIT 1 T-09

    4.3 OD-04 — تفسير Repository مقابل Service (تعديل توصيتي)

    معطيات المعيار [V]: PB :879-880 «SQL lives in Repositories or package-local SQL support builders»؛ :902-905 Services never contain raw SQL؛ :257 Repository = «persistence/query boundaries and their implementations»؛ :271-289 الواجهة تُوضع مع الـResponsibility التي تصفها.

    • الـrunners تنفذ نصوص SQL فعلية (SAVEPOINT x, RELEASE, ROLLBACK TO, DO 0) عبر PDO::exec (OwnedTransactionExecutor.php:173، PdoSavepointTransactionRunner.php:73-78). وضعها في Service/ (توصيتي السابقة) يخاطر بمخالفة حرفية لـ:902-905؛ وضعها في Repository/ لا يخالف نصًا ويقتصر الخطر على ملاءمة الاسم.
    • التوصية المعدَّلة (تفسير Lead-ADR، لا قرار مالك شخصي): كل كلاس يُصدر SQL أو أوامر تحكم معاملة ⇒ Repository/؛ ولا يُنشأ Service/ في هذه الحزمة. التأثير على المصفوفة: P\Transaction\Repository\{TransactionRunnerInterface, SavepointTransactionRunnerInterface, PdoTransactionRunner, PdoSavepointTransactionRunner, OwnedTransactionExecutor}؛ وOrdering\Repository\ScopedOrderingManager؛ وPagination\Repository\PdoPaginator. (يستبدل Transaction\Service\… في [3/6] و[4/6].)
    • بديل رُفض: Service/ + تفسير موثق (PB :902-905)؛ يُعاد فتحه فقط إن قرر Lead أن أوامر التحكم ليست «raw SQL» — مسار ADR، ويجمَّد قبل WU-6.

    4.4 ملكية OperationSavepoint والاختبارات قبل تجميد الـAPI

    • الوضع الحالي [V]: ثلاث نسخ متقاربة من executeControlStatement/tryControlStatement وسلوك التنظيف: OperationSavepoint.php:98-114، PdoSavepointTransactionRunner.php:73-115، PdoDeadlockRetrySavepointTransactionRunner.php:94-136. يختلف OperationSavepoint عنها في ثلاثة أمور فقط (docblock :11-27): (1) undoOrFail() يمرّر فشل ROLLBACK TO (2) لا مسار «معاملة مملوكة» (3) begin() يفشل إن لم تبقَ المعاملة نشطة بعد SAVEPOINT.
    • قرار الملكية المقترح (Lead-ADR): مالك واحد = قدرة Transaction (Transaction\Repository\SavepointScope، @internal)، وOrdering يستهلكه (الاتجاه Ordering → Transaction مُعلَن أصلًا). كلاس @internal في PHP يبقى قابلًا للتحميل ⇒ يعلن Package Reference أنه خارج العقد العام/SemVer، ولا يكتفى بالوسم.
    • اختبارات تُثبَّت قبل أي دمج (characterization) — موجودة في القديمة OperationSavepointTest.php:27,66,112,121,131,140,149,163 + اختبارات runners الثلاثة (PdoSavepointTransactionRunnerTest.php:92، …ParityTest.php:99، …RetryTest.php:124,147,148) + ScopedOrderingManagerLazySavepointTest.php (14 اختبارًا). شروط القبول: تُنقل دون تعديل أي تأكيد، تمر على الكود الحالي (قبل الدمج) ثم تمر على الـhelper المدموج بلا تعديل؛ أي اختلاف = تغيير سلوك يحتاج ADR.
    • بوابة التجميد: لا يُجمَّد API الحزمة ولا Package Reference قبل نجاح هذه الاختبارات على الـhelper المدموج (WU-6) وتسجيل الملكية في ADR (WU-3).

    4.5 الـOD تُصنَّف في ثلاث طبقات (يستبدل سجل الـ20 في 6/6 §6.2)

    الطبقة 1 — Owner Material Decisions (9 فقط)

    ID القرار البدائل التوصية يحجب OD قديم
    M-1 نموذج الملكية (Successor) وتفويض/تسلسل Track S (الحالات L/D/R/S في §1.2) (أ) Successor + Track S قبل WU-2/WU-13b ✅ · (ب) ملكيتان متوازيتان · (ج) الانسحاب إلى تطوير داخل maatify/persistence (أ) WU-2 (تفضيل)، WU-13b OD-03
    M-2 الـRoot namespace واسم الـmarker N2 Maatify\PhpPersistence\ ✅ · N1 Maatify\Persistence\ N2 (N1 يصادم) WU-3 OD-02
    M-3 خط الأساس السلوكي + جيل الـrunners وتسميتها (أ) main (B) + جيل 2 تحت الأسماء البسيطة ✅ · (ب) v1.4.0 فقط · (ج) نقل الجيلين (أ) مع بوابات اختبار وإعلان deltas (B-03/04/05/10) WU-3 OD-07, OD-08
    M-4 ادعاء قاعدة البيانات وext-pdo_mysql (أ) MySQL 8.4 فقط + ext-pdo+ext-pdo_mysql ✅ · (ب) ext-pdo فقط · (ج) MySQL+MariaDB بمصفوفة (أ) WU-3 OD-10
    M-5 Pin المعايير وقبول تجميد المرشحات + معالجة VERSION BASELINE STATUS للتسعة P-A 5b69c03/أحدث ·P-B 2ea426a· P-C تأجيل P-A بشرط إعادة التحقق عند WU-2 وزوال U-1 (أو P-C) WU-2 OD-11
    M-6 الترخيص MIT ✅ · غيره MIT WU-1 OD-14
    M-7 تفويض عمليات الـBootstrap الأول (الجدول §3.1: Branch/Staging/Commit/Push بدلالة Tree مسماة) والمحتوى (أ) المقترح ✅ · (ب) README عبر واجهة GitHub · (ج) استيراد تاريخ (أ) WU-1 OD-13
    M-8 تحديد الـHostين المستقلين (والتفويضات الفعلية للإصدار/Packagist تُطلب في WU-12 نفسها) مرشحان: admin-control-panel + Host خاص يحدده المالك WU-13b OD-18 (جزء)
    M-9 سياسة هجرة المستهلكين-المكتبات + مصير القديمة (أ) بعد Stable فقط، تفويض لكل مستودع، adapter/Major لكل كاشف للنوع، القديمة دون تغيير ✅ · (ب) هجرة منسقة · (ج) إبقاء القديمة (أ) M-wave OD-17, OD-19

    الطبقة 2 — Standard-Mandated Defaults (يُقرّ المالك دفعة واحدة؛ لا قرار شخصي لكل بند)

    ID الافتراضي المرجع
    D-1 الهوية maatify/php-persistence / repo php-persistence Composer :237-244
    D-2 php ^8.4؛ CI على الأدنى والأحدث المستقر (+الوسيط) PB :27-29؛ Composer :559-561؛ CI :232-237
    D-3 لا Operational Assets (غياب المجموعة صحيح) Adoption :105-111؛ DEC-031
    D-4 Integration عبر تعريف Docker Compose واحد؛ Model A للمسارات؛ CI Gate وحيد CI :127, :317-343, :424-437
    D-5 الوثائق الدائمة (ADR/Reference/README) بالإنجليزية Doc Lifecycle :46-54
    D-6 مسار أول Stable: RC منشور ← Harness ← ≥2 Host ← Stable، وStrict Acceptance لكل من RC وStable LP :572-594؛ DEC-023
    D-7 لا replace/conflict/provide/class_alias بلا موافقة معمارية؛ لا version ولا composer.lock Composer :749-763, :1122-1137
    D-8 تسمية الأنواع: …DTO, …Interface, …Enum, …Exception، marker {PackageName}ExceptionInterface، استثناءات كل قدرة تحت {Capability}/Exception/ PB :152-171, :314-322
    D-9 إعلان Source Topology في Package Reference؛ لا جذر تقني Pdo/ ولا Internal/ PB :175-229, :291-312
    D-10 تصنيف Operational Read/Reporting = Out of Scope (الحزمة لا تملك حالة نطاقية)؛ بلا Factory/Facade PB :917-955, :993-1002
    D-11 PHPStan max بلا baseline؛ scripts القياسية؛ stability stable؛ audit fail-closed Composer :861-931, :1036-1096؛ PB :1044-1067
    D-12 ADR+Index لكل قرار مادي قبل/مع الاعتماد عليه؛ Harness مرتان؛ RAV وPAV Decision Gov :73-87؛ Testing :75-94؛ CI :79-117

    الطبقة 3 — تفاصيل تصميم/تنفيذ (Lead/Executor، تُسجَّل في ADR أو Package Reference عند اللزوم)

    ID البند صاحب القرار البوابة
    I-1 وضع المنفّذات في Repository/ (§4.3) Lead (ADR) قبل WU-6
    I-2 ملكية الـsavepoint helper ودمجه (§4.4) Lead (ADR) قبل WU-6
    I-3 إعادة تسمية اختيارية (PageRequest→PageCriteria، حذف بادئة Pdo) — الافتراضي: لا Lead WU-3
    I-4 طريقة النقل (نقل مراجَع مع provenance SHA بدل إعادة كتابة) Lead كل PR
    I-5 ruleset PER-CS 3.1 وإصدارات PHPStan/CS-Fixer/PHPUnit Executor WU-4
    I-6 أسماء جداول الاختبار والـCompose project ومتغيرات البيئة Executor WU-5
    I-7 اسم ملف المرجع PHP_PERSISTENCE_PACKAGE_REFERENCE.md Lead WU-9
    I-8 نقل Regression/Docs/* من عدمه Lead WU-9
    I-9 بقاء بادئة savepoint maatify_persistence_sp_<32hex> (موثقة ومختبرة) Lead WU-6

    5. WU المعدّلة (الصفوف المتأثرة فقط؛ بقية جدول 6/6 §6.1 باقٍ)

    WU التعديل
    WU-0 يسمّي المنفِّذ لكل WU صراحةً (DEC-018)؛ يعتمد M-1…M-9 ويقرّ D-1…D-12؛ يقرر تفويض Track S
    Track S تُنقل إلى مسار حرج: تسبق WU-13b (وتُفضَّل قبل WU-2)؛ تفويض مالك مستقل؛ أي تغيير مركزي عبر PR مركزي منفصل
    WU-1 6 ملفات (LICENSE، .gitignore، README، Index، DEC-001، DEC-002)؛ عمليات Git المسماة §3.1؛ تحقق Tree؛ لا WU-3 مؤجل لقرارات هذا الـcommit
    WU-2 شرط دخول: زوال VERSION BASELINE STATUS أو قبول مالك صريح؛ validator evidence؛ لا Manifest VALID قبل ذلك
    WU-3 سابقة إلزامية لـWU-4 (reliance set)؛ ADRs: M-1…M-4, M-8, M-9 + قرارات Lead I-1…I-3
    WU-13b شرط: Track S مدموج + Upgrade Adoption للـHost + تفويض مستودع الـHost
    M-wave تبدأ بعد 1.0.0 فقط (§1.3)

    6. Errata — ما يُستبدل في التقرير الأصلي

    # الموضع الأصلي الاستبدال
    E-1 6/6 OD-03 (تعديل المعايير بعد أول Stable) مسحوب → M-1 + Track S قبل WU-13b (§1–§2)
    E-2 2/6 S-3 + 6/6 OD-13: «استثناء مالك ضيق/waiver» مسحوب → عمليات Git مفوَّضة محددة؛ لا انتهاك مثبت (§3.1)
    E-3 6/6 WU-1 (3 ملفات) + WU-3 (ADR مؤجل) WU-1 = 6 ملفات؛ توقيت ADR وفق §3.2
    E-4 4/6 §4.3.2 + 3/6 T-20…T-26 (Transaction\Service\) Transaction\Repository\ (§4.3)
    E-5 3/6 وسم KEEP RELOCATE (§4.2)
    E-6 2/6 §2.4 «حالة تجميد Profiles [I]» Profiles + 3 معايير = Frozen [V] بمطابقة blob؛ التسعة الأخرى Mutable / OWNER DECISION REQUIRED — VERSION BASELINE STATUS (§3.3)
    E-7 5/6 §5.4.3 (Pilot M1 على RC لمكتبة) يسقط؛ المكتبات بعد Stable (§1.3)
    E-8 6/6 §6.2 (20 OD) 9 + 12 + 9 (§4.5)
    E-9 2/6 §2.3 رابط Profile ليس عيب إغلاق مثبتًا؛ المطلوب validator evidence في WU-2 (Lead)

    7. حدود التسليم

    لم أنفّذ أي commit/branch/PR/tag ولا تعديل لأي مستودع أو معيار مركزي، ولم أنشئ Issues (الدفعة المقترحة في §3.3 DEC-045). القراءات الجديدة: سجلات DEC المستهدفة، Versioning Policy، مقارنة blobs مع لقطات المستهلكين العامّين، وفحص commit المعايير المتقدم. أي بند غير مثبت مصنَّف UNRESOLVED (U-1…U-4).

    ⏸ توقفت بانتظار Fresh Independent Architecture Re-Review.

  11. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    Technical Lead — Fresh Independent Architecture Re-Review #2 (Addendum 1/2 + 2/2)

    Verdict: PARTIAL ACCEPTANCE of design remediation; Issue #1 is NOT YET FULLY DECISION-READY. Standards Adoption WU-2 = NO-GO on candidate 5b69c03 / current 1d75e56 until a newly independently PROVEN structural version conflict is repaired. No permission to bootstrap, push, merge, port source or release is granted by this review.

    Read both complete addenda (1/2, 2/2) against all six original study sections, prior AR-01…AR-04, old source main@1f6a7aafe601090b7e55f60d83794364afdefe67, central canonical adoption/versioning/Package Building/Composer/CI/Decision Governance/DEC-017/DEC-023/DEC-030, and actual completed VALID public-consumer manifest and frozen file blobs. Central current head 1d75e56e8a40b33a707110f288842f9b94d036bb changes only Slim Standard from the study 5b69c03 snapshot, so the comparison and findings below apply identically to both candidate pins. New repo still EMPTY (0 commits/branches/PRs).

    Accepted corrections

    • AR-01 — architectural sequencing accepted with condition: rescinds "fix central policy after first Stable", correctly orders central Track S before RC Host validation and distinguishes old Published, successor Development, Published RC verification, and successor Stable. Does not claim unpublished source is published. The proposed central ownership/namespace change is not itself approved or merged; it is now tracked as central #180. Recommended gate refinement: for this fresh repo, finish central Track S before WU-2 Adoption, rather than treating that ordering merely as a preference; otherwise immediately re-upgrading a frozen pin for the very ownership rule on which this architecture relies adds avoidable, material inconsistency. Before WU-13b also independently verify each actual Host's pinned Host standards and Composer prerelease constraint/stability policy. Libraries' ordinary migration remains AFTER Stable, not a substitute for the two real RC Hosts.
    • AR-02 — PASS: no invented mandatory waiver from DEC-017; the Rule applies to remote non-default governed work branches. Proposed first default-branch bootstrap has explicit Branch/Staging/Commit/Push authority and Tree identity verification; first six-file commit includes docs/decisions/DECISIONS_INDEX.md and material Bootstrap/License ADRs before-or-atomic with their reliance. No first Commit authorized yet. Corrected rollback language preserves Issue architecture: establish PHP 8.4 persistence package contract, standards adoption and migration design #1's history. Clarify the planning contradiction: G0/WU-0 currently says Owner must ratify M-1…M-9 before any WU, whereas §2 says first WU needs only M-6 (MIT) + M-7 (bounded bootstrap). Lead chooses progressive decision gates: M-6/M-7 required for WU-1; other material decisions must be approved/recorded before the first Work Unit actually relying on each; do not require blanket nine-item approval for a six-file bootstrap.
    • AR-04 — design-completeness accepted: seven named new exceptions explicitly implement PhpPersistenceExceptionInterface with comprehensive runtime/reflection negative regression planned; external PDOException remains unmarked; every new FQCN is RELOCATE/RENAME/REDESIGN, not deceptively KEEP. Proposed Transaction/Repository placement is a provisional Lead architecture interpretation, grounded in raw SQL/savepoint commands vs PB §13 "Services never contain raw SQL", to be documented as ADR and rechecked against actual implementation. The single @internal savepoint-helper owner and characterization tests are proposed; consolidation is not yet proven behavior-preserving until WU-6 real test evidence. 9 material decisions vs defaults/implementation details is an improved review surface.
    • AR-03 targeted DEC reading — substantially improved: the core active decision evidence, release artifact lifecycle, operations, decision persistence and Issue routing are more explicit. Residual U-2 (exact scope of DEC-046), U-3 (peripheral active records) and U-4 (real Host standards) can be handled at the relevant later Work Units; they are not evidence of a defect in first LICENSE/README bootstrap.

    AR-03b — NEW PROVEN BLOCKER: THREE KNOWN FROZEN-VERSION/CONTENT MISMATCH artifacts

    The addendum's §3.3 classifies nine current standards as merely "Mutable Candidate / OWNER DECISION REQUIRED — VERSION BASELINE STATUS" based on a limited public-consumer scan. That classification is factually wrong for at least three. I independently checked Maatify/php-product manifest on main: Overall Resolution Status: VALID, exact upstream Adoption Commit ebcf55b0591db61d18a1407bc3effef0197b388f. Its pinned local files exactly match central blobs at that commit. At study's candidate 5b69c03419ad09369ad207a9a7976cc9cc0617d3 these three have the SAME declared version but different complete file contents:

    Central Standard Version on both Pinned completed VALID snapshot blob Proposed new pin blob
    Composer Package 5.0.0 64ce9bc38a87034c5a57df0265f551d083658b32 1cbcbfafe29c031c17cd7453b54fde9e3a98a1be
    CI Workflow 5.0.0 74e499519da522f0f1719c6370c58c2a4eef15a3 24ca8e42c105777c78c0b53b1a297eff7ac2ca7f
    Documentation Lifecycle 3.1.0 5e75fa711a507f4195d7ca4b8cc43874d6255d5c 3c508e1754cebfe8b2a6903b71d718823644313e

    Changes were inspected: they are Issue #168 / DEC-042 editorial-only consumer-identity neutralizations in the historical change-log lines, not obvious new normative technical rules. But Versioning Policy §3.3 freezes the exact artifact content, and Adoption §16.3 says known frozen-version/content mismatch ⇒ INVALID, structural, non-waivable. Editorial/non-contract nature does NOT create a written exemption from exact blob identity. The approved closed central #168 appears to have relied on a no-freeze premise contradicted by this integrated consumer's own VALID evidence; review authority must be reconciled centrally, not overridden by a new consumer.

    Result for the proposed pin: INVALID at least for these three artifacts if adopting their present identical version labels and divergent content; not merely OWNER DECISION REQUIRED. Unknown private freezes for the other six still require baseline-status evidence (cannot be assumed mutable). No Owner consent can waive this structural failure. Opened actionable central #179 to verify the earliest Freeze and repair the central version lineage before any new VALID Adoption. No standard content was changed.

    Required narrow correction / next gates

    1. Executor should append one small factual correction to Issue architecture: establish PHP 8.4 persistence package contract, standards adoption and migration design #1 (no rewrite) reclassifying the three exact blobs as KNOWN FROZEN-VERSION/CONTENT MISMATCH → INVALID, other six unknown unless proved, linking #179 and exact proof. Remove the option "Owner accepts nine unresolved ⇒ manifest VALID" from WU-2 and M-5. Owner may resolve an unknown baseline by supplying authoritative evidence; cannot approve a known mismatch into validity.
    2. Incorporate Track S central #180 as an explicit pre-WU-2 gate in the recommended train; revise G0 to progressive decisions (WU-1 only M-6/M-7; other material decisions in their reliance WUs).
    3. Do not require a separate Issue for hypothetical first-bootstrap or Profile-reference defects absent canonical proof; #179 and #180 are the two material distinct upstream findings tracked, no central implementation yet. No need to redo the 26-type API inventory or baseline matrices.
    4. Study acceptance status: substantive architectural design can be approved in principle after this factual correction; WU-1 can be considered independently after explicit Owner approval of MIT, exact six-file bootstrap, and named Git operations, because no pinned Standards Manifest or PHP Runtime would be created. WU-2 remains NO-GO until central #179 corrected, #180 decided/merged for this successor's pin, exact canonical adoption validated, and frozen-status proof resolved. No runtime WUs, consumer/Host upgrades, RC or Stable authorized.

    Final classification: NEEDS ONE BOUNDED FACTUAL ADDENDUM (AR-03b), NOT A NEW FULL STUDY; no Owner blanket OD approval yet. All repository implementation authority remains suspended. The evidence here is GitHub source/manifest/blob examination, not locally executed PHP/MySQL verification.

  12. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    ✏️ Corrective Addendum (AR-03b) — تصحيح واقعي محدود · READ-ONLY

    يعالج Re-Review #2 فقط. لا يعيد كتابة الدراسة ولا الجرد ولا العقود. يُصحّح §3.3 في Addendum 1/2 وما يتفرع عنه في Addendum 2/2.

    1. اعتراف بالخطأ

    في §3.3 صنّفتُ تسعة معايير «Mutable Candidate» لأن مسحي بحث عن تطابق blob فقط ولم يفحص تطابق رقم الإصدار مع اختلاف المحتوى. غياب التطابق لا يعني غياب التجميد؛ هذا استنتاج خاطئ مني. التصحيح أدناه.

    2. إعادة التصنيف (تحققتُ مستقلًا [V] بـgit rev-parse <commit>:<path> على نسخة محلية للمستودع المركزي)

    لقطة php-product الـVALID (Adoption Commit ebcf55b0591db61d18a1407bc3effef0197b388f) مقابل 5b69c03 (وَ1d75e56 له نفس blobs):

    المعيار الإصدار في اللقطتين blob في ebcf55b blob في 5b69c03=1d75e56 الحكم
    Composer Package 5.0.0 64ce9bc38a87034c5a57df0265f551d083658b32 1cbcbfafe29c031c17cd7453b54fde9e3a98a1be KNOWN FROZEN-VERSION/CONTENT MISMATCH → INVALID
    CI Workflow 5.0.0 74e499519da522f0f1719c6370c58c2a4eef15a3 24ca8e42c105777c78c0b53b1a297eff7ac2ca7f … → INVALID
    Documentation Lifecycle 3.1.0 5e75fa711a507f4195d7ca4b8cc43874d6255d5c 3c508e1754cebfe8b2a6903b71d718823644313e … → INVALID
    • طبيعة الفرق [V] (git diff ebcf55b 5b69c03 لكل ملف: +2/−1 سطر): سطر سجل التغييرات التاريخي فقط (تحييد هوية مستهلك تحت #168/DEC-042). لا أدّعي أنه يغيّر عقدًا معياريًا — لكن هوية الـFreeze هي محتوى الـartifact الكامل (Versioning Policy §3.3 STANDARD_VERSIONING_POLICY_AR.md:158-170)، وAdoption §16.3 (:633-676) يجعل المطابقة الخاطئة INVALID بنيويًا غير قابل للـwaive. لا نص مرجعي يستثني سجل التغييرات (لم أجده؛ وهذا موضع التحقيق المركزي).
    • الستة الأخرى (Adoption 5.0.1، Library Presentation 5.0.1، Package Building 4.0.0، Testing 3.0.0، AI Collaboration 13.0.0، Phase Stack 5.0.0): أرقام إصدارها تختلف عن لقطة ebcf55b (5.0.0 / 5.0.0 / 3.0.2 / 2.0.0 / 12.0.0 / 4.0.0) ⇒ لا تعارض ثابت مع تلك اللقطة، لكن حالتها UNVERIFIED BASELINE STATUS (مستهلكون خاصون غير مفحوصين)، لا تُفترض Mutable. وَالخمسة المطابقة سابقًا (Decision Governance، PHP Source Doc، PHP Coding Style، وكلا الـProfiles) تبقى FROZEN MATCH كما في الأصل.
    • مصدر الحقيقة المركزي: #179 (تصنيف كل artifact، وأقدم Freeze، وإصلاح النسب المعياري). لا أقترح تعديلًا بنفسي.

    3. أثر التصحيح على الخطة

    1. Pin: 5b69c03 و1d75e56 ⇒ INVALID لثلاثة artifacts؛ لا يوجد خيار «الأخذ مع تجميد/قبول مالك». يُحذف من M-5 وWU-2 أي مسار «يقبل المالك التسعة غير المحسومة ⇒ Manifest VALID». المالك قد يقدّم دليلًا موثوقًا يحسم حالة مجهولة، ولا يملك تحويل عدم تطابق معروف إلى صلاحية (Owner Approval ≠ علاج مخالفة بنيوية؛ Adoption :660-666).
    2. M-5 المعدَّل: «اختيار Pin بعد معالجة مركزية موثقة (#179) وبعد قرار #180» — ولا خيار P-A كما كان مكتوبًا (P-B 2ea426a يبقى فقط كمرجع تاريخي؛ تقييمه يتطلب فحص الـblobs نفسه قبل أي اقتراح، ولم يُفحص لهذه الغاية).
    3. Track S (#180) شرط سابق لـWU-2 (لم يعد «تفضيلًا»): يتفق مع Re-Review ومع نص #180 البند 5.
    4. تحقق إضافي قبل WU-13b: قراءة معايير كل Host المثبتة فعليًا وسياسة stability/pre-release في Composer لديه (U-4)، لا استنتاجها من معايير الحزم.

    4. G0 / WU-0 — تصحيح التعارض (قرارات تدريجية)

    يستبدل نص «يعتمد M-1…M-9 قبل أي WU»:

    الحد يُعتمد قبله
    WU-1 (6 ملفات) M-6 (MIT) + M-7 (الإجراء المحدد) فقط + تسمية المنفِّذ (DEC-018)
    WU-2 M-5 المعدَّل + إنهاء #179 + إنهاء #180 (مدموج لهذا الـPin) + إثبات الـFrozen status + validator evidence
    WU-3 / أول WU يعتمد M-1…M-4 وM-8 وM-9 قبل أول WU تعتمد عليها فعلًا (ADR+Index وفق Decision Governance)
    WU-13b M-8 (الـHostان) + Upgrade Adoption للـHost + تفويض مستودعه

    5. القطار الموصى به (محدَّث)

    G0  (تدريجي) → WU-1 [M-6, M-7]        ◄── مستقل عن المعايير المركزية
         ║
     Central #179 (إصلاح نسب الإصدار)  ─┐
     Central #180 (Track S)             ├─► شرطان سابقان لـWU-2
         ║                              ┘
     WU-2 Adoption (pin جديد، Status VALID فقط بعد إثبات)  → WU-3 → WU-4…WU-12 (RC)
     → WU-13a Harness → WU-13b Hostان (بعد #180 + Upgrade للـHost) → WU-14 Stable → M-wave
    

    WU-1 يمكن النظر فيه منفردًا بعد موافقة المالك الصريحة على MIT والملفات الستة والعمليات المسماة، لأنه لا ينشئ Manifest ولا كود PHP. لا WU آخر مُفوَّض.

    6. ما لم يتغير

    الجرد الثلاثي (26 نوعًا) والعقود والبدائل وTrack S ومصفوفة Marker وتصنيف 9/12/9 والـUNRESOLVED الأخرى (U-1 يصبح: حالة الستة المجهولة فقط، U-2…U-4 كما هي).

    ⏸ توقفت. READ-ONLY: لا commit/branch/PR ولا تعديل لمعيار أو مستودع قديم.

  13. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    Technical Lead — Fresh Independent Architecture Re-Review #3: STUDY ACCEPTED WITH EXPLICIT IMPLEMENTATION GATES

    Reviewed: Corrective Addendum AR-03b against Re-Review #2, Addendum 1/2, Addendum 2/2 and six original architecture study comments. Independently checked the public consumer Maatify/php-product STANDARDS_MANIFEST.md, pinned upstream ebcf55b0591db61d18a1407bc3effef0197b388f, and the exact three source blobs in current central main@1d75e56e8a40b33a707110f288842f9b94d036bb. New repository is still empty (0 branches, no PRs/commits); Issue #1 OPEN.

    Specific finding closure

    • AR-01 — PASS at architecture-study level: proposed four-state successor model (legacy published, successor dev, externally published successor RC verification, successor Stable) and Track S central #180 mandatory BEFORE WU-2, not optional, with separately approved central change and adoption upgrade of actual verification Hosts. Nothing here has changed the upstream normative ownership rule; execution of any dependent WU is still blocked.
    • AR-02 — PASS at planning level: correctly narrows DEC-017 to published non-default work branches, proposes a pre-staged 6-file first-main-commit sequence with explicit Owner-scoped Branch/Staging/Commit/Push authority, candidate Git Tree review before committing, and first-commit Decision Index / material Bootstrap and License records. No fabricated standards waiver or PR without base. Owner permission to perform it has NOT been given.
    • AR-03 — PASS as an evidence-classification study, but Standards Adoption remains BLOCKED: independently verified three known frozen-version/content mismatches: public php-product manifest is VALID at pinned ebcf55b, and its exact three pinned file blobs equal that upstream snapshot. Current central still declares those SAME versions with DIFFERENT bytes:
      Artifact version VALID frozen snapshot blob current candidate blob
      Composer Package 5.0.0 64ce9bc38a87034c5a57df0265f551d083658b32 1cbcbfafe29c031c17cd7453b54fde9e3a98a1be
      CI Workflow 5.0.0 74e499519da522f0f1719c6370c58c2a4eef15a3 24ca8e42c105777c78c0b53b1a297eff7ac2ca7f
      Documentation Lifecycle 3.1.0 5e75fa711a507f4195d7ca4b8cc43874d6255d5c 3c508e1754cebfe8b2a6903b71d718823644313e
      The delta is limited to DEC-042/#168 historical editorial/change-record lines and does not establish normative behavior drift; nevertheless exact content is the frozen identity under Versioning §3.3 / Adoption §16.3. KNOWN FROZEN-VERSION/CONTENT MISMATCH → INVALID for this proposed pin, not Owner-waivable. The remaining six unmatched current versions are UNVERIFIED BASELINE STATUS, not automatically Mutable. The earlier five matching frozen artifacts remain consistent. Investigation/remediation owned by central #179. This correction is now reflected in M-5/WU-2; no VALID adoption manifest can be created on these conflicted snapshots.
    • AR-04 — PASS as proposed architecture: exception-marker mapping, RELOCATE FQCN treatment, prospective Transaction/Repository SQL boundary and Savepoint-helper characterization gates, and separation of 9 material Owner decisions from standard requirements and lower-level technical decisions are acceptable design hypotheses. Behavioral-preservation claims for consolidated code require future real tests and separate acceptance, not inherited PASS from a study.
    • G0 — corrected and accepted: progressive decision gates. Only M-6 MIT license + M-7 exact first-bootstrap six files/named Git operations are Owner-level prerequisites for WU-1, with an explicitly named executor. All other material decisions are required before their own first reliance Work Unit, durably indexed in the correct PR/commit. Central #179 AND #180 must both be resolved/merged and the exact selected Standards candidate structurally and canonically validated before WU-2.

    Explicit project status, next action, and authority

    ISSUE #1 ARCHITECTURE STUDY: ACCEPTED AS DECISION-READY WITH STAGED IMPLEMENTATION CONDITIONS. This closes the study/review findings, NOT Issue #1 itself, the structural standards mismatch, the central ownership change, the API design implementation, or any release gate.

    1. WU-1 (six-file empty-repo bootstrap) = OWNER DECISION REQUIRED, NOT AUTHORIZED. Proposed files: LICENSE, .gitignore, README.md (development-only), docs/decisions/DECISIONS_INDEX.md, docs/decisions/DEC-001-…md for bootstrap procedure, docs/decisions/DEC-002-…md for MIT. Initial main has no commit; use explicitly approved sequence only: prepare six files, review staged diff/tree, named Owner permission for commit and non-force push of exact reviewed Tree, verify remote main commit/tree, then enable protection. No AGENTS.md, STANDARDS_MANIFEST.md, PHP source or CI/Composer skeleton in first Tree. Owner approval on a plan does not eliminate the required pre-commit Tree review.
    2. WU-2 (pinned adoption) = NO-GO until central #179 and #180 are reconciled through their respective independent governance and merge processes; freeze-version evidence for all selected artifacts and validator outcome must be valid. The unreviewed alternative historical 2ea426a is NOT an approved fallback.
    3. WU-3+ (contract/code/CI) = NOT AUTHORIZED pending WU-2, future material decisions and separate scoped Lead acceptance. Host prerelease/composer standards checks remain a later release gate.
    4. Legacy Maatify/persistence/#37 RELEASE NO-GO remains separate; no old contract change, consumer migration, Tag/Release/Packagist action or backdoor standards update is implied.

    Result: Architecture Study ACCEPTED; proceed next with Owner presentation of only M-6/M-7 for WU-1. Do not create a branch, commit, PR, release or modify upstream under this comment.

  14. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    Owner Decision M-6 — RATIFIED: Proprietary (NOT MIT) — licensing correction to WU-1

    Authority: Owner's explicit instruction in the project leadership discussion on 2026-10-23: "الرخصه هتكون propration مش mit", interpreted as the recognized Proprietary software licensing model. This is an Owner licensing decision and supersedes the architect/executor's recommended MIT in original Issue #1 study, Addendum, decision register, and Lead's WU-1 decision request. MIT was never Owner-ratified for this new repository.

    Binding update (prospective, no repository file edits)

    • M-6 = OWNER APPROVED — PROPRIETARY, rather than MIT. License must protect the identified rights holder's rights and state authorized usage/distribution limits accurately; exact LICENSE legal text is NOT YET DRAFTED/APPROVED. Do not copy old MIT text into the new LICENSE, nor manufacture a commercial usage grant, customer permission, sublicense, non-transferability clause, or organizational ownership clause not approved by the actual rights holder.
    • Future composer.json must use "license": "proprietary", Composer's documented valid closed-source identifier (https://getcomposer.org/doc/04-schema.md#license), and stay consistent with the LICENSE file, repository metadata, README, later package presentation/registry disclosure. Central Composer Package Standard §10.4 does not mandate MIT, but requires consistency and Owner-controlled legal/repository licensing decisions. The accepted phrase proprietary is a Composer-specific special license identifier, not a claim that it is an ordinary SPDX open-source license.
    • WU-1's file count/scope remains six: LICENSE, .gitignore, README.md (Development / Proprietary, no published/install badges), docs/decisions/DECISIONS_INDEX.md, docs/decisions/DEC-001-…md (first-default-branch bootstrap), docs/decisions/DEC-002-…md (M-6 Proprietary licensing decision). Record a direct link to this Owner decision and do not describe MIT as active. Material decision M-6 must be durable, indexed and in the same initial Tree as the LICENSE it governs.
    • Provenance and third-party rights gate for later source extraction: old Maatify/persistence@1f6a7aafe601090b7e55f60d83794364afdefe67 includes an actual MIT LICENSE (Copyright 2026 Maatify). Changing the license declaration in a distinct new repository does not retroactively remove rights granted by the old MIT release. Before importing/copying any old code, verify rights-holder control, inherited notices and any contributor/third-party obligations; preserve any required MIT copyright/license notices where applicable. Do not assume ownership or relicensing rights merely because the two repos share an organization. This is a legal provenance/compliance prerequisite for the future source-porting Work Units; it does not block a clean six-file bootstrap if the new LICENSE is legally reviewed.
    • New repo is currently public and empty. Public source visibility does not make a repository open source or authorize reuse. Decide future public/private visibility, commercial distribution, and external Composer availability through separately scoped Owner decisions; no Package/Packagist registration now.

    Authorization boundary

    M-6 licensing choice is ratified. M-7 is NOT YET approved merely by choosing the license. First Git commit/branch/Staging/Push (and any change to GitHub visibility/settings) still require the independently specified authority and exact pre-commit Tree Review under WU-1; no file, branch, PR, commit or push is authorized in this comment. WU-2 remains blocked by central #179 and #180.

    Next Lead action: update WU-1 instructions to draft a proprietary LICENSE for rights-holder/legal review without committing, rather than defaulting to MIT, and seek separate M-7 authorization for the six-file bootstrap and its pre-commit Tree gate.

  15. megyptm commented on Oct 23, 2026

    @megyptm
    CollaboratorAuthor

    Technical Lead correction — WU-1 review responsibility and GitHub-first handoff

    Clarification of the final wording in the M-6 Proprietary ratification and architecture acceptance:

    Owner is NOT required to receive, inspect or approve local files, a local staged diff, or a local Git Tree as a separate delivery artifact before GitHub publication. That would wrongly shift technical-review responsibility to the Owner.

    The bounded empty-repository bootstrap procedure remains:

    1. Owner approves M-7 scope and named Git operations; M-6 (Proprietary, NOT MIT) has already been ratified. The exact legal LICENSE wording and rights-holder authority must be resolved as part of the authorized execution/review, without claiming invented rights.
    2. A named Executor prepares the six WU-1 files only in its local worktree. Executor conducts exact-path staging, verification, and candidate tree capture; Technical Lead independently reviews staged content and the candidate tree. Lead does the technical verification; there is no extra Owner 'review it locally' gate.
    3. Once that accepted exact tree is bound to the authorized operation, Executor makes a single ordinary initial commit and non-force push to the GitHub default branch main. This initial default-branch creation cannot have a base PR; do not fabricate a branch-only PR exception. Lead independently reconciles remote commit/tree and then verifies branch protections.
    4. All subsequent governed changes run on non-default branches with linked GitHub PRs, independent Fresh Full Review, CI and separate Owner Merge Authorization. Owner sees and approves GitHub decision/merge gates, not local staging or Git plumbing.
    5. Until Owner authorizes M-7 operations, no Git init/branch/commit/push/PR or repository content change is authorized. WU-2 adoption is separately BLOCKED by central #179 and #180.

    Important separation: owner's authorization of the first bounded Git operations is required; owner's personal technical inspection of local working files is not required.

  16. 22 remaining items

  17. megyptm commented on Oct 28, 2026

    @megyptm
    CollaboratorAuthor

    Milestone reconciliation — WU-6 completed (2026-10-28)

    Sequential delivery: WU-1 through WU-6 now MERGED and reconciled. WU-6 PR #13 was Owner-squash-merged after exact-HEAD Fresh Full Independent Re-Review #2 TECHNICAL PASS. WU-6 Issue #12 has been closed/completed with full independent post-merge evidence.

    Git integrity: accepted PR HEAD 9e8b2e047ecca54ebc9e5d35c3ec20884c2ccd02, accepted tree 2f9bcabd65066e73b3d9a525b1bfb70ed844c889; current main squash merge a63d030de70b1aee072c367d83d4fb9853041a32, sole parent b2f2716e6469334ada7e50c2629543ec81d90947, tree exactly 2f9bcabd65066e73b3d9a525b1bfb70ed844c889. 29 WU-6 paths, no other PR or concurrent merge.

    Gates: CI run 40757796753 completed/success on accepted HEAD, all 18 required jobs passed, including 11 MySQL/MariaDB Integration cells (genuine deadlocks), four lowest/latest PHP/Composer compatibility cells, and the single protected CI gate; optional exploratory Innovation job intentionally skipped. Original savepoint characterization and post-SAVEPOINT transaction-ended guard passed after F13-01 correction, README ambiguity fixed by F13-02. Both findings were closed by the Lead before squash.

    Scope semantics: Transaction Gen2 now exists and is tested, but Ordering and Pagination remain unimplemented. DEC-013 ACTIVE is a test-only DB version matrix and is not a support-range claim. DEC-009 remains PROPOSED on the MariaDB 1020 post-error contract. No package release, tag, external consumer migration, central Standards or legacy source repository work has been authorized here.

    Current next milestone: WU-7 Pagination is not opened/started by this reconciliation. Its separate owner authorization and scope/preflight remain required; leave umbrella Issue #1 OPEN.

  18. megyptm commented on Oct 28, 2026

    @megyptm
    CollaboratorAuthor

    Sequential milestone — WU-7 AUTHORIZED / EXECUTION OPEN (2026-10-28)

    The Owner explicitly approved beginning the next WU ("جميل يلا"). The Lead verified WU-1…WU-6 merged and reconciled, main@a63d030de70b1aee072c367d83d4fb9853041a32 tree 2f9bcabd65066e73b3d9a525b1bfb70ed844c889, protect-main ACTIVE with required CI gate, no open implementation PR and no overlapping work Issue prior to the new unit.

    WU-7 Issue #14 is OPEN and bounded to the Pagination capability: seven relocated legacy Pagination types, three capability-specific exceptions, only approved short-name delta PageResult → PageResultDTO and paginate() return type, original API/SQL/array/JSON golden contract, normalization and negative-path regression, deterministic real MySQL/MariaDB Integration including caller transaction ownership and B-08a three-read snapshot limitation, plus directly relevant docs. Single Draft PR, no Order/Transaction API changes or version-range support claim. Original legacy seven Pagination files are not deprecated; do not revive any of the three retired legacy types.

    Legacy main@1f6a7aafe601090b7e55f60d83794364afdefe67 and published v1.4.0@fc1459b49fe5af5ead17814eeb3ada7a3fa81791 separately checked. Pinned standards unchanged. Required source-copy provenance/rights gate, full exact-head CI, Fresh Full Independent Lead Review and separate Owner Squash Merge authorization remain mandatory. DEC-013 test-only matrix remains ACTIVE; MariaDB 1020 handling remains DEC-009 PROPOSED.

    Current state: WU-7 Issue opened/authorized, but no WU-7 branch/PR/code changes have been made in this Lead session. WU-8 does not start before WU-7 acceptance, Owner-authorized merge and reconciliation. Umbrella Issue #1 remains OPEN.

  19. megyptm commented on Oct 29, 2026

    @megyptm
    CollaboratorAuthor

    Sequential milestone reconciliation — WU-7 COMPLETED (2026-10-29)

    WU-1 through WU-7 have now been merged and reconciled sequentially. WU-7 PR #15 is MERGED via squash after the exact-head Fresh Full Independent Review #1 — TECHNICAL PASS. WU-7 Issue #14 is CLOSED/completed, with full post-merge reconciliation recorded.

    Git identity: accepted head ca202e2953b9f0acab49691c8f0691d287639072, accepted tree f855c9bb9633a913f0d381fcd53c4125089daa5a → squash main@659f3dc44f196380acf62d34b7cc578cf1ccbf7c with its sole parent a63d030de70b1aee072c367d83d4fb9853041a32 and identical tree f855c9bb9633a913f0d381fcd53c4125089daa5a. Exactly 35 WU-7 files. refs/heads/main verified at that squash commit; zero divergence.

    Evidence: CI #40766573066, exact accepted PR head: 18/18 required jobs SUCCESS, including CI gate, four PHP compatibility jobs, 11 MySQL/MariaDB Integration jobs; optional exploratory Innovation SKIPPED by design. Golden Pagination SQL/API/JSON, B-08/B-08a/B-09, real database snapshot interleaving, failure and transaction-state tests accepted. No code delta after review because trees match.

    Current scope: Transaction (WU-6) and Pagination (WU-7) both delivered to main; Ordering (WU-8) remains NOT STARTED. This reconciliation is not authorization to begin WU-8, create a tag/release, declare a DB supported range, alter central/legacy repositories, or migrate consumers. DEC-009 remains PROPOSED and DEC-013 is test-only. Architecture umbrella #1 remains OPEN for remaining work and later Owner decisions.

  20. megyptm commented on Oct 29, 2026

    @megyptm
    CollaboratorAuthor

    Sequential milestone — WU-8 AUTHORIZED / EXECUTION SCOPE OPEN (2026-10-29)

    The Owner expressly authorized the next Work Unit ("يلا") after verified WU-7 post-merge reconciliation. WU-1 through WU-7 are MERGED/RECONCILED. The authoritative default branch is main@659f3dc44f196380acf62d34b7cc578cf1ccbf7c, tree f855c9bb9633a913f0d381fcd53c4125089daa5a; WU-7 Issue #14 is CLOSED/completed. No open implementation PR or prior open execution Issue before this WU. protect-main active with exactly one required status check, CI gate. Read-only legacy main@1f6a7aafe601090b7e55f60d83794364afdefe67 unchanged.

    WU-8 Issue #16 is now OPEN, a single vertical Ordering scope: ScopedOrderingConfig, ScopedOrderingManager, two relocated exception classes, B-01…B-07 public and behavioral golden contracts, reuse existing Gen2 transaction runner and the shared @internal SavepointScope, stale-snapshot/lazy-savepoint/rollback/nullable-scope/soft-delete cases, source provenance, real MySQL/MariaDB experiments/CI and directly affected docs. The deprecated OrderingTransactionException and legacy duplicate helper remain excluded. Plan: one work branch / one Draft PR / independent cumulative Lead review / separate Owner Squash Merge authorization / post-merge reconciliation.

    Open Owner decision stays open, not silently ratified: DEC-009 PROPOSED on MariaDB 1020 caller-owned transaction safety. WU-8 is authorized to build already-approved behavior and collect test evidence (including test-only ON/OFF at MariaDB endpoints), not to adopt a new safety policy or declare supported MariaDB ranges. Its final MariaDB acceptance remains gated until the Owner resolves that material policy decision on evidence. DEC-013 ACTIVE remains test-matrix only.

    Current state: WU-8 issue/scoped handoff opened; no implementation PR, source branch publication, merge, release, tag, or consumer migration claimed. Architecture umbrella #1 stays OPEN.

  21. added a commit that references this issue on Oct 29, 2026
  22. megyptm commented on Oct 30, 2026

    @megyptm
    CollaboratorAuthor

    Sequential milestone — WU-8 COMPLETED / RECONCILED (2026-10-30)

    WU-1 through WU-8 are now Owner-authorized SQUASH MERGED and post-merge reconciled. Ordering completes the planned three implemented capabilities (Transaction, Pagination, Ordering) on main. WU-8 PR #17 received independent Re-Review #2 — TECHNICAL PASS after repairing F17-01/F17-02; Issue #16 is CLOSED/completed.

    Git reconciliation: accepted PR HEAD 79f09d799ea969ab7b58bc3f0fb2a5da55120119, accepted tree 671636e19b1064782528aac59e0acbea4298d73f → squash main@2212fb0a74e8f44c82b2c508f3585e2b87ed5a8c, same tree, only parent 659f3dc44f196380acf62d34b7cc578cf1ccbf7c. 32 scoped files; exactly one new commit above WU-7; refs/heads/main independently confirmed. No other intervening main changes.

    Exact-HEAD evidence: CI #40969473328: 18/18 mandatory SUCCESS, including 11 required MySQL/MariaDB real integration jobs, 4 PHP/dependency compatibility jobs, static checks, workflow lint and protected CI gate. One optional Innovation job skipped by design. Full unit/regression 505 tests; 221 integration tests per suite pass, 2 passes × 2 clean service lifecycles, zero residue. Saved review and final issue reconciliation contain detailed evidence.

    Next boundary: Architecture umbrella #1 stays OPEN. WU-9 documentation has NOT begun and requires Owner authorization. DEC-009 remains PROPOSED/Owner-deferred; no unconditional MariaDB support / MariaDB 1020 policy approved and no engine range declared. DEC-013 remains test-only. No tag/release, consumer migration, legacy or central repo changes. Owner's merge permission did not grant any further release or WU authority.

  23. megyptm commented on Oct 30, 2026

    @megyptm
    CollaboratorAuthor

    Sequential milestone — WU-9 AUTHORIZED / DOCUMENTATION SCOPE OPEN (2026-10-30)

    المالك صرّح صراحةً ببدء WU-9 — Documentation & Package Reference («يلا») بعد التحقق الجديد من أن WU-8 دُمجت ومصالحتها مكتملة. فُتحت Issue #18 كوحدة توثيقية واحدة مغلقة النطاق، تشمل Package Reference canonical في جذر الحزمة، README، Usage Guide، examples، llms.txt، وملفات presentation/governance المطلوبة لحالة Development/Unpublished، مع تحقق الأمثلة والتطابق الدلالي مع Runtime الفعلي.

    Exact baseline قبل التنفيذ: main@2212fb0a74e8f44c82b2c508f3585e2b87ed5a8c، tree 671636e19b1064782528aac59e0acbea4298d73f. PR #17 MERGED؛ Issue #16 CLOSED/completed؛ WU-1…WU-8 RECONCILED. في لحظة فتح #18، كانت Architecture Umbrella #1 هي الـIssue الوحيدة المفتوحة ولا توجد Open PRs. الـpinned standards ثابتة عند ebcf55b0591db61d18a1407bc3effef0197b388f.

    Authority and policy boundary: DEC-009 تظل PROPOSED / Owner-deferred، وDEC-013 ACTIVE تختص بمصفوفة اختبارات لا إعلان Supported Database Range. لا Runtime/API redesign أو تغييرات على Legacy/central standards، ولا ادعاء Release/Composer Publication. إذن بدء WU-9 ليس إذنًا بالـMerge أو Tag أو Release أو Publish أو بدء WU-10.

    الحالة الآن: Issue #18 OPEN / نطاق التنفيذ مثبت. لا Implementation PR أو Merge أو Release مُعلن حتى الآن. المساعد القائد مسؤول عن Fresh Full Independent Review والـPR metadata والبوابات؛ ويتطلب أي Squash Merge إذنًا صريحًا مستقلًا من المالك.

  24. megyptm commented on Nov 12, 2026

    @megyptm
    CollaboratorAuthor

    WU-9 — COMPLETED / RECONCILED (2026-11-12)

    اكتمل دمج ومصالحة WU-1 إلى WU-9. دُمجت PR #19 بالـSquash بتصريح المالك بعد Technical PASS على HEAD f50f8ec9468474c2f741e92994fce52a4b1d1d7b. أصبح main@1e13f0428665b7d18862caa969357ba9befed852 بالشجرة المقبولة 3a947b7b7f6b44123efa5a8ad18b6b3b88ee7fc2. نجحت وظائف CI المطلوبة العشرون على commit الدمج. أُغلقت Issue #18 كـcompleted.

    يتضمن main الآن مرجع الحزمة ودليل الاستخدام والأمثلة والتحقق منها لقدرات Transaction وPagination وOrdering. الحزمة Development / Unpublished. يظل DEC-009 مؤجلًا وDEC-013 مصفوفة اختبار. تبقى Architecture Umbrella مفتوحة، وWU-10 بانتظار تصريح بدء مستقل.

    CI على main

  25. megyptm commented on Nov 12, 2026

    @megyptm
    CollaboratorAuthor

    WU-10 — COMPLETED / RECONCILED (2026-11-12)

    اكتمل دمج ومصالحة WU-1 إلى WU-10. دُمجت PR #21 بالـSquash بتصريح المالك بعد Technical PASS وإغلاق F21-04 على HEAD d14d09bfc0cb78825d0e41ca0ea4480ad506f35b. أصبح main@375f9aa73dacc4aa789986c6bfae0f22e8bb18d7 بالشجرة المقبولة 95c81dfb02845f52add52fdf87049d548f51888f.

    نجحت وظائف CI المطلوبة 21/21 على commit الدمج. أثبتت دورتا MySQL التعايش والتغطية التفاضلية وdeadlock replay، مع تنظيف محقق. الحزمة Development / Unpublished. تبقى Architecture Umbrella مفتوحة، وWU-11 بانتظار تصريح بدء مستقل.

    Issue #20 المغلقة · CI على main

  26. megyptm commented on Nov 12, 2026

    @megyptm
    CollaboratorAuthor

    WU-11 — COMPLETED / RECONCILED (2026-11-12)

    اكتمل دمج ومصالحة WU-1 إلى WU-11. دُمجت PR #23 بالـSquash بتصريح المالك بعد Strict Lead Preparation PASS على HEAD 2387100c7715866768ecc51dd047e2fc35a2cb3b. أصبح main@61d4158a7c2d6edf6c0134d207058fdc2ae9cbb4 بالشجرة المقبولة 0e7a191580be6a7db94726e9f69f146662a3309d.

    هذه الـSHA مؤهلة للهدف maatify/php-persistence:1.0.0-rc.1 بعد نجاح 22/22 وظيفة مطلوبة، وفحص أرشيفَي Git وComposer المستقلين على الـSHA نفسها. تضمّن كل منهما 75 ملفًا بقائمة متطابقة. أُغلقت Issue #22 كـcompleted. الحزمة Development / Unpublished، وWU-12 بانتظار تصريح مستقل. تبقى Architecture Umbrella مفتوحة.

    CI على main · سجل الأرشيفين

    سجل مصالحة Issue #22

  27. megyptm commented on Nov 12, 2026

    @megyptm
    CollaboratorAuthor

    1.0.0-rc.1 — إعادة تأهيل SHA بعد PR #24

    دُمجت PR #24 بالـSquash بتصريح المالك. أصبح main@057a87c260d6e31060a1c9d2b582db4c43eb5238، Tree 4e3fb02779b0fef0f41a67c9e73ea52a85f770fa. يتضمن هذا الهدف تحديث الكلمات المفتاحية فقط فوق 61d4158.

    هذه هي الـSHA المؤهلة للهدف maatify/php-persistence:1.0.0-rc.1 بعد نجاح 22/22 وظيفة مطلوبة وفحص أرشيفَي Git وComposer على الـSHA نفسها. WU-11 مكتملة، والحزمة Development / Unpublished، وWU-12 تنتظر تصريحًا مستقلًا.

    CI على main · فحص الأرشيفين

    سجل إعادة التأهيل

  28. megyptm commented on Nov 12, 2026

    @megyptm
    CollaboratorAuthor

    1.0.0-rc.1 — إعادة تأهيل SHA بعد PR #25

    دُمجت PR #25 بالـSquash بتصريح المالك. أصبح main@4022913974e0378c9990f1ebd0e0ccd15ae25add، Tree 7867d4650d8d59eced574d148a0b75d2cb5f3b08. يعكس هذا الهدف نقل المستودع إلى Maatify-ltd/php-persistence في روابطه الحالية وصف Repository في DEC-004.

    هذه هي الـSHA المؤهلة للهدف maatify/php-persistence:1.0.0-rc.1 بعد نجاح 22/22 وظيفة مطلوبة وفحص أرشيفَي Git وComposer على الـSHA نفسها. WU-11 مكتملة، والحزمة Development / Unpublished. WU-12 تنتظر تصريحًا مستقلًا.

    CI على main · فحص الأرشيفين

    سجل إعادة التأهيل

  29. megyptm commented on Nov 14, 2026

    @megyptm
    CollaboratorAuthor

    حالة أول Release Candidate

    نُشرت maatify/php-persistence:1.0.0-rc.1 على Packagist كنسخة تجريبية. يشير الوسم v1.0.0-rc.1 وحزمة dist إلى 34c3b874525d36ae064c162cdd553bc75d18772b.

    نجح تثبيت النسخة الدقيقة من Packagist وتشغيل Consumer Harness عليها. دليل التحقق.

    تظل #29 مفتوحة لتسجيل تجربة نفس النسخة 1.0.0-rc.1 في مشروعين حقيقيين مستقلين. تُراجع أدلة التجربة قبل اتخاذ قرار أول إصدار Stable.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions