From d7d065019aa5184012acb0d0913b8f84fb775d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=94=D0=BC=D0=B8=D1=82=D1=80=D0=B8=D0=B9?= Date: Wed, 20 May 2026 12:33:35 +0300 Subject: [PATCH] feat(observer): extend classifyTask with 7 new classes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes brain-retro 2026-05-20 #1 — analysis/memory-sync/regulatory-bump/ release/cleanup/monitoring/planning. Addresses '59% other' observation from initial retro factor matrix. Ordering: release before feature (merge feature-branch), planning before refactor (план рефакторинга), memory-sync/regulatory-bump at top as most specific. monitoring regex проверь состоян covers inflected forms. 9 new vitest tests, 241/241 GREEN in npm run test:tools. Co-Authored-By: Claude Sonnet 4.6 --- tools/observer-transcript-parser.mjs | 7 ++++ tools/observer-transcript-parser.test.mjs | 43 +++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/tools/observer-transcript-parser.mjs b/tools/observer-transcript-parser.mjs index 9d2681ba..f7ae582b 100644 --- a/tools/observer-transcript-parser.mjs +++ b/tools/observer-transcript-parser.mjs @@ -109,10 +109,17 @@ function promptText(entry) { export function classifyTask(text) { const t = String(text || '').toLowerCase(); + if (/обнови эталон|sync memory|обнови (?:память|memory|memory\.md)/.test(t)) return 'memory-sync'; + if (/обнови claude|правк[аи] pravila|update pravila|обнови psr|обнови tooling|нормативка/.test(t)) return 'regulatory-bump'; + if (/план|plan\b|спроектируй|design\b|brainstorm|обсудим/.test(t)) return 'planning'; + if (/\bpush\b|\bmerge\b|\bdeploy\b|\bcommit\b|\brelease\b|релиз|тегни/.test(t)) return 'release'; if (/рефактор|refactor/.test(t)) return 'refactor'; if (/баг|bug|почини|исправ|fix\b|сломан|broken/.test(t)) return 'bugfix'; if (/фич|feature|добав|implement|реализ|создай|create|новый|new /.test(t)) return 'feature'; if (/докум|readme|\bdocs?\b/.test(t)) return 'docs'; + if (/проанализ|анализ|оцени|review|examine|разбор|посмотри что/.test(t)) return 'analysis'; + if (/убери|удали|почисть|cleanup|очисти|drop\s/.test(t)) return 'cleanup'; + if (/^\s*статус\b|\bstatus\b|проверь состоян|health/.test(t)) return 'monitoring'; if (/\?|как |что |почему|зачем|why|how |what /.test(t)) return 'question'; return 'other'; } diff --git a/tools/observer-transcript-parser.test.mjs b/tools/observer-transcript-parser.test.mjs index 7e14cb4f..5d9a23c9 100644 --- a/tools/observer-transcript-parser.test.mjs +++ b/tools/observer-transcript-parser.test.mjs @@ -7,6 +7,7 @@ import { extractProcessEvents, parseRoutingTag, extractLastUserPromptText, + classifyTask, } from './observer-transcript-parser.mjs'; // Build a JSONL transcript string from entry objects. @@ -877,3 +878,45 @@ describe('extractEnvironment — parallel_session narrowed to tool_result eviden expect(env.parallel_session).toBe(true); }); }); + +describe('classifyTask — extended dictionary (Task 1)', () => { + it('classifies analysis prompts', () => { + expect(classifyTask('проанализируй данные наблюдателя')).toBe('analysis'); + expect(classifyTask('review the recent changes')).toBe('analysis'); + expect(classifyTask('посмотри что в логах')).toBe('analysis'); + }); + it('classifies memory-sync prompts', () => { + expect(classifyTask('обнови эталон проекта')).toBe('memory-sync'); + expect(classifyTask('sync memory с последним push')).toBe('memory-sync'); + expect(classifyTask('обнови MEMORY.md')).toBe('memory-sync'); + }); + it('classifies regulatory-bump prompts', () => { + expect(classifyTask('обнови CLAUDE.md после правки')).toBe('regulatory-bump'); + expect(classifyTask('правка Pravila §16')).toBe('regulatory-bump'); + expect(classifyTask('обнови PSR_v1 v3.18')).toBe('regulatory-bump'); + }); + it('classifies release prompts', () => { + expect(classifyTask('push origin main')).toBe('release'); + expect(classifyTask('merge feature-branch')).toBe('release'); + expect(classifyTask('сделай release v2')).toBe('release'); + }); + it('classifies cleanup prompts', () => { + expect(classifyTask('убери временные файлы')).toBe('cleanup'); + expect(classifyTask('cleanup тулчейн')).toBe('cleanup'); + }); + it('classifies monitoring prompts', () => { + expect(classifyTask('проверь состояние портала')).toBe('monitoring'); + expect(classifyTask('status of CI')).toBe('monitoring'); + }); + it('classifies planning prompts', () => { + expect(classifyTask('план рефакторинга биллинга')).toBe('planning'); + expect(classifyTask('design новую фичу')).toBe('planning'); + expect(classifyTask('обсудим архитектуру')).toBe('planning'); + }); + it('preserves existing classes — refactor stays refactor', () => { + expect(classifyTask('рефактор биллинг-сервиса')).toBe('refactor'); + }); + it('preserves existing classes — bugfix stays bugfix', () => { + expect(classifyTask('почини баг в logger')).toBe('bugfix'); + }); +});