ktg-plugin-marketplace/plugins/graceful-handoff
Kjell Tore Guttormsen 40a82ccdb4 fix(graceful-handoff): model-aware context window detection (v2.1.0)
Stop hook fallback antok 200K-vindu. På Opus 4.7 (faktisk 1M) kunne
auto-handoff fyre 5–7x for tidlig — estimert 70% når reell bruk var
~14%. Erstatter enkel fallback med 4-stegs resolution-kjede:

  1. payload.context_window.used_percentage  (autoritativ)
  2. payload.context_window.context_window_size + transcript-estimat
  3. MODEL_WINDOWS[payload.model.id] + estimat
  4. FALLBACK_WINDOW=1_000_000 + estimat (2026-default)

additionalContext-meldinger inkluderer nå [kilde: <source>] for innsyn.
Brief som kilde-artefakt i docs/brief-context-window-detection.md.
6 nye tester (57 totalt). Ingen regresjoner.
2026-05-01 09:08:24 +02:00
..
.claude-plugin fix(graceful-handoff): model-aware context window detection (v2.1.0) 2026-05-01 09:08:24 +02:00
docs fix(graceful-handoff): model-aware context window detection (v2.1.0) 2026-05-01 09:08:24 +02:00
hooks fix(graceful-handoff): model-aware context window detection (v2.1.0) 2026-05-01 09:08:24 +02:00
scripts feat(graceful-handoff): 2.0 — Stop hook auto-execute + pipeline staging fix [skip-docs] 2026-05-01 06:06:25 +02:00
skills/graceful-handoff feat(graceful-handoff): 2.0 — migrate to skills/ with disable-model-invocation [skip-docs] 2026-05-01 05:45:26 +02:00
tests fix(graceful-handoff): model-aware context window detection (v2.1.0) 2026-05-01 09:08:24 +02:00
CHANGELOG.md fix(graceful-handoff): model-aware context window detection (v2.1.0) 2026-05-01 09:08:24 +02:00
CLAUDE.md fix(graceful-handoff): model-aware context window detection (v2.1.0) 2026-05-01 09:08:24 +02:00
LICENSE feat(graceful-handoff): initial plugin with /graceful-handoff command 2026-04-19 22:54:10 +02:00
README.md fix(graceful-handoff): model-aware context window detection (v2.1.0) 2026-05-01 09:08:24 +02:00

graceful-handoff

Auto-trigger session handoff at context threshold. Manual /graceful-handoff always works. Designet for Opus 4.7.

Problemet: Opus 4.7 fyller kontekstvinduet raskt — ofte innen ~5 minutter for reelt arbeid. Når du er på 60-70% og må starte ny sesjon, er det tre manuelle steg som blir hastverk eller glemt:

  1. Oppsummere hvor arbeidet står (commits, lokale endringer, hva som er testet)
  2. Commite og pushe ferdig arbeid (ellers tapes det)
  3. Skrive en copy-paste-prompt som lar neste sesjon fortsette uten tap

v2.0 fjerner alle tre steg fra brukerens hender:

  • statusLine-hint ved 60% og urgent reminder ved 70% (display-only, trygt)
  • Stop hook auto-eksekvering ved estimert ≥70%: skriver artefakt + commit (push gjenstår — irreversibel handling beholdes manuell)
  • SessionStart auto-load ved source: resume/compact: handoff-innholdet injiseres automatisk i ny sesjon, ingen cat nødvendig
  • Manuell /graceful-handoff fungerer som backup — alltid

Installasjon

claude plugin marketplace add https://git.fromaitochitta.com/open/ktg-plugin-marketplace.git
# Deretter: /plugin install graceful-handoff

Bruk

Manuell trigger

/graceful-handoff

Med slug:

/graceful-handoff refactor-auth

Uten auto-commit:

/graceful-handoff --no-commit

Dry-run:

/graceful-handoff --dry-run

Auto-mode (used internally by Stop hook):

/graceful-handoff --auto --no-push --non-interactive

Automatisk trigger

Ingen handling kreves. Når kontekst krysser estimert 70%, fyrer Stop hook automatisk:

  1. Skriver NEXT-SESSION-PROMPT.local.md
  2. Stager kun handoff-artefakten (IKKE andre dirty filer — eksplisitt fix i v2.0)
  3. Committer
  4. Pusher IKKE — dette gjør du selv når du er klar

Ved ny sesjon (claude --resume), SessionStart hook leser handoff-filen automatisk og injiserer innhold i konteksten. Filen blir deretter renamet til *.archived.local.md for å hindre stale-load.

Arkitektur (v2.0)

skills/graceful-handoff/SKILL.md          # Frontmatter: disable-model-invocation, model: sonnet-4-6
scripts/handoff-pipeline.mjs              # Deterministisk pipeline, returnerer JSON
hooks/scripts/statusline-monitor.mjs      # Display: 60% / 70% hint
hooks/scripts/stop-context-monitor.mjs    # Auto-execute ved estimert ≥70%
hooks/scripts/session-start-load-handoff.mjs  # Auto-load på resume/compact
hooks/hooks.json                          # Registrerer alt

disable-model-invocation: true betyr at Claude IKKE kan invokere skill-en autonomt — bruker må trigge manuelt eller hook må kalle pipeline-skriptet direkte (Stop hook gjør det siste).

Auto-trigger ved kontekst-terskel — hvordan virker det?

Det finnes ingen Claude Code-primitiv som eksponerer real-time kontekst-prosent til hooks (Anthropic har closed feature requests #16988, #27969, #34340). Vi bruker derfor en 4-stegs resolution-kjede (v2.1):

  1. Stop hook fyrer etter hver model-respons og får transcript_path + payload
  2. Resolver kontekstbruk i prioritert rekkefølge:
    • payload.context_window.used_percentage — autoritativ, modell-agnostisk (ingen estimering)
    • payload.context_window.context_window_size + transcript-estimat (chars / 3.5)
    • Modell-mapping: payload.model.id → kjent vindusstørrelse (Opus 4.7=1M, Sonnet 4.6=200k, Haiku=200k)
    • Siste fallback: 1M (oppdatert 2026-default — antar moderne modell)
  3. Ved estimert ≥ 70%: spawner pipeline synkront

Estimerings-pathen (steg 2-4) kan avvike ±10% fra Claude's reelle telling. 70% er konservativt valgt — gir buffer mot drift. Direct-pathen (used_percentage) har ingen drift. additionalContext-meldingen viser hvilken kilde som ble brukt (direct/payload-size/model-map/default-1m) for innsyn.

For å hindre repeat-firing innen samme sesjon: lock-fil <transcript_dir>/.handoff-lock-<session_id> opprettes ved første trigger.

Argumenter

Argument Beskrivelse
[topic-slug] Kebab-case slug. Med slug: NEXT-SESSION-<slug>.local.md. Uten: NEXT-SESSION-PROMPT.local.md
--no-commit Hopp over commit+push. Bruker håndterer commit manuelt
--no-push Commit OK, men ikke push (Stop hook bruker dette)
--dry-run Ingen filer skrives, ingen git-operasjoner
--auto Non-interactive, auto-Y på commit-bekreftelse (kun for hooks)
--non-interactive Uten --auto: feil; med: kjør uten prompts

Frontmatter (SKILL.md)

---
name: graceful-handoff
description: Produser handoff-artefakt, commit+push, og copy-paste-prompt for neste sesjon.
disable-model-invocation: true
model: claude-sonnet-4-6
allowed-tools: Bash(git:*) Bash(jq:*) Bash(node:*) Bash(find:*) Bash(pwd:*) Read Write Glob
---

Merk: allowed-tools er pre-approval, ikke restriction. Den fjerner permission-prompts for listede verktøy, men blokkerer ikke ulistede. For ekte sandbox: bruk project-level permissions.deny rules.

Tidsbudsjett

< 60 sekunder totalt for hele pipelinen (manuell eller auto). Pipeline-skriptet er testbart med node:test uten LLM-kall.

Eksempler

Plugin-arbeid:

cd plugins/llm-security
# ... arbeid frem til 65% kontekst ...
# Auto-trigger: ved 70% fyrer Stop hook automatisk:
#   → skriver plugins/llm-security/NEXT-SESSION-PROMPT.local.md
#   → committer ARTEFAKTEN (ikke andre dirty filer)
#   → IKKE pusher (du gjør det selv)
git push  # når klar

Manuell trigger med flagg:

/graceful-handoff refactor-auth --no-commit
# → skriver plugins/<rot>/NEXT-SESSION-refactor-auth.local.md
# → ingen git-operasjoner

Ny sesjon:

claude --resume
# SessionStart hook auto-injiserer handoff-innholdet i konteksten
# Du kan starte å jobbe direkte

Tester

node --test plugins/graceful-handoff/tests/

36 tester på tvers av:

  • skill-structure.test.mjs — frontmatter + commands/-fjerning (8)
  • scripts/handoff-pipeline.test.mjs — pipeline JSON, idempotens, no-staging-regression, edge cases (11)
  • hooks/statusline-monitor.test.mjs — terskler, null payload, malformed JSON (9)
  • hooks/stop-context-monitor.test.mjs — estimering, lock-fil, stub pipeline (7)
  • hooks/session-start-load-handoff.test.mjs — source filter, multi-level search, archive (9)
  • plugin-manifest.test.mjs — plugin.json schema, CHANGELOG (6)

Begrensninger og åpne antakelser

  • statusLine-plassering i hooks/hooks.json er en åpen antakelse. Verifiser med smoke-test; fallback er å flytte til global ~/.claude/settings.json.
  • Token-estimering ±10% mot Claude's reelle telling. 70%-tersklen er konservativ.
  • Issue #26251disable-model-invocation: true regression kan blokkere user-invocation. Manuell smoke-test før du stoler på det.
  • Push gjenstår alltid manuell. Auto-eksekvering pusher ALDRI — irreversibel handling beholdes hos bruker.
  • Auto-trigger respekterer pre-commit hooks (secrets, pathguard) — bypasser ALDRI med --no-verify.

Sikkerhet

  • Pipeline stager kun handoff-artefakten + REMEMBER.md/TODO.md (hvis de finnes). Stagger ALDRI andre dirty filer (regression-test håndhever dette).
  • Filer er *.local.md → matches av .gitignore-mønstre i alle prosjekter
  • Ingen nettverks-kall (ingen WebSearch, ingen Agent-delegering)
  • Bash sub-scoped: Bash(git:*), Bash(jq:*), Bash(node:*), Bash(find:*), Bash(pwd:*)

Lisens

MIT