pi-prompt-suggester has five runtime pieces:
- Suggestion pipeline (runs on
agent_end) - Agentic reseed runner (background, non-blocking)
- Steering tracker (session/branch-aware)
- UI sink (ghost suggestion + usage line)
- Persistent observability log (
.pi/suggester/logs/events.ndjson)
./.pi/suggester/seed.json
Contains:
- seed summaries (intent/objectives/constraints/principles/status)
- key files (+ hashes + category)
- required-category findings (
vision,architecture,principles_guidelines) withfound/not_foundrationale - generator/prompt/config fingerprints
.pi/suggester/sessions/<session-id>/...
Contains:
- last shown suggestion
- steering history (
accepted_exact | accepted_edited | changed_course) - session-persistent suggester usage/cost counters
- session-persistent seeder usage/cost counters
- combined totals for status/UI display
Older suggester-state / suggester-usage Pi custom entries are only used as a one-time legacy migration source.
Reseeding is queued async and never blocks interaction.
Trigger points:
- session lifecycle events (
session_start/tree/fork/switch) agent_endstale check- manual
/suggester reseed
Seeder implementation:
- iterative model loop with read-only tools:
ls,find,grep,read - explicit required-category coverage in final output
- accepts
found: falsewhen rationale is provided - multiple files per category supported
Validation requires:
- all required
categoryFindings - non-empty rationale for each
- if
found=true, at least one matching key file tagged with that category
Trigger:
agent_endonly
Inputs:
- assistant completion + status (
success | error | aborted) - recent user prompts
- tool signals + touched files + unresolved questions
- full intent seed summaries + categorized key files + category findings
- recent accepted/changed steering examples
Behavior:
- non-success turns (
error,aborted) can fast-path tocontinue(configurable) - output is one suggestion or
[no suggestion] - multi-line suggestions allowed; bounded by
maxSuggestionChars
- Suggestions can ghost in the editor when safe (idle, no pending messages, editor-empty policy; multiline requires an empty editor)
- Space-to-accept when the editor is empty
- Non-compatible cases hide the ghost suggestion; the suggestion text is never moved into the below-editor widget
- The stock pi footer is preserved
- Compact suggester info uses status lines
- Richer suggester state/warnings use a below-editor widget
Persistent log file:
.pi/suggester/logs/events.ndjson
Logged events include:
- seeder run start/completion/exhaustion
- seeder tool requests/results and validation failures
- suggestion turn received, suggestion generated, no-suggestion
- steering classification events
Inspection:
/suggester seed-trace [limit]/suggester statusincludes log path plus usage breakdown (suggester/seeder/combined)
/suggester status/suggester reseed/suggester model [show|set|clear] ...(writes project override.pi/suggester/config.json)/suggester thinking [show|set|clear] ...(writes project override.pi/suggester/config.json)/suggester config [show|set [project|user] <path> <value>|reset [project|user|all]]/suggesterSettings(interactive TUI settings menu)/suggester instruction [show|set|clear]/suggester seed-trace [limit]