Skip to content

evals supports multiple skill sets (path | paths) - #779

Merged
don-petry merged 2 commits into
mainfrom
feat/evals-multiskill
Jul 18, 2026
Merged

evals supports multiple skill sets (path | paths)#779
don-petry merged 2 commits into
mainfrom
feat/evals-multiskill

Conversation

@don-petry

@don-petry don-petry commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Resolves #755 finding 6.

evals.path was a single string, but a persona wrapping several skills has several eval sets — pr-review's held-out sets live at evals/deep-review/ and evals/triage/, which the single-path shape can't express. This blocks pr-review's onboarding (#1282) and business-analyst's (#1283, brainstorm+research+brief).

Change: evals now requires exactly one of path (one set — qa-lead keeps it, unchanged) or paths (array, one per wrapped skill). A oneOf enforces mutual exclusivity.

Verified: path-only PASS, paths-only PASS, both FAIL, neither FAIL. Backward-compatible — qa-lead's path is untouched, so no cross-repo ordering.

Also pinned the min_cases contract: per-set, enforced by validate-personas.py once status reaches required_before — the count half of principle 5, made real in the companion .github-private validator PR.

Valid Draft 2020-12; additive diff.

🤖 Generated with Claude Code

Summary by CodeRabbit

  • Documentation
    • Updated persona evaluation requirements to support either a single evaluation set or multiple evaluation sets.
    • Clarified validation rules, including minimum held-out cases and release-ring requirements.
    • Improved descriptions for evaluation paths and required fields.

Resolves #755 finding 6. `evals.path` was a single string, but a persona that
wraps several skills has several eval sets — pr-review's held-out sets live at
evals/deep-review/ and evals/triage/, and the single-path shape cannot express
that, blocking its onboarding.

Change: `evals` now requires EXACTLY ONE of `path` (one set, unchanged — qa-lead
keeps it) or `paths` (an array, one per wrapped skill). A oneOf enforces
mutual exclusivity; verified path-only PASSES, paths-only PASSES, both FAILS,
neither FAILS. Backward-compatible: qa-lead's `path: evals/qa-lead/` is
untouched, so no cross-repo ordering is needed.

Also tightened the min_cases contract: it is per-set (each listed set must
independently clear it) and is now described as enforced by validate-personas.py
once status reaches required_before — the count half of principle 5, which the
companion validator PR in .github-private makes real.

Verification
- valid Draft 2020-12 schema; diff is additive (no reformat).
- oneOf behaviour verified against all four combinations.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@don-petry
don-petry requested a review from a team as a code owner July 18, 2026 16:48
Copilot AI review requested due to automatic review settings July 18, 2026 16:48
@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.

@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@don-petry, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 48 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 20bc0131-949a-4dfa-8e85-275e97f5d1dd

📥 Commits

Reviewing files that changed from the base of the PR and between f4b0cb6 and c46f00d.

📒 Files selected for processing (1)
  • standards/personas/persona.schema.json
📝 Walkthrough

Walkthrough

The persona schema updates the evals contract to support either one eval set or multiple eval sets, while requiring required_before and min_cases and documenting validation by validate-personas.py.

Changes

Persona evaluation validation

Layer / File(s) Summary
Single-or-multiple eval set schema
standards/personas/persona.schema.json
The evals block now requires required_before and min_cases, and enforces exactly one of path or paths; multi-set entries specify independent minimum-case requirements.

Estimated code review effort: 2 (Simple) | ~10 minutes

Possibly related PRs

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the new path/paths support in persona evals.
Linked Issues check ✅ Passed The schema now supports single or multiple eval paths and preserves min_cases, matching #755's stated objective.
Out of Scope Changes check ✅ Passed The changes are confined to the persona eval schema and align with the stated objective.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/evals-multiskill

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request updates the persona JSON schema to support either a single evaluation path (path) or multiple evaluation paths (paths) using a oneOf validation constraint. The review feedback suggests two improvements to the schema: adding "uniqueItems": true to the paths array to prevent duplicate entries, and simplifying the oneOf definition by removing redundant not constraints to improve clarity and error messaging.

Comment thread standards/personas/persona.schema.json
Comment thread standards/personas/persona.schema.json

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Updates the persona manifest JSON Schema to support personas that reference either a single eval set or multiple eval sets, enabling multi-skill personas to model distinct held-out eval directories while keeping existing single-path personas compatible.

Changes:

  • Makes evals require required_before and min_cases, and requires exactly one of evals.path or evals.paths.
  • Adds evals.paths (array) with minItems: 1 and updates schema descriptions to clarify per-set min_cases expectations.

Comment thread standards/personas/persona.schema.json

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@standards/personas/persona.schema.json`:
- Around line 256-259: The oneOf constraints redundantly exclude the alternate
property with explicit not clauses. Simplify the oneOf block in the persona
schema to require path in one branch and paths in the other, relying on oneOf to
reject configurations containing both while preserving the existing
exactly-one-of behavior.
- Around line 267-272: Update the paths array schema to enforce unique entries
by adding the uniqueItems constraint alongside minItems and items. Keep the
existing path descriptions and validation behavior unchanged.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 72d7fcd4-f3bf-4272-bf41-55136aee36ff

📥 Commits

Reviewing files that changed from the base of the PR and between c3cebd3 and f4b0cb6.

📒 Files selected for processing (1)
  • standards/personas/persona.schema.json

Comment thread standards/personas/persona.schema.json
Comment thread standards/personas/persona.schema.json
@don-petry

Copy link
Copy Markdown
Contributor Author

@coderabbitai resolve

@don-petry

Copy link
Copy Markdown
Contributor Author

Dev-Lead — waiting on PR blockers (intent: review-changes)

PR: #779
No changes were committed, but the PR still has blocking checks or reviews (failing or cancelled checks, or changes-requested reviews). The retry cron will re-attempt automatically. Next attempt after: 2026-07-18T17:21:59Z

@don-petry

Copy link
Copy Markdown
Contributor Author

Note

@don-petry I reviewed this PR and no code changes were needed, but it still has blocking checks or reviews (failing or cancelled checks, or changes-requested reviews), so I cannot mark it done yet. I'll re-check automatically.
Next attempt after: 2026-07-18T17:21:59Z

@don-petry
don-petry enabled auto-merge (squash) July 18, 2026 16:52
coderabbitai[bot]
coderabbitai Bot previously approved these changes Jul 18, 2026
@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown
✅ Action performed

Comments resolved and changes approved.

@donpetry-bot

Copy link
Copy Markdown
Contributor

CI checks on this PR are still running. Once they complete, re-mention @donpetry-bot to trigger a fresh review.

Posted by the donpetry-bot PR-review cascade.

@don-petry

Copy link
Copy Markdown
Contributor Author

Dev-Lead — fix-reviews (applied)

Changes committed and pushed.

@sonarqubecloud

Copy link
Copy Markdown

@don-petry

Copy link
Copy Markdown
Contributor Author

Dev-Lead — review-changes (no-changes)

No changes were needed for this PR.

@don-petry
don-petry enabled auto-merge (squash) July 18, 2026 17:02

@donpetry-bot donpetry-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review — APPROVED ✓

Risk: MEDIUM
Reviewed commit: c46f00d287efb6c352b834175453935dc9562949
Review mode: triage-approved (single reviewer)

Summary

Single-file JSON Schema change to standards/personas/persona.schema.json (+16/−5): the evals gate now requires exactly one of path (single eval set) or paths (array, one per wrapped skill) via a oneOf, unblocking multi-skill persona onboarding (pr-review, business-analyst). Backward compatible — existing path-only manifests (qa-lead) validate unchanged.

Linked issue analysis

Linked issue #755, finding 6 ("evals.path is a single path, but the eval tree is skill-keyed — blocks pr-review onboarding. Schema gap.") is substantively and precisely addressed: paths lets a persona reference several skill-keyed eval sets (e.g. evals/deep-review/ + evals/triage/), and min_cases is documented as per-set. The issue covers 8+ findings; this PR correctly scopes to finding 6 only.

Findings

No blocking findings.

  • Verified independently: fetched the schema at c46f00d287efb6c352b834175453935dc9562949 and ran the validation matrix with jsonschema Draft 2020-12 — path-only PASS, paths-only PASS, both FAIL, neither FAIL, empty paths FAIL, duplicate paths FAIL. Matches the PR description's claims exactly.
  • Prior bot feedback resolved: CodeRabbit's two actionable comments (add uniqueItems: true; drop redundant not clauses inside oneOf) are both applied in the current head; Gemini and Copilot raised the same points. All 5 review threads are resolved and CodeRabbit's changes-requested review was dismissed after resolution.
  • Secret scan: run_secret_scanning MCP tool not available in this environment; gitleaks CI check passed, and the diff is schema JSON with no secret-like content.
  • Risk rationale (MEDIUM): schema contract change affecting org-wide persona validation — non-trivial logic, but additive, mutually-exclusive by construction, and backward compatible. No auth/CI/security surface touched.
  • Note: min_cases per-set enforcement is delegated to validate-personas.py in a companion .github-private PR — the schema-side description is accurate about that division of labor.

CI status

All checks green at c46f00d287efb6c352b834175453935dc9562949: Lint, ShellCheck, CodeQL (actions), SonarCloud quality gate, Agent Security Scan, agent-shield, Secret scan (gitleaks), npm audit — all SUCCESS. Ecosystem-specific audits (pip/cargo/govulncheck/pnpm) skipped (not applicable). No failing or pending checks.


Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.

@don-petry
don-petry merged commit 3ba1539 into main Jul 18, 2026
22 checks passed
@don-petry
don-petry deleted the feat/evals-multiskill branch July 18, 2026 17:04

@donpetry-bot donpetry-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review — APPROVED ✓

Risk: MEDIUM
Reviewed commit: c46f00d287efb6c352b834175453935dc9562949
Review mode: triage-approved (single reviewer)

Summary

Single-file additive change to standards/personas/persona.schema.json: evals now accepts exactly one of path (single eval set) or paths (array, one per wrapped skill), enforced via oneOf. required_before/min_cases semantics clarified (per-set enforcement by validate-personas.py). Backward compatible — existing single-path personas (qa-lead) are unaffected.

Linked issue analysis

Resolves finding 6 of #755 ("evals.path is a single path, but the eval tree is skill-keyed — blocks pr-review onboarding"). The paths array directly closes that gap by letting multi-skill personas reference their existing skill-keyed eval sets (e.g. evals/deep-review/ + evals/triage/). Substantively addressed.

Findings

  • Schema at head SHA is valid JSON; oneOf correctly enforces mutual exclusivity of path/paths (both-present fails, neither fails).
  • Bot reviewer suggestions were incorporated: paths has uniqueItems: true and minItems: 1; redundant not-clauses were removed in favor of plain oneOf.
  • All 5 review threads (gemini, copilot, coderabbit) are resolved; CodeRabbit's changes-requested review was dismissed after fixes.
  • Triage assessment confirmed: additive, docs+validation-shape change with no executable code, no auth/secrets/CI-workflow surface.
  • MCP secret-scanning tool unavailable in this run; gitleaks CI check passed (no secret-bearing content in the diff).

CI status

All required checks green: Lint, ShellCheck, CodeQL, Agent Security Scan, gitleaks secret scan, SonarCloud quality gate, agent-shield, npm audit. Ecosystem-specific audits (pip/cargo/go/pnpm) skipped as not applicable.


Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.

don-petry added a commit to petry-projects/.github-private that referenced this pull request Jul 18, 2026
* feat(personas): onboard dev-lead, pr-review, business-analyst as personas

Formalizes the three existing agents under the persona standard and makes each
addressable as @petry-projects/<role> (org team handles — teams created:
dev-lead, pr-review, business-analyst; all closed, notifications disabled, 0
members). Closes the manifest half of #1281 / #1282 / #1283.

Each persona (all status: draft):
- personas/<id>/persona.yml — a compliant manifest documenting the REAL runtime:
  definition layers point at what exists (dev-lead → prompts/dev-lead/;
  pr-review → agents/pr-reviewer.md + prompts/; business-analyst → vendored
  bmad-method analyst v6.8.0 + prompts/incubation/). Triggers reflect reality,
  advisory by default, every write surface carries its gate_label (§4 rule 2).
- prompts/<id>/advisory.md — a role-focused advisory the shared persona runner
  serves on @-mention (read-only, prints between sentinels, marker-first — the
  qa-lead contract). dev-lead advises on implementation/scoping (code is still
  written only by its label-triggered runtime, not this path); pr-review gives
  review guidance (the full tiered review runs on its existing path);
  business-analyst advises on framing/research/next-analysis-step.
- README.md + seed held-out evals (draft-exempt from the count gate; expand
  before promotion). pr-review points evals.paths at its EXISTING skill sets
  (evals/deep-review/, evals/triage/) — the multi-skill case #779 unblocks.

Decisions taken (from the onboarding issues):
- @-addressability for all three (the initiative's goal). pr-review's legacy
  @donpetry-bot path is retained (real account, works); this adds the role handle.
- business-analyst is the Analyst role (brainstorm/market-research/brief) ONLY;
  the PRD stays with a separate product-manager persona — the documented
  Analyst→PM handoff is preserved, not collapsed.
- pr-review's canary-rings registration (#710) stays a separate follow-up; draft
  personas don't require it.

Deliberately NOT here (tracked, per-issue): real (non-seed) eval sets; the
product-manager persona; pr-review canary registration; and — for the mention
paths to go live — enrolling these into the router soak (the framework is live
only in the next ring today).

MERGE ORDER: after petry-projects/.github#779 (schema: evals.paths) and #1302
(validator: reads paths + count gate). pr-review's manifest uses `paths`, which
main's validator cannot parse until #1302 lands.

Verification
- validate-personas.py (with #779 schema + #1302 validator): 4/4 valid,
  invariants hold.
- validate-cases.py: OK, 7 skills / 54 cases, no cross-split id overlap.
- markdownlint: clean.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore: dev-lead update (review-changes) [skip ci-relay]

* chore: dev-lead update (review-changes) [skip ci-relay]

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>

@donpetry-bot donpetry-bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Automated review — APPROVED ✓

Risk: LOW
Reviewed commit: c46f00d287efb6c352b834175453935dc9562949
Review mode: triage-approved (single reviewer)

Summary

Confirms the triage assessment: a small, additive JSON Schema change to standards/personas/persona.schema.json. The evals gate now accepts exactly one of path (single eval set) or paths (array, one per wrapped skill), enforced by a oneOf; min_cases is pinned as a per-set requirement. Backward-compatible — existing path-only manifests (qa-lead) remain valid.

Linked issue analysis

Resolves #755 finding 6 ("evals.path is a single path, but the eval tree is skill-keyed"). The new paths array lets a persona wrapping multiple skills (e.g. pr-review's deep-review + triage sets) declare all its eval sets, unblocking pr-review and business-analyst onboarding. Substantively addressed.

Findings

No blocking findings.

  • Schema at head SHA is valid JSON (verified by parsing). oneOf semantics checked: path-only passes, paths-only passes, both fails, neither fails — matching the PR's stated verification.
  • paths has minItems: 1 and uniqueItems: true (addressing an earlier CodeRabbit suggestion); redundant not clauses flagged by Gemini were removed.
  • All 5 review threads resolved; CodeRabbit's CHANGES_REQUESTED was dismissed after resolution and superseded.
  • Secret scan MCP tool not available in this environment; gitleaks CI check passed (noted, non-blocking).

CI status

All checks green: Lint, ShellCheck, CodeQL, SonarCloud (quality gate passed, 0 new issues), AgentShield, Agent Security Scan, gitleaks secret scan, npm audit — all SUCCESS. Ecosystem-specific audits (pip/cargo/go/pnpm) skipped as not applicable.


Reviewed automatically by the PR-review agent (single-reviewer mode: fable 5). Reply if you need a human review.

don-petry added a commit to petry-projects/.github-private that referenced this pull request Jul 18, 2026
* feat(personas): enforce the eval count gate; read evals.path OR evals.paths

Companion to petry-projects/.github#779. Two things, both #755:

1. Read the new evals shape. `evals` now carries `path` (one set) OR `paths`
   (several, for a persona that wraps multiple skills — pr-review's deep-review
   + triage). check_evals handles both and requires dev/ + holdout/ splits in
   every set. Backward-compatible: qa-lead's single `path` still validates
   against both the live main schema and the #779 branch schema.

2. Make principle 5 partially real (finding 5). "No persona reaches stable
   without an eval gate" was documented but unenforced. Now: once a persona's
   status reaches its `evals.required_before` ring, each held-out set MUST carry
   >= `min_cases` real cases (blank lines ignored). A draft is exempt — draft is
   exactly when seed cases are placeholders. So a persona can no longer be
   promoted past required_before on the 5 synthetic starters.

   The SCORED gate (running the cases against a judge and requiring a pass rate)
   needs an eval harness and is deliberately NOT here — it is a separate
   follow-up. What is hermetically checkable (the held-out COUNT at promotion)
   is enforced now; what needs a runtime is tracked, not faked.

Verification
- bats tests/test_validate_personas.bats: 22/22 (16 + 6 new: paths all-splits,
  paths one-split-missing, draft-not-enforced, stable-enforced-fails,
  enough-cases-passes, blank-lines-ignored).
- validate-personas.py against BOTH the live main schema and the #779 branch
  schema: OK (qa-lead is draft, so the count gate does not bite).

Merge after #779 (the validator fetches the schema from .github main; until #779
lands, `evals.paths` is not yet permitted there — but qa-lead uses `path`, so
main stays green either way).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* fix(reviews): address review comments [skip ci-relay]

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: donpetry-bot <281750570+donpetry-bot@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Persona framework — pre-rollout review findings

3 participants