Skip to content

Reasoning models return content=null with reasoning_present at auto effort — E1 dead-letters (new §2.4 observation) #155

Description

@fazpu

Live evidence (glm-4.7-flash arm, 2026-07-27): every E1 ContextPrefix call died with

ContextPrefix: provider returned no completion content
(finish_reason='stop', content=null, reasoning_present=True,
 refusal_present=False, model='z-ai/glm-4.7-flash')

→ embed_chunk dead-letters → E2+ never runs → empty store. The #141 diagnosis metadata made this immediately identifiable (it is exactly what reasoning_present=True exists for).

Cause: at default/auto reasoning effort, some reasoning models put everything in the reasoning channel and leave content null. The earlier deepseek arm worked because REMEMBERSTACK_OPENROUTER_REASONING_EFFORT=none was pinned; removing that pin for the luna experiment exposed the class. A retry with effort=none is in flight to confirm the mitigation.

Suggestions:

  1. Document in design §2.4 as a third verified provider-behavior class.
  2. Consider a per-model effort override (global pin is blunt: luna benefits from reasoning, flash-class models need none for content-bearing calls) — fits the Per-stage model-bindings scorecard: re-pinning a cheaper model must beat the incumbent on that stage's canaries #150 per-stage bindings scorecard.
  3. Adapter policy question (deliberate, not automatic): should a content=null + reasoning_present response ever fall back to parsing the reasoning channel? Current behavior (diagnosable failure) is honest; silent fallback risks §2.4-style corruption.

🤖 Generated with Claude Code

https://claude.ai/code/session_01GKENhTLJg1HqhbdwCmmkbc

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions