How Are Bonus Points Awarded in Hiring Agent? A Deep Dive into AI-Driven Résumé Scoring

Bonus points in Hiring Agent are awarded automatically by the LLM-based ResumeEvaluator when it detects exceptional achievements like awards, leadership roles, or community contributions in a candidate's résumé, capped at a hard maximum of 20 points and added directly to the total score.

Hiring Agent is an open-source AI-powered résumé evaluation tool from Interview Street that automatically scores candidates across four core categories plus discretionary bonus points. The bonus system recognizes extracurricular excellence and exceptional evidence that falls outside standard technical assessments, giving recruiters a holistic view of candidate potential. Understanding how bonus points are awarded, stored, and reported requires examining the underlying Pydantic models and scoring logic in the interviewstreet/hiring-agent repository.

The Bonus Points Architecture and Constraints

The bonus system is anchored by the BonusPoints Pydantic model defined in main/models.py (lines 31-34). This schema enforces strict validation rules that govern how extra credit is allocated throughout the evaluation pipeline.

class BonusPoints(BaseModel):
    total: float = Field(ge=0, le=20, description="Total bonus points")
    breakdown: str = Field(description="Breakdown of bonus points")

The total field accepts floating-point values constrained between 0 and 20, creating an unconfigurable hard ceiling of 20 bonus points. The breakdown field stores a textual explanation generated by the LLM, detailing exactly which achievements triggered the bonus and why.

How the ResumeEvaluator Detects Bonus-Worthy Evidence

Bonus points are not manually assigned but rather derived automatically during the AI evaluation phase. The ResumeEvaluator.evaluate_resume() method processes the consolidated résumé text—potentially enriched with GitHub and blog data—and returns an EvaluationData object containing the bonus_points section.

The LLM scans for achievements that do not fit into the four core categories (Open Source, Self Projects, Production, Technical Skills). These include:

  • Awards and honors recognized by industry organizations
  • Leadership roles in technical communities or previous positions
  • Community contributions such as mentoring, speaking engagements, or open-source maintenance
  • Exceptional evidence of impact that exceeds standard professional expectations

When the LLM identifies qualifying evidence, it populates the bonus_points field with a BonusPoints instance containing both the calculated total and a natural language rationale.

Integrating Bonus Points into the Final Score

Once the EvaluationData object is returned, the scoring logic in main/score.py (lines 58-60) incorporates the bonus into the aggregate score. The system verifies the presence of bonus data before addition to prevent attribute errors.


# Add bonus points

if hasattr(evaluation, "bonus_points") and evaluation.bonus_points:
    total_score += evaluation.bonus_points.total

This conditional check ensures backward compatibility and graceful handling of evaluations where the LLM might not generate bonus data. The bonus total is added directly to the cumulative score, meaning a candidate's final score equals their category scores plus up to 20 additional bonus points.

Reporting and Exporting Bonus Data

The bonus information persists through the reporting pipeline, appearing in both console output and CSV exports. In main/transform.py (lines 15-22), the system extracts bonus metrics for downstream analysis.

if evaluation and hasattr(evaluation, "bonus_points"):
    csv_row["bonus_points"] = evaluation.bonus_points.total
    csv_row["bonus_breakdown"] = evaluation.bonus_points.breakdown
else:
    csv_row["bonus_points"] = 0
    csv_row["bonus_breakdown"] = ""

This ensures that recruiters reviewing batch-processed résumés can see not just the numeric bonus value, but the specific reasoning behind it, facilitating transparent hiring decisions.

Summary

  • Bonus points in Hiring Agent are capped at 20 and defined by the BonusPoints Pydantic model in models.py, which validates that totals fall between 0 and 20.
  • The LLM automatically awards points based on evidence of awards, leadership, community contributions, or exceptional achievements detected in the résumé text.
  • Bonus totals are added to the final score in score.py, with defensive checks to handle missing bonus data.
  • Both the bonus value and breakdown text are exported to CSV via transform.py, ensuring transparency in AI-driven evaluations.

Frequently Asked Questions

What is the maximum number of bonus points in Hiring Agent?

The maximum bonus points is 20, enforced by the Pydantic model's Field(ge=0, le=20) constraint in models.py. This hard ceiling applies regardless of how many exceptional achievements the LLM detects in a candidate's background.

What types of achievements trigger bonus points?

The LLM awards bonus points for awards, leadership roles, community contributions, and other exceptional evidence that does not fit into the four core scoring categories (Open Source, Self Projects, Production, Technical Skills). The specific criteria depend on what the ResumeEvaluator identifies as noteworthy during the AI analysis phase.

How can I view the breakdown of why bonus points were awarded?

The breakdown is stored in the breakdown field of the BonusPoints model and exported to CSV via transform.py in the bonus_breakdown column. Console output also displays this rationale, allowing recruiters to understand exactly which achievements contributed to the bonus score.

Can I configure the bonus point maximum or criteria?

No, the 20-point maximum is hardcoded in the BonusPoints model's Field constraints (lines 31-34 in models.py). The criteria are determined by the LLM's interpretation of the résumé content rather than configurable rules, making the system flexible but capped at the schema level.

Have a question about this repo?

These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:

Share the following with your agent to get started:
curl -s "https://instagit.com/install.md"

Works with
Claude Codex Cursor VS Code OpenClaw Any MCP Client

Maintain an open-source project? Get it listed too →