* docs(agents): add few-shot calibration examples for plan-checker and verifier Closes #1723 * test(agents): add structural tests for few-shot calibration examples Validates reference file existence, frontmatter metadata, example counts, WHY annotations on every example, agent @reference lines, and content structure (input/output pairs, calibration gap patterns table).
147 lines
7.6 KiB
JavaScript
147 lines
7.6 KiB
JavaScript
const { describe, test } = require('node:test');
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
const REFS_DIR = path.join(__dirname, '..', 'get-shit-done', 'references', 'few-shot-examples');
|
|
const AGENTS_DIR = path.join(__dirname, '..', 'agents');
|
|
|
|
// ── Helpers ────────────────────────────────────────────────────────
|
|
function readFile(filePath) {
|
|
return fs.readFileSync(filePath, 'utf-8');
|
|
}
|
|
|
|
function countPattern(content, pattern) {
|
|
const matches = content.match(pattern);
|
|
return matches ? matches.length : 0;
|
|
}
|
|
|
|
// ── File existence ─────────────────────────────────────────────────
|
|
describe('few-shot calibration examples', () => {
|
|
describe('reference files exist', () => {
|
|
test('plan-checker.md exists in references/few-shot-examples/', () => {
|
|
assert.ok(fs.existsSync(path.join(REFS_DIR, 'plan-checker.md')));
|
|
});
|
|
|
|
test('verifier.md exists in references/few-shot-examples/', () => {
|
|
assert.ok(fs.existsSync(path.join(REFS_DIR, 'verifier.md')));
|
|
});
|
|
});
|
|
|
|
// ── Version/format metadata ────────────────────────────────────
|
|
describe('frontmatter metadata', () => {
|
|
test('plan-checker.md has version and component in frontmatter', () => {
|
|
const content = readFile(path.join(REFS_DIR, 'plan-checker.md'));
|
|
assert.match(content, /^---\n/);
|
|
assert.match(content, /component:\s*plan-checker/);
|
|
assert.match(content, /version:\s*\d+/);
|
|
assert.match(content, /last_calibrated:\s*\d{4}-\d{2}-\d{2}/);
|
|
});
|
|
|
|
test('verifier.md has version and component in frontmatter', () => {
|
|
const content = readFile(path.join(REFS_DIR, 'verifier.md'));
|
|
assert.match(content, /^---\n/);
|
|
assert.match(content, /component:\s*verifier/);
|
|
assert.match(content, /version:\s*\d+/);
|
|
assert.match(content, /last_calibrated:\s*\d{4}-\d{2}-\d{2}/);
|
|
});
|
|
|
|
// Version difference is intentional: plan-checker was calibrated first (v1),
|
|
// verifier later with updated format (v2) including calibration_source field.
|
|
test('version metadata values are present and numeric', () => {
|
|
const pcContent = readFile(path.join(REFS_DIR, 'plan-checker.md'));
|
|
const vContent = readFile(path.join(REFS_DIR, 'verifier.md'));
|
|
const pcVersion = pcContent.match(/version:\s*(\d+)/);
|
|
const vVersion = vContent.match(/version:\s*(\d+)/);
|
|
assert.ok(pcVersion, 'plan-checker.md must have a numeric version');
|
|
assert.ok(vVersion, 'verifier.md must have a numeric version');
|
|
});
|
|
});
|
|
|
|
// ── Example counts ─────────────────────────────────────────────
|
|
describe('example counts', () => {
|
|
test('plan-checker.md contains exactly 4 examples (2 positive, 2 negative)', () => {
|
|
const content = readFile(path.join(REFS_DIR, 'plan-checker.md'));
|
|
const totalExamples = countPattern(content, /^### Example \d+/gm);
|
|
assert.strictEqual(totalExamples, 4);
|
|
|
|
// Verify section breakdown
|
|
const positiveSection = content.indexOf('## Positive Examples');
|
|
const negativeSection = content.indexOf('## Negative Examples');
|
|
assert.ok(positiveSection >= 0, 'must have Positive Examples section');
|
|
assert.ok(negativeSection >= 0, 'must have Negative Examples section');
|
|
assert.ok(positiveSection < negativeSection, 'positive examples come before negative');
|
|
});
|
|
|
|
test('verifier.md contains exactly 7 examples (5 positive, 2 negative)', () => {
|
|
const content = readFile(path.join(REFS_DIR, 'verifier.md'));
|
|
const totalExamples = countPattern(content, /^### Example \d+/gm);
|
|
assert.strictEqual(totalExamples, 7);
|
|
|
|
const positiveSection = content.indexOf('## Positive Examples');
|
|
const negativeSection = content.indexOf('## Negative Examples');
|
|
assert.ok(positiveSection >= 0, 'must have Positive Examples section');
|
|
assert.ok(negativeSection >= 0, 'must have Negative Examples section');
|
|
assert.ok(positiveSection < negativeSection, 'positive examples come before negative');
|
|
});
|
|
});
|
|
|
|
// ── WHY annotations ────────────────────────────────────────────
|
|
describe('WHY annotations', () => {
|
|
test('every plan-checker example has a WHY annotation', () => {
|
|
const content = readFile(path.join(REFS_DIR, 'plan-checker.md'));
|
|
const exampleCount = countPattern(content, /^### Example \d+/gm);
|
|
const whyCount = countPattern(content, /^\*\*Why this is (good|bad):\*\*/gm);
|
|
assert.strictEqual(whyCount, exampleCount,
|
|
`expected ${exampleCount} WHY annotations, found ${whyCount}`);
|
|
});
|
|
|
|
test('every verifier example has a WHY annotation', () => {
|
|
const content = readFile(path.join(REFS_DIR, 'verifier.md'));
|
|
const exampleCount = countPattern(content, /^### Example \d+/gm);
|
|
const whyCount = countPattern(content, /^\*\*Why this is (good|bad):\*\*/gm);
|
|
assert.strictEqual(whyCount, exampleCount,
|
|
`expected ${exampleCount} WHY annotations, found ${whyCount}`);
|
|
});
|
|
});
|
|
|
|
// ── Agent reference lines ──────────────────────────────────────
|
|
describe('agent files reference few-shot examples', () => {
|
|
test('gsd-plan-checker.md contains reference to plan-checker few-shot examples', () => {
|
|
const content = readFile(path.join(AGENTS_DIR, 'gsd-plan-checker.md'));
|
|
assert.match(content, /@~\/\.claude\/get-shit-done\/references\/few-shot-examples\/plan-checker\.md/);
|
|
});
|
|
|
|
test('gsd-verifier.md contains reference to verifier few-shot examples', () => {
|
|
const content = readFile(path.join(AGENTS_DIR, 'gsd-verifier.md'));
|
|
assert.match(content, /@~\/\.claude\/get-shit-done\/references\/few-shot-examples\/verifier\.md/);
|
|
});
|
|
});
|
|
|
|
// ── Content structure ──────────────────────────────────────────
|
|
describe('content structure', () => {
|
|
test('plan-checker examples include input/output pairs', () => {
|
|
const content = readFile(path.join(REFS_DIR, 'plan-checker.md'));
|
|
const inputCount = countPattern(content, /^\*\*Input:\*\*/gm);
|
|
const outputCount = countPattern(content, /^\*\*Output:\*\*/gm);
|
|
assert.ok(inputCount >= 4, `expected at least 4 Input blocks, found ${inputCount}`);
|
|
assert.ok(outputCount >= 4, `expected at least 4 Output blocks, found ${outputCount}`);
|
|
});
|
|
|
|
test('verifier examples include input/output pairs', () => {
|
|
const content = readFile(path.join(REFS_DIR, 'verifier.md'));
|
|
const inputCount = countPattern(content, /^\*\*Input:\*\*/gm);
|
|
const outputCount = countPattern(content, /^\*\*Output:\*\*/gm);
|
|
assert.ok(inputCount >= 7, `expected at least 7 Input blocks, found ${inputCount}`);
|
|
assert.ok(outputCount >= 7, `expected at least 7 Output blocks, found ${outputCount}`);
|
|
});
|
|
|
|
test('verifier.md includes calibration-derived gap patterns table', () => {
|
|
const content = readFile(path.join(REFS_DIR, 'verifier.md'));
|
|
assert.match(content, /## Calibration-Derived Gap Patterns/);
|
|
assert.match(content, /Missing wiring/);
|
|
assert.match(content, /Missing tests/);
|
|
});
|
|
});
|
|
});
|