{
  "prepared": "2026-07-14",
  "method": "5 parallel code audits vs prior market evidence (FINDINGS.md, removed) + FEATURES.md claims; cross-checked against 15 easycommerce-* addons",
  "_docs": {
    "role": "machine-readable mirror of FEATURE_GAP_AUDIT.md — keep in sync when either changes",
    "source_of_truth": "FEATURE_GAP_AUDIT.md",
    "derived": ["ROADMAP_RECOMMENDATION.md", "MARKETING_CLAIMS_AUDIT.md"]
  },
  "status_legend": ["PRODUCTION_READY", "IMPLEMENTED_UNVERIFIED", "PARTIAL", "ADDON_ONLY", "MISSING", "NOT_RECOMMENDED", "UNKNOWN"],
  "findings": [
    { "id": "A01", "capability": "Payment attempt entity", "claimed": false, "status": "MISSING", "evidence": "app/Config/tables.php:295,326 (only orders+transactions)", "gaps": "no attempt lifecycle entity", "opp": "EC-OPP-002", "priority": "P0" },
    { "id": "A02", "capability": "Immutable payment event ledger", "claimed": false, "status": "MISSING", "evidence": "app/Models/Transaction.php:130 (mutable)", "gaps": "no append-only event store", "opp": "EC-OPP-002", "priority": "P0" },
    { "id": "A03", "capability": "Gateway idempotency", "claimed": false, "status": "PARTIAL", "evidence": "outbound only: Mollie.php:258, Square.php:398", "gaps": "no inbound/webhook/txn idempotency", "opp": "EC-OPP-002", "priority": "P0" },
    { "id": "A04", "capability": "Webhook deduplication", "claimed": false, "status": "MISSING", "evidence": "Stripe/API/Webhook.php:55,68 (no event.id store)", "gaps": "replays reprocess", "opp": "EC-OPP-002", "priority": "P0" },
    { "id": "A05", "capability": "Payment retry", "claimed": "roadmap", "status": "PARTIAL", "evidence": "app/API/Order.php:223 (cart unlock only)", "gaps": "no server-side retry", "opp": "EC-OPP-002", "priority": "P0" },
    { "id": "A06", "capability": "Processor reconciliation", "claimed": false, "status": "MISSING", "evidence": "no reconcile code in app/API/Order.php|Transaction.php", "gaps": "cannot re-query gateway", "opp": "EC-OPP-002", "priority": "P0" },
    { "id": "A07", "capability": "Payment/refund timeline", "claimed": false, "status": "MISSING", "evidence": "order screen status only", "gaps": "no event trace", "opp": "EC-OPP-001", "priority": "P0" },
    { "id": "A08", "capability": "Gateway health checks", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-001", "priority": "P0" },
    { "id": "A09", "capability": "Checkout smoke test", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-001", "priority": "P0" },
    { "id": "A10", "capability": "Update preflight", "claimed": false, "status": "MISSING", "evidence": "app/Bootstrap/Installer.php:155 (dbDelta, no report)", "gaps": "-", "opp": "EC-OPP-003", "priority": "P0" },
    { "id": "A11", "capability": "Automatic safe mode", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-003", "priority": "P0" },
    { "id": "A12", "capability": "Rollback", "claimed": false, "status": "MISSING", "evidence": "schema update no txn/rollback", "gaps": "-", "opp": "EC-OPP-003", "priority": "P0" },
    { "id": "A13", "capability": "Addon compatibility declarations", "claimed": false, "status": "MISSING", "evidence": "only WP Requires Plugins header", "gaps": "no version-range enforcement", "opp": "EC-OPP-003", "priority": "P0" },
    { "id": "A14", "capability": "Migration preflight", "claimed": true, "status": "PARTIAL", "evidence": "easycommerce-migration addon; no preflight scan", "gaps": "no dry-run preflight", "opp": "EC-OPP-004", "priority": "P0" },
    { "id": "A15", "capability": "Migration dry run", "claimed": false, "status": "MISSING", "evidence": "not in easycommerce-migration", "gaps": "-", "opp": "EC-OPP-004", "priority": "P0" },
    { "id": "A16", "capability": "Migration reconciliation", "claimed": true, "status": "MISSING", "evidence": "no reconcile logic in addon; contradicts FEATURES.md:1570", "gaps": "no integrity totals", "opp": "EC-OPP-004", "priority": "P0" },
    { "id": "A17", "capability": "Migration rollback", "claimed": false, "status": "MISSING", "evidence": "clear_existing destructive, no backup (migration/app/API/Migration.php:57)", "gaps": "-", "opp": "EC-OPP-004", "priority": "P0" },
    { "id": "A18", "capability": "WooCommerce migration", "claimed": true, "status": "ADDON_ONLY", "evidence": "easycommerce-migration/app/Sources/WooCommerce.php v1.1.2", "gaps": "redirects, reconciliation", "opp": "EC-OPP-004", "priority": "P0" },
    { "id": "A19", "capability": "EDD migration", "claimed": true, "status": "ADDON_ONLY", "evidence": "easycommerce-migration/app/Sources/EasyDigitalDownload.php", "gaps": "redirects, reconciliation", "opp": "EC-OPP-004", "priority": "P0" },
    { "id": "A20", "capability": "SureCart migration", "claimed": true, "status": "ADDON_ONLY", "evidence": "easycommerce-migration/app/Sources/SureCart.php", "gaps": "redirects, reconciliation", "opp": "EC-OPP-004", "priority": "P0" },
    { "id": "A21", "capability": "FluentCart migration", "claimed": false, "status": "MISSING", "evidence": "no source adapter", "gaps": "-", "opp": "EC-OPP-004", "priority": "P1" },
    { "id": "A22", "capability": "Funnel event collection", "claimed": "unclear", "status": "MISSING", "evidence": "app/API/Cart.php:108 (transient do_action); no event table", "gaps": "no behavioral events", "opp": "EC-OPP-006", "priority": "P1" },
    { "id": "A23", "capability": "Checkout conversion report", "claimed": false, "status": "MISSING", "evidence": "app/API/Reports/* post-purchase only", "gaps": "no stage rates", "opp": "EC-OPP-006", "priority": "P1" },
    { "id": "A24", "capability": "Payment failure analytics", "claimed": false, "status": "MISSING", "evidence": "app/Models/Cart.php:1304 (counter not events)", "gaps": "-", "opp": "EC-OPP-006", "priority": "P1" },
    { "id": "A25", "capability": "AI-assisted revenue attribution", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-006", "priority": "P1" },
    { "id": "A26", "capability": "Transactional email log", "claimed": true, "status": "MISSING", "evidence": "app/Helpers/Email.php:329 (records nothing)", "gaps": "no delivery log", "opp": "EC-OPP-007", "priority": "P1" },
    { "id": "A27", "capability": "Duplicate email prevention", "claimed": false, "status": "MISSING", "evidence": "no guard in Email.php", "gaps": "-", "opp": "EC-OPP-007", "priority": "P1" },
    { "id": "A28", "capability": "Template validation", "claimed": false, "status": "MISSING", "evidence": "app/Helpers/Email.php:314 (blind str_replace)", "gaps": "-", "opp": "EC-OPP-007", "priority": "P1" },
    { "id": "A29", "capability": "Per-product email instructions", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-007", "priority": "P1" },
    { "id": "A30", "capability": "Conditional workflow engine", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-007", "priority": "P1" },
    { "id": "A31", "capability": "Subscription trials", "claimed": "conflict", "status": "MISSING", "evidence": "Stripe.php:303 passive read only", "gaps": "no trial config", "opp": "EC-OPP-011", "priority": "P1" },
    { "id": "A32", "capability": "Setup fees", "claimed": "roadmap", "status": "MISSING", "evidence": "no fee field", "gaps": "-", "opp": "EC-OPP-011", "priority": "P1" },
    { "id": "A33", "capability": "Upgrade/downgrade", "claimed": "roadmap", "status": "MISSING", "evidence": "no plan-swap logic", "gaps": "-", "opp": "EC-OPP-011", "priority": "P1" },
    { "id": "A34", "capability": "Proration", "claimed": false, "status": "MISSING", "evidence": "Stripe.php:348 renewal-discount delta only", "gaps": "-", "opp": "EC-OPP-011", "priority": "P1" },
    { "id": "A35", "capability": "Grace period / dunning", "claimed": false, "status": "MISSING", "evidence": "single on_hold flip + email", "gaps": "no retry cadence", "opp": "EC-OPP-011", "priority": "P1" },
    { "id": "A36", "capability": "Customer payment update", "claimed": false, "status": "MISSING", "evidence": "dashboard SPA read-only payment method", "gaps": "-", "opp": "EC-OPP-011", "priority": "P1" },
    { "id": "A37", "capability": "Subscription analytics", "claimed": false, "status": "MISSING", "evidence": "no MRR/ARR/churn code in addon", "gaps": "-", "opp": "EC-OPP-011", "priority": "P1" },
    { "id": "A38", "capability": "Regional gateway SDK", "claimed": true, "status": "PARTIAL", "evidence": "Abstracts/Payment_Method + supports_recurring filter; no cert suite", "gaps": "no certification/contract tests", "opp": "EC-OPP-008", "priority": "P1" },
    { "id": "A39", "capability": "Gateway certification tests", "claimed": false, "status": "MISSING", "evidence": "phpcs excludes Controllers/Payment/", "gaps": "-", "opp": "EC-OPP-008", "priority": "P1" },
    { "id": "A40", "capability": "Tracking numbers", "claimed": true, "status": "MISSING", "evidence": "no tracking_number column/meta", "gaps": "-", "opp": "EC-OPP-009", "priority": "P1" },
    { "id": "A41", "capability": "Multiple shipments", "claimed": false, "status": "MISSING", "evidence": "single fulfill_status enum tables.php:301", "gaps": "-", "opp": "EC-OPP-009", "priority": "P1" },
    { "id": "A42", "capability": "Shipping labels", "claimed": false, "status": "MISSING", "evidence": "DHL/FedEx addons do rates not labels", "gaps": "-", "opp": "EC-OPP-009", "priority": "P1" },
    { "id": "A43", "capability": "ShipStation", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-009", "priority": "P1" },
    { "id": "A44", "capability": "Returns / RMA", "claimed": false, "status": "MISSING", "evidence": "only 'returned' enum value", "gaps": "-", "opp": "EC-OPP-009", "priority": "P2" },
    { "id": "A45", "capability": "EU VAT", "claimed": false, "status": "MISSING", "evidence": "no VAT logic", "gaps": "-", "opp": "EC-OPP-010", "priority": "P1" },
    { "id": "A46", "capability": "Indian GST", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-010", "priority": "P1" },
    { "id": "A47", "capability": "VAT ID / reverse charge", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-010", "priority": "P1" },
    { "id": "A48", "capability": "Sequential invoices", "claimed": "addon", "status": "ADDON_ONLY", "evidence": "app/API/Addon.php:37 easycommerce-pdf-invoice slug", "gaps": "unverified", "opp": "EC-OPP-010", "priority": "P1" },
    { "id": "A49", "capability": "Credit notes", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-010", "priority": "P1" },
    { "id": "A50", "capability": "Locale-aware currency / inclusive pricing", "claimed": true, "status": "PARTIAL", "evidence": "currency list present; no tax-inclusive pricing", "gaps": "inclusive pricing missing", "opp": "EC-OPP-010", "priority": "P1" },
    { "id": "A51", "capability": "Role-based pricing", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-012", "priority": "P2" },
    { "id": "A52", "capability": "Tier/quantity pricing", "claimed": false, "status": "MISSING", "evidence": "flat regular/sale only", "gaps": "-", "opp": "EC-OPP-012", "priority": "P2" },
    { "id": "A53", "capability": "Pay what you want", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-012", "priority": "P2" },
    { "id": "A54", "capability": "Request a quote", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-012", "priority": "P2" },
    { "id": "A55", "capability": "Purchase orders / net terms", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-012", "priority": "P2" },
    { "id": "A56", "capability": "External digital storage", "claimed": true, "status": "MISSING", "evidence": "local readfile Admin/Init.php:272", "gaps": "no S3/R2", "opp": "EC-OPP-013", "priority": "P1" },
    { "id": "A57", "capability": "Signed expiring URLs", "claimed": false, "status": "MISSING", "evidence": "functions.php:1076 no token/expiry", "gaps": "login-gated only", "opp": "EC-OPP-013", "priority": "P1" },
    { "id": "A58", "capability": "PDF watermarking", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-013", "priority": "P2" },
    { "id": "A59", "capability": "Download audit log", "claimed": true, "status": "MISSING", "evidence": "Admin/Init.php:253 streams, no log", "gaps": "-", "opp": "EC-OPP-013", "priority": "P1" },
    { "id": "A60", "capability": "Refund revokes access", "claimed": true, "status": "PARTIAL", "evidence": "Customer.php:285 status gate; refunded excluded", "gaps": "partially_refunded still grants; limits ignored Product_Variation.php:474", "opp": "EC-OPP-013", "priority": "P1" },
    { "id": "A61", "capability": "Product schema", "claimed": false, "status": "UNKNOWN", "evidence": "not deeply audited", "gaps": "needs schema check", "opp": "EC-OPP-014", "priority": "P2" },
    { "id": "A62", "capability": "Canonical URLs", "claimed": false, "status": "UNKNOWN", "evidence": "CPT default; not audited", "gaps": "-", "opp": "EC-OPP-014", "priority": "P2" },
    { "id": "A63", "capability": "Product sitemap", "claimed": false, "status": "UNKNOWN", "evidence": "not audited", "gaps": "-", "opp": "EC-OPP-014", "priority": "P2" },
    { "id": "A64", "capability": "Redirect manager", "claimed": false, "status": "MISSING", "evidence": "none (also missing in migration addon)", "gaps": "-", "opp": "EC-OPP-014", "priority": "P2" },
    { "id": "A65", "capability": "Google product feed", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-014", "priority": "P2" },
    { "id": "A66", "capability": "Full Site Editing", "claimed": true, "status": "PARTIAL", "evidence": "13 blocks + patterns blocks/; FSE templates unverified", "gaps": "-", "opp": "EC-OPP-015", "priority": "P2" },
    { "id": "A67", "capability": "Bricks compatibility", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-015", "priority": "P2" },
    { "id": "A68", "capability": "Accessibility regression tests", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-015", "priority": "P1" },
    { "id": "A69", "capability": "Mobile checkout tests", "claimed": true, "status": "MISSING", "evidence": "CartAPITest mostly skipped", "gaps": "-", "opp": "EC-OPP-015", "priority": "P1" },
    { "id": "A70", "capability": "Consent / telemetry controls", "claimed": true, "status": "PARTIAL", "evidence": "survey opt-in; no granular AI/telemetry consent center", "gaps": "-", "opp": "EC-OPP-005", "priority": "P0" },
    { "id": "A71", "capability": "AI data minimization", "claimed": true, "status": "UNKNOWN", "evidence": "app/Services/AI.php routes to Hub; minimization not enforced/documented", "gaps": "needs review", "opp": "EC-OPP-005", "priority": "P0" },
    { "id": "A72", "capability": "Data export", "claimed": true, "status": "PARTIAL", "evidence": "WP-native data; no one-click store export", "gaps": "-", "opp": "EC-OPP-005", "priority": "P0" },
    { "id": "A73", "capability": "Security disclosure policy", "claimed": false, "status": "MISSING", "evidence": "not in repo", "gaps": "doc/process", "opp": "EC-OPP-005", "priority": "P0" },
    { "id": "A74", "capability": "Sanitized support bundle", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-001", "priority": "P1" },
    { "id": "A75", "capability": "Addon scaffolding / CLI", "claimed": true, "status": "PARTIAL", "evidence": "consistent addon skeleton; no scaffolding CLI", "gaps": "-", "opp": "EC-OPP-015", "priority": "P2" },
    { "id": "A76", "capability": "Addon compatibility test suite", "claimed": false, "status": "MISSING", "evidence": "none", "gaps": "-", "opp": "EC-OPP-015", "priority": "P1" },
    { "id": "A77", "capability": "Searchable settings", "claimed": false, "status": "MISSING", "evidence": "static settings tree app/Config/settings.php", "gaps": "-", "opp": "EC-OPP-017", "priority": "P2" },
    { "id": "A78", "capability": "Store-type presets", "claimed": true, "status": "PARTIAL", "evidence": "wizard exists spa/admin/wizard; no presets", "gaps": "-", "opp": "EC-OPP-017", "priority": "P2" },
    { "id": "A79", "capability": "AI Checkout Doctor prerequisites", "claimed": true, "status": "MISSING", "evidence": "needs A01-A08 ledger/health first", "gaps": "blocked on P0", "opp": "EC-OPP-001", "priority": "P3" },
    { "id": "A80", "capability": "AI action approvals & audit", "claimed": true, "status": "PARTIAL", "evidence": "Copilot logs + confirms destructive ops FEATURES.md:172; scoping not formalized", "gaps": "needs scoped permissions", "opp": "EC-OPP-005", "priority": "P0" }
  ],
  "addons_present": [
    "easycommerce-migration@1.1.2", "easycommerce-subscriptions", "easycommerce-license", "easycommerce-dhl@0.9",
    "easycommerce-fedex@0.9", "easycommerce-hitpay", "easycommerce-paddle", "easycommerce-zapier@1.0.0",
    "easycommerce-messenger", "easycommerce-points-and-rewards", "easycommerce-sliding-cart", "easycommerce-wishlist",
    "easycommerce-ai", "easycommerce-pro", "easycommerce-token"
  ],
  "recommended_build_order": [
    { "phase": "P0", "item": "Payment Reliability Hardening (event store + dedup + UNIQUE(transaction_id) + concurrency lock + order timeline)" },
    { "phase": "P1", "item": "Order Fulfillment Tracking (tracking# + carrier + shipped email + dashboard)" },
    { "phase": "P1", "item": "Native Funnel Analytics MVP (wp_ec_events + beacon + emitters + funnel report)" },
    { "phase": "P2", "item": "Email Delivery Center (log + resend + test + snapshot names)" },
    { "phase": "P2", "item": "Subscription Lifecycle Depth (trial/setup-fee/pause/dunning/self-service/MRR)" }
  ],
  "deferred": ["EC-OPP-003 update-guard", "EC-OPP-010 full tax/VAT", "EC-OPP-012 B2B pricing", "multivendor", "native apps"],
  "corrections_to_findings": [
    "Migration is shipped (easycommerce-migration v1.1.2), not missing",
    "Carrier rates shipped (DHL + FedEx addons)",
    "Regional gateways shipped (HitPay, Paddle)",
    "CLAUDE.md known-bug #1 (cart-lock ENUM) already fixed: payment_initiated present at tables.php:457"
  ]
}
