The Agent Contract
AGENTS.md — intent routing, the gate contract, artifact rules, and write-back invariants.
AGENTS.md in the repo root is the agent's operating contract. Every agent
runtime that reads it (Claude Code, Codex, or similar) operates under the same
rules. The file is the source of truth; this page summarizes the key sections.
Intent routing
The agent routes any user input — a job paste, a recruiter email, a question, a command — to the owning skill without you naming a skill explicitly. The routing table is extensive; a few key examples:
| What you say or paste | Routed to |
|---|---|
| A job description or URL | evaluate-job (then apply-job if apply intent) |
| "Apply to this" | apply-job |
| "Find jobs" / "run a search" | search-jobs |
| A recruiter / hiring email | email-comms |
| An interview invite | interview-prep |
| A rejection / offer / status change | track-outcomes |
| "Schedule this" / availability thread | schedule-meeting |
| "Research this company" | research-company |
| "Optimize my LinkedIn" | optimize-linkedin |
| Resume / profile facts | ingest-profile |
| "Change a setting" | configure |
Paste routing is universal: anything dropped into the agent chat gets classified, captured, and routed — nothing evaporates.
Gate contract
evaluate-job is the shared mandatory gate. No tailoring, filling, or submission
can proceed without a KEEP verdict (or an explicit user-approved REVIEW).
apply-job runs or verifies evaluate-job as step zero. It cannot skip this
step, even when the user says "just apply."
Tracker Write Contract
Every skill that mutates workspace/tracker.json must:
- Stamp
meta.lastUpdatedAtto the current ISO timestamp and incrementmeta.versionin the same write. - Verify with
rolester tracker --verify. - Re-render with
rolester trackerso the dashboard hot-reloads. - Log one Activity Pulse event via
rolester activity append.
These four steps are a unit. A partial write (e.g., updating data but not stamping) is an incomplete write.
Artifact rules
- Every generated artifact (résumé, cover letter, email) must be complete — no
templates, no
[Placeholder]tokens. - Artifacts land in two places: the tracker record (for dashboard access) and
~/Downloads/rolester/<Company>/(convenience copy). - Placeholder lint runs before any artifact is marked build-ready. An unresolved bracket blocks the build.
- The agent never invents facts. Claims trace to
candidate/evidence.yml.
The body-read gate invariant
The JD body is captured locally at grab time — when a posting is sourced, evaluated, or applied to. A link is never a substitute: postings vanish when a req closes or goes behind a login. The gate reads the locally saved body, not a live URL, so evaluation stays possible even after the req is taken down.
Privacy invariant
profile.yml#compensation.current_base is private. It informs comp strategy but
must never appear in any outbound artifact (résumé, cover letter, recruiter
message, interview packet, tracker note that could be shared). Outbound comp
anchors on target_base. Skills that produce outbound text route around
current_base by field path.
Domain-neutral rule
Skills and code never hardcode personal, role, tech, comp, region, board, or
company preferences. Every such bias lives in candidate/ config files. A
trucking candidate and an AI engineer run the same skills with different configs
and get different behavior.
Round vocabulary
Interview rounds are named by type, never numbered:
conversations[].kind | Rung shown |
|---|---|
recruiter screen | Screen |
assessment | Assessment |
technical | Technical |
hiring manager | Hiring manager |
onsite | Onsite |
final | Final |
offer | Offer |
The dashboard derives an application's pipeline rung from the deepest kind it
can classify. "Round 2" is never written.