{
  "provenance": "Copied subset of supplied docs/feature_coverage.json. Coverage status was not independently reclassified.",
  "summary": {
    "app": "HaatPotro",
    "requirements": 12,
    "implemented_local": 6,
    "partial": 3,
    "blocked": 3
  },
  "requirements": [
    {
      "id": "HP-F01",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Store onboarding",
      "original_priority": "P0",
      "source_requirement": "Create a tenant, owner account, bilingual shop profile, return policy and preview storefront before allowing publication.\nAcceptance: An incomplete return policy blocks store publication with a clear Bengali error.",
      "status": "implemented_local",
      "implementation_scope": "Bilingual shop profile, return-policy completeness, current preview, publication state and whitelisted anonymous catalogue route.",
      "residual_limitation": "Checkout is authenticated. Custom-domain deployment and native-language/error-flow acceptance are not completed by local tests.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py",
        "suite/server.py",
        "suite/__main__.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_publication_requires_both_policies_and_current_preview"
        },
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_public_catalog_is_explicitly_whitelisted_and_requires_publication"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    },
    {
      "id": "HP-F02",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Catalogue and variants",
      "original_priority": "P0",
      "source_requirement": "Manage bilingual names, SKU, size/color variants, unit, images, price history and active status without reusing retired SKUs.\nAcceptance: Two variants in one tenant cannot share an SKU; another tenant may use the same local SKU.",
      "status": "implemented_local",
      "implementation_scope": "Tenant-unique bilingual SKU variants, unit, HTTPS image reference, price history and irreversible retirement.",
      "residual_limitation": "Images are references; managed image upload, scanning and storage are not supplied.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_customer_scope_phone_normalization_and_price_tampering"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    },
    {
      "id": "HP-F03",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Inventory reservation",
      "original_priority": "P0",
      "source_requirement": "Reserve sellable quantity atomically with expiry, release cancelled or expired holds and prohibit negative available stock.\nAcceptance: With one available unit and two simultaneous checkouts, exactly one reservation succeeds.",
      "status": "implemented_local",
      "implementation_scope": "Transactional stock holds, non-negative availability, expiry and cancellation release with explicit/lazy and worker processing.",
      "residual_limitation": "The operator must run/supervise the worker; no production capacity or distributed allocation claim is made.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py",
        "suite/server.py",
        "suite/__main__.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_last_unit_concurrent_checkout_has_exactly_one_winner"
        },
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_cancel_expiry_and_replays_release_exactly_once"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    },
    {
      "id": "HP-F04",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Bangladesh checkout",
      "original_priority": "P0",
      "source_requirement": "Collect configurable district, upazila/thana, area and delivery instructions; normalize phone input while keeping customer data minimal.\nAcceptance: A shared family phone is accepted; checkout does not demand an NID or assume phone equals person.",
      "status": "implemented_local",
      "implementation_scope": "Configurable served districts, upazila/thana, area, instructions and normalized Bangladesh phone digits without NID or phone identity.",
      "residual_limitation": "No authoritative administrative-area master-data integration is supplied.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_customer_scope_phone_normalization_and_price_tampering"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    },
    {
      "id": "HP-F05",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Verified digital payment",
      "original_priority": "P0",
      "source_requirement": "Use an onboarded merchant gateway; verify amount, currency, merchant and provider transaction server-side before marking paid.\nAcceptance: A successful browser redirect with a mismatched amount never marks the order paid.",
      "status": "blocked",
      "implementation_scope": "A deliberate 503 live-payment boundary rejects browser success flags and user-asserted digital capture.",
      "residual_limitation": "Merchant onboarding, gateway verification and signed/idempotent callback integration are not implemented.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_delivery_is_not_cash_settlement_and_digital_redirect_cannot_pay"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    },
    {
      "id": "HP-F06",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Cash-on-delivery control",
      "original_priority": "P0",
      "source_requirement": "Record COD confirmation, collection expectation, courier remittance and reconciliation separately from prepaid orders.\nAcceptance: Delivery alone does not mark COD money settled; remittance evidence is required.",
      "status": "implemented_local",
      "implementation_scope": "COD confirmation, collection expectation, delivery and evidence-backed partial manual remittance remain separate.",
      "residual_limitation": "Courier/bank statements are entered by operators, not verified through an external provider connection.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_delivery_is_not_cash_settlement_and_digital_redirect_cannot_pay"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    },
    {
      "id": "HP-F07",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Order operations",
      "original_priority": "P0",
      "source_requirement": "Provide pick lists, packing slips, partial fulfilment permissions and a versioned state history with staff identity.\nAcceptance: A cancelled order cannot be packed; a stale update returns a conflict instead of overwriting changes.",
      "status": "partial",
      "implementation_scope": "Guarded whole-order operations, versioned staff history and printable pick/packing documents.",
      "residual_limitation": "Partial fulfilment is not implemented.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_cancel_expiry_and_replays_release_exactly_once"
        },
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_delivery_is_not_cash_settlement_and_digital_redirect_cannot_pay"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    },
    {
      "id": "HP-F08",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Courier adapter",
      "original_priority": "P1",
      "source_requirement": "Start with manual consignment capture; enable provider APIs only after contract, service-area, credentials and webhook tests are complete.\nAcceptance: A repeated courier callback creates one tracking event per provider event ID.",
      "status": "partial",
      "implementation_scope": "Manual courier name and consignment reference are captured during fulfilment.",
      "residual_limitation": "Provider booking APIs and deduplicated courier callbacks are not connected.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_delivery_is_not_cash_settlement_and_digital_redirect_cannot_pay"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    },
    {
      "id": "HP-F09",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Returns and refunds",
      "original_priority": "P0",
      "source_requirement": "Link returns to delivered order lines; inspect condition, choose restock or reject and require an authorized refund approval.\nAcceptance: Cumulative refunded value cannot exceed captured value; return quantity cannot exceed delivered quantity.",
      "status": "partial",
      "implementation_scope": "Delivered-line return caps, inspection/restocking, bounded owner refund approval and unique manual cash settlement.",
      "residual_limitation": "Automated digital refunds, exchanges and delivery-fee refunds are not implemented.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_return_quantity_refund_cap_and_duplicate_settlement"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    },
    {
      "id": "HP-F10",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Offline POS bridge",
      "original_priority": "P1",
      "source_requirement": "Allow bounded offline sales only from allocated device stock; reconcile immutable sale events rather than overwriting online balances.\nAcceptance: Two devices cannot spend the same offline stock allocation; duplicate sync is idempotent.",
      "status": "blocked",
      "implementation_scope": "No offline sale mutation is accepted.",
      "residual_limitation": "Device stock allocation and immutable offline POS event synchronization are not implemented.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py"
      ],
      "test_references": [],
      "verification_note": "Implementation/status is source-reviewed here; no dedicated feature test is cited. Consult final suite evidence and required human reviews."
    },
    {
      "id": "HP-F11",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Customer notifications",
      "original_priority": "P1",
      "source_requirement": "Provide neutral order updates, opt-in marketing and Bengali Unicode cost previews; never put payment secrets in SMS.\nAcceptance: Transactional and promotional consent are separate; marketing opt-out stops cart-recovery messages.",
      "status": "blocked",
      "implementation_scope": "No customer message is sent by this application.",
      "residual_limitation": "Neutral delivery messaging, separate marketing consent, SMS Unicode cost preview and cart-reminder opt-out workflow are not implemented.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py"
      ],
      "test_references": [],
      "verification_note": "Implementation/status is source-reviewed here; no dedicated feature test is cited. Consult final suite evidence and required human reviews."
    },
    {
      "id": "HP-F12",
      "app": "HaatPotro",
      "slug": "haatpotro",
      "source_title": "Store health dashboard",
      "original_priority": "P0",
      "source_requirement": "Report orders, paid revenue, returns, stock exceptions and unsettled COD separately; export filter-matched audit data.\nAcceptance: Cancelled and unpaid orders are excluded from paid-revenue totals.",
      "status": "implemented_local",
      "implementation_scope": "Operational order/stock/return metrics, collected-less-refunded revenue and unsettled COD derive from persisted rows.",
      "residual_limitation": "External provider aging/reconciliation analytics and production monitoring remain separate.",
      "evidence_paths": [
        "docs/blueprint_requirements.json",
        "docs/COMMERCE_SCHOOL.md",
        "suite/apps/haatpotro.py",
        "tests/test_commerce_school.py"
      ],
      "test_references": [
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_delivery_is_not_cash_settlement_and_digital_redirect_cannot_pay"
        },
        {
          "path": "tests/test_commerce_school.py",
          "class": "HaatPotroTests",
          "method": "test_return_quantity_refund_cap_and_duplicate_settlement"
        }
      ],
      "verification_note": "Listed tests support the named invariants, not every sentence of the original feature or production operation."
    }
  ]
}