diff --git a/deslop-shared-libs/SKILL.md.tmpl b/deslop-shared-libs/SKILL.md.tmpl index 29cf64c5d..b87f791da 100644 --- a/deslop-shared-libs/SKILL.md.tmpl +++ b/deslop-shared-libs/SKILL.md.tmpl @@ -171,7 +171,9 @@ Keep explanations short and plain spoken. Report: do not hide test or integration costs in a single optimistic number. 3. Up to three ranked recommendations. Link both verified callers, describe the smallest helper and destination, sketch migration and compatibility tests, - explain why it is useful now, and name the main risk or uncertainty. Briefly + explain why it is useful now, and name the main risk or uncertainty: a concrete + behavior that could differ after migration, or the shared-failure blast radius, + never "none". Briefly explain why the other candidates rank lower and how recency affected the choice. Separately identify work covered by existing PRs. If no worthwhile opportunity survives validation, say so and state the evidence limits. diff --git a/test/shared-libs-rendering.test.ts b/test/shared-libs-rendering.test.ts index b2c80d95f..8373470aa 100644 --- a/test/shared-libs-rendering.test.ts +++ b/test/shared-libs-rendering.test.ts @@ -157,6 +157,15 @@ describe('shared-code skill distribution', () => { } }); + test('every rendered recommendation names a concrete risk, never "none"', () => { + // C3: shared-libs-opportunity-judgment reds 37193478719 t3 and 37195203538 t1 wrote + // "Main risk: none found inside the repo" / "none in behavior" for the top recommendation. + for (const host of ALL_HOST_CONFIGS) { + const text = rendered(host, 'deslop-shared-libs').replace(/\s+/g, ' '); + expect(text, host.name).toContain('name the main risk or uncertainty: a concrete behavior that could differ after migration, or the shared-failure blast radius, never "none".'); + } + }); + test('standalone catalog entry adds exactly the approved 82 bytes', () => { const skill = readFileSync(join(output, 'deslop-shared-libs/SKILL.md'), 'utf8'); const description = skill.match(/^description: (.+)$/m)?.[1];