From 343bfcaafb748180104956c04c26111451d244d4 Mon Sep 17 00:00:00 2001 From: elhoim Date: Mon, 3 Aug 2026 07:19:38 +0000 Subject: [PATCH 1/4] fix(evals): list .yml suites, not just .yaml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit listSuites() reads Suites/{Capability,Regression}/, which includes the user's own suites. A suite saved as .yml was silently absent from every listing with no error to explain it. The writers in this skill all emit .yaml, so this only ever affected hand-authored files — which is exactly where the surprise lands. --- LifeOS/install/skills/Evals/Tools/SuiteManager.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LifeOS/install/skills/Evals/Tools/SuiteManager.ts b/LifeOS/install/skills/Evals/Tools/SuiteManager.ts index 96ebc2b866..a57d27e81b 100755 --- a/LifeOS/install/skills/Evals/Tools/SuiteManager.ts +++ b/LifeOS/install/skills/Evals/Tools/SuiteManager.ts @@ -91,7 +91,7 @@ export function listSuites(type?: EvalType): EvalSuite[] { if (!existsSync(dirPath)) continue; for (const file of readdirSync(dirPath)) { - if (file.endsWith('.yaml')) { + if (file.endsWith('.yaml') || file.endsWith('.yml')) { const suite = parseYaml(readFileSync(join(dirPath, file), 'utf-8')) as EvalSuite; suites.push(suite); } From 05d8658097125dc454205b84ddf8031474d48efa Mon Sep 17 00:00:00 2001 From: elhoim Date: Mon, 3 Aug 2026 07:19:38 +0000 Subject: [PATCH 2/4] fix(evals): resolve a suite saved as .yml MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit resolveSuite() searched USER_SUITES as well as the shipped directory, but only for .yaml. A user suite written as .yml returned null, which runSuite turns into a soft "Suite not found" result rather than a throw — so the run reported a missing suite for a file sitting right there. .yaml is still tried first, so precedence is unchanged where both exist. --- LifeOS/install/skills/Evals/Tools/EvalRunner.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/LifeOS/install/skills/Evals/Tools/EvalRunner.ts b/LifeOS/install/skills/Evals/Tools/EvalRunner.ts index 967edea5a1..99074d60e6 100644 --- a/LifeOS/install/skills/Evals/Tools/EvalRunner.ts +++ b/LifeOS/install/skills/Evals/Tools/EvalRunner.ts @@ -82,8 +82,11 @@ export function buildLiveSystemPrompt(): string { function resolveSuite(name: string): string | null { for (const dir of [USER_SUITES, SKILL_SUITES]) { - for (const p of [join(dir, `${name}.yaml`), join(dir, 'Regression', `${name}.yaml`), join(dir, 'Capability', `${name}.yaml`)]) { - if (existsSync(p)) return p; + // .yaml first, so an existing .yaml keeps winning if both somehow exist. + for (const ext of ['yaml', 'yml']) { + for (const p of [join(dir, `${name}.${ext}`), join(dir, 'Regression', `${name}.${ext}`), join(dir, 'Capability', `${name}.${ext}`)]) { + if (existsSync(p)) return p; + } } } return null; From 53fdad9f65e2df821795cdf5e7f8d961c10af045 Mon Sep 17 00:00:00 2001 From: elhoim Date: Mon, 3 Aug 2026 07:19:38 +0000 Subject: [PATCH 3/4] fix(tools): include .yml when scanning USER/SECURITY for docs The scan already accepted .yaml there. A policy file written as .yml dropped out of the doc check silently, which reads as "checked and clean" rather than "never looked at". --- LifeOS/install/LIFEOS/TOOLS/DocCheck.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LifeOS/install/LIFEOS/TOOLS/DocCheck.ts b/LifeOS/install/LIFEOS/TOOLS/DocCheck.ts index 74afe68182..dcc0f0196d 100644 --- a/LifeOS/install/LIFEOS/TOOLS/DocCheck.ts +++ b/LifeOS/install/LIFEOS/TOOLS/DocCheck.ts @@ -164,7 +164,7 @@ function findDocs(): string[] { const secDir = join(LIFEOS_DIR, 'USER', 'SECURITY'); try { for (const f of readdirSync(secDir)) { - if (f.endsWith('.md') || f.endsWith('.yaml')) docs.push(join(secDir, f)); + if (f.endsWith('.md') || f.endsWith('.yaml') || f.endsWith('.yml')) docs.push(join(secDir, f)); } } catch { /* */ } From 2fef2661b589a150db9c0470fbdce854a81ce59e Mon Sep 17 00:00:00 2001 From: elhoim Date: Mon, 3 Aug 2026 07:19:38 +0000 Subject: [PATCH 4/4] fix(pulse): count .yml files toward tab freshness The expanded specs include user-authored data directories (HEALTH/, FINANCES/, BUSINESS/, LOCAL/). A .yml file there was invisible to freshness, so a tab could report stale while the file the user had just edited was the newest thing in it. --- LifeOS/install/LIFEOS/PULSE/modules/tab-freshness.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LifeOS/install/LIFEOS/PULSE/modules/tab-freshness.ts b/LifeOS/install/LIFEOS/PULSE/modules/tab-freshness.ts index 0fc37f7725..7103511207 100644 --- a/LifeOS/install/LIFEOS/PULSE/modules/tab-freshness.ts +++ b/LifeOS/install/LIFEOS/PULSE/modules/tab-freshness.ts @@ -168,7 +168,7 @@ function resolveSpec(spec: SourceSpec): ResolvedSource[] { const out: ResolvedSource[] = [] let entries: string[] = [] try { - entries = readdirSync(spec.path).filter((e) => e.endsWith(".md") || e.endsWith(".json") || e.endsWith(".yaml")) + entries = readdirSync(spec.path).filter((e) => e.endsWith(".md") || e.endsWith(".json") || e.endsWith(".yaml") || e.endsWith(".yml")) } catch { // unreadable dir — record as missing return [{ name: spec.name, path: spec.path, exists: false, mtime: null }]