From 6b7b5c15a547c1523db9ed93b21230c9f0396386 Mon Sep 17 00:00:00 2001 From: Tom Boucher Date: Wed, 22 Apr 2026 12:04:13 -0400 Subject: [PATCH] fix(#2559): remove stale year injection from research agent web search instructions (#2591) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The gsd-phase-researcher and gsd-project-researcher agents instructed WebSearch queries to always include 'current year' (e.g., 2024). As time passes, a hardcoded year biases search results toward stale dated content — users saw 2024-tagged queries producing stale blog references in 2026. Remove the year-injection guidance. Instead, rely on checking publication dates on the returned sources. Query templates and success criteria updated accordingly. Closes #2559 --- agents/gsd-phase-researcher.md | 4 +- agents/gsd-project-researcher.md | 6 +- tests/bug-2559-stale-search-year.test.cjs | 73 +++++++++++++++++++++++ 3 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 tests/bug-2559-stale-search-year.test.cjs diff --git a/agents/gsd-phase-researcher.md b/agents/gsd-phase-researcher.md index 878fcacf..83baff87 100644 --- a/agents/gsd-phase-researcher.md +++ b/agents/gsd-phase-researcher.md @@ -145,7 +145,7 @@ When researching "best library for X": find what the ecosystem actually uses, do 1. `mcp__context7__resolve-library-id` with libraryName 2. `mcp__context7__query-docs` with resolved ID + specific query -**WebSearch tips:** Always include current year. Use multiple query variations. Cross-verify with authoritative sources. +**WebSearch tips:** Use multiple query variations. Cross-verify with authoritative sources. Do not inject a year into queries — it biases results toward stale dated content; check publication dates on the results you read instead. ## Enhanced Web Search (Brave API) @@ -836,6 +836,6 @@ Quality indicators: - **Verified, not assumed:** Findings cite Context7 or official docs - **Honest about gaps:** LOW confidence items flagged, unknowns admitted - **Actionable:** Planner could create tasks based on this research -- **Current:** Year included in searches, publication dates checked +- **Current:** Publication dates checked on sources (do not inject year into queries) \ No newline at end of file diff --git a/agents/gsd-project-researcher.md b/agents/gsd-project-researcher.md index 5450301e..4c3f96d2 100644 --- a/agents/gsd-project-researcher.md +++ b/agents/gsd-project-researcher.md @@ -116,12 +116,12 @@ For finding what exists, community patterns, real-world usage. **Query templates:** ``` -Ecosystem: "[tech] best practices [current year]", "[tech] recommended libraries [current year]" +Ecosystem: "[tech] best practices", "[tech] recommended libraries" Patterns: "how to build [type] with [tech]", "[tech] architecture patterns" Problems: "[tech] common mistakes", "[tech] gotchas" ``` -Always include current year. Use multiple query variations. Mark WebSearch-only findings as LOW confidence. +Use multiple query variations. Mark WebSearch-only findings as LOW confidence. Do not inject a year into queries — it biases results toward stale dated content; check publication dates on the results you read instead. ### Enhanced Web Search (Brave API) @@ -672,6 +672,6 @@ Research is complete when: - [ ] Files written (DO NOT commit — orchestrator handles this) - [ ] Structured return provided to orchestrator -**Quality:** Comprehensive not shallow. Opinionated not wishy-washy. Verified not assumed. Honest about gaps. Actionable for roadmap. Current (year in searches). +**Quality:** Comprehensive not shallow. Opinionated not wishy-washy. Verified not assumed. Honest about gaps. Actionable for roadmap. Current (check publication dates, do not inject year into queries). diff --git a/tests/bug-2559-stale-search-year.test.cjs b/tests/bug-2559-stale-search-year.test.cjs new file mode 100644 index 00000000..91271653 --- /dev/null +++ b/tests/bug-2559-stale-search-year.test.cjs @@ -0,0 +1,73 @@ +/** + * Bug #2559: Stale document references in Research phase + * + * The gsd-phase-researcher and gsd-project-researcher agents instruct + * WebSearch queries to always include "current year" (or a hardcoded + * year). This biases results toward stale dated content as time passes + * (e.g., a 2024 query run in 2026 returns stale results). + * + * Fix: Remove year-injection instructions from research agent + * WebSearch guidance so searches return current results. + */ + +const { describe, test } = require('node:test'); +const assert = require('node:assert/strict'); +const fs = require('fs'); +const path = require('path'); + +const PHASE_RESEARCHER = path.join( + __dirname, + '..', + 'agents', + 'gsd-phase-researcher.md' +); +const PROJECT_RESEARCHER = path.join( + __dirname, + '..', + 'agents', + 'gsd-project-researcher.md' +); + +const FILES = [ + { label: 'gsd-phase-researcher.md', path: PHASE_RESEARCHER }, + { label: 'gsd-project-researcher.md', path: PROJECT_RESEARCHER }, +]; + +describe('research agents do not inject year into web searches (#2559)', () => { + for (const { label, path: filePath } of FILES) { + test(`${label} contains no CURRENT_YEAR placeholder`, () => { + const content = fs.readFileSync(filePath, 'utf-8'); + assert.ok( + !/CURRENT_YEAR/.test(content), + `${label} must not contain CURRENT_YEAR placeholder (causes stale-year injection)` + ); + }); + + test(`${label} contains no hardcoded year in web search instructions`, () => { + const content = fs.readFileSync(filePath, 'utf-8'); + const match = content.match(/\b20(2[3-9]|[3-9]\d)\b/); + assert.ok( + !match, + `${label} must not contain hardcoded year (found "${match && match[0]}") — biases searches toward stale content` + ); + }); + + test(`${label} does not instruct searches to include year or current year`, () => { + const content = fs.readFileSync(filePath, 'utf-8'); + // Match phrases like "include current year", "year in searches", + // "[current year]", "with year", etc. + const patterns = [ + /include\s+(?:the\s+)?current\s+year/i, + /current\s+year/i, + /year\s+in\s+(?:searches|queries)/i, + /\[current year\]/i, + ]; + for (const pat of patterns) { + assert.ok( + !pat.test(content), + `${label} must not instruct year injection (matched /${pat.source}/)` + ); + } + }); + } +});