@davidorex/pi-behavior-monitors 0.14.4 → 0.26.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/README.md +7 -2
- package/agents/commit-hygiene-classifier.agent.yaml +2 -1
- package/agents/fragility-classifier.agent.yaml +2 -1
- package/agents/hedge-classifier.agent.yaml +2 -1
- package/agents/unauthorized-action-classifier.agent.yaml +2 -1
- package/agents/work-quality-classifier.agent.yaml +2 -1
- package/dist/index.d.ts +122 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +403 -188
- package/dist/index.js.map +1 -1
- package/examples/fragility.monitor.json +3 -5
- package/examples/hedge.monitor.json +1 -1
- package/examples/work-quality.monitor.json +2 -4
- package/package.json +10 -7
- package/schemas/monitor-instruction-list.schema.json +15 -0
- package/schemas/monitor-pattern-list.schema.json +20 -0
- package/schemas/monitor.schema.json +3 -7
- package/skills/pi-behavior-monitors/SKILL.md +23 -23
- package/skills/pi-behavior-monitors/references/bundled-resources.md +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,16 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.14.6] - 2026-04-27
|
|
4
|
+
|
|
5
|
+
### Changed
|
|
6
|
+
- Monitor discovery uses a three-tier multi-location loader (project `.pi/monitors/` > global `~/.pi/agent/monitors/` > bundled `<package>/examples/`) instead of the prior copy-on-first-run `seedExamples()` pattern. Bundled monitor changes (e.g., the `agent_end` routing fix in commit affe992) now propagate to all installations automatically because the bundled tier reads the package examples directly. First match by `monitor.name` wins; same-name shadowing across tiers logs a one-line warning at session_start so drift is visible.
|
|
7
|
+
- Existing files in `.pi/monitors/` continue to work as project-level overrides under the new model. To receive bundled-monitor updates, delete the per-monitor files in `.pi/monitors/`. The override warning at session_start identifies which monitors are currently shadowed and where the bundled version lives.
|
|
8
|
+
|
|
9
|
+
### Removed
|
|
10
|
+
- `seedExamples()` and the seeded-count notification — bundled monitors are no longer copied into user `.pi/monitors/` directories at first run.
|
|
11
|
+
- `resolveProjectMonitorsDir` export — replaced internally by a private `findProjectMonitorsDir(): string | null` helper that returns null instead of synthesizing a cwd-rooted fallback path.
|
|
12
|
+
- Internal `copyDirRecursive` helper — `scripts/generate-skills.js` retains its own private copy.
|
|
13
|
+
|
|
3
14
|
## [0.3.0] - 2026-03-18
|
|
4
15
|
|
|
5
16
|
## [0.2.0] - 2026-03-17
|
package/README.md
CHANGED
|
@@ -12,7 +12,12 @@ pi install npm:@davidorex/pi-behavior-monitors
|
|
|
12
12
|
|
|
13
13
|
Or install all three extensions at once: `pi install npm:@davidorex/pi-project-workflows`
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Five example monitors ship bundled with the package and load by default from a
|
|
16
|
+
three-tier search (project `.pi/monitors/` > global `~/.pi/agent/monitors/` >
|
|
17
|
+
bundled `examples/`); first match by name wins. To customize one, create
|
|
18
|
+
`.pi/monitors/<name>.monitor.json` in your project — the override fully replaces
|
|
19
|
+
the bundled version by name. Delete the override to revert and pick up bundled
|
|
20
|
+
updates automatically.
|
|
16
21
|
|
|
17
22
|
## Bundled Example Monitors
|
|
18
23
|
|
|
@@ -62,6 +67,6 @@ Create a `.monitor.json` file in `.pi/monitors/` conforming to `schemas/monitor.
|
|
|
62
67
|
|
|
63
68
|
## Development
|
|
64
69
|
|
|
65
|
-
Part of the [`pi-project-workflows`](../../README.md) monorepo. All
|
|
70
|
+
Part of the [`pi-project-workflows`](../../README.md) monorepo. All four packages (pi-context, pi-jit-agents, pi-workflows, pi-behavior-monitors) are versioned in lockstep (current version in each `package.json`).
|
|
66
71
|
|
|
67
72
|
`npm run build` compiles TypeScript to `dist/` via `tsc`. The package ships `dist/`, not `src/`. Tests use `vitest run` (`npm test`).
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
name: commit-hygiene-classifier
|
|
2
2
|
role: sensor
|
|
3
3
|
description: Classifies whether agent committed changes with proper hygiene
|
|
4
|
-
|
|
4
|
+
# Route through openrouter (only credential in ~/.pi/agent/auth.json). Use dot form per openrouter registry; dash form (claude-sonnet-4-6) is the anthropic-direct id.
|
|
5
|
+
model: openrouter/anthropic/claude-sonnet-4.6
|
|
5
6
|
thinking: "on"
|
|
6
7
|
output:
|
|
7
8
|
format: json
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
name: fragility-classifier
|
|
2
2
|
role: sensor
|
|
3
3
|
description: Classifies whether agent left unaddressed fragilities
|
|
4
|
-
|
|
4
|
+
# Route through openrouter (only credential in ~/.pi/agent/auth.json). Use dot form per openrouter registry; dash form (claude-sonnet-4-6) is the anthropic-direct id.
|
|
5
|
+
model: openrouter/anthropic/claude-sonnet-4.6
|
|
5
6
|
thinking: "on"
|
|
6
7
|
output:
|
|
7
8
|
format: json
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
name: hedge-classifier
|
|
2
2
|
role: sensor
|
|
3
3
|
description: Classifies whether assistant deviated from user intent
|
|
4
|
-
|
|
4
|
+
# Route through openrouter (only credential in ~/.pi/agent/auth.json). Use dot form per openrouter registry; dash form (claude-sonnet-4-6) is the anthropic-direct id.
|
|
5
|
+
model: openrouter/anthropic/claude-sonnet-4.6
|
|
5
6
|
thinking: "on"
|
|
6
7
|
output:
|
|
7
8
|
format: json
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
name: unauthorized-action-classifier
|
|
2
2
|
role: sensor
|
|
3
3
|
description: Classifies whether agent is about to take an unauthorized action
|
|
4
|
-
|
|
4
|
+
# Route through openrouter (only credential in ~/.pi/agent/auth.json). Use dot form per openrouter registry; dash form (claude-sonnet-4-6) is the anthropic-direct id.
|
|
5
|
+
model: openrouter/anthropic/claude-sonnet-4.6
|
|
5
6
|
thinking: "on"
|
|
6
7
|
output:
|
|
7
8
|
format: json
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
name: work-quality-classifier
|
|
2
2
|
role: sensor
|
|
3
3
|
description: Classifies work quality issues in agent output
|
|
4
|
-
|
|
4
|
+
# Route through openrouter (only credential in ~/.pi/agent/auth.json). Use dot form per openrouter registry; dash form (claude-sonnet-4-6) is the anthropic-direct id.
|
|
5
|
+
model: openrouter/anthropic/claude-sonnet-4.6
|
|
5
6
|
thinking: "on"
|
|
6
7
|
output:
|
|
7
8
|
format: json
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ExtensionAPI, SessionEntry } from "@
|
|
1
|
+
import type { ExtensionAPI, SessionEntry } from "@earendil-works/pi-coding-agent";
|
|
2
2
|
export interface CollectorDescriptor {
|
|
3
3
|
name: string;
|
|
4
4
|
description: string;
|
|
@@ -39,11 +39,24 @@ export interface MonitorScope {
|
|
|
39
39
|
export interface MonitorAction {
|
|
40
40
|
steer?: string | null;
|
|
41
41
|
learn_pattern?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Monitor write-action contract — closes issue-065 by routing through
|
|
44
|
+
* `@davidorex/pi-context/block-api` rather than raw fs.writeFileSync.
|
|
45
|
+
*
|
|
46
|
+
* `block` (replaces former `path`): the named .project/ block to write
|
|
47
|
+
* to; block-api derives the on-disk path as `<cwd>/.project/<block>.json`
|
|
48
|
+
* and the schema as `<cwd>/.project/schemas/<block>.schema.json`. Removing
|
|
49
|
+
* the explicit `path` + `schema` fields collapses the four prior bypass
|
|
50
|
+
* paths (no AJV, no lock, no DispatchContext stamping, no central choke
|
|
51
|
+
* point) into one validated, locked, attributed write surface.
|
|
52
|
+
*
|
|
53
|
+
* `merge`: "append" calls `appendToBlock`; "upsert" calls
|
|
54
|
+
* `upsertItemInBlock` keyed on `id`.
|
|
55
|
+
*/
|
|
42
56
|
write?: {
|
|
43
|
-
|
|
44
|
-
schema?: string;
|
|
45
|
-
merge: "append" | "upsert";
|
|
57
|
+
block: string;
|
|
46
58
|
array_field: string;
|
|
59
|
+
merge: "append" | "upsert";
|
|
47
60
|
template: Record<string, string>;
|
|
48
61
|
};
|
|
49
62
|
}
|
|
@@ -118,8 +131,78 @@ export interface MonitorMessageDetails {
|
|
|
118
131
|
}
|
|
119
132
|
type MonitorEvent = "message_end" | "turn_end" | "agent_end" | "command" | "tool_call";
|
|
120
133
|
export declare const VALID_EVENTS: Set<string>;
|
|
121
|
-
|
|
122
|
-
|
|
134
|
+
/**
|
|
135
|
+
* Tracks a monitor in a lower-precedence tier whose `name` was shadowed by an
|
|
136
|
+
* earlier (higher-precedence) tier. Surfaced at session_start so users see when
|
|
137
|
+
* a project- or user-level override is hiding a (potentially newer) bundled
|
|
138
|
+
* version. The drift signal is the substitute for copy-on-first-run seeding:
|
|
139
|
+
* package examples now load directly as the third tier, and any project file
|
|
140
|
+
* keeping its older shape is reported here rather than silently winning forever.
|
|
141
|
+
*/
|
|
142
|
+
export interface MonitorOverride {
|
|
143
|
+
name: string;
|
|
144
|
+
winnerDir: string;
|
|
145
|
+
losingDir: string;
|
|
146
|
+
}
|
|
147
|
+
/** Return value of `discoverMonitors`. `monitors` is the deduplicated set used
|
|
148
|
+
* by the runtime; `overrides` is the audit trail of shadowed lower-tier files. */
|
|
149
|
+
export interface MonitorDiscovery {
|
|
150
|
+
monitors: Monitor[];
|
|
151
|
+
overrides: MonitorOverride[];
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Discover monitors across three tiers; first match by `name` wins.
|
|
155
|
+
*
|
|
156
|
+
* Precedence (highest first):
|
|
157
|
+
* 1. project `.pi/monitors/` (walk-up to .git boundary)
|
|
158
|
+
* 2. global `~/.pi/agent/monitors/` (via `getAgentDir()`)
|
|
159
|
+
* 3. bundled `<package>/examples/` (built-in defaults shipped with this extension)
|
|
160
|
+
*
|
|
161
|
+
* Any monitor file in a lower tier whose `name` matches an already-seen
|
|
162
|
+
* higher-tier monitor is recorded in `overrides` (not loaded). This replaces
|
|
163
|
+
* the prior `seedExamples()` copy-on-first-run pattern: bundled fixes (e.g.
|
|
164
|
+
* commit affe992 routing fragility/hedge classifiers through `agent_end`) now
|
|
165
|
+
* propagate to users automatically because tier 3 is read live, not copied.
|
|
166
|
+
*/
|
|
167
|
+
export declare function discoverMonitors(): MonitorDiscovery;
|
|
168
|
+
/**
|
|
169
|
+
* Collect the assistant's response text for the current turn.
|
|
170
|
+
*
|
|
171
|
+
* Walks the branch backward from the tail and aggregates text from every
|
|
172
|
+
* assistant `MessageEntry` until it reaches the most recent user message
|
|
173
|
+
* (turn boundary), at which point the walk stops. Collected segments are
|
|
174
|
+
* reversed back to chronological order and joined with `\n\n`. Empty
|
|
175
|
+
* segments (from tool-call-only assistant messages with no text content)
|
|
176
|
+
* are dropped before joining.
|
|
177
|
+
*
|
|
178
|
+
* Encoded design decisions:
|
|
179
|
+
*
|
|
180
|
+
* - F-014 root-cause fix: previously the function returned from the FIRST
|
|
181
|
+
* assistant message it hit walking backward; when that latest assistant
|
|
182
|
+
* message was tool-call-only, the result was empty even though earlier
|
|
183
|
+
* assistant messages in the same turn carried the user-visible text.
|
|
184
|
+
* The walk now aggregates across all assistant messages in the turn so
|
|
185
|
+
* tool-call-only tail messages no longer mask prior text.
|
|
186
|
+
*
|
|
187
|
+
* - F-018 multi-message-turn semantics: "the assistant's response" is
|
|
188
|
+
* defined as all assistant text emitted from the most recent user
|
|
189
|
+
* message up to the present, joined with double-newline separator.
|
|
190
|
+
* Non-message entries (model_change, label, custom_message,
|
|
191
|
+
* branch_summary, etc.) are skipped — they are not part of the
|
|
192
|
+
* assistant's response.
|
|
193
|
+
*
|
|
194
|
+
* - `extractText` (text-only filter) is intentionally not modified here:
|
|
195
|
+
* tool-call blocks have no user-visible text, and thinking blocks are
|
|
196
|
+
* model-internal reasoning that should not leak into classifier prompts.
|
|
197
|
+
*
|
|
198
|
+
* Edge cases:
|
|
199
|
+
* - Empty branch: returns "".
|
|
200
|
+
* - No user message in branch (e.g., system-init turn): walks to start
|
|
201
|
+
* and returns all collected assistant text.
|
|
202
|
+
* - All assistant messages tool-call-only: returns "" (true empty
|
|
203
|
+
* response, distinct from the F-014 false-positive case).
|
|
204
|
+
*/
|
|
205
|
+
export declare function collectAssistantText(branch: SessionEntry[]): string;
|
|
123
206
|
/**
|
|
124
207
|
* Detect whether the current user message references prior conversation context
|
|
125
208
|
* via backreferences, affirmations, or short messages without action verbs.
|
|
@@ -129,6 +212,7 @@ export declare function isReferentialMessage(text: string): boolean;
|
|
|
129
212
|
export declare function collectConversationHistory(branch: SessionEntry[]): string;
|
|
130
213
|
/** Collector names derived from the runtime registry — used for consistency testing. */
|
|
131
214
|
export declare const COLLECTOR_NAMES: string[];
|
|
215
|
+
export declare function saveInstructions(monitor: Monitor, instructions: MonitorInstruction[]): string | null;
|
|
132
216
|
export type MonitorsCommand = {
|
|
133
217
|
type: "list";
|
|
134
218
|
} | {
|
|
@@ -189,7 +273,39 @@ export declare function extractResponseText(parts: readonly {
|
|
|
189
273
|
* Handles case-insensitive verdict strings and optional fields.
|
|
190
274
|
*/
|
|
191
275
|
export declare function mapVerdictToClassifyResult(parsed: Record<string, unknown>): ClassifyResult;
|
|
276
|
+
export declare function learnPattern(monitor: Monitor, description: string, severity?: string): void;
|
|
192
277
|
export declare function generateFindingId(monitorName: string, _description: string): string;
|
|
278
|
+
/**
|
|
279
|
+
* Apply a monitor's write-action by routing through `@davidorex/pi-context/block-api`.
|
|
280
|
+
*
|
|
281
|
+
* Closes issue-065: the prior body wrote findings via `fs.writeFileSync`
|
|
282
|
+
* after manual JSON read+merge+write, bypassing AJV schema validation,
|
|
283
|
+
* proper-lockfile contention guards, DispatchContext author stamping, and
|
|
284
|
+
* any centralized "monitor wrote here" choke point. This refactor routes
|
|
285
|
+
* every monitor write through `appendToBlock` / `upsertItemInBlock` with
|
|
286
|
+
* a `DispatchContext.writer` of `{ kind: "monitor", monitor_name }` so:
|
|
287
|
+
*
|
|
288
|
+
* 1. AJV validates the entry against `.project/schemas/<block>.schema.json`
|
|
289
|
+
* before write — drift surfaces immediately, not on later reader load.
|
|
290
|
+
* 2. proper-lockfile guards concurrent monitor + LLM writes against the
|
|
291
|
+
* same block file.
|
|
292
|
+
* 3. created_by / created_at / modified_by / modified_at fields, when
|
|
293
|
+
* declared on the destination schema, are stamped with the monitor's
|
|
294
|
+
* writer string ("monitor/<name>") so monitor-authored entries are
|
|
295
|
+
* distinguishable from human / agent / workflow entries downstream.
|
|
296
|
+
* 4. All monitor writes funnel through one execute boundary — the future
|
|
297
|
+
* "detect monitor bypass" check has a single call site to inspect.
|
|
298
|
+
*
|
|
299
|
+
* Failure model: AJV ValidationError or any block-api error is logged via
|
|
300
|
+
* console.error with the monitor name and propagated NO FURTHER. This
|
|
301
|
+
* mirrors the previous fs-write failure handling — a monitor that cannot
|
|
302
|
+
* persist a finding does not crash the host turn; the operator sees the
|
|
303
|
+
* stderr line and can investigate. Re-raising would change the host
|
|
304
|
+
* extension's failure model and is out of scope for this refactor.
|
|
305
|
+
*
|
|
306
|
+
* Exported for unit-test access (Phase F of issue-065 closure plan).
|
|
307
|
+
*/
|
|
308
|
+
export declare function executeWriteAction(monitor: Monitor, action: MonitorAction, result: ClassifyResult): void;
|
|
193
309
|
/**
|
|
194
310
|
* Programmatic monitor invocation — runs classification and write actions for
|
|
195
311
|
* a named monitor, returning the verdict. Unlike activate(), this skips dedup,
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
|