# good-job Turns explicit `gj` praise and `wtf` complaints into durable, evidence-backed learnings. ## Install / load Pi loads this extension through the [root pi-ext package](../../README.md). ## Commands / tools / settings - `gj [details]` and `good job [details]` record praise and continue to the active agent unchanged. - `wtf [complaint]` records a problem and continues to the active agent unchanged. - `/gj` or `/gj list` opens the searchable learning list and selected detail. - `/gj status` reports queue state. - `/gj open` opens the persistence directory. - `/gj learn` sends the active agent the records-directory path and asks for cited Pi change proposals. There are no user-facing tools. Background analysis exposes only an internal schema-constrained `submit_learning` tool to its child session. By default, analysis uses the current session model and platform app-data directory. Set optional overrides in user `~/.pi/agent/settings.json` or project `.pi/settings.json`: ```json { "good-job": { "directory": "~/shared/gj", "model": "provider/model-id", "thinkingLevel": "xhigh" } } ``` - `good-job.directory`: non-empty path; `~` expands to home; relative paths resolve from Pi's current working directory. - `good-job.model`: `provider/model-id`; unset uses the current session model. - `good-job.thinkingLevel`: `minimal`, `low`, `medium`, `high`, `xhigh`, or `max`; unset uses the provider default. The old `goodJob` key is no longer read. There are no flags or environment variables for these settings. Precedence per key: trusted project settings, user settings, unset. Project settings apply only when Pi trusts the project; untrusted project settings are ignored. An invalid value never falls back to a lower source. It fails startup, capture, or `/gj` with an error such as `Invalid good-job.thinkingLevel from project settings: must be minimal, low, medium, high, xhigh, or max`. `/gj learn` leaves the active model, thinking level, and tools unchanged. ## Behavior Each record stores feedback kind, memorable slug, short ID, raw feedback, evidence, behaviors, candidate rule, provenance, model, usage, and timestamps. Praise IDs use `gj-xxxxxxxxxx`; problem IDs use `wtf-xxxxxxxxxx`. Queue state moves atomically through `pending`, `processing`, `records`, or `failed` directories. When old data exists in the platform default directory, startup converts version-1 records and moves them into the configured directory. Identical migrated IDs deduplicate; conflicting contents stop migration without overwrite. ## Debug Opt in through [debug contract](../DEBUG.md). Safe events: `session.start`, `session.shutdown`, `runtime.start.start`, `runtime.start.finish`, `runtime.start.error`, `runtime.stop.start`, `runtime.stop.finish`, `runtime.stop.error`.