Status (2026-05-04 retrospective): SHIPPED in v3.5.1, 2026-04-22. All §1–§4 components landed; §5 tests landed as
scripts/test_reading_probe_lint.pycovering 7 of 8 specified tests. §5.1 test 8 (test_version_bump_sweep) is OBSOLETE — superseded by PR #33 which generalisedcheck_version_consistency.pyto dynamic CHANGELOG-driven version comparison, replacing the per-version pinned-fixture pattern this spec assumed. Pinned fixtures for v3.5.1 strings are no longer the right shape; the dynamic guard already covers the regression class. Filename retainsv3.7.3because the roadmap slot was originally v3.7.3 before being reshaped into v3.5.1; spec body uses v3.5.1 throughout.Retained as historical design reference. Implementation evidence:
.claude/CLAUDE.md## v3.5.1 Key Additions,deep-research/agents/socratic_mentor_agent.md## Optional Reading Probe Layer (v3.5.1 ...),scripts/test_reading_probe_lint.py.
Status: DRAFT — pending implementation
Date: 2026-04-22
Target version: 3.5.0 → 3.5.1 (patch)
Roadmap slot: v3.7.3 "Did the user actually read the source?" probe — parked from v3.4 design, reshaped in 2026-04-21 ROADMAP §3.7.3
Author: Cheng-I Wu
Design precedent: docs/design/2026-04-20-v3.4-prisma-trAIce-raise-readcheck-design.md §7.7 (tests) and §8.2 (release plan). The earlier v3.5.0 proposal bundled a standalone reading_check_agent + reading-check sub-mode. The 2026-04-21 roadmap reshape drops both and keeps only the Socratic Mentor soft-nudge. This spec is authoritative for v3.5.1.
socratic_mentor_agent that asks the user to paraphrase a specific paragraph from a paper they cited during dialogue.ARS_SOCRATIC_READING_PROBE=1 (default OFF).academic-paper.socratic_mentor_agent.md as an internal layer.reading-check mode — dropped.)academic-pipeline Stage 6 report_compiler_agent reads from Mentor artifacts it already reads. One reference doc (process_summary_protocol.md) gains a pickup rule; no agent instructions change.| Alternative | Rejected because |
|---|---|
Standalone reading_check_agent (original v3.5.0 design) |
Roadmap §3.7.3 collapses to Mentor-only. Adding an agent violates "minimum surface" principle. |
| Probe fires in exploratory mode | Exploratory sessions assume the user has not yet done the homework; the probe premise doesn't hold. |
| Probe fires on every user-cited paper | Violates "do not extend pipeline" constraint; one probe is enough for honesty signal. |
Probe result stored in Material Passport reading_probe_history[] |
Requires Schema 9 change and Socratic-only sessions don't produce Passport. Inline storage is lighter. |
| User-initiated probe ("probe me on X") | Removes the detection value. Honesty probes have to be AI-initiated. |
One primary file: deep-research/agents/socratic_mentor_agent.md. The Mentor agent is defined by prompt, so "architecture" here means what the agent prompt instructs the model to do. No runtime code executes the probe logic — Claude interprets the prompt.
Three supporting files get aligned text updates: deep-research/references/socratic_mode_protocol.md, deep-research/SKILL.md, academic-pipeline/references/process_summary_protocol.md.
┌──────────────┐
│ session start│
└──────┬───────┘
│
▼
probe_fired = false
candidate_paper = null
│
▼
┌────────────────────────────┐
│ on each user turn: │
│ 1. classify intent │
│ 2. scan for paper citation │
└────────────┬───────────────┘
│
┌──────┴──────┐
│ paper cited?│
└──┬────────┬─┘
no │ │ yes
│ ▼
│ candidate_paper = first cited
│ (never overwritten this session)
│ │
└──┬─────┘
▼
┌──────────────────────────────────┐
│ at Layer 2 → Layer 3 transition: │
│ probe_gate = │
│ env ARS_SOCRATIC_READING_PROBE │
│ AND intent == goal_oriented │
│ AND candidate_paper != null │
│ AND probe_fired == false │
└──────────────────┬───────────────┘
│
probe_gate?
│yes │no
▼ ▼
fire probe continue
probe_fired = true Layer 3
│
▼
user response:
paraphrase | decline | other
│
▼
log [READING-PROBE: ...]
│
▼
Mentor acknowledges briefly,
continues Layer 3
ARS_CROSS_MODEL (shared/cross_model_verification.md): agent prompt contains instructions for both set and unset cases; the model checks environment through whatever mechanism the runtime exposes.ARS_SOCRATIC_READING_PROBE=1 — probe layer active0, or any other value — probe layer dormant (as if the section were absent)socratic_mentor_agent.md's non-probe sections being zero-delta).Socratic session (deep-research, mode=socratic)
├─ Mentor emits dialogue turns, possibly with
│ [READING-PROBE: paper=..., outcome=..., turn=N,
│ paraphrase_quote="..."] ← tag inline
│
└─ Session end → Research Plan Summary
├─ existing sections
└─ "Reading Probe Outcomes" subsection
(populated only if probe fired OR env was set
and probe did not fire with reason)
If user continues into academic-paper / pipeline:
academic-pipeline Stage 6 (report_compiler_agent)
└─ AI Self-Reflection Report
└─ "Reading Probe Outcomes" section
(transcribes Research Plan Summary subsection verbatim,
with a line noting the probe is a user-honesty observation,
not an AI-verified claim)
If user stops after socratic mode:
Probe data persists in Research Plan Summary only.
No data loss — the downstream Self-Reflection Report simply
never runs.
| File | Change type | Approx size |
|---|---|---|
deep-research/agents/socratic_mentor_agent.md |
NEW section "Optional Reading Probe Layer (v3.5.1)" | +60–90 lines |
deep-research/references/socratic_mode_protocol.md |
NEW subsection "Reading Probe (opt-in, goal-oriented only)" | +15–25 lines |
deep-research/SKILL.md |
Socratic Mode section gains env-var note; INSIGHT Compilation Output template gains "Reading Probe Outcomes" subsection slot | +10–15 lines |
academic-pipeline/references/process_summary_protocol.md |
Self-Reflection Report spec gains "Reading Probe Outcomes (if present)" item | +8–12 lines |
scripts/test_reading_probe_lint.py |
NEW — probe prompt-lint test suite | ~120 lines |
CHANGELOG.md |
v3.5.1 entry | +15–25 lines |
README.md + README.zh-TW.md |
v3.5.1 key-addition paragraph | +5 lines each |
.claude/CLAUDE.md |
Suite version 3.5.0 → 3.5.1, Skills Overview row adjustment if any | 1–2 lines |
deep-research/SKILL.md frontmatter |
version 2.9.0 → 2.9.1 (patch, because SKILL.md text changes and mentor behaviour gains optional layer) | 1 line |
deep-research/references/changelog.md |
corresponding skill-level changelog entry | +10 lines |
Not changed: shared/handoff_schemas.md, any orchestrator agent, any other deep-research agent, academic-pipeline/SKILL.md, any compliance / rubric / scoring file.
This is the literal content that goes into socratic_mentor_agent.md — not full prose, but the key invariants the prompt must encode.
## Optional Reading Probe Layer (v3.5.1 — Internal, Never Mention "Probe" to Users)
This layer activates only when ALL of the following hold:
- Environment variable ARS_SOCRATIC_READING_PROBE is set to "1"
- Current intent classification (from Intent Detection Layer) is goal-oriented
- The user has, in a prior turn of THIS session, cited a specific paper
(named authors + year minimum, e.g., "Smith 2024" or full reference)
- The Layer 2 → Layer 3 transition is imminent
- The probe has not yet fired in this session
If ANY of these is false, this layer is dormant. Do not mention the probe.
Do not prepare for the probe. Do not hint that a probe exists.
While this session is active, silently track the FIRST concrete paper
citation the user produces. Store internally as candidate_paper. Once set,
never overwrite. If the user cites multiple papers later, they do not
replace the candidate. Rationale: one probe, one paper, fair detection.
When all activation conditions hold, at the Layer 2 → Layer 3 transition,
ask ONE question in this form:
"You mentioned [candidate_paper] earlier. Before we move into evidence
strategy — could you tell me, in your own words, one specific passage
from that paper that's shaping your thinking? Feel free to paraphrase
a paragraph or an argument. Or skip this if you'd rather keep moving."
Do NOT:
- Frame it as a test, check, or verification
- Imply that the user must answer
- Use evaluative language ("make sure", "prove", "demonstrate")
- Preface with "I want to check if..."
- Follow up with a second probe question in the same session
The user's response maps to one of three outcomes:
OUTCOME = paraphrase
User offers any content that references the paper (even if vague,
even if arguably wrong — Mentor does NOT judge accuracy).
Action: Acknowledge in ≤ 15 words. Do not praise, do not evaluate,
do not grade. Example: "Got it — noted. Let's move into evidence."
Log: [READING-PROBE: paper="<candidate>", outcome=paraphrase,
turn=<N>, paraphrase_quote="<user text, trimmed to
first 280 chars>"]
OUTCOME = decline
User's response is a clear skip/pass signal: "skip", "pass",
"let's move on", "不用了", "跳過", or similar, AND contains no
content referencing the paper. If the user's response mixes a skip
signal WITH paper content (e.g., "skip, but briefly — the paper
argues X"), classify as OUTCOME=paraphrase and log the paper-content
portion only.
Action: Acknowledge briefly. Example: "No problem — moving on."
Decline is NOT penalised. It does NOT count toward Persistent-Agreement,
Conflict-Avoidance, or Premature-Convergence indicators. It does NOT
shift convergence signals. It does NOT affect intent classification.
Log: [READING-PROBE: paper="<candidate>", outcome=decline, turn=<N>]
OUTCOME = other
User answers something off-topic or asks a clarifying question back.
Action: Answer their question, then proceed to Layer 3 without
re-asking the probe. Probe is fired once per session regardless
of what the user said.
Log: [READING-PROBE: paper="<candidate>", outcome=other, turn=<N>,
user_response="<first 280 chars>"]
Regardless of outcome, set probe_fired = true and NEVER probe again
this session.
The probe question and the acknowledgement MUST NOT contain:
- "correct", "right", "wrong", "good answer", "well said"
- "make sure", "verify", "prove"
- Any praise of the user's paraphrase content
- Any judgement of the user's decline
(Note: "check" is not banned because it appears in non-evaluative
senses elsewhere in this section — e.g., "activation conditions".)
Rationale: evaluative language turns the probe into a sycophancy hook
(user answers well → Mentor praises → user feels graded). Probe is
observation, not grading.
When the Mentor compiles the Research Plan Summary at session end, if
ARS_SOCRATIC_READING_PROBE was set at any point during the session,
include this subsection immediately before "Complete INSIGHT List":
### Reading Probe Outcomes
Probe status: <fired | not_fired_no_citation | not_fired_exploratory_mode>
<If fired:>
- Paper: <candidate_paper>
- Outcome: <paraphrase | decline | other>
- Turn: <N>
- User text (verbatim, if paraphrase or other): <quote>
Note to reader: This section records whether the user chose to
paraphrase a paper they cited. The Mentor did NOT verify factual
accuracy of any paraphrase. Interpret at your own discretion.
If ARS_SOCRATIC_READING_PROBE was NOT set, omit this subsection entirely.
deep-research/references/socratic_mode_protocol.mdAdd a subsection after "Dialogue Management Rules":
## Reading Probe (opt-in, goal-oriented only)
When `ARS_SOCRATIC_READING_PROBE=1`, the Mentor runs a one-time honesty
probe at the Layer 2 → Layer 3 transition, but only for goal-oriented
sessions where the user has already cited a specific paper.
The probe asks the user to paraphrase one passage from that paper. The
user may decline; the decline is logged without penalty. The probe is
not a gate — it records user self-report only. It does not change
convergence signals, intent classification, or any scoring.
Default is OFF. Exploratory sessions never probe. See
`agents/socratic_mentor_agent.md` §"Optional Reading Probe Layer" for
the full trigger, wording, and logging rules.
deep-research/SKILL.mdIn the "Socratic Mode" section, append:
### Opt-in Reading Probe (v3.5.1)
Setting `ARS_SOCRATIC_READING_PROBE=1` enables a one-time honesty
probe during goal-oriented Socratic sessions. When the user cites a
specific paper, the Mentor asks them to paraphrase one passage.
Decline is logged without penalty. Default OFF. See
`agents/socratic_mentor_agent.md` §"Optional Reading Probe Layer".
In the INSIGHT Compilation Output template (in the agent's own file, not SKILL.md — SKILL.md only references the template location), add the "Reading Probe Outcomes" subsection slot so the layout is documented in one canonical place.
academic-pipeline/references/process_summary_protocol.mdIn the Self-Reflection Report structure list, add:
- **Reading Probe Outcomes (if present)** — transcribes the
"Reading Probe Outcomes" subsection from the Research Plan Summary
verbatim, with a one-line note that the AI did not verify paraphrase
accuracy. If the Research Plan Summary has no such subsection,
this item is omitted entirely (no "not applicable" noise).
TDD entry: scripts/test_reading_probe_lint.py. Style matches existing test_check_compliance_report.py and _skill_lint.py — file-content lints, not runtime agent tests.
test_mentor_file_has_probe_section
Assert socratic_mentor_agent.md contains heading "Optional Reading Probe Layer" and required subsections (activation, candidate tracking, wording, response handling, banned phrases, summary subsection).
test_env_var_name_consistent_across_repo
Grep for ARS_SOCRATIC_READING_PROBE across agent, protocol, SKILL, README. All occurrences use the exact same string. No typos, no case drift, no alternate names.
test_probe_gated_by_goal_oriented
Assert Mentor file contains explicit text stating the probe activates only in goal-oriented intent, and there is NO instruction elsewhere that activates it in exploratory mode.
test_decline_is_zero_penalty
Assert Mentor file's probe section contains the "no penalty" clause and explicitly excludes decline from Persistent-Agreement / Conflict-Avoidance / Premature-Convergence / convergence signals / intent classification.
test_probe_tag_format
Assert the [READING-PROBE: ...] tag regex is defined consistently in the agent file and referenced identically in process_summary_protocol.md pickup rules.
test_no_probe_in_scoring_files
Grep all scoring / rubric / convergence files (collaboration_depth_rubric.md, compliance_report.schema.json, convergence-signal blocks in socratic_mentor_agent.md) for reading_probe or READING-PROBE. Expected: zero matches. Prevents accidental regression where the probe becomes a gate.
test_banned_praise_phrases
Assert the probe section's banned-phrases list contains the exact strings: "correct", "right", "wrong", "good answer", "well said", "make sure", "verify", "prove". The word "check" is intentionally excluded from the banned list because it has non-evaluative uses in the surrounding section (e.g., "activation conditions hold").
test_version_bump_sweep — OBSOLETE (2026-05-04)
Spec at draft time assumed extending a pinned-fixture in check_version_consistency.py. PR #33 (2026-04-22) generalised that script to dynamic CHANGELOG-driven version comparison, removing the per-version pinned-fixture pattern. Adding v3.5.1 pinned strings would re-introduce the technical debt the dynamic redesign retired. Skip; the dynamic guard already covers this regression class.
Part of the existing suite invocation (pytest scripts/). No new CI wiring needed — check_version_consistency.py guard already triggers on PR.
feat/v3.5.1-reading-check-probe (already created from main at aded8cc)mainfeat(v3.5.1): opt-in Socratic reading-check probe3.5.0 → 3.5.1deep-research skill: 2.9.0 → 2.9.1The 7 bump sites in this repo (grep targets for check_version_consistency.py):
CHANGELOG.md — new ## [3.5.1] heading + entryREADME.md + README.zh-TW.md — "Version Info" / "版本資訊" section.claude/CLAUDE.md — Skills Overview table version column and "Version Info" footerdeep-research/SKILL.md — frontmatter version: fielddeep-research/references/changelog.md — skill-level entrydocs/ARCHITECTURE.md — any mermaid/table row citing the suite or deep-research versionNot every change touches all seven; the consistency check fails the PR if any site drifts.
This is a public repo. Before git push:
git diff main...HEAD reviewed for PII: school names, person names, internal URLs, real research topics.## [3.5.1] — 2026-04-22
### Added
- **Opt-in Socratic reading-check probe.** When
`ARS_SOCRATIC_READING_PROBE=1` is set, the Socratic Mentor fires a
one-time honesty probe during goal-oriented sessions where the user
has cited a specific paper. The probe asks the user to paraphrase
one passage. Decline is logged without penalty. Outcome is recorded
in the Research Plan Summary and flows into the Stage 6 AI
Self-Reflection Report when the pipeline continues. Default OFF.
Roadmap slot: v3.7.3. See
`deep-research/agents/socratic_mentor_agent.md` §"Optional Reading
Probe Layer".
### Changed
- `deep-research/SKILL.md`, `deep-research/references/socratic_mode_protocol.md`,
`academic-pipeline/references/process_summary_protocol.md` — aligned
text updates for the new probe section. No behaviour change when the
env var is unset.
### Version
- Suite: 3.5.0 → 3.5.1 (patch; opt-in, default OFF, no breaking change)
- `deep-research` skill: 2.9.0 → 2.9.1
After PR merges, update the private roadmap §3.7.3: mark shipped, cite v3.5.1, note that the original "sub-mode + soft-nudge" dual-track was collapsed to Mentor-only.
pytest scripts/ greenscripts/check_version_consistency.py green/simplify on the PR before requesting review (per user's durable instruction).| Risk | Likelihood | Impact | Mitigation |
|---|---|---|---|
| Env var set but intent detector misclassifies user as exploratory → probe never fires | Medium | Low | Mentor documents the gate; user can read Self-Reflection Report and see probe_status=not_fired_exploratory_mode. Troubleshootable. |
| User games the probe by citing a paper they did not read, then offering plausible paraphrase | High | Low | Feature is not a gate; accuracy is for human reader to judge. "Gaming succeeds but yields no benefit" is acceptable. |
| Probe becomes de-facto sycophancy hook (user answers well → Mentor praises) | Medium | High | Banned-phrases list in prompt; test_banned_praise_phrases lint; post-merge manual calibration. |
| Future v3.6.1 Material Passport reset-boundary work wants probe data cross-stage | High | Low | Inline storage now; when Passport schema evolves in v3.6.1, migrate then. Not now. |
| Probe tag format drifts between Mentor emission and Stage 6 pickup | Medium | Medium | test_probe_tag_format lints both sides from one regex source of truth. |
| User runs Socratic-only session (no pipeline), expects probe data somewhere formal | Low | Low | Research Plan Summary is the formal output — probe subsection is right there. Acceptable. |
| Affiliated-institution name or internal topic accidentally used as probe example in prompt / CHANGELOG | Low | High | Pre-push PII diff review (§6.3). |
ARS_SOCRATIC_READING_PROBE unset, deep-research/agents/socratic_mentor_agent.md behaviour is byte-identical to v3.5.0 for all sections outside the new probe layer. Verified by diff.scripts/check_version_consistency.py passes across all 7 bump sites..claude/CLAUDE.md, ROADMAP memory-sync entry all synchronized./simplify review run before marking PR ready.| Decision | Rationale |
|---|---|
Probe target is user-cited papers, not Phase 2 bibliography_agent output |
Mentor lifecycle ends before Phase 2. Extending Mentor across phases violates "minimum surface" and contradicts mode boundaries. User-cited papers are the natural artifact Mentor has access to. |
| Inline storage in Research Plan Summary, not Material Passport | Schema change is out of scope for a patch. Socratic-only sessions don't produce Passport anyway. Self-Reflection Report already reads Mentor output. |
| Goal-oriented only | Exploratory sessions assume the user has not done homework; probe premise fails. Cleaner than trying to gate probe on "only if user cites" because both conditions end up equivalent in practice, and goal-oriented-only better matches the roadmap intent. |
| Single probe per session | Roadmap language: "paraphrase ONE specific paragraph from ONE paper". Multiple probes extend pipeline and violate "non-gate" stance (repeated probes feel like interrogation). |
| Mentor does not verify paraphrase accuracy | Content-check requires the actual paper in context. Out of scope. Feature value comes from the presence/absence/quality of response being visible to later reviewers, not from AI judgement. |
Env var name ARS_SOCRATIC_READING_PROBE |
Matches ARS_* prefix convention (ARS_CROSS_MODEL). Explicit about scope (socratic) and purpose (reading). |
| Version 3.5.1 patch, not 3.6.0 minor | Opt-in, default OFF, zero breaking change. Patch semver is correct. v3.6 slot reserved for long-running-agent harness themes (§3.6.1-3.6.4). |
| Roadmap label "v3.7.3" kept in memory-sync notes, actual release tag is v3.5.1 | Roadmap slot names are organisational markers, not release tags. Decoupling preserves both: roadmap stays readable, semver stays correct. |
| PR not bundled with D (sprint contract) | Sprint contract is large (1-2 days) and touches orchestrator. Bundling would create a PR too large to review, and rollback granularity would suffer. |
docs/design/2026-04-20-v3.4-prisma-trAIce-raise-readcheck-design.md §7.7, §8.2: original v3.5.0 plan (sub-mode + soft-nudge dual-track); partially superseded by this spec.shared/cross_model_verification.md: ARS_CROSS_MODEL env-gating precedent.feedback_version_bump_sweep_checklist.md (private planning notes): 7-site version bump map.project_ars_v3.6_execution_order.md (private planning notes, 2026-04-22): execution order rationale (E → A → B → D) putting this spec as step B.