/session-id │ v kimaki session events ──> jq ──> ground truth (events, not guesses) │ v kimaki.log + prompts + model id │ v secret gist ──> events 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. A Discord thread ID or thread URL also works in the commands below.kimaki.log. It resets on every bot start, so copy it before you restart.123456kimaki session events ses_xxx > ./tmp/ses_xxx.jsonl kimaki session read ses_xxx > ./tmp/ses_xxx.md kimaki session read ses_xxx --thinking --verbose > ./tmp/ses_xxx-full.md cp "$(kimaki logs)" ./tmp/kimaki.log kimaki status npm ls -g kimaki
kimaki logs prints the log path: ~/.kimaki/kimaki.log by default, or <dataDir>/kimaki.log if you pass --data-dir. kimaki status shows the OpenCode URL and version. npm ls -g kimaki shows the Kimaki version.<dataDir>/session-events/<threadId>.jsonl. One file holds the root session, its subagents and Kimaki internal events. Streaming deltas are skipped, very long strings are cut, and a file starts again when it passes 20 MB. For sessions without a thread (for example your own OpenCode TUI sessions), use kimaki session read.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.{ "at": <ms>, "event": <OpenCode event> }. Read the file before you write the issue.1234567891011# event type counts jq -r .event.type ./tmp/ses_xxx.jsonl | sort | uniq -c # run lifecycle only jq -r 'select(.event.type | startswith("session.execution.")) | [.event.created, .event.type, .event.data.sessionID] | @tsv' ./tmp/ses_xxx.jsonl # timestamps and types jq -r '[.event.created, .event.type] | @tsv' ./tmp/ses_xxx.jsonl # retries jq 'select(.event.type == "session.retry.scheduled")' ./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 \ ./tmp/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
12345678910111213141516171819202122**Session:** ses_xxx **Model:** anthropic/claude-opus-4-6 **Kimaki version:** output of `npm ls -g kimaki` **OpenCode version:** from `kimaki status` **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:** - events line N: `session.execution.started` at <created> - events line M: `session.execution.interrupted`, then a footer message was posted - log: <exact error line> **What I expected:** No footer after abort.
docs/opencode-v2-events/.kimaki/src/thread-reducer.fixtures.test.ts that calls replay({ events: loadFixture('ses_xxx.events.jsonl') }) and snapshots the effects.12kimaki session events ses_xxx > docs/opencode-v2-events/ses_xxx.events.jsonl cd kimaki && pnpm run test --run src/thread-reducer.fixtures.test.ts
session.created event needs an explicit initial view in replay()./session-idkimaki session subcommands