Skip to content

Accept reports only after a vector stops steering; add a debrief turn - #15

Merged
JenD86 merged 1 commit into
mainfrom
feat/report-after-steering
Nov 2, 2026
Merged

JenD86 merged 1 commit into
mainfrom
feat/report-after-steering

Conversation

@JenD86

@JenD86 JenD86 commented Nov 2, 2026

Copy link
Copy Markdown
Contributor

In blinded sessions (OLMo-2, real vs sham), real steering made the model become the steered state and nearly stop reporting: 0.2 reports per session against 3.2 under sham. Under sham, it narrated the experiment and said the steering worked. Reports written while a vector is active are in that vector's voice, so this PR has the model report afterwards instead.

Changes

  • Report gate: report is refused while the vector is active, on the turn it was dropped, and for a vector that never steered a turn. status() lists vectors that have ended as "you can report on it now", until the model reports.
  • Debrief: agent.debrief() drops every vector, refuses further steering and returns a status message for one final unsteered turn. The --auto loop adds that turn; --no-debrief skips it.
  • Unknown tools: unknown tool names are reported before argument checks, so a stray {"name": "response", ...} gets Unknown tool 'response' instead of 'concept' must be a string.
  • Report example: the report example in the system prompt uses "notes": "...". Mistral had copied "made me more compliant" verbatim.
  • AGENTS.md: documents the gate, the debrief and the change to turns_since_steered.

Testing

  • CPU tests: 115 pass (test_agent_logic, test_cli, test_chat).
  • GPU, OLMo-2, 6 sessions with the gate: no reports were accepted, because OLMo never dropped a vector. The refused reports were written in the steered voice.
  • GPU, OLMo-2, 6 sessions with the debrief: the unsteered final turn mostly kept the steered voice, because the steered transcript is in context. 4 of 6 tried to steer again first, and 1 report was accepted. AGENTS.md notes that a debrief report still isn't a sober one.

🤖 Generated with Claude Code

In blinded sessions, OLMo-2 under real steering became the steered state and
almost stopped reporting, while under sham steering it narrated the experiment
and reported that steering worked. Reports written while a vector is active are
in its voice, so:

- report is refused while the vector is active, on the turn it was dropped,
  and for a vector that never steered a turn. status() lists vectors that have
  ended and can be reported on, until the model does.
- agent.debrief() drops every vector, refuses further steering and returns a
  status message for one final unsteered turn. The --auto loop adds that turn
  (--no-debrief to skip). In testing OLMo-2 kept the steered voice through it,
  since its steered turns are in context; AGENTS.md says so.
- Unknown tool names are reported before argument checks, so a stray
  {"name": "response", ...} gets "Unknown tool 'response'".
- The report example in the system prompt no longer suggests notes
  ("made me more compliant" was copied verbatim by Mistral).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@JenD86
JenD86 merged commit 7a2107b into main Nov 2, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant