Status: Design (pre-implementation)
Date: 2026-06-18
Author: Cheng-I Wu
Borrowing source: Stanford OVAL STORM / Co-STORM — https://github.com/stanford-oval/storm
Target file: deep-research/agents/socratic_mentor_agent.md (single agent, prose-layer)
When an exploratory Socratic dialogue is stuck in Layer 1 (Problem Framing), the Mentor may surface one adjacent framing the user has not raised — as a pure question, never a proposed idea — to help a researcher who simply has not seen enough of the field. Borrows STORM's perspective-discovery intent and Co-STORM's moderator unknown-unknowns injection, but anchors framings in LLM internal knowledge (zero retrieval dependency) and is hard-bounded by ARS's existing "never generate ideas for the user" red line.
This is an opt-in, additive, prose-layer mechanism: gated by a new env flag,
no new agent, no new schema, no new mode. Same shape as the existing
Optional Reading Probe Layer (v3.5.1).
ARS already has three mechanisms that touch "don't let the dialogue close too early," but none of them is this one:
| Existing mechanism | What it does | Why it doesn't cover this gap |
|---|---|---|
[Q:CHALLENGE] taxonomy |
Gives the counter-position to the user's stated stance | Known disagreement, not an unseen facet |
| Divergence Reveal (SCR) | Introduces info that tests the user's commitment | Locked to the axis the user already declared |
| Persistent-Agreement injection (Dialogue Health) | Stops the AI from serial agreeing | Guards the AI's behavior, not the user's frame-lock |
FINER Novel guiding Q ("where do you think the gaps are?") |
Asks the user to find the gap | The user cannot name a facet they don't know exists |
The fourth row is the hole. ARS's Layer 1 framing discovery depends entirely on the user's own mental map of the field. A researcher who has not encountered an adjacent subfield, a neighbouring stakeholder, or a different level of analysis cannot surface it when asked "where's the gap?" — they will answer only within what they already know.
STORM solves the equivalent problem by fetching the real table-of-contents of
related Wikipedia articles and using that external structure to seed
perspectives, so the perspectives are anchored in how the topic is actually
structured in the world, not in what the LLM feels is relevant
(persona_generator.py: FindRelatedTopic → get_wiki_page_title_and_toc() →
GenPersona). Co-STORM goes further with a moderator agent that deliberately
injects information "related to the topic but not directly answering the current
question" to push the discourse out of local stagnation
(reranking unused sources by cos(i,t)^α · (1−cos(i,q))^(1−α), α=0.5).
This mechanism borrows the intent of both (surface what the user did not think to ask) but not the retrieval (see §6 for the deliberate divergence and §7 for the forward note).
This mechanism deliberately serves exploratory novice researchers, and that decision determines everything below — including why majority-favoured framings are a feature here, not a bug.
The reasoning (settled 2026-06-18):
plan/full/revision mode. With a clear question →
goal-oriented intent, where this mechanism is dormant. The
exploratory + Layer 1 gate is itself a coarse-but-effective novice filter:
the people who land in exploratory mode, stalled at problem definition, skew
toward "still exploring, hasn't seen enough."Consequence for design: an earlier draft of this spec added a "deliberately pick the most non-mainstream adjacent facet" bias to counter LLM majority-favour. That is removed. In a novice-majority entry point, pushing a beginner to the edge of the field before they have found their footing is counterproductive. The mechanism keeps only a light diversity requirement (consecutive probes should not be the same kind), not a contrarian bias.
Majority-favour is recorded as a design tradeoff, not a limitation (§6).
Borrows Co-STORM's "intervene only when the discourse is circling" principle, but reuses ARS's existing dialogue state rather than adding new tracking.
All of the following must hold:
ARS_SOCRATIC_ADJACENT_PROBE=1 (exactly the string 1;
unset/empty/0/other keeps the layer dormant). Default dormant, same gate
discipline as ARS_SOCRATIC_READING_PROBE.Not a hard "fire once a lock is detected" trigger. In exploratory + Layer 1,
the adjacent-framing probe is an available tool from the moment the layer opens,
parallel to how exploratory mode already raises the [Q:CHALLENGE] ratio to 40%+.
It is a standing tendency, not an emergency patch.
The existing S4 (Scope Stability) convergence signal is repurposed as an intensity knob, not a trigger gate:
Why reuse S4, not add a counter: prompt-only skills accrete semantic seams at
new state-tracking points (cf. feedback_prompt_skill_self_review_blindspots,
feedback_linter_mutation_test_discipline). S4 is already computed every 5 turns;
reusing it avoids a new "frame-lock counter" that could collide with the existing
convergence logic.
The only legal shape: surface an adjacent facet name + ask whether to include or consciously exclude it. Ends in a question mark; contains no formed RQ / hypothesis / conclusion.
[ADJACENT-FRAMING-PROBE]
Your question is framed around <quote the user's own framing, verbatim>.
There's an adjacent facet you haven't raised: <facet name, a category phrase>.
Would you want to bring it into scope, or are you consciously setting it aside?
Hard constraints:
<facet name> is a category word — a perspective / dimension / stakeholder /
time-scale / level of analysis (e.g. "the institutional-incentive angle", "the
longitudinal dimension", "the perspective of those being evaluated"). It is
never a sentence, an RQ, or a finding.Aligned with the Kong L2 verb test cited by plan_mode_protocol.md Step 2.5
(docs/design/2026-06-08-kong-255-l2-advisory-not-generation.md): the Mentor must
never propose / substitute / rank / expand / select an idea for the user.
| Example | Verdict | |
|---|---|---|
| GOOD | "You're framed around 'the effect of AI tools on student grades.' An adjacent facet you haven't raised: the teacher's-eye-view angle. Include it, or set it aside?" | surface facet + ask. ✅ |
| BAD (propose) | "You could reframe this as 'how teachers mediate AI's effect on grades.'" | gives a formed RQ. ❌ |
| BAD (rank) | "The teacher-mediation angle is more novel than your current frame." | comparison / implies better. ❌ |
| BAD (menu/select) | "Consider: teacher mediation, parental involvement, or policy level — which?" | lists candidates to pick. ❌ |
| BAD (expand) | "Teacher mediation could become three sub-questions: …" | expands it for the user. ❌ |
Only the first row passes. The moment a probe contains "you could research X", "X is better/more novel", or "consider A, B, or C", it is a violation.
The facets are LLM-generated, not fetched from an external TOC. STORM anchors perspectives in real Wikipedia structure precisely so they are independent of the LLM's training distribution. This version forgoes that. The consequences are recorded honestly:
For the target user (exploratory novice), surfacing mainstream adjacent facets is the value, not the defect. This is logged as a design tradeoff, not a bug: the mechanism intentionally serves researchers who have not seen enough; mainstream facet visibility helps them. Experienced / task-oriented researchers are filtered out upstream by intent detection and mode choice and are not this mechanism's service population.
The probe still constrains itself in three ways, none of which require an external anchor:
feedback_positive_finding_anti_sycophancy_evidence_question: claims must be
anchored to identifiable basis; here the only basis is conversational absence,
which is anchorable.)outcome=declined and moves on. This aligns with
feedback_respect_contributor_expertise: the user is the domain expert; the
LLM's internal knowledge does not override their "not relevant." It also serves
as the safety net for the experienced exploratory researcher the
exploratory+Layer-1 filter fails to exclude (§2 residual risk): one "I've seen
the mainstream take" and the mechanism goes silent.Emit a machine-readable tag so Stage 6 AI Self-Reflection can audit how often the AI surfaced facets and how often the user accepted/declined. A high decline rate is itself the bias-detection signal: if the AI's adjacency judgments are consistently rejected, the LLM's internal-knowledge adjacency is mis-calibrated for this user — the audit sees it even though generation-time cannot stop it.
[ADJACENT-PROBE: surfaced="<facet name>", anchor=internal_knowledge, turn=<N>, outcome=<considered|declined|deferred>]
Majority-favour is fundamentally constrainable only by an external source — a real TOC reflects how a topic is actually structured, independently of the LLM's training distribution. This spec deliberately does not build that (per the zero-dependency decision). It is recorded as a forward extension:
Prose-layer mechanisms degrade silently; a linter is required (cf.
feedback_linter_mutation_test_discipline, feedback_prompt_skill_self_review_blindspots).
At minimum the linter must:
[ADJACENT-FRAMING-PROBE] section exists and is env-gated.Mutation-test design (which mutations must FAIL the linter, case-alignment with
IGNORECASE) belongs in the implementation plan, including the two discipline traps
recorded in feedback_linter_mutation_test_discipline (commit before mutating;
align mutation-command casing to the linter).
academic-paper/agents/socratic_mentor_agent.md (a separate
file with no Layer structure — plan_mode_protocol.md:69 flags the distinction).
plan mode inherits this change automatically because its Socratic questioning is
delegated to deep-research's socratic_mentor_agent.