diff --git a/src/core/cycle/propose-takes.ts b/src/core/cycle/propose-takes.ts index 384147abf..f1a7b0e61 100644 --- a/src/core/cycle/propose-takes.ts +++ b/src/core/cycle/propose-takes.ts @@ -295,8 +295,6 @@ export function isWellFormedEmptyExtraction(raw: string): boolean { export function parseExtractorOutput(raw: string): ProposedTake[] { if (!raw || raw.trim().length === 0) return []; let text = raw.trim(); - // Strip ... reasoning tags (MiniMax-M3, DeepSeek-R1, etc.). - text = text.replace(/[\s\S]*?<\/think>/g, '').trim(); // Strip markdown code fence wrapper. const fenced = text.match(/^```(?:json)?\s*\n?([\s\S]*?)\n?```$/); if (fenced) text = (fenced[1] ?? '').trim(); @@ -309,21 +307,7 @@ export function parseExtractorOutput(raw: string): ProposedTake[] { try { parsed = JSON.parse(text.slice(start)); } catch { - // Fallback: truncate at last ] or } to handle trailing noise (e.g. leftover - // markdown fences after stripping). Try array-closing first. - const sliced = text.slice(start); - const lastArr = sliced.lastIndexOf(']'); - const lastObj = sliced.lastIndexOf('}'); - const end = Math.max(lastArr, lastObj); - if (end > 0) { - try { - parsed = JSON.parse(sliced.slice(0, end + 1)); - } catch { - return []; - } - } else { - return []; - } + return []; } const arr = Array.isArray(parsed) ? parsed : [parsed]; const out: ProposedTake[] = []; diff --git a/test/propose-takes.test.ts b/test/propose-takes.test.ts index 8430f2ed4..9b8bba307 100644 --- a/test/propose-takes.test.ts +++ b/test/propose-takes.test.ts @@ -170,26 +170,6 @@ describe('parseExtractorOutput', () => { const out = parseExtractorOutput(raw); expect(out[0]!.domain).toBe('macro'); }); - - test('strips reasoning tags before parsing (MiniMax-M3, DeepSeek-R1)', () => { - const raw = 'Analyzing the prose... I see several claims.\n\n```json\n[{"claim_text":"X","kind":"take","holder":"brain","weight":0.5}]\n```'; - const out = parseExtractorOutput(raw); - expect(out).toHaveLength(1); - expect(out[0]!.claim_text).toBe('X'); - }); - - test('strips multiple blocks', () => { - const raw = 'First thought.\n...\nSecond thought.\n\n[{"claim_text":"Y","kind":"bet","holder":"brain","weight":0.7}]'; - const out = parseExtractorOutput(raw); - expect(out).toHaveLength(1); - }); - - test('handles trailing noise after JSON (leftover fences)', () => { - const raw = 'done\n```json\n[{"claim_text":"Z","kind":"take","holder":"brain","weight":0.6}]\n```\n'; - const out = parseExtractorOutput(raw); - expect(out).toHaveLength(1); - expect(out[0]!.claim_text).toBe('Z'); - }); }); // ─── isWellFormedEmptyExtraction ────────────────────────────────────