{
  "generatedAt": "2026-06-27T16:03:53.308Z",
  "summary": {
    "total": 12,
    "passed": 10,
    "failed": 0,
    "skipped": 2
  },
  "functionalFlow": [
    {
      "id": "F01",
      "phase": "auth",
      "method": "POST",
      "path": "/api/auth/otp",
      "description": "Send OTP to farmer phone",
      "responseSchema": "OtpSentResponse"
    },
    {
      "id": "F02",
      "phase": "auth",
      "method": "POST",
      "path": "/api/auth/verify",
      "description": "Verify OTP → JWT cookie",
      "dbEntities": [
        "User"
      ],
      "responseSchema": "VerifyResponse"
    },
    {
      "id": "F03",
      "phase": "auth",
      "method": "GET",
      "path": "/api/auth/me",
      "description": "Load authenticated user + active session",
      "dbEntities": [
        "User",
        "OnboardingSession"
      ],
      "responseSchema": "UserMeResponse"
    },
    {
      "id": "F04",
      "phase": "onboarding",
      "method": "POST",
      "path": "/api/onboarding",
      "description": "Create or resume onboarding session",
      "dbEntities": [
        "OnboardingSession"
      ],
      "responseSchema": "OnboardingSession"
    },
    {
      "id": "F05",
      "phase": "onboarding",
      "method": "GET",
      "path": "/api/onboarding/{id}",
      "description": "Fetch session with stepData",
      "dbEntities": [
        "OnboardingSession"
      ],
      "responseSchema": "OnboardingSession"
    },
    {
      "id": "F06",
      "phase": "onboarding",
      "method": "PATCH",
      "path": "/api/onboarding/{id}/steps/{step}",
      "description": "Persist step payload → stepData + normalized tables",
      "dbEntities": [
        "OnboardingSession",
        "OnboardingStepRecord",
        "FarmerProfile",
        "LandParcel",
        "CropPlan",
        "FarmAsset",
        "Document"
      ],
      "responseSchema": "OnboardingSession"
    },
    {
      "id": "F07",
      "phase": "onboarding",
      "method": "POST",
      "path": "/api/onboarding/{id}/submit",
      "description": "Submit for scoring → status=scoring",
      "dbEntities": [
        "OnboardingSession"
      ],
      "responseSchema": "OnboardingSession"
    },
    {
      "id": "F08",
      "phase": "scoring",
      "method": "GET",
      "path": "/api/onboarding/{id}/status",
      "description": "Poll scoringPhase, score, scoringMeta",
      "dbEntities": [
        "ScoringRun",
        "FinanceCase",
        "ScoringAudit"
      ],
      "responseSchema": "OnboardingStatusResponse"
    },
    {
      "id": "F09",
      "phase": "scoring",
      "method": "GET",
      "path": "/api/scoring/satellite-image",
      "description": "Proxy NASA GIBS thumbnail (allowlist)",
      "responseSchema": "binary"
    },
    {
      "id": "F10",
      "phase": "dashboard",
      "method": "GET",
      "path": "/api/farmer/dashboard",
      "description": "Finance module with riskPd, cbuClass",
      "dbEntities": [
        "FinanceCase",
        "ScoringRun"
      ],
      "responseSchema": "FarmerDashboardResponse"
    },
    {
      "id": "F11",
      "phase": "reference",
      "method": "GET",
      "path": "/api/reference/options",
      "description": "Localized reference catalog",
      "dbEntities": [
        "ReferenceOption"
      ],
      "responseSchema": "ReferenceOption[]"
    },
    {
      "id": "F12",
      "phase": "documents",
      "method": "POST",
      "path": "/api/documents/upload",
      "description": "Multipart document upload",
      "dbEntities": [
        "Document"
      ],
      "responseSchema": "DocumentUploadResponse"
    },
    {
      "id": "F13",
      "phase": "internal",
      "method": "POST",
      "path": "worker:/api/analyze",
      "description": "Agri-Access worker scoring (internal)",
      "responseSchema": "AgriAccessAnalyzeResponse"
    },
    {
      "id": "F14",
      "phase": "internal",
      "method": "GET",
      "path": "worker:/api/model-status",
      "description": "Worker health probe",
      "responseSchema": "ModelStatusResponse"
    },
    {
      "id": "F15",
      "phase": "internal",
      "method": "POST",
      "path": "core:/onboarding/{id}/submit",
      "description": "Core-api scoring orchestration",
      "dbEntities": [
        "ScoringRun",
        "ScoringAudit",
        "FinanceCase"
      ],
      "responseSchema": "OnboardingSession"
    },
    {
      "id": "F16",
      "phase": "dashboard",
      "method": "GET",
      "path": "/api/farmer/dashboard",
      "description": "Identity module enrich — farmerId, ekyc, gis, landEvidence, yieldHistory, compliance",
      "dbEntities": [
        "FarmerProfile",
        "KycRecord",
        "LandParcel",
        "Document",
        "YieldHistory",
        "EligibilityRuleResult"
      ],
      "responseSchema": "IdentityModuleV2"
    },
    {
      "id": "F17",
      "phase": "dashboard",
      "method": "GET",
      "path": "/api/farmer/dashboard",
      "description": "Finance module enrich — eligibilityScore, routedInstitution, sla, bankMatches, documents, stages",
      "dbEntities": [
        "FinanceCase",
        "ScoringRun",
        "InstitutionMatch",
        "Document"
      ],
      "responseSchema": "FinanceModuleV2"
    },
    {
      "id": "F18",
      "phase": "dashboard",
      "method": "GET",
      "path": "/api/farmer/dashboard",
      "description": "Inputs module enrich — kpis, suppliers, catalog, voucher, delivery",
      "dbEntities": [
        "CatalogAggregate",
        "Supplier",
        "ProductCatalog",
        "InputVoucher",
        "DeliveryShipment"
      ],
      "responseSchema": "InputsModuleV2"
    }
  ],
  "dbApiSync": [
    {
      "db": "ScoringRun.totalScore",
      "api": "OnboardingStatusResponse.score",
      "transform": "0–1000 integer"
    },
    {
      "db": "ScoringRun.decision",
      "api": "OnboardingStatusResponse.eligibilityOutcome",
      "transform": "eligible|conditional|not_eligible"
    },
    {
      "db": "ScoringRun.rulesResult.reasonCodes",
      "api": "OnboardingStatusResponse.reasonCodes",
      "transform": "RC_* array"
    },
    {
      "db": "ScoringRun.rulesResult.scoringMeta",
      "api": "OnboardingStatusResponse.scoringMeta",
      "transform": "nested object"
    },
    {
      "db": "FinanceCase.publicCaseId",
      "api": "OnboardingStatusResponse.financeCaseId",
      "transform": "AGN-FIN-*"
    },
    {
      "db": "FinanceCase.status",
      "api": "OnboardingStatusResponse.financeCaseStatus",
      "transform": "enum"
    },
    {
      "db": "OnboardingSession.stepData.SCORING",
      "api": "StepScoringData",
      "transform": "wizard persist"
    },
    {
      "db": "ScoringAudit.inputSnapshotHash",
      "api": "—",
      "transform": "SHA-256 of stepData (immutable)"
    },
    {
      "db": "ScoringAudit.outputSnapshot",
      "api": "scoringMeta (redacted)",
      "transform": "append-only audit"
    },
    {
      "db": "FinanceCase.notes (JSON)",
      "api": "FinanceModule.riskPd/riskRating",
      "transform": "dashboard enrich"
    },
    {
      "db": "FarmerProfile.publicFarmerId",
      "api": "identity.farmerId",
      "transform": "AGID-FMR-*"
    },
    {
      "db": "FarmerProfile.displayName",
      "api": "identity.farmName",
      "transform": "string"
    },
    {
      "db": "KycRecord.photoUrl",
      "api": "identity.ekyc.photoUrl",
      "transform": "uri"
    },
    {
      "db": "KycRecord.dob",
      "api": "identity.ekyc.dob",
      "transform": "YYYY-MM-DD"
    },
    {
      "db": "KycRecord.pinflMasked",
      "api": "identity.ekyc.aadhaarMasked",
      "transform": "masked PII"
    },
    {
      "db": "User.phone",
      "api": "identity.ekyc.mobileMasked",
      "transform": "masked phone"
    },
    {
      "db": "LandParcel.geometry",
      "api": "identity.gis.polygonGeoJson",
      "transform": "GeoJSON Polygon"
    },
    {
      "db": "LandParcel.areaHa",
      "api": "identity.gis.areaHa",
      "transform": "number"
    },
    {
      "db": "LandParcel.centroid",
      "api": "identity.gis.lat/lng",
      "transform": "WGS84"
    },
    {
      "db": "Document[] (land)",
      "api": "identity.landEvidence[]",
      "transform": "name,type,verified"
    },
    {
      "db": "YieldHistory",
      "api": "identity.yieldHistory[]",
      "transform": "year,yieldTHa,crop"
    },
    {
      "db": "EligibilityRuleResult[]",
      "api": "identity.compliance[]",
      "transform": "key,label,passed"
    },
    {
      "db": "ScoringRun.totalScore",
      "api": "finance.eligibilityScore",
      "transform": "normalized /100"
    },
    {
      "db": "FinanceCase.routedInstitution",
      "api": "finance.routedInstitution",
      "transform": "name,priority,isBestMatch"
    },
    {
      "db": "FinanceCase.slaDueAt",
      "api": "finance.sla",
      "transform": "remainingHours,totalHours,dueAt"
    },
    {
      "db": "InstitutionMatch[]",
      "api": "finance.bankMatches[]",
      "transform": "name,score,status"
    },
    {
      "db": "Document[] (finance)",
      "api": "finance.documents[]",
      "transform": "name,status"
    },
    {
      "db": "FinanceCase.statusHistory",
      "api": "finance.stages[]",
      "transform": "label,completed"
    },
    {
      "db": "CatalogAggregate",
      "api": "inputs.kpis",
      "transform": "seed,fertiliser,equipment,vouchers,inTransit"
    },
    {
      "db": "Supplier.rating",
      "api": "inputs.suppliers[]",
      "transform": "name,logoUrl,rating"
    },
    {
      "db": "ProductCatalog",
      "api": "inputs.catalog[]",
      "transform": "category,items"
    },
    {
      "db": "InputVoucher",
      "api": "inputs.voucher",
      "transform": "VoucherDetail"
    },
    {
      "db": "DeliveryShipment",
      "api": "inputs.delivery",
      "transform": "DeliveryTracking"
    }
  ],
  "executionLog": [
    {
      "stepId": "F01",
      "phase": "auth",
      "method": "POST",
      "path": "/api/auth/otp",
      "status": "pass",
      "durationMs": 1,
      "httpStatus": 200,
      "timestamp": "2026-06-27T16:03:53.304Z"
    },
    {
      "stepId": "F02",
      "phase": "auth",
      "method": "POST",
      "path": "/api/auth/verify",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T16:03:53.304Z"
    },
    {
      "stepId": "F03",
      "phase": "auth",
      "method": "GET",
      "path": "/api/auth/me",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T16:03:53.304Z"
    },
    {
      "stepId": "F04",
      "phase": "onboarding",
      "method": "POST",
      "path": "/api/onboarding",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T16:03:53.305Z"
    },
    {
      "stepId": "F05",
      "phase": "onboarding",
      "method": "GET",
      "path": "/api/onboarding/{id}",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T16:03:53.305Z"
    },
    {
      "stepId": "F06",
      "phase": "onboarding",
      "method": "PATCH",
      "path": "/api/onboarding/{id}/steps/{step}",
      "status": "pass",
      "durationMs": 1,
      "httpStatus": 200,
      "timestamp": "2026-06-27T16:03:53.306Z"
    },
    {
      "stepId": "F07",
      "phase": "onboarding",
      "method": "POST",
      "path": "/api/onboarding/{id}/submit",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T16:03:53.306Z"
    },
    {
      "stepId": "F08",
      "phase": "scoring",
      "method": "GET",
      "path": "/api/onboarding/{id}/status",
      "status": "pass",
      "durationMs": 1,
      "httpStatus": 200,
      "message": "phase=geo",
      "timestamp": "2026-06-27T16:03:53.307Z"
    },
    {
      "stepId": "F09",
      "phase": "scoring",
      "method": "GET",
      "path": "/api/scoring/satellite-image",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T16:03:53.307Z"
    },
    {
      "stepId": "F11",
      "phase": "reference",
      "method": "GET",
      "path": "/api/reference/options",
      "status": "pass",
      "durationMs": 1,
      "httpStatus": 200,
      "timestamp": "2026-06-27T16:03:53.308Z"
    },
    {
      "stepId": "F14",
      "phase": "internal",
      "method": "GET",
      "path": "worker:/api/model-status",
      "status": "skip",
      "durationMs": 0,
      "message": "AGRI_ACCESS_WORKER_URL not set",
      "timestamp": "2026-06-27T16:03:53.308Z"
    },
    {
      "stepId": "F13",
      "phase": "internal",
      "method": "POST",
      "path": "worker:/api/analyze",
      "status": "skip",
      "durationMs": 0,
      "message": "AGRI_ACCESS_WORKER_URL not set",
      "timestamp": "2026-06-27T16:03:53.308Z"
    }
  ]
}