pm-context 2026.10.10 → 2026.10.12

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 CHANGED
@@ -1,5 +1,11 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026.10.12 - 2026-10-12
4
+
5
+ ### Added
6
+
7
+ - pm context-usage: report which served context an agent actually used ([pm-context-ci6v](https://github.com/unbraind/pm-context/blob/main/.agents/pm/features/pm-context-ci6v.toon))
8
+
3
9
  ## 2026.10.5 - 2026-10-05
4
10
 
5
11
  ### Other
package/README.md CHANGED
@@ -29,9 +29,9 @@ pm context-pack --id pm-1234 --max-items 10
29
29
 
30
30
  The command reads workspace data in-process through the typed pm SDK, so packs
31
31
  use the installed CLI's canonical query and relevance engines rather than a
32
- second parser. Normal pack and handoff runs record one best-effort context-usage
33
- serving event for the emitted items when an author is available; `--explain`
34
- does not write to the usage ledger.
32
+ second parser. Normal pack and handoff runs attach a runtime receipt for their rendered facts
33
+ and record a best-effort SDK serving event for visible items when an author is
34
+ available. `--explain` stays observational and creates neither receipt nor event.
35
35
 
36
36
  ## Output
37
37
 
@@ -86,6 +86,8 @@ ceiling.
86
86
 
87
87
  Options:
88
88
 
89
+ - `--session <id>` usage session (also available on `context-handoff`); defaults to
90
+ `PM_CONTEXT_SESSION`, then a fresh receipt id for each bundle
89
91
  - `--id <id>` repeatable item ids to focus
90
92
  - `--ids <id,id>` comma-separated focus item ids (alias for repeated `--id`)
91
93
  - `--status <status>` filter by status
@@ -104,7 +106,7 @@ Options:
104
106
  A breadth-first walk over the dependency relationship graph in both directions
105
107
  (`depends_on`/`blocked_by` edges and their reverse). `0` is equivalent to
106
108
  `--without-neighborhood`; the value is capped at `5`. Depth `1` is the historical
107
- default and produces byte-identical packs to prior versions. Neighbors discovered
109
+ default and preserves the prior item selection. Neighbors discovered
108
110
  at deeper hops are still classified as neighbors (never focus), de-duplicated, and a
109
111
  focus item is never listed as its own neighbor.
110
112
  - `--compress` minimize output tokens (compact JSON, no blank lines)
@@ -120,46 +122,139 @@ Options:
120
122
 
121
123
  `pm context-usage`
122
124
 
123
- Reports which items `pm context` and `pm next` served, and which of those were
124
- actually touched afterwards — the feedback half of "project management = context
125
- management".
125
+ Measures the context bundles generated by `context-pack` and `context-handoff`,
126
+ with separate compatibility metrics from the host's `context`/`next` ledger.
127
+ It reports facts served versus facts reported used per session and item, so
128
+ agents can reduce unused context in their next request.
129
+
130
+ ### Agent usage protocol (v1)
131
+
132
+ 1. Choose a session id and set `PM_CONTEXT_SESSION`, or pass `--session` on each
133
+ serving and reporting command. Refreshing context creates a new receipt;
134
+ reusing a session aggregates those bundle impressions. Without a session,
135
+ each bundle's receipt id becomes its isolated session id.
136
+ 2. Read a pack or handoff. JSON adds `context_receipt` with `protocol`,
137
+ `receipt_id`, `session`, `author`, `served_at`, stable `sections` and `facts`.
138
+ Text annotates headings with `[s-…]` and content lines with `[f-…]`, and ends
139
+ with a receipt/session footer. Preserve those ids in the agent's context.
140
+ 3. Report facts that informed your work, using ids from that receipt. A section
141
+ citation reports all facts in that section. A post-mutation or file-edit hook
142
+ may instead submit touched item ids or edited repository-relative paths.
143
+ Invoke the hook **after successful work**, against the receipt used for it.
144
+ 4. Inspect the session report, then request fewer sections or items when the
145
+ retained evidence repeatedly shows unused context.
126
146
 
127
- pm maintains an append-only ledger at `<pm_root>/runtime/context-usage.jsonl`
128
- (a `serve` row per ranking, a `touch` row per mutation) and folds it into the
129
- `usage_affinity` signal of its built-in relevance model. Nothing surfaces the
130
- ledger itself, so an agent cannot ask *what was I shown, and did I use it?*
131
- This command answers that:
132
-
133
- - **conversion** — share of served items followed by a same-author touch
134
- - **waste** — served but never touched afterwards: context you paid tokens for and did not use
135
- - **misses** — touched but never served: work the ranking failed to surface
147
+ ```bash
148
+ export PM_CONTEXT_SESSION=review-42
149
+ pm context-pack --ids pm-1234,pm-5678 --section focus
150
+ # Copy the actual receipt/fact identifiers from the returned bundle:
151
+ pm context-usage --receipt RECEIPT_ID --cite FACT_ID --json
152
+ pm context-usage --receipt RECEIPT_ID --cite SECTION_ID --json
153
+ # A hook can report later successful mutations or edits:
154
+ pm context-usage --receipt RECEIPT_ID --touch pm-1234 --edited-file src/example.ts
155
+ pm context-usage --session review-42 --json
156
+ pm context-usage --by agent-a --limit 50
157
+ ```
136
158
 
137
- An item counts as *served* only when pm marked it `included` — it actually made
138
- the pack. The per-item `ranked` column counts every appearance, so
139
- `ranked - serves` is how often the item lost to the token budget rather than to
140
- the ranking: tune the budget, not the query. An item that was only ever ranked
141
- and cut is never reported as waste, because the agent never saw it.
159
+ `--cite`, `--touch`, and `--edited-file` accept repeated flags or comma-separated
160
+ values and require `--receipt`. An unknown citation, unserved item/file, invalid
161
+ path, expired receipt, or mismatched session rejects the entire submission.
162
+ Repeated submissions are idempotent. Reports for the same fact can retain all
163
+ three evidence categories without counting the fact as used more than once.
164
+ When a session is supplied explicitly or through the environment it must match
165
+ the selected receipt. Different receipts never inherit one another's evidence,
166
+ even if their fact ids are identical. `--by` filters the recording author;
167
+ the host-owned global `--author` sets invocation identity, not the report filter.
168
+
169
+ A fact is one nonblank rendered text content line (including placeholders), or
170
+ one top-level JSON field value/array entry. Generated timestamps and headings
171
+ are framing. Facts are content-addressed by section, associated item ids, and
172
+ rendered content; unchanged content in the same format keeps its id across
173
+ refreshes. Changed content gets a new id. Repeated identical fragments in one
174
+ section share an id with summed token cost. Section ids hash the rendered name.
175
+ Markdown section filters, body truncation, handoff link limits and packing are
176
+ applied **before** facts are identified. JSON reports all fields in the JSON
177
+ bundle, as with the existing JSON serving format.
178
+
179
+ Only visible item identifiers and visible linked file paths are associated with
180
+ facts; excluded bodies, items and sections cannot receive usage credit. File
181
+ paths are normalized to repository-relative POSIX paths. URLs and absolute or
182
+ traversing paths cannot be reported as edited files. A fact spanning several
183
+ items belongs to each item's rollup, so item totals can overlap; session and
184
+ bundle totals count that fact once.
185
+
186
+ The JSON report adds `bundles`, with `totals`, `sessions`, `items`, and `receipts`:
187
+
188
+ - `precision = used_facts / served_facts` (`null` for no served facts).
189
+ - `cited_facts`, `touch_facts`, and `edit_facts` separate explicit citations from
190
+ mutation/edit proxies. An uncited read can be reported explicitly by fact id.
191
+ - `estimated_served_tokens` sums fact cost, estimated as `ceil(characters / 4)`
192
+ per rendered fragment. `unused_context_tokens` sums only unused facts.
193
+ These are estimates, not tokenizer measurements, billing, or cognitive-use proof.
194
+ - `protocol_tokens` separately estimates receipt/annotation overhead; headings,
195
+ generated clocks and other framing are outside the fact-cost denominator.
196
+ - `unused_fact_ids` identifies unused facts in each detailed receipt. Aggregate
197
+ metrics are computed before `--limit` truncates the detail arrays.
198
+
199
+ Metrics describe the complete bundle handed to the command host or written to
200
+ `--output`. The SDK does not expose a fact-level post-egress callback, so later
201
+ host truncation, omitted responses, or an agent failing to read a saved file
202
+ cannot be inferred. For complete delivery use `--output` and read the resulting
203
+ file, or the host's unbounded output controls. Agents must submit evidence;
204
+ silence means **unreported usage**, not proven irrelevance. Host ledger touches
205
+ carry no session or fact ids and are never automatically credited to a receipt.
206
+
207
+ ### Runtime storage and failure handling
208
+
209
+ Receipts live exclusively in the tracker's ignored
210
+ `runtime/context-receipts/` directory. Each atomic JSON snapshot stores ids,
211
+ associations, token estimates and deduplicated evidence, **no context text**.
212
+ Rotation keeps the current receipt and the most recently written siblings, at
213
+ most 200 snapshots of 256 KiB each (50 MiB maximum retained receipt data).
214
+ Older receipts are deleted; their
215
+ metrics leave the retained-window report. Successful evidence writes refresh a
216
+ receipt's retention position. There is no tracked receipt file or schema change,
217
+ and the host-owned `runtime/context-usage.jsonl` remains under SDK ownership.
218
+ The receipt returned by the current serving call is protected during rotation,
219
+ including when older snapshots have future modification times. The remaining
220
+ 199 slots retain the most recently written siblings.
221
+
222
+ A directory lock serializes cooperating writers; contention fails a usage
223
+ submission and can be retried. A process crash can leave `.lock`; an operator
224
+ may remove that abandoned lock after ensuring no writer is running. Corrupt,
225
+ oversized or partial snapshots are skipped and counted as `malformed_receipts`.
226
+ Serving failures disclose `context_receipt_error` in JSON or a receipt-unavailable
227
+ message in text and still return context. They do not claim measured usage.
228
+ `--explain` creates no receipt. Failed output-file writes roll back their receipt.
229
+
230
+ ### Host ledger compatibility report
231
+
232
+ The existing report still reads pm's bounded `runtime/context-usage.jsonl` and
233
+ surfaces **conversion** (same-author serve followed by a touch), **waste**
234
+ (served without a later touch), and **misses** (touched without a serve).
235
+ It uses serve rows' `included` flags; `ranked - serves` identifies budget losses.
236
+ Recognized delivery rows do not change that legacy denominator. This historical
237
+ conversion is separate from the receipt/session metrics and cannot establish
238
+ fact usage or final delivery. When `--by` is supplied, SDK-decayed affinity is
239
+ shown when available; the package does not implement a competing relevance model.
142
240
 
143
241
  ```bash
144
- pm context-usage # markdown brief
145
- pm context-usage --json # raw report
146
- pm context-usage --surface next --since 7d
147
- pm context-usage --author agent-a --limit 50
242
+ pm context-usage
243
+ pm context-usage --surface next --since 7d --json
148
244
  ```
149
245
 
150
- Options:
246
+ Report options:
151
247
 
152
- - `--author <author>` restrict to one recording author
153
- - `--surface <context|next>` restrict serve events to one surface
154
- - `--since <when>` drop events at or before an ISO timestamp or a day offset (`7d`, `-7d`, `7`)
155
- - `--limit <n>` maximum per-item rows (default `20`)
156
- - `--format <markdown|json>` output format (default `markdown`); pm's global `--json` also selects JSON
248
+ - `--session <id>` filter bundle receipts (also reads `PM_CONTEXT_SESSION`)
249
+ - `--receipt <id>` filter or submit evidence to one bundle receipt
250
+ - `--cite <ids>`, `--touch <ids>`, `--edited-file <paths>` submit usage evidence
251
+ - `--by <author>` filter both reports by recording author
252
+ - `--surface <context|next>` filter only legacy host serve events
253
+ - `--since <when>` drop serves at or before an ISO timestamp or day offset
254
+ (`7d`, `-7d`, `7`); bundle evidence is attributed to the receipt's serve time
255
+ - `--limit <n>` maximum detail rows (default `20`)
256
+ - `--format <markdown|json>`; the global `--json` also selects JSON
157
257
 
158
- The command is strictly read-only. The ledger is pm's file, with pm's schema and
159
- pm's pruning, and it deliberately reports only what the ledger states directly —
160
- it does **not** compute a competing affinity score, because pm owns the decay
161
- model and a second implementation could silently disagree with the ranking it
162
- purports to explain.
163
258
 
164
259
  ## Philosophy
165
260
 
@@ -183,3 +278,39 @@ itself lists each affected stream in its output; `pm history --verify <id>` spot
183
278
  content, so `reconcile` only re-greens the hash chain (no data loss) — see the authoritative
184
279
  [pm-cli merge-safety guide](https://github.com/unbraind/pm-cli/blob/main/docs/MERGE_SAFETY.md). The
185
280
  older blunt `pm history-repair --all` remains available as a lower-level primitive.
281
+
282
+ The existing quality owner, `pm-context-3s5f`, remains open. The native coverage
283
+ gate enforces 100% lines, branches and functions for six configured files; it
284
+ does not expose an independent statement counter. A separate c8 observation
285
+ includes all ten authored TypeScript/JavaScript executables. Neither measurement
286
+ covers the shell alert helper, so passing the release command does not establish
287
+ whole-source 100/100/100/100.
288
+
289
+ | Authored executable | Native gate | Separate c8 observation |
290
+ | --- | --- | --- |
291
+ | `index.ts` | Included | Included |
292
+ | `context-receipts.ts` | Included | Included |
293
+ | `context-usage.ts` | Included | Included |
294
+ | `scripts/coverage-gate.ts` | Included | Included |
295
+ | `scripts/docstring-gate.ts` | Included | Included |
296
+ | `scripts/verify-release-publish-attestation.ts` | Included | Included |
297
+ | `scripts/main-invocation.ts` | Outside configured scope | Included |
298
+ | `scripts/prepare-merge-driver.ts` | Outside configured scope | Included |
299
+ | `scripts/verify-release-changelog-date.ts` | Outside configured scope | Included |
300
+ | `.agents/pm/verify-release-yaml.mjs` | Outside configured scope | Included |
301
+ | `scripts/alert-on-release-failure.sh` | Unmeasured | Unmeasured |
302
+
303
+ Coverage reports are removed before configuration validation and on runner or
304
+ inventory failures, preventing an earlier report from surviving a failed gate.
305
+ The parsed-workflow verifier has disposable real-file acceptance and rejection
306
+ fixtures in `test/release-workflow-verifier.test.ts`; those tests never contact
307
+ GitHub or mutate release controls.
308
+
309
+ The documentation launcher checks the pm-ops analyzer's selected declaration
310
+ policy. It excludes anonymous callbacks and several internal declaration forms,
311
+ so its passing count does not certify documentation of every authored declaration.
312
+ The managed merge-driver launcher must remain byte-identical to the pinned
313
+ pm-ops template; its internal callback is part of the outstanding documentation
314
+ scope. The alert and workflow-verifier migration also requires coordinating the
315
+ existing `pm-context-qu0a` ownership before migrating its linked paths. No helper
316
+ has been marked removed while that dependency remains unresolved.
@@ -0,0 +1,115 @@
1
+ /** Physical retention ceilings: at most 200 receipts of 256 KiB each. */
2
+ export declare const RECEIPT_LIMITS: {
3
+ readonly count: 200;
4
+ readonly bytes: 262144;
5
+ };
6
+ /** Isolated, ignored tracker runtime directory used by this protocol. */
7
+ export declare const RECEIPTS_RELATIVE_PATH: string;
8
+ /** Explicit evidence categories; a touch or edit is a usage proxy, not a citation. */
9
+ export type UsageSignal = "citation" | "touch" | "edit";
10
+ /** One content-addressed unit that was present in the rendered bundle. */
11
+ export interface ContextFact {
12
+ id: string;
13
+ section_id: string;
14
+ item_ids: string[];
15
+ files: string[];
16
+ estimated_tokens: number;
17
+ }
18
+ /** Stable section identifier and its rendered name. */
19
+ export interface ContextSection {
20
+ id: string;
21
+ name: string;
22
+ }
23
+ /** Public receipt returned alongside the context; no context text is persisted. */
24
+ export interface ContextReceipt {
25
+ protocol: "pm-context-usage/v1";
26
+ receipt_id: string;
27
+ session: string;
28
+ author: string;
29
+ served_at: string;
30
+ command: string;
31
+ sections: ContextSection[];
32
+ facts: ContextFact[];
33
+ protocol_tokens: number;
34
+ }
35
+ /** Item/file associations from the selected pack, intersected with rendered text. */
36
+ export interface ReceiptAssociations {
37
+ item_ids: string[];
38
+ files: Array<{
39
+ itemId: string;
40
+ value: string;
41
+ }>;
42
+ }
43
+ /** Serving identity; an omitted session defaults to this bundle's receipt id. */
44
+ export interface ReceiptIdentity {
45
+ session?: string;
46
+ author: string;
47
+ command: string;
48
+ }
49
+ /** Usage evidence submitted by an agent or its post-mutation/edit hook. */
50
+ export interface ReceiptUsage {
51
+ receipt_id: string;
52
+ session?: string;
53
+ citations: string[];
54
+ touched_items: string[];
55
+ edited_files: string[];
56
+ }
57
+ /** Precision-style metrics over retained receipt/fact impressions. */
58
+ export interface ReceiptMetrics {
59
+ served_facts: number;
60
+ used_facts: number;
61
+ cited_facts: number;
62
+ touch_facts: number;
63
+ edit_facts: number;
64
+ precision: number | null;
65
+ estimated_served_tokens: number;
66
+ unused_context_tokens: number;
67
+ protocol_tokens: number;
68
+ }
69
+ /** Filtered runtime report; limits affect detail rows, never the aggregate. */
70
+ export interface ReceiptReport {
71
+ protocol: "pm-context-usage/v1";
72
+ retained_receipts: number;
73
+ malformed_receipts: number;
74
+ totals: ReceiptMetrics;
75
+ sessions: Array<ReceiptMetrics & {
76
+ session: string;
77
+ }>;
78
+ items: Array<ReceiptMetrics & {
79
+ id: string;
80
+ }>;
81
+ receipts: Array<ReceiptMetrics & {
82
+ receipt_id: string;
83
+ session: string;
84
+ unused_fact_ids: string[];
85
+ }>;
86
+ }
87
+ /** Narrow receipt reports by session, author, time, or one receipt identifier. */
88
+ export interface ReceiptReportOptions {
89
+ session?: string;
90
+ author?: string;
91
+ since?: string;
92
+ receipt_id?: string;
93
+ limit: number;
94
+ }
95
+ /** Normalize only repository-relative file evidence, rejecting URLs and traversal. */
96
+ export declare function normalizeReceiptFile(value: string): string;
97
+ /**
98
+ * Build facts from exactly the rendered content, annotate text or attach a JSON
99
+ * manifest, and persist its receipt. Fact hashes exclude clocks and receipt ids.
100
+ * Write failures propagate so callers disclose that measurement is unavailable.
101
+ */
102
+ export declare function serveContextReceipt(pmRoot: string, output: string, format: "json" | "text", associations: ReceiptAssociations, identity: ReceiptIdentity, outputPath?: string): {
103
+ output: string;
104
+ receipt: ContextReceipt;
105
+ };
106
+ /**
107
+ * Record explicit, receipt-scoped usage. Unknown ids reject the entire update;
108
+ * repeat reports are idempotent. Item/file proxies match only facts in this receipt.
109
+ */
110
+ export declare function recordReceiptUsage(pmRoot: string, usage: ReceiptUsage): void;
111
+ /** Read retained receipts, report skipped corruption, and aggregate before limiting detail. */
112
+ export declare function reportContextReceipts(pmRoot: string, options: ReceiptReportOptions): ReceiptReport;
113
+ /** Render the receipt denominator, usage proxies and unused estimated cost as a brief. */
114
+ export declare function renderReceiptReport(report: ReceiptReport): string;
115
+ //# sourceMappingURL=context-receipts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-receipts.d.ts","sourceRoot":"","sources":["../context-receipts.ts"],"names":[],"mappings":"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"}