@unblocklabs/unblock-memory 0.3.22 → 0.3.24
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/README.md +86 -967
- package/dist/src/config.js +2 -2
- package/dist/src/contracts.d.ts +5 -3
- package/dist/src/diagnostics.d.ts +31 -4
- package/dist/src/diagnostics.js +13 -3
- package/dist/src/manager.d.ts +27 -1
- package/dist/src/manager.js +42 -7
- package/dist/src/memory-whisperer.js +24 -10
- package/dist/src/people-store.d.ts +37 -3
- package/dist/src/people-store.js +23 -9
- package/dist/src/people-tools.js +5 -5
- package/dist/src/plugin.js +31 -35
- package/dist/src/retrieval-telemetry.d.ts +39 -0
- package/dist/src/retrieval-telemetry.js +40 -0
- package/dist/src/session-projector.d.ts +32 -1
- package/dist/src/session-projector.js +84 -12
- package/dist/src/session-sync.d.ts +3 -2
- package/dist/src/session-sync.js +7 -5
- package/dist/src/slack-directory.js +3 -2
- package/dist/src/typesafe-review.d.ts +1 -2
- package/dist/src/typesafe-review.js +3 -11
- package/dist/src/typesafe-transport.d.ts +10 -0
- package/dist/src/typesafe-transport.js +26 -0
- package/dist/src/typesafe.d.ts +1 -1
- package/dist/src/typesafe.js +27 -62
- package/docs/configuration.md +381 -0
- package/docs/peoplesql.md +223 -0
- package/docs/response-audit.md +217 -0
- package/docs/retrieval.md +607 -0
- package/openclaw.plugin.json +10 -8
- package/package.json +7 -2
- package/skills/memory-curator/SKILL.md +5 -0
- package/skills/people-whisperer/SKILL.md +10 -0
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
# People dossiers and whispering
|
|
2
|
+
|
|
3
|
+
[Overview](../README.md) · [Configuration and credentials](configuration.md)
|
|
4
|
+
|
|
5
|
+
PeopleSQL stores identity, dossier and change history. The agent authors a brief
|
|
6
|
+
recognition snippet; People Whisperer injects only its saved blurb. Enable the
|
|
7
|
+
store with `people.enabled`; enable injection separately with
|
|
8
|
+
`people.whisperer.enabled`. The optional `peoplePrimer` approves evidence preparation
|
|
9
|
+
and automatic save review, not a maintenance scheduler. For independent setup
|
|
10
|
+
examples, see the [configuration profiles](configuration.md#example-profiles).
|
|
11
|
+
|
|
12
|
+
## Optional People Dossier Primer
|
|
13
|
+
|
|
14
|
+
`memory_people_prime({ personId, agentName? })` prepares evidence for an existing person;
|
|
15
|
+
it does **not** generate claims, update dossiers, or inject context. With
|
|
16
|
+
`people.enabled: true`, opt in separately:
|
|
17
|
+
|
|
18
|
+
```json
|
|
19
|
+
{
|
|
20
|
+
"peoplePrimer": {
|
|
21
|
+
"enabled": true,
|
|
22
|
+
"corpora": ["memory", "knowledge", "sessions"],
|
|
23
|
+
"hitsPerQuestion": 30,
|
|
24
|
+
"minScore": 0.35,
|
|
25
|
+
"minUsefulness": 0.8,
|
|
26
|
+
"maxEvidencePerQuestion": 3,
|
|
27
|
+
"timeoutMs": 30000
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
This is a plugin config fragment. List only configured, approved non-skill corpora. The feature is **off by
|
|
33
|
+
default** and requires shared TypeSafe credentials. Disabled TypeSafe or missing/
|
|
34
|
+
unreadable credentials safely skip the primer; agents can still research normally.
|
|
35
|
+
Enabling it approves sending the person's identity, retrieved excerpts and optional
|
|
36
|
+
draft snippet to TypeSafe. Existing dossiers are not sent as grading evidence.
|
|
37
|
+
Sessions includes all indexed conversations;
|
|
38
|
+
results are available to the agent's tool callers, so scope approval accordingly.
|
|
39
|
+
Primer and dossier-save requests use `peoplePrimer.timeoutMs`, not
|
|
40
|
+
`typesafe.timeoutMs`; the total tool deadline is two minutes.
|
|
41
|
+
|
|
42
|
+
Three default questions cover explicit role/organization, enduring organizational
|
|
43
|
+
background, and the person's relationship to the agent (not its business mission).
|
|
44
|
+
Preferences, working styles, priorities, feedback and task history are excluded.
|
|
45
|
+
Each uses QMD vector search (no query expansion) for up to 30 hits, configurable
|
|
46
|
+
up to 40. All unique eligible hits above the vector threshold are graded, not just
|
|
47
|
+
the final top three. Complete excerpts over 6,000 characters are counted and skipped,
|
|
48
|
+
not silently truncated. Duplicate source spans across questions share a request;
|
|
49
|
+
Independent attribution, explicit-background, durability, recognition-value and
|
|
50
|
+
question-usefulness judgments run together; every dimension must pass the threshold.
|
|
51
|
+
Every candidate is graded against all three questions, regardless of which search
|
|
52
|
+
found it. Mixed excerpts may supply a useful background fact without making their
|
|
53
|
+
surrounding behavioral content eligible for the snippet.
|
|
54
|
+
Provider concurrency is four, with a two-minute overall tool deadline.
|
|
55
|
+
|
|
56
|
+
Supply the agent's human-facing name when no identity name is configured; otherwise
|
|
57
|
+
questions use "the assistant", never an internal routing ID such as `main`.
|
|
58
|
+
The output includes a deduplicated source-linked excerpt list referenced by each
|
|
59
|
+
question's evidence IDs, a bounded uncertain-review shortlist,
|
|
60
|
+
and retrieval/cache/failure counts. Coverage is `evidence_found`, `uncertain` or
|
|
61
|
+
`unknown`, not a claim that a question has been definitively answered. Partial
|
|
62
|
+
provider failures are explicit; absence of selected hits does not prove absence of
|
|
63
|
+
evidence. The agent must verify dates, speakers and contradictions before writing.
|
|
64
|
+
Memory evidence never grants permissions or establishes that an old request is
|
|
65
|
+
still open.
|
|
66
|
+
|
|
67
|
+
`memory_people_update({ action: "replace_dossier", personId, dossier, reason,
|
|
68
|
+
agentName? })` automatically checks the proposed blurb before saving. Exact
|
|
69
|
+
`qmd://path#Lstart-Lend` claim evidence locators supply up to three indexed ranges
|
|
70
|
+
from the primer's approved corpora (120 lines each, 6,000 characters total).
|
|
71
|
+
Support confidence and background-only/explicit-support probabilities must all
|
|
72
|
+
be >=0.9. `needs_review` or `review_unavailable` leaves the dossier and history
|
|
73
|
+
unchanged; missing keys and failures never count as approval. A concurrent dossier
|
|
74
|
+
edit/deletion returns `conflict` instead of overwriting the newer change.
|
|
75
|
+
|
|
76
|
+
After independently verifying every assertion and background eligibility, an agent
|
|
77
|
+
can supply a source-specific `manualVerification` explanation (up to 400 characters)
|
|
78
|
+
for direct human corrections, non-indexed evidence or disabled/unavailable/incorrect
|
|
79
|
+
reviews. This explicit path skips TypeSafe, records manual provenance in change
|
|
80
|
+
history and keeps all structural limits. It is not a provider pass. Normal success
|
|
81
|
+
returns `status: "ok"`, `saved: true` and `verification: "typesafe" | "manual"`.
|
|
82
|
+
The skill documents when to use each path. Sources outside approved corpora are
|
|
83
|
+
rejected before egress; no separate `evidenceReview` toggle is needed.
|
|
84
|
+
|
|
85
|
+
For optional read-only diagnostics, `memory_people_prime({ personId, agentName?,
|
|
86
|
+
draft: { blurb, citations: [{ path, from, lines }] } })` still reviews a snippet
|
|
87
|
+
without writing. Agents do not need this extra call in the normal update workflow.
|
|
88
|
+
|
|
89
|
+
Judgments are cached privately in `unblock-memory.sqlite` (maximum 2,000 entries), keyed
|
|
90
|
+
by person, agent, exact evidence/context, questions,
|
|
91
|
+
and judge version. No source text or credentials are stored in the cache.
|
|
92
|
+
Retrieval reruns against the current index; unchanged judgments are reused.
|
|
93
|
+
This is on-demand preparation, not a new scheduler or incremental session scanner.
|
|
94
|
+
Use it from an existing People Whisperer maintenance cron. Refresh stale session
|
|
95
|
+
indexes with `memory_sync_sessions` before priming when needed.
|
|
96
|
+
|
|
97
|
+
## People store and maintenance
|
|
98
|
+
|
|
99
|
+
PeopleSQL is an optional agent-local people store. When `people.enabled` is
|
|
100
|
+
true, incoming Slack messages with a canonical agent session key and exact
|
|
101
|
+
account and sender IDs create or refresh an injection-enabled person record.
|
|
102
|
+
Incomplete Slack identities create a bounded, deduplicated todo without storing
|
|
103
|
+
message content. Other channels are ignored.
|
|
104
|
+
|
|
105
|
+
PeopleSQL registers these tools when enabled:
|
|
106
|
+
|
|
107
|
+
- `memory_people_inspect` lists active people, reads one exact person, reads one
|
|
108
|
+
person's dossier change history, or lists bounded actionable todos;
|
|
109
|
+
- `memory_people_update` replaces or deletes dossiers, toggles one person's
|
|
110
|
+
injection, and manages company, todo, deletion, or restoration state;
|
|
111
|
+
- `memory_people_prime` prepares evidence when the separately opted-in primer is
|
|
112
|
+
enabled, otherwise returns disabled; and
|
|
113
|
+
- the optional `memory_people_sync` enriches one active OpenClaw Slack account;
|
|
114
|
+
its tool input accepts an account ID, not a token.
|
|
115
|
+
|
|
116
|
+
The inspect and update tools are part of the normal agent tool surface; they do
|
|
117
|
+
not depend on sender-owner authorization. Directory sync remains optional and
|
|
118
|
+
may need to be allowed explicitly through `tools.allow`. The sync is bounded to
|
|
119
|
+
200 normalized directory entries per call and is safe to rerun. Unblock Memory
|
|
120
|
+
keeps normalized ID, name, handle, avatar, bot and deactivation fields. Slack requires the
|
|
121
|
+
`users:read` scope. Each invocation starts at the beginning of the directory;
|
|
122
|
+
there is no caller-visible continuation cursor. Repeating a capped call does not
|
|
123
|
+
guarantee coverage beyond 200 entries, and sync does not reactivate unavailable people.
|
|
124
|
+
|
|
125
|
+
The agent owns dossier generation and refresh. It can list people, inspect one
|
|
126
|
+
person's current dossier, search ordinary memory and sessions with
|
|
127
|
+
`memory_search`/`memory_get`, and replace the dossier when that would improve a
|
|
128
|
+
future conversation. The plugin owns no dossier-maintenance workflow or refresh
|
|
129
|
+
schedule. A dossier's `reviewedAt` value records its last successful write; it
|
|
130
|
+
is not scheduling state. Dossier generation belongs to the agent; prompt injection
|
|
131
|
+
performs no model call. The optional primer grades evidence and reviews draft snippets.
|
|
132
|
+
The goal is recognition, not a behavioral profile: one short paragraph of at most
|
|
133
|
+
70 words identifying the person and their enduring organization/agent relationship.
|
|
134
|
+
New writes allow only `role`/`relationship` sections and explicit `observed`/`reported`
|
|
135
|
+
claims; priorities, preferences and inferred profiles belong outside dossiers.
|
|
136
|
+
Legacy dossiers remain readable, but must be deliberately rewritten by the agent
|
|
137
|
+
before replacement. No automatic destructive migration or blanket deletion occurs.
|
|
138
|
+
|
|
139
|
+
Every `replace_dossier` and `delete_dossier` action requires a concise `reason`
|
|
140
|
+
(up to 500 characters for replacements, 1,000 for deletions). Replacement history
|
|
141
|
+
also records whether TypeSafe checks passed or a manual attestation was used.
|
|
142
|
+
The plugin transactionally records that reason with its authoritative before and
|
|
143
|
+
after dossier snapshots. List small newest-first summaries with
|
|
144
|
+
`memory_people_inspect({ view: "dossier_changes", personId, limit?, offset? })`,
|
|
145
|
+
then fetch one exact diff with
|
|
146
|
+
`memory_people_inspect({ view: "dossier_change", personId, changeId })`. List
|
|
147
|
+
responses include `nextOffset`, so all history remains reachable without loading
|
|
148
|
+
many dossiers into one tool result. Because the injected snippet is the dossier's
|
|
149
|
+
`blurb`, its changes are included in the same history. A complete new serialized
|
|
150
|
+
dossier is capped at 64 KiB; larger legacy dossiers remain readable and repairable.
|
|
151
|
+
|
|
152
|
+
## Injection and person state
|
|
153
|
+
|
|
154
|
+
Set `people.whisperer.enabled` to inject context. For each exact Slack sender,
|
|
155
|
+
the plugin prepends that person's stored dossier blurb, bounded by `maxChars`,
|
|
156
|
+
once per `(Slack thread, person)`. Receipts are durable across retries and
|
|
157
|
+
Gateway restarts, while different people in one thread are handled independently.
|
|
158
|
+
Unthreaded DMs use their OpenClaw session as the conversational scope. Unknown,
|
|
159
|
+
unavailable, disabled, or dossierless people produce no context. Injection
|
|
160
|
+
remains subject to OpenClaw's `allowPromptInjection` policy.
|
|
161
|
+
|
|
162
|
+
The package includes a `$people-whisperer` skill with the canonical agent
|
|
163
|
+
procedure and dossier shape. For a manual refresh, ask:
|
|
164
|
+
|
|
165
|
+
```text
|
|
166
|
+
Use $people-whisperer to maintain this person's brief background snippet.
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
For an optional cron or isolated agent session, use this goal:
|
|
170
|
+
|
|
171
|
+
```text
|
|
172
|
+
Use $people-whisperer to maintain brief background snippets for people you interact
|
|
173
|
+
with. Follow the packaged skill, including source verification and write results.
|
|
174
|
+
Update only when useful; several people or nobody is fine. Report changes and gaps.
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
Choose any cadence appropriate for the agent; the plugin does not require or
|
|
178
|
+
track one. If session transcripts are a source, configure a `sessions` corpus
|
|
179
|
+
(including `direct` when DMs matter) and refresh it with
|
|
180
|
+
`memory_sync_sessions`. Ordinary `memory_search` calls accept targeted queries,
|
|
181
|
+
corpora, session metadata filters, score thresholds, and up to 20 results per
|
|
182
|
+
call; People Whisperer itself imposes no evidence-window limit.
|
|
183
|
+
|
|
184
|
+
### Pause, correct, delete or restore
|
|
185
|
+
|
|
186
|
+
| Action | Effect | Preserved / follow-up |
|
|
187
|
+
| --- | --- | --- |
|
|
188
|
+
| `set_injection` with `enabled:false` | Pause future injection for this person | Person, dossier and history remain |
|
|
189
|
+
| `replace_dossier` | Save a verified full replacement | Prior snapshot/reason remain in history; existing thread receipts are not reset |
|
|
190
|
+
| `delete_dossier` | Remove the current dossier | Person and transactional before/after history remain; no new blurb injection |
|
|
191
|
+
| `soft_delete_person` | Mark unavailable and turn injection off | Identity/dossier/history remain; creates a review todo |
|
|
192
|
+
| `restore_person` | Mark active again | Injection stays **off**; inspect and explicitly re-enable if appropriate |
|
|
193
|
+
| `set_injection` with `enabled:true` | Enable the person-level injection gate | Still needs global whispering, host permissions, a dossier and an unserved thread |
|
|
194
|
+
|
|
195
|
+
Slack deactivation marks the **whole linked person** unavailable and disables
|
|
196
|
+
injection, even when other identities are linked. Directory sync skips unavailable
|
|
197
|
+
people rather than automatically restoring them.
|
|
198
|
+
|
|
199
|
+
Tool inputs for a deliberate pause and later restore/re-enable, using an actual ID:
|
|
200
|
+
|
|
201
|
+
```json
|
|
202
|
+
{ "action": "set_injection", "personId": "PERSON_ID", "enabled": false }
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
```json
|
|
206
|
+
{ "action": "restore_person", "personId": "PERSON_ID" }
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
`restore_person` is for an unavailable person, not a paused active person. After
|
|
210
|
+
inspection, use `set_injection` with `enabled:true` for either one when wanted.
|
|
211
|
+
None of these operations erases raw memory or dossier history.
|
|
212
|
+
|
|
213
|
+
`memory_people_inspect`'s `injectionEligible` and `contribution` are a
|
|
214
|
+
**record-level preview**, not proof that a hook will inject: they do not account
|
|
215
|
+
for the global whisperer switch, host permissions or an existing thread receipt.
|
|
216
|
+
Changing a dossier or restarting the Gateway does not re-inject it in an already
|
|
217
|
+
served thread. A same-run retry replays its saved contribution; a different thread
|
|
218
|
+
can receive the current blurb. Do not delete receipts as routine troubleshooting.
|
|
219
|
+
|
|
220
|
+
For agent research/write steps and the dossier schema, use the packaged
|
|
221
|
+
[People Whisperer skill](../skills/people-whisperer/SKILL.md). If the agent has a
|
|
222
|
+
skill allowlist, include `people-whisperer`. General [search and session filtering](retrieval.md)
|
|
223
|
+
are shared memory features, not people-specific controls.
|
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
# Response quality and sentiment
|
|
2
|
+
|
|
3
|
+
[Overview](../README.md) · [Configuration and credentials](configuration.md)
|
|
4
|
+
|
|
5
|
+
`responseAudit` evaluates bounded human-agent exchanges in the background. It is
|
|
6
|
+
separate from chunk-quality auditing and never changes memories or prompts. It
|
|
7
|
+
creates private response-review tasks, not memory-curation tasks.
|
|
8
|
+
Its primary purpose is tracking delivery quality over time: visible fulfillment,
|
|
9
|
+
deliverable fit, clear underdelivery and its observable reason. Memory gaps are only
|
|
10
|
+
an optional diagnostic lead, not a proxy for performance.
|
|
11
|
+
|
|
12
|
+
This reads the host transcript database directly: it does not require a `sessions`
|
|
13
|
+
corpus, People Primer, whisperers or clustering. Configure [shared TypeSafe
|
|
14
|
+
credentials](configuration.md#shared-typesafe-credentials) separately. Begin with
|
|
15
|
+
the dry-run command below before requesting inference.
|
|
16
|
+
Only approved Slack sender IDs with trusted `senderKind: human` or owner metadata
|
|
17
|
+
qualify (older Slack records use unknown senderKind even for known owners).
|
|
18
|
+
Explicit bots, unverified identities, internal messages, other senders and thread changes form
|
|
19
|
+
hard boundaries. Synthetic delivery mirrors and gateway-injected answers are excluded.
|
|
20
|
+
Assistant progress messages are grouped with the terminal answer.
|
|
21
|
+
Recognized Slack envelopes are stripped even inside `upstreamUserText`; embedded
|
|
22
|
+
history is not treated as current human text. Ambiguous envelopes are excluded.
|
|
23
|
+
Removed history marks the context as limited; ordinary Markdown/JSON is preserved.
|
|
24
|
+
Human feedback closes when the next assistant turn starts. Still-open feedback,
|
|
25
|
+
no-response exchanges, incomplete/failed turns and oversized inputs are not graded.
|
|
26
|
+
|
|
27
|
+
Place this fragment under `plugins.entries.unblock-memory.config`. The optional
|
|
28
|
+
`memoryCorpora` names must already exist as file corpora; use `[]` to omit memory
|
|
29
|
+
investigation while still tracking response quality and sentiment.
|
|
30
|
+
|
|
31
|
+
```json
|
|
32
|
+
{
|
|
33
|
+
"responseAudit": {
|
|
34
|
+
"enabled": true,
|
|
35
|
+
"sentimentEnabled": true,
|
|
36
|
+
"senderIds": ["YOUR_SLACK_USER_ID"],
|
|
37
|
+
"chatTypes": ["direct"],
|
|
38
|
+
"historyMessages": 6,
|
|
39
|
+
"lookbackDays": 30,
|
|
40
|
+
"maxEpisodes": 20,
|
|
41
|
+
"intervalMinutes": 60,
|
|
42
|
+
"memoryCorpora": ["memory", "knowledge"]
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
This is explicit approval to send those exchanges to TypeSafe. Sender IDs apply
|
|
48
|
+
across the agent's Slack accounts; use only identities approved in all such accounts.
|
|
49
|
+
`memoryCorpora` is optional and separately approves configured **file** corpora for
|
|
50
|
+
memory-gap investigation. Leave it empty to send no indexed memory evidence.
|
|
51
|
+
`typesafe.enabled: false` or missing credentials prevents evaluation. An interval
|
|
52
|
+
of zero means manual-only. Defaults are disabled, no approved senders, direct chats,
|
|
53
|
+
6 preceding visible messages, 30 days, 20 episodes per run and a 60-minute interval.
|
|
54
|
+
`sentimentEnabled` defaults to **true within that opt-in audit**; it does not bypass
|
|
55
|
+
approved senders or TypeSafe credentials. Set it false to omit polarity, annoyance,
|
|
56
|
+
frustration and intensity questions while retaining quality/repair judgments.
|
|
57
|
+
`intervalMinutes` controls their shared cadence; no second sentiment timer is needed.
|
|
58
|
+
For example, `720` means every 12 hours; `0` means manual-only. `maxEpisodes`
|
|
59
|
+
defaults to 20 per run (maximum 100), so one scheduled run may not clear a backlog.
|
|
60
|
+
The Gateway checks a durable per-agent due time on startup and every minute (no
|
|
61
|
+
agent-turn cron or separate launchd job). First enablement waits one interval;
|
|
62
|
+
restarts preserve the due time and an overdue schedule gets one bounded catch-up,
|
|
63
|
+
not one run per missed interval. Each attempt advances the due time before work,
|
|
64
|
+
including missing-key skips, failures or interrupted runs, to prevent retry storms.
|
|
65
|
+
Changing the interval recalculates the due time from the last scheduled attempt
|
|
66
|
+
(or initial enablement). The Gateway must be running; manual audits do not change
|
|
67
|
+
the automatic schedule. Missing/unreadable credentials skip all quality and sentiment
|
|
68
|
+
inference without failing Gateway startup or normal memory functionality.
|
|
69
|
+
Changing the interval does not invalidate cached results. Changing the sentiment
|
|
70
|
+
toggle selects a separate reporting cohort, so older missing sentiment is not
|
|
71
|
+
treated as neutral; unchanged quality/feedback stages are reused across the toggle.
|
|
72
|
+
|
|
73
|
+
Operator commands (not agent tools):
|
|
74
|
+
|
|
75
|
+
```sh
|
|
76
|
+
openclaw memory-responses audit --agent main --dry-run
|
|
77
|
+
openclaw memory-responses audit --agent main
|
|
78
|
+
openclaw memory-responses report --agent main
|
|
79
|
+
openclaw memory-responses report --agent main --episode EPISODE_ID
|
|
80
|
+
openclaw memory-responses report --agent main --sender SLACK_USER_ID --account ACCOUNT_SCOPE --bucket day --since 2026-09-01 --until 2026-10-01
|
|
81
|
+
openclaw memory-responses report --agent main --person PERSON_ID
|
|
82
|
+
openclaw memory-responses tasks --agent main
|
|
83
|
+
openclaw memory-responses review --agent main --id TASK_ID --status deferred --reviewer human --note "Review the linked exchanges before changing preferences"
|
|
84
|
+
openclaw memory-responses annotate --agent main --date 2026-09-18 --kind prompt --note "Known prompt revision deployed"
|
|
85
|
+
openclaw memory-responses retry-failed --agent main
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Reports group by scoped human identity as well as task/model/time. Names are not
|
|
89
|
+
identity keys. Existing active people-store links are resolved read-only at assessment
|
|
90
|
+
time; missing links do not prevent analysis. Unknown account scopes stay isolated
|
|
91
|
+
per session. No new identity fields are sent to TypeSafe. Date ranges are UTC with
|
|
92
|
+
an inclusive start and exclusive end. `periodStart` identifies a day/week bucket;
|
|
93
|
+
legacy `week`/`fromWeek`/`toWeek` fields remain aliases. `--task-type` and `--model`
|
|
94
|
+
further narrow comparisons. Human-specific scores are not rankings of the humans:
|
|
95
|
+
task difficulty, feedback habits and selection bias remain important.
|
|
96
|
+
|
|
97
|
+
Session checkpoints hash bounded active source bytes; unchanged sessions skip
|
|
98
|
+
extraction and all inference. Changed sessions are re-extracted within the existing
|
|
99
|
+
budget, then stage hashes reuse unchanged quality, feedback, sentiment and later
|
|
100
|
+
evidence judgments. Only hashes/counts are checkpointed, never a transcript copy.
|
|
101
|
+
A persisted cursor rotates through discovery and tracked-session reconciliation;
|
|
102
|
+
`deferredByLimit` includes known backlog and a lower-bound marker for unvisited
|
|
103
|
+
sessions. `stages` exposes pending/failed/succeeded counts and exhausted retries
|
|
104
|
+
for the cohort/date range, before person filters. `retry-failed` only resets failed
|
|
105
|
+
work; successful stages remain cached. Source freshness is checked before activation.
|
|
106
|
+
|
|
107
|
+
Review tasks distinguish `delivery_quality` shortfalls from `human_experience`
|
|
108
|
+
complaints. The latter requires at least 0.8 probability mass at intensity levels
|
|
109
|
+
2/3, at least 0.8 combined mass across agent-related/mixed targets, and annoyance
|
|
110
|
+
or frustration yes-probability of at least 0.8. It uses grouped probabilities, not
|
|
111
|
+
an expected-intensity cutoff or certainty about one precise target. These are
|
|
112
|
+
review leads, not proof the agent was at fault. Status can be `pending`, `resolved`,
|
|
113
|
+
`dismissed` or `deferred`, with a required review note.
|
|
114
|
+
Stable task keys include exchange, scoped human and issue
|
|
115
|
+
family. Decisions survive rescoring; stale source evidence and superseded findings
|
|
116
|
+
are labeled separately. Review status/provenance never changes the raw judgments.
|
|
117
|
+
Tasks and change annotations are operator-only and stay out of memory/whisperer
|
|
118
|
+
prompts. `--reviewer` records human/agent provenance, not authentication or a new
|
|
119
|
+
permission grant. Task lists disclose their 1,000-item cap. There are no automatic
|
|
120
|
+
dossier updates: review the evidence and approve any concrete preference separately.
|
|
121
|
+
Old cohorts remain stored; the first staged-cohort run does not silently import
|
|
122
|
+
unverified older rubric judgments. Audit-history retention is not automatic.
|
|
123
|
+
|
|
124
|
+
Separate original-answer and feedback passes prevent human feedback from influencing the original
|
|
125
|
+
fulfillment/deliverable-fit grade. The feedback pass distinguishes acceptance,
|
|
126
|
+
correction, continuation, unrelated replies, expressed sentiment, repeated constraints
|
|
127
|
+
and avoidable rework. Current-index memory investigation runs only for a strong
|
|
128
|
+
memory-gap signal: lexical retrieval selects up to three whole short documents from
|
|
129
|
+
approved collections. This is an investigation lead, **not proof of historical
|
|
130
|
+
availability, factual truth, or agent fault**. Tool-call counts do not establish what
|
|
131
|
+
the model saw or whether it should have searched. Unseen artifacts are unassessable.
|
|
132
|
+
|
|
133
|
+
Deliverable kind/format/scope has its own assessability gate, independent of whether
|
|
134
|
+
execution or external facts can be verified. Feedback attribution distinguishes the
|
|
135
|
+
current answer, earlier behavior, delivery, missing proactive action, external events,
|
|
136
|
+
new work and mixed/unclear targets. A reported forgotten instruction does not prove
|
|
137
|
+
searchable memory existed. A third, separate request examines the original exchange,
|
|
138
|
+
human feedback and available next assistant block for specific reported shortfalls,
|
|
139
|
+
acknowledgment, explicit factual corrections, delivery failures and regressions. These are
|
|
140
|
+
retrospective signals, not independently verified facts and never inputs to the
|
|
141
|
+
original grade. Clean text preceding a synthetic error/delivery notice can be assessed
|
|
142
|
+
as **partial** evidence; the notice itself is excluded and no successful completion
|
|
143
|
+
is inferred. Later evidence is capped at six messages/12K characters; incomplete,
|
|
144
|
+
unsafe or oversized blocks stay explicitly pending/unavailable/oversized. New later
|
|
145
|
+
evidence changes the input hash; only changed assessment stages are re-evaluated,
|
|
146
|
+
within normal audit budgets. Successful stages survive failures in later stages.
|
|
147
|
+
When the next block is unavailable, the third pass uses only the original exchange
|
|
148
|
+
and feedback; it cannot infer a missing delivery from missing later evidence.
|
|
149
|
+
|
|
150
|
+
Code combines narrow, confident evidence into an **observed outcome**, preserving
|
|
151
|
+
its basis and reason. A concrete original-answer shortfall or later admission takes
|
|
152
|
+
precedence over praise. Broad reported failures are used only when they do not
|
|
153
|
+
depend on a newly introduced requirement. Accurate explanations of earlier mistakes,
|
|
154
|
+
ordinary follow-ups, necessary clarification and unseen work are not automatically
|
|
155
|
+
failures. Sentiment and earlier-workflow complaints remain separate review signals.
|
|
156
|
+
Sentiment includes independent annoyance and frustration yes-probabilities (both
|
|
157
|
+
can apply), plus an expressed-dissatisfaction intensity score from 0 to 3. Intensity
|
|
158
|
+
means no expressed displeasure / restrained displeasure / pointed complaint /
|
|
159
|
+
explicit rejection or loss of trust. It is **not confidence or failure severity**.
|
|
160
|
+
External frustration, brevity and factual corrections alone do not establish
|
|
161
|
+
annoyance or frustration; mixed praise and complaints can still carry both signals.
|
|
162
|
+
Daily/weekly reports show dissatisfaction, annoyance and frustration rates, intensity
|
|
163
|
+
means, unknown counts and their own assessment denominators. Unassessed results
|
|
164
|
+
are never counted as neutral. Sentiment deltas require 20 samples in both periods
|
|
165
|
+
and matching assessment coverage; they remain descriptive, not causal evidence.
|
|
166
|
+
Outcome, evidence basis and failure reasons remain distinct: a correction does not
|
|
167
|
+
automatically mean `incorrect_claim`. Confident reason judgments and direct
|
|
168
|
+
delivery/regression admissions supply reasons; otherwise `reasonStatus` is
|
|
169
|
+
`uncertain`. `reasonDetails` retain each label's source and strength, distinguishing
|
|
170
|
+
Choice confidence from Noul yes-probability. Multiple supported reasons can coexist.
|
|
171
|
+
`reportVersion` identifies composition/reporting semantics independently of the
|
|
172
|
+
judge rubric, allowing cached judgments to be re-reported without re-inference.
|
|
173
|
+
|
|
174
|
+
Results live in operator-only tables in the agent's private
|
|
175
|
+
`unblock-memory/unblock-memory.sqlite`, outside the memory index. These tables
|
|
176
|
+
are not searched or injected into agent prompts. They store judgments and source event references/hashes, not copies
|
|
177
|
+
of conversations. Identical successful inputs are cached; source rewrites invalidate
|
|
178
|
+
in-scope results on the next scan. Reports partition by fixed judge/rubric/context
|
|
179
|
+
configuration, scoped human, UTC day/week, task type and agent model. They expose eligible/assessed
|
|
180
|
+
counts, excluded cases, confidence-qualified score means with per-dimension denominators, rework rates with Wilson
|
|
181
|
+
intervals, and evidence IDs. Small groups (<20) are marked explicitly. Confidence
|
|
182
|
+
thresholds are provisional, not calibrated guarantees. Human-reviewed evaluation
|
|
183
|
+
data is still needed before drawing performance conclusions.
|
|
184
|
+
Reports include dated clear-underdelivery examples and reason counts. Descriptive
|
|
185
|
+
score deltas compare successive available UTC buckets within the same human, task type,
|
|
186
|
+
agent model and rubric/configuration, with at least 20 confident scores per dimension
|
|
187
|
+
in each period and unchanged scored coverage; changed coverage withholds the score
|
|
188
|
+
delta. Outcome trends show acknowledgment, reported-shortfall and unknown rates
|
|
189
|
+
against **all evaluated exchanges**, with at least 20 evaluated exchanges per period.
|
|
190
|
+
Read the three rates together: fewer acknowledgments can mean more unknowns, not
|
|
191
|
+
more failures. Every delta includes before/after values, sample counts, denominator
|
|
192
|
+
and coverage-change flags. Unknown task types/models cannot produce deltas. These
|
|
193
|
+
are not statistical change-point detections or proof of causality; model/version
|
|
194
|
+
changes remain visible as separate groups rather than silently mixing cohorts.
|
|
195
|
+
The legacy `observedSuccessRate` group field remains acknowledgment / known outcomes
|
|
196
|
+
for compatibility, but is not used for trends. Unknowns are never successes.
|
|
197
|
+
Coverage changes and threshold variability can move rates; acknowledgment is not
|
|
198
|
+
factual verification. Week buckets
|
|
199
|
+
may be partial, and several exchanges in one session are not independent. Wilson
|
|
200
|
+
intervals are descriptive, not calibrated confidence about overall agent ability.
|
|
201
|
+
|
|
202
|
+
Each run selects at most 100 recent sessions for inference, each at most 2,000 active events/2M
|
|
203
|
+
characters; episodes must fit 24K characters and six feedback messages without
|
|
204
|
+
truncating the answer. Coverage counts describe the scanned sessions; only episodes
|
|
205
|
+
within `lookbackDays` are judged. Caps, failures and no-feedback cases remain visible.
|
|
206
|
+
Saved sessions in the report window are also reconciled independently of that
|
|
207
|
+
selection, so removing an entire active branch retires its scores. Oversized saved
|
|
208
|
+
sessions defer reconciliation rather than being treated as deleted; the report
|
|
209
|
+
exposes `reconciledSessions` and `reconciliationDeferred`. All reconciliation shares
|
|
210
|
+
the run deadline. Freshness checks compare the assessed episode, not unrelated
|
|
211
|
+
later session activity. Actual snapshot races do not exhaust provider retries.
|
|
212
|
+
The whole run has a two-minute deadline, at most three provider attempts per input (ten-minute
|
|
213
|
+
backoff), and a cross-process lease. Scheduling never starts inference on the agent
|
|
214
|
+
turn path or boots a QMD manager. No model downloads or source re-indexing occur.
|
|
215
|
+
The report is observational: different task mixes, selective human replies and judge
|
|
216
|
+
changes can produce apparent trends. It does not automatically declare regressions,
|
|
217
|
+
rewrite prompts, or treat silence as success.
|