{
  "markdown": "# steering-log\n\nA Claude Code plugin that automatically detects and logs moments of human\njudgment in a Claude Code session — no manual commands, no interruptions.\n\nEvery time you push back, redirect, correct, or assert a preference, it gets\ncaptured and written to a structured episode log inside your project.\n\n> **This plugin was built the way it works — a human steering, Claude\n> implementing.**\n\n---\n\n## What It Captures\n\nNot every message — only deliberate technical or process judgments:\n\n| Type         | Example                                                         |\n| ------------ | --------------------------------------------------------------- |\n| pushback     | \"Don't extract that into a utility, keep it inline.\"            |\n| direction    | \"We're using JWT, not session auth — stateless architecture.\"   |\n| correction   | \"No, the issue is in the middleware layer, not the controller.\" |\n| scope-change | \"Forget refresh tokens for now, just do access tokens.\"         |\n| preference   | \"We always use `pnpm` in this project.\"                         |\n\nWeak signals are intentionally ignored: vague disagreements, follow-up\nquestions, social acknowledgements, and additive requests that simply extend\nwhat was just built.\n\n---\n\n## How It Works\n\nThe plugin runs entirely in the background via Claude Code hooks. When you send\na message, a fast Detector agent (Haiku) checks whether it's a steering moment.\nIf it is, a Summarizer agent (Sonnet) reads the conversation window and writes a\nstructured entry to your episode log — capturing what you decided and why,\nwithout quoting you directly.\n\nEverything is automatic. Claude Code never pauses, never asks for input.\n\n---\n\n## How to install\n\n- [**Install from GitHub repository**](https://github.com/hanlogy/claude-plugins)\n\n---\n\n## What Gets Created in Your Project\n\n```\n{your-project}/\n└── steering_log/\n    ├── .conversation/\n    └── 20260327143200-implement-auth-middleware.md\n```\n\n- **`.conversation/`** — plugin-internal state; safe to ignore\n- **`{datetime}-{slug}.md`** — one file per episode; a new file starts when the\n  current task is done, abandoned, or significantly shifted\n\n---\n\n## Log Example\n\n````markdown\n# Implement auth middleware\n\n## 2026-03-27 14:32 direction\n\n### Judgment\n\nRejected session-based auth in favor of JWT, citing a stateless architecture\nrequirement.\n\n### Context\n\nClaude was about to scaffold session-based auth using express-session.\n\n## 2026-03-27 14:58 pushback\n\n### Judgment\n\nRejected the proposed abstraction — wanted token verification inlined rather\nthan extracted into a shared utility before any other callers existed.\n\n### Context\n\nClaude proposed extracting token verification into a reusable utility\n(`src/lib/auth/verifyToken.ts`) and updating the middleware to call it. The\nrationale given was consistency with future routes. Only one route existed at\nthe time. The proposed utility:\n\n```ts\nexport function verifyToken(token: string): JWTPayload {\n  return jwt.verify(token, process.env.JWT_SECRET!) as JWTPayload;\n}\n```\n\n## 2026-03-27 15:14 scope-change\n\n### Judgment\n\nNarrowed scope to access tokens only, deferring refresh token support.\n\n### Context\n\nClaude was implementing the full token lifecycle including refresh token\nrotation.\n\n---\n\n**Result**: completed\n````\n\n---\n\n## Episode Lifecycle\n\nEach episode file covers a single task. A new file is created when the\nSummarizer detects that the previous task is done, abandoned, or has shifted\nsignificantly. When a new episode begins, the previous file gets a\n`**Result**: completed | paused | cancelled | failed` line appended — and is\nnever modified again.\n",
  "bytes": 3639,
  "sha": "a7dcfcc657670f3e12622020866e0a4a174c3ae0228135274c1fb01ba52a729a",
  "repo_slug": "hanlogy/steering-log",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/plg_hanlogy_steering_log_steering_log_1f771798/readme"
}