util-0-v2-handover

star 5

Generate a domain-aware handover document for LLM agent continuity. V2 standalone rewrite.

jakkaj By jakkaj schedule Updated 6/11/2026

name: util-0-v2-handover description: Generate a domain-aware handover document for LLM agent continuity. V2 standalone rewrite.

Please deep think / ultrathink as this is a complex task.

util-0-v2-handover

A conversation+code compaction handover that another LLM can paste in and resume immediately. V2 adds optional domain context so the receiving agent understands domain boundaries, ownership, and contracts.

CLI /util-0-v2-handover --plan "" # optional; used only for pointers/anchors --phase "" # optional; defaults to current/latest --format "compact|lean|json" # default: compact --max 1400 # token cap (default 1400; hard stop 1600) --domain "" # optional; scope handover to a specific domain

Hard Rules

Memory only: Do not open files or call tools. Summarize from session memory.

No scaffolding noise: No “Read…”, “Working…”, diffs, mermaid, stack traces, or step logs.

Pointers, not payloads: If a detail isn’t remembered, write ? and add a pointer in Refs (plan §/dossier/log).

Status tokens: [ ] pending, [~] in‑progress, [x] complete, [!] blocked.

Context protection: Obey strict caps; keep strings short (≤12 words) and lists Top‑N only.

Deterministic: Natural sort for IDs; consistent key order.

Entity preservation: File paths, function names, task IDs, decision IDs, and CLI commands MUST be preserved VERBATIM. Never paraphrase these — copy exactly or write “?”.

Two‑Stage Generation (single response)

Internal consolidation (silent): Think forward — what will the receiving agent need to DO next?

  1. Ask: “What 5 questions will the next agent ask in their first 30 seconds?”
  2. Recover: user’s explicit requests (quote key lines), decisions + rationale, code state, failed attempts, and blockers that answer those questions.
  3. Identify ≤5 immutable facts and ≤3 verbatim user constraints for the anchors section.

Emit summary: Output one artifact in the requested format using the schema below. If near --max, drop lowest‑priority sections in the Trim Order.

Output Formats A) --format compact (default; tight and skimmable)

HOVR/2 microformat with short keys and capped lists. One fenced block; no extra text.

HOVR/2 m:{ts:"", plan:"<path or ?>", phase:"", feat:"<slug or ?>", prog:"<x/y or %>", domain:"<slug or ? — optional>"}

intent:{ primary:"", quotes:["", ...≤2], scope:["<in/out of scope>", ...≤3] }

timeline:{ just_completed:"<last task/action finished with ID>", current:"", last_actions:["", ...≤4] }

concepts:{keys:["<key concept [domain]>", ...≤6]}

code:{ files:["<abs path or ?>", ...≤8], hot:["@+n/-m or 'hot'>", ...≤6], domain_dirs:{"":"

", ...≤6} }

decisions:{ adrs:[["ADR-####","", "affects ", "<domain — optional>", "<why ≤8w>"], ...≤4], other:[["","", "", "<why ≤8w>"], ...≤6] }

tasks:{ done:[ids…≤8], ip:[ids…≤5], pend:[ids…≤10], blk:[["",""], ...≤3], critdeps:[["T033","T032"], ...≤5] }

tests:{unit:"pass|fail|mixed|?", integ:"pass|fail|mixed|?", cov:"<%|?>", notes:"<≤80 chars>"}

risks:[["", "", "", "<domain — optional>"], ...≤5]

fails:[["","",""], ...≤4]

anchors:{ immutable:["", ...≤5], user_verbatim:["", ...≤3] }

next:{ task:"", tasks_file:"<absolute-path-to-tasks.md>", why:"", validate:["", ...≤3], cmd:"/the-flow 6 --phase "" --plan "" --task """ }

refs:{plan:" §<anchor|?>", tasks_file:"<absolute-path-to-tasks.md|?>", log:"<.../execution.log.md|?>", paths:["<key dir/file>", ...≤5]}

Trim Order (when hitting --max): code.hot → code.domain_dirs → fails → risks → concepts.keys → decisions.other → tasks.pend → code.files → tests.notes → refs.paths → anchors.immutable. Never trim: m, intent.primary, timeline.just_completed, timeline.current, next (including next.tasks_file), m.domain (when present), anchors.user_verbatim.

Budget guide (approximate): intent+timeline ≈20%, code+decisions ≈35%, tasks ≈20%, next+refs ≈15%, risks+concepts+fails+anchors ≈10%.

B) --format lean (readable Markdown, still tight)

Handover

Plan: • Phase: • Feature: • Progress: <x/y or %> • Domain: <slug or ?> • Generated:

1) Primary Intent

  • Summary: <one‑liner>
  • Quotes: “”; “
  • Scope: <in/out of scope bullets, ≤3>

2) Timeline (Most Recent First)

  • Just completed: <last task/action finished with ID>
  • Current focus:
  • Recent actions: <≤4 bullets; actions/decisions taken>

3) Key Technical Concepts (≤6)

  • [] —

4) Code Touchpoints

  • Files (≤8): <abs path or ?>
  • Hot changes (≤6): @+n/‑m or “hot”
  • Domain dirs (≤6):

5) Decisions & ADRs

  • ADR‑#### — — Affects: — Domain: — Why: <≤8 words> (≤4)
  • Other decisions (≤6): — Impact: <≤12 words> — Why: <≤8 words>

6) Tasks Snapshot

  • Done (≤8): <ids…>
  • In‑Progress (≤5): <ids…>
  • Pending (≤10): <ids…>
  • Blocked (≤3): <id — reason>
  • Critical deps (≤5): T033 ← T032; T037 ← T035 + T036

7) Tests

  • Unit: <pass|fail|mixed|?> • Integration: <pass|fail|mixed|?> • Coverage: <value or ?>
  • Notes: <≤80 chars>

8) Risks (≤5)

  • — Mitigation: — Watch: — Domain: <slug, if scoped>

9) Failed Attempts (≤4)

  • — Failed: — Lesson:

10) Anchors (anti‑drift)

  • Immutable facts (≤5):
  • User constraints (verbatim, ≤3): “

11) Next Steps

  • Immediate: <task‑id> —
    • Tasks file: <absolute-path-to-tasks.md>
    • Validation: <≤3 criteria>
    • Resume: /the-flow 6 --phase "<phase>" --plan "<path>" --task "<id>"
  • Then (≤4): T0xx — <one‑liner> (deps: )

12) References

  • Plan: §<anchor|?>
  • Tasks file: <absolute-path-to-tasks.md|?>
  • Phase log: <.../execution.log.md|?>
  • Paths (≤5): <key files/dirs>

C) --format json (expanded keys; mirrors compact/lean)

Keys: meta, intent, timeline, concepts, code, decisions, tasks, tests, risks, fails, anchors, next, refs. Values follow the same caps and semantics as compact.

Size & Priority Policy

Global cap: --max (default 1400; hard stop 1600).

Section caps: Concepts ≤6; Files ≤8; Hot ≤6; DomainDirs ≤6; Decisions(other) ≤6; ADRs ≤4; Done ≤8; In‑Progress ≤5; Pending ≤10; Blocked ≤3; CritDeps ≤5; Risks ≤5; Fails ≤4; Anchors.immutable ≤5; Anchors.user_verbatim ≤3; Then ≤4.

Strings: Prefer ≤12 words. Use IDs and pointers over prose.

Required fields even when trimmed: meta, intent.primary, timeline.current, next (task/why/validate/cmd), anchors.user_verbatim.

Normalization

IDs: T###, ST###, ADR‑####.

Paths: Absolute when remembered; else ?.

Times: UTC ISO (YYYY‑MM‑DDThh:mm:ssZ).

Booleans as status words: pass|fail|mixed|?.

Quotes: Keep verbatim user quotes short to anchor intent.

Example (--format compact)

(Illustrative; replace with session memory; use ? if unknown.)

HOVR/2 m:{ts:"2025-11-07T23:18:00Z",plan:"/workspaces/.../realtime-chatbot-plan.md",phase:"Phase 5: WebRTC",feat:"realtime-chatbot",prog:"4/9",domain:"realtime"}

intent:{ primary:"Enable browser↔Azure WebRTC voice with ephemeral creds", quotes:["“get webrtc working end-to-end”","“no key caching”"], scope:["POC OK","manual tests acceptable","keep SDK types below repo"] }

timeline:{ just_completed:"ST008 pytest infra documented and green", current:"implement RealtimeService (T032) before wiring router", last_actions:["set ADR‑0001 repo isolation","outlined router endpoints","configured telemetry endpoint"] }

concepts:{keys:["ephemeral key mint [auth]","region-scoped webrtc URL [realtime]","repo pattern isolation [_platform]","TDD cycles","telemetry endpoint [observability]","no caching [auth]"]}

code:{ files:["src/backend/app/services/realtime_service.py","src/backend/app/routers/realtime.py","src/backend/app/main.py","tests/unit/test_realtime_service.py","tests/integration/test_realtime.py","src/ui/components/webrtc_client.html"], hot:["src/backend/app/main.py@?","tests/unit/test_realtime_service.py@?"], domain_dirs:{"realtime":"src/backend/app/services/","auth":"src/backend/app/auth/","observability":"src/backend/app/telemetry/"} }

decisions:{ adrs:[["ADR-0001","domain types above repo","services/routers","realtime","prevents circular imports"]], other:[["DEC-telemetry","/telemetry collects client stats","observability","needed for latency debugging"],["DEC-ephemeral","mint per Start click","stateless svc call","avoids key caching security risk"]] }

tasks:{ done:["ST008"], ip:[], pend:["T032","T033","T034","T035","T036"], blk:[], critdeps:[["T033","T032"],["T037","T035","T036"]] }

tests:{unit:"mixed", integ:"pass", cov:"~50%", notes:"RED→GREEN expected after T032"}

risks:[["mic permission denial","UI prompt/handle NotAllowedError","browser console","realtime"],["region mismatch","derive from AZURE_OPENAI_REGION","403/connect-failed","auth"]]

fails:[["REST polling",">500ms latency per round-trip","WebSocket/WebRTC mandatory"],["raw WebSocket without SDK","auth token refresh not handled","use Azure SDK for token lifecycle"]]

anchors:{ immutable:["PostgreSQL for JSONB support","WebRTC over WebSocket for <100ms","domain types above repo layer"], user_verbatim:["“no key caching”","“get webrtc working end-to-end”"] }

next:{ task:"T032", tasks_file:"/workspaces/.../tasks/phase-5/tasks.md", why:"service layer needed before router", validate:["unit tests green","returns domain type only","no caching"], cmd:"/the-flow 6 --phase "Phase 5: WebRTC" --plan "/workspaces/.../realtime-chatbot-plan.md" --task "T032"" }

refs:{plan:"/workspaces/.../realtime-chatbot-plan.md § Phase 5", tasks_file:"/workspaces/.../tasks/phase-5/tasks.md", log:"/workspaces/.../tasks/phase-5/execution.log.md", paths:["src/backend/app/","tests/","src/ui/components/"]}

Drop‑in System Prompt You are a domain-aware compact handover generator for agent continuity.

Constraints:

  • Summarize from current-session memory only. Do NOT read files or call tools.
  • Respect a hard token cap of --max (default 1400; hard stop 1600).
  • If unsure, output "?" and add a pointer in Refs rather than guessing.
  • Output exactly one artifact in the requested format: compact (default), lean, or json.
  • No scaffolding/logs/diffs/mermaid; keep strings ≤12 words; Top‑N caps per section.
  • File paths, function names, task IDs, decision IDs, and CLI commands MUST be verbatim. Never paraphrase — copy exactly or write “?”.
  • Domain fields are optional — include them when the project uses the domain system (docs/domains/ exists) or when --domain is provided. Tag concepts, ADRs, and risks with [domain] when known.

Method:

  1. Think forward: “What 5 questions will the next agent ask in their first 30 seconds?” Then recover user requests (quote briefly), decisions + rationale, code state, failed attempts, blockers, and ≤5 immutable facts that answer those questions.
  2. Emit the summary using the chosen format and schema. Apply Trim Order when near the cap: code.hot → code.domain_dirs → fails → risks → concepts.keys → decisions.other → tasks.pend → code.files → tests.notes → refs.paths → anchors.immutable.
  3. Never trim: meta, primary intent, timeline.just_completed, timeline.current, next (including next.tasks_file), meta.domain (when present), anchors.user_verbatim.
  4. Budget guide: intent+timeline ≈20%, code+decisions ≈35%, tasks ≈20%, next+refs ≈15%, risks+concepts+fails+anchors ≈10%.

Content (by format):

  • compact: Emit HOVR/2 block with sections: m, intent, timeline, concepts, code, decisions, tasks, tests, risks, fails, anchors, next, refs. Include domain_dirs in code and domain tags in concepts/ADRs/risks when known.
  • lean: Emit Markdown with 12 sections mirroring the compact data. Include Domain fields in headers and list items.
  • json: Emit JSON with full-word keys mirroring the compact data. Include domain, domain_dirs, and domain tags.
Install via CLI
npx skills add https://github.com/jakkaj/tools --skill util-0-v2-handover
Repository Details
star Stars 5
call_split Forks 3
navigation Branch main
article Path SKILL.md
More from Creator