From c9610749f76db06d6a23853d55e9f4f69ab4e188 Mon Sep 17 00:00:00 2001 From: Heet Ranpura Date: Wed, 8 Apr 2026 20:37:36 +0530 Subject: [PATCH 1/5] docs: expand README architecture and usage guide --- README.md | 757 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 619 insertions(+), 138 deletions(-) diff --git a/README.md b/README.md index 476d588..c58ff5e 100644 --- a/README.md +++ b/README.md @@ -8,221 +8,702 @@ pinned: false app_port: 7860 tags: - openenv + - reinforcement-learning + - evaluation + - agents --- -# Indian Government Scheme Enrollment — RL Environment +# Indian Government Welfare Officer RL Environment + +An OpenEnv-compatible reinforcement learning environment that simulates the workflow of an Indian Common Service Centre (CSC) welfare officer. The agent must gather missing information, request the right document at the right time, apply strict integer eligibility rules, avoid being distracted by irrelevant fields, and make a safe terminal decision: approve, reject, or escalate. + +This repo is built as both: + +- an interactive environment server for agent evaluation +- a benchmarking toolkit with inference, reporting, and visualization pipelines + +## Table of Contents + +- [What This Benchmark Measures](#what-this-benchmark-measures) +- [Key Features](#key-features) +- [Repository Structure](#repository-structure) +- [Architecture](#architecture) +- [Environment Contract](#environment-contract) +- [Task Curriculum](#task-curriculum) +- [Scheme Rules](#scheme-rules) +- [Reward Model](#reward-model) +- [Grader Logic](#grader-logic) +- [Model and Data Flow](#model-and-data-flow) +- [Setup](#setup) +- [Running the Server](#running-the-server) +- [Running Inference](#running-inference) +- [Running the Benchmark Suite](#running-the-benchmark-suite) +- [Generating Reports](#generating-reports) +- [Testing](#testing) +- [Output Artifacts](#output-artifacts) +- [Design Tradeoffs](#design-tradeoffs) +- [Roadmap](#roadmap) + +## What This Benchmark Measures + +Most agent benchmarks emphasize generic reasoning. This environment instead targets procedural decision-making under operational constraints. + +The benchmark measures whether an agent can: + +1. gather missing information before making a decision +2. ignore irrelevant profile noise +3. apply strict income and age thresholds exactly +4. distinguish lack of information from true contradiction +5. use authoritative documents instead of trusting self-reported claims +6. escalate only when escalation is genuinely required + +The result is a benchmark for "bureaucratic reasoning" rather than open-ended chat competence. + +## Key Features + +- OpenEnv-style `reset` and `step` loop +- FastAPI server entrypoint in [server/app.py](server/app.py) +- Typed `Action` and `Observation` schemas in [models.py](models.py) +- Five-task curriculum from scheme selection to document conflict handling +- Dynamic persona generation per episode +- Noise injection to punish irrelevant exploration +- Dense reward shaping plus normalized terminal grader score +- Metadata sanitization so agents cannot inspect hidden internal state +- OpenAI-compatible inference runner in [inference.py](inference.py) +- Sequential multi-model benchmark runner in [benchmark_runner.py](benchmark_runner.py) +- Graph-first benchmark reporting in [benchmark_report.py](benchmark_report.py) +- Unit tests for boundary logic and grading math in [tests/test_scheme_eligibility.py](tests/test_scheme_eligibility.py) + +## Repository Structure + +```text +rl-agent-main/ +├── README.md +├── pyproject.toml +├── requirements.txt +├── uv.lock +├── Dockerfile +├── openenv.yaml +├── .env.example +├── models.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/ + └── baseline_report/ +``` -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. +### What each major file does + +- [server/app.py](server/app.py): wires the environment into OpenEnv/FastAPI and exposes `/health` +- [server/scheme_env_environment.py](server/scheme_env_environment.py): environment state machine, persona generation, task logic, reward shaping, metadata stripping +- [server/schemes.py](server/schemes.py): benchmark scheme rules plus extended future scheme metadata +- [models.py](models.py): action validation and observation schema +- [inference.py](inference.py): one-model evaluation loop against a running server +- [benchmark_runner.py](benchmark_runner.py): runs a configured model suite sequentially and stores raw artifacts +- [benchmark_report.py](benchmark_report.py): parses run artifacts and renders charts plus summary outputs +- [reports/baseline_report](reports/baseline_report): sample benchmark bundle with logs, plots, and summary files + +## Architecture + +The repo has four main layers: + +1. Environment runtime layer +2. Agent interaction layer +3. Benchmark orchestration layer +4. Reporting and analysis layer + +### High-level architecture + +```mermaid +flowchart LR + A["LLM / Policy"] --> B["inference.py
Prompting + action 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 Generator"] + E --> G["Observation Builder"] + E --> H["Reward + Grader Logic"] + E --> I["Scheme Rules
server/schemes.py"] + B --> J["Structured logs"] + J --> K["benchmark_runner.py"] + K --> L["CSV / JSON / manifests / logs"] + L --> M["benchmark_report.py"] + M --> N["PNG charts + summaries"] +``` -## Why This Exists +### Environment internals -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. +The core environment is implemented in [server/scheme_env_environment.py](server/scheme_env_environment.py). It handles: -## MDP Formalization +- persona generation +- task selection +- observation construction +- state persistence +- action dispatch +- reward assignment +- terminal grading +- metadata sanitization before agent-facing return -| 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 | +Important implementation details: + +- The environment is explicitly single-session: `SUPPORTS_CONCURRENT_SESSIONS = False` +- Shared state is stored at the class level so per-request server instantiation does not lose the active episode +- A `threading.Lock` guards `reset()` and `step()` to keep state transitions atomic +- Hidden metadata such as `pan_verified`, `aadhaar_verified`, and internal task labels are removed before the observation is returned to the agent + +### Why metadata stripping matters + +The environment tracks internal fields used for branching and grading, but agents should not see them. If the model could inspect flags like `pan_verified` or `grader_score` before termination, it could game the benchmark instead of reasoning about the case. + +This is why `_finalize_step()` deep-copies the full observation and exposes only: + +- `noise_queries` +- `redundant_queries` +- `relevant_queries` + +to the agent. + +### Architecture deep dive + +#### 1. Action validation layer + +[models.py](models.py) strictly validates: + +- allowed `action_type` +- allowed `ask_question` fields +- allowed document names +- allowed scheme names +- allowed reject/escalate categories + +This is important for environment integrity. Malformed actions do not silently drift through the benchmark. + +#### 2. Persona generation layer + +Every `reset()` creates a fresh persona with controlled randomness. The profile values change, but the intended reasoning challenge for each task remains stable. + +Examples: + +- Task 1 may be either PMKVY-optimal or PMAY-optimal depending on age and income overlap +- Task 3 always hides a near-miss income boundary violation +- Task 4 always contains a contradiction discoverable via PAN verification +- Task 5 always contains a self-reported vs Aadhaar age conflict + +#### 3. Observation shaping layer -## Action Space +The observation builder deliberately withholds some fields at episode start. The agent must earn them through `ask_question` or `request_document`. -| 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) | +It also injects noise fields such as: -**Valid field names for ask_question:** `age`, `income`, `occupation`, `has_aadhaar` +- `marital_status` +- `state_of_residence` +- `number_of_children` +- `bank_name` -**Valid document names for request_document:** `aadhaar_card`, `pan_card`, `aadhaar`, `pan` +These fields are designed to tempt weak agents into wasted exploration. -**Valid scheme names for approve_scheme:** `PMKVY`, `MGNREGS`, `PMAY` +#### 4. Transition and recovery layer -**Valid decision categories for reject/escalate:** `AGE_EXCEEDED`, `INCOME_TOO_HIGH`, `NO_ELIGIBLE_SCHEME`, `MISSING_REQUIRED_DATA`, `DATA_MISMATCH`, `DOCUMENT_CONFLICT`, `MANUAL_REVIEW_REQUIRED` +Not every wrong action immediately terminates the episode. -## Observation Space +The environment includes soft-block behavior for some protocol mistakes: -| Field | Type | Description | +- approving Task 4 before PAN verification +- approving Task 5 before Aadhaar verification +- rejecting Task 4 before PAN verification +- rejecting Task 5 before Aadhaar verification +- escalating Task 4 before PAN verification + +In these cases the agent is penalized, but the episode stays open so it can recover and still demonstrate correct policy-following. + +#### 5. Benchmark and reporting layer + +The repo separates execution from visualization: + +- [benchmark_runner.py](benchmark_runner.py) produces raw run bundles +- [benchmark_report.py](benchmark_report.py) parses bundles and generates charts + +This keeps benchmarking reproducible and lets you regenerate reports without rerunning expensive model inference. + +## Environment Contract + +The server exposes an OpenEnv-compatible HTTP environment with: + +- `POST /reset` +- `POST /step` +- `GET /health` + +The runtime metadata in [openenv.yaml](openenv.yaml) currently specifies: + +- `name: scheme_env` +- `runtime: fastapi` +- `app: server.app:app` +- `port: 7860` +- `max_steps: 20` + +### Action schema + +| Action | Value | Notes | |---|---|---| -| `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 | +| `ask_question` | `age`, `income`, `occupation`, `has_aadhaar` | Collect eligibility-critical fields | +| `request_document` | `aadhaar_card`, `pan_card`, `aadhaar`, `pan` | Request authoritative evidence | +| `approve_scheme` | `PMKVY`, `MGNREGS`, `PMAY` | Approve a scheme | +| `reject_applicant` | category string | Reject with a compact reason code | +| `escalate` | empty string or category string | Escalate to manual review | + +### Observation schema + +| Field | Meaning | +|---|---| +| `known_profile` | Currently visible applicant data | +| `missing_data` | Fields still required before a safe decision | +| `notification` | Environment feedback on previous action | +| `is_terminated` | Episode end flag | +| `grader_score` | Terminal normalized score | +| `metadata` | Sanitized counters only | + +## Task Curriculum + +The environment currently implements five tasks. + +### Task 1: Scheme Discovery -## Scheme Eligibility Rules +- Agent starts with an incomplete profile +- Must collect remaining required fields +- Must choose the optimal scheme, not just an eligible one +- PMAY can outrank PMKVY when both apply -All thresholds are strict integer comparisons — no rounding or approximation. +Failure mode tested: shallow first-match approval. + +### Task 2: Missing Data + +- Occupation and Aadhaar status are hidden +- Missing field order is randomized +- Any approval before all missing data is collected is terminally wrong + +Failure mode tested: premature decision-making. + +### Task 3: Boundary Fraud Detection + +- Income is hidden initially +- Agent must collect income before rejecting +- Income is always above the PMKVY threshold by a small but real margin +- Wrong approvals receive graded penalties based on overage size + +Failure mode tested: fuzzy arithmetic instead of exact rule-following. + +### Task 4: Escalation Dilemma + +- Profile presents a suspicious `student` with unusually high income +- PAN verification reveals active long-term government employment +- Correct resolution is escalation after document verification + +Failure mode tested: confusing contradiction with ordinary ineligibility. + +### Task 5: Document Conflict + +- Self-reported age appears near PMKVY eligibility boundary +- Aadhaar reveals a true age above the upper bound +- Correct resolution is request Aadhaar, then reject + +Failure mode tested: trusting self-reported evidence over authoritative documents. + +## Scheme Rules + +The benchmark-active schemes are: | Scheme | Age | Occupation | Income | Aadhaar | |---|---|---|---|---| -| **PMKVY** | 18–35 | mason OR carpenter | ≤ 9999 | — | -| **MGNREGS** | 18–60 | farm_labourer | — | Required | -| **PMAY** | 21–55 | any | ≤ 5999 | Required | +| `PMKVY` | 18-35 inclusive | `mason` or `carpenter` | `<= 9999` | not required | +| `MGNREGS` | 18-60 inclusive | `farm_labourer` only | no ceiling | required | +| `PMAY` | 21-55 inclusive | any | `<= 5999` | required | -**Reject if:** no scheme criteria are fully satisfied. +### Priority order -## Reward Function +The benefit hierarchy used by the benchmark is: -| 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 +``` + +This matters because some profiles qualify for more than one scheme, and the agent is expected to choose the highest-benefit option. + +### Extended scheme metadata + +[server/schemes.py](server/schemes.py) also defines additional future-facing schemes: + +- `PM_SYM` +- `AYUSHMAN_BHARAT` +- `E_SHRAM` +- `NFSA` +- `PMMVY` + +These are mostly unreachable from the current sparse benchmark tasks because they require profile fields not present in Tasks 1 to 5. + +## Reward Model + +The benchmark uses dense rewards plus terminal scoring. + +### Step-level rewards + +| Event | Reward | +|---|---| +| Valid question | `0.0` | +| Valid document request | `0.0` | +| Noise or redundant query | `-0.10` | +| Correct optimal approval | `+10.0` | +| Eligible but suboptimal approval | `+3.0` | +| Correct rejection | `+5.0` | +| Correct escalation | `+10.0` | +| Timeout | `-2.0` | + +### Important nuance + +The current implementation intentionally gives `0.0` reward for valid information-gathering steps. Good exploration is not rewarded directly; instead, wasted exploration is penalized lightly and terminal correctness carries most of the score signal. + +### Task-specific penalty behavior + +- Task 3 wrong approvals use tiered penalties based on how far income exceeds threshold +- Some policy violations in Tasks 4 and 5 are recoverable soft-blocks rather than immediate terminations +- Premature approvals in Tasks 1 and 2 remain terminal failures + +## Grader Logic + +Terminal outcomes are converted into a normalized `grader_score` in `[0.0, 1.0]`. + +```text +grader_score = max(0.30, min(1.0, base_score - penalty + bonus)) +``` + +Where: + +- wrong terminal decisions return `0.0` +- correct decisions are floored at `0.30` +- noise and redundant queries reduce the score +- document verification can add a small bonus +- Task 2 also penalizes wasted steps beyond the theoretical minimum -## Grader Scoring +### Penalties and bonus -Terminal outcomes are scored continuously between 0.0 and 1.0 using an efficiency-weighted formula: +```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 ``` -grader_score = max(0.30, base_score - penalty) -penalty = (noise_queries × 0.08) + (redundant_queries × 0.05) - + (wasted_steps × 0.04) # Task 2 only +### Why separate reward and grader score + +- reward helps RL-style learning +- grader score makes model comparisons stable and leaderboard-friendly +- a model can accumulate neutral steps and still fail the episode +- the benchmark wants correctness, not just activity + +## Model and Data Flow + +### Episode flow + +```mermaid +sequenceDiagram + participant Agent + participant Runner as inference.py + participant Server as FastAPI/OpenEnv + participant Env as SchemeEnvEnvironment + + Agent->>Runner: Produce JSON action + Runner->>Server: POST /step + Server->>Env: step(action) + Env->>Env: Validate action + Env->>Env: Update shared state + Env->>Env: Compute reward / terminal result + Env->>Env: Strip hidden metadata + Env-->>Server: Observation + Server-->>Runner: Observation + reward + done + Runner-->>Agent: New state context ``` -A correct but inefficient agent always outscores an incorrect agent. +### Reset and step architecture + +```mermaid +flowchart TD + A["reset(seed)"] --> B["Select task"] + B --> C["Generate persona"] + C --> D["Build fresh observation"] + D --> E["Persist shared state"] + E --> F["Agent action"] + F --> G{"Action type"} + G -->|ask_question| H["Reveal field or penalize noise/redundancy"] + G -->|request_document| I["Verify PAN/Aadhaar/generic document"] + G -->|approve_scheme| J["Check eligibility / optimality / protocol violations"] + G -->|reject_applicant| K["Check justified rejection vs premature rejection"] + G -->|escalate| L["Allow only verified contradiction path"] + H --> M["_finalize_step"] + I --> M + J --> M + K --> M + L --> M + M --> N["Persist full internal obs"] + M --> O["Return sanitized agent obs"] +``` -## Tasks +### Benchmark pipeline + +```mermaid +flowchart LR + A["benchmark_runner.py"] --> B["Per-model inference logs"] + A --> C["leaderboard CSV"] + A --> D["run manifest"] + A --> E["analysis JSON"] + B --> F["benchmark_report.py"] + C --> F + D --> F + E --> F + F --> G["average_scores.png"] + F --> H["task_heatmap.png"] + F --> I["efficiency_scatter.png"] + F --> J["difficulty_profile.png"] + F --> K["summary.txt / README.txt"] +``` -### 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. +## Setup -### 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. +The repo supports both `uv`-based and `pip`-based flows. -### 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. +### Python requirements -### 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. +- Python `>=3.10` +- FastAPI +- Uvicorn +- openenv-core +- Pydantic v2 +- OpenAI Python SDK +- python-dotenv -## Distraction Trap +### Install with `uv` -Every task injects 1–3 irrelevant fields into `known_profile`: -`marital_status`, `state_of_residence`, `number_of_children`, `bank_name` +```bash +uv sync +``` -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. +### Install with `pip` -- `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` +```bash +python -m venv .venv +source .venv/bin/activate +pip install -r requirements.txt +``` -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 +### Development dependencies -No two evaluation episodes are mathematically identical. +```bash +pip install -e ".[dev]" +``` -## Setup +## Running the Server + +### With Python directly ```bash -docker build -t scheme-enrollment-env . -docker run -p 7860:7860 scheme-enrollment-env +python -m server.app +``` + +### With Uvicorn + +```bash +uvicorn server.app:app --host 0.0.0.0 --port 7860 +``` + +### Health check + +```bash +curl http://localhost:7860/health ``` ## Running Inference +The inference runner talks to: + +- a running local environment server +- an OpenAI-compatible model endpoint + +Example: + ```bash -export OPENAI_API_KEY=your_key +export ENV_URL=http://localhost:7860 export API_BASE_URL=https://router.huggingface.co/v1 export MODEL_NAME=Qwen/Qwen2.5-7B-Instruct +export HF_TOKEN=your_token +export INFERENCE_TEMPERATURE=0.0 +export MAX_TOKENS=1500 +export N_REPEATS=3 + +python inference.py +``` + +### Provider compatibility notes + +[inference.py](inference.py) includes provider normalization logic: + +- Hugging Face website URLs are rewritten to `https://router.huggingface.co/v1` +- deprecated Hugging Face Inference API model URLs are normalized to Router +- the same code path can be used with Hugging Face Router or NVIDIA NIM + +### Example NVIDIA NIM setup + +```bash export ENV_URL=http://localhost:7860 +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_key python inference.py ``` -Generate a report from an explicit bundled run directory: +## Running the Benchmark Suite + +[benchmark_runner.py](benchmark_runner.py) runs a configured list of models sequentially. + +Sequential execution is intentional because the environment is single-session. ```bash -python benchmark_report.py --run-dir reports/report_20260404_124255 +python benchmark_runner.py ``` -Generate a report from explicit artifact paths: +The runner: + +- waits for the server health check to pass +- evaluates the configured model list one at a time +- repeats each task multiple times +- extracts structured scores from inference logs +- stores logs, CSV output, manifest JSON, analysis JSON, and text summaries + +## Generating Reports + +Use [benchmark_report.py](benchmark_report.py) to build graph-first summaries from a benchmark run. + +### From a timestamped run directory ```bash -python benchmark_report.py \ - --csv reports/report_20260404_124255/leaderboard_20260404_124255.csv \ - --logs-dir reports/report_20260404_124255/logs_20260404_124255 +python benchmark_report.py --run-dir reports/report_ ``` -## Nemotron Setup +### From the latest discovered run -This repo is configured to work with OpenAI-compatible chat APIs, including -Hugging Face Router and NVIDIA NIM. +```bash +python benchmark_report.py --latest +``` -### Hugging Face Router +### From explicit artifacts ```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 +python benchmark_report.py \ + --csv reports/report_/leaderboard_.csv \ + --logs-dir reports/report_/logs_ ``` -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 +## Testing -### NVIDIA NIM +The unit tests focus on the parts of the benchmark that most often regress: + +- scheme boundary comparisons +- optimal scheme ordering +- grader score clamping and penalty math + +Run: ```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 +pytest tests/ ``` -The inference path is JSON-first and does not require `` tags, which makes it more robust for Nemotron-style verbose models. +Covered examples include: + +- `PMKVY` age and income boundary conditions +- `PMAY` strict `5999` vs `6000` threshold behavior +- `MGNREGS` Aadhaar requirements +- `get_optimal_scheme()` hierarchy correctness +- `_compute_grader_score()` floor and penalty math + +## Output Artifacts + +The repo already includes a baseline artifact bundle under [reports/baseline_report](reports/baseline_report). + +Typical generated outputs include: + +- `leaderboard.csv` +- `results.json` +- `summary.txt` +- `README.txt` +- `average_scores.png` +- `task_heatmap.png` +- `efficiency_scatter.png` +- `difficulty_profile.png` +- `inference_logs/` +- `test_logs/` + +For fresh runs produced by [benchmark_runner.py](benchmark_runner.py), the current expected layout is: + +- `reports/report_/leaderboard_.csv` +- `reports/report_/logs_/` +- `reports/report_/run_manifest_.json` +- `reports/report_/analysis_.json` +- `reports/report_/summary_.txt` + +## Design Tradeoffs + +### Single-session shared state + +The environment prioritizes correctness and simple persistence across HTTP requests over concurrency. This keeps implementation straightforward, but it means evaluation should remain sequential. + +### Sanitized observations + +The benchmark avoids leaking internal truth flags. That makes the environment more faithful as an evaluation tool, even though it adds some implementation complexity. + +### Soft-blocks for recoverable mistakes + +Some protocol violations in Tasks 4 and 5 do not instantly end the episode. This gives more nuanced behavioral signal and better reflects operational workflows where an officer can still correct course. + +### Narrow benchmark profile, broader future catalog + +Current tasks use a sparse four-field profile core: + +- `age` +- `income` +- `occupation` +- `has_aadhaar` + +But the repo already contains extended scheme metadata for future richer tasks. + +## Roadmap + +High-value next steps suggested by the current codebase: + +1. add end-to-end tests for actual `reset` and `step` trajectories, not just pure helper logic +2. document the run-manifest and analysis JSON schemas more explicitly +3. expose a canonical agent-facing observation model instead of sanitizing inline in `_finalize_step()` +4. add benchmark fixtures for Task 4 and Task 5 recovery paths +5. expand reporting docs with example interpretation of each chart +6. consider session-safe state storage if parallel evaluation becomes necessary -## Real-World Utility +## Summary -This environment models a task performed daily by thousands of CSC operators across rural India. Key capabilities tested: +This repo is a strong benchmark for rule-bound agent behavior. Its most interesting architectural feature is not just the task list, but the combination of: -- **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 +- partial observability +- authoritative document verification +- exact integer thresholds +- contradiction-aware escalation +- hidden internal state with sanitized agent views -Training an agent to score highly across all 5 tasks would produce a system deployable alongside real welfare officers to assist with applicant evaluation. +That combination makes it a useful testbed for evaluating whether a model can act like a careful operator, not just produce plausible language. From d6e1d983417df90565e41db0686a406b4a462df9 Mon Sep 17 00:00:00 2001 From: Heet Ranpura Date: Wed, 8 Apr 2026 20:51:40 +0530 Subject: [PATCH 2/5] docs: enrich README with case study and benchmark artifacts --- README.md | 1069 ++++++++++------- reports/baseline_report/README.txt | 44 + reports/baseline_report/average_scores.png | Bin 0 -> 50891 bytes .../baseline_report/difficulty_profile.png | Bin 0 -> 49904 bytes .../baseline_report/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/baseline_report/leaderboard.csv | 9 + reports/baseline_report/results.json | 218 ++++ reports/baseline_report/summary.txt | 12 + reports/baseline_report/task_heatmap.png | Bin 0 -> 81431 bytes .../test_logs/pytest_results.txt | 30 + .../test_logs/smoke_test_results.txt | 61 + .../test_logs/test_results.txt | 30 + 21 files changed, 4994 insertions(+), 458 deletions(-) create mode 100644 reports/baseline_report/README.txt create mode 100644 reports/baseline_report/average_scores.png create mode 100644 reports/baseline_report/difficulty_profile.png create mode 100644 reports/baseline_report/efficiency_scatter.png create mode 100644 reports/baseline_report/inference_logs/inference_mistral_nemotron.txt create mode 100644 reports/baseline_report/inference_logs/inference_nemotron3_120b.txt create mode 100644 reports/baseline_report/inference_logs/inference_nemotron3_nano30b.txt create mode 100644 reports/baseline_report/inference_logs/inference_nemotron51b.txt create mode 100644 reports/baseline_report/inference_logs/inference_nemotron_mini4b.txt create mode 100644 reports/baseline_report/inference_logs/inference_nemotron_nano.txt create mode 100644 reports/baseline_report/inference_logs/inference_nemotron_nano8b.txt create mode 100644 reports/baseline_report/inference_logs/inference_nemotron_super49b.txt create mode 100644 reports/baseline_report/inference_logs/inference_nvidia_8b.txt create mode 100644 reports/baseline_report/leaderboard.csv create mode 100644 reports/baseline_report/results.json create mode 100644 reports/baseline_report/summary.txt create mode 100644 reports/baseline_report/task_heatmap.png create mode 100644 reports/baseline_report/test_logs/pytest_results.txt create mode 100644 reports/baseline_report/test_logs/smoke_test_results.txt create mode 100644 reports/baseline_report/test_logs/test_results.txt diff --git a/README.md b/README.md index c58ff5e..7762332 100644 --- a/README.md +++ b/README.md @@ -13,71 +13,97 @@ tags: - agents --- -# Indian Government Welfare Officer RL Environment +# 🏛️ Indian Government Scheme Enrollment — RL Environment -An OpenEnv-compatible reinforcement learning environment that simulates the workflow of an Indian Common Service Centre (CSC) welfare officer. The agent must gather missing information, request the right document at the right time, apply strict integer eligibility rules, avoid being distracted by irrelevant fields, and make a safe terminal decision: approve, reject, or escalate. +> *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.* -This repo is built as both: +[![HuggingFace Space](https://img.shields.io/badge/🤗%20HuggingFace-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) -- an interactive environment server for agent evaluation -- a benchmarking toolkit with inference, reporting, and visualization pipelines +## 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 Environment Exists + +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. + +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. ## Table of Contents -- [What This Benchmark Measures](#what-this-benchmark-measures) -- [Key Features](#key-features) +- [Environment at a Glance](#environment-at-a-glance) - [Repository Structure](#repository-structure) -- [Architecture](#architecture) +- [Architecture Overview](#architecture-overview) +- [System Architecture](#system-architecture) +- [Agent-Environment Architecture](#agent-environment-architecture) +- [Model Interface Architecture](#model-interface-architecture) +- [Training Pipeline Architecture](#training-pipeline-architecture) +- [Memory Buffer Architecture](#memory-buffer-architecture) +- [Reward Architecture](#reward-architecture) +- [Deployment and Inference Architecture](#deployment-and-inference-architecture) +- [Data Flow Architecture](#data-flow-architecture) +- [Distributed and Parallel Architecture](#distributed-and-parallel-architecture) +- [Hardware Acceleration Architecture](#hardware-acceleration-architecture) - [Environment Contract](#environment-contract) -- [Task Curriculum](#task-curriculum) -- [Scheme Rules](#scheme-rules) -- [Reward Model](#reward-model) -- [Grader Logic](#grader-logic) -- [Model and Data Flow](#model-and-data-flow) -- [Setup](#setup) -- [Running the Server](#running-the-server) -- [Running Inference](#running-inference) -- [Running the Benchmark Suite](#running-the-benchmark-suite) -- [Generating Reports](#generating-reports) -- [Testing](#testing) -- [Output Artifacts](#output-artifacts) -- [Design Tradeoffs](#design-tradeoffs) -- [Roadmap](#roadmap) - -## What This Benchmark Measures - -Most agent benchmarks emphasize generic reasoning. This environment instead targets procedural decision-making under operational constraints. - -The benchmark measures whether an agent can: - -1. gather missing information before making a decision -2. ignore irrelevant profile noise -3. apply strict income and age thresholds exactly -4. distinguish lack of information from true contradiction -5. use authoritative documents instead of trusting self-reported claims -6. escalate only when escalation is genuinely required - -The result is a benchmark for "bureaucratic reasoning" rather than open-ended chat competence. - -## Key Features - -- OpenEnv-style `reset` and `step` loop -- FastAPI server entrypoint in [server/app.py](server/app.py) -- Typed `Action` and `Observation` schemas in [models.py](models.py) -- Five-task curriculum from scheme selection to document conflict handling -- Dynamic persona generation per episode -- Noise injection to punish irrelevant exploration -- Dense reward shaping plus normalized terminal grader score -- Metadata sanitization so agents cannot inspect hidden internal state -- OpenAI-compatible inference runner in [inference.py](inference.py) -- Sequential multi-model benchmark runner in [benchmark_runner.py](benchmark_runner.py) -- Graph-first benchmark reporting in [benchmark_report.py](benchmark_report.py) -- Unit tests for boundary logic and grading math in [tests/test_scheme_eligibility.py](tests/test_scheme_eligibility.py) +- [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) +- [Key Engineering Decisions](#-key-engineering-decisions) +- [Benchmark Outputs and Screenshots](#-benchmark-outputs-and-screenshots) +- [Baseline Results](#-baseline-results) +- [Setup and Running](#-setup-and-running) +- [Environment Variables](#-environment-variables) +- [Testing](#-testing) +- [Known Limitations](#-known-limitations) +- [OpenEnv Compliance](#-openenv-compliance) + +## Environment at a Glance + +| Component | Definition | +|---|---| +| **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** | Sequential multi-model runner + graph-first report generator | ## Repository Structure ```text -rl-agent-main/ +. ├── README.md ├── pyproject.toml ├── requirements.txt @@ -86,6 +112,7 @@ rl-agent-main/ ├── openenv.yaml ├── .env.example ├── models.py +├── client.py ├── inference.py ├── benchmark_runner.py ├── benchmark_report.py @@ -104,606 +131,732 @@ rl-agent-main/ ### What each major file does -- [server/app.py](server/app.py): wires the environment into OpenEnv/FastAPI and exposes `/health` -- [server/scheme_env_environment.py](server/scheme_env_environment.py): environment state machine, persona generation, task logic, reward shaping, metadata stripping -- [server/schemes.py](server/schemes.py): benchmark scheme rules plus extended future scheme metadata -- [models.py](models.py): action validation and observation schema -- [inference.py](inference.py): one-model evaluation loop against a running server -- [benchmark_runner.py](benchmark_runner.py): runs a configured model suite sequentially and stores raw artifacts -- [benchmark_report.py](benchmark_report.py): parses run artifacts and renders charts plus summary outputs -- [reports/baseline_report](reports/baseline_report): sample benchmark bundle with logs, plots, and summary files +- [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 +- [benchmark_runner.py](benchmark_runner.py): multi-model benchmark orchestration +- [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/baseline_report](reports/baseline_report): sample output bundle with charts, logs, summaries, and raw result files + +## Architecture Overview -## Architecture +This repo has a clean separation between: -The repo has four main layers: +1. the **environment runtime** +2. the **model interaction loop** +3. the **benchmark orchestration layer** +4. the **reporting and visualization layer** -1. Environment runtime layer -2. Agent interaction layer -3. Benchmark orchestration layer -4. Reporting and analysis layer +It does **not** define or train a neural network inside the repo. Instead, it evaluates external LLMs through an OpenAI-compatible API, which is why the benchmark architecture is more important here than a traditional model-weights architecture. -### High-level architecture +## System Architecture ```mermaid flowchart LR - A["LLM / Policy"] --> B["inference.py
Prompting + action extraction"] + 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 Generator"] + E --> F["Persona Generation"] E --> G["Observation Builder"] E --> H["Reward + Grader Logic"] E --> I["Scheme Rules
server/schemes.py"] - B --> J["Structured logs"] + B --> J["Run Logs"] J --> K["benchmark_runner.py"] K --> L["CSV / JSON / manifests / logs"] L --> M["benchmark_report.py"] - M --> N["PNG charts + summaries"] + M --> N["Charts + summaries + screenshots"] ``` -### Environment internals +### Runtime layers -The core environment is implemented in [server/scheme_env_environment.py](server/scheme_env_environment.py). It handles: +- **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 -- persona generation -- task selection -- observation construction -- state persistence -- action dispatch -- reward assignment -- terminal grading -- metadata sanitization before agent-facing return +## Agent-Environment Architecture -Important implementation details: +```mermaid +sequenceDiagram + participant Agent as LLM Agent + participant Runner as inference.py + participant API as FastAPI/OpenEnv + participant Env as SchemeEnvEnvironment -- The environment is explicitly single-session: `SUPPORTS_CONCURRENT_SESSIONS = False` -- Shared state is stored at the class level so per-request server instantiation does not lose the active episode -- A `threading.Lock` guards `reset()` and `step()` to keep state transitions atomic -- Hidden metadata such as `pan_verified`, `aadhaar_verified`, and internal task labels are removed before the observation is returned to the agent + 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 +``` -### Why metadata stripping matters +### Core interaction pattern -The environment tracks internal fields used for branching and grading, but agents should not see them. If the model could inspect flags like `pan_verified` or `grader_score` before termination, it could game the benchmark instead of reasoning about the case. +- 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 -This is why `_finalize_step()` deep-copies the full observation and exposes only: +## Model Interface Architecture -- `noise_queries` -- `redundant_queries` -- `relevant_queries` +This repo evaluates models, but does not ship a built-in policy network. The model interface architecture is therefore: -to the agent. +- **system prompt**: hardcoded benchmark rules and decision protocol +- **observation payload**: current `known_profile`, `missing_data`, `notification`, termination state +- **history window**: last 10 turns of assistant/user interaction context +- **output contract**: exactly one JSON object -### Architecture deep dive +### Why there is no neural network architecture section -#### 1. Action validation layer +The actual transformer architecture lives with the provider model you choose: -[models.py](models.py) strictly validates: +- Hugging Face Router +- NVIDIA NIM +- or any OpenAI-compatible endpoint -- allowed `action_type` -- allowed `ask_question` fields -- allowed document names -- allowed scheme names -- allowed reject/escalate categories +This repo is intentionally model-agnostic. Its job is to test decision behavior, not define a training graph. -This is important for environment integrity. Malformed actions do not silently drift through the benchmark. +## Training Pipeline Architecture -#### 2. Persona generation layer +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: -Every `reset()` creates a fresh persona with controlled randomness. The profile values change, but the intended reasoning challenge for each task remains stable. +```mermaid +flowchart TD + A["Environment Server"] --> B["inference.py
single-model episodes"] + B --> C["Per-task mean/std scores"] + C --> D["benchmark_runner.py
multi-model orchestration"] + D --> E["Run bundle
CSV + JSON + manifests + raw logs"] + E --> F["benchmark_report.py"] + F --> G["Leaderboard charts"] + F --> H["Task heatmaps"] + F --> I["Difficulty profile"] + F --> J["Summary artifacts"] +``` -Examples: +### What this pipeline enables -- Task 1 may be either PMKVY-optimal or PMAY-optimal depending on age and income overlap -- Task 3 always hides a near-miss income boundary violation -- Task 4 always contains a contradiction discoverable via PAN verification -- Task 5 always contains a self-reported vs Aadhaar age conflict +- repeated evaluation over randomized personas +- capability comparison across model sizes and families +- exploit detection through artifact inspection +- offline report regeneration without rerunning expensive inference -#### 3. Observation shaping layer +## Memory Buffer Architecture -The observation builder deliberately withholds some fields at episode start. The agent must earn them through `ask_question` or `request_document`. +There are two important memory concepts in this repo. -It also injects noise fields such as: +### 1. Episode state memory -- `marital_status` -- `state_of_residence` -- `number_of_children` -- `bank_name` +The environment stores active episode state at the class level because OpenEnv request handling may instantiate per request. + +Stored internal state includes: -These fields are designed to tempt weak agents into wasted exploration. +- current task +- generated persona +- `State(episode_id, step_count)` +- current full observation -#### 4. Transition and recovery layer +### 2. Model conversation buffer -Not every wrong action immediately terminates the episode. +[inference.py](inference.py) keeps a bounded rolling history: -The environment includes soft-block behavior for some protocol mistakes: +- last 10 turns only +- enough for local continuity +- avoids unnecessary prompt growth +- relies on current observation to carry the latest structured state -- approving Task 4 before PAN verification -- approving Task 5 before Aadhaar verification -- rejecting Task 4 before PAN verification -- rejecting Task 5 before Aadhaar verification -- escalating Task 4 before PAN verification +### Why this design works -In these cases the agent is penalized, but the episode stays open so it can recover and still demonstrate correct policy-following. +- the environment owns canonical truth +- the model only needs recent conversational context +- bounded history prevents token blow-up +- hidden environment flags remain internal -#### 5. Benchmark and reporting layer +## Reward Architecture -The repo separates execution from visualization: +The reward system has three layers: -- [benchmark_runner.py](benchmark_runner.py) produces raw run bundles -- [benchmark_report.py](benchmark_report.py) parses bundles and generates charts +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 | -This keeps benchmarking reproducible and lets you regenerate reports without rerunning expensive model inference. +### 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["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 + +- provider-agnostic OpenAI-compatible client +- supports Hugging Face Router +- supports NVIDIA NIM +- normalizes deprecated Hugging Face API URL patterns automatically + +## 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 + +## Distributed and Parallel Architecture + +This repo is intentionally **not** distributed at the environment layer. + +### Current design + +- `SUPPORTS_CONCURRENT_SESSIONS = False` +- benchmark runner uses `MAX_CONCURRENT = 1` +- shared state is protected by `threading.Lock` +- one evaluation session should interact with the server at a time + +### Why this is intentional + +- the environment uses singleton-style shared state across HTTP requests +- parallel episodes would corrupt correctness unless state storage were redesigned +- sequential evaluation is more important here than throughput + +### Practical implication + +This is a deliberately **serial benchmark**, not a horizontally scaled serving stack. + +## Hardware Acceleration Architecture + +The environment server itself is lightweight and CPU-friendly. Hardware acceleration is delegated to the external inference provider. + +### What uses CPU locally + +- FastAPI / Uvicorn +- state transitions +- scheme checks +- report generation with Matplotlib + +### What uses accelerator hardware externally + +- transformer inference on provider-hosted GPUs +- model-specific acceleration on Hugging Face or NVIDIA infrastructure + +### Repo-level stance + +- no CUDA kernels in repo +- no TPU-specific code in repo +- no local GPU dependency required to run the environment server +- acceleration boundary is cleanly separated from benchmark logic ## Environment Contract -The server exposes an OpenEnv-compatible HTTP environment with: +The environment follows the OpenEnv contract with: - `POST /reset` - `POST /step` - `GET /health` -The runtime metadata in [openenv.yaml](openenv.yaml) currently specifies: +[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 schema +## 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 | -| Action | Value | Notes | +The action space is intentionally small, real-world, and exploit-resistant. + +## Observation Space + +Each step returns a structured observation: + +| Field | Type | Description | |---|---|---| -| `ask_question` | `age`, `income`, `occupation`, `has_aadhaar` | Collect eligibility-critical fields | -| `request_document` | `aadhaar_card`, `pan_card`, `aadhaar`, `pan` | Request authoritative evidence | -| `approve_scheme` | `PMKVY`, `MGNREGS`, `PMAY` | Approve a scheme | -| `reject_applicant` | category string | Reject with a compact reason code | -| `escalate` | empty string or category string | Escalate to manual review | +| `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 | -### Observation schema +### Metadata exposure policy -| Field | Meaning | -|---|---| -| `known_profile` | Currently visible applicant data | -| `missing_data` | Fields still required before a safe decision | -| `notification` | Environment feedback on previous action | -| `is_terminated` | Episode end flag | -| `grader_score` | Terminal normalized score | -| `metadata` | Sanitized counters only | +The agent sees only: -## Task Curriculum +- `noise_queries` +- `redundant_queries` +- `relevant_queries` -The environment currently implements five tasks. +Internal fields such as `pan_verified`, `aadhaar_verified`, and hidden task markers are stripped before transmission. -### Task 1: Scheme Discovery +## Scheme Eligibility Rules -- Agent starts with an incomplete profile -- Must collect remaining required fields -- Must choose the optimal scheme, not just an eligible one -- PMAY can outrank PMKVY when both apply +All comparisons use strict integer arithmetic. -Failure mode tested: shallow first-match approval. +| 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 | -### Task 2: Missing Data +### Priority rule -- Occupation and Aadhaar status are hidden -- Missing field order is randomized -- Any approval before all missing data is collected is terminally wrong +When multiple schemes are eligible: -Failure mode tested: premature decision-making. +```text +PMAY > MGNREGS > PMKVY +``` -### Task 3: Boundary Fraud Detection +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. -- Income is hidden initially -- Agent must collect income before rejecting -- Income is always above the PMKVY threshold by a small but real margin -- Wrong approvals receive graded penalties based on overage size +## 🧠 The 5 Tasks -Failure mode tested: fuzzy arithmetic instead of exact rule-following. +### Task 1 — Scheme Discovery `[Easy]` -### Task 4: Escalation Dilemma +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. -- Profile presents a suspicious `student` with unusually high income -- PAN verification reveals active long-term government employment -- Correct resolution is escalation after document verification +| 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 | -Failure mode tested: confusing contradiction with ordinary ineligibility. +### Task 2 — Missing Data `[Medium]` -### Task 5: Document Conflict +The applicant file is incomplete. The agent must collect all required fields before making any terminal decision. -- Self-reported age appears near PMKVY eligibility boundary -- Aadhaar reveals a true age above the upper bound -- Correct resolution is request Aadhaar, then reject +| 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 | -Failure mode tested: trusting self-reported evidence over authoritative documents. +### Task 3 — Boundary Fraud Detection `[Hard]` -## Scheme Rules +Income is hidden initially. Once revealed, it always exceeds the PMKVY threshold, and the correct action is rejection. -The benchmark-active schemes are: +| 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 | -| Scheme | Age | Occupation | Income | Aadhaar | -|---|---|---|---|---| -| `PMKVY` | 18-35 inclusive | `mason` or `carpenter` | `<= 9999` | not required | -| `MGNREGS` | 18-60 inclusive | `farm_labourer` only | no ceiling | required | -| `PMAY` | 21-55 inclusive | any | `<= 5999` | required | +### Task 4 — Escalation Dilemma `[Expert]` -### Priority order +The applicant claims to be a student, but PAN verification reveals long-term public-sector employment. The correct response is escalation after verification. -The benefit hierarchy used by the benchmark is: +| 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 | -```text -PMAY > MGNREGS > PMKVY -``` +### Task 5 — Document Conflict `[Expert+]` -This matters because some profiles qualify for more than one scheme, and the agent is expected to choose the highest-benefit option. +The self-reported age looks near the PMKVY boundary, but Aadhaar reveals a disqualifying official age. The correct response is verified rejection. -### Extended scheme metadata +| 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 | -[server/schemes.py](server/schemes.py) also defines additional future-facing schemes: +## 🎭 The Distraction Trap -- `PM_SYM` -- `AYUSHMAN_BHARAT` -- `E_SHRAM` -- `NFSA` -- `PMMVY` +Every episode injects 1 to 3 irrelevant fields into `known_profile`, for example: -These are mostly unreachable from the current sparse benchmark tasks because they require profile fields not present in Tasks 1 to 5. +- `marital_status` +- `state_of_residence` +- `number_of_children` +- `bank_name` -## Reward Model +These look plausibly administrative, but they do **not** affect eligibility. Querying them incurs penalties and lowers the grader score. -The benchmark uses dense rewards plus terminal scoring. +This is a deliberate benchmark feature, not cosmetic clutter. -### Step-level rewards +## ⚙️ Key Engineering Decisions -| Event | Reward | -|---|---| -| Valid question | `0.0` | -| Valid document request | `0.0` | -| Noise or redundant query | `-0.10` | -| Correct optimal approval | `+10.0` | -| Eligible but suboptimal approval | `+3.0` | -| Correct rejection | `+5.0` | -| Correct escalation | `+10.0` | -| Timeout | `-2.0` | +### `threading.Lock` for real request safety + +`reset()` and `step()` are synchronous methods invoked from FastAPI handlers. A `threading.Lock` correctly protects the singleton state here. + +### Shared-state persistence across HTTP requests + +Class-level `_shared_state` ensures the episode is not lost across separate `/step` calls. + +### Metadata stripping + +Internal control fields are kept for environment logic but stripped before returning observations to the agent. + +### Task hardening against exploits -### Important nuance +The current environment closes several easy exploit paths: -The current implementation intentionally gives `0.0` reward for valid information-gathering steps. Good exploration is not rewarded directly; instead, wasted exploration is penalized lightly and terminal correctness carries most of the score signal. +- Task 1 and Task 2 both block premature approval +- Task 3 hides income at reset +- Task 5 randomizes self-reported age +- wrong escalation is terminal outside the true contradiction case -### Task-specific penalty behavior +### Soft-blocks for recoverable protocol errors -- Task 3 wrong approvals use tiered penalties based on how far income exceeds threshold -- Some policy violations in Tasks 4 and 5 are recoverable soft-blocks rather than immediate terminations -- Premature approvals in Tasks 1 and 2 remain terminal failures +Tasks 4 and 5 teach protocol adherence by allowing some mistaken steps to continue with penalties instead of always terminating immediately. -## Grader Logic +## 📸 Benchmark Outputs and Screenshots -Terminal outcomes are converted into a normalized `grader_score` in `[0.0, 1.0]`. +The branch includes a full sample report bundle under [reports/baseline_report](reports/baseline_report) so the README can show exactly what `benchmark_runner.py` and `benchmark_report.py` produce. + +### Generated artifact bundle ```text -grader_score = max(0.30, min(1.0, base_score - penalty + bonus)) +reports/baseline_report/ +├── leaderboard.csv +├── results.json +├── summary.txt +├── README.txt +├── average_scores.png +├── task_heatmap.png +├── difficulty_profile.png +├── efficiency_scatter.png +├── inference_logs/ +└── test_logs/ ``` -Where: +### 1. Leaderboard output -- wrong terminal decisions return `0.0` -- correct decisions are floored at `0.30` -- noise and redundant queries reduce the score -- document verification can add a small bonus -- Task 2 also penalizes wasted steps beyond the theoretical minimum +The top-level CSV output from the sample run is: -### Penalties and bonus +| 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 -penalty = - (noise_queries * 0.08) + - (redundant_queries * 0.05) + - (wasted_steps * 0.04) # Task 2 only +OpenEnv scheme_env Benchmark — Baseline Report Summary +======================================================== +Date generated : 2026-04-08 +Models evaluated : 8 -bonus = - 0.05 if document_verified else 0.0 +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 ``` -### Why separate reward and grader score +### 3. Average score chart -- reward helps RL-style learning -- grader score makes model comparisons stable and leaderboard-friendly -- a model can accumulate neutral steps and still fail the episode -- the benchmark wants correctness, not just activity +![Average Scores](reports/baseline_report/average_scores.png) -## Model and Data Flow +This chart is the high-level leaderboard view and is the quickest way to compare overall capability across models. -### Episode flow +### 4. Per-task heatmap -```mermaid -sequenceDiagram - participant Agent - participant Runner as inference.py - participant Server as FastAPI/OpenEnv - participant Env as SchemeEnvEnvironment +![Task Heatmap](reports/baseline_report/task_heatmap.png) - Agent->>Runner: Produce JSON action - Runner->>Server: POST /step - Server->>Env: step(action) - Env->>Env: Validate action - Env->>Env: Update shared state - Env->>Env: Compute reward / terminal result - Env->>Env: Strip hidden metadata - Env-->>Server: Observation - Server-->>Runner: Observation + reward + done - Runner-->>Agent: New state context -``` +This view is especially useful for spotting capability cliffs and task-specific failure modes. -### Reset and step architecture +### 5. Difficulty profile -```mermaid -flowchart TD - A["reset(seed)"] --> B["Select task"] - B --> C["Generate persona"] - C --> D["Build fresh observation"] - D --> E["Persist shared state"] - E --> F["Agent action"] - F --> G{"Action type"} - G -->|ask_question| H["Reveal field or penalize noise/redundancy"] - G -->|request_document| I["Verify PAN/Aadhaar/generic document"] - G -->|approve_scheme| J["Check eligibility / optimality / protocol violations"] - G -->|reject_applicant| K["Check justified rejection vs premature rejection"] - G -->|escalate| L["Allow only verified contradiction path"] - H --> M["_finalize_step"] - I --> M - J --> M - K --> M - L --> M - M --> N["Persist full internal obs"] - M --> O["Return sanitized agent obs"] -``` +![Difficulty Profile](reports/baseline_report/difficulty_profile.png) -### Benchmark pipeline +This chart summarizes which tasks are easiest or hardest across the evaluated model set. -```mermaid -flowchart LR - A["benchmark_runner.py"] --> B["Per-model inference logs"] - A --> C["leaderboard CSV"] - A --> D["run manifest"] - A --> E["analysis JSON"] - B --> F["benchmark_report.py"] - C --> F - D --> F - E --> F - F --> G["average_scores.png"] - F --> H["task_heatmap.png"] - F --> I["efficiency_scatter.png"] - F --> J["difficulty_profile.png"] - F --> K["summary.txt / README.txt"] -``` +### 6. Efficiency / protocol-view scatter -## Setup +![Efficiency Scatter](reports/baseline_report/efficiency_scatter.png) -The repo supports both `uv`-based and `pip`-based flows. +This view helps interpret whether strong models are also protocol-efficient, not just ultimately correct. -### Python requirements +### 7. Raw artifacts included in the bundle -- Python `>=3.10` -- FastAPI -- Uvicorn -- openenv-core -- Pydantic v2 -- OpenAI Python SDK -- python-dotenv +The sample report directory also includes: -### Install with `uv` +- [results.json](reports/baseline_report/results.json) +- [leaderboard.csv](reports/baseline_report/leaderboard.csv) +- [summary.txt](reports/baseline_report/summary.txt) +- [README.txt](reports/baseline_report/README.txt) +- [inference_logs](reports/baseline_report/inference_logs) +- [test_logs](reports/baseline_report/test_logs) -```bash -uv sync -``` +That means the README now shows not just plots, but also the exact machine-readable outputs and raw logs the benchmark produces. -### Install with `pip` +## 📊 Baseline Results -```bash -python -m venv .venv -source .venv/bin/activate -pip install -r requirements.txt -``` +Across the included baseline report: -### Development dependencies +- **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 -```bash -pip install -e ".[dev]" -``` +### What these results reveal -## Running the Server +- **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 -### With Python directly +## 🛠️ Setup and Running + +### Option 1 — Docker ```bash -python -m server.app +docker build -t scheme-enrollment-env . +docker run -p 7860:7860 scheme-enrollment-env +curl http://localhost:7860/health ``` -### With Uvicorn +### 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 ``` -### Health check +### With `uv` ```bash -curl http://localhost:7860/health +uv sync +export PYTHONPATH=. +uvicorn server.app:app --host 0.0.0.0 --port 7860 ``` -## Running Inference - -The inference runner talks to: - -- a running local environment server -- an OpenAI-compatible model endpoint +### Running inference -Example: +Hugging Face Router: ```bash -export ENV_URL=http://localhost:7860 +export HF_TOKEN=your_hf_token export API_BASE_URL=https://router.huggingface.co/v1 export MODEL_NAME=Qwen/Qwen2.5-7B-Instruct -export HF_TOKEN=your_token -export INFERENCE_TEMPERATURE=0.0 -export MAX_TOKENS=1500 +export ENV_URL=http://localhost:7860 export N_REPEATS=3 - python inference.py ``` -### Provider compatibility notes - -[inference.py](inference.py) includes provider normalization logic: - -- Hugging Face website URLs are rewritten to `https://router.huggingface.co/v1` -- deprecated Hugging Face Inference API model URLs are normalized to Router -- the same code path can be used with Hugging Face Router or NVIDIA NIM - -### Example NVIDIA NIM setup +NVIDIA NIM: ```bash -export ENV_URL=http://localhost:7860 +export OPENAI_API_KEY=nvapi-your_nvidia_key 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_key - +export MODEL_NAME=nvidia/llama-3.3-nemotron-super-49b-v1 +export ENV_URL=http://localhost:7860 python inference.py ``` -## Running the Benchmark Suite - -[benchmark_runner.py](benchmark_runner.py) runs a configured list of models sequentially. - -Sequential execution is intentional because the environment is single-session. +### Running the benchmark suite ```bash python benchmark_runner.py ``` -The runner: - -- waits for the server health check to pass -- evaluates the configured model list one at a time -- repeats each task multiple times -- extracts structured scores from inference logs -- stores logs, CSV output, manifest JSON, analysis JSON, and text summaries +This creates timestamped bundles under: -## Generating Reports +```text +reports/report_/ +``` -Use [benchmark_report.py](benchmark_report.py) to build graph-first summaries from a benchmark run. +with CSV, logs, manifests, summaries, and report-ready artifacts. -### From a timestamped run directory +### Generating visual reports ```bash python benchmark_report.py --run-dir reports/report_ ``` -### From the latest discovered run +or: ```bash python benchmark_report.py --latest ``` -### From explicit artifacts - -```bash -python benchmark_report.py \ - --csv reports/report_/leaderboard_.csv \ - --logs-dir reports/report_/logs_ -``` +## 🔧 Environment Variables -## Testing - -The unit tests focus on the parts of the benchmark that most often regress: +| Variable | Default | Description | +|---|---|---| +| `HF_TOKEN` | unset | Hugging Face token | +| `OPENAI_API_KEY` | unset | OpenAI-compatible provider key | +| `API_BASE_URL` | `https://router.huggingface.co/v1` | Model endpoint | +| `MODEL_NAME` | `Qwen/Qwen2.5-7B-Instruct` | Model identifier | +| `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 | -- scheme boundary comparisons -- optimal scheme ordering -- grader score clamping and penalty math +## 🧪 Testing -Run: +Run the unit tests with: ```bash -pytest tests/ +export PYTHONPATH=. +pytest tests/ -v ``` -Covered examples include: - -- `PMKVY` age and income boundary conditions -- `PMAY` strict `5999` vs `6000` threshold behavior -- `MGNREGS` Aadhaar requirements -- `get_optimal_scheme()` hierarchy correctness -- `_compute_grader_score()` floor and penalty math - -## Output Artifacts - -The repo already includes a baseline artifact bundle under [reports/baseline_report](reports/baseline_report). - -Typical generated outputs include: - -- `leaderboard.csv` -- `results.json` -- `summary.txt` -- `README.txt` -- `average_scores.png` -- `task_heatmap.png` -- `efficiency_scatter.png` -- `difficulty_profile.png` -- `inference_logs/` -- `test_logs/` - -For fresh runs produced by [benchmark_runner.py](benchmark_runner.py), the current expected layout is: - -- `reports/report_/leaderboard_.csv` -- `reports/report_/logs_/` -- `reports/report_/run_manifest_.json` -- `reports/report_/analysis_.json` -- `reports/report_/summary_.txt` +Current unit tests cover: -## Design Tradeoffs +- PMKVY age and income boundaries +- PMAY strict ceiling behavior +- MGNREGS Aadhaar requirement +- optimal-scheme priority ordering +- grader score floor and penalty math -### Single-session shared state +The baseline report bundle also includes archived test outputs under [reports/baseline_report/test_logs](reports/baseline_report/test_logs). -The environment prioritizes correctness and simple persistence across HTTP requests over concurrency. This keeps implementation straightforward, but it means evaluation should remain sequential. +## ⚠️ Known Limitations -### Sanitized observations +1. **Single active environment session**: evaluation should be sequential +2. **Persona randomness introduces variance**: use `N_REPEATS >= 3` for stable comparisons +3. **PYTHONPATH matters for local runs**: `export PYTHONPATH=.` from repo root +4. **Strict schema validation**: invalid actions are rejected rather than tolerated +5. **No built-in model training loop**: this is an environment and benchmarking repo, not a trainer -The benchmark avoids leaking internal truth flags. That makes the environment more faithful as an evaluation tool, even though it adds some implementation complexity. +## ✅ OpenEnv Compliance -### Soft-blocks for recoverable mistakes - -Some protocol violations in Tasks 4 and 5 do not instantly end the episode. This gives more nuanced behavioral signal and better reflects operational workflows where an officer can still correct course. - -### Narrow benchmark profile, broader future catalog - -Current tasks use a sparse four-field profile core: - -- `age` -- `income` -- `occupation` -- `has_aadhaar` - -But the repo already contains extended scheme metadata for future richer tasks. - -## Roadmap - -High-value next steps suggested by the current codebase: - -1. add end-to-end tests for actual `reset` and `step` trajectories, not just pure helper logic -2. document the run-manifest and analysis JSON schemas more explicitly -3. expose a canonical agent-facing observation model instead of sanitizing inline in `_finalize_step()` -4. add benchmark fixtures for Task 4 and Task 5 recovery paths -5. expand reporting docs with example interpretation of each chart -6. consider session-safe state storage if parallel evaluation becomes necessary - -## Summary - -This repo is a strong benchmark for rule-bound agent behavior. Its most interesting architectural feature is not just the task list, but the combination of: - -- partial observability -- authoritative document verification -- exact integer thresholds -- contradiction-aware escalation -- hidden internal state with sanitized agent views - -That combination makes it a useful testbed for evaluating whether a model can act like a careful operator, not just produce plausible language. +| Requirement | Status | +|---|---| +| `step()` / `reset()` / `state` property | ✅ | +| Typed `Action` model | ✅ | +| Typed `Observation` model | ✅ | +| `openenv.yaml` present | ✅ | +| `/health` endpoint | ✅ | +| OpenAI-compatible inference client | ✅ | +| Root `inference.py` script | ✅ | +| 5 graded tasks | ✅ | +| FastAPI runtime | ✅ | +| Resource declaration in yaml | ✅ | + +## 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/baseline_report/README.txt b/reports/baseline_report/README.txt new file mode 100644 index 0000000..151140a --- /dev/null +++ b/reports/baseline_report/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/baseline_report/average_scores.png b/reports/baseline_report/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/baseline_report/inference_logs/inference_nemotron3_120b.txt b/reports/baseline_report/inference_logs/inference_nemotron3_120b.txt new file mode 100644 index 0000000..aa28394 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/inference_logs/inference_nemotron3_nano30b.txt b/reports/baseline_report/inference_logs/inference_nemotron3_nano30b.txt new file mode 100644 index 0000000..63ec0ae --- /dev/null +++ b/reports/baseline_report/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/baseline_report/inference_logs/inference_nemotron51b.txt b/reports/baseline_report/inference_logs/inference_nemotron51b.txt new file mode 100644 index 0000000..03f64cd --- /dev/null +++ b/reports/baseline_report/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/baseline_report/inference_logs/inference_nemotron_mini4b.txt b/reports/baseline_report/inference_logs/inference_nemotron_mini4b.txt new file mode 100644 index 0000000..95d3d14 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/inference_logs/inference_nemotron_nano.txt b/reports/baseline_report/inference_logs/inference_nemotron_nano.txt new file mode 100644 index 0000000..e19b822 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/inference_logs/inference_nemotron_nano8b.txt b/reports/baseline_report/inference_logs/inference_nemotron_nano8b.txt new file mode 100644 index 0000000..95bdca3 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/inference_logs/inference_nemotron_super49b.txt b/reports/baseline_report/inference_logs/inference_nemotron_super49b.txt new file mode 100644 index 0000000..cb2eee1 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/inference_logs/inference_nvidia_8b.txt b/reports/baseline_report/inference_logs/inference_nvidia_8b.txt new file mode 100644 index 0000000..1e817b0 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/leaderboard.csv b/reports/baseline_report/leaderboard.csv new file mode 100644 index 0000000..1fffcc0 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/results.json b/reports/baseline_report/results.json new file mode 100644 index 0000000..fee5321 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/summary.txt b/reports/baseline_report/summary.txt new file mode 100644 index 0000000..92de904 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/task_heatmap.png b/reports/baseline_report/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/baseline_report/test_logs/pytest_results.txt b/reports/baseline_report/test_logs/pytest_results.txt new file mode 100644 index 0000000..1b2adaa --- /dev/null +++ b/reports/baseline_report/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/baseline_report/test_logs/smoke_test_results.txt b/reports/baseline_report/test_logs/smoke_test_results.txt new file mode 100644 index 0000000..15da4e3 --- /dev/null +++ b/reports/baseline_report/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/baseline_report/test_logs/test_results.txt b/reports/baseline_report/test_logs/test_results.txt new file mode 100644 index 0000000..b662b86 --- /dev/null +++ b/reports/baseline_report/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 ============================== From e43358d4c4850e4c652a57a275a74981ada6f986 Mon Sep 17 00:00:00 2001 From: Heet Ranpura Date: Wed, 8 Apr 2026 21:09:49 +0530 Subject: [PATCH 3/5] docs: simplify README and align inference config --- README.md | 170 +++++++++------------------------------------------ inference.py | 15 ++--- 2 files changed, 38 insertions(+), 147 deletions(-) diff --git a/README.md b/README.md index 7762332..8ef67b6 100644 --- a/README.md +++ b/README.md @@ -63,14 +63,10 @@ The benchmark is grounded in a workflow that affects welfare access, fraud preve - [Architecture Overview](#architecture-overview) - [System Architecture](#system-architecture) - [Agent-Environment Architecture](#agent-environment-architecture) -- [Model Interface Architecture](#model-interface-architecture) - [Training Pipeline Architecture](#training-pipeline-architecture) -- [Memory Buffer Architecture](#memory-buffer-architecture) - [Reward Architecture](#reward-architecture) - [Deployment and Inference Architecture](#deployment-and-inference-architecture) - [Data Flow Architecture](#data-flow-architecture) -- [Distributed and Parallel Architecture](#distributed-and-parallel-architecture) -- [Hardware Acceleration Architecture](#hardware-acceleration-architecture) - [Environment Contract](#environment-contract) - [Action Space](#action-space) - [Observation Space](#observation-space) @@ -83,7 +79,6 @@ The benchmark is grounded in a workflow that affects welfare access, fraud preve - [Setup and Running](#-setup-and-running) - [Environment Variables](#-environment-variables) - [Testing](#-testing) -- [Known Limitations](#-known-limitations) - [OpenEnv Compliance](#-openenv-compliance) ## Environment at a Glance @@ -151,8 +146,6 @@ This repo has a clean separation between: 3. the **benchmark orchestration layer** 4. the **reporting and visualization layer** -It does **not** define or train a neural network inside the repo. Instead, it evaluates external LLMs through an OpenAI-compatible API, which is why the benchmark architecture is more important here than a traditional model-weights architecture. - ## System Architecture ```mermaid @@ -208,25 +201,6 @@ sequenceDiagram - the environment can soft-block some wrong protocol steps and allow recovery - the final score depends on both correctness and efficiency -## Model Interface Architecture - -This repo evaluates models, but does not ship a built-in policy network. The model interface architecture is therefore: - -- **system prompt**: hardcoded benchmark rules and decision protocol -- **observation payload**: current `known_profile`, `missing_data`, `notification`, termination state -- **history window**: last 10 turns of assistant/user interaction context -- **output contract**: exactly one JSON object - -### Why there is no neural network architecture section - -The actual transformer architecture lives with the provider model you choose: - -- Hugging Face Router -- NVIDIA NIM -- or any OpenAI-compatible endpoint - -This repo is intentionally model-agnostic. Its job is to test decision behavior, not define a training graph. - ## 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: @@ -251,37 +225,6 @@ flowchart TD - exploit detection through artifact inspection - offline report regeneration without rerunning expensive inference -## Memory Buffer Architecture - -There are two important memory concepts in this repo. - -### 1. Episode state memory - -The environment stores active episode state at the class level because OpenEnv request handling may instantiate per request. - -Stored internal state includes: - -- current task -- generated persona -- `State(episode_id, step_count)` -- current full observation - -### 2. Model conversation buffer - -[inference.py](inference.py) keeps a bounded rolling history: - -- last 10 turns only -- enough for local continuity -- avoids unnecessary prompt growth -- relies on current observation to carry the latest structured state - -### Why this design works - -- the environment owns canonical truth -- the model only needs recent conversational context -- bounded history prevents token blow-up -- hidden environment flags remain internal - ## Reward Architecture The reward system has three layers: @@ -348,7 +291,7 @@ flowchart TD C --> D["Runtime container"] D --> E["uvicorn server.app:app :7860"] E --> F["/health"] - G["inference.py"] --> H["Hugging Face Router or NVIDIA NIM"] + G["inference.py"] --> H["OpenAI"] G --> E ``` @@ -362,10 +305,10 @@ flowchart TD ### Inference characteristics -- provider-agnostic OpenAI-compatible client -- supports Hugging Face Router -- supports NVIDIA NIM -- normalizes deprecated Hugging Face API URL patterns automatically +- 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 @@ -400,50 +343,6 @@ flowchart TD - timeout enforcement happens centrally in `_finalize_step()` - all step paths converge through the same finalization logic -## Distributed and Parallel Architecture - -This repo is intentionally **not** distributed at the environment layer. - -### Current design - -- `SUPPORTS_CONCURRENT_SESSIONS = False` -- benchmark runner uses `MAX_CONCURRENT = 1` -- shared state is protected by `threading.Lock` -- one evaluation session should interact with the server at a time - -### Why this is intentional - -- the environment uses singleton-style shared state across HTTP requests -- parallel episodes would corrupt correctness unless state storage were redesigned -- sequential evaluation is more important here than throughput - -### Practical implication - -This is a deliberately **serial benchmark**, not a horizontally scaled serving stack. - -## Hardware Acceleration Architecture - -The environment server itself is lightweight and CPU-friendly. Hardware acceleration is delegated to the external inference provider. - -### What uses CPU locally - -- FastAPI / Uvicorn -- state transitions -- scheme checks -- report generation with Matplotlib - -### What uses accelerator hardware externally - -- transformer inference on provider-hosted GPUs -- model-specific acceleration on Hugging Face or NVIDIA infrastructure - -### Repo-level stance - -- no CUDA kernels in repo -- no TPU-specific code in repo -- no local GPU dependency required to run the environment server -- acceleration boundary is cleanly separated from benchmark logic - ## Environment Contract The environment follows the OpenEnv contract with: @@ -764,55 +663,51 @@ export N_REPEATS=3 python inference.py ``` -NVIDIA NIM: +OpenAI-compatible endpoint: ```bash -export OPENAI_API_KEY=nvapi-your_nvidia_key -export API_BASE_URL=https://integrate.api.nvidia.com/v1 -export MODEL_NAME=nvidia/llama-3.3-nemotron-super-49b-v1 +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 ``` -### Running the benchmark suite - -```bash -python benchmark_runner.py -``` - -This creates timestamped bundles under: - -```text -reports/report_/ -``` - -with CSV, logs, manifests, summaries, and report-ready artifacts. - ### Generating visual reports ```bash python benchmark_report.py --run-dir reports/report_ ``` -or: - -```bash -python benchmark_report.py --latest -``` - ## 🔧 Environment Variables | Variable | Default | Description | |---|---|---| -| `HF_TOKEN` | unset | Hugging Face token | -| `OPENAI_API_KEY` | unset | OpenAI-compatible provider key | +| `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") +``` + +and all LLM calls are made through: + +```python +from openai import OpenAI +client = OpenAI(base_url=API_BASE_URL, api_key=HF_TOKEN) +``` + ## 🧪 Testing Run the unit tests with: @@ -832,14 +727,6 @@ Current unit tests cover: The baseline report bundle also includes archived test outputs under [reports/baseline_report/test_logs](reports/baseline_report/test_logs). -## ⚠️ Known Limitations - -1. **Single active environment session**: evaluation should be sequential -2. **Persona randomness introduces variance**: use `N_REPEATS >= 3` for stable comparisons -3. **PYTHONPATH matters for local runs**: `export PYTHONPATH=.` from repo root -4. **Strict schema validation**: invalid actions are rejected rather than tolerated -5. **No built-in model training loop**: this is an environment and benchmarking repo, not a trainer - ## ✅ OpenEnv Compliance | Requirement | Status | @@ -854,6 +741,9 @@ The baseline report bundle also includes archived test outputs under [reports/ba | 5 graded tasks | ✅ | | FastAPI runtime | ✅ | | Resource declaration in yaml | ✅ | +| `API_BASE_URL`, `MODEL_NAME`, `HF_TOKEN` read in `inference.py` | ✅ | +| Optional `LOCAL_IMAGE_NAME` in `inference.py` | ✅ | +| Structured `[START]` / `[STEP]` / `[END]` stdout logs | ✅ | ## Closing Note diff --git a/inference.py b/inference.py index e63151a..5a2c587 100644 --- a/inference.py +++ b/inference.py @@ -23,10 +23,11 @@ # ENVIRONMENT CONFIGURATION # All credentials read from environment — never hardcoded. # ========================================================= -API_BASE_URL = os.getenv("API_BASE_URL", "https://router.huggingface.co/v1") -MODEL_NAME = os.getenv("MODEL_NAME", "Qwen/Qwen2.5-7B-Instruct") -OPENAI_API_KEY = os.getenv("OPENAI_API_KEY", "") or os.getenv("HF_TOKEN", "") # FIX A1 -ENV_URL = os.getenv("ENV_URL", "http://localhost:7860") +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") +ENV_URL = os.getenv("ENV_URL", "http://localhost:7860") INFERENCE_TEMPERATURE = float(os.getenv("INFERENCE_TEMPERATURE", "0.0")) MAX_TOKENS = int(os.getenv("MAX_TOKENS", "1500")) @@ -79,12 +80,12 @@ def normalize_provider_config(base_url: str, model_name: str) -> tuple[str, str] API_BASE_URL, MODEL_NAME = normalize_provider_config(API_BASE_URL, MODEL_NAME) -client = OpenAI(base_url=API_BASE_URL, api_key=OPENAI_API_KEY) +client = OpenAI(base_url=API_BASE_URL, api_key=HF_TOKEN) -if "huggingface.co" in API_BASE_URL and not OPENAI_API_KEY: +if "huggingface.co" in API_BASE_URL and not HF_TOKEN: print( - "[CONFIG] Missing HF_TOKEN / OPENAI_API_KEY for Hugging Face Router. " + "[CONFIG] Missing HF_TOKEN for the configured endpoint. " "Set HF_TOKEN in your environment or .env file.", flush=True, ) From f6413829da65ff72239afdd78b54e5dfd062c8b7 Mon Sep 17 00:00:00 2001 From: Heet Ranpura Date: Wed, 8 Apr 2026 21:21:32 +0530 Subject: [PATCH 4/5] docs: align README with inference outputs and hackathon requirements --- README.md | 94 ++- 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, 4423 insertions(+), 54 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 8ef67b6..c459b69 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,18 @@ This environment exists to measure a harder and more realistic capability cluste 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 +- 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) @@ -73,7 +85,6 @@ The benchmark is grounded in a workflow that affects welfare access, fraud preve - [Scheme Eligibility Rules](#scheme-eligibility-rules) - [The 5 Tasks](#-the-5-tasks) - [The Distraction Trap](#-the-distraction-trap) -- [Key Engineering Decisions](#-key-engineering-decisions) - [Benchmark Outputs and Screenshots](#-benchmark-outputs-and-screenshots) - [Baseline Results](#-baseline-results) - [Setup and Running](#-setup-and-running) @@ -121,7 +132,8 @@ The benchmark is grounded in a workflow that affects welfare access, fraud preve │ ├── conftest.py │ └── test_scheme_eligibility.py └── reports/ - └── baseline_report/ + ├── inference_logs/ + └── test_logs/ ``` ### What each major file does @@ -135,7 +147,7 @@ The benchmark is grounded in a workflow that affects welfare access, fraud preve - [benchmark_runner.py](benchmark_runner.py): multi-model benchmark orchestration - [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/baseline_report](reports/baseline_report): sample output bundle with charts, logs, summaries, and raw result files +- [reports](reports): benchmark outputs, summary files, charts, and archived logs ## Architecture Overview @@ -291,7 +303,7 @@ flowchart TD C --> D["Runtime container"] D --> E["uvicorn server.app:app :7860"] E --> F["/health"] - G["inference.py"] --> H["OpenAI"] + G["inference.py"] --> H["Hugging Face Router or NVIDIA NIM"] G --> E ``` @@ -486,53 +498,33 @@ These look plausibly administrative, but they do **not** affect eligibility. Que This is a deliberate benchmark feature, not cosmetic clutter. -## ⚙️ Key Engineering Decisions - -### `threading.Lock` for real request safety - -`reset()` and `step()` are synchronous methods invoked from FastAPI handlers. A `threading.Lock` correctly protects the singleton state here. - -### Shared-state persistence across HTTP requests - -Class-level `_shared_state` ensures the episode is not lost across separate `/step` calls. - -### Metadata stripping - -Internal control fields are kept for environment logic but stripped before returning observations to the agent. - -### Task hardening against exploits - -The current environment closes several easy exploit paths: - -- Task 1 and Task 2 both block premature approval -- Task 3 hides income at reset -- Task 5 randomizes self-reported age -- wrong escalation is terminal outside the true contradiction case - -### Soft-blocks for recoverable protocol errors +## 📸 Benchmark Outputs and Screenshots -Tasks 4 and 5 teach protocol adherence by allowing some mistaken steps to continue with penalties instead of always terminating immediately. +The repository includes concrete benchmark outputs and archived logs under [reports](reports). For practical inspection, the most important folders are: -## 📸 Benchmark Outputs and Screenshots +- [reports/inference_logs](reports/inference_logs) +- [reports/test_logs](reports/test_logs) -The branch includes a full sample report bundle under [reports/baseline_report](reports/baseline_report) so the README can show exactly what `benchmark_runner.py` and `benchmark_report.py` produce. +The charts and summary files sit alongside them in the top-level [reports](reports) directory. ### Generated artifact bundle ```text -reports/baseline_report/ -├── leaderboard.csv -├── results.json -├── summary.txt -├── README.txt +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/ ``` +These artifacts are presented as the benchmark output bundle associated with the evaluated inference runs, while 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: @@ -569,38 +561,38 @@ Perfect score (1.0 on all tasks): none ### 3. Average score chart -![Average Scores](reports/baseline_report/average_scores.png) +![Average Scores](reports/average_scores.png) This chart is the high-level leaderboard view and is the quickest way to compare overall capability across models. ### 4. Per-task heatmap -![Task Heatmap](reports/baseline_report/task_heatmap.png) +![Task Heatmap](reports/task_heatmap.png) This view is especially useful for spotting capability cliffs and task-specific failure modes. ### 5. Difficulty profile -![Difficulty Profile](reports/baseline_report/difficulty_profile.png) +![Difficulty Profile](reports/difficulty_profile.png) This chart summarizes which tasks are easiest or hardest across the evaluated model set. ### 6. Efficiency / protocol-view scatter -![Efficiency Scatter](reports/baseline_report/efficiency_scatter.png) +![Efficiency Scatter](reports/efficiency_scatter.png) This view helps interpret whether strong models are also protocol-efficient, not just ultimately correct. ### 7. Raw artifacts included in the bundle -The sample report directory also includes: +The included output bundle also includes: -- [results.json](reports/baseline_report/results.json) -- [leaderboard.csv](reports/baseline_report/leaderboard.csv) -- [summary.txt](reports/baseline_report/summary.txt) -- [README.txt](reports/baseline_report/README.txt) -- [inference_logs](reports/baseline_report/inference_logs) -- [test_logs](reports/baseline_report/test_logs) +- [results.json](reports/results.json) +- [leaderboard.csv](reports/leaderboard.csv) +- [summary.txt](reports/summary.txt) +- [README.txt](reports/README.txt) +- [inference_logs](reports/inference_logs) +- [test_logs](reports/test_logs) That means the README now shows not just plots, but also the exact machine-readable outputs and raw logs the benchmark produces. @@ -673,12 +665,6 @@ export ENV_URL=http://localhost:7860 python inference.py ``` -### Generating visual reports - -```bash -python benchmark_report.py --run-dir reports/report_ -``` - ## 🔧 Environment Variables | Variable | Default | Description | @@ -725,7 +711,7 @@ Current unit tests cover: - optimal-scheme priority ordering - grader score floor and penalty math -The baseline report bundle also includes archived test outputs under [reports/baseline_report/test_logs](reports/baseline_report/test_logs). +Archived test outputs are included under [reports/test_logs](reports/test_logs). ## ✅ OpenEnv Compliance 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 ============================== From 4a709e6879e92f92b055912f61f8a52528d7cdbf Mon Sep 17 00:00:00 2001 From: Heet Ranpura Date: Wed, 8 Apr 2026 21:36:15 +0530 Subject: [PATCH 5/5] docs: refine task labels and add validation script --- README.md | 12 +- scripts/validate-submission.sh | 287 +++++++++++++++++++++++++++++++++ 2 files changed, 293 insertions(+), 6 deletions(-) create mode 100755 scripts/validate-submission.sh diff --git a/README.md b/README.md index c459b69..8b65ff1 100644 --- a/README.md +++ b/README.md @@ -303,7 +303,7 @@ flowchart TD C --> D["Runtime container"] D --> E["uvicorn server.app:app :7860"] E --> F["/health"] - G["inference.py"] --> H["Hugging Face Router or NVIDIA NIM"] + G["inference.py"] --> H["OpenAI, Hugging Face Router, or NVIDIA NIM"] G --> E ``` @@ -429,7 +429,7 @@ The repo also defines future-facing extended schemes in [server/schemes.py](serv ## 🧠 The 5 Tasks -### Task 1 — Scheme Discovery `[Easy]` +### 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. @@ -440,7 +440,7 @@ The agent starts with a partially hidden profile and must collect the remaining | Minimum steps | 3 | | Core skill | benefit-aware scheme ranking | -### Task 2 — Missing Data `[Medium]` +### Task 2 — Missing Data The applicant file is incomplete. The agent must collect all required fields before making any terminal decision. @@ -451,7 +451,7 @@ The applicant file is incomplete. The agent must collect all required fields bef | Minimum steps | 3 | | Core skill | procedural completeness | -### Task 3 — Boundary Fraud Detection `[Hard]` +### Task 3 — Boundary Fraud Detection Income is hidden initially. Once revealed, it always exceeds the PMKVY threshold, and the correct action is rejection. @@ -462,7 +462,7 @@ Income is hidden initially. Once revealed, it always exceeds the PMKVY threshold | Minimum steps | 4 | | Core skill | exact arithmetic boundary reasoning | -### Task 4 — Escalation Dilemma `[Expert]` +### 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. @@ -473,7 +473,7 @@ The applicant claims to be a student, but PAN verification reveals long-term pub | Minimum steps | 2 | | Core skill | contradiction handling and escalation | -### Task 5 — Document Conflict `[Expert+]` +### 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. diff --git a/scripts/validate-submission.sh b/scripts/validate-submission.sh new file mode 100755 index 0000000..3180967 --- /dev/null +++ b/scripts/validate-submission.sh @@ -0,0 +1,287 @@ +#!/usr/bin/env bash +# +# validate-submission.sh — Extended OpenEnv Submission Validator +# +# This script starts from the official hackathon template and adds repo-level +# checks for required files, inference env-var contract, structured stdout log +# markers, Dockerfile presence, and OpenEnv submission shape. +# +# Usage: +# ./scripts/validate-submission.sh [repo_dir] +# +# Examples: +# ./scripts/validate-submission.sh https://my-team.hf.space +# ./scripts/validate-submission.sh https://my-team.hf.space /path/to/repo +# + +set -uo pipefail + +DOCKER_BUILD_TIMEOUT=600 +if [ -t 1 ]; then + RED='\033[0;31m' + GREEN='\033[0;32m' + YELLOW='\033[1;33m' + BOLD='\033[1m' + NC='\033[0m' +else + RED='' GREEN='' YELLOW='' BOLD='' NC='' +fi + +run_with_timeout() { + local secs="$1"; shift + if command -v timeout >/dev/null 2>&1; then + timeout "$secs" "$@" + elif command -v gtimeout >/dev/null 2>&1; then + gtimeout "$secs" "$@" + else + "$@" & + local pid=$! + ( sleep "$secs" && kill "$pid" 2>/dev/null ) & + local watcher=$! + wait "$pid" 2>/dev/null + local rc=$? + kill "$watcher" 2>/dev/null + wait "$watcher" 2>/dev/null + return $rc + fi +} + +portable_mktemp() { + local prefix="${1:-validate}" + mktemp "${TMPDIR:-/tmp}/${prefix}-XXXXXX" 2>/dev/null || mktemp +} + +CLEANUP_FILES=() +cleanup() { rm -f "${CLEANUP_FILES[@]+"${CLEANUP_FILES[@]}"}"; } +trap cleanup EXIT + +PING_URL="${1:-}" +REPO_DIR="${2:-.}" + +if [ -z "$PING_URL" ]; then + printf "Usage: %s [repo_dir]\n" "$0" + printf "\n" + printf " ping_url Your HuggingFace Space URL (e.g. https://your-space.hf.space)\n" + printf " repo_dir Path to your repo (default: current directory)\n" + exit 1 +fi + +if ! REPO_DIR="$(cd "$REPO_DIR" 2>/dev/null && pwd)"; then + printf "Error: directory '%s' not found\n" "${2:-.}" + exit 1 +fi + +PING_URL="${PING_URL%/}" +PASS=0 + +log() { printf "[%s] %b\n" "$(date -u +%H:%M:%S)" "$*"; } +pass() { log "${GREEN}PASSED${NC} -- $1"; PASS=$((PASS + 1)); } +fail() { log "${RED}FAILED${NC} -- $1"; } +warn() { log "${YELLOW}WARN${NC} -- $1"; } +hint() { printf " ${YELLOW}Hint:${NC} %b\n" "$1"; } +stop_at() { + printf "\n" + printf "${RED}${BOLD}Validation stopped at %s.${NC} Fix the above before continuing.\n" "$1" + exit 1 +} + +require_file() { + local path="$1" + local label="$2" + if [ -f "$path" ]; then + pass "$label present: ${path#$REPO_DIR/}" + else + fail "$label missing: ${path#$REPO_DIR/}" + return 1 + fi +} + +require_dir() { + local path="$1" + local label="$2" + if [ -d "$path" ]; then + pass "$label present: ${path#$REPO_DIR/}" + else + fail "$label missing: ${path#$REPO_DIR/}" + return 1 + fi +} + +require_grep() { + local pattern="$1" + local file="$2" + local label="$3" + if grep -Eq "$pattern" "$file"; then + pass "$label" + else + fail "$label" + return 1 + fi +} + +printf "\n" +printf "${BOLD}========================================${NC}\n" +printf "${BOLD} OpenEnv Submission Validator${NC}\n" +printf "${BOLD}========================================${NC}\n" +log "Repo: $REPO_DIR" +log "Ping URL: $PING_URL" +printf "\n" + +log "${BOLD}Step 1/8: Repo structure checks${NC} ..." + +require_file "$REPO_DIR/README.md" "README" || stop_at "Step 1" +require_file "$REPO_DIR/inference.py" "Root inference script" || stop_at "Step 1" +require_file "$REPO_DIR/openenv.yaml" "openenv.yaml" || stop_at "Step 1" +require_file "$REPO_DIR/Dockerfile" "Dockerfile" || stop_at "Step 1" +require_file "$REPO_DIR/models.py" "Root models.py" || stop_at "Step 1" +require_dir "$REPO_DIR/server" "server package" || stop_at "Step 1" +require_dir "$REPO_DIR/tests" "tests directory" || stop_at "Step 1" + +log "${BOLD}Step 2/8: Inference contract checks${NC} ..." + +require_grep 'from openai import OpenAI' "$REPO_DIR/inference.py" "OpenAI client imported in inference.py" || stop_at "Step 2" +require_grep 'API_BASE_URL *= *os.getenv\("API_BASE_URL",' "$REPO_DIR/inference.py" "API_BASE_URL read from env with default" || stop_at "Step 2" +require_grep 'MODEL_NAME *= *os.getenv\("MODEL_NAME",' "$REPO_DIR/inference.py" "MODEL_NAME read from env with default" || stop_at "Step 2" +require_grep 'HF_TOKEN *= *os.getenv\("HF_TOKEN"\)' "$REPO_DIR/inference.py" "HF_TOKEN read from env without default" || stop_at "Step 2" +require_grep 'LOCAL_IMAGE_NAME *= *os.getenv\("LOCAL_IMAGE_NAME"\)' "$REPO_DIR/inference.py" "LOCAL_IMAGE_NAME optionally supported" || stop_at "Step 2" +require_grep 'OpenAI\(base_url=API_BASE_URL, api_key=HF_TOKEN\)' "$REPO_DIR/inference.py" "OpenAI client configured from required env vars" || stop_at "Step 2" +require_grep '\[START\]' "$REPO_DIR/inference.py" "Structured START log marker present" || stop_at "Step 2" +require_grep '\[STEP\]' "$REPO_DIR/inference.py" "Structured STEP log marker present" || stop_at "Step 2" +require_grep '\[END\]' "$REPO_DIR/inference.py" "Structured END log marker present" || stop_at "Step 2" + +log "${BOLD}Step 3/8: OpenEnv spec surface checks${NC} ..." + +require_grep '^spec_version:' "$REPO_DIR/openenv.yaml" "openenv.yaml declares spec_version" || stop_at "Step 3" +require_grep '^runtime:' "$REPO_DIR/openenv.yaml" "openenv.yaml declares runtime" || stop_at "Step 3" +require_grep '^app:' "$REPO_DIR/openenv.yaml" "openenv.yaml declares app entrypoint" || stop_at "Step 3" +require_grep '^port:' "$REPO_DIR/openenv.yaml" "openenv.yaml declares port" || stop_at "Step 3" +require_grep 'def reset\(' "$REPO_DIR/server/scheme_env_environment.py" "Environment defines reset()" || stop_at "Step 3" +require_grep 'def step\(' "$REPO_DIR/server/scheme_env_environment.py" "Environment defines step()" || stop_at "Step 3" +require_grep 'def state\(' "$REPO_DIR/server/scheme_env_environment.py" "Environment exposes state property/method" || stop_at "Step 3" + +TASK_COUNT=$(grep -Ec 'task_id == [1-9]|Task [1-9]|TASK [1-9]/' "$REPO_DIR/server/scheme_env_environment.py" || true) +if [ "$TASK_COUNT" -ge 3 ]; then + pass "Detected 3+ task definitions in environment logic" +else + fail "Could not detect 3+ task definitions in environment logic" + stop_at "Step 3" +fi + +log "${BOLD}Step 4/8: README submission-content checks${NC} ..." + +require_grep 'Action Space' "$REPO_DIR/README.md" "README documents action space" || stop_at "Step 4" +require_grep 'Observation Space' "$REPO_DIR/README.md" "README documents observation space" || stop_at "Step 4" +require_grep 'Setup and Running|Setup' "$REPO_DIR/README.md" "README documents setup instructions" || stop_at "Step 4" +require_grep 'The 5 Tasks|Tasks' "$REPO_DIR/README.md" "README documents tasks" || stop_at "Step 4" +require_grep 'Baseline Results|leaderboard.csv|results.json' "$REPO_DIR/README.md" "README documents baseline outputs" || stop_at "Step 4" + +log "${BOLD}Step 5/8: Pinging HF Space${NC} ($PING_URL/reset) ..." + +CURL_OUTPUT=$(portable_mktemp "validate-curl") +CLEANUP_FILES+=("$CURL_OUTPUT") +HTTP_CODE=$(curl -s -o "$CURL_OUTPUT" -w "%{http_code}" -X POST \ + -H "Content-Type: application/json" -d '{}' \ + "$PING_URL/reset" --max-time 30 2>"$CURL_OUTPUT" || printf "000") + +if [ "$HTTP_CODE" = "200" ]; then + pass "HF Space is live and responds to /reset" +elif [ "$HTTP_CODE" = "000" ]; then + fail "HF Space not reachable (connection failed or timed out)" + hint "Check your network connection and that the Space is running." + hint "Try: curl -s -o /dev/null -w '%%{http_code}' -X POST $PING_URL/reset" + stop_at "Step 5" +else + fail "HF Space /reset returned HTTP $HTTP_CODE (expected 200)" + hint "Make sure your Space is running and the URL is correct." + hint "Try opening $PING_URL in your browser first." + stop_at "Step 5" +fi + +HEALTH_OUTPUT=$(portable_mktemp "validate-health") +CLEANUP_FILES+=("$HEALTH_OUTPUT") +HEALTH_CODE=$(curl -s -o "$HEALTH_OUTPUT" -w "%{http_code}" \ + "$PING_URL/health" --max-time 15 || printf "000") +if [ "$HEALTH_CODE" = "200" ]; then + pass "HF Space /health responds with HTTP 200" +else + fail "HF Space /health returned HTTP $HEALTH_CODE" + stop_at "Step 5" +fi + +log "${BOLD}Step 6/8: Running docker build${NC} ..." + +if ! command -v docker >/dev/null 2>&1; then + fail "docker command not found" + hint "Install Docker: https://docs.docker.com/get-docker/" + stop_at "Step 6" +fi + +BUILD_OK=false +BUILD_OUTPUT=$(run_with_timeout "$DOCKER_BUILD_TIMEOUT" docker build "$REPO_DIR" 2>&1) && BUILD_OK=true + +if [ "$BUILD_OK" = true ]; then + pass "Docker build succeeded" +else + fail "Docker build failed (timeout=${DOCKER_BUILD_TIMEOUT}s)" + printf "%s\n" "$BUILD_OUTPUT" | tail -20 + stop_at "Step 6" +fi + +log "${BOLD}Step 7/8: Running openenv validate${NC} ..." + +if ! command -v openenv >/dev/null 2>&1; then + fail "openenv command not found" + hint "Install it: pip install openenv-core" + stop_at "Step 7" +fi + +VALIDATE_OK=false +VALIDATE_OUTPUT=$(cd "$REPO_DIR" && openenv validate 2>&1) && VALIDATE_OK=true + +if [ "$VALIDATE_OK" = true ]; then + pass "openenv validate passed" + [ -n "$VALIDATE_OUTPUT" ] && log " $VALIDATE_OUTPUT" +else + fail "openenv validate failed" + printf "%s\n" "$VALIDATE_OUTPUT" + stop_at "Step 7" +fi + +log "${BOLD}Step 8/8: Local quality checks${NC} ..." + +if command -v python >/dev/null 2>&1; then + PY_COMPILE_OK=true + PY_COMPILE_OUTPUT=$(cd "$REPO_DIR" && python -m py_compile inference.py models.py server/*.py 2>&1) || PY_COMPILE_OK=false + if [ "$PY_COMPILE_OK" = true ]; then + pass "Key Python files compile cleanly" + else + fail "Python compile check failed" + printf "%s\n" "$PY_COMPILE_OUTPUT" + stop_at "Step 8" + fi +else + warn "python not found; skipping py_compile check" +fi + +if command -v pytest >/dev/null 2>&1; then + TEST_OK=true + TEST_OUTPUT=$(cd "$REPO_DIR" && pytest tests/ -q 2>&1) || TEST_OK=false + if [ "$TEST_OK" = true ]; then + pass "pytest tests/ passed" + else + fail "pytest tests/ failed" + printf "%s\n" "$TEST_OUTPUT" + stop_at "Step 8" + fi +else + warn "pytest not installed; skipping test execution" +fi + +printf "\n" +printf "${BOLD}========================================${NC}\n" +printf "${GREEN}${BOLD} Validation checks passed: %d${NC}\n" "$PASS" +printf "${GREEN}${BOLD} Submission looks ready for hackathon review.${NC}\n" +printf "${BOLD}========================================${NC}\n" +printf "\n" + +exit 0