{
  "generatedAt": "2026-06-27T12:03:38.075Z",
  "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"
    }
  ],
  "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"
    }
  ],
  "executionLog": [
    {
      "stepId": "F01",
      "phase": "auth",
      "method": "POST",
      "path": "/api/auth/otp",
      "status": "pass",
      "durationMs": 1,
      "httpStatus": 200,
      "timestamp": "2026-06-27T12:03:38.072Z"
    },
    {
      "stepId": "F02",
      "phase": "auth",
      "method": "POST",
      "path": "/api/auth/verify",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T12:03:38.072Z"
    },
    {
      "stepId": "F03",
      "phase": "auth",
      "method": "GET",
      "path": "/api/auth/me",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T12:03:38.072Z"
    },
    {
      "stepId": "F04",
      "phase": "onboarding",
      "method": "POST",
      "path": "/api/onboarding",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T12:03:38.073Z"
    },
    {
      "stepId": "F05",
      "phase": "onboarding",
      "method": "GET",
      "path": "/api/onboarding/{id}",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T12:03:38.073Z"
    },
    {
      "stepId": "F06",
      "phase": "onboarding",
      "method": "PATCH",
      "path": "/api/onboarding/{id}/steps/{step}",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T12:03:38.073Z"
    },
    {
      "stepId": "F07",
      "phase": "onboarding",
      "method": "POST",
      "path": "/api/onboarding/{id}/submit",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T12:03:38.073Z"
    },
    {
      "stepId": "F08",
      "phase": "scoring",
      "method": "GET",
      "path": "/api/onboarding/{id}/status",
      "status": "pass",
      "durationMs": 1,
      "httpStatus": 200,
      "message": "phase=geo",
      "timestamp": "2026-06-27T12:03:38.074Z"
    },
    {
      "stepId": "F09",
      "phase": "scoring",
      "method": "GET",
      "path": "/api/scoring/satellite-image",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T12:03:38.074Z"
    },
    {
      "stepId": "F11",
      "phase": "reference",
      "method": "GET",
      "path": "/api/reference/options",
      "status": "pass",
      "durationMs": 0,
      "httpStatus": 200,
      "timestamp": "2026-06-27T12:03:38.074Z"
    },
    {
      "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-27T12:03:38.075Z"
    },
    {
      "stepId": "F13",
      "phase": "internal",
      "method": "POST",
      "path": "worker:/api/analyze",
      "status": "skip",
      "durationMs": 0,
      "message": "AGRI_ACCESS_WORKER_URL not set",
      "timestamp": "2026-06-27T12:03:38.075Z"
    }
  ]
}