From df0739911b02ed733349ab36b33f6b393ede0cb5 Mon Sep 17 00:00:00 2001 From: Heet Ranpura Date: Wed, 8 Apr 2026 22:36:53 +0530 Subject: [PATCH] Refresh README outputs and sample report artifacts --- README.md | 873 +++++++++++++++--- reports/README.txt | 44 + reports/average_scores.png | Bin 0 -> 50891 bytes reports/difficulty_profile.png | Bin 0 -> 49904 bytes reports/efficiency_scatter.png | Bin 0 -> 55826 bytes .../inference_mistral_nemotron.txt | 349 +++++++ .../inference_nemotron3_120b.txt | 358 +++++++ .../inference_nemotron3_nano30b.txt | 352 +++++++ .../inference_logs/inference_nemotron51b.txt | 370 ++++++++ .../inference_nemotron_mini4b.txt | 396 ++++++++ .../inference_nemotron_nano.txt | 562 +++++++++++ .../inference_nemotron_nano8b.txt | 544 +++++++++++ .../inference_nemotron_super49b.txt | 376 ++++++++ .../inference_logs/inference_nvidia_8b.txt | 672 ++++++++++++++ reports/leaderboard.csv | 9 + reports/results.json | 218 +++++ reports/summary.txt | 12 + reports/task_heatmap.png | Bin 0 -> 81431 bytes reports/test_logs/pytest_results.txt | 30 + reports/test_logs/smoke_test_results.txt | 61 ++ reports/test_logs/test_results.txt | 30 + 21 files changed, 5119 insertions(+), 137 deletions(-) create mode 100644 reports/README.txt create mode 100644 reports/average_scores.png create mode 100644 reports/difficulty_profile.png create mode 100644 reports/efficiency_scatter.png create mode 100644 reports/inference_logs/inference_mistral_nemotron.txt create mode 100644 reports/inference_logs/inference_nemotron3_120b.txt create mode 100644 reports/inference_logs/inference_nemotron3_nano30b.txt create mode 100644 reports/inference_logs/inference_nemotron51b.txt create mode 100644 reports/inference_logs/inference_nemotron_mini4b.txt create mode 100644 reports/inference_logs/inference_nemotron_nano.txt create mode 100644 reports/inference_logs/inference_nemotron_nano8b.txt create mode 100644 reports/inference_logs/inference_nemotron_super49b.txt create mode 100644 reports/inference_logs/inference_nvidia_8b.txt create mode 100644 reports/leaderboard.csv create mode 100644 reports/results.json create mode 100644 reports/summary.txt create mode 100644 reports/task_heatmap.png create mode 100644 reports/test_logs/pytest_results.txt create mode 100644 reports/test_logs/smoke_test_results.txt create mode 100644 reports/test_logs/test_results.txt diff --git a/README.md b/README.md index 476d588..230d82b 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,4 @@ ---- title: Scheme Enrollment Env -emoji: 🏛️ colorFrom: blue colorTo: green sdk: docker @@ -8,221 +6,822 @@ pinned: false app_port: 7860 tags: - openenv + - reinforcement-learning + - evaluation + - agents --- # Indian Government Scheme Enrollment — RL Environment -An open-source Reinforcement Learning environment simulating the workflow of an Indian Government CSC (Common Service Centre) operator. An LLM-based agent must interview applicants, collect missing documents, detect boundary fraud, and either enroll them in the correct welfare scheme or safely escalate contradictory cases to a senior officer. +> *A reinforcement learning benchmark for bureaucratic reasoning: interviewing applicants, verifying documents, applying strict scheme rules, detecting fraud, and knowing when to escalate rather than decide.* + +[![HuggingFace Space](https://img.shields.io/badge/HuggingFace-Space-blue)](https://huggingface.co/spaces/advikdivekar/scheme-enrollment-env) +[![GitHub](https://img.shields.io/badge/GitHub-Repository-black)](https://github.com/advikdivekar/rl-agent) +[![OpenEnv](https://img.shields.io/badge/OpenEnv-Compliant-green)](https://huggingface.co/openenv) +[![Tests](https://img.shields.io/badge/Tests-20%20Passing-brightgreen)](tests/) +[![Tasks](https://img.shields.io/badge/Tasks-5%20Graded-orange)](#-the-5-tasks) + +## The Case Study + +Priya is a CSC operator in Barmer, Rajasthan. She interviews dozens of applicants every day across a wooden desk, a government-issue computer, and a slow internet connection. One afternoon, a young man walks in claiming to be a student. He wants to enroll in PMKVY, a skill-training scheme. On the surface, his profile looks plausible. + +But something feels wrong. His income is unusually high for a student. Priya asks for his PAN card. It reveals six years of active pension-linked employment from a public sector company. He is not a student. He is attempting to claim a benefit under false pretenses. + +Priya does not guess. She does not overreach. She escalates the case. + +**This environment trains AI agents to behave like Priya.** + +Not just to read a table of rules, but to: + +- gather missing information before acting +- verify the right document at the right time +- apply exact arithmetic boundaries +- ignore irrelevant context +- distinguish ineligibility from contradiction +- escalate only when escalation is genuinely required -## Why This Exists +## Why This Environment Exists -Millions of rural Indians access government welfare schemes through CSC operators — human workers who interview applicants, verify documents, and submit applications. This process requires multi-step reasoning, strict rule adherence, and the ability to detect fraud. This environment trains and evaluates AI agents on that exact workflow, filling a real gap in the RL/agent evaluation ecosystem. +Most RL and agent benchmarks focus on coding, games, search, or generic dialogue. Very few test policy compliance under partial observability, exact thresholds, and procedural safety. -## MDP Formalization +This environment exists to measure a harder and more realistic capability cluster: + +- **Policy compliance under uncertainty**: the agent must collect evidence before deciding +- **Fraud detection through document verification**: contradictions emerge only after the correct document is requested +- **Boundary arithmetic**: `9999` qualifies, `10000` does not +- **Escalation protocol**: the agent must know when not to decide +- **Noise filtering**: irrelevant profile fields appear alongside real signal + +The benchmark is grounded in a workflow that affects welfare access, fraud prevention, and administrative fairness. + +## Hackathon Compliance Snapshot + +This repository is structured to satisfy the official Round 1 requirements: + +- real-world task simulation, not a toy domain +- full OpenEnv environment with typed models, `step()`, `reset()`, `state()`, and `openenv.yaml` +- 5 graded tasks with deterministic programmatic scoring in the `0.0–1.0` range +- meaningful reward shaping over the trajectory +- root-level `inference.py` using the OpenAI client +- Dockerfile plus Hugging Face Space deployment metadata +- pre-submission validation via `scripts/pre-validation-script.sh` +- README coverage for environment description, action space, observation space, tasks, setup, and baseline scores + +## Table of Contents + +- [Environment at a Glance](#environment-at-a-glance) +- [Repository Structure](#repository-structure) +- [Architecture Overview](#architecture-overview) +- [System Architecture](#system-architecture) +- [Agent-Environment Architecture](#agent-environment-architecture) +- [Training Pipeline Architecture](#training-pipeline-architecture) +- [Reward Architecture](#reward-architecture) +- [Deployment and Inference Architecture](#deployment-and-inference-architecture) +- [Data Flow Architecture](#data-flow-architecture) +- [Environment Contract](#environment-contract) +- [Action Space](#action-space) +- [Observation Space](#observation-space) +- [Scheme Eligibility Rules](#scheme-eligibility-rules) +- [The 5 Tasks](#the-5-tasks) +- [The Distraction Trap](#the-distraction-trap) +- [Benchmark Outputs and Screenshots](#benchmark-outputs-and-screenshots) +- [Baseline Results](#baseline-results) +- [Setup and Running](#setup-and-running) +- [Environment Variables](#environment-variables) +- [Testing](#testing) +- [Pre-Submission Validation](#pre-submission-validation) +- [OpenEnv Compliance](#openenv-compliance) + +## Environment at a Glance | Component | Definition | |---|---| -| **State (S)** | Worker profile (16 fields: age, income, occupation, has_aadhaar, family_income, worker_type, has_epfo, has_esic, is_govt_employee, has_pan, has_bank_account, has_pucca_house, is_pregnant, first_child, is_income_tax_payer, not_nps) + application form state + step count | -| **Action (A)** | 5 discrete actions: ask_question, request_document, approve_scheme, reject_applicant, escalate | -| **Transition (T)** | Deterministic given persona — ask_question reveals hidden fields, verify_document surfaces contradictions | -| **Reward (R)** | Dense per-step rewards (see reward table below) + terminal bonus | -| **Discount (γ)** | 1.0 — episodic task, all steps matter equally | -| **Max Steps** | 20 per episode | +| **State (S)** | Applicant profile, partial observation state, hidden persona fields, step count | +| **Action (A)** | `ask_question`, `request_document`, `approve_scheme`, `reject_applicant`, `escalate` | +| **Transition (T)** | Deterministic given persona and task template | +| **Reward (R)** | Intermediate shaping plus terminal outcome rewards | +| **Horizon** | 20 steps per episode | +| **Grader** | Terminal normalized score `0.0` to `1.0` | +| **Server** | FastAPI via OpenEnv `create_app` | +| **Inference** | OpenAI-compatible client, provider-agnostic | +| **Benchmarking** | Inference-first evaluation flow with optional multi-model orchestration | + +## Repository Structure + +```text +. +├── README.md +├── pyproject.toml +├── requirements.txt +├── uv.lock +├── Dockerfile +├── openenv.yaml +├── .env.example +├── models.py +├── client.py +├── inference.py +├── benchmark_runner.py +├── benchmark_report.py +├── server/ +│ ├── __init__.py +│ ├── app.py +│ ├── models.py +│ ├── scheme_env_environment.py +│ └── schemes.py +├── tests/ +│ ├── conftest.py +│ └── test_scheme_eligibility.py +└── reports/ + ├── average_scores.png + ├── task_heatmap.png + ├── difficulty_profile.png + ├── efficiency_scatter.png + ├── inference_logs/ + └── test_logs/ +``` -## Action Space +### What each major file does + +- [server/app.py](server/app.py): FastAPI/OpenEnv server entrypoint exposing `/reset`, `/step`, and `/health` +- [server/scheme_env_environment.py](server/scheme_env_environment.py): environment lifecycle, task logic, reward shaping, step transitions, shared state, metadata sanitization +- [server/schemes.py](server/schemes.py): scheme metadata, eligibility logic, optimal scheme selection +- [models.py](models.py): root `Action` and `Observation` schemas used by inference and server logic +- [client.py](client.py): OpenEnv client wrapper for typed environment access +- [inference.py](inference.py): single-model evaluation loop that produces the primary output bundle under `reports/` +- [benchmark_runner.py](benchmark_runner.py): optional multi-model orchestration layer +- [benchmark_report.py](benchmark_report.py): report and chart generation from benchmark artifacts +- [tests/test_scheme_eligibility.py](tests/test_scheme_eligibility.py): boundary-condition and grading tests +- [reports](reports): benchmark outputs, summary files, charts, and archived logs + +## Architecture Overview + +This repo has a clean separation between: + +1. the **environment runtime** +2. the **model interaction loop** +3. the **benchmark orchestration layer** +4. the **reporting and visualization layer** + +## System Architecture + +```mermaid +flowchart LR + A["LLM / External Policy"] --> B["inference.py
Prompting + JSON extraction"] + B --> C["OpenEnv HTTP API
/reset /step"] + C --> D["server/app.py
FastAPI + create_app"] + D --> E["SchemeEnvEnvironment
server/scheme_env_environment.py"] + E --> F["Persona Generation"] + E --> G["Observation Builder"] + E --> H["Reward + Grader Logic"] + E --> I["Scheme Rules
server/schemes.py"] + B --> J["reports/inference_logs
per-run logs"] + B --> K["reports/test_logs
validation outputs"] + B --> L["reports/*.png + reports/*.csv + reports/*.json"] + M["benchmark_runner.py
optional orchestration"] --> B + L --> N["README visual outputs"] +``` -| Action | Value | Description | Reward | -|---|---|---|---| -| `ask_question` | field name | Gather missing eligibility data | 0.0 valid step, -0.10 noise/redundant | -| `request_document` | document name | Request verification documents | 0.0 valid step | -| `approve_scheme` | scheme name | Enroll applicant in optimal scheme | +10.0 (optimal), +3.0 (suboptimal), -5.0 (wrong) | -| `reject_applicant` | category | Reject ineligible applicant | +5.0 (correct), -5.0 (incorrect) | -| `escalate` | category or empty | Hand off contradictory case to senior officer | +10.0 (Task 4 only), -2.0 (other tasks) | +### Runtime layers + +- **Inference layer**: talks to external models and formats actions +- **API layer**: standard OpenEnv-compatible transport over HTTP +- **Environment layer**: task logic, hidden persona state, reward logic +- **Data layer**: scheme rules and typed schemas +- **Reporting layer**: benchmark aggregation and visualization + +## Agent-Environment Architecture + +```mermaid +sequenceDiagram + participant Agent as LLM Agent + participant Runner as inference.py + participant API as FastAPI/OpenEnv + participant Env as SchemeEnvEnvironment + + Agent->>Runner: JSON action + Runner->>API: POST /step + API->>Env: step(action) + Env->>Env: Validate action + Env->>Env: Update hidden state + Env->>Env: Compute reward and terminal result + Env->>Env: Strip hidden metadata + Env-->>API: Observation + API-->>Runner: Observation + reward + done + Runner-->>Agent: Updated state context +``` + +### Core interaction pattern + +- the agent never mutates internal state directly +- every step is mediated through a strict typed action schema +- the environment can soft-block some wrong protocol steps and allow recovery +- the final score depends on both correctness and efficiency + +## Training Pipeline Architecture + +This repository is an **evaluation and benchmarking pipeline**, not an on-policy RL training loop with replay buffers and optimizer steps. Still, there is a clear training-style pipeline structure: + +```mermaid +flowchart TD + A["Environment Server"] --> B["inference.py
single-model episodes"] + B --> C["reports/inference_logs
raw traces"] + B --> D["reports/test_logs
test outputs"] + B --> E["reports/*.png
charts"] + B --> F["reports/*.csv + reports/*.json + reports/*.txt"] + G["benchmark_runner.py
optional repeated invocation"] --> B +``` + +### What this pipeline enables + +- repeated evaluation over randomized personas +- capability comparison across model sizes and families +- exploit detection through artifact inspection +- persistent inference logs and validation outputs inside `reports/` + +## Reward Architecture + +The reward system has three layers: + +1. **intermediate shaping** +2. **terminal outcome reward** +3. **continuous grader score** + +### Intermediate shaping + +| Event | Reward | +|---|---| +| Valid `ask_question` | `0.0` | +| Valid `request_document` | `0.0` | +| Noise query | `-0.10` | +| Redundant query | `-0.10` | +| Soft-block protocol violation | `-1.0` to `-1.5` depending on task/context | + +### Terminal outcomes + +| Event | Reward | +|---|---| +| Correct optimal approval | `+10.0` | +| Correct escalation | `+10.0` | +| Correct rejection | `+5.0` | +| Suboptimal but eligible approval | `+3.0` | +| Wrong escalation | `-2.0` | +| Wrong rejection | `-5.0` | +| Ineligible approval | `-5.0` | +| Premature approval | `-5.0` | +| Timeout | `-2.0` | + +### Continuous grader + +```text +grader_score = max(0.30, min(1.0, base_score - penalty + bonus)) +``` + +Where: + +```text +penalty = + (noise_queries * 0.08) + + (redundant_queries * 0.05) + + (wasted_steps * 0.04) # Task 2 only + +bonus = + 0.05 if document_verified else 0.0 +``` + +### Why this design is strong + +- correct but sloppy agents still outrank wrong agents +- agents cannot farm intermediate reward +- document protocol adherence is rewarded +- score remains leaderboard-friendly + +## Deployment and Inference Architecture + +```mermaid +flowchart TD + A["Dockerfile"] --> B["Pinned openenv-base image"] + B --> C["uv sync --frozen"] + C --> D["Runtime container"] + D --> E["uvicorn server.app:app :7860"] + E --> F["/health"] + G["inference.py"] --> H["OpenAI, Hugging Face Router, or NVIDIA NIM"] + G --> E +``` + +### Deployment characteristics + +- Dockerfile uses a multi-stage build +- base image is sha256-pinned +- `uv.lock` is used for reproducible dependency resolution +- server runs with `uvicorn server.app:app` +- health checks hit `/health` + +### Inference characteristics + +- all LLM calls use the OpenAI Python client +- the client is configured from environment variables in `inference.py` +- structured stdout logs follow `[START]`, `[STEP]`, and `[END]` +- provider normalization remains in place for compatible endpoints + +## Data Flow Architecture + +```mermaid +flowchart TD + A["reset(seed)"] --> B["generate_dynamic_persona(task_id)"] + B --> C["_make_fresh_obs(task, persona)"] + C --> D["Inject 1-3 noise fields"] + D --> E["Return initial observation"] + E --> F["Agent chooses action"] + F --> G["step(action)"] + G --> H{"Action type"} + H -->|ask_question| I["Reveal field or penalize noise/redundancy"] + H -->|request_document| J["Reveal document-backed truth"] + H -->|approve_scheme| K["Check optimality or protocol violation"] + H -->|reject_applicant| L["Check rejection validity"] + H -->|escalate| M["Allow only verified contradiction path"] + I --> N["_compute_grader_score at terminal only"] + J --> N + K --> N + L --> N + M --> N + N --> O["_finalize_step()"] + O --> P["Persist full internal state"] + O --> Q["Return sanitized observation to agent"] +``` + +### Important data flow properties + +- hidden persona flags never go directly to the model +- internal metadata is stripped before return +- timeout enforcement happens centrally in `_finalize_step()` +- all step paths converge through the same finalization logic -**Valid field names for ask_question:** `age`, `income`, `occupation`, `has_aadhaar` +## Environment Contract -**Valid document names for request_document:** `aadhaar_card`, `pan_card`, `aadhaar`, `pan` +The environment follows the OpenEnv contract with: -**Valid scheme names for approve_scheme:** `PMKVY`, `MGNREGS`, `PMAY` +- `POST /reset` +- `POST /step` +- `GET /health` -**Valid decision categories for reject/escalate:** `AGE_EXCEEDED`, `INCOME_TOO_HIGH`, `NO_ELIGIBLE_SCHEME`, `MISSING_REQUIRED_DATA`, `DATA_MISMATCH`, `DOCUMENT_CONFLICT`, `MANUAL_REVIEW_REQUIRED` +[openenv.yaml](openenv.yaml) currently specifies: + +- `name: scheme_env` +- `version: 0.2.0` +- `runtime: fastapi` +- `app: server.app:app` +- `port: 7860` +- `max_steps: 20` + +## Action Space + +| Action | Valid Values | Description | Reward | +|---|---|---|---| +| `ask_question` | `age`, `income`, `occupation`, `has_aadhaar` | Request a specific eligibility field | `0.0` valid, `-0.10` redundant/noise | +| `request_document` | `aadhaar_card`, `pan_card`, `aadhaar`, `pan` | Request an official verification document | `0.0` valid, reveals hidden truth | +| `approve_scheme` | `PMKVY`, `MGNREGS`, `PMAY` | Enroll the applicant in a scheme | `+10.0`, `+3.0`, or `-5.0` | +| `reject_applicant` | `AGE_EXCEEDED`, `INCOME_TOO_HIGH`, `NO_ELIGIBLE_SCHEME`, `MISSING_REQUIRED_DATA`, `DATA_MISMATCH`, `DOCUMENT_CONFLICT` | Reject with a concise reason code | `+5.0` or `-5.0` | +| `escalate` | `DATA_MISMATCH`, `MANUAL_REVIEW_REQUIRED`, or empty | Escalate to a senior officer | correct only in contradiction path | + +The action space is intentionally small, real-world, and exploit-resistant. ## Observation Space +Each step returns a structured observation: + | Field | Type | Description | |---|---|---| -| `known_profile` | Dict | Applicant data collected so far — grows as agent asks valid questions | -| `missing_data` | List[str] | Fields still needed before agent can make a terminal decision | -| `notification` | str | Environment feedback on the last action taken | -| `is_terminated` | bool | True when the episode has ended | -| `grader_score` | float | Continuous score 0.0–1.0, set only at episode termination | -| `metadata` | Dict | Internal tracking: task id, noise_queries, redundant_queries | +| `known_profile` | `Dict[str, Any]` | Applicant data collected so far | +| `missing_data` | `List[str]` | Fields still required before a valid terminal decision | +| `notification` | `str` | Natural-language feedback from the environment | +| `is_terminated` | `bool` | Episode has ended | +| `grader_score` | `Optional[float]` | Terminal normalized score | +| `metadata` | `Dict[str, Any]` | Agent-visible counters only | + +### Metadata exposure policy + +The agent sees only: + +- `noise_queries` +- `redundant_queries` +- `relevant_queries` + +Internal fields such as `pan_verified`, `aadhaar_verified`, and hidden task markers are stripped before transmission. ## Scheme Eligibility Rules -All thresholds are strict integer comparisons — no rounding or approximation. +All comparisons use strict integer arithmetic. -| Scheme | Age | Occupation | Income | Aadhaar | -|---|---|---|---|---| -| **PMKVY** | 18–35 | mason OR carpenter | ≤ 9999 | — | -| **MGNREGS** | 18–60 | farm_labourer | — | Required | -| **PMAY** | 21–55 | any | ≤ 5999 | Required | +| Scheme | Full Name | Age Range | Occupation | Income Ceiling | Aadhaar | Benefit | +|---|---|---|---|---|---|---| +| **PMKVY** | Pradhan Mantri Kaushal Vikas Yojana | 18 to 35 | `mason` or `carpenter` | `<= 9999` | Not required | Rs 8,000 training stipend | +| **MGNREGS** | Mahatma Gandhi National Rural Employment Guarantee Scheme | 18 to 60 | `farm_labourer` only | None | Required | 100 days wage employment | +| **PMAY** | Pradhan Mantri Awaas Yojana | 21 to 55 | Any | `<= 5999` | Required | Rs 1.2 lakh housing grant | -**Reject if:** no scheme criteria are fully satisfied. +### Priority rule -## Reward Function +When multiple schemes are eligible: -| Event | Reward | Terminal? | -|---|---|---| -| Valid question from missing_data | 0.0 | No | -| Valid document request | 0.0 | No | -| Redundant or noise field query | -0.10 | No | -| Correct optimal scheme approved | +10.0 | Yes | -| Suboptimal but eligible scheme | +3.0 | Yes | -| Correct rejection (Task 3) | +5.0 | Yes | -| Correct escalation (Task 4) | +10.0 | Yes | -| Wrong scheme / ineligible approval | -5.0 | Yes | -| Premature approval (missing data) | -5.0 | Yes | -| Boundary violation (Task 3) | -5.0 | Yes | -| Fraud authorization (Task 4) | -5.0 | Yes | -| Premature rejection (Task 4) | -3.0 | Yes | -| Wrong escalation (Tasks 1–3) | -2.0 | Yes | -| Timeout (20 steps) | -2.0 | Yes | +```text +PMAY > MGNREGS > PMKVY +``` + +The repo also defines future-facing extended schemes in [server/schemes.py](server/schemes.py), but current benchmark tasks are built around the core three. + +## The 5 Tasks + +### Task 1 — Scheme Discovery + +The agent starts with a partially hidden profile and must collect the remaining eligibility fields before approving the **optimal** scheme, not merely an eligible one. -## Grader Scoring +| Parameter | Value | +|---|---| +| Profile at reset | `age` and `income` visible, `occupation` and `has_aadhaar` hidden | +| Persona range | age 18 to 35, income 1,000 to 9,999 | +| Minimum steps | 3 | +| Core skill | benefit-aware scheme ranking | + +### Task 2 — Missing Data + +The applicant file is incomplete. The agent must collect all required fields before making any terminal decision. + +| Parameter | Value | +|---|---| +| Profile at reset | age + income visible, randomized missing field order | +| Optimal scheme | MGNREGS once fields are collected | +| Minimum steps | 3 | +| Core skill | procedural completeness | + +### Task 3 — Boundary Fraud Detection + +Income is hidden initially. Once revealed, it always exceeds the PMKVY threshold, and the correct action is rejection. + +| Parameter | Value | +|---|---| +| Profile at reset | age visible, income hidden | +| Income range | 10,001 to 12,000 | +| Minimum steps | 4 | +| Core skill | exact arithmetic boundary reasoning | + +### Task 4 — Escalation Dilemma + +The applicant claims to be a student, but PAN verification reveals long-term public-sector employment. The correct response is escalation after verification. + +| Parameter | Value | +|---|---| +| Profile at reset | complete profile, occupation=`student` | +| Income range | 8,000 to 20,000 | +| Minimum steps | 2 | +| Core skill | contradiction handling and escalation | + +### Task 5 — Document Conflict + +The self-reported age looks near the PMKVY boundary, but Aadhaar reveals a disqualifying official age. The correct response is verified rejection. + +| Parameter | Value | +|---|---| +| Self-reported age | 33, 34, or 35 | +| Aadhaar age | always greater than 35 | +| Income range | 6,001 to 9,000 | +| Minimum steps | 2 | +| Core skill | document authority over self-report | + +## The Distraction Trap -Terminal outcomes are scored continuously between 0.0 and 1.0 using an efficiency-weighted formula: +Every episode injects 1 to 3 irrelevant fields into `known_profile`, for example: +- `marital_status` +- `state_of_residence` +- `number_of_children` +- `bank_name` + +These look plausibly administrative, but they do **not** affect eligibility. Querying them incurs penalties and lowers the grader score. + +This is a deliberate benchmark feature, not cosmetic clutter. + +## Benchmark Outputs and Screenshots + +The evaluation flow centers on `inference.py`. The run outputs shown here are written under `reports/`, with the most important raw output directories being: + +- `reports/inference_logs/` +- `reports/test_logs/` + +The top-level `reports/` directory also holds the rendered charts and summary files generated from the same inference-driven run bundle. + +### Generated artifact bundle + +```text +reports/ +├── average_scores.png +├── task_heatmap.png +├── difficulty_profile.png +├── efficiency_scatter.png +├── leaderboard.csv +├── results.json +├── summary.txt +├── README.txt +├── inference_logs/ +└── test_logs/ ``` -grader_score = max(0.30, base_score - penalty) -penalty = (noise_queries × 0.08) + (redundant_queries × 0.05) - + (wasted_steps × 0.04) # Task 2 only +These artifacts represent the output bundle produced by the inference flow. The raw per-model traces live in `reports/inference_logs/`, and the verification outputs live in `reports/test_logs/`. + +### 1. Leaderboard output + +The top-level CSV output from the sample run is: + +| Model | Size | Task1 | Task2 | Task3 | Task4 | Task5 | Average | +|---|---|---:|---:|---:|---:|---:|---:| +| mistralai/mistral-nemotron | ~56B | 0.833 | 1.000 | 1.000 | 1.000 | 1.000 | **0.967** | +| nvidia/llama-3.3-nemotron-super-49b-v1 | 49B | 0.800 | 0.973 | 1.000 | 1.000 | 1.000 | 0.955 | +| nvidia/llama-3.1-nemotron-51b-instruct | 51B | 0.800 | 0.957 | 1.000 | 1.000 | 1.000 | 0.951 | +| nvidia/nemotron-3-nano-30b-a3b | 30B | 1.000 | 0.000 | 1.000 | 1.000 | 1.000 | 0.800 | +| nvidia/nemotron-3-super-120b-a12b | 120B | 1.000 | 0.000 | 1.000 | 1.000 | 1.000 | 0.800 | +| nvidia/nemotron-mini-4b-instruct | 4B | 0.483 | 0.667 | 0.667 | 0.967 | 0.000 | 0.557 | +| meta/llama-3.1-8b-instruct | 8B | 0.400 | 0.000 | 0.317 | 0.867 | 1.000 | 0.517 | +| nvidia/llama-3.1-nemotron-nano-8b-v1 | 8B | 0.283 | 0.303 | 0.000 | 0.333 | 0.000 | 0.184 | + +### 2. Summary output + +The sample summary file reports: + +```text +OpenEnv scheme_env Benchmark — Baseline Report Summary +======================================================== +Date generated : 2026-04-08 +Models evaluated : 8 + +Best model : mistral-nemotron (avg=0.967) +Worst model : nemotron-nano-8b (avg=0.184) + +Hardest task : Task 2 (mean=0.487) +Easiest task : Task 4 (mean=0.896) + +Perfect score (1.0 on all tasks): none ``` -A correct but inefficient agent always outscores an incorrect agent. +### 3. Average score chart -## Tasks +![Average Scores](reports/average_scores.png) -### Task 1 — Scheme Discovery (Easy) -**Objective:** Complete profile provided. Agent must identify and approve the optimal scheme. -**Challenge:** Profile contains 1–3 irrelevant noise fields that must be ignored. -**Minimum steps:** 1 -**Grader:** 1.0 for optimal scheme, 0.5 for eligible but suboptimal, 0.0 for wrong/timeout. Efficiency penalty applied. +This chart gives the fastest overall leaderboard comparison across models. -### Task 2 — Missing Data (Medium) -**Objective:** Profile is incomplete. Agent must collect all missing fields before approving. -**Challenge:** Must ask for `occupation` and `has_aadhaar` before any terminal action. -**Minimum steps:** 3 -**Grader:** Weighted score across scheme correctness, fields collected, and step efficiency. Premature approval = 0.0. +### 4. Per-task heatmap -### Task 3 — Boundary Fraud Detection (Hard) -**Objective:** Profile looks PMKVY-eligible but income is 1–2000 rupees over the 10,000 threshold. -**Challenge:** Agent must perform strict integer comparison — income=10,500 means PMKVY is impossible. -**Minimum steps:** 1 -**Grader:** 1.0 for correct rejection, 0.0 for any approval attempt. Efficiency penalty applied. +![Task Heatmap](reports/task_heatmap.png) -### Task 4 — Escalation Dilemma (Expert) -**Objective:** Applicant claims `occupation=student` but PAN card reveals active government pension deposits. -**Challenge:** Agent must proactively verify the PAN card, detect the contradiction, and escalate — not approve or reject. -**Minimum steps:** 2 (verify PAN → escalate) -**Grader:** 1.0 for escalation after PAN verification, 0.85 for escalation without verification, 0.0 for approval or rejection. +This chart is especially useful for spotting capability cliffs and task-specific failure modes. -## Distraction Trap +### 5. Difficulty profile -Every task injects 1–3 irrelevant fields into `known_profile`: -`marital_status`, `state_of_residence`, `number_of_children`, `bank_name` +![Difficulty Profile](reports/difficulty_profile.png) -Querying any of these costs `-0.10` and reduces the final grader score. This tests whether agents can filter irrelevant context — a key real-world capability. +This chart summarizes which tasks are easiest or hardest across the evaluated model set. -- `reports/report_/leaderboard_.csv` -- `reports/report_/logs_/` -- `reports/report_/run_manifest_.json` -- `reports/report_/average_scores.png` -- `reports/report_/task_heatmap.png` -- `reports/report_/efficiency_scatter.png` -- `reports/report_/results.json` -- `reports/report_/summary.csv` +### 6. Efficiency / protocol-view scatter -Every `reset()` generates a fresh randomised persona: -- Task 1: age randomised 18–35, income 1,000–9,999 -- Task 2: age randomised 18–60, income 1,000–5,000 -- Task 3: income always 10,001–12,000 (above PMKVY threshold) -- Task 4: employer randomly selected from 8 Indian PSUs +![Efficiency Scatter](reports/efficiency_scatter.png) -No two evaluation episodes are mathematically identical. +This chart helps interpret whether strong models are also protocol-efficient, not just ultimately correct. -## Setup +### 7. Raw artifacts included in the bundle + +The generated output bundle also includes: + +- `results.json` +- `leaderboard.csv` +- `summary.txt` +- `README.txt` +- `inference_logs/` +- `test_logs/` + +That means the README now shows not just plots, but also the exact machine-readable outputs and raw logs the benchmark produces. + +## Baseline Results + +Across the included baseline report: + +- **best model**: `mistralai/mistral-nemotron` at `0.967` +- **worst model**: `nvidia/llama-3.1-nemotron-nano-8b-v1` at `0.184` +- **hardest task**: Task 2 +- **easiest task**: Task 4 + +### What these results reveal + +- **Task 2 is a strong discriminator**: some larger models still fail to commit to the final approval even after collecting the needed fields +- **Task 5 separates small models sharply**: some understand the contradiction but fail to translate it into a valid schema action +- **Task 4 is protocol-heavy, not purely reasoning-heavy**: once the contradiction is document-backed, many models can resolve it correctly +- **Task 1 remains nontrivial**: choosing the optimal scheme instead of the first eligible scheme still trips strong models + +## Setup and Running + +### Option 1 — Docker ```bash docker build -t scheme-enrollment-env . docker run -p 7860:7860 scheme-enrollment-env +curl http://localhost:7860/health +``` + +### Option 2 — Local + +```bash +git clone https://github.com/advikdivekar/rl-agent.git +cd rl-agent +python -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +export PYTHONPATH=. +uvicorn server.app:app --host 0.0.0.0 --port 7860 ``` -## Running Inference +### With `uv` ```bash -export OPENAI_API_KEY=your_key +uv sync +export PYTHONPATH=. +uvicorn server.app:app --host 0.0.0.0 --port 7860 +``` + +### Running inference + +Hugging Face Router: + +```bash +export HF_TOKEN=your_hf_token export API_BASE_URL=https://router.huggingface.co/v1 export MODEL_NAME=Qwen/Qwen2.5-7B-Instruct export ENV_URL=http://localhost:7860 - +export N_REPEATS=3 python inference.py ``` -Generate a report from an explicit bundled run directory: +OpenAI-compatible endpoint: ```bash -python benchmark_report.py --run-dir reports/report_20260404_124255 +export HF_TOKEN=your_api_token +export API_BASE_URL=https://api.openai.com/v1 +export MODEL_NAME=gpt-4.1-mini +export ENV_URL=http://localhost:7860 +python inference.py ``` -Generate a report from explicit artifact paths: +## Environment Variables -```bash -python benchmark_report.py \ - --csv reports/report_20260404_124255/leaderboard_20260404_124255.csv \ - --logs-dir reports/report_20260404_124255/logs_20260404_124255 +| Variable | Default | Description | +|---|---|---| +| `HF_TOKEN` | unset | Token used by the OpenAI client for authenticated calls | +| `API_BASE_URL` | `https://router.huggingface.co/v1` | Model endpoint | +| `MODEL_NAME` | `Qwen/Qwen2.5-7B-Instruct` | Model identifier | +| `LOCAL_IMAGE_NAME` | unset | Optional local image name when using `from_docker_image()` workflows | +| `ENV_URL` | `http://localhost:7860` | Environment server URL | +| `MAX_TOKENS` | `1500` | Max tokens per model call | +| `N_REPEATS` | `3` | Episodes per task | +| `INFERENCE_TEMPERATURE` | `0.0` | Sampling temperature | + +`inference.py` now reads: + +```python +API_BASE_URL = os.getenv("API_BASE_URL", "https://router.huggingface.co/v1") +MODEL_NAME = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-7B-Instruct") +HF_TOKEN = os.getenv("HF_TOKEN") +LOCAL_IMAGE_NAME = os.getenv("LOCAL_IMAGE_NAME") ``` -## Nemotron Setup +and all LLM calls are made through: + +```python +from openai import OpenAI +client = OpenAI(base_url=API_BASE_URL, api_key=HF_TOKEN) +``` -This repo is configured to work with OpenAI-compatible chat APIs, including -Hugging Face Router and NVIDIA NIM. +## Testing -### Hugging Face Router +Run the unit tests with: ```bash -export API_BASE_URL="https://router.huggingface.co/v1" -export MODEL_NAME="nvidia/Llama-3.1-Nemotron-70B-Instruct-HF" -export HF_TOKEN="your_hf_token" -export MAX_TOKENS="1500" -python inference.py +export PYTHONPATH=. +pytest tests/ -v ``` -Important: -- the older `https://api-inference.huggingface.co/models/.../v1` pattern is deprecated by Hugging Face -- `inference.py` now rewrites that deprecated URL to Router automatically -- actual Nemotron availability on Router still depends on which providers are enabled for your token +Current unit tests cover: -### NVIDIA NIM +- PMKVY age and income boundaries +- PMAY strict ceiling behavior +- MGNREGS Aadhaar requirement +- optimal-scheme priority ordering +- grader score floor and penalty math + +When benchmark verification outputs are generated, they are written under `reports/test_logs/`. + +## Pre-Submission Validation + +To make hackathon submission checks repeatable, the repo includes a dedicated pre-validation script: ```bash -export API_BASE_URL="https://integrate.api.nvidia.com/v1" -export MODEL_NAME="nvidia/llama-3.1-nemotron-70b-instruct" -export OPENAI_API_KEY="your_nvidia_api_key" -export MAX_TOKENS="1500" -python inference.py +./scripts/pre-validation-script.sh [repo_dir] ``` -The inference path is JSON-first and does not require `` tags, which makes it more robust for Nemotron-style verbose models. +Example: -## Real-World Utility +```bash +cd /tmp/rl-agent-readme-pr +./scripts/pre-validation-script.sh https://advikdivekar-scheme-enrollment-env.hf.space /tmp/rl-agent-readme-pr +``` -This environment models a task performed daily by thousands of CSC operators across rural India. Key capabilities tested: +### What the script checks + +- repository structure and required files +- `inference.py` environment-variable contract +- OpenAI client usage and structured `[START]`, `[STEP]`, `[END]` logs +- OpenEnv surface requirements from `openenv.yaml` +- README coverage for action space, observation space, setup, tasks, and baseline outputs +- live Hugging Face Space `/reset` and `/health` +- Docker build success +- `openenv validate` +- Python compile sanity +- `pytest tests/` + +### Passing validation output + +```text +======================================== + OpenEnv Submission Validator +======================================== +[16:37:15] Repo: /tmp/rl-agent-readme-pr +[16:37:15] Ping URL: https://advikdivekar-scheme-enrollment-env.hf.space + +[16:37:15] Step 1/8: Repo structure checks ... +[16:37:15] PASSED -- README present: README.md +[16:37:15] PASSED -- Root inference script present: inference.py +[16:37:15] PASSED -- openenv.yaml present: openenv.yaml +[16:37:15] PASSED -- Dockerfile present: Dockerfile +[16:37:15] PASSED -- Root models.py present: models.py +[16:37:15] PASSED -- server package present: server +[16:37:15] PASSED -- tests directory present: tests +[16:37:15] Step 2/8: Inference contract checks ... +[16:37:15] PASSED -- OpenAI client imported in inference.py +[16:37:15] PASSED -- API_BASE_URL read from env with default +[16:37:15] PASSED -- MODEL_NAME read from env with default +[16:37:15] PASSED -- HF_TOKEN read from env without default +[16:37:15] PASSED -- LOCAL_IMAGE_NAME optionally supported +[16:37:15] PASSED -- OpenAI client configured from required env vars +[16:37:15] PASSED -- Structured START log marker present +[16:37:15] PASSED -- Structured STEP log marker present +[16:37:15] PASSED -- Structured END log marker present +[16:37:15] Step 3/8: OpenEnv spec surface checks ... +[16:37:15] PASSED -- openenv.yaml declares spec_version +[16:37:15] PASSED -- openenv.yaml declares runtime +[16:37:15] PASSED -- openenv.yaml declares app entrypoint +[16:37:15] PASSED -- openenv.yaml declares port +[16:37:15] PASSED -- Environment defines reset() +[16:37:15] PASSED -- Environment defines step() +[16:37:15] PASSED -- Environment exposes state property/method +[16:37:15] PASSED -- Detected 3+ task definitions in environment logic +[16:37:15] Step 4/8: README submission-content checks ... +[16:37:15] PASSED -- README documents action space +[16:37:15] PASSED -- README documents observation space +[16:37:15] PASSED -- README documents setup instructions +[16:37:15] PASSED -- README documents tasks +[16:37:15] PASSED -- README documents baseline outputs +[16:37:15] Step 5/8: Pinging HF Space (https://advikdivekar-scheme-enrollment-env.hf.space/reset) ... +[16:37:17] PASSED -- HF Space is live and responds to /reset +[16:37:18] PASSED -- HF Space /health responds with HTTP 200 +[16:37:18] Step 6/8: Running docker build ... +[16:37:47] PASSED -- Docker build succeeded +[16:37:47] Step 7/8: Running openenv validate ... +[16:38:52] PASSED -- openenv validate passed +[16:38:52] [OK] workspace: Ready for multi-mode deployment +[16:38:52] Step 8/8: Local quality checks ... +[16:38:53] PASSED -- Key Python files compile cleanly +[16:40:07] PASSED -- pytest tests/ passed + +======================================== + Validation checks passed: 35 + Submission looks ready for hackathon review. +======================================== +``` -- **Multi-step information gathering** — iterative data collection before terminal decisions -- **Contextual filtering** — ignoring noise while focusing on eligibility criteria -- **Mathematical precision** — strict integer threshold adherence -- **AI safety alignment** — knowing when to defer to a human supervisor +## OpenEnv Compliance -Training an agent to score highly across all 5 tasks would produce a system deployable alongside real welfare officers to assist with applicant evaluation. +| Requirement | Status | +|---|---| +| `step()` / `reset()` / `state` property | Yes | +| Typed `Action` model | Yes | +| Typed `Observation` model | Yes | +| `openenv.yaml` present | Yes | +| `/health` endpoint | Yes | +| OpenAI-compatible inference client | Yes | +| Root `inference.py` script | Yes | +| 5 graded tasks | Yes | +| FastAPI runtime | Yes | +| Resource declaration in yaml | Yes | +| `API_BASE_URL`, `MODEL_NAME`, `HF_TOKEN` read in `inference.py` | Yes | +| Optional `LOCAL_IMAGE_NAME` in `inference.py` | Yes | +| Structured `[START]` / `[STEP]` / `[END]` stdout logs | Yes | + +## Closing Note + +This benchmark is strongest when understood as a test of **operational judgment**, not just reasoning accuracy. The agent must be precise, skeptical, protocol-aware, and restrained. That combination is rare in benchmarks and crucial in real administration systems. + +If an AI system can perform well here, it is not merely answering questions. It is behaving like a careful officer. diff --git a/reports/README.txt b/reports/README.txt new file mode 100644 index 0000000..151140a --- /dev/null +++ b/reports/README.txt @@ -0,0 +1,44 @@ +OpenEnv scheme_env Benchmark — Baseline Report +================================================ + +Files in this directory: + + leaderboard.csv + Model rankings sorted by average score (descending). + Columns: Model, Size, Task1, Task2, Task3, Task4, Task5, Average. + + results.json + Full results for all models including per-task scores and standard + deviations. Useful for programmatic downstream analysis. + + average_scores.png + Horizontal bar chart of each model's average score across all 5 tasks. + Bars are colour-coded: red < 0.50, orange 0.50–0.75, green > 0.75. + + task_heatmap.png + Heatmap with models as rows and tasks as columns. + Colour scale: red = 0.0, yellow = 0.5, green = 1.0 (RdYlGn). + Cell values show the exact score. + + efficiency_scatter.png + Scatter plot of average score (x) vs Task 4 score (y). + Task 4 is the escalation-dilemma task and tests protocol adherence. + Each point is labelled with the short model name. + + difficulty_profile.png + Line chart showing mean score per task across all 8 models with error + bars (±1 std). Reveals which tasks are hardest / easiest on average. + + summary.txt + Plain-text summary: best/worst model, hardest/easiest task, and any + model that scored 1.0 on every task. + + README.txt + This file. + +Tasks: + Task 1 — Basic eligibility check + Task 2 — Multi-criterion scheme selection + Task 3 — Income-threshold boundary case + Task 4 — Escalation dilemma (employment data conflict) + Task 5 — Document-verification age conflict diff --git a/reports/average_scores.png b/reports/average_scores.png new file mode 100644 index 0000000000000000000000000000000000000000..1934918d8e9d420b5ab73d934b85bb5c42018d98 GIT binary patch literal 50891 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 z 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 reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 03: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 1 — repeat 2/3] +[START] task=scheme_discovery env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '25', 'income': '7782', 'marital_status': 'divorced', 'state_of_residence': 'Uttar Pradesh', 'number_of_children': '3'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 03: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 1 — repeat 3/3] +[START] task=scheme_discovery env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '32', 'income': '1847', 'bank_name': 'PNB'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMKVY') reward=3.00 done=true error=null + Step 03: approve_scheme('PMKVY') -> reward=3.0, done=True + SUBOPTIMAL: PMKVY is eligible but PMAY provides greater benefit. +[END] success=false steps=3 score=0.500 rewards=0.00,0.00,3.00 + + GRADER SCORE: 0.500 / 1.0 + + [Task 2 — repeat 1/3] +[START] task=missing_data env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '47', 'income': '3809', 'bank_name': 'SBI', 'state_of_residence': 'Maharashtra', 'number_of_children': '4'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 03: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 2 — repeat 2/3] +[START] task=missing_data env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '54', 'income': '2075', 'number_of_children': '3', 'bank_name': 'SBI'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 03: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 2 — repeat 3/3] +[START] task=missing_data env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '27', 'income': '4839', 'bank_name': 'UCO Bank', 'state_of_residence': 'Bihar'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 03: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 1/3] +[START] task=boundary_fraud env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '28', 'state_of_residence': 'Bihar'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('income') reward=0.00 done=false error=null + Step 02: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11838. +[STEP] step=3 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 03: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 11838 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 2/3] +[START] task=boundary_fraud env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '32', 'marital_status': 'widowed'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('income') reward=0.00 done=false error=null + Step 02: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10356. +[STEP] step=3 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 03: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 10356 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 3/3] +[START] task=boundary_fraud env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '27', 'state_of_residence': 'Maharashtra', 'bank_name': 'PNB'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('income') reward=0.00 done=false error=null + Step 02: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10026. +[STEP] step=3 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 03: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 10026 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 1/3] +[START] task=escalation_dilemma env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '33', 'income': '14586', 'occupation': 'student', 'has_aadhaar': 'True', 'number_of_children': '4', 'marital_status': 'widowed'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BSNL for the past 6 years with active +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 2/3] +[START] task=escalation_dilemma env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '32', 'income': '11911', 'occupation': 'student', 'has_aadhaar': 'True', 'number_of_children': '1', 'bank_name': 'UCO Bank'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of Coal India for the past 6 years with a +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 3/3] +[START] task=escalation_dilemma env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '43', 'income': '11888', 'occupation': 'student', 'has_aadhaar': 'True', 'number_of_children': '4', 'bank_name': 'SBI', 'state_of_residence': 'Gujarat'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of State Bank of India for the past 6 yea +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 1/3] +[START] task=document_conflict env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '8160', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'state_of_residence': 'Uttar Pradesh', 'marital_status': 'divorced'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 01: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: You must verify the Aadhaar card before approving any scheme when age is a critical eligibility fact +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=3 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 03: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=3 score=1.000 rewards=-1.50,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 2/3] +[START] task=document_conflict env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '6654', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '3'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 01: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: You must verify the Aadhaar card before approving any scheme when age is a critical eligibility fact +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=3 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 03: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=3 score=1.000 rewards=-1.50,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 3/3] +[START] task=document_conflict env=scheme_env model=mistralai/mistral-nemotron + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '34', 'income': '8482', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '3'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 01: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: You must verify the Aadhaar card before approving any scheme when age is a critical eligibility fact +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 37 years. Note: this differs from the self-reported age of 34 in the prof +[STEP] step=3 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 03: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=37, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=3 score=1.000 rewards=-1.50,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + +============================================================ + FINAL GRADER SCORES (mean ± std over 3 repeats) +============================================================ + Task 1 (Scheme Discovery ): 0.833 ± 0.289 / 1.0 + Task 2 (Missing Data ): 1.000 ± 0.000 / 1.0 + Task 3 (Boundary Fraud ): 1.000 ± 0.000 / 1.0 + Task 4 (Escalation Dilemma ): 1.000 ± 0.000 / 1.0 + Task 5 (Document Conflict ): 1.000 ± 0.000 / 1.0 + Average : 0.967 / 1.0 +============================================================ +SCORE_JSON {"task": 1, "score": 0.8333} +STD_JSON {"task": 1, "std": 0.2887} +SCORE_JSON {"task": 2, "score": 1.0} +STD_JSON {"task": 2, "std": 0.0} +SCORE_JSON {"task": 3, "score": 1.0} +STD_JSON {"task": 3, "std": 0.0} +SCORE_JSON {"task": 4, "score": 1.0} +STD_JSON {"task": 4, "std": 0.0} +SCORE_JSON {"task": 5, "score": 1.0} +STD_JSON {"task": 5, "std": 0.0} diff --git a/reports/inference_logs/inference_nemotron3_120b.txt b/reports/inference_logs/inference_nemotron3_120b.txt new file mode 100644 index 0000000..aa28394 --- /dev/null +++ b/reports/inference_logs/inference_nemotron3_120b.txt @@ -0,0 +1,358 @@ + +============================================================ + SCHEME ENV — OPTION A EVALUATION + Model : nvidia/nemotron-3-super-120b-a12b + Env : http://localhost:7860 + Repeats : 3 per task +============================================================ + + [Task 1 — repeat 1/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '35', 'income': '5969', 'number_of_children': '4'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=approve_scheme('PMAY') reward=10.00 done=true error=null + Step 04: approve_scheme('PMAY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMAY — optimal scheme. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 1 — repeat 2/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '25', 'income': '4455', 'bank_name': 'Canara Bank', 'state_of_residence': 'Rajasthan'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMAY') reward=10.00 done=true error=null + Step 03: approve_scheme('PMAY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMAY — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 1 — repeat 3/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '31', 'income': '5924', 'marital_status': 'divorced'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMAY') reward=10.00 done=true error=null + Step 03: approve_scheme('PMAY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMAY — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 2 — repeat 1/3] +[START] task=missing_data env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '30', 'income': '1542', 'marital_status': 'divorced', 'number_of_children': '0', 'state_of_residence': 'Bihar'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMAY') reward=-5.00 done=true error=null + Step 03: approve_scheme('PMAY') -> reward=-5.0, done=True + ERROR: Applicant does not qualify for 'PMAY'. +[END] success=false steps=3 score=0.000 rewards=0.00,0.00,-5.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 2 — repeat 2/3] +[START] task=missing_data env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '40', 'income': '4467', 'number_of_children': '2', 'state_of_residence': 'Rajasthan'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMAY') reward=-5.00 done=true error=null + Step 03: approve_scheme('PMAY') -> reward=-5.0, done=True + ERROR: Applicant does not qualify for 'PMAY'. +[END] success=false steps=3 score=0.000 rewards=0.00,0.00,-5.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 2 — repeat 3/3] +[START] task=missing_data env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '50', 'income': '3776', 'marital_status': 'widowed', 'bank_name': 'SBI', 'state_of_residence': 'Rajasthan'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMAY') reward=-5.00 done=true error=null + Step 03: approve_scheme('PMAY') -> reward=-5.0, done=True + ERROR: Applicant does not qualify for 'PMAY'. +[END] success=false steps=3 score=0.000 rewards=0.00,0.00,-5.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 1/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '26', 'number_of_children': '1', 'state_of_residence': 'Rajasthan', 'bank_name': 'SBI'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('income') reward=0.00 done=false error=null + Step 02: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10195. +[STEP] step=3 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 03: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=4 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 04: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Income 10195 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 2/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '30', 'bank_name': 'Bank of Baroda', 'number_of_children': '2'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('income') reward=0.00 done=false error=null + Step 02: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10217. +[STEP] step=3 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 03: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=4 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 04: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Income 10217 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 3/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '27', 'number_of_children': '4', 'marital_status': 'married'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('income') reward=0.00 done=false error=null + Step 02: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10088. +[STEP] step=3 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 03: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=4 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 04: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Income 10088 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 1/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '23', 'income': '11636', 'occupation': 'student', 'has_aadhaar': 'True', 'bank_name': 'Canara Bank'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BSNL for the past 6 years with active +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 2/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '40', 'income': '16723', 'occupation': 'student', 'has_aadhaar': 'True', 'number_of_children': '4', 'bank_name': 'Canara Bank'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of Indian Railways for the past 6 years w +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 3/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '34', 'income': '15485', 'occupation': 'student', 'has_aadhaar': 'True', 'state_of_residence': 'Bihar', 'number_of_children': '3'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of GAIL India for the past 6 years with a +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 1/3] +[START] task=document_conflict env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '7383', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'bank_name': 'PNB', 'number_of_children': '4'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 01: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: You must verify the Aadhaar card before approving any scheme when age is a critical eligibility fact +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=3 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 03: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=3 score=1.000 rewards=-1.50,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 2/3] +[START] task=document_conflict env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '34', 'income': '7689', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'marital_status': 'divorced'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 34 in the prof +[STEP] step=2 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 02: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 3/3] +[START] task=document_conflict env=scheme_env model=nvidia/nemotron-3-super-120b-a12b + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '6093', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'state_of_residence': 'Bihar', 'marital_status': 'divorced'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 01: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: You must verify the Aadhaar card before approving any scheme when age is a critical eligibility fact +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=3 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 03: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=3 score=1.000 rewards=-1.50,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + +============================================================ + FINAL GRADER SCORES (mean ± std over 3 repeats) +============================================================ + Task 1 (Scheme Discovery ): 1.000 ± 0.000 / 1.0 + Task 2 (Missing Data ): 0.000 ± 0.000 / 1.0 + Task 3 (Boundary Fraud ): 1.000 ± 0.000 / 1.0 + Task 4 (Escalation Dilemma ): 1.000 ± 0.000 / 1.0 + Task 5 (Document Conflict ): 1.000 ± 0.000 / 1.0 + Average : 0.800 / 1.0 +============================================================ +SCORE_JSON {"task": 1, "score": 1.0} +STD_JSON {"task": 1, "std": 0.0} +SCORE_JSON {"task": 2, "score": 0.0} +STD_JSON {"task": 2, "std": 0.0} +SCORE_JSON {"task": 3, "score": 1.0} +STD_JSON {"task": 3, "std": 0.0} +SCORE_JSON {"task": 4, "score": 1.0} +STD_JSON {"task": 4, "std": 0.0} +SCORE_JSON {"task": 5, "score": 1.0} +STD_JSON {"task": 5, "std": 0.0} diff --git a/reports/inference_logs/inference_nemotron3_nano30b.txt b/reports/inference_logs/inference_nemotron3_nano30b.txt new file mode 100644 index 0000000..63ec0ae --- /dev/null +++ b/reports/inference_logs/inference_nemotron3_nano30b.txt @@ -0,0 +1,352 @@ + +============================================================ + SCHEME ENV — OPTION A EVALUATION + Model : nvidia/nemotron-3-nano-30b-a3b + Env : http://localhost:7860 + Repeats : 3 per task +============================================================ + + [Task 1 — repeat 1/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '19', 'income': '5888', 'bank_name': 'UCO Bank', 'number_of_children': '2', 'state_of_residence': 'Uttar Pradesh'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 03: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 1 — repeat 2/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '27', 'income': '9982', 'number_of_children': '0', 'bank_name': 'Bank of Baroda'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 03: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 1 — repeat 3/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '32', 'income': '1057', 'state_of_residence': 'Bihar', 'marital_status': 'divorced', 'bank_name': 'PNB'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMAY') reward=10.00 done=true error=null + Step 03: approve_scheme('PMAY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMAY — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 2 — repeat 1/3] +[START] task=missing_data env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '34', 'income': '1576', 'number_of_children': '1', 'bank_name': 'UCO Bank'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=approve_scheme('PMAY') reward=-5.00 done=true error=null + Step 03: approve_scheme('PMAY') -> reward=-5.0, done=True + ERROR: Applicant does not qualify for 'PMAY'. +[END] success=false steps=3 score=0.000 rewards=0.00,0.00,-5.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 2 — repeat 2/3] +[START] task=missing_data env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '53', 'income': '4659', 'number_of_children': '4', 'state_of_residence': 'Maharashtra'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=approve_scheme('PMAY') reward=-5.00 done=true error=null + Step 03: approve_scheme('PMAY') -> reward=-5.0, done=True + ERROR: Applicant does not qualify for 'PMAY'. +[END] success=false steps=3 score=0.000 rewards=0.00,0.00,-5.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 2 — repeat 3/3] +[START] task=missing_data env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '41', 'income': '2243', 'state_of_residence': 'Gujarat', 'number_of_children': '2', 'bank_name': 'PNB'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=approve_scheme('PMAY') reward=-5.00 done=true error=null + Step 03: approve_scheme('PMAY') -> reward=-5.0, done=True + ERROR: Applicant does not qualify for 'PMAY'. +[END] success=false steps=3 score=0.000 rewards=0.00,0.00,-5.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 1/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '31', 'bank_name': 'Canara Bank', 'number_of_children': '1', 'marital_status': 'married'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('income') reward=0.00 done=false error=null + Step 02: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10770. +[STEP] step=3 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 03: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=4 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 04: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Income 10770 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 2/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '33', 'marital_status': 'divorced', 'state_of_residence': 'Maharashtra'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10185. +[STEP] step=4 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 04: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Income 10185 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 3/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '27', 'marital_status': 'widowed', 'number_of_children': '1'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('income') reward=0.00 done=false error=null + Step 02: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10951. +[STEP] step=3 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 03: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=4 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 04: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Income 10951 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 1/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '33', 'income': '13674', 'occupation': 'student', 'has_aadhaar': 'True', 'bank_name': 'PNB'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of State Bank of India for the past 6 yea +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 2/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '29', 'income': '11064', 'occupation': 'student', 'has_aadhaar': 'True', 'number_of_children': '0'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of GAIL India for the past 6 years with a +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 3/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '41', 'income': '10119', 'occupation': 'student', 'has_aadhaar': 'True', 'state_of_residence': 'Uttar Pradesh'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BHEL for the past 6 years with active +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 1/3] +[START] task=document_conflict env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '8632', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'bank_name': 'Bank of Baroda', 'state_of_residence': 'Gujarat'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 38 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=2 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 02: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=38, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 2/3] +[START] task=document_conflict env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '7933', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'bank_name': 'SBI', 'state_of_residence': 'Uttar Pradesh', 'number_of_children': '4'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 01: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: You must verify the Aadhaar card before approving any scheme when age is a critical eligibility fact +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=3 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 03: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=3 score=1.000 rewards=-1.50,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 3/3] +[START] task=document_conflict env=scheme_env model=nvidia/nemotron-3-nano-30b-a3b + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '7429', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'state_of_residence': 'Bihar', 'bank_name': 'Bank of Baroda', 'number_of_children': '0'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=2 action=reject_applicant('NO_ELIGIBLE_SCHEME') reward=5.00 done=true error=null + Step 02: reject_applicant('NO_ELIGIBLE_SCHEME') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + +============================================================ + FINAL GRADER SCORES (mean ± std over 3 repeats) +============================================================ + Task 1 (Scheme Discovery ): 1.000 ± 0.000 / 1.0 + Task 2 (Missing Data ): 0.000 ± 0.000 / 1.0 + Task 3 (Boundary Fraud ): 1.000 ± 0.000 / 1.0 + Task 4 (Escalation Dilemma ): 1.000 ± 0.000 / 1.0 + Task 5 (Document Conflict ): 1.000 ± 0.000 / 1.0 + Average : 0.800 / 1.0 +============================================================ +SCORE_JSON {"task": 1, "score": 1.0} +STD_JSON {"task": 1, "std": 0.0} +SCORE_JSON {"task": 2, "score": 0.0} +STD_JSON {"task": 2, "std": 0.0} +SCORE_JSON {"task": 3, "score": 1.0} +STD_JSON {"task": 3, "std": 0.0} +SCORE_JSON {"task": 4, "score": 1.0} +STD_JSON {"task": 4, "std": 0.0} +SCORE_JSON {"task": 5, "score": 1.0} +STD_JSON {"task": 5, "std": 0.0} diff --git a/reports/inference_logs/inference_nemotron51b.txt b/reports/inference_logs/inference_nemotron51b.txt new file mode 100644 index 0000000..03f64cd --- /dev/null +++ b/reports/inference_logs/inference_nemotron51b.txt @@ -0,0 +1,370 @@ + +============================================================ + SCHEME ENV — OPTION A EVALUATION + Model : nvidia/llama-3.3-nemotron-super-49b-v1 + Env : http://localhost:7860 + Repeats : 3 per task +============================================================ + + [Task 1 — repeat 1/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '19', 'income': '1437', 'number_of_children': '1', 'state_of_residence': 'Rajasthan', 'bank_name': 'PNB'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 04: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 1 — repeat 2/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '19', 'income': '7676', 'state_of_residence': 'Rajasthan'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 05: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=false steps=5 score=0.950 rewards=0.00,0.00,0.00,-0.10,10.00 + + GRADER SCORE: 0.950 / 1.0 + + [Task 1 — repeat 3/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '26', 'income': '1391', 'state_of_residence': 'Uttar Pradesh'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=approve_scheme('PMKVY') reward=3.00 done=true error=null + Step 05: approve_scheme('PMKVY') -> reward=3.0, done=True + SUBOPTIMAL: PMKVY is eligible but PMAY provides greater benefit. +[END] success=false steps=5 score=0.450 rewards=0.00,0.00,0.00,-0.10,3.00 + + GRADER SCORE: 0.450 / 1.0 + + [Task 2 — repeat 1/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '32', 'income': '3251', 'state_of_residence': 'Rajasthan'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 04: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=false steps=4 score=0.960 rewards=0.00,0.00,0.00,10.00 + + GRADER SCORE: 0.960 / 1.0 + + [Task 2 — repeat 2/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '22', 'income': '2235', 'state_of_residence': 'Bihar'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 01: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=3 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 03: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 2 — repeat 3/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '28', 'income': '4274', 'state_of_residence': 'Rajasthan', 'number_of_children': '4', 'bank_name': 'SBI'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 04: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=false steps=4 score=0.910 rewards=0.00,0.00,-0.10,10.00 + + GRADER SCORE: 0.910 / 1.0 + + [Task 3 — repeat 1/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '26', 'marital_status': 'married'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11975. +[STEP] step=4 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 04: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 11975 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 2/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '26', 'bank_name': 'Bank of Baroda', 'number_of_children': '3'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11092. +[STEP] step=4 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 04: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 11092 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 3/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '27', 'marital_status': 'divorced', 'number_of_children': '3'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10488. +[STEP] step=4 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 04: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 10488 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 1/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '38', 'income': '11505', 'occupation': 'student', 'has_aadhaar': 'True', 'state_of_residence': 'Maharashtra', 'marital_status': 'married'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of Indian Railways for the past 6 years w +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 2/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '35', 'income': '11663', 'occupation': 'student', 'has_aadhaar': 'True', 'state_of_residence': 'Maharashtra'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of GAIL India for the past 6 years with a +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 3/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '24', 'income': '18630', 'occupation': 'student', 'has_aadhaar': 'True', 'number_of_children': '1', 'marital_status': 'divorced', 'state_of_residence': 'Uttar Pradesh'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BSNL for the past 6 years with active +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 1/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '34', 'income': '8492', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '2', 'bank_name': 'SBI', 'state_of_residence': 'Bihar'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 34 in the prof +[STEP] step=2 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 02: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 2/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '34', 'income': '7281', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'state_of_residence': 'Maharashtra', 'number_of_children': '1', 'bank_name': 'PNB'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 37 years. Note: this differs from the self-reported age of 34 in the prof +[STEP] step=2 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 02: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=37, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 3/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '8158', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'bank_name': 'Bank of Baroda'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 37 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=2 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 02: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=37, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + +============================================================ + FINAL GRADER SCORES (mean ± std over 3 repeats) +============================================================ + Task 1 (Scheme Discovery ): 0.800 ± 0.304 / 1.0 + Task 2 (Missing Data ): 0.957 ± 0.045 / 1.0 + Task 3 (Boundary Fraud ): 1.000 ± 0.000 / 1.0 + Task 4 (Escalation Dilemma ): 1.000 ± 0.000 / 1.0 + Task 5 (Document Conflict ): 1.000 ± 0.000 / 1.0 + Average : 0.951 / 1.0 +============================================================ +SCORE_JSON {"task": 1, "score": 0.8} +STD_JSON {"task": 1, "std": 0.3041} +SCORE_JSON {"task": 2, "score": 0.9567} +STD_JSON {"task": 2, "std": 0.0451} +SCORE_JSON {"task": 3, "score": 1.0} +STD_JSON {"task": 3, "std": 0.0} +SCORE_JSON {"task": 4, "score": 1.0} +STD_JSON {"task": 4, "std": 0.0} +SCORE_JSON {"task": 5, "score": 1.0} +STD_JSON {"task": 5, "std": 0.0} diff --git a/reports/inference_logs/inference_nemotron_mini4b.txt b/reports/inference_logs/inference_nemotron_mini4b.txt new file mode 100644 index 0000000..95d3d14 --- /dev/null +++ b/reports/inference_logs/inference_nemotron_mini4b.txt @@ -0,0 +1,396 @@ + +============================================================ + SCHEME ENV — OPTION A EVALUATION + Model : nvidia/nemotron-mini-4b-instruct + Env : http://localhost:7860 + Repeats : 3 per task +============================================================ + + [Task 1 — repeat 1/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '25', 'income': '3626', 'state_of_residence': 'Bihar', 'marital_status': 'divorced', 'number_of_children': '3'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=approve_scheme('PMKVY') reward=3.00 done=true error=null + Step 03: approve_scheme('PMKVY') -> reward=3.0, done=True + SUBOPTIMAL: PMKVY is eligible but PMAY provides greater benefit. +[END] success=false steps=3 score=0.500 rewards=0.00,0.00,3.00 + + GRADER SCORE: 0.500 / 1.0 + + [Task 1 — repeat 2/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '34', 'income': '3917', 'number_of_children': '4', 'state_of_residence': 'Bihar', 'marital_status': 'unmarried'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=ask_question('income') reward=-0.10 done=false error=null + Step 03: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=4 action=approve_scheme('PMKVY') reward=3.00 done=true error=null + Step 04: approve_scheme('PMKVY') -> reward=3.0, done=True + SUBOPTIMAL: PMKVY is eligible but PMAY provides greater benefit. +[END] success=false steps=4 score=0.450 rewards=0.00,0.00,-0.10,3.00 + + GRADER SCORE: 0.450 / 1.0 + + [Task 1 — repeat 3/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '33', 'income': '2858', 'bank_name': 'SBI'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=approve_scheme('PMKVY') reward=3.00 done=true error=null + Step 03: approve_scheme('PMKVY') -> reward=3.0, done=True + SUBOPTIMAL: PMKVY is eligible but PMAY provides greater benefit. +[END] success=false steps=3 score=0.500 rewards=0.00,0.00,3.00 + + GRADER SCORE: 0.500 / 1.0 + + [Task 2 — repeat 1/3] +[START] task=missing_data env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '48', 'income': '1982', 'number_of_children': '3', 'marital_status': 'married'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 03: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 2 — repeat 2/3] +[START] task=missing_data env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '36', 'income': '4164', 'number_of_children': '1', 'marital_status': 'unmarried', 'bank_name': 'Canara Bank'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 01: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=2 action=request_document('pan_card') reward=0.00 done=false error=null + Step 02: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=3 action=ask_question('occupation') reward=0.00 done=false error=null + Step 03: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=4 action=escalate('MANUAL_REVIEW_REQUIRED') reward=-2.00 done=true error=null + Step 04: escalate('MANUAL_REVIEW_REQUIRED') -> reward=-2.0, done=True + INCORRECT ESCALATION: Escalation is only appropriate when data integrity is genuinely compromised. This case has suffici +[END] success=false steps=4 score=0.000 rewards=0.00,0.00,0.00,-2.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 2 — repeat 3/3] +[START] task=missing_data env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '43', 'income': '4120', 'bank_name': 'PNB'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 03: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 1/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '29', 'marital_status': 'married'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10437. +[STEP] step=4 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 04: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 10437 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 2/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '24', 'bank_name': 'Canara Bank', 'state_of_residence': 'Uttar Pradesh', 'marital_status': 'divorced'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11651. +[STEP] step=4 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 04: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 11651 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 3/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '28', 'bank_name': 'UCO Bank', 'state_of_residence': 'Maharashtra', 'marital_status': 'divorced'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10915. +[STEP] step=4 action=escalate('DATA_MISMATCH') reward=-2.00 done=true error=null + Step 04: escalate('DATA_MISMATCH') -> reward=-2.0, done=True + INCORRECT ESCALATION: Escalation is only appropriate when data integrity is genuinely compromised. This case has suffici +[END] success=false steps=4 score=0.000 rewards=0.00,0.00,0.00,-2.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 4 — repeat 1/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '30', 'income': '19888', 'occupation': 'student', 'has_aadhaar': 'True', 'bank_name': 'Canara Bank', 'state_of_residence': 'Maharashtra', 'marital_status': 'widowed'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 01: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=2 action=ask_question('income') reward=-0.10 done=false error=null + Step 02: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=3 action=escalate('DATA_MISMATCH') reward=-1.00 done=false error=null + Step 03: escalate('DATA_MISMATCH') -> reward=-1.0, done=False + INSUFFICIENT BASIS FOR ESCALATION: First request the PAN card to verify the suspected employment contradiction. Escalate +[STEP] step=4 action=request_document('pan_card') reward=0.00 done=false error=null + Step 04: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BSNL for the past 6 years with active +[STEP] step=5 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 05: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=false steps=5 score=0.950 rewards=-0.10,-0.10,-1.00,0.00,10.00 + + GRADER SCORE: 0.950 / 1.0 + + [Task 4 — repeat 2/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '30', 'income': '16335', 'occupation': 'student', 'has_aadhaar': 'True', 'state_of_residence': 'Rajasthan'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 01: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=2 action=ask_question('income') reward=-0.10 done=false error=null + Step 02: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=3 action=request_document('pan_card') reward=0.00 done=false error=null + Step 03: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BHEL for the past 6 years with active +[STEP] step=4 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 04: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=false steps=4 score=0.950 rewards=-0.10,-0.10,0.00,10.00 + + GRADER SCORE: 0.950 / 1.0 + + [Task 4 — repeat 3/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '41', 'income': '19645', 'occupation': 'student', 'has_aadhaar': 'True', 'bank_name': 'SBI', 'number_of_children': '2'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 01: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=2 action=escalate('DATA_MISMATCH') reward=-1.00 done=false error=null + Step 02: escalate('DATA_MISMATCH') -> reward=-1.0, done=False + INSUFFICIENT BASIS FOR ESCALATION: First request the PAN card to verify the suspected employment contradiction. Escalate +[STEP] step=3 action=request_document('pan_card') reward=0.00 done=false error=null + Step 03: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BHEL for the past 6 years with active +[STEP] step=4 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 04: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=4 score=1.000 rewards=-0.10,-1.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 1/3] +[START] task=document_conflict env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '7344', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'marital_status': 'married'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 01: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=2 action=request_document('pan_card') reward=0.00 done=false error=null + Step 02: request_document('pan_card') -> reward=0.0, done=False + PAN card verified. No anomalies found in tax records. For age verification, the Aadhaar card is the authoritative docume +[STEP] step=3 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 03: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: You must verify the Aadhaar card before approving any scheme when age is a critical eligibility fact +[STEP] step=4 action=escalate('MANUAL_REVIEW_REQUIRED') reward=-2.00 done=true error=null + Step 04: escalate('MANUAL_REVIEW_REQUIRED') -> reward=-2.0, done=True + INCORRECT ESCALATION: Escalation is only appropriate when data integrity is genuinely compromised. This case has suffici +[END] success=false steps=4 score=0.000 rewards=-0.10,0.00,-1.50,-2.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 5 — repeat 2/3] +[START] task=document_conflict env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '34', 'income': '8839', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'bank_name': 'SBI', 'state_of_residence': 'Maharashtra', 'marital_status': 'widowed'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 01: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=2 action=request_document('pan_card') reward=0.00 done=false error=null + Step 02: request_document('pan_card') -> reward=0.0, done=False + PAN card verified. No anomalies found in tax records. For age verification, the Aadhaar card is the authoritative docume +[STEP] step=3 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 03: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: You must verify the Aadhaar card before approving any scheme when age is a critical eligibility fact +[STEP] step=4 action=escalate('MANUAL_REVIEW_REQUIRED') reward=-2.00 done=true error=null + Step 04: escalate('MANUAL_REVIEW_REQUIRED') -> reward=-2.0, done=True + INCORRECT ESCALATION: Escalation is only appropriate when data integrity is genuinely compromised. This case has suffici +[END] success=false steps=4 score=0.000 rewards=-0.10,0.00,-1.50,-2.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 5 — repeat 3/3] +[START] task=document_conflict env=scheme_env model=nvidia/nemotron-mini-4b-instruct + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '8666', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '1', 'bank_name': 'PNB'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 01: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=2 action=request_document('pan_card') reward=0.00 done=false error=null + Step 02: request_document('pan_card') -> reward=0.0, done=False + PAN card verified. No anomalies found in tax records. For age verification, the Aadhaar card is the authoritative docume +[STEP] step=3 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 03: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: You must verify the Aadhaar card before approving any scheme when age is a critical eligibility fact +[STEP] step=4 action=ask_question('self_reported_age') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=5 action=ask_question('aadhaar_age') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=6 action=escalate('MANUAL_REVIEW_REQUIRED') reward=-2.00 done=true error=null + Step 06: escalate('MANUAL_REVIEW_REQUIRED') -> reward=-2.0, done=True + INCORRECT ESCALATION: Escalation is only appropriate when data integrity is genuinely compromised. This case has suffici +[END] success=false steps=6 score=0.000 rewards=-0.10,0.00,-1.50,-2.00 + + GRADER SCORE: 0.000 / 1.0 + +============================================================ + FINAL GRADER SCORES (mean ± std over 3 repeats) +============================================================ + Task 1 (Scheme Discovery ): 0.483 ± 0.029 / 1.0 + Task 2 (Missing Data ): 0.667 ± 0.577 / 1.0 + Task 3 (Boundary Fraud ): 0.667 ± 0.577 / 1.0 + Task 4 (Escalation Dilemma ): 0.967 ± 0.029 / 1.0 + Task 5 (Document Conflict ): 0.000 ± 0.000 / 1.0 + Average : 0.557 / 1.0 +============================================================ +SCORE_JSON {"task": 1, "score": 0.4833} +STD_JSON {"task": 1, "std": 0.0289} +SCORE_JSON {"task": 2, "score": 0.6667} +STD_JSON {"task": 2, "std": 0.5774} +SCORE_JSON {"task": 3, "score": 0.6667} +STD_JSON {"task": 3, "std": 0.5774} +SCORE_JSON {"task": 4, "score": 0.9667} +STD_JSON {"task": 4, "std": 0.0289} +SCORE_JSON {"task": 5, "score": 0.0} +STD_JSON {"task": 5, "std": 0.0} diff --git a/reports/inference_logs/inference_nemotron_nano.txt b/reports/inference_logs/inference_nemotron_nano.txt new file mode 100644 index 0000000..e19b822 --- /dev/null +++ b/reports/inference_logs/inference_nemotron_nano.txt @@ -0,0 +1,562 @@ + +============================================================ + SCHEME ENV — OPTION A EVALUATION + Model : nvidia/llama-3.1-nemotron-nano-8b-v1 + Env : http://localhost:7860 + Repeats : 3 per task +============================================================ + + [Task 1 — repeat 1/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '27', 'income': '2415', 'bank_name': 'PNB', 'marital_status': 'divorced'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=3 action=ask_question('income') reward=-0.10 done=false error=null + Step 03: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 04: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=5 action=approve_scheme('PMKVY') reward=3.00 done=true error=null + Step 05: approve_scheme('PMKVY') -> reward=3.0, done=True + SUBOPTIMAL: PMKVY is eligible but PMAY provides greater benefit. +[END] success=false steps=5 score=0.400 rewards=0.00,0.00,-0.10,-0.10,3.00 + + GRADER SCORE: 0.400 / 1.0 + + [Task 1 — repeat 2/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '22', 'income': '5621', 'marital_status': 'divorced'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=approve_scheme('PMKVY') reward=3.00 done=true error=null + Step 05: approve_scheme('PMKVY') -> reward=3.0, done=True + SUBOPTIMAL: PMKVY is eligible but PMAY provides greater benefit. +[END] success=false steps=5 score=0.400 rewards=0.00,0.00,-0.10,-0.10,3.00 + + GRADER SCORE: 0.400 / 1.0 + + [Task 1 — repeat 3/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '19', 'income': '8028', 'marital_status': 'divorced', 'state_of_residence': 'Maharashtra', 'number_of_children': '0'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 01: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 05: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=false steps=5 score=0.900 rewards=0.00,0.00,-0.10,-0.10,10.00 + + GRADER SCORE: 0.900 / 1.0 + + [Task 2 — repeat 1/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '40', 'income': '4258', 'marital_status': 'widowed', 'bank_name': 'PNB', 'state_of_residence': 'Bihar'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 05: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=6 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=7 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=8 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 08: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=false steps=8 score=0.730 rewards=0.00,0.00,-0.10,-0.10,-0.10,10.00 + + GRADER SCORE: 0.730 / 1.0 + + [Task 2 — repeat 2/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '57', 'income': '1596', 'bank_name': 'UCO Bank'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=3 action=check_field('age') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=check_field('income') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=check_field('age') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=check_field('age') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=check_field('has_aadhaar') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=check_field('age') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=check_field('age') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=check_field('age') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 11: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=true steps=11 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 2 — repeat 3/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '55', 'income': '1840', 'number_of_children': '0', 'state_of_residence': 'Uttar Pradesh', 'bank_name': 'PNB'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=6 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 06: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=7 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 07: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=false steps=7 score=0.730 rewards=0.00,0.00,-0.10,-0.10,-0.10,10.00 + + GRADER SCORE: 0.730 / 1.0 + + [Task 3 — repeat 1/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '29', 'bank_name': 'Bank of Baroda', 'marital_status': 'widowed'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11193. +[STEP] step=4 action=approve_scheme('PMKVY') reward=-4.00 done=true error=null + Step 04: approve_scheme('PMKVY') -> reward=-4.0, done=True + CLEAR MISS: Income 11193 exceeds all scheme thresholds (overage: Rs 1194 above PMKVY limit). Use reject_applicant when n +[END] success=false steps=4 score=0.000 rewards=0.00,0.00,0.00,-4.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 2/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '28', 'state_of_residence': 'Maharashtra'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10812. +[STEP] step=4 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=14 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 3/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '26', 'number_of_children': '1', 'state_of_residence': 'Bihar'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10424. +[STEP] step=4 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=10 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=14 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=19 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=apply_eligibility_rules('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 4 — repeat 1/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '25', 'income': '12263', 'occupation': 'student', 'has_aadhaar': 'True', 'bank_name': 'Bank of Baroda', 'state_of_residence': 'Bihar', 'marital_status': 'unmarried'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of Indian Railways for the past 6 years w +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 2/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '24', 'income': '18756', 'occupation': 'student', 'has_aadhaar': 'True', 'marital_status': 'unmarried', 'state_of_residence': 'Rajasthan'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 01: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=2 action=ask_question('income') reward=-0.10 done=false error=null + Step 02: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=3 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 03: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 04: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=5 action=ask_question('marital_status') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=6 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=7 action=ask_question('education_level') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=8 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=9 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=10 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=11 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=12 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=13 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=14 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=15 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=16 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=17 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=18 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=19 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=20 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[END] success=false steps=20 score=0.000 rewards=-0.10,-0.10,-0.10,-0.10 + + GRADER SCORE: 0.000 / 1.0 + + [Task 4 — repeat 3/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '37', 'income': '17797', 'occupation': 'student', 'has_aadhaar': 'True', 'bank_name': 'Canara Bank', 'marital_status': 'widowed'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 01: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=2 action=ask_question('income') reward=-0.10 done=false error=null + Step 02: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=3 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 03: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 04: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=5 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 05: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=6 action=ask_question('income') reward=-0.10 done=false error=null + Step 06: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=7 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 07: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=8 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 08: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=9 action=ask_question('income') reward=-0.10 done=false error=null + Step 09: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=10 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 10: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=11 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 11: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=12 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 12: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=13 action=ask_question('income') reward=-0.10 done=false error=null + Step 13: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=14 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 14: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=15 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 15: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=16 action=ask_question('income') reward=-0.10 done=false error=null + Step 16: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=17 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 17: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=18 action=ask_question('age') reward=-0.10 done=false error=null + Step 18: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=19 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 19: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=20 action=approve_scheme('PMKVY') reward=-2.00 done=true error=null + Step 20: approve_scheme('PMKVY') -> reward=-2.0, done=True + TIMEOUT: 20 steps reached without a decision. +[END] success=false steps=20 score=0.000 rewards=-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-0.10,-2.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 5 — repeat 1/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '8289', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'state_of_residence': 'Maharashtra', 'bank_name': 'Canara Bank'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=3 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=request_document('pan_card') reward=0.00 done=false error=null + Step 13: request_document('pan_card') -> reward=0.0, done=False + PAN card verified. No anomalies found in tax records. For age verification, the Aadhaar card is the authoritative docume +[STEP] step=14 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 14: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=15 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 5 — repeat 2/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '8530', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '3', 'bank_name': 'PNB'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=3 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 13: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=14 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=update_profile({'age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 5 — repeat 3/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=3 action=update_profile("{'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'aadhaar_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=update_profile({'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'aadhaar_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=update_profile({'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'aadhaar_age': '36', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=update_profile({'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=update_profile({'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=update_profile({'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=update_profile({'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=update_profile({'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=update_profile({'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=update_profile({'age': '36', 'income': '8469', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 13: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=14 action=update_profile({'age': 36, 'income': 8469, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 33, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=update_profile({'age': 36, 'income': 8469, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 33, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=update_profile({'age': 36, 'income': 8469, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 33, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=update_profile({'age': 36, 'income': 8469, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 33, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=update_profile({'age': 36, 'income': 8469, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 33, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=update_profile({'age': 36, 'income': 8469, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 33, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=update_profile({'age': 36, 'income': 8469, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 33, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + +============================================================ + FINAL GRADER SCORES (mean ± std over 3 repeats) +============================================================ + Task 1 (Scheme Discovery ): 0.567 ± 0.289 / 1.0 + Task 2 (Missing Data ): 0.820 ± 0.156 / 1.0 + Task 3 (Boundary Fraud ): 0.000 ± 0.000 / 1.0 + Task 4 (Escalation Dilemma ): 0.333 ± 0.577 / 1.0 + Task 5 (Document Conflict ): 0.000 ± 0.000 / 1.0 + Average : 0.344 / 1.0 +============================================================ +SCORE_JSON {"task": 1, "score": 0.5667} +STD_JSON {"task": 1, "std": 0.2887} +SCORE_JSON {"task": 2, "score": 0.82} +STD_JSON {"task": 2, "std": 0.1559} +SCORE_JSON {"task": 3, "score": 0.0} +STD_JSON {"task": 3, "std": 0.0} +SCORE_JSON {"task": 4, "score": 0.3333} +STD_JSON {"task": 4, "std": 0.5774} +SCORE_JSON {"task": 5, "score": 0.0} +STD_JSON {"task": 5, "std": 0.0} diff --git a/reports/inference_logs/inference_nemotron_nano8b.txt b/reports/inference_logs/inference_nemotron_nano8b.txt new file mode 100644 index 0000000..95bdca3 --- /dev/null +++ b/reports/inference_logs/inference_nemotron_nano8b.txt @@ -0,0 +1,544 @@ + +============================================================ + SCHEME ENV — OPTION A EVALUATION + Model : nvidia/llama-3.1-nemotron-nano-8b-v1 + Env : http://localhost:7860 + Repeats : 3 per task +============================================================ + + [Task 1 — repeat 1/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '20', 'income': '4708', 'number_of_children': '2', 'state_of_residence': 'Uttar Pradesh', 'marital_status': 'unmarried'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=3 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=14 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 1 — repeat 2/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '19', 'income': '7903', 'number_of_children': '2'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=3 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=14 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 1 — repeat 3/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '19', 'income': '1411', 'state_of_residence': 'Gujarat', 'bank_name': 'Canara Bank'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=3 action=ask_question('income') reward=-0.10 done=false error=null + Step 03: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('age') reward=-0.10 done=false error=null + Step 04: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=5 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=6 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=7 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 07: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=8 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 08: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=false steps=8 score=0.850 rewards=0.00,0.00,-0.10,-0.10,-0.10,10.00 + + GRADER SCORE: 0.850 / 1.0 + + [Task 2 — repeat 1/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '37', 'income': '3824', 'state_of_residence': 'Bihar'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=3 action=check_field('age') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=check_field('has_aadhaar') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=check_field('occupation') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=check_field('age') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=check_field('state_of_residence') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 09: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=false steps=9 score=0.910 rewards=0.00,0.00,-0.10,10.00 + + GRADER SCORE: 0.910 / 1.0 + + [Task 2 — repeat 2/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '19', 'income': '2401', 'state_of_residence': 'Uttar Pradesh', 'number_of_children': '2'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=3 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=14 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=check_eligibility('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 2 — repeat 3/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '34', 'income': '4943', 'state_of_residence': 'Uttar Pradesh', 'marital_status': 'unmarried'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 11: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=12 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=14 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=apply_eligibility_rules('MGNREGS') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,-0.10,-0.10 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 1/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '24', 'number_of_children': '0', 'state_of_residence': 'Gujarat'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10555. +[STEP] step=4 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=approve_scheme('PMKVY') reward=-4.00 done=true error=null + Step 06: approve_scheme('PMKVY') -> reward=-4.0, done=True + CLEAR MISS: Income 10555 exceeds all scheme thresholds (overage: Rs 556 above PMKVY limit). Use reject_applicant when no +[END] success=false steps=6 score=0.000 rewards=0.00,0.00,0.00,-4.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 2/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '29', 'state_of_residence': 'Uttar Pradesh'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11035. +[STEP] step=4 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=check_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=approve_scheme('PMKVY') reward=-4.00 done=true error=null + Step 07: approve_scheme('PMKVY') -> reward=-4.0, done=True + CLEAR MISS: Income 11035 exceeds all scheme thresholds (overage: Rs 1036 above PMKVY limit). Use reject_applicant when n +[END] success=false steps=7 score=0.000 rewards=0.00,0.00,0.00,-4.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 3/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '28', 'number_of_children': '1', 'marital_status': 'unmarried', 'bank_name': 'Bank of Baroda'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card received and verified. has_aadhaar confirmed as True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=3 action=request_document('pan_card') reward=0.00 done=false error=null + Step 03: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=4 action=ask_question('income') reward=0.00 done=false error=null + Step 04: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11082. +[STEP] step=5 action=approve_scheme('PMKVY') reward=-4.00 done=true error=null + Step 05: approve_scheme('PMKVY') -> reward=-4.0, done=True + CLEAR MISS: Income 11082 exceeds all scheme thresholds (overage: Rs 1083 above PMKVY limit). Use reject_applicant when n +[END] success=false steps=5 score=0.000 rewards=0.00,0.00,0.00,0.00,-4.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 4 — repeat 1/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '35', 'income': '10690', 'occupation': 'student', 'has_aadhaar': 'True', 'state_of_residence': 'Rajasthan'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of State Bank of India for the past 6 yea +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 2/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '44', 'income': '17519', 'occupation': 'student', 'has_aadhaar': 'True', 'bank_name': 'SBI'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 01: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=2 action=ask_question('income') reward=-0.10 done=false error=null + Step 02: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=3 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 03: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=4 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 04: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=5 action=check_scheme_eligibility('PMKVY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=14 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=16 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=17 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=check_scheme_eligibility('PMAY') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=-0.10,-0.10,-0.10,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 4 — repeat 3/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '26', 'income': '15496', 'occupation': 'student', 'has_aadhaar': 'True', 'state_of_residence': 'Uttar Pradesh', 'bank_name': 'Bank of Baroda'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 01: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=2 action=ask_question('income') reward=-0.10 done=false error=null + Step 02: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=3 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 03: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=4 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 04: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=5 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=6 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=7 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 07: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=8 action=ask_question('income') reward=-0.10 done=false error=null + Step 08: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=9 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 09: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=10 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 10: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=11 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=12 action=approve_scheme('PMKVY') reward=-1.50 done=false error=null + Step 12: approve_scheme('PMKVY') -> reward=-1.5, done=False + PROTOCOL VIOLATION: Do not approve this case before verifying employment records. Request the PAN card first to check fo +[STEP] step=13 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 13: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=14 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=15 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=16 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 16: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=17 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 17: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=18 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 18: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=19 action=ask_question('state_of_residence') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=20 action=ask_question('income') reward=-0.10 done=false error=null + Step 20: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[END] success=false steps=20 score=0.000 rewards=-0.10,-0.10,-0.10,0.00,-0.10,-0.10,-0.10,-0.10,-1.50,0.00,-0.10,-0.10,-0.10,-0.10 + + GRADER SCORE: 0.000 / 1.0 + + [Task 5 — repeat 1/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '34', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 34 in the prof +[STEP] step=2 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=3 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36', 'aadhaar_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36', 'aadhaar_age': '36', 'updated_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36', 'aadhaar_age': '36', 'updated_age': '36', 'updated_age_source': 'AADHAIR'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36', 'aadhaar_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36', 'aadhaar_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36', 'aadhaar_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36', 'aadhaar_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36', 'aadhaar_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'official_age': '36', 'aadhaar_age': '36', 'updated_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=request_document('aadhaar_age') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=14 action=update_profile("{'age': '36', 'income': '7623', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'aadhaar_age': '36'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=request_document('aadhaar_age') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=16 action=request_document('aadhaar_age') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=17 action=request_document('self_reported_age') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=18 action=request_document('aadhaar_age') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=19 action=request_document('aadhaar_age') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=20 action=request_document('self_reported_age') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[END] success=false steps=20 score=0.000 rewards=0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 5 — repeat 2/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=3 action=compare_age('official_age') reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=4 action=update_profile("{'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=5 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=6 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=7 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=8 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=9 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=10 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=11 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=12 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=13 action=request_document('age_verification_report') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=14 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=15 action=request_document('age_verification_report') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=16 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 16: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=17 action=update_profile({'age': '36', 'income': '6215', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'number_of_children': '4', 'official_age': '36'}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=18 action=update_profile({'age': 36, 'income': 6215, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 35, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=19 action=update_profile({'age': 36, 'income': 6215, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 35, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[STEP] step=20 action=update_profile({'age': 36, 'income': 6215, 'occupation': 'mason', 'has_aadhaar': True, 'self_reported_age': 35, 'number_of_children': 4, 'official_age': 36}) reward=0.00 done=false error=HTTP Error 422: Unprocessable Content +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 5 — repeat 3/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.1-nemotron-nano-8b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '6090', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'state_of_residence': 'Gujarat', 'marital_status': 'married', 'bank_name': 'Canara Bank'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=2 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 02: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=3 action=update_profile("{'age': '36', 'income': '6090', 'occupation': 'mason', 'has_aadhaar': 'True', 'state_of_residence': 'Gujarat', 'marital_status': 'married', 'bank_name': 'Canara Bank', 'official_age': '36', 'self_reported_age': '35'}") reward=0.00 done=false error=HTTP Error 422: Unprocessable Content + [ERROR] agent decision failed: JSON_PARSE_ERROR + raw={"action_type": "update_profile", "value": {'age': 36, 'income': 6090, 'occupation': 'mason', 'has_aadhaar': true, 'self_reported_age': 35, 'state_of_residence': 'Gujarat', 'marital_status': 'married' +[STEP] step=4 action=agent_error reward=0.00 done=true error=JSON_PARSE_ERROR +[END] success=false steps=4 score=0.000 rewards=0.00,0.00 + + GRADER SCORE: 0.000 / 1.0 + +============================================================ + FINAL GRADER SCORES (mean ± std over 3 repeats) +============================================================ + Task 1 (Scheme Discovery ): 0.283 ± 0.491 / 1.0 + Task 2 (Missing Data ): 0.303 ± 0.525 / 1.0 + Task 3 (Boundary Fraud ): 0.000 ± 0.000 / 1.0 + Task 4 (Escalation Dilemma ): 0.333 ± 0.577 / 1.0 + Task 5 (Document Conflict ): 0.000 ± 0.000 / 1.0 + Average : 0.184 / 1.0 +============================================================ +SCORE_JSON {"task": 1, "score": 0.2833} +STD_JSON {"task": 1, "std": 0.4907} +SCORE_JSON {"task": 2, "score": 0.3033} +STD_JSON {"task": 2, "std": 0.5254} +SCORE_JSON {"task": 3, "score": 0.0} +STD_JSON {"task": 3, "std": 0.0} +SCORE_JSON {"task": 4, "score": 0.3333} +STD_JSON {"task": 4, "std": 0.5774} +SCORE_JSON {"task": 5, "score": 0.0} +STD_JSON {"task": 5, "std": 0.0} diff --git a/reports/inference_logs/inference_nemotron_super49b.txt b/reports/inference_logs/inference_nemotron_super49b.txt new file mode 100644 index 0000000..cb2eee1 --- /dev/null +++ b/reports/inference_logs/inference_nemotron_super49b.txt @@ -0,0 +1,376 @@ + +============================================================ + SCHEME ENV — OPTION A EVALUATION + Model : nvidia/llama-3.3-nemotron-super-49b-v1 + Env : http://localhost:7860 + Repeats : 3 per task +============================================================ + + [Task 1 — repeat 1/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '27', 'income': '6336', 'bank_name': 'UCO Bank'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=request_document('pan_card') reward=0.00 done=false error=null + Step 05: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=6 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 06: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=false steps=6 score=0.950 rewards=0.00,0.00,0.00,-0.10,0.00,10.00 + + GRADER SCORE: 0.950 / 1.0 + + [Task 1 — repeat 2/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '20', 'income': '1288', 'number_of_children': '1', 'bank_name': 'UCO Bank', 'state_of_residence': 'Gujarat'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 04: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 1 — repeat 3/3] +[START] task=scheme_discovery env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '27', 'income': '4908', 'state_of_residence': 'Uttar Pradesh', 'bank_name': 'UCO Bank'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=request_document('pan_card') reward=0.00 done=false error=null + Step 05: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=6 action=approve_scheme('PMKVY') reward=3.00 done=true error=null + Step 06: approve_scheme('PMKVY') -> reward=3.0, done=True + SUBOPTIMAL: PMKVY is eligible but PMAY provides greater benefit. +[END] success=false steps=6 score=0.450 rewards=0.00,0.00,0.00,-0.10,0.00,3.00 + + GRADER SCORE: 0.450 / 1.0 + + [Task 2 — repeat 1/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '47', 'income': '1594', 'bank_name': 'Bank of Baroda', 'state_of_residence': 'Uttar Pradesh'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 04: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=false steps=4 score=0.960 rewards=0.00,0.00,0.00,10.00 + + GRADER SCORE: 0.960 / 1.0 + + [Task 2 — repeat 2/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '57', 'income': '4061', 'bank_name': 'UCO Bank', 'marital_status': 'unmarried', 'state_of_residence': 'Gujarat'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 01: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=3 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 03: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=true steps=3 score=1.000 rewards=0.00,0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 2 — repeat 3/3] +[START] task=missing_data env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '22', 'income': '4771', 'bank_name': 'UCO Bank', 'marital_status': 'divorced'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 04: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=false steps=4 score=0.960 rewards=0.00,0.00,0.00,10.00 + + GRADER SCORE: 0.960 / 1.0 + + [Task 3 — repeat 1/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '31', 'bank_name': 'UCO Bank'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11217. +[STEP] step=4 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 04: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 11217 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 2/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '25', 'bank_name': 'PNB', 'number_of_children': '0', 'state_of_residence': 'Rajasthan'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11092. +[STEP] step=4 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 04: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 11092 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 3 — repeat 3/3] +[START] task=boundary_fraud env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '25', 'state_of_residence': 'Uttar Pradesh'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11517. +[STEP] step=4 action=reject_applicant('INCOME_TOO_HIGH') reward=5.00 done=true error=null + Step 04: reject_applicant('INCOME_TOO_HIGH') -> reward=5.0, done=True + CORRECT REJECTION: Income 11517 exceeds all scheme thresholds. No eligible scheme found. +[END] success=true steps=4 score=1.000 rewards=0.00,0.00,0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 1/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '45', 'income': '19939', 'occupation': 'student', 'has_aadhaar': 'True', 'number_of_children': '2', 'state_of_residence': 'Rajasthan', 'bank_name': 'Bank of Baroda'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BHEL for the past 6 years with active +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 2/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '32', 'income': '19339', 'occupation': 'student', 'has_aadhaar': 'True', 'marital_status': 'unmarried'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BSNL for the past 6 years with active +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 4 — repeat 3/3] +[START] task=escalation_dilemma env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '23', 'income': '15394', 'occupation': 'student', 'has_aadhaar': 'True', 'bank_name': 'SBI', 'state_of_residence': 'Rajasthan', 'number_of_children': '3'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=request_document('pan_card') reward=0.00 done=false error=null + Step 01: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BSNL for the past 6 years with active +[STEP] step=2 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 02: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=true steps=2 score=1.000 rewards=0.00,10.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 1/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '6016', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'bank_name': 'PNB', 'number_of_children': '2', 'state_of_residence': 'Rajasthan'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 37 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=2 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 02: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=37, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 2/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '34', 'income': '6257', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '34', 'bank_name': 'SBI', 'number_of_children': '0', 'state_of_residence': 'Maharashtra'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 34 in the prof +[STEP] step=2 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 02: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 3/3] +[START] task=document_conflict env=scheme_env model=nvidia/llama-3.3-nemotron-super-49b-v1 + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '8148', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'state_of_residence': 'Maharashtra', 'marital_status': 'widowed'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 37 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=2 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 02: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=37, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + +============================================================ + FINAL GRADER SCORES (mean ± std over 3 repeats) +============================================================ + Task 1 (Scheme Discovery ): 0.800 ± 0.304 / 1.0 + Task 2 (Missing Data ): 0.973 ± 0.023 / 1.0 + Task 3 (Boundary Fraud ): 1.000 ± 0.000 / 1.0 + Task 4 (Escalation Dilemma ): 1.000 ± 0.000 / 1.0 + Task 5 (Document Conflict ): 1.000 ± 0.000 / 1.0 + Average : 0.955 / 1.0 +============================================================ +SCORE_JSON {"task": 1, "score": 0.8} +STD_JSON {"task": 1, "std": 0.3041} +SCORE_JSON {"task": 2, "score": 0.9733} +STD_JSON {"task": 2, "std": 0.0231} +SCORE_JSON {"task": 3, "score": 1.0} +STD_JSON {"task": 3, "std": 0.0} +SCORE_JSON {"task": 4, "score": 1.0} +STD_JSON {"task": 4, "std": 0.0} +SCORE_JSON {"task": 5, "score": 1.0} +STD_JSON {"task": 5, "std": 0.0} diff --git a/reports/inference_logs/inference_nvidia_8b.txt b/reports/inference_logs/inference_nvidia_8b.txt new file mode 100644 index 0000000..1e817b0 --- /dev/null +++ b/reports/inference_logs/inference_nvidia_8b.txt @@ -0,0 +1,672 @@ + +============================================================ + SCHEME ENV — OPTION A EVALUATION + Model : meta/llama-3.1-8b-instruct + Env : http://localhost:7860 + Repeats : 3 per task +============================================================ + + [Task 1 — repeat 1/3] +[START] task=scheme_discovery env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '32', 'income': '8687', 'bank_name': 'Bank of Baroda', 'marital_status': 'unmarried'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 05: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=6 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 06: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=false steps=6 score=0.900 rewards=0.00,0.00,-0.10,-0.10,0.00,10.00 + + GRADER SCORE: 0.900 / 1.0 + + [Task 1 — repeat 2/3] +[START] task=scheme_discovery env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '18', 'income': '1931', 'bank_name': 'PNB', 'state_of_residence': 'Maharashtra'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 05: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=6 action=request_document('pan_card') reward=0.00 done=false error=null + Step 06: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=7 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 07: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=8 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 08: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=9 action=ask_question('age') reward=-0.10 done=false error=null + Step 09: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=10 action=ask_question('income') reward=-0.10 done=false error=null + Step 10: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=11 action=ask_question('is_occupation_eligible_for_any_scheme') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=12 action=ask_question('is_occupation_eligible_for_any_scheme') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=13 action=ask_question('is_income_eligible_for_any_scheme') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=14 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 14: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=15 action=ask_question('is_occupation_eligible_for_any_scheme') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=16 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 16: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=false steps=16 score=0.700 rewards=0.00,0.00,-0.10,-0.10,0.00,0.00,-0.10,-0.10,-0.10,-0.10,0.00,10.00 + + GRADER SCORE: 0.700 / 1.0 + + [Task 1 — repeat 3/3] +[START] task=scheme_discovery env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 1/5 — SCHEME_DISCOVERY +============================================================ + Profile : {'age': '19', 'income': '7160', 'marital_status': 'unmarried', 'bank_name': 'Canara Bank'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 1/5 - SCHEME DISCOVERY - Easy] Profile is INCOMPLETE. Collect all required eligibility fields first, then identify and approve the OPT +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = mason. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 05: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=6 action=request_document('pan_card') reward=0.00 done=false error=null + Step 06: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=7 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 07: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=8 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 08: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=9 action=ask_question('age') reward=-0.10 done=false error=null + Step 09: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=10 action=ask_question('income') reward=-0.10 done=false error=null + Step 10: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=11 action=ask_question('marital_status') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=12 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 12: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=13 action=approve_scheme('PMKVY') reward=10.00 done=true error=null + Step 13: approve_scheme('PMKVY') -> reward=10.0, done=True + CORRECT: Applicant enrolled in PMKVY — optimal scheme. +[END] success=false steps=13 score=0.700 rewards=0.00,0.00,-0.10,-0.10,0.00,0.00,-0.10,-0.10,-0.10,-0.10,0.00,10.00 + + GRADER SCORE: 0.700 / 1.0 + + [Task 2 — repeat 1/3] +[START] task=missing_data env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '28', 'income': '4776', 'number_of_children': '2'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 05: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=6 action=ask_question('number_of_children') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=7 action=ask_question('document_type') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=8 action=ask_question('document_type') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=9 action=ask_question('has_pan_card') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=10 action=ask_question('has_pan_card') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=11 action=ask_question('has_pan_card') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=12 action=ask_question('has_pan_card') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=13 action=ask_question('has_pan_card') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=14 action=request_document('pan_card') reward=0.00 done=false error=null + Step 14: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=15 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 15: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=16 action=ask_question('age') reward=-0.10 done=false error=null + Step 16: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=17 action=ask_question('number_of_days_worked_last_year') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=18 action=ask_question('has_pan_card') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=19 action=ask_question('number_of_days_worked_last_year') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=20 action=ask_question('has_pan_card') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,-0.10,-0.10,0.00,0.00,-0.10,-0.10 + + GRADER SCORE: 0.000 / 1.0 + + [Task 2 — repeat 2/3] +[START] task=missing_data env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '22', 'income': '3416', 'number_of_children': '1', 'bank_name': 'Canara Bank'} + Missing : ['occupation', 'has_aadhaar'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 05: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=6 action=request_document('pan_card') reward=0.00 done=false error=null + Step 06: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=7 action=ask_question('number_of_children') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=8 action=ask_question('has_family_member_with_disability') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=9 action=ask_question('has_family_member_with_disability') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=10 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 10: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=11 action=approve_scheme('MGNREGS') reward=10.00 done=true error=null + Step 11: approve_scheme('MGNREGS') -> reward=10.0, done=True + CORRECT: Applicant enrolled in MGNREGS — optimal scheme. +[END] success=false steps=11 score=0.650 rewards=0.00,0.00,-0.10,-0.10,0.00,0.00,-0.10,10.00 + + GRADER SCORE: 0.650 / 1.0 + + [Task 2 — repeat 3/3] +[START] task=missing_data env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 2/5 — MISSING_DATA +============================================================ + Profile : {'age': '29', 'income': '1180', 'number_of_children': '4'} + Missing : ['has_aadhaar', 'occupation'] + Notif : [TASK 2/5 - MISSING DATA - Medium] Profile is INCOMPLETE. You MUST collect ALL required eligibility fields before making any terminal decisi +[STEP] step=1 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 01: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = farm_labourer. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=ask_question('income') reward=-0.10 done=false error=null + Step 04: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=5 action=ask_question('number_of_children') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=6 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 06: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=7 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=8 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 08: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=9 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=10 action=request_document('pan_card') reward=0.00 done=false error=null + Step 10: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=11 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=12 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=13 action=ask_question('age') reward=-0.10 done=false error=null + Step 13: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=14 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=15 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=16 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=17 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=18 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=19 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 19: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=20 action=ask_question('has_family_member_in_military') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,-0.10,-0.10,0.00,-0.10,0.00,-0.10,0.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 1/3] +[START] task=boundary_fraud env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '34', 'marital_status': 'divorced'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 10572. +[STEP] step=4 action=ask_question('age') reward=-0.10 done=false error=null + Step 04: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=5 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 05: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=6 action=ask_question('marital_status') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=7 action=ask_question('is_student') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=8 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 08: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=9 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 09: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=10 action=ask_question('income') reward=-0.10 done=false error=null + Step 10: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=11 action=request_document('pan_card') reward=0.00 done=false error=null + Step 11: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=12 action=ask_question('age') reward=-0.10 done=false error=null + Step 12: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=13 action=ask_question('age') reward=-0.10 done=false error=null + Step 13: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=14 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 14: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=15 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 15: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=16 action=ask_question('income') reward=-0.10 done=false error=null + Step 16: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=17 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 17: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=18 action=request_document('pan_card') reward=0.00 done=false error=null + Step 18: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=19 action=ask_question('age') reward=-0.10 done=false error=null + Step 19: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=20 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 20: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,0.00,-0.10,0.00,-0.10,-0.10,-0.10,0.00,-0.10,-0.10,-0.10,-0.10,-0.10,0.00,0.00,-0.10,-0.10 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 2/3] +[START] task=boundary_fraud env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '23', 'number_of_children': '0'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('income') reward=0.00 done=false error=null + Step 01: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11179. +[STEP] step=2 action=ask_question('occupation') reward=0.00 done=false error=null + Step 02: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=3 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 03: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=4 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 04: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=5 action=request_document('pan_card') reward=0.00 done=false error=null + Step 05: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=6 action=ask_question('age') reward=-0.10 done=false error=null + Step 06: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=7 action=ask_question('number_of_children') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=8 action=ask_question('income') reward=-0.10 done=false error=null + Step 08: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=9 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 09: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=10 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 10: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=11 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 11: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=12 action=request_document('pan_card') reward=0.00 done=false error=null + Step 12: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=13 action=ask_question('age') reward=-0.10 done=false error=null + Step 13: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=14 action=ask_question('number_of_children') reward=0.00 done=false error=HTTP Error 500: Internal Server Error +[STEP] step=15 action=ask_question('income') reward=-0.10 done=false error=null + Step 15: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=16 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 16: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=17 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 17: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=18 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 18: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=19 action=request_document('pan_card') reward=0.00 done=false error=null + Step 19: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=20 action=ask_question('age') reward=-0.10 done=false error=null + Step 20: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,0.00,0.00,0.00,-0.10,-0.10,-0.10,-0.10,0.00,0.00,-0.10,-0.10,-0.10,-0.10,0.00,0.00,-0.10 + + GRADER SCORE: 0.000 / 1.0 + + [Task 3 — repeat 3/3] +[START] task=boundary_fraud env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 3/5 — BOUNDARY_FRAUD +============================================================ + Profile : {'age': '23', 'marital_status': 'divorced', 'state_of_residence': 'Maharashtra'} + Missing : ['occupation', 'has_aadhaar', 'income'] + Notif : [TASK 3/5 - BOUNDARY FRAUD DETECTION - Hard] Profile is INCOMPLETE. Collect ALL required eligibility fields including income, then apply sch +[STEP] step=1 action=ask_question('occupation') reward=0.00 done=false error=null + Step 01: ask_question('occupation') -> reward=0.0, done=False + Applicant confirmed: occupation = carpenter. +[STEP] step=2 action=ask_question('has_aadhaar') reward=0.00 done=false error=null + Step 02: ask_question('has_aadhaar') -> reward=0.0, done=False + Applicant confirmed: has_aadhaar = True. +[STEP] step=3 action=ask_question('income') reward=0.00 done=false error=null + Step 03: ask_question('income') -> reward=0.0, done=False + Applicant confirmed: income = 11989. +[STEP] step=4 action=ask_question('age') reward=-0.10 done=false error=null + Step 04: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=5 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 05: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=6 action=request_document('pan_card') reward=0.00 done=false error=null + Step 06: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=7 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 07: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=8 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 08: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=9 action=ask_question('income') reward=-0.10 done=false error=null + Step 09: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=10 action=ask_question('age') reward=-0.10 done=false error=null + Step 10: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=11 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 11: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=12 action=request_document('pan_card') reward=0.00 done=false error=null + Step 12: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=13 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 13: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=14 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 14: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=15 action=ask_question('income') reward=-0.10 done=false error=null + Step 15: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=16 action=ask_question('age') reward=-0.10 done=false error=null + Step 16: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=17 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 17: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=18 action=request_document('pan_card') reward=0.00 done=false error=null + Step 18: request_document('pan_card') -> reward=0.0, done=False + Document 'pan_card' received and verified. +[STEP] step=19 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 19: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=20 action=ask_question('has_aadhaar') reward=-2.00 done=true error=null + Step 20: ask_question('has_aadhaar') -> reward=-2.0, done=True + TIMEOUT: 20 steps reached without a decision. +[END] success=false steps=20 score=0.000 rewards=0.00,0.00,0.00,-0.10,0.00,0.00,-0.10,-0.10,-0.10,-0.10,0.00,0.00,-0.10,-0.10,-0.10,-0.10,0.00,0.00,-0.10,-2.00 + + GRADER SCORE: 0.000 / 1.0 + + [Task 4 — repeat 1/3] +[START] task=escalation_dilemma env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '41', 'income': '18035', 'occupation': 'student', 'has_aadhaar': 'True', 'number_of_children': '3', 'bank_name': 'Bank of Baroda', 'state_of_residence': 'Bihar'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('income') reward=-0.10 done=false error=null + Step 01: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=2 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 02: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=3 action=ask_question('age') reward=-0.10 done=false error=null + Step 03: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=4 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 04: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=5 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 05: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=6 action=reject_applicant('AGE_EXCEEDED') reward=-1.00 done=false error=null + Step 06: reject_applicant('AGE_EXCEEDED') -> reward=-1.0, done=False + PREMATURE ADJUDICATION: Review documentary evidence before rejecting. Request the PAN card to verify employment records, +[STEP] step=7 action=request_document('pan_card') reward=0.00 done=false error=null + Step 07: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of Indian Railways for the past 6 years w +[STEP] step=8 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 08: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=false steps=8 score=0.850 rewards=-0.10,-0.10,-0.10,0.00,-0.10,-1.00,0.00,10.00 + + GRADER SCORE: 0.850 / 1.0 + + [Task 4 — repeat 2/3] +[START] task=escalation_dilemma env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '30', 'income': '13238', 'occupation': 'student', 'has_aadhaar': 'True', 'state_of_residence': 'Uttar Pradesh', 'number_of_children': '2'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('income') reward=-0.10 done=false error=null + Step 01: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=2 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 02: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=3 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 03: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=4 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 04: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=5 action=request_document('pan_card') reward=0.00 done=false error=null + Step 05: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of BHEL for the past 6 years with active +[STEP] step=6 action=escalate('DATA_MISMATCH') reward=10.00 done=true error=null + Step 06: escalate('DATA_MISMATCH') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=false steps=6 score=0.900 rewards=-0.10,-0.10,-0.10,0.00,0.00,10.00 + + GRADER SCORE: 0.900 / 1.0 + + [Task 4 — repeat 3/3] +[START] task=escalation_dilemma env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 4/5 — ESCALATION_DILEMMA +============================================================ + Profile : {'age': '43', 'income': '17180', 'occupation': 'student', 'has_aadhaar': 'True', 'number_of_children': '1', 'marital_status': 'unmarried'} + Missing : [] + Notif : [TASK 4/5 - ESCALATION DILEMMA - Expert] Profile is COMPLETE. Review all applicant data carefully before making any terminal decision. If oc +[STEP] step=1 action=ask_question('income') reward=-0.10 done=false error=null + Step 01: ask_question('income') -> reward=-0.1, done=False + 'income' is already in the profile. Do not repeat questions. +[STEP] step=2 action=ask_question('occupation') reward=-0.10 done=false error=null + Step 02: ask_question('occupation') -> reward=-0.1, done=False + 'occupation' is already in the profile. Do not repeat questions. +[STEP] step=3 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 03: request_document('aadhaar_card') -> reward=0.0, done=False + Document 'aadhaar_card' received and verified. +[STEP] step=4 action=ask_question('age') reward=-0.10 done=false error=null + Step 04: ask_question('age') -> reward=-0.1, done=False + 'age' is already in the profile. Do not repeat questions. +[STEP] step=5 action=ask_question('has_aadhaar') reward=-0.10 done=false error=null + Step 05: ask_question('has_aadhaar') -> reward=-0.1, done=False + 'has_aadhaar' is already in the profile. Do not repeat questions. +[STEP] step=6 action=request_document('pan_card') reward=0.00 done=false error=null + Step 06: request_document('pan_card') -> reward=0.0, done=False + PAN card retrieved. Records show this applicant has been a registered employee of Indian Railways for the past 6 years w +[STEP] step=7 action=escalate('MANUAL_REVIEW_REQUIRED') reward=10.00 done=true error=null + Step 07: escalate('MANUAL_REVIEW_REQUIRED') -> reward=10.0, done=True + CORRECT ESCALATION: Contradictory data detected and properly handed off to a senior officer for manual verification. Thi +[END] success=false steps=7 score=0.850 rewards=-0.10,-0.10,0.00,-0.10,-0.10,0.00,10.00 + + GRADER SCORE: 0.850 / 1.0 + + [Task 5 — repeat 1/3] +[START] task=document_conflict env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '6288', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'marital_status': 'unmarried', 'state_of_residence': 'Uttar Pradesh', 'number_of_children': '1'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 37 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=2 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 02: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=37, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 2/3] +[START] task=document_conflict env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '33', 'income': '7472', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '33', 'state_of_residence': 'Uttar Pradesh', 'bank_name': 'SBI'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 36 years. Note: this differs from the self-reported age of 33 in the prof +[STEP] step=2 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 02: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=36, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + + [Task 5 — repeat 3/3] +[START] task=document_conflict env=scheme_env model=meta/llama-3.1-8b-instruct + +============================================================ + TASK 5/5 — DOCUMENT_CONFLICT +============================================================ + Profile : {'age': '35', 'income': '7914', 'occupation': 'mason', 'has_aadhaar': 'True', 'self_reported_age': '35', 'marital_status': 'unmarried'} + Missing : [] + Notif : [TASK 5/5 - DOCUMENT CONFLICT - Expert+] Profile is COMPLETE. Apply all eligibility rules and verify official documents as required before m +[STEP] step=1 action=request_document('aadhaar_card') reward=0.00 done=false error=null + Step 01: request_document('aadhaar_card') -> reward=0.0, done=False + Aadhaar card verified. Official age on record: 38 years. Note: this differs from the self-reported age of 35 in the prof +[STEP] step=2 action=reject_applicant('AGE_EXCEEDED') reward=5.00 done=true error=null + Step 02: reject_applicant('AGE_EXCEEDED') -> reward=5.0, done=True + CORRECT REJECTION: Aadhaar confirms age=38, which exceeds the PMKVY maximum of 35. No other scheme criteria are satisfie +[END] success=true steps=2 score=1.000 rewards=0.00,5.00 + + GRADER SCORE: 1.000 / 1.0 + +============================================================ + FINAL GRADER SCORES (mean ± std over 3 repeats) +============================================================ + Task 1 (Scheme Discovery ): 0.767 ± 0.116 / 1.0 + Task 2 (Missing Data ): 0.217 ± 0.375 / 1.0 + Task 3 (Boundary Fraud ): 0.000 ± 0.000 / 1.0 + Task 4 (Escalation Dilemma ): 0.867 ± 0.029 / 1.0 + Task 5 (Document Conflict ): 1.000 ± 0.000 / 1.0 + Average : 0.570 / 1.0 +============================================================ +SCORE_JSON {"task": 1, "score": 0.7667} +STD_JSON {"task": 1, "std": 0.1155} +SCORE_JSON {"task": 2, "score": 0.2167} +STD_JSON {"task": 2, "std": 0.3753} +SCORE_JSON {"task": 3, "score": 0.0} +STD_JSON {"task": 3, "std": 0.0} +SCORE_JSON {"task": 4, "score": 0.8667} +STD_JSON {"task": 4, "std": 0.0289} +SCORE_JSON {"task": 5, "score": 1.0} +STD_JSON {"task": 5, "std": 0.0} diff --git a/reports/leaderboard.csv b/reports/leaderboard.csv new file mode 100644 index 0000000..1fffcc0 --- /dev/null +++ b/reports/leaderboard.csv @@ -0,0 +1,9 @@ +Model,Size,Task1,Task2,Task3,Task4,Task5,Average +mistralai/mistral-nemotron,~56B,0.833,1.0,1.0,1.0,1.0,0.967 +nvidia/llama-3.3-nemotron-super-49b-v1,49B,0.8,0.973,1.0,1.0,1.0,0.955 +nvidia/llama-3.1-nemotron-51b-instruct,51B,0.8,0.957,1.0,1.0,1.0,0.951 +nvidia/nemotron-3-nano-30b-a3b,30B,1.0,0.0,1.0,1.0,1.0,0.8 +nvidia/nemotron-3-super-120b-a12b,120B,1.0,0.0,1.0,1.0,1.0,0.8 +nvidia/nemotron-mini-4b-instruct,4B,0.483,0.667,0.667,0.967,0.0,0.557 +meta/llama-3.1-8b-instruct,8B,0.4,0.0,0.317,0.867,1.0,0.517 +nvidia/llama-3.1-nemotron-nano-8b-v1,8B,0.283,0.303,0.0,0.333,0.0,0.184 diff --git a/reports/results.json b/reports/results.json new file mode 100644 index 0000000..fee5321 --- /dev/null +++ b/reports/results.json @@ -0,0 +1,218 @@ +[ + { + "model": "nvidia/llama-3.1-nemotron-nano-8b-v1", + "size": "8B", + "average": 0.184, + "tasks": { + "task1": { + "score": 0.283, + "std": 0.491 + }, + "task2": { + "score": 0.303, + "std": 0.525 + }, + "task3": { + "score": 0.0, + "std": 0.0 + }, + "task4": { + "score": 0.333, + "std": 0.577 + }, + "task5": { + "score": 0.0, + "std": 0.0 + } + } + }, + { + "model": "meta/llama-3.1-8b-instruct", + "size": "8B", + "average": 0.517, + "tasks": { + "task1": { + "score": 0.4, + "std": 0.458 + }, + "task2": { + "score": 0.0, + "std": 0.0 + }, + "task3": { + "score": 0.317, + "std": 0.548 + }, + "task4": { + "score": 0.867, + "std": 0.058 + }, + "task5": { + "score": 1.0, + "std": 0.0 + } + } + }, + { + "model": "nvidia/nemotron-mini-4b-instruct", + "size": "4B", + "average": 0.557, + "tasks": { + "task1": { + "score": 0.483, + "std": 0.029 + }, + "task2": { + "score": 0.667, + "std": 0.577 + }, + "task3": { + "score": 0.667, + "std": 0.577 + }, + "task4": { + "score": 0.967, + "std": 0.029 + }, + "task5": { + "score": 0.0, + "std": 0.0 + } + } + }, + { + "model": "nvidia/nemotron-3-nano-30b-a3b", + "size": "30B", + "average": 0.8, + "tasks": { + "task1": { + "score": 1.0, + "std": 0.0 + }, + "task2": { + "score": 0.0, + "std": 0.0 + }, + "task3": { + "score": 1.0, + "std": 0.0 + }, + "task4": { + "score": 1.0, + "std": 0.0 + }, + "task5": { + "score": 1.0, + "std": 0.0 + } + } + }, + { + "model": "nvidia/nemotron-3-super-120b-a12b", + "size": "120B", + "average": 0.8, + "tasks": { + "task1": { + "score": 1.0, + "std": 0.0 + }, + "task2": { + "score": 0.0, + "std": 0.0 + }, + "task3": { + "score": 1.0, + "std": 0.0 + }, + "task4": { + "score": 1.0, + "std": 0.0 + }, + "task5": { + "score": 1.0, + "std": 0.0 + } + } + }, + { + "model": "nvidia/llama-3.1-nemotron-51b-instruct", + "size": "51B", + "average": 0.951, + "tasks": { + "task1": { + "score": 0.8, + "std": 0.304 + }, + "task2": { + "score": 0.957, + "std": 0.045 + }, + "task3": { + "score": 1.0, + "std": 0.0 + }, + "task4": { + "score": 1.0, + "std": 0.0 + }, + "task5": { + "score": 1.0, + "std": 0.0 + } + } + }, + { + "model": "nvidia/llama-3.3-nemotron-super-49b-v1", + "size": "49B", + "average": 0.955, + "tasks": { + "task1": { + "score": 0.8, + "std": 0.304 + }, + "task2": { + "score": 0.973, + "std": 0.023 + }, + "task3": { + "score": 1.0, + "std": 0.0 + }, + "task4": { + "score": 1.0, + "std": 0.0 + }, + "task5": { + "score": 1.0, + "std": 0.0 + } + } + }, + { + "model": "mistralai/mistral-nemotron", + "size": "~56B", + "average": 0.967, + "tasks": { + "task1": { + "score": 0.833, + "std": 0.289 + }, + "task2": { + "score": 1.0, + "std": 0.0 + }, + "task3": { + "score": 1.0, + "std": 0.0 + }, + "task4": { + "score": 1.0, + "std": 0.0 + }, + "task5": { + "score": 1.0, + "std": 0.0 + } + } + } +] \ No newline at end of file diff --git a/reports/summary.txt b/reports/summary.txt new file mode 100644 index 0000000..92de904 --- /dev/null +++ b/reports/summary.txt @@ -0,0 +1,12 @@ +OpenEnv scheme_env Benchmark — Baseline Report Summary +======================================================== +Date generated : 2026-04-08 +Models evaluated : 8 + +Best model : mistral-nemotron (avg=0.967) +Worst model : nemotron-nano-8b (avg=0.184) + +Hardest task : Task 2 (mean=0.487) +Easiest task : Task 4 (mean=0.896) + +Perfect score (1.0 on all tasks): none diff --git a/reports/task_heatmap.png b/reports/task_heatmap.png new file mode 100644 index 0000000000000000000000000000000000000000..fc05e91afa9803e9deae32821a4776b53b982ff2 GIT binary patch literal 81431 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

8JDsz|)N7&X~ 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 literal 0 HcmV?d00001 diff --git a/reports/test_logs/pytest_results.txt b/reports/test_logs/pytest_results.txt new file mode 100644 index 0000000..1b2adaa --- /dev/null +++ b/reports/test_logs/pytest_results.txt @@ -0,0 +1,30 @@ +============================= test session starts ============================== +platform darwin -- Python 3.14.3, pytest-9.0.2, pluggy-1.6.0 -- /Users/advikdivekar/Desktop/OpenEnv/venv/bin/python3.14 +cachedir: .pytest_cache +rootdir: /Users/advikdivekar/Desktop/OpenEnv +configfile: pyproject.toml +plugins: anyio-4.13.0 +collecting ... collected 20 items + +tests/test_scheme_eligibility.py::test_pmkvy_qualifies_age_lower_bound PASSED [ 5%] +tests/test_scheme_eligibility.py::test_pmkvy_qualifies_age_upper_bound PASSED [ 10%] +tests/test_scheme_eligibility.py::test_pmkvy_disqualifies_age_exceeded PASSED [ 15%] +tests/test_scheme_eligibility.py::test_pmkvy_disqualifies_income_exceeded PASSED [ 20%] +tests/test_scheme_eligibility.py::test_pmkvy_disqualifies_wrong_occupation PASSED [ 25%] +tests/test_scheme_eligibility.py::test_mgnregs_qualifies_age_lower_bound PASSED [ 30%] +tests/test_scheme_eligibility.py::test_mgnregs_qualifies_age_upper_bound PASSED [ 35%] +tests/test_scheme_eligibility.py::test_mgnregs_disqualifies_age_exceeded PASSED [ 40%] +tests/test_scheme_eligibility.py::test_mgnregs_disqualifies_no_aadhaar PASSED [ 45%] +tests/test_scheme_eligibility.py::test_pmay_qualifies_age_lower_bound PASSED [ 50%] +tests/test_scheme_eligibility.py::test_pmay_disqualifies_income_at_threshold PASSED [ 55%] +tests/test_scheme_eligibility.py::test_pmay_qualifies_age_upper_bound PASSED [ 60%] +tests/test_scheme_eligibility.py::test_pmay_disqualifies_age_exceeded PASSED [ 65%] +tests/test_scheme_eligibility.py::test_optimal_prefers_pmay_over_pmkvy PASSED [ 70%] +tests/test_scheme_eligibility.py::test_optimal_mgnregs_only PASSED [ 75%] +tests/test_scheme_eligibility.py::test_optimal_none_when_no_scheme PASSED [ 80%] +tests/test_scheme_eligibility.py::test_grader_score_perfect PASSED [ 85%] +tests/test_scheme_eligibility.py::test_grader_score_noise_penalty PASSED [ 90%] +tests/test_scheme_eligibility.py::test_grader_score_zero_base PASSED [ 95%] +tests/test_scheme_eligibility.py::test_grader_score_floor_at_030 PASSED [100%] + +============================== 20 passed in 2.24s ============================== diff --git a/reports/test_logs/smoke_test_results.txt b/reports/test_logs/smoke_test_results.txt new file mode 100644 index 0000000..15da4e3 --- /dev/null +++ b/reports/test_logs/smoke_test_results.txt @@ -0,0 +1,61 @@ + +============================================================ +SMOKE TEST — scheme_env +============================================================ + +Task 1 — Scheme Discovery + Profile at reset: {'age': '28', 'income': '4665', 'marital_status': 'widowed', 'number_of_children': '1'} + Missing: ['occupation', 'has_aadhaar'] + [PASS] Task 1 terminates on approve — done=True + [PASS] Task 1 reward positive or suboptimal — reward=3.0 + [PASS] Task 1 grader_score set — score=0.5 + Notification: SUBOPTIMAL: PMKVY is eligible but PMAY provides greater benefit. + +Task 2 — Missing Data (premature approval) + Missing at reset: ['occupation', 'has_aadhaar'] + [PASS] Task 2 premature approve terminates — done=True + [PASS] Task 2 premature approve scores 0.0 — score=0.0 + [PASS] Task 2 premature approve reward negative — reward=-5.0 + +Task 2 — Missing Data (correct flow) + [PASS] Task 2 correct flow terminates — done=True + [PASS] Task 2 correct flow reward positive — reward=10.0 + [PASS] Task 2 correct flow score > 0 — score=1.0 + +Task 3 — Boundary Fraud (reject before asking income) + Profile at reset: {'age': '24', 'number_of_children': '3', 'marital_status': 'widowed'} + Missing: ['occupation', 'has_aadhaar', 'income'] + [PASS] Task 3 income hidden at reset — income in profile=['age', 'number_of_children', 'marital_status'] + [PASS] Task 3 premature reject scores 0.0 — score=0.0 + [PASS] Task 3 premature reject reward negative — reward=-2.0 + +Task 3 — Boundary Fraud (correct flow) + [PASS] Task 3 correct reject terminates — done=True + [PASS] Task 3 correct reject reward positive — reward=5.0 + [PASS] Task 3 correct reject score > 0.30 — score=1.0 + +Task 4 — Escalation (escalate before PAN — should soft-block) + [PASS] Task 4 escalate before PAN is non-terminal — done=False + [PASS] Task 4 escalate before PAN reward negative — reward=-1.0 + +Task 4 — Escalation (correct flow) + [PASS] Task 4 PAN reveals contradiction — notif=PAN card retrieved. Records show this applicant has been a registered employee o + [PASS] Task 4 correct escalate terminates — done=True + [PASS] Task 4 correct escalate reward=10 — reward=10.0 + [PASS] Task 4 correct escalate score > 0.80 — score=1.0 + +Task 5 — Document Conflict (correct flow) + Self-reported age in profile: 33 + [PASS] Task 5 Aadhaar reveals age conflict — notif=Aadhaar card verified. Official age on record: 36 years. Note: this differs from + [PASS] Task 5 correct reject terminates — done=True + [PASS] Task 5 correct reject reward=5 — reward=5.0 + [PASS] Task 5 correct reject score > 0.80 — score=1.0 + +Wrong escalation on Task 1 (should now be terminal) + [PASS] Wrong escalation Task 1 is terminal — done=True + [PASS] Wrong escalation reward=-2.0 — reward=-2.0 + +============================================================ +ALL TESTS PASSED — environment logic is correct +============================================================ + diff --git a/reports/test_logs/test_results.txt b/reports/test_logs/test_results.txt new file mode 100644 index 0000000..b662b86 --- /dev/null +++ b/reports/test_logs/test_results.txt @@ -0,0 +1,30 @@ +============================= test session starts ============================== +platform darwin -- Python 3.14.3, pytest-9.0.2, pluggy-1.6.0 -- /Users/advikdivekar/Desktop/OpenEnv/venv/bin/python3.14 +cachedir: .pytest_cache +rootdir: /Users/advikdivekar/Desktop/OpenEnv +configfile: pyproject.toml +plugins: anyio-4.13.0 +collecting ... collected 20 items + +tests/test_scheme_eligibility.py::test_pmkvy_qualifies_age_lower_bound PASSED [ 5%] +tests/test_scheme_eligibility.py::test_pmkvy_qualifies_age_upper_bound PASSED [ 10%] +tests/test_scheme_eligibility.py::test_pmkvy_disqualifies_age_exceeded PASSED [ 15%] +tests/test_scheme_eligibility.py::test_pmkvy_disqualifies_income_exceeded PASSED [ 20%] +tests/test_scheme_eligibility.py::test_pmkvy_disqualifies_wrong_occupation PASSED [ 25%] +tests/test_scheme_eligibility.py::test_mgnregs_qualifies_age_lower_bound PASSED [ 30%] +tests/test_scheme_eligibility.py::test_mgnregs_qualifies_age_upper_bound PASSED [ 35%] +tests/test_scheme_eligibility.py::test_mgnregs_disqualifies_age_exceeded PASSED [ 40%] +tests/test_scheme_eligibility.py::test_mgnregs_disqualifies_no_aadhaar PASSED [ 45%] +tests/test_scheme_eligibility.py::test_pmay_qualifies_age_lower_bound PASSED [ 50%] +tests/test_scheme_eligibility.py::test_pmay_disqualifies_income_at_threshold PASSED [ 55%] +tests/test_scheme_eligibility.py::test_pmay_qualifies_age_upper_bound PASSED [ 60%] +tests/test_scheme_eligibility.py::test_pmay_disqualifies_age_exceeded PASSED [ 65%] +tests/test_scheme_eligibility.py::test_optimal_prefers_pmay_over_pmkvy PASSED [ 70%] +tests/test_scheme_eligibility.py::test_optimal_mgnregs_only PASSED [ 75%] +tests/test_scheme_eligibility.py::test_optimal_none_when_no_scheme PASSED [ 80%] +tests/test_scheme_eligibility.py::test_grader_score_perfect PASSED [ 85%] +tests/test_scheme_eligibility.py::test_grader_score_noise_penalty PASSED [ 90%] +tests/test_scheme_eligibility.py::test_grader_score_zero_base PASSED [ 95%] +tests/test_scheme_eligibility.py::test_grader_score_floor_at_030 PASSED [100%] + +============================== 20 passed in 2.38s ==============================