Back to the catalog

steering-log

A Claude Code plugin that automatically detects and logs human steering moments from AI-assisted development sessions.

Open source Open in the app JSON README (API)

About

A Claude Code plugin that automatically detects and logs human steering moments from AI-assisted development sessions.

Details

Kind
Plugins
Topic
No topic detected
Publisher
hanlogy
Origin
marketplace
Category
ferramentas
Stars
2
Last push
2026-04-18T12:11:44Z
Repository state
ativo
Language
TypeScript
License
MIT
Added
2026-08-30 01:48:58
Updated
2026-08-30 01:48:58
Origin id
hanlogy/steering-log/steering-log

README

# steering-log

A Claude Code plugin that automatically detects and logs moments of human
judgment in a Claude Code session — no manual commands, no interruptions.

Every time you push back, redirect, correct, or assert a preference, it gets
captured and written to a structured episode log inside your project.

> **This plugin was built the way it works — a human steering, Claude
> implementing.**

---

## What It Captures

Not every message — only deliberate technical or process judgments:

| Type         | Example                                                         |
| ------------ | --------------------------------------------------------------- |
| pushback     | "Don't extract that into a utility, keep it inline."            |
| direction    | "We're using JWT, not session auth — stateless architecture."   |
| correction   | "No, the issue is in the middleware layer, not the controller." |
| scope-change | "Forget refresh tokens for now, just do access tokens."         |
| preference   | "We always use `pnpm` in this project."                         |

Weak signals are intentionally ignored: vague disagreements, follow-up
questions, social acknowledgements, and additive requests that simply extend
what was just built.

---

## How It Works

The plugin runs entirely in the background via Claude Code hooks. When you send
a message, a fast Detector agent (Haiku) checks whether it's a steering moment.
If it is, a Summarizer agent (Sonnet) reads the conversation window and writes a
structured entry to your episode log — capturing what you decided and why,
without quoting you directly.

Everything is automatic. Claude Code never pauses, never asks for input.

---

## How to install

- [**Install from GitHub repository**](https://github.com/hanlogy/claude-plugins)

---

## What Gets Created in Your Project

```
{your-project}/
└── steering_log/
    ├── .conversation/
    └── 20260327143200-implement-auth-middleware.md
```

- **`.conversation/`** — plugin-internal state; safe to ignore
- **`{datetime}-{slug}.md`** — one file per episode; a new file starts when the
  current task is done, abandoned, or significantly shifted

---

## Log Example

````markdown
# Implement auth middleware

## 2026-03-27 14:32 direction

### Judgment

Rejected session-based auth in favor of JWT, citing a stateless architecture
requirement.

### Context

Claude was about to scaffold session-based auth using express-session.

## 2026-03-27 14:58 pushback

### Judgment

Rejected the proposed abstraction — wanted token verification inlined rather
than extracted into a shared utility before any other callers existed.

### Context

Claude proposed extracting token verification into a reusable utility
(`src/lib/auth/verifyToken.ts`) and updating the middleware to call it. The
rationale given was consistency with future routes. Only one route existed at
the time. The proposed utility:

```ts
export function verifyToken(token: string): JWTPayload {
  return jwt.verify(token, process.env.JWT_SECRET!) as JWTPayload;
}
```

## 2026-03-27 15:14 scope-change

### Judgment

Narrowed scope to access tokens only, deferring refresh token support.

### Context

Claude was implementing the full token lifecycle including refresh token
rotation.

---

**Result**: completed
````

---

## Episode Lifecycle

Each episode file covers a single task. A new file is created when the
Summarizer detects that the previous task is done, abandoned, or has shifted
significantly. When a new episode begins, the previous file gets a
`**Result**: completed | paused | cancelled | failed` line appended — and is
never modified again.

More