robbernick/Resume-Redaction-Guard-v1
0
Talent-Audit-Env ๐ก๏ธ
An OpenEnv-compliant Reinforcement Learning environment for Automated HR Data Compliance.
Agents learn to sanitise PII, categorise resumes by tech-stack, and detect conflicting career claims โ all without sacrificing the integrity of technical skills data.
Project Structure
Resume-Redaction-Guard-v1/
โโโ models.py # Pydantic schemas: Observation, Action, Reward
โโโ tasks.py # Task definitions (Easy / Medium / Hard) + fixture data
โโโ env.py # TalentAuditEnv โ core OpenEnv environment class
โโโ main.py # FastAPI server (OpenEnv HTTP API)
โโโ run_demo.py # CLI demo with oracle agents
โโโ openenv.yaml # OpenEnv manifest
โโโ requirements.txt
โโโ DockerfileQuick Start
# 1. Install dependencies
pip install -r requirements.txt
# 2. Run the CLI demo (all 3 tasks)
python run_demo.py
# 3. Or run a single task
python run_demo.py --task pii_easy
python run_demo.py --task pii_medium
python run_demo.py --task audit_hard
# 4. Start the backend HTTP API server
uvicorn main:app --reload --port 7860
# โ Swagger UI: http://localhost:7860/docs
# 5. Connect and launch the premium Next.js frontend
cd frontend
npm install
npm run dev
# โ View UI: http://localhost:3000Docker
# Build
docker build -t talent-audit-env:1.0.0 .
# Run (API server)
docker run -p 7860:7860 talent-audit-env:1.0.0
# Run (CLI demo)
docker run talent-audit-env:1.0.0 python run_demo.pyEnvironment API
Python API
from env import TalentAuditEnv
from models import Action, TechCategory, RiskLevel
env = TalentAuditEnv()
# --- Easy task ---
obs = env.reset("pii_easy")
action = Action.sanitize_action("r001", ["phone"])
obs, reward, done, info = env.step(action)
print(reward.total, reward.feedback) # +0.8 PII removed from 1 field(s).
# --- Medium task ---
obs = env.reset("pii_medium")
action = Action.categorize_action("r001", TechCategory.BACKEND, confidence=0.95)
obs, reward, done, info = env.step(action) # +0.2
action = Action.sanitize_action("r001", ["name", "email", "phone", "address"])
obs, reward, done, info = env.step(action) # +0.8
# --- Hard task ---
obs = env.reset("audit_hard")
action = Action.flag_action("r006", RiskLevel.HIGH,
reason="Claimed 8 years exp but graduated only 4 years ago.")
obs, reward, done, info = env.step(action) # +0.3
summary = env.state()
print(summary["total_reward"])HTTP API (FastAPI)
Tasks
Reward Scheme
Models at a Glance
Observation
class Observation(BaseModel):
task_id: str
step: int
records: List[ResumeRecord] # โฅ 1 resume records
context: Optional[Dict] # task metadata, categorized/flagged state
done: boolAction
# Exactly one payload must be set
Action.sanitize_action(record_id, fields, replacement="[REDACTED]")
Action.categorize_action(record_id, category, confidence=1.0)
Action.flag_action(record_id, risk_level, reason)Reward
class Reward(BaseModel):
total: float
breakdown: RewardBreakdown # per-signal breakdown
feedback: str # natural-language explanation
is_terminal: boolOpenEnv Compliance
The openenv.yaml manifest declares:
- observation_space โ
models.Observation - action_space โ union of Sanitize | Categorize | Flag
- reward_space โ scalar in
[-1.5, 2.0] - tasks โ all three difficulty levels
- evaluation metrics โ PII recall, category accuracy, data integrity, conflict F1
- scoring formula โ weighted composite score
