// Verifies SKILL.md stays aligned with the Constitution-mapping JSON // produced during the v1.1.0 research phase, AND with the Appendix-driven // v1.2.0 sycophancy 5-scale + 11 guidance criteria additions. // // The constitution-mapping.json file is generated locally during research // and gitignored. On a fresh clone, fall back to checking the verbatim // CC0 Constitution citation that should be present regardless. import { test } from 'node:test'; import assert from 'node:assert/strict'; import { readFileSync, existsSync } from 'node:fs'; test('SKILL.md contains Constitution citation', () => { const skill = readFileSync('skills/ai-psychosis/SKILL.md', 'utf8'); const mappingPath = '.claude/projects/2026-05-01-ai-psychosis-anthropic-guidance/constitution-mapping.json'; if (existsSync(mappingPath)) { const mapping = JSON.parse(readFileSync(mappingPath, 'utf8')); if (mapping.skill_md_grep_target === 'FALLBACK_PARAPHRASE') { assert.ok(skill.includes('anthropic.com/research/claude-personal-guidance')); } else { assert.ok( skill.includes(mapping.skill_md_grep_target), `SKILL.md missing locked Constitution target: ${mapping.skill_md_grep_target}` ); } } else { // Fresh clone — assertion fallback uses the verbatim CC0 Constitution // text known to be present in v1.1.0+. assert.ok(skill.includes("Sometimes being honest requires courage"), 'SKILL.md missing CC0 Constitution courage citation'); } assert.ok(skill.includes('anthropic.com/constitution')); assert.ok(skill.includes('anthropic.com/research/claude-personal-guidance')); }); test('SKILL.md cites Score 5 sycophancy phrase verbatim (v1.2)', () => { const skill = readFileSync('skills/ai-psychosis/SKILL.md', 'utf8'); assert.ok( skill.includes('Provides accurate, honest information regardless'), 'SKILL.md missing verbatim Score 5 phrasing' ); assert.ok( skill.includes('Maintains correct positions when challenged'), 'SKILL.md missing Score 5 challenge phrase' ); assert.ok( skill.includes("Delivers difficult truths constructively"), 'SKILL.md missing Score 5 difficult-truths phrase' ); }); test('SKILL.md cites the 11 guidance criteria (v1.2 — at least 3 quoted)', () => { const skill = readFileSync('skills/ai-psychosis/SKILL.md', 'utf8'); // Three load-bearing quotes from the 11 criteria (page 2 of Appendix). assert.ok( skill.includes("Avoid providing guidance that would foster continued engagement"), 'SKILL.md missing engagement-foster criterion' ); assert.ok( skill.includes("Be wary of giving excessively confident verdicts"), 'SKILL.md missing confident-verdicts criterion' ); assert.ok( skill.includes("Maintain integrity and be willing to speak frankly"), 'SKILL.md missing frank-pushback criterion' ); });