/session-id │ v export jsonl ──> jq ──> ground truth (events, not guesses) │ v kimaki.log + prompts + model id │ v secret gist ──> jsonl + log + session markdown │ v gh issue create (body links gist) │ v wait for remorses ──> PR only if he agrees in a comment
/session-id in the Discord thread, or kimaki session list.kimaki.log. It resets on every bot restart, so grab it before you restart.123kimaki session export-events-jsonl --session ses_xxx --out ./tmp/ses_xxx.jsonl kimaki session read ses_xxx > ./tmp/ses_xxx.md kimaki --version
~/.kimaki/kimaki.log by default, or <dataDir>/kimaki.log if you passed --data-dir.opencode run sessions are not in that SQLite buffer. Use kimaki session read for those.kimaki session read includes the exact providerID/modelID on each assistant message and the verbatim user prompts. Copy both from ./tmp/ses_xxx.md; do not rely on memory.{ timestamp, threadId, projectDirectory, event }. Read it before you write the issue.12345678# event type counts jq -r '.event.type' ./tmp/ses_xxx.jsonl | sort | uniq -c # lifecycle only jq -r 'select(.event.type=="session.status" or .event.type=="session.idle" or .event.type=="session.error") | [.timestamp, .event.type, (.event.properties.status.type // ""), (.event.properties.error.name // "")] | @tsv' ./tmp/ses_xxx.jsonl # timestamps + types jq -r '[.timestamp, .event.type] | @tsv' ./tmp/ses_xxx.jsonl
gh gist create into the issue body.1234567891011# gists are secret by default; omit the reproduction file if you do not have one gh gist create --desc "kimaki ses_xxx debug" \ ./tmp/ses_xxx.jsonl \ ./tmp/ses_xxx.md \ ~/.kimaki/kimaki.log \ ./tmp/reproduction.ts # paste the returned gist URL into ./tmp/kimaki-issue.md, then create the issue gh issue create -R remorses/kimaki \ --title "Footer appears after abort in ses_xxx" \ --body-file ./tmp/kimaki-issue.md
123456789101112131415161718192021**Session:** ses_xxx **Model:** anthropic/claude-opus-4-6 **Kimaki version:** output of `kimaki --version` **OS:** macOS 15.2 **Gist:** https://gist.github.com/... **Steps to reproduce:** 1. ... 2. ... **User prompts** (verbatim, in order): 1. ... 2. ... **What the files show:** - jsonl line N: `session.status` busy at <timestamp> - jsonl line M: `session.idle` then a footer message was posted - log: <exact error line> **What I expected:** No footer after abort.
cli/src/session-handler/event-stream-fixtures/ and extend event-stream-state.test.ts. That is how session-state bugs are locked down: pure derivation over a recorded stream.12kimaki session export-events-jsonl --session ses_xxx --out ./tmp/ses_xxx.jsonl cp ./tmp/ses_xxx.jsonl cli/src/session-handler/event-stream-fixtures/ses_xxx.jsonl
12KIMAKI_LOG_OPENCODE_SESSION_EVENTS=1 kimaki # writes <dataDir>/opencode-session-events/ses_xxx.jsonl
kimaki session subcommands