fix: clarify retro workflow and evaluate compare instructions

Include compare mode in the frontier judge excerpt, define metric sources and snapshot ordering, and preserve the existing prompt-size budget.

Co-authored-by: OpenAI Codex <noreply@openai.com>
This commit is contained in:
Garry Tan
2026-09-09 05:08:30 +00:00
co-authored by OpenAI Codex
parent eb4fd65ed3
commit 2e624adf20
9 changed files with 182 additions and 176 deletions
+1 -1
View File
@@ -177,7 +177,7 @@ describe('gstack-retro-metrics contract', () => {
expect(tmpl).toContain('".claude/skills/gstack/bin/gstack-retro-metrics"');
expect(tmpl).toContain('--base "<default>" --since "<since>"');
expect(tmpl).toContain(
'RETRO_METRICS: unavailable — stale install (compute metrics manually from the steps below)',
'RETRO_METRICS: unavailable — stale install (read the helper source for manual computation)',
);
// Degraded-mode prose keys off the proto handshake.
expect(tmpl).toContain('RETRO_METRICS_PROTO: 1');
+1 -1
View File
@@ -785,7 +785,7 @@ describeIfSelected('Other skill evals', [
suite: 'Other skill evals',
skillPath: 'retro/SKILL.md',
startMarker: '## Instructions',
endMarker: '## Compare Mode',
endMarker: '## Tone',
judgeContext: 'an engineering retrospective data gathering and analysis workflow',
judgeGoal: 'how to gather git metrics (commit history, test counts, work patterns), analyze them, produce a structured retro report with praise, growth areas, and trend tracking',
});
+3 -1
View File
@@ -1404,7 +1404,9 @@ describe('Retro test health tracking', () => {
test('retro/SKILL.md has Test Health metrics row', () => {
const content = readSkillUnion('retro');
expect(content).toContain('Test Health');
expect(content).toContain('regression tests');
expect(content).toContain('N test files');
expect(content).toContain('M changed this period');
expect(content).toContain('K regression test commits');
});
test('retro/SKILL.md has Test Health narrative section', () => {
+19
View File
@@ -83,6 +83,25 @@ describe('workflow judge excerpts', () => {
expect(() => readWorkflowExcerpt('ship/SKILL.md', '# Ship:', '# missing')).toThrow('End marker not found');
});
test('retro judge includes compare semantics and unambiguous report inputs', () => {
const text = readWorkflowExcerpt('retro/SKILL.md', '## Instructions', '## Tone');
expect(text).toContain('## Compare Mode');
expect(text).toContain('does not require saved history');
expect(text).toContain('one second before the current start');
expect(text).toContain('PRs referenced');
expect(text).toContain('prs_merged: null');
expect(text).toContain('not newly added test cases');
expect(text).toContain('`streak_days` is the live **team** streak');
expect(text).toContain('draft the tweetable summary using the format in Step 14, then save');
expect(text).toContain('### Shipping Streaks');
expect(text).toContain('### Shortcut Debt');
expect(text.indexOf('## Capture Learnings')).toBeGreaterThan(text.indexOf('### Step 14:'));
expect(text).not.toContain('$(date');
expect(text.match(/today="<today>"/g)).toHaveLength(2);
const judge = readFileSync(join(import.meta.dir, 'skill-llm-eval.test.ts'), 'utf8');
expect(judge).toMatch(/skillPath: 'retro\/SKILL.md',[\s\S]*?endMarker: '## Tone'/);
});
test('deploy gates and navigation timing formulas are executable as documented', () => {
const land = readFileSync(join(import.meta.dir, '../land-and-deploy/SKILL.md.tmpl'), 'utf8');
expect(land).not.toContain('Skip Step 3, go to Step 4');