pi-observable-coding-agent
A local-first observability and workflow review extension for Pi coding agents
Package details
Install pi-observable-coding-agent from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-observable-coding-agent- Package
pi-observable-coding-agent- Version
0.0.2- Published
- Aug 6, 2026
- Downloads
- 161/mo · 9/wk
- Author
- h-yu-u
- License
- MIT
- Types
- extension
- Size
- 146.1 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./dist/extension.js"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
Pi Observable Coding Agent
A local-first Pi extension that turns coding-agent sessions into structured task runs, deterministic workflow reviews, and evidence-backed Skill improvement candidates.
Version 0.3 observes the agent without changing its decisions. After Pi fully settles a task, it:
- Correlates tool calls and results, including duration and failure fingerprints.
- Normalizes built-in file reads and uses workspace snapshots to resolve opaque shell mutations.
- Separates completed tasks from tasks with passing verification evidence.
- Classifies task type, user corrections, validation retries, and repeated errors.
- Records Skill version hashes, activation level, and optional deterministic checkpoints.
- Calculates both per-run findings and cross-run workflow insights.
- Persists the complete structured run as JSONL and a durable Pi session entry.
- Exposes
/trace,/review, and a local Web dashboard for inspection. - Turns deterministic lessons into previewable, project-local Skills on explicit request.
- Groups multiple TaskRuns by their originating Pi session and assigns chronological run positions.
Install for local development
npm install
npm run verify
pi -e /absolute/path/to/observable-coding-agent
To install it as a Pi package after building:
pi install /absolute/path/to/observable-coding-agent
Commands
/trace: show the active trace or the most recently completed task./review: show deterministic bottlenecks and Skill candidates for the last task./skill-draft [run-id]: preview generated Skills without writing files./skill-create <candidate-number> [run-id]: create one project-local Skill./observe: start the local dashboard and print its URL./observe stop: stop the dashboard server.
The completed task also appears as a durable [observe] card in the Pi transcript. Expanding the card shows the review.
Local dashboard
Run /observe, then open the returned http://127.0.0.1:<port> address. The dashboard opens on cross-run Insights: session and run counts, verification rate, average duration and tool usage, user-correction rate, recurring bottlenecks, task categories, and Skill-version evidence. The sidebar groups TaskRuns by Pi session and labels each run with its chronological position, for example Session 019fd654 · Run 3/4. Every aggregate can be traced back to the individual runs, timelines, files, validations, findings, and Skill candidates. It refreshes every five seconds. A run-level Skill lesson includes a Generate Skill action that writes only to that task project's .agents/skills/ directory.
Failed tool, validation, and assistant events display their redacted reason in the run Overview, inline in the Timeline, and beside failed file operations. When a validation tool returns structured blockers or changed-scope diagnostics, those concrete reasons take precedence over a truncated JSON preview. A single failure remains visible even when it does not meet the threshold for a workflow bottleneck finding.
The server binds only to 127.0.0.1, serves a fixed asset allowlist, and applies a restrictive Content Security Policy. GET is used for observation; the sole write endpoint accepts same-origin POST requests for project-local Skill creation. It stops when the Pi session shuts down or when /observe stop is called.
Storage
The full TaskRun is appended to observability/task-runs.jsonl next to the current Pi session file. For an in-memory session it falls back to <cwd>/.pi/observability/task-runs.jsonl.
Override the directory when needed:
PI_OBSERVABILITY_DIR=/absolute/private/path pi
Files are created with user-only permissions where supported. The extension stores paths, bounded/redacted tool inputs, and short redacted result previews. It does not intentionally store full file contents. Keys matching token, password, secret, cookie, authorization, and API-key patterns are removed; bearer tokens and common uppercase credential assignments are also redacted.
Existing v0.1 JSONL records are normalized in memory when read. New records use schemaVersion: 2; the original append-only data is never rewritten.
Observable Skill checkpoints
Loaded Skills are distinguished from explicitly or implicitly activated Skills. Only activated Skills participate in checkpoint evaluation and cross-run Skill metrics.
A Skill can optionally place observability.json beside its SKILL.md:
{
"checkpoints": [
{
"id": "read-failing-source",
"description": "Read the exact failing source before editing",
"tool": "read"
},
{
"id": "run-targeted-check",
"commandPattern": "typecheck|tsc|test"
},
{
"id": "touch-test-file",
"filePattern": "(?:^|/)test/|\\.test\\."
}
]
}
Checkpoint evidence is deterministic: successful tool calls, matching commands, or matching file activity. Invalid patterns simply produce no evidence; they never break the agent run.
Per-run reviews expose provisional “Skill lessons” so useful evidence is visible immediately. They are recommendations, not generated Skill files. The Insights view promotes a lesson to an evidence-backed Skill candidate only after the same bottleneck appears in at least three distinct runs, and lists the contributing run IDs.
Generate a Skill
Preview lessons from the latest run or a run ID prefix:
/skill-draft
/skill-draft da50b44b
Create candidate 1 from that run:
/skill-create 1 da50b44b
The explicit create command and Dashboard button generate:
.agents/skills/<generated-name>/
├── SKILL.md
├── observability.json
└── agents/openai.yaml
One or two evidence runs produce a provisional Skill; three distinct runs produce an evidence-backed Skill. Creation uses an atomic temporary directory and never overwrites an existing target. Generated Skills remain project-local; global installation and automatic updates are intentionally outside this version.
Run /reload in Pi after creation so the current session discovers the new project Skill. A newly started Pi session discovers it automatically after the project trust check.
Current deterministic findings
- Excessive exploration before the first successful mutation.
- Multiple failed tool calls.
- Repeated identical errors.
- Multiple validation → repair → validation loops, even if the final validation passes.
- High-frequency repeated mutation of the same file.
- Repair mutations made before the affected file is re-read after a failed validation (a heuristic blind-edit signal).
- Mutations without recognized verification evidence.
- Failed verification with no later passing evidence.
- User corrections that indicate goal misunderstanding.
- Activated Skill checkpoints without evidence.
These rules are deliberately explainable. A later analyzer can add model-assisted interpretation without replacing the deterministic evidence layer.
Current limitations
- Workspace snapshots use file size and modification time and exclude large generated directories. Extremely large workspaces fall back to an unknown workspace mutation.
- A
verifiedoutcome means the final recognized validation passed; it does not erase earlier rework findings, independently prove product correctness, or distinguish every possible pre-existing failure. - Implicit Skill activation is conservative and only inferred when the prompt names the Skill. Loaded Skills are not treated as used.
- Skill creation requires an explicit terminal command or Dashboard click. Existing Skill directories are never overwritten or updated automatically.
- Cross-run aggregation reads up to 200 records per workspace and keeps the latest 500 globally. SQLite indexing and long-term retention controls are not included yet.
npm release
Run the complete test, build, smoke, package-manifest, and sensitive-content checks:
npm run release:check
Preview exactly what npm would publish without changing the registry:
npm run release:dry-run
Bump the package version without creating a Git tag, then publish explicitly:
npm run release:version:patch
npm run release:publish
release:version:minor and release:version:major are also available. The publish command always targets the public npm registry and reruns the release gate before uploading.