from crewai import Task """ This task instructs the agent to act as the final decision maker. KEY MECHANISM: 1. CONTEXT CONSUMPTION: It takes the inputs from the Data Agent (Facts) and Policy Agent (Rules). 2. LOGIC GATING: It applies a strict "If X then Y" logic chain. 3. ZERO-TRUST: It enforces a "Silent Policy = Reject" rule. If the policy manual doesn't explicitly allow it, the agent must reject it. """ def create_underwriting_task(agent, context_tasks): return Task( description=( "**INTERNAL RISK REVIEW**\n\n" "**INPUTS**: Review findings from Data Investigator and Policy Researcher.\n\n" "**STRICT EXECUTION RULES**:\n" "1. **Evidence Only**: Every decision must point to a specific data point or policy line provided in the context.\n" "2. **Silent Policy = Reject**: If the policy does not explicitly say 'Approve' for a scenario, the default answer is REJECT.\n" "3. **Missing Data**: If you do not see a credit score, do not estimate one. Fail the application as 'Incomplete Data'.\n\n" "**LOGICAL REASONING STEPS**:\n" "1. **Residency & Eligibility Check**: \n" " - Check `nationality` and `is_pr` (Permanent Resident status).\n" " - **DEFINITION**: A 'Foreigner' is anyone whose nationality is NOT 'Singaporean'.\n" " - **THE STRICT RULE**: \n" " - If Customer is Singaporean -> **PASS** (Eligible).\n" " - If Customer is Non-Singaporean AND is PR (Permanent Resident) -> **PASS** (Eligible).\n" " - **If Customer is Non-Singaporean AND is NOT Permanent Resident -> REJECT IMMEDIATELY**.\n" " - (Reasoning: We do not lend to non-residents. Foreigners must hold PR status).\n\n" "2. **Risk Mapping**: \n" " - Locate `credit_score` and `account_status` in the input.\n" " - Map EXACTLY to the Risk Matrix provided.\n" " - DETERMINE: Is the Overall Risk 'Low', 'Medium', or 'High'?\n\n" "3. **Final Verdict**: \n" " - If its High Risk OR Non-Singaporean+PR, please REJECT.\n" " - Low/Medium Risk is APPROVE.\n\n" "**REQUIRED OUTPUT**:\n" "Return a Markdown Memo. You MUST NOT add 'Notes', 'Suggestions', or 'Flexible terms'.\n" "End with this strict JSON block:\n" "```json\n" "{\n" ' "decision": "APPROVED" | "REJECTED",\n' ' "risk_level": "Low" | "Medium" | "High",\n' ' "interest_rate": "The numerical rate (e.g. 4.85%) or N/A",\n' ' "reason_code": "The specific rule from policy that triggered this decision"\n' "}\n" "```" ), expected_output="A Decision Memo derived 100% from provided text with no outside hallucination.", agent=agent, context=context_tasks )