| name | sprint-evaluator |
| description | Evaluate sprint implementations against design docs and acceptance criteria. Runs after sprint-executor to assess quality with concrete scoring rubric (100 points, 70 to pass). Provides actionable feedback loop on failure. Use when user says "evaluate sprint", "review implementation", "assess sprint quality", or automatically via coordinator after sprint execution. |
AILANG Sprint Evaluator
Independently evaluate a completed sprint implementation against its design doc, acceptance criteria, and quality standards. Based on the generator-evaluator architecture — separating the agent doing the work from the agent judging it.
Current State
- Branch: !'git branch --show-current'
- Active sprints: !'ls .ailang/state/sprints/ 2>/dev/null | head -5 || echo "none"'
- Existing evaluations: !'ls .ailang/state/evaluations/ 2>/dev/null | head -5 || echo "none"'
- Test status: !'make test 2>&1 | tail -1'
- Lint status: !'make lint 2>&1 | tail -1'
Use the data above first. Only re-run these commands manually if the injected context is empty or you need to refresh after making changes.
Quick Start
When to Use This Skill
Invoke this skill when:
- Sprint-executor completes and sends handoff message
- User says "evaluate sprint", "review implementation", "assess quality"
- Coordinator triggers via
trigger_on_complete chain
- User wants independent quality assessment before merge
Coordinator Integration
When invoked by the AILANG Coordinator, output these markers at the end of your response:
EVALUATION_RESULT: pass|fail
EVALUATION_SCORE: 85/100
EVALUATION_ROUND: 1
EVALUATION_REPORT_PATH: .ailang/state/evaluations/eval_<sprint-id>_round_<n>.json
FEEDBACK_SUMMARY: <one-line summary if failed>
Agent config:
- id: sprint-evaluator
label: "Sprint Evaluator"
inbox: sprint-evaluator
capabilities: [review, test, docs]
trigger_on_complete: []
session_continuity: false
approval:
needs_label: needs-evaluation-approval
approved_label: evaluation-approved
Core Principles
- Independent Judge — Never evaluate your own work. This skill judges sprint-executor output
- Concrete Criteria — Score against measurable rubric, not subjective impressions
- Skeptical by Default — Tuned toward skepticism; easier to calibrate than making generators self-critical
- Actionable Feedback — Failed evaluations include specific files, functions, and suggestions
- Hard Thresholds — Some failures (tests broken, <50% criteria met) cause automatic rejection
- Bounded Iteration — Max 3 evaluation rounds before escalating to human review
Evaluation Phases
Phase 1: Context Loading
- Read handoff message — Extract sprint_id, branch, sprint JSON path, design doc path
- Load sprint JSON from
.ailang/state/sprints/sprint_<id>.json
- Read design doc — The original spec (the "contract")
- Read sprint plan — The implementation roadmap with milestones
- Review git diff —
git diff dev...<branch> to see all changes
- Check evaluation round — Is this round 1, 2, or 3? Load prior report if round > 1
Phase 2: Automated Checks
Run automated quality checks using the evaluation script:
.claude/skills/sprint-evaluator/scripts/evaluate_sprint.sh <sprint-id> [branch]
This runs:
make test — All tests must pass (HARD FAIL if not)
make lint — Linting must be clean
make check-file-sizes — No files exceeding 800 lines
make test-coverage-badge — Coverage metrics
Phase 3: Acceptance Criteria Verification
.claude/skills/sprint-evaluator/scripts/check_acceptance_criteria.sh <sprint-id>
For each feature in sprint JSON:
- Read
acceptance_criteria array
- Verify
passes: true for each feature
- For file-related criteria, verify files exist
- For test-related criteria, verify test functions exist
- Score:
(criteria_met / total_criteria) * 30 points
HARD FAIL if fewer than 50% of acceptance criteria are met.
Phase 3.5: Sprint Artifacts Verification
If a sprint JSON exists (.ailang/state/sprints/sprint_<id>.json), verify:
- All milestones have
passes: true (or false with explanation)
- All milestones have
completed timestamps
- All milestones have
notes with summaries
- Sprint
status is "completed"
- Velocity metrics are populated
If a sprint plan markdown exists, verify:
- All milestones marked with ✅ (not pending or in-progress)
- No placeholder text remaining
Scoring: Deduct from Code Quality (Phase 4) — up to -5 for incomplete sprint artifacts.
Sprint artifacts are optional (pre-sprint-system implementations won't have them), so missing
artifacts are not penalized — only incomplete/inconsistent ones are.
Phase 4: Design Fidelity Check (AI Judgment)
Read the design doc and compare against the actual implementation:
- Does the implementation match the stated goals?
- Are the architectural decisions consistent with the design?
- Were any design requirements silently dropped?
- Are there unexpected deviations from the spec?
Score 0-10 based on fidelity to design intent.
Phase 5: Documentation Completeness
Check:
- CHANGELOG updated (5 pts) — New entries under appropriate version
- Example files created (5 pts) —
examples/runnable/<feature>.ail for new features
- Design doc status (5 pts) — Updated to reflect implementation state
Phase 6: Scoring & Report Generation
Apply scoring rubric (see resources/scoring_rubric.md):
| Category | Points | Hard Fail? |
|---|
| Tests Pass | 20 | Yes |
| Lint Clean | 10 | No |
| Acceptance Criteria | 30 | Yes if <50% |
| Code Quality | 15 | No |
| Documentation | 15 | No |
| Design Fidelity | 10 | No |
| Regression Surface Coverage (conditional) | +10 | Yes if triggered with no analysis |
| Performance Verification (conditional) | +10 | Yes if perf sprint with no profile |
| Total | 100 (+20 conditional) | Pass: 70+ |
Conditional categories:
- Regression Surface Coverage triggers when the sprint touches
internal/parser/, internal/lexer/, internal/ast/, internal/types/, internal/elaborate/, internal/iface/, internal/codegen/, internal/eval/, internal/vm/, internal/effects/, or cmd/ailang/exec.go. Hard fail if triggered without a Conflict Surface analysis in the design doc and fixture tests for the named "Programs that MUST still work". Catches M-TAINT-TYPES-style silent regressions.
- Performance Verification triggers on perf sprints (design doc keywords). Hard fail without before/after profiling data.
Generate report:
.claude/skills/sprint-evaluator/scripts/generate_report.sh <sprint-id> <score> <result> <round>
Report saved to .ailang/state/evaluations/eval_<sprint-id>_round_<n>.json
Phase 7: Pass/Fail Decision
Determine execution mode before acting:
- Local mode (running in an interactive chat session): invoke skills directly
- Cloud/coordinator mode (running via coordinator daemon): use inbox messages
On PASS (score >= 70, no hard fails):
- Move design doc from
design_docs/planned/ to design_docs/implemented/<version>/
- Update design doc status from "Planned" to "Implemented"
- Output markers with
EVALUATION_RESULT: pass
- Post congratulatory summary with score breakdown
On FAIL (score < 70 or hard fail, round < 3):
Local mode — invoke sprint-executor directly:
- Generate specific, actionable feedback (see resources/feedback_templates.md)
- Invoke the
sprint-executor skill with the evaluation report path and specific issues
- After executor completes, re-evaluate (increment round)
Cloud/coordinator mode — send inbox message:
- Generate specific, actionable feedback
- Send feedback to sprint-executor inbox:
ailang messages send sprint-executor '{
"type": "evaluation_feedback",
"correlation_id": "eval_<sprint-id>_round_<n>",
"sprint_id": "<sprint-id>",
"evaluation_round": <n>,
"score": <score>,
"issues": [
{"file": "path/to/file.go", "issue": "description", "suggestion": "how to fix"},
...
],
"max_rounds": 3
}' --title "Evaluation Failed (Round <n>/<max>)" --from "sprint-evaluator"
- Output markers with
EVALUATION_RESULT: fail
On FAIL (round >= 3):
- Escalate to human review
- Add
needs-human-review label via coordinator
- Post summary of all 3 rounds with score progression
Available Scripts
scripts/evaluate_sprint.sh <sprint_id> [branch]
Orchestrate automated quality checks. Outputs structured JSON with test/lint/coverage results.
scripts/check_acceptance_criteria.sh <sprint_id>
Verify each acceptance criterion from sprint JSON. Outputs per-criterion pass/fail as JSON.
scripts/generate_report.sh <sprint_id> <score> <result> <round>
Create evaluation report JSON at .ailang/state/evaluations/.
Resources
Receiving Handoff from sprint-executor
The evaluator receives an implementation_complete message:
{
"type": "implementation_complete",
"correlation_id": "eval_M-CACHE_20260326",
"sprint_id": "M-CACHE",
"branch_name": "coordinator/task-abc123",
"sprint_json_path": ".ailang/state/sprints/sprint_M-CACHE.json",
"design_doc_path": "design_docs/planned/v0_7/M-CACHE.md",
"files_created": ["internal/cache/store.go"],
"files_modified": ["internal/server/handler.go"],
"evaluation_round": 1
}
Execution Modes
The evaluator operates in two modes depending on where it's running:
Local Mode (interactive chat session)
When running in a user's local Claude Code session:
- On fail: Invoke the
sprint-executor skill directly to fix issues, then re-evaluate
- On pass: Move design doc to
implemented/, update status — no inbox needed
- Detection: Default mode. No coordinator markers in the prompt.
Cloud/Coordinator Mode
When invoked by the coordinator daemon or via agent inbox:
- On fail: Send structured feedback message to
sprint-executor inbox
- On pass: Output
EVALUATION_RESULT: pass markers for coordinator to act on
- Detection: Prompt contains coordinator task reference or
implementation_complete message
Feedback Loop Architecture
Local mode:
sprint-evaluator (Round 1)
↓
PASS? → move design doc to implemented/, done
FAIL? → invoke sprint-executor skill with issues
↓
sprint-evaluator (Round 2, same session)
↓
PASS? → move design doc, done
FAIL? → invoke sprint-executor (Round 3)
↓
PASS? → move design doc, done
FAIL? → escalate to user for manual review
Cloud/coordinator mode:
sprint-executor completes
↓
sprint-evaluator (Round 1)
↓
PASS? → merge approval
FAIL? → feedback message to sprint-executor
↓
sprint-executor fixes issues
↓
sprint-evaluator (Round 2)
↓
PASS? → merge approval
FAIL? → feedback message (Round 3)
↓
PASS? → merge approval
FAIL? → escalate to human (needs-human-review)
Notes
- Evaluation reports are preserved across rounds for audit trail
- Each round's report at
.ailang/state/evaluations/eval_<id>_round_<n>.json
- The evaluator does NOT modify the sprint JSON — it creates separate evaluation artifacts
- Hard fails (tests broken) cause immediate rejection regardless of score
- Score progression across rounds is tracked in reports for learning
- Evaluator is stateless per round — no session continuity needed