DNSArenaEnv / README.md
PraneshkumarR's picture
DNS-Env: DNS Zone File Debugging Environment for OpenEnv
0d58c6d
---
title: DNS-Env
emoji: "\U0001F310"
colorFrom: blue
colorTo: green
sdk: docker
app_port: 7860
tags:
- openenv
- reinforcement-learning
- dns
- infrastructure
- devops
pinned: false
---
# DNS-Env: DNS Zone File Debugging Environment
## Overview
DNS-Env is a reinforcement learning environment where AI agents learn to debug and configure DNS zone files. Built for the **Meta PyTorch OpenEnv Hackathon x Scaler School of Technology**, it provides a realistic simulation of DNS administration tasks ranging from fixing broken records to configuring complex multi-zone delegations.
## Motivation
- **"It's always DNS"** -- DNS misconfiguration is the #1 cause of internet outages. Yet there is no structured RL environment for training agents to diagnose and repair DNS issues.
- **80% of domains have misconfigured DMARC records** -- Email authentication (SPF, DKIM, DMARC) is critical for deliverability and security, but remains error-prone even for experienced engineers.
- **No existing RL environment or agent benchmark covers DNS debugging** -- DNS-Env fills this gap with grounded, deterministic tasks that mirror real-world operational scenarios.
## Environment Description
The environment simulates DNS zone file editing and validation. An agent is presented with one or more zone files containing deliberate misconfigurations. The agent must use the available commands to inspect, diagnose, and repair the zone files, then submit for grading.
## Action Space
| Command | Arguments | Description |
|---------|-----------|-------------|
| `view_zone` | `zone` (optional) | View current zone file with indexed records |
| `add_record` | `zone`, `name`, `rtype`, `rdata`, `ttl` (optional) | Add a new DNS record |
| `edit_record` | `zone`, `index`, `name`/`rtype`/`rdata`/`ttl` (partial) | Edit record at index |
| `delete_record` | `zone`, `index` | Delete record at index (cannot delete SOA) |
| `check_zone` | `zone` (optional) | Validate zone file for errors |
| `dig` | `qname`, `qtype`, `zone` (optional) | Simulate DNS resolution |
| `submit` | (none) | Submit for grading |
## Observation Space
Each step returns an observation containing:
- **output** -- Command result text (zone file contents, validation errors, dig results, etc.)
- **task_description** -- Current task description and objectives
- **zone_names** -- List of available zone files
- **available_commands** -- Available actions the agent can take
- **done** -- Whether the episode is complete
- **reward** -- Score (0.0--1.0) returned on submission
## Tasks
### Task 1: fix_single_record (Easy)
Fix broken records in an `example.com` zone file. Bugs include missing trailing dots on FQDNs, invalid IP addresses, and malformed MX records.
- **Expected difficulty:** Easy
- **Max steps:** 15
### Task 2: configure_mail (Medium)
Configure complete email delivery for `acme.co`: MX records, SPF, DKIM, and DMARC from a natural language specification.
- **Expected difficulty:** Medium
- **Max steps:** 25
### Task 3: debug_delegation (Hard)
Debug a broken DNS delegation between `parent.org` and `dev.parent.org` across two zone files. Fix NS records, glue records, and SOA serial numbers.
- **Expected difficulty:** Hard
- **Max steps:** 30
## Reward Function
```
score = 0.3 * (structural_validity) + 0.5 * (resolution_correctness) + 0.2 * (no_regressions)
```
| Component | Weight | Description |
|-----------|--------|-------------|
| Structural validity | 0.3 | Zone file has no validation errors |
| Resolution correctness | 0.5 | Required DNS queries resolve correctly |
| No regressions | 0.2 | Pre-existing correct records are preserved |
## Setup & Usage
### Local Development
```bash
pip install -r requirements.txt
uvicorn server.app:app --host 0.0.0.0 --port 7860 --reload
```
### Docker
```bash
docker build -t dns-env .
docker run -p 7860:7860 dns-env
```
### API Usage
```python
import requests
BASE = "http://localhost:7860"
# Reset with a specific task
obs = requests.post(f"{BASE}/reset", json={"options": {"task_id": "fix_single_record"}}).json()
# View the zone file
obs = requests.post(f"{BASE}/step", json={"action": {"command": "view_zone", "args": {}}}).json()
print(obs["output"])
# Edit a record
obs = requests.post(f"{BASE}/step", json={
"action": {"command": "edit_record", "args": {"index": 4, "rdata": "example.com."}}
}).json()
# Submit for grading
obs = requests.post(f"{BASE}/step", json={"action": {"command": "submit", "args": {}}}).json()
print(f"Score: {obs['reward']}")
```
## Baseline Scores
| Task | Score | Steps |
|------|-------|-------|
| fix_single_record | ~0.85 | 5--8 |
| configure_mail | ~0.50 | 10--15 |
| debug_delegation | ~0.20 | 15--25 |
## Running the Baseline
```bash
export API_BASE_URL="https://api.openai.com/v1"
export MODEL_NAME="gpt-4o-mini"
export OPENAI_API_KEY="your-key"
export ENV_URL="http://localhost:7860"
python inference.py
```
## Technical Details
- Built with **FastAPI** + **Pydantic** for typed request/response models
- Pure Python DNS validation -- no external DNS tools (bind-utils, dig) required
- Deterministic grading via zone file parsing and record matching
- Supports concurrent sessions via `session_id` parameter
- Runs on 2 vCPU / 8 GB RAM within 20 minutes
## OpenEnv Spec Compliance
- step(action) returns observation, reward, done
- reset() returns initial observation
- state() returns episode metadata
- openenv.yaml with spec_version 1
- Typed Pydantic models for all request/response schemas
- Containerized with Docker
- Deployed to HuggingFace Spaces