fix(evals): name the ARTIFACTS_DIR path + seed remediation when persona.vN.md is missing - #299
Conversation
…na.vN.md is missing
evolve.find_latest_persona and evolve_persona.find_latest_persona both
raise FileNotFoundError('No persona.vN.md artifacts found.') with no path
and no operator next-step. Operators running evolve against a fresh or
moved ARTIFACTS_DIR get a bare exception that doesn't tell them which
directory was checked or what to do.
Interpolate ARTIFACTS_DIR into the message and add the seed-persona /
ARTIFACTS_DIR-override remediation. Same exception type preserved; only
the message text changes.
TL;DR
What I noticedFirst-run evolve against a clean clone — exception said "No persona.vN.md artifacts found" and I had no idea whether the script looks in The fixInterpolate ReproductionSeverityLOW-MEDIUM. Operator-experience friction on first-run / fresh-clone / relocated-artifacts paths. No behavior change for the success case; only the failure message text is more actionable. |
…md found When find_latest_persona has no persona.vN.md to load, the bare 'No persona.vN.md artifacts found.' gave the operator nowhere to look. Name the ARTIFACTS_DIR it searched and tell them to seed persona.v1.md there (or override ARTIFACTS_DIR), in both evolve.py and evolve_persona.py. PR vibeforge1111#299 Co-authored-by: 4gjnbzb4zf-sudo@users.noreply.github.com Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
{
. Seed persona.v1.md in that directory before running evolve, or override the location via ARTIFACTS_DIR...'","schema": "spark-compete-hotfix-v1",
"event": "spark-compete-first-event",
"submission_mode": "public_repo_pr",
"submission_target_url": "#299",
"team": {
"name": "SparkThisUp",
"members": [
"ValHallaBuilder",
"Baz707",
"DanFireDash"
],
"github_accounts": [
"4gjnbzb4zf-sudo"
],
"llm_device_holder": "ValHallaBuilder",
"device_holder_github": "4gjnbzb4zf-sudo"
},
"target_repo": {
"id": "vibeforge1111/spark-character",
"source": "https://github.com/vibeforge1111/spark-character",
"owner_surface": "spark-character"
},
"issue": {
"type": "usage_friction",
"severity": "low",
"title": "evolve.find_latest_persona / evolve_persona.find_latest_persona raise bare FileNotFoundError without naming the directory or remediation",
"actual_behavior": "evals/evolve.py:80 and evals/evolve_persona.py:118 both raise FileNotFoundError('No persona.vN.md artifacts found.') when ARTIFACTS_DIR.glob('persona.v*.md') returns empty. The message omits the directory the function was looking in and offers no next step. Operators running evolve against a fresh clone, a test runner without artifacts seeded, or after relocating ARTIFACTS_DIR get a bare exception that does not even name the directory it checked.",
"expected_behavior": "The same FileNotFoundError fires under the same condition, but the message interpolates ARTIFACTS_DIR and names the two remediation surfaces (seed persona.v1.md in that directory, or override the location via ARTIFACTS_DIR env). Same exception type preserved; the success path (artifacts present) is unchanged.",
"repro_steps": [
"gh pr checkout ",
"Make sure ARTIFACTS_DIR is empty (no persona.vN.md files).",
"python3 evals/evolve.py -> BEFORE: 'No persona.vN.md artifacts found.' / AFTER: same exception type with '
"python3 evals/evolve_persona.py -> same change applied symmetrically."
],
"affected_workflow": "Operators on first run / fresh clone / test runner / relocated artifacts hit this. The new message tells them which directory was checked and the two surfaces (seed file or env override) that can resolve it without leaving the shell."
},
"evidence": {
"safe_links_only": true,
"before_after_proof": "Two-file change: evals/evolve.py + evals/evolve_persona.py. Same shape in both: the FileNotFoundError raise expanded from a bare string to an f-string that interpolates ARTIFACTS_DIR and names the two remediation surfaces. Pure-success path (artifacts present) unchanged. Exception type preserved (FileNotFoundError).",
"links": [
"https://github.com//pull/299"
],
"forbidden": [
"pdf",
"zip",
"exe",
"unknown downloads",
"shortened links",
"archives",
"binaries",
"tokens",
"browser cookies",
"wallet material",
"raw logs",
"raw conversations",
"raw memory",
"raw patches",
"private repo maps",
"private scoring details"
]
},
"proposed_fix": {
"approach": "Replace the bare FileNotFoundError message with an f-string interpolating ARTIFACTS_DIR + a one-line remediation: 'Seed persona.v1.md in that directory before running evolve_persona, or override the location via ARTIFACTS_DIR before launching.' Apply symmetrically to evolve.py (line 80) and evolve_persona.py (line 118).",
"files_expected": [
"evals/evolve.py",
"evals/evolve_persona.py"
],
"tests_or_smoke": "python3 -m py_compile evals/evolve.py evals/evolve_persona.py -> clean. Manual: run with empty ARTIFACTS_DIR; observe the new message names the directory + the two remediation surfaces."
},
"pr": {
"branch": "sentinel/ux-friction/evolve-missing-artifact-path",
"title_prefix": "[spark-compete]",
"author_github": "4gjnbzb4zf-sudo",
"body_must_include": [
"packet",
"team",
"pr_author",
"repo",
"actual_behavior",
"expected_behavior",
"repro_steps",
"before_after_proof",
"tests_or_smoke",
"duplicate_notes",
"risk_notes",
"review_claim"
],
"url": "#299"
},
"review_claim": {
"impact_claim": "low",
"evidence_types": [
"redacted_terminal_excerpt"
],
"duplicate_notes": "Pre-flight check returned no open PR touching find_latest_persona's FileNotFoundError raise in either evolve.py or evolve_persona.py. Other open PRs on these files (#230, #154, #130, #112) target different defects (timeout/regex/etc).",
"risk_notes": "Local scope: two message-text edits in two files. Same exception type preserved. Success path byte-identical. No new package, no behavior change on the success branch.",
"review_state_requested": "pr_review"
}
}