goosedump 0.12.2

Coding agent context data browser
# Data-driven goosedump cases. One case per line, fields joined by " | ".
#
#   name=  test label
#   args=goosedump arguments (quote a token to keep embedded spaces)
#   cwd    run in the fixture root (needed for crush config discovery)
#   status exit code: 0 (default), !0 (any failure), or an exact integer
#   out=   substring that must appear in stdout (repeatable)
#   out!=  substring that must not appear in stdout (repeatable)
#
# The fixture tree (tests/data.rs) stages one store per provider, so every
# case shares the same data. Blank lines and lines starting with # are ignored.

# opencode
name=opencode: list contexts | args=session list | out=opencode:sesh-alpha | out=opencode:sesh-bravo
name=opencode: display messages | args=session show opencode:sesh-alpha | out="id":"entry-alpha" | out="role":"user" | out=STARTREK-DISCO | out="id":"entry-bravo" | out="role":"assistant"
name=opencode: native assistant parts | args=session show opencode:sesh-alpha | out="type":"reasoning" | out=need to read a file | out="type":"text" | out=found STARTREK-DISCO in source | out="type":"tool" | out="tool":"read" | out="filePath":"src/main.rs"
name=opencode: grep literal match | args=session find opencode:sesh-alpha STARTREK-DISCO | out=STARTREK-DISCO
name=opencode: grep glob match | args=session find opencode:sesh-alpha START*DISCO | out=STARTREK-DISCO
name=opencode: grep no match | args=session find opencode:sesh-alpha NONEXISTENT-ZZ | out="messages":[] | out!=STARTREK-DISCO
name=opencode: ranked search | args=session search opencode:sesh-alpha STARTREK-DISCO | out="id":"entry-alpha" | out=STARTREK-DISCO
name=opencode: ID filter | args=session show opencode:sesh-alpha -e entry-alpha | out="id":"entry-alpha"
name=opencode: ID filter excludes other | args=session show opencode:sesh-alpha -e entry-alpha | out!=entry-bravo
name=opencode: lineage scope | args=session show opencode:sesh-alpha | out="id":"entry-alpha" | out="id":"entry-bravo"
name=opencode: grep preserves utf-8 | args=session find opencode:sesh-alpha café | out=café-日本語-🦀-résumé

# crush
name=crush: list contexts | cwd=yes | args=session list | out=crush:sesh-crush
name=crush: display messages | cwd=yes | args=session show crush:sesh-crush | out=explain ZULU-NOVEMBER | out="role":"user" | out=ZULU-NOVEMBER is a code pattern | out="role":"assistant"
name=crush: native tool result | cwd=yes | args=session show crush:sesh-crush | out="type":"tool_call" | out="name":"grep" | out=\"filePath\":\"lib.rs\" | out="type":"tool_result" | out="tool_call_id":"call-crush-0" | out="role":"tool" | out=lib.rs:9: ZULU-NOVEMBER

# pi
name=pi: list contexts | args=session list | out=pi:sesh-pi
name=pi: display messages | args=session show pi:sesh-pi | out="id":"pi-entry-1" | out=TRIPLA-ESPRESSO | out="id":"pi-entry-2" | out="id":"pi-entry-3" | out=grep TRIPLA src/*.rs
name=pi: preserves custom and branch context entries | args=session show pi:sesh-pi-context | out="type":"custom_message" | out="customType":"fixture-context" | out=CUSTOM-CONTEXT-MARKER | out="type":"branch_summary" | out="fromId":"pi-context-abandoned" | out=BRANCH-CONTEXT-MARKER | out!=ABANDONED-CONTEXT-MARKER
name=pi: custom context range boundary | args=session show pi:sesh-pi-context --from pi-context-custom --before pi-context-tail | out="id":"pi-context-custom" | out="id":"pi-context-branch" | out!=ROOT-CONTEXT-MARKER | out!=TAIL-CONTEXT-MARKER
name=pi: branch context range boundary | args=session show pi:sesh-pi-context --from pi-context-branch --before pi-context-tail | out="id":"pi-context-branch" | out!=CUSTOM-CONTEXT-MARKER | out!=TAIL-CONTEXT-MARKER
name=pi: compact through branch boundary | args=session compact pi:sesh-pi-context --before pi-context-branch | out=CUSTOM-CONTEXT-MARKER | out!=BRANCH-CONTEXT-MARKER
name=pi: all scope includes abandoned context | args=session show pi:sesh-pi-context --all | out=ABANDONED-CONTEXT-MARKER
name=pi: filtered grep no match | args=session find pi:sesh-pi found -e pi-entry-1 | out="type":"session" | out!=found TRIPLA-ESPRESSO
name=pi: unfiltered grep match | args=session find pi:sesh-pi found | out=found TRIPLA-ESPRESSO in file
name=pi: ranked search | args=session search pi:sesh-pi TRIPLA-ESPRESSO | out="id":"pi-entry-1" | out=TRIPLA-ESPRESSO
name=pi: compact compaction context | args=session compact pi:sesh-pi | out="type":"compaction" | out="version":3 | out="tokensBefore" | out=## Goal | out=find TRIPLA-ESPRESSO (#pi-entry-1) | out=[user] | out=[assistant] | out=* bash  | out=$ grep TRIPLA src/*.rs
name=pi: compact from entry | args=session compact pi:sesh-pi --from pi-entry-2 | out="type":"compaction" | out=Ongoing development work | out=[assistant]
name=pi: compact from excludes earlier entry | args=session compact pi:sesh-pi --from pi-entry-2 | out!=find TRIPLA-ESPRESSO
name=pi: compact until excludes later entry | args=session compact pi:sesh-pi --from pi-entry-2 --before pi-entry-3 | out!=Recent check passed
name=pi: compact invalid range | args=session compact pi:sesh-pi --from pi-entry-4 --before pi-entry-2 | status=!0
name=pi: compact from with entry selection | args=session compact pi:sesh-pi --from pi-entry-2 -e pi-entry-2 | out=[assistant]
name=pi: compact surfaces todo state | args=session compact pi:sesh-pi | out=[todo] Review compact parity (in_progress) | out!=Created #99
name=pi: compact filters todo tool call | args=session compact pi:sesh-pi | out!=* todo
name=pi: compact skips resolved failure | args=session compact pi:sesh-pi | out=[ ] [todo] Review compact parity (in_progress) (#pi-entry-4)
name=pi: compact preserves current prior summary | args=session compact pi:sesh-pi-merge | out=Always run clippy (#prior-pref)
name=pi: compact ignores unsupported legacy summary | args=session compact pi:sesh-pi-legacy-summary --plain | out=CURRENT-GOAL-MARKER | out!=LEGACY-COMPACTION-MARKER
name=pi: compact plain prints pi screen style | args=session compact pi:sesh-pi --plain | out=[compaction] Compacted from | out=## Goal | out=find TRIPLA-ESPRESSO (#pi-entry-1)
name=pi: compact emits pi compaction entry | args=session compact pi:sesh-pi --as pi | out="type":"compaction" | out="firstKeptEntryId" | out="parentId":null | out=## Goal | out!=[Session Goal]
name=pi: compact converts summary to gemini | args=session compact pi:sesh-pi --as gemini | out="$set" | out=<state_snapshot> | out=<overall_goal> | out=Got it. Thanks for the additional context! | out="projectHash"
name=pi: compact plain gemini prints status line | args=session compact pi:sesh-pi --plain --as gemini | out=Chat history compressed from | out= tokens.
name=pi: compact converts summary to opencode | args=session compact pi:sesh-pi --as opencode | out="summary":true | out="type":"compaction" | out="finish":"stop" | out=## Goal
name=pi: compact plain opencode prints rule | args=session compact pi:sesh-pi --plain --as opencode | out= Compaction ─ | out=## Goal
name=pi: compact converts summary to codex | args=session compact pi:sesh-pi --as codex | out="type":"session_meta" | out="type":"compacted" | out="replacement_history" | out=Another language model started to solve this problem | out="input_text"
name=pi: compact plain codex prints info cell | args=session compact pi:sesh-pi --plain --as codex | out=• Context compacted | out=Heads up: Long threads and multiple compactions
name=pi: compact converts summary to claude | args=session compact pi:sesh-pi --as claude | out="subtype":"compact_boundary" | out="parentUuid":null | out="isCompactSummary":true | out="isVisibleInTranscriptOnly":true | out=This session is being continued from a previous conversation
name=pi: compact plain claude prints transcript marker | args=session compact pi:sesh-pi --plain --as claude | out=✻ Conversation compacted (ctrl+o for history) | out=Compact summary
name=pi: compact converts summary to goose | args=session compact pi:sesh-pi --as goose | out="userVisible":false | out="agentVisible":true | out=1. **User Intent** | out=Your context was compacted.
name=pi: compact plain goose prints notice | args=session compact pi:sesh-pi --plain --as goose | out=Compaction complete
name=pi: compact converts summary to crush | args=session compact pi:sesh-pi --as crush | out="is_summary_message":1 | out="summary_message_id" | out="reason":"end_turn" | out=## Current State
name=pi: compact plain crush prints summary | args=session compact pi:sesh-pi --plain --as crush | out=## Current State
name=pi: compact rejects removed format option | args=session compact pi:sesh-pi --format fancy | status=!0
name=pi: compact rejects unknown format | args=session compact pi:sesh-pi --as bogus | status=!0
name=pi: show preserves image part | args=session show pi:sesh-pi-image | out="mimeType":"image/png" | out="data":"aGVsbG8="
name=claude: show preserves image part | args=session show claude:sesh-claude-image | out="media_type":"image/png" | out="data":"aGVsbG8="
name=pi: compact filters hashline noise | args=session compact pi:sesh-pi | out!=1:928|//
name=pi: compact filters file-list noise | args=session compact pi:sesh-pi | out!=.git/
name=pi: compact keeps brief opening and recent tail | args=session compact pi:sesh-pi-long | out=OPENING-ASSISTANT-MARKER | out=earlier lines omitted | out=TAIL-RECENT-MARKER
name=pi: compact commit from porcelain | args=session compact pi:sesh-pi-commit | out=a1b2c3d: Fix the parser
name=pi: compact ignores prose commit hash | args=session compact pi:sesh-pi-commit | out!=abc9999

# codex
name=codex: list contexts | args=session list | out=codex:019eb466-8e72-7dd0-8a10-9c8963f7d86c
name=codex: display messages | args=session show codex:019eb466-8e72-7dd0-8a10-9c8963f7d86c | out="type":"session_meta" | out=DEADBEEF | out="type":"function_call" | out="call_id":"call-codex-grep" | out=src/main.rs | out=consider DEADBEEF search plan | out=DEADBEEF custom | out=grep DEADBEEF src/main.rs | out="type":"function_call_output"
name=codex: grep match | args=session find codex:019eb466-8e72-7dd0-8a10-9c8963f7d86c DEADBEEF | out=DEADBEEF
name=codex: grep command match | args=session find codex:019eb466-8e72-7dd0-8a10-9c8963f7d86c "grep DEADBEEF src/main.rs" | out=grep DEADBEEF src/main.rs

# goose
name=goose: list contexts | args=session list | out=goose:sesh-goose
name=goose: display messages | args=session show goose:sesh-goose | out="message_id":"goose-1" | out=YANKEE-ECHO | out="message_id":"goose-2" | out=let me search | out="message_id":"goose-3" | out="pattern":"YANKEE" | out="message_id":"goose-4" | out="toolResponse"
name=goose: native assistant and tool result | args=session show goose:sesh-goose | out="type":"thinking" | out=searching for YANKEE-ECHO | out="toolRequest" | out="pattern":"YANKEE" | out=src/main.rs:42: YANKEE-ECHO
name=goose: grep match | args=session find goose:sesh-goose YANKEE-ECHO | out=YANKEE-ECHO
name=goose: lineage scope | args=session show goose:sesh-goose | out="message_id":"goose-1" | out="message_id":"goose-4"

# claude
name=claude: list contexts | args=session list | out=claude:sesh-claude
name=claude: display messages | args=session show claude:sesh-claude | out="uuid":"claude-user-1" | out=SLOP-STARS | out="uuid":"claude-asst-1" | out="uuid":"claude-tool-1" | out="tool_use_id":"toolu_grep" | out=src/main.rs:7: SLOP-STARS
name=claude: native assistant parts | args=session show claude:sesh-claude | out="type":"thinking" | out=looking for SLOP-STARS | out=I found SLOP-STARS in source | out="type":"tool_use" | out="command":"grep SLOP src/*.rs"
name=claude: tool result error marker | args=session show claude:sesh-claude | out="uuid":"claude-tool-2" | out="tool_use_id":"toolu_read" | out="is_error":true | out=file not found
name=claude: grep literal match | args=session find claude:sesh-claude SLOP-STARS | out=SLOP-STARS
name=claude: grep glob match | args=session find claude:sesh-claude SLOP*STARS | out=SLOP-STARS
name=claude: ranked search | args=session search claude:sesh-claude SLOP-STARS | out="uuid" | out=SLOP-STARS
name=claude: shows sesh-claude session | args=session show claude:sesh-claude | out="uuid":"claude-user-1"
name=claude: lineage scope | args=session show claude:sesh-claude | out="uuid":"claude-user-1" | out="uuid":"claude-tool-2"

# gemini
name=gemini: list contexts | args=session list | out=gemini:session-gemini-1
name=gemini: display messages | args=session show gemini:session-gemini-1 | out="id":"gem-user-1" | out=find SLOP-STARS | out="id":"gem-asst-1" | out="name":"grep_search" | out=src/main.rs:7: SLOP-STARS
name=gemini: native assistant parts | args=session show gemini:session-gemini-1 | out="thoughts" | out=looking for SLOP-STARS | out=I found SLOP-STARS in source | out="toolCalls" | out="pattern":"SLOP"
name=gemini: tool result error marker | args=session show gemini:session-gemini-1 | out="name":"read_file" | out="status":"error" | out=file not found
name=gemini: grep glob match | args=session find gemini:session-gemini-1 SLOP*STARS | out=SLOP-STARS
name=gemini: ranked search | args=session search gemini:session-gemini-1 SLOP-STARS | out="id":"gem-user-1" | out=SLOP-STARS
name=gemini: shows session-gemini-1 session | args=session show gemini:session-gemini-1 | out="id":"gem-user-1"
name=gemini: jsonl list | args=session list | out=gemini:session-gemini-jl
name=gemini: jsonl streaming upsert | args=session show gemini:session-gemini-jl | out=I found MOON-BEAM in source | out="name":"grep_search" | out=src/lib.rs:3: MOON-BEAM | out!=still searching

# session remove previews are non-destructive; confirmed removals live in data.rs remove_cases
name=remove: preview lists target | args=session remove goose:sesh-goose | out=goose:sesh-goose
name=remove: preview keeps session | args=session show goose:sesh-goose | out=YANKEE-ECHO
name=remove: missing target errors | args=session remove zzz-nomatch | status=!0

# session copy previews; confirmed copies live in data.rs copy_cases
name=copy: preview lists cross-provider session | args=session copy pi:sesh-pi --to goose | out=pi:sesh-pi
name=copy: rejects same provider | args=session copy goose:sesh-goose --to goose | status=!0
name=copy: no match errors | args=session copy zzz-nomatch --to goose | status=!0
name=copy: unknown provider errors | args=session copy pi:sesh-pi --to bogus | status=!0

# list aggregation and globbing
name=list: aggregates all providers with tags | args=session list | out=opencode:sesh-alpha | out=goose:sesh-goose | out=pi:sesh-pi
name=list: provider scopes results | args=session list -q '.provider == "goose"' | out=goose:sesh-goose
name=list: provider excludes other providers | args=session list --query '.provider == "goose"' | out!=opencode:sesh-alpha
name=list: provider filter matches sessions | args=session list -q '.provider == "opencode"' | out=opencode:sesh-alpha
name=list: provider filter accepts provider | args=session list --query '.provider == "goose"' | status=0
name=list: path glob matches a project dir | args=session list -q '.cwd == "/tmp/project"' | out=pi:sesh-pi
name=list: path glob is scoped | args=session list --query '.cwd == "/no/such/dir"' | out!=pi:sesh-pi
name=list: path wildcard matches a prefix | args=session list -q '(.cwd|startswith("/tmp/proj"))' | out=pi:sesh-pi
name=list: path wildcard rejects mismatches | args=session list --query '(.cwd|startswith("/nope"))' | out!=pi:sesh-pi
name=list: json output format | args=session list --json | out="id":"sesh-goose" | out="provider":"goose"

# cli errors
name=cli: unknown provider | args=session show bogus:abc | status=!0
name=cli: bare target rejected | args=session show ffffffff | status=!0
name=cli: short target id rejected | args=session show 1 | status=!0
name=cli: no arguments | args= | status=2
name=cli: find without glob | args=session find opencode:foo | status=!0
name=cli: missing subcommand | args=opencode sesh-alpha | status=!0
name=cli: --page with find | args=session find opencode:sesh-alpha STARTREK --page 1 | status=!0
name=cli: rejects removed scope option | args=session show opencode:sesh-alpha --scope bogus | status=!0
name=cli: --page zero | args=session search opencode:sesh-alpha STARTREK --page 0 | status=!0
name=cli: invalid render provider | args=session show claude:sesh-claude --as bogus | status=2
name=cli: invalid memory type | args=memory search query --type bogus | status=2

# Omitting --as renders in the source provider's native shape; --as <provider> cross-converts
name=convert: claude to pi | args=session show claude:sesh-claude --as pi | out="type":"session" | out="version":3 | out="type":"toolCall" | out="role":"toolResult" | out="toolName":"Bash" | out=SLOP-STARS
name=convert: claude to codex | args=session show claude:sesh-claude --as codex | out="type":"session_meta" | out="type":"function_call" | out="call_id":"toolu_grep" | out="type":"function_call_output" | out=SLOP-STARS
name=convert: claude to goose | args=session show claude:sesh-claude --as goose | out="content_json" | out="toolRequest" | out="id":"toolu_grep" | out="toolResponse" | out=SLOP-STARS
name=convert: claude to crush | args=session show claude:sesh-claude --as crush | out="parts" | out="type":"tool_call" | out="type":"tool_result" | out="tool_call_id" | out=SLOP-STARS
name=convert: claude to opencode | args=session show claude:sesh-claude --as opencode | out="parts" | out="type":"tool" | out="type":"reasoning" | out=SLOP-STARS
name=convert: claude to gemini | args=session show claude:sesh-claude --as gemini | out="toolCalls" | out="thoughts" | out="result" | out=SLOP-STARS
name=convert: goose to crush | args=session show goose:sesh-goose --as crush | out="type":"tool_call" | out="type":"tool_result" | out="tool_call_id" | out=YANKEE-ECHO
name=convert: codex to claude | args=session show codex:019eb466-8e72-7dd0-8a10-9c8963f7d86c --as claude | out="type":"assistant" | out="type":"tool_use" | out="tool_use_id":"call-codex-grep" | out=DEADBEEF
name=convert: find then render goose | args=session find claude:sesh-claude SLOP-STARS --as goose | out="toolResponse" | out=SLOP-STARS
name=convert: search then render gemini | args=session search claude:sesh-claude SLOP-STARS --as gemini | out="toolCalls" | out=SLOP-STARS
name=native: claude source native | args=session show claude:sesh-claude | out="type":"assistant" | out="type":"tool_use" | out=SLOP-STARS
name=native: pi source native | args=session show pi:sesh-pi | out="type":"session" | out="type":"toolCall" | out=TRIPLA-ESPRESSO
name=native: codex source native | args=session show codex:019eb466-8e72-7dd0-8a10-9c8963f7d86c | out="type":"session_meta" | out="type":"function_call" | out=DEADBEEF
name=native: goose source native | args=session show goose:sesh-goose | out="content_json" | out="toolResponse" | out=YANKEE-ECHO
name=native: crush source native | cwd=yes | args=session show crush:sesh-crush | out="parts" | out="type":"tool_call" | out=ZULU-NOVEMBER
name=native: opencode source native | args=session show opencode:sesh-alpha | out="parts" | out="type":"tool" | out=STARTREK-DISCO
name=native: gemini source native | args=session show gemini:session-gemini-1 | out="toolCalls" | out=SLOP-STARS
name=native: find renders source native | args=session find claude:sesh-claude SLOP-STARS | out="type":"assistant" | out=SLOP-STARS
name=native: search renders source native | args=session search claude:sesh-claude SLOP-STARS | out=SLOP-STARS
name=range: show --from drops earlier entries | args=session show claude:sesh-claude --from claude-asst-2 | out!="find SLOP-STARS" | out=file not found
name=range: show --before keeps earlier entries | args=session show claude:sesh-claude --before claude-tool-1 | out=find SLOP-STARS | out!="file not found"
name=range: show --from nonexistent errors | args=session show claude:sesh-claude --from no-such-entry | status=!0
name=range: show --from after --before errors | args=session show claude:sesh-claude --from claude-tool-2 --before claude-user-1 | status=!0
name=range: find --from bounds search | args=session find claude:sesh-claude SLOP-STARS --from claude-asst-2 | out!=find SLOP-STARS