fix(evals): read the LIFEOS results dir SuiteManager's runner writes - #2129
Open
pai-scaffolde wants to merge 1 commit into
Open
pai-scaffolde wants to merge 1 commit into
pai-scaffolde wants to merge 1 commit into
Conversation
SuiteManager builds RESULTS_DIR with a lowercase-i `LifeOS` path segment, while EvalRunner.ts writes every run under `LIFEOS/MEMORY/STATE/Evals-Results`. On a case-insensitive volume the two spell the same directory, so the bug is invisible on a default macOS install. On a case-sensitive volume (Linux, or a case-sensitive APFS volume) SuiteManager points at a directory that never exists: check-saturation finds no history and reports an empty trend for every suite, and ensureDirs() silently creates the wrong tree. ScenarioRunner.ts:111 already spells it `LIFEOS` with a comment about this exact class; SuiteManager was the one file left behind. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Reproduced on a fresh LifeOS 7.40.4 install (macOS, Claude Code in the Claude desktop app); the fix was applied to that install and run there before filing.
Observed
On a case-sensitive volume,
SuiteManager.ts check-saturation <suite>finds no run history for any suite, however many runsEvalRunner.tshas written. The trend is empty andensureDirs()quietly creates a second, wrong results tree. On a default macOS install nothing looks wrong, which is why this survived.Root cause
Two spellings of the same directory:
The runner writes
LIFEOS; SuiteManager readsLifeOS.path.joindoes not normalize case, so on a case-insensitive volume the two resolve to one directory and on a case-sensitive one they are different paths, the second of which never exists. Every SuiteManager reader ofRESULTS_DIRis affected —ensureDirs()(line 27) andcheckSaturation()'ssuiteResultsDir(line 134).ScenarioRunner.ts:111already carries the corrected spelling with a comment naming this class:SuiteManager was the one file in
skills/Evalsleft behind; it is the only remaining'LifeOS'path segment there.Fix
One string:
'LifeOS'becomes'LIFEOS', plus a two-line comment recording why the case matters. No other change. The file's pre-existing unused imports (Task,basename) are left alone.How tested
Transpiles:
bun build --target=bun --no-bundle skills/Evals/Tools/SuiteManager.tsexits 0.On a case-insensitive macOS volume both spellings resolve to the same directory, which is exactly why the defect is invisible there:
That equality holds only because the volume is case-insensitive. On a case-sensitive APFS image it does not. Probe: a disk image built with
hdiutil create -size 20m -fs "Case-sensitive APFS" -volname CaseProbeY, holding the real layout (skills/Evals/Tools/, and one run atLIFEOS/MEMORY/STATE/Evals-Results/demo-suite/run_001/run.json), runningcheckSaturation()'s own lookup for both spellings:The old spelling loses the history; the new spelling finds it.
On the live install after the change,
bun skills/Evals/Tools/SuiteManager.ts check-saturation core-dispositionsreads the runner's real history:Saturated: No · Consecutive above threshold: 0/3 · Recommendation: keep.Repro on a clean tree
Check out
mainon a case-sensitive filesystem, run any suite throughEvalRunner.ts, thenSuiteManager.ts check-saturation <suite>: it reports no history. With this patch applied it reports the run. On a case-insensitive volume the two spellings are indistinguishable and the repro requires the disk image above.🤖 Generated with Claude Code