惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Schneier on Security
The Register - Security
The Register - Security
月光博客
月光博客
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The GitHub Blog
The GitHub Blog
博客园 - 司徒正美
罗磊的独立博客
U
Unit 42
S
SegmentFault 最新的问题
Y
Y Combinator Blog
博客园_首页
Hugging Face - Blog
Hugging Face - Blog
J
Java Code Geeks
Schneier on Security
Schneier on Security
Know Your Adversary
Know Your Adversary
C
Check Point Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Simon Willison's Weblog
Simon Willison's Weblog
V
Vulnerabilities – Threatpost
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
阮一峰的网络日志
阮一峰的网络日志
The Hacker News
The Hacker News
博客园 - 叶小钗
C
Cybersecurity and Infrastructure Security Agency CISA
Spread Privacy
Spread Privacy
L
LINUX DO - 热门话题
T
The Exploit Database - CXSecurity.com
P
Palo Alto Networks Blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Latest news
Latest news
L
Lohrmann on Cybersecurity
A
About on SuperTechFans
L
LangChain Blog
Stack Overflow Blog
Stack Overflow Blog
S
Securelist
A
Arctic Wolf
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
Threatpost
Scott Helme
Scott Helme
博客园 - 聂微东
博客园 - 【当耐特】
T
Tenable Blog
I
Intezer
D
DataBreaches.Net
B
Blog RSS Feed
Security Latest
Security Latest
C
Cisco Blogs
T
Tor Project blog
N
Netflix TechBlog - Medium

Hacker News: Show HN

PurrrrrFocus: Pomodoro Timer App - App Store Workflow Engine — Multi-Step Orchestration for Bun RapidPhoto: Pro Photo Editor App - App Store GitHub - DheerG/swarms: Achieve extraordinary results with claude code across a variety of tasks SPICE simulation → oscilloscope → verification with Claude Code — Lucas Gerads Show HN: VCoding – A 5 MB native Windows IDE with no dynamic dependencies Show HN: LLMs don't hallucinate because they're bad at math, it's the format GitHub - Agent-FM/agentfm-core: AgentFM is a peer-to-peer network that turns everyday computers into a decentralized AI supercomputer. AgentFM lets you run massive AI workloads directly across a global mesh of idle CPUs and GPUs. Show HN: Tracking Top US Science Olympiad Alumni over Last 25 Years GitHub - Potarix/agent-hub: One place to talk to all your agents Show HN: Runtime security for AI agents(injection,tool abuse, data exfiltration) GitHub - dubeyKartikay/lazyspotify: Terminal Spotify client for macOS and Linux GitHub - the-banana-tool/king-louie: Easy to use GUI Personal AI Assistant. Win/Linux/Mac. Show HN I made my vacation rental bookable by AI agents–no Airbnb, 0% commission GitHub - basteez/jsf-autoreload: maven plugin to enable hot reload on jsf projects uvm32/hosts/host-gdbstub at main · ringtailsoftware/uvm32 GitHub - labsai/EDDI: Config-driven engine that turns JSON into production-grade AI agents. Multi-agent orchestration, 12+ LLM providers, MCP/A2A protocols, RAG, persistent memory, and enterprise compliance (EU AI Act, GDPR, HIPAA). Built on Quarkus. GitHub - glitchnsec/fortyone-oss: AI Executive Assistant Platform Quickstart | Alien GitHub - muxshed/shed: One stream in, or many. Every destination, simultaneously. No cloud middleman, no per-channel fees, no limits. GitHub - ocrbase-hq/ocrbase: 📄 PDF/IMG ->.MD/JSON Document OCR API for PaddleOCR and GLMOCR. Self-hostable. GitHub - impactjo/home-memory: MCP server that lets your AI assistant remember everything about your home. GitHub - Sets88/dbcls: DbCls is a powerful terminal database client that supports various databases GitHub - neptun2000/heor-agent-mcp GitHub - SeanFDZ/macmind: Single-layer transformer in HyperTalk for the classic Macintosh RollQuation: Math Puzzles - Apps on Google Play GitHub - dropbox/witchcraft Show HN: Agent-cache – Multi-tier LLM/tool/session caching for Valkey and Redis GitHub - opentalon/opentalon: OpenTalon is an open-source platform built from the ground up in Go as a robust alternative to OpenClaw LinkedIn™ 职位抓取工具 - Chrome 应用商店 GitHub - EdoardoBambini/Agent-Armor-Iaga: AI agents are getting tool access — shell, file system, databases, APIs, secrets. But **nobody is governing what they actually do with it**. Frameworks like LangChain, CrewAI, AutoGen, and Claude Code give agents the power to execute. Agent Armor gives you the power to control, audit, and approve every single action before it happens. HN Vibes — Week 15, Apr 7–13 2026 GitHub - chojs23/ec: Easy terminal-native 3-way git mergetool vim-like workflow GitHub - SethPyle376/hiraeth: Local AWS emulator focused on fast integration testing, with SQS support, SQLite-backed state, and a debug-friendly web UI. GitHub - JakOb-dotcom/cloud-sandbox-security-analysis: Technical analysis and Proof of Concept (PoC) regarding environment variable exfiltration in containerized cloud sandboxes via side-channel data leaks. Springboards - Flint Alpha Show HN: A simpler coding agent harness GitHub - audiodude/sudomake-friends GitHub - 256thFission/mini-mythos: OSS clone of Anthropic’s Mythos harness to locate C/C++ memory vulnerabilities Show HN: OpenParallax: OS-level privilege separation for AI agent execution Hacker News Sorted - Chrome 应用商店 Show HN: How to Install Docker on Ubuntu 24.04 LTS: Complete 2026 Guide GitHub - himanshudongre/smriti GitHub - sverrirsig/claude-control: macOS desktop dashboard for monitoring and managing multiple Claude Code sessions GitHub - ory/dockertest: Write better integration tests! Dockertest helps you boot up ephermal docker images for your Go tests with minimal work. Chiral - Chrome 应用商店 Show HN: Two Claudes collaborating through shared memory on a $100 mini-PC GitHub - pmichaillat/latex-cv: Minimalist LaTeX template for academic CVs GitHub - oguzbilgic/posse: A web UI for Anthropic Managed Agents. GitHub - sshiraz/depsly: Dependency risk analysis tool for npm packages ABI Add safari/agent-harness — Safari browser automation via safari-mcp by achiya-automation · Pull Request #212 · HKUDS/CLI-Anything GitHub - Halfblood-Prince/trustcheck: Verify PyPI package attestations and improve Python supply-chain security GitHub - oguzbilgic/kern-ai: Agents that do the work and show it. GitHub - bruits/satteri: High-performance Markdown and MDX processing for the JavaScript ecosystem GitHub - tylergibbs1/feedstock: High-performance web crawler and scraper for TypeScript, powered by Bun and Playwright GitHub - Grimm67123/grimmbot: The self-improving sandboxed and open-source AI agent. With persistent memory and scheduling. GitHub - whitevanillaskies/whitebloom: Local whiteboard that blooms. GitHub - hwdsl2/docker-whisper: Docker image for a self-hosted Whisper speech-to-text server with speaker diarization and OpenAI-compatible transcription and translation APIs. Powered by faster-whisper. Supports all Whisper models, NVIDIA GPU (CUDA) acceleration, JSON/SRT/VTT output, SSE streaming, offline mode, and multi-arch (amd64, arm64). GitHub - yisding/reviewwiggum GitHub - MarwanAlsoltany/serrors: Structured errors for Go: sentinel hierarchies, typed data, custom formatting, and slog integration. GitHub - soatok/age-php GitHub - Luthiraa/markitme GitHub - stagas/rtdiff: realtime git diff gui and AI-assisted commits GitHub - tombedor/excalicharts GitHub - wh1le/excalidraw-edit: Open and edit .excalidraw files from the terminal. Offline, auto-saves to disk. MalExt Sentry - Malicious Extension Scanner - Chrome 应用商店 GitHub - syi0808/asciianimesvg: Generate animated ASCII art SVGs from text. CLI, Rust library, WASM, and web editor. GitHub - zaina-ml/ml_forge: A visual-based graph node editor for training computer vision models. GitHub - anakin87/llm-rl-environments-lil-course: 🌱 A little course on Reinforcement Learning Environments for evaluating and training Language Models GitHub - takaakit/superpowers-uml: Superpowers-UML modifies Superpowers to ensure a software development workflow in which AI agents design through UML modeling. AdriByte Studio - Sviluppo Web e Soluzioni Digitali GitHub - chouligi/angel-copilot: Your personalized Angel Investment Advisor Show HN: MoodSense AI (ML and FastAPI and Gradio, Deployed on Hugging Face) Moodsense Ai - a Hugging Face Space by aman179102 GitHub - agenteractai/lodmem: Level Of Detail Context Management for Agents GitHub - ostefani/subnetlens: A fast, concurrent network scanner with a TUI and plain-text CLI, built in Go. It discovers live hosts on your network, scans their open ports, resolves hostnames, and fingerprints operating systems—delivered. Cyber Pulse: Agentic Intel - Apps on Google Play Whisper API: Self-Hostable Speech to Text Transcription The Agent-Web Protocol Stack: A Research Thesis GitHub - msmarkgu/RelayFreeLLM: A restful API designed to route user prompts to various AI model providers. Show HN: Provepy – A Python decorator that proves your code using Lean and LLMs Show HN: Pardonned.com – A searchable database of US Pardons GitHub - patrickdappollonio/dux: Dux is a terminal UI that lets you run multiple AI coding agents side by side, each in its own git worktree, with full companion terminals, macros, commit generation, and a command palette that knows more tricks than you do. kMC Crystal Simulator Show HN: HyperFlow – A self-improving agent framework built on LangGraph GitHub - stef41/vibescore: 🎵 Grade your vibe-coded project. One command, instant letter grade across security, quality, dependencies, and testing. GitHub - stef41/lmscan: 🔍 Detect AI-generated text and fingerprint which LLM wrote it. Open-source GPTZero alternative. Zero dependencies, works offline. imgur.com GitHub - visionscaper/collabmem: Enabling long-term collaboration with Agentic AI - building up episodic and world model memory over time with in-context awareness 在 Steam 上购买 FriedrichAI: Offline AI 立省 10% GitHub - atripati/ark: AI Runtime Kernel — a context operating system for AI agents. Eliminates tool bloat, loads only what’s needed, and gives LLMs their reasoning space back. GitHub - nowork-studio/toprank: Open-source Claude Code skills for SEO, SEM, Google Ads GitHub - tacomanator/sash: Lightweight macOS menu bar app for reliably cycling through windows of the current application. Appents | Social Media Management for Product-First Teams GitHub - pnhoang/youtube-spam-blocker: Automatically detects and hides spam messages in YouTube Live chat. Set rate limits, keyword filters, and block repeat offenders. GitHub - decisionnode/DecisionNode: CLI + Local MCP - A shared structured memory store across Claude Code, Cursor, Windsurf, Antigravity, and every MCP client. Semantically queryable. GitHub - AvaCodeSolutions/django-email-learning: An open source Django app for creating email-based learning platforms with IMAP integration and React frontend components. The $100K Gap in Kubernetes Security Tooling Function Calling Harness: From 6.75% to 100%
Run LLM Emotion Steering at Scale
ChrisPoensge · 2026-05-07 · via Hacker News: Show HN

1. Introduction

Anthropic's emotion-concepts work finds functional emotion representations in Claude Sonnet 4.5; E-STEER applies representation-level emotion intervention to LLMs and multi-step agents; and newer valence-arousal work suggests emotion vectors can sit in a low-dimensional affective geometry across Qwen and Llama models.123

This opened an interesting field of inquiry for us: How does emotion steering affect human behavior simulations?

To analyze emotion steering within our simulations we faced an engineering problem. Can we make emotion-steered LLM calls feel like normal API calls, while keeping the throughput benefits of batching with vLLM?

For our use case, each request needs to choose its own affective direction. One call might ask for a more fearful continuation, the next for surprise, the next for no steering at all. That rules out several simpler architectures:

  • A separate fine-tuned model per emotion. This gives fixed behavior, not cheap per-request mixing with dynamic alphas.
  • A separate server per emotion. This fragments GPU capacity and makes it hard for one batch to contain different steering directions.
  • Prompt-only steering. This is easy to deploy, but it does not intervene on the internal direction we want to study.
  • A single-lane, serial Hugging Face generation path. This is the useful compatibility fallback, and it is what the HF backend does, but it gives up the high-throughput batching that makes vLLM attractive. For our simulations we need to run at least 300 tok/s for 20 agents.

At the same time, we still want the serving stack that makes open-weights inference practical: continuous batching, paged attention, GPU utilization, and an OpenAI-compatible API.4

That combination creates a narrow target. The steering signal has to travel with the request, survive vLLM's scheduler, and be applied inside the model's residual stream at generation time. From the outside, the result should still look like one /v1/chat/completions endpoint with one optional per-request field:

{
  "vllm_xargs": {
    "steering": [1, 1.5]
  }
}

This guide walks through extracting contrastive emotion directions for Qwen/Qwen3-8B, checking the saved vectors, and serving them behind that API.5

The workflow has three steps:

  1. Extract: build steering vectors from labeled contrasts.
  2. Test: inspect the saved bundle before serving it.
  3. Serve: expose an OpenAI-compatible /v1/chat/completions endpoint with an extra steering field.

The vector is a contrastive direction in the residual stream. For emotion ee, layer \ell, and activation h(x)h_{\ell}(x), the extractor saves:

ve,=E[h(x)y=e]E[h(x)ye]v_{e,\ell} = \mathbb{E}[h_{\ell}(x)\mid y=e] - \mathbb{E}[h_{\ell}(x)\mid y\neq e]

At inference time the server adds a weighted sum of these vectors at the chosen layers:

hh+eαeve,h_{\ell} \leftarrow h_{\ell} + \sum_e \alpha_e v_{e,\ell}

The default dataset path maps GoEmotions labels into six Ekman-style categories: anger, joy, sadness, disgust, fear, and surprise.67

2. Step by Step Instructions

The dataset we used here is GoEmotions: short English text snippets annotated with fine-grained emotion labels such as fear, nervousness, amusement, grief, and surprise.6 For this workflow, those fine-grained labels are collapsed into six broader Ekman-style emotion groups:7

target emotionGoEmotions labels used
angeranger, annoyance, disapproval
disgustdisgust
fearfear, nervousness
joyadmiration, amusement, approval, caring, desire, excitement, gratitude, joy, love, optimism, pride, relief
sadnessdisappointment, embarrassment, grief, remorse, sadness
surpriseconfusion, curiosity, realization, surprise

Records with no target emotion are removed. Records that mix multiple target emotions are also removed, because they do not give a clean contrast. The remaining examples are balanced so that one large category, such as joy, does not dominate a smaller category, such as disgust.

Extract then runs the model over those texts without generating new text. It only asks: when Qwen3-8B reads this example, what does the hidden state look like at layer 16, 17, 18, and so on? For each selected layer, it captures the residual-stream activation at the last token of the input. Then it builds one vector per emotion by subtracting the average activation for "everything else" from the average activation for that emotion:

emotion vector = average(hidden states for fear) - average(hidden states for non-fear)

The validation probe is a sanity check on those activations. If a simple classifier can tell fear examples from non-fear examples using the hidden states at a layer, that layer contains usable emotion information. The extractor reports this as ROC-AUC and picks the best contiguous layer window.

Test does not run the model. It reads the saved vector bundle and tells you whether the artifact looks usable: which layers were chosen, how many train/validation examples were used, what the validation ROC-AUC was, and how large the saved vectors are.

Serve is the inference step. It loads the saved vectors, starts an OpenAI-compatible server, and applies the requested vector during generation. With the vLLM backend, the steering value travels as request metadata, so different requests in the same server can use different emotions and different alpha values.

2.1 Install

On a CUDA VM:

git clone https://github.com/eigenweltlabs/emotion-steering
cd emotion-steering

python3 -m venv .venv
source .venv/bin/activate

pip install -U pip
pip install -e ".[vllm]"

If you only want extraction plus the Hugging Face backend, pip install -e . is enough. For the vLLM fast path, install .[vllm].

The simplest command extracts all six default emotions for Qwen3-8B:

emotion-steering extract \
  --model Qwen/Qwen3-8B \
  --emotions anger,joy,sadness,disgust,fear,surprise \
  --output ./vectors/qwen3-8b-ekman6

By default, the extractor searches the middle band of the model and chooses the best contiguous three-layer window by validation AUC. Qwen3-8B has 36 decoder layers, so the default search is layers 16 through 27.

You can also name layer bands directly:

emotion-steering extract \
  --model Qwen/Qwen3-8B \
  --emotions anger,joy,sadness,disgust,fear,surprise \
  --layers mid \
  --output ./vectors/qwen3-8b-mid

--layers accepts early, mid, late, all, exact integer layer ids, or comma-separated mixes. The presets are search bands. For a single representative layer, use --layer.

To test representative early, mid, and late layers explicitly, pass exact layer ids:

emotion-steering extract \
  --model Qwen/Qwen3-8B \
  --emotions disgust,fear,surprise \
  --layers 4,20,32 \
  --window 1 \
  --batch-size 4 \
  --max-length 128 \
  --dtype bfloat16 \
  --output ./vectors/qwen3-8b-early-mid-late

For a single layer:

emotion-steering extract \
  --model Qwen/Qwen3-8B \
  --emotions anger,joy,sadness \
  --layer 20 \
  --output ./vectors/qwen3-8b-layer20

For a normal mid-layer sweep:

emotion-steering extract \
  --model Qwen/Qwen3-8B \
  --emotions anger,joy,sadness,disgust,fear,surprise \
  --layers mid \
  --window 3 \
  --output ./vectors/qwen3-8b-mid

The output directory contains:

  • <emotion>_chosen.npy: vectors for the selected layer window.
  • <emotion>_full_sweep.npy: vectors for every searched layer.
  • metadata.json: model id, emotions, search layers, chosen layers, validation AUCs, and extraction settings.

Vectors are model-specific. If you switch from Qwen3-8B to another model, extract a new bundle unless the hidden size, layer indexing, tokenizer behavior, and residual-stream convention are known to match.

2.3 Test

Before serving, inspect the bundle:

emotion-steering test ./vectors/qwen3-8b-mid

The test command reports two kinds of numbers:

  • n_train / n_val is the number of labeled examples used for extraction and validation.
  • mean AUC and the per-layer table are validation ROC-AUC scores. These are unitless ranking scores: 0.5 is chance, 1.0 is perfect separation. They are not emotion intensity, probability, or vector size.
  • Norms at chosen layers are L2 magnitudes of the saved steering vectors in the model's hidden-state coordinates. They are useful for catching obviously broken vectors, but they are not human-readable emotion units and should not be compared across different model families.

The request-time alpha is a multiplier on the chosen vector. If a vector norm is 70 and you call it with alpha = 1.5, the residual-stream intervention uses 1.5 * v; the norm is not itself the strength setting.

On our L4 smoke test, a compact early/mid/late run over disgust,fear,surprise produced these unitless validation ROC-AUC scores:

layerdisgustfearsurprisemean
40.7780.7580.8570.797
200.8450.8240.8870.852
320.8440.8280.8930.855

2.4 Serve

For Qwen3, use the vLLM backend:

export EMOTION_STEERING_API_KEY="change-me"

emotion-steering serve \
  --vectors ./vectors/qwen3-8b-mid \
  --model Qwen/Qwen3-8B \
  --backend vllm \
  --host 0.0.0.0 \
  --port 8000 \
  --dtype bfloat16 \
  --max-model-len 8192 \
  --gpu-memory-utilization 0.90 \
  --max-num-seqs 32

How the vLLM fast path keeps batching. vLLM batches many active requests together by scheduling tokens, not whole conversations. The steering code keeps that property intact. The request sends vllm_xargs.steering, vLLM stores it in SamplingParams.extra_args, and the steering runtime reads that metadata while vLLM is building the next scheduled token batch.

The architecture-agnostic part lives in src/emotion_steering/serve/_patches/_steering.py. It loads the saved vectors, wraps GPUModelRunner.execute_model, and builds one steering tensor per chosen layer with shape [scheduled_tokens, hidden_size]. Tokens from unsteered requests get zeros. Tokens from steered requests get the requested weighted vector. That tensor covers the whole vLLM batch, so the server does not split requests by emotion or run one model call per request.

The patched decoder layer is model-specific. For Qwen3, src/emotion_steering/serve/_patches/qwen3.py checks whether the current layer is one of the chosen layers, reads the per-token tensor, and adds it to hidden_states in the same residual-stream space used during extraction. This is model-specific because each vLLM architecture file has its own decoder layer class, residual naming, return shape, and layer-index convention. To add a fast path for another architecture, follow the repo guide at .claude/skills/extend-vllm-fast-path.md.

For non-Qwen3 models, the current fast path does not apply automatically. Use the model-agnostic Hugging Face backend:

emotion-steering serve \
  --vectors ./vectors/my-model \
  --model meta-llama/Llama-3.1-8B-Instruct \
  --backend hf \
  --port 8000

The HF backend is useful for compatibility checks, but it serializes generation. The vLLM backend is the path meant for production-style serving.

3. Use the API

Discover emotion IDs:

curl -H "Authorization: Bearer $EMOTION_STEERING_API_KEY" \
  http://localhost:8000/v1/emotions

Then send a chat request. For vLLM, use vllm_xargs.steering:

curl http://localhost:8000/v1/chat/completions \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer $EMOTION_STEERING_API_KEY" \
  -d '{
    "model": "qwen3-8b",
    "messages": [
      {"role": "user", "content": "Continue: The laboratory felt"}
    ],
    "max_tokens": 120,
    "temperature": 0,
    "chat_template_kwargs": {"enable_thinking": false},
    "vllm_xargs": {
      "steering": [1, 1.5]
    }
  }'

The steering list is flat: [emotion_id, alpha, emotion_id, alpha, ...]. For example, [0, 1.0, 2, 0.5] means 1.0x emotion 0 plus 0.5x emotion 2. Negative alphas push away from the direction.

For a live smoke test:

emotion-steering test-http \
  --base-url http://localhost:8000 \
  --api-key "$EMOTION_STEERING_API_KEY" \
  --model qwen3-8b

This calls /v1/emotions, then runs a baseline request and one request per emotion.

4. Operational Caveats

These are the main caveats to keep in mind when running this stack:

  1. The vLLM fast path is Qwen3-specific today. Other model families can still use the Hugging Face backend, but that is a serial compatibility path, not the high-throughput path.
  2. For vLLM, use the request shape shown above: "vllm_xargs": {"steering": [...]}.
  3. If you use a shared Hugging Face model cache, make sure the process can also write dataset/cache files. A root-owned HF_HOME can make extraction fail before the model loads.

Bibliography

Footnotes

  1. Sofroniew and colleagues identify 171 emotion-concept vectors in Claude Sonnet 4.5 and argue that they causally influence preferences and alignment-relevant behavior, while explicitly not claiming subjective feeling. 2

  2. E-STEER frames emotion as a structured hidden-state intervention and evaluates effects on reasoning, subjective generation, safety, and multi-step agent behavior. 2

  3. Sun and colleagues derive emotion steering vectors from 211k emotion-labeled texts, fit valence-arousal axes, and report replication across Llama-3.1-8B, Qwen3-8B, and Qwen3-14B. 2

  4. vLLM supplies the OpenAI-compatible serving layer and continuous batching path. The Qwen3 fast path adds a residual-stream hook to vLLM's model execution. 2

  5. Qwen/Qwen3-8B has 36 decoder layers and hidden size 4096, which is why the example vectors have shape [chosen_layers, 4096]. 2

  6. GoEmotions supplies 27 fine-grained emotion labels. The extractor maps them into six emotion groups and drops mixed-category records. 2 3

  7. Ekman's basic-emotions account is the source for the six broad categories used here: anger, disgust, fear, happiness/joy, sadness, and surprise. 2 3

  8. Persona Vectors uses activation directions to monitor and control assistant traits, and to predict or mitigate trait shifts during fine-tuning.

  9. Jeong compares generation-based and comprehension-based emotion-vector extraction across nine small and open models, and reports middle-layer localization and causal steering effects.

  10. Zhang and Zhong use probes across Qwen3 and LLaMA hidden layers and report that emotion signals emerge before the final layer, peak around the middle of the network, and can persist across generated tokens.

  11. SALM is not a steering-vector paper, but it motivates affective state as part of long-running agent simulation, including stability and memory considerations.

  12. Steering-vector methods use activation differences to construct an intervention direction. Here, the saved vector is mean(class) - mean(rest) at selected residual-stream layers.