Memori skills file
Overview
Memori is agent-native memory infrastructure: an LLM-agnostic layer that structures memory from natural language and from agent execution trace.
Memori automatically captures and structures memory from conversation and execution trace, including the agent's actions, tool results, decisions, and outcomes. Use it to maintain continuity across sessions, preserve decisions and constraints, and help the agent understand what it actually did so future work is more accurate and efficient.
Core Instruction
When Memori MCP tools are available, treat this skill as the source of truth for how to use Memori through MCP.
Use it to understand:
- Available Memori capabilities
- Tooling and integrations
- Expected behavior and constraints
- Safety and privacy implications
MCP server configuration supplies authenticated user or tenant context through request headers. Do not invent entity, process, project, or session identifiers.
Current user instructions, verified local context, and tool results outrank recalled memory.
Quick Reference
memori_recall: retrieve precise memories by query, project, session, time range, or an allowed source/signal pair.
memori_recall_summary: retrieve a state summary for session starts, daily briefs, or broad status checks.
memori_compaction: retrieve a structured post-compaction brief to continue work after context compaction.
memori_advanced_augmentation: store durable memory from a completed user/assistant turn.
memori_feedback: report irrelevant, missing, stale, or especially useful memory behavior.
memori_signup: create a Memori account or request an API key when the user explicitly asks.
memori_quota: check usage, quota, storage, or memory capacity when the user asks or limits appear to be reached.
When to Use Memori
Use Memori when:
- The task depends on prior context
- The user refers to previous sessions or decisions
- You need known constraints, preferences, or patterns
- You are starting a meaningful session and need current state
- You want to understand what has already been done
When Not to Use Memori
Do not use Memori when:
- The task is fully self-contained
- The answer depends only on the current prompt
- No historical context is required
- The query is simple or one-off
- The message is trivial, administrative, or closing (for example "thanks", "ok", "goodbye")
Avoid unnecessary recall.
Recall Behavior
Recall is agent-controlled and intentional. Prefer targeted recall over broad queries.
Use:
Supported parameters:
query: natural language search query
projectId: project or workspace context, when the tool schema exposes it
sessionId: specific session, only with projectId
dateStart / dateEnd: UTC time-bounded recall
source: type of memory (must be paired with signal from the allowed combinations below)
signal: how the memory was derived (must be paired with source from the allowed combinations below)
If a sessionId is provided, a projectId must also be provided. All timestamps are stored in UTC.
Pass optional scope fields only when the tool schema exposes them and the active client or workspace provides reliable values.
Allowed source + signal combinations:
source and signal are not independent. They must be set together (or both omitted). Only the following (source, signal) pairs are valid:
source=constraint, signal=discovery
source=decision, signal=commit
source=fact, signal=verification
source=execution, signal=failure
source=instruction, signal=discovery
source=insight, signal=inference
source=status, signal=update
source=strategy, signal=pattern
source=task, signal=result
Any combination of source and signal not in this list is invalid and must not be sent to memori_recall.
Use one of the allowed (source, signal) pairs to prioritize high-signal memory when possible; never set source or signal independently.
Default behavior:
- No date range means all-time memory.
Best practices:
- Best query: use the latest user message verbatim.
- Good query: use a short rephrased intent when the message is long or noisy.
- Avoid generic queries like "preferences", "memory", or "context".
- Start narrow with project or workspace scope, then expand only if needed.
- Prefer one recall call per turn.
- Do not recall on every turn.
Summary Behavior
Summaries are used for state awareness, not precise retrieval.
Use:
Supported parameters:
projectId
sessionId
dateStart
dateEnd
Summaries do not support source or signal.
Default behavior:
- No date range means Memori's summary default, currently the recent working window.
Daily Brief Behavior
At the start of a meaningful session, retrieve a structured summary.
Use the daily brief to understand:
- Current state
- Prior decisions
- Constraints
- Open work
Useful daily brief shape:
- Today at a glance
- Top next actions
- Top risks
- Verify before acting
- Recent decisions
- Mission stack
- Hard constraints
- Current status
- Open loops
- Known failures and anti-patterns
- Staleness warnings
Treat summaries as working state, not unquestionable truth. If the answer depends on one specific decision, preference, or prior outcome, use memori_recall or verify against current sources.
Post-Compaction Brief Behavior
Post-compaction briefs are used to restore working state after context compaction.
Use them when:
- The agent resumes after compaction
- A long-running workflow has lost conversational detail
- The agent needs to continue operational work without replaying the full prior session
- The agent needs durable state, standing instructions, environment details, open loops, or the next expected action
Post-compaction briefs are not a replacement for precise memory retrieval.
Use:
Supported parameters:
projectId: project or workspace context; required when the tool schema requires it
sessionId: specific session, only with projectId
numMessages: number of recent conversation messages to include
Post-compaction briefs do not support source or signal.
Default behavior:
- Retrieve the most recent relevant post-compaction brief for the project or session.
- Include a small tail of recent conversation messages unless more context is explicitly needed.
Expected post-compaction brief structure:
- Meta
- Environment
- Standing orders
- State
- Active tasks
- Open loops
- Pending results
- Timeline
- Workspace changes
- Continuation
- Last action
- Next expected action
- Messages
Treat the post-compaction brief as the agent's resume state. Use it to understand:
- What environment the agent was operating in
- Which standing orders must continue to be followed
- Which tasks are active
- Which issues remain unresolved
- What happened across the prior session window
- What files, workspace state, or external systems may have changed
- What the agent did last
- What the agent should do next
The post-compaction brief should guide continuation, not override explicit user instructions. Before acting on operational details, verify any state that may have changed since compaction.
Pay special attention to:
- Standing orders
- Hard constraints
- Alerting rules
- Expected response formats
- Open loops
- Staleness warnings
- Next expected action
If the post-compaction brief contains a required output format, follow it exactly unless the user gives a newer instruction.
Advanced Augmentation
Through MCP, durable memory is stored explicitly with memori_advanced_augmentation after you draft a response.
Use memori_advanced_augmentation only when the turn reveals durable information that would still be useful weeks from now in another conversation.
Supported parameters:
user_message: the user's message for this turn
assistant_response: the final assistant response for this turn
projectId: project or workspace scope, when available
sessionId: session scope, when available
summary: concise durable summary, when the tool schema supports it
trace: relevant execution trace, when the tool schema supports it and it is safe to store
Good candidates:
- Explicit preferences: "always", "from now on", "default to", "I prefer"
- Stable profile facts the user wants remembered: role, timezone, location, usual environment, accessibility needs
- Long-lived project context: tooling, architecture decisions, naming conventions, ownership, deployment constraints
- Durable workflow norms: review standards, release process, test strategy, formatting conventions
Do Not Augment
Never store:
- Secrets, API keys, tokens, passwords, credentials, or sensitive personal data
- Large logs, stack traces, raw tool output, or one-time error dumps
- Temporary values, codes, links, live prices, schedules, or expiring facts
- Role-play, hypotheticals, fictional statements, or examples
- Routine session progress such as tests passed, commands run, files edited, or commit messages
- Routine task activity such as refactors, imports, renames, or formatting
- Conversation-scoped choices that are not lasting preferences
If the user says not to remember, store, save, log, or keep this turn, respect that. You may still recall if needed, but do not augment.
Rule of thumb: if the information describes what happened in this session rather than a fact or preference that should shape future sessions, do not augment.
Procedure
- If the message is trivial or the user opts out of storage, skip augmentation (and usually recall).
- After context compaction: retrieve resume state with
memori_compaction.
- Start of a meaningful session: retrieve a summary with
memori_recall_summary.
- During the task: use targeted
memori_recall when prior context would materially improve the answer.
- Answer using useful recalled context, but verify anything stale, surprising, or high stakes.
- After drafting the final response: call
memori_advanced_augmentation only for durable facts, preferences, or project context.
- When memory is missing or incorrect: send
memori_feedback.
- When limits are reached: check
memori_quota if needed and degrade gracefully.
Common Pitfalls
- Do not use broad recall when the user needs one specific fact, decision, or prior outcome.
- Do not treat summaries as authoritative when exact details matter; use targeted recall or verify against current sources.
- Do not use compaction for targeted memory search or routine turns.
- Do not call signup, quota, or feedback tools unless the user's request or a Memori error makes them relevant.
- Do not provide a
sessionId without also providing a projectId.
- Do not invent entity, process, project, or session identifiers; MCP headers supply attribution context.
- Do not hide privacy tradeoffs: augmentation may store completed-turn context and safe trace fields when the client provides them.
- Do not let memory override current user instructions, repository rules, or verified facts from the active workspace.
Safety and Correctness
- Do not invent memory.
- Do not assume memory is correct if it conflicts with the user.
- Verify before acting when needed.
- Treat current user instructions as higher priority than recalled memory.
- If a signup, quota, or memory tool fails because the MCP server is unavailable, misconfigured, unauthorized, or missing credentials, explain the setup gap plainly and do not invent memory results.
Feedback
Use:
Send feedback when:
- Recall results are irrelevant or missing key context.
- Important decisions or constraints were not captured.
- A summary omits important current state.
- Memory quality degrades across sessions.
- Something works particularly well and should be reinforced.
Keep feedback concise and specific. Do not send feedback for ordinary task completion.
Feedback improves memory extraction quality, recall relevance, and summary accuracy.
Account Creation and Onboarding
Use:
Use this tool when:
- The user explicitly asks to sign up, create an account, or get an API key for Memori.
- You encounter an error indicating a missing Memori API key and the user provides their email address.
Behavior:
- If the user asks to sign up but does not provide an email address, ask for their email first.
- Once they provide an email, run
memori_signup with that email.
- Relay the tool result, remind them to check their inbox for the API key, and tell them to configure the Memori MCP server with
X-Memori-API-Key and X-Memori-Entity-Id in their client MCP config.
- Do not guess or hallucinate an email address.
Quota Awareness and Upgrades
Use:
Use this tool when:
- The user explicitly asks about their quota, usage, storage, or remaining memory capacity.
- Errors suggest memory limits have been reached and you want to confirm before degrading behavior.
Behavior:
- Invoke
memori_quota with no arguments when the tool schema allows it.
- Relay the result clearly.
- If limits are near or reached, explain the impact and suggest an upgrade only when performance is affected.
When limits are reached or near:
- Reduce recall scope.
- Prioritize high-signal memory, especially decisions, constraints, key facts, and execution results.
- Avoid unnecessary or repeated recall calls.
- Tell the user when limits affect memory behavior.
Example:
Memory limits have been reached. I can continue with limited recall, or you can upgrade to restore full functionality.
Updates
Memori may expose improved recall patterns, summaries, classification, or tool behavior over time.
When an update is exposed through the system, tool metadata, or user-provided docs:
- Prefer the newer recall or summary behavior when available.
- Keep this skill's safety, privacy, and intentional-use rules in force.
- Continue normally if no behavior change is required.
Verification
Confirm the skill is working in a fresh MCP client session:
- Verify the Memori MCP server is connected and lists
memori_recall, memori_recall_summary, memori_compaction, and memori_advanced_augmentation.
- Tell the agent a durable preference such as "I always use tabs over spaces."
- After augmentation completes, start a later session and ask it to write code.
Expected behavior:
- The agent should use Memori MCP tools rather than answer from generic memory knowledge.
- The answer should distinguish precise recall from broad state summaries.
- The answer should mention targeted use, avoiding unnecessary recall, and treating current user instructions as higher priority than memory.
- If Memori credentials or the MCP server are unavailable, the agent should explain the setup gap without inventing recall results.
1---2name: memori-mcp-usage3description: Use when an MCP-connected agent should use Memori tools for targeted recall, summaries, post-compaction briefs, durable memory augmentation, quota checks, signup, feedback, preferences, prior context, or cross-session continuity.4license: MIT5---6
7# Memori skills file
8
9## Overview
10
11Memori is agent-native memory infrastructure: an LLM-agnostic layer that structures memory from natural language and from agent execution trace.
12
13Memori automatically captures and structures memory from conversation and execution trace, including the agent's actions, tool results, decisions, and outcomes. Use it to maintain continuity across sessions, preserve decisions and constraints, and help the agent understand what it actually did so future work is more accurate and efficient.
14
15## Core Instruction
16
17When Memori MCP tools are available, treat this skill as the source of truth for how to use Memori through MCP.
18
19Use it to understand:
20
21- Available Memori capabilities
22- Tooling and integrations
23- Expected behavior and constraints
24- Safety and privacy implications
25
26MCP server configuration supplies authenticated user or tenant context through request headers. Do not invent entity, process, project, or session identifiers.
27
28Current user instructions, verified local context, and tool results outrank recalled memory.
29
30## Quick Reference
31
32- `memori_recall`: retrieve precise memories by query, project, session, time range, or an allowed source/signal pair.
33- `memori_recall_summary`: retrieve a state summary for session starts, daily briefs, or broad status checks.
34- `memori_compaction`: retrieve a structured post-compaction brief to continue work after context compaction.
35- `memori_advanced_augmentation`: store durable memory from a completed user/assistant turn.
36- `memori_feedback`: report irrelevant, missing, stale, or especially useful memory behavior.
37- `memori_signup`: create a Memori account or request an API key when the user explicitly asks.
38- `memori_quota`: check usage, quota, storage, or memory capacity when the user asks or limits appear to be reached.
39
40## When to Use Memori
41
42Use Memori when:
43
44- The task depends on prior context
45- The user refers to previous sessions or decisions
46- You need known constraints, preferences, or patterns
47- You are starting a meaningful session and need current state
48- You want to understand what has already been done
49
50## When Not to Use Memori
51
52Do not use Memori when:
53
54- The task is fully self-contained
55- The answer depends only on the current prompt
56- No historical context is required
57- The query is simple or one-off
58- The message is trivial, administrative, or closing (for example "thanks", "ok", "goodbye")
59
60Avoid unnecessary recall.
61
62## Recall Behavior
63
64Recall is agent-controlled and intentional. Prefer targeted recall over broad queries.
65
66Use:
67
68- `memori_recall`
69
70Supported parameters:
71
72- `query`: natural language search query
73- `projectId`: project or workspace context, when the tool schema exposes it
74- `sessionId`: specific session, only with `projectId`
75- `dateStart` / `dateEnd`: UTC time-bounded recall
76- `source`: type of memory (must be paired with `signal` from the allowed combinations below)
77- `signal`: how the memory was derived (must be paired with `source` from the allowed combinations below)
78
79If a `sessionId` is provided, a `projectId` must also be provided. All timestamps are stored in UTC.
80
81Pass optional scope fields only when the tool schema exposes them and the active client or workspace provides reliable values.
82
83Allowed source + signal combinations:
84
85`source` and `signal` are not independent. They must be set together (or both omitted). Only the following `(source, signal)` pairs are valid:
86
87- `source=constraint`, `signal=discovery`
88- `source=decision`, `signal=commit`
89- `source=fact`, `signal=verification`
90- `source=execution`, `signal=failure`
91- `source=instruction`, `signal=discovery`
92- `source=insight`, `signal=inference`
93- `source=status`, `signal=update`
94- `source=strategy`, `signal=pattern`
95- `source=task`, `signal=result`
96
97Any combination of `source` and `signal` not in this list is invalid and must not be sent to `memori_recall`.
98
99Use one of the allowed `(source, signal)` pairs to prioritize high-signal memory when possible; never set `source` or `signal` independently.
100
101Default behavior:
102
103- No date range means all-time memory.
104
105Best practices:
106
107- Best query: use the latest user message verbatim.
108- Good query: use a short rephrased intent when the message is long or noisy.
109- Avoid generic queries like "preferences", "memory", or "context".
110- Start narrow with project or workspace scope, then expand only if needed.
111- Prefer one recall call per turn.
112- Do not recall on every turn.
113
114## Summary Behavior
115
116Summaries are used for state awareness, not precise retrieval.
117
118Use:
119
120- `memori_recall_summary`
121
122Supported parameters:
123
124- `projectId`
125- `sessionId`
126- `dateStart`
127- `dateEnd`
128
129Summaries do not support `source` or `signal`.
130
131Default behavior:
132
133- No date range means Memori's summary default, currently the recent working window.
134
135## Daily Brief Behavior
136
137At the start of a meaningful session, retrieve a structured summary.
138
139Use the daily brief to understand:
140
141- Current state
142- Prior decisions
143- Constraints
144- Open work
145
146Useful daily brief shape:
147
148- Today at a glance
149- Top next actions
150- Top risks
151- Verify before acting
152- Recent decisions
153- Mission stack
154- Hard constraints
155- Current status
156- Open loops
157- Known failures and anti-patterns
158- Staleness warnings
159
160Treat summaries as working state, not unquestionable truth. If the answer depends on one specific decision, preference, or prior outcome, use `memori_recall` or verify against current sources.
161
162## Post-Compaction Brief Behavior
163
164Post-compaction briefs are used to restore working state after context compaction.
165
166Use them when:
167
168- The agent resumes after compaction
169- A long-running workflow has lost conversational detail
170- The agent needs to continue operational work without replaying the full prior session
171- The agent needs durable state, standing instructions, environment details, open loops, or the next expected action
172
173Post-compaction briefs are not a replacement for precise memory retrieval.
174
175Use:
176
177- `memori_compaction`
178
179Supported parameters:
180
181- `projectId`: project or workspace context; required when the tool schema requires it
182- `sessionId`: specific session, only with `projectId`
183- `numMessages`: number of recent conversation messages to include
184
185Post-compaction briefs do not support `source` or `signal`.
186
187Default behavior:
188
189- Retrieve the most recent relevant post-compaction brief for the project or session.
190- Include a small tail of recent conversation messages unless more context is explicitly needed.
191
192Expected post-compaction brief structure:
193
194- Meta
195- Environment
196- Standing orders
197- State
198- Active tasks
199- Open loops
200- Pending results
201- Timeline
202- Workspace changes
203- Continuation
204- Last action
205- Next expected action
206- Messages
207
208Treat the post-compaction brief as the agent's resume state. Use it to understand:
209
210- What environment the agent was operating in
211- Which standing orders must continue to be followed
212- Which tasks are active
213- Which issues remain unresolved
214- What happened across the prior session window
215- What files, workspace state, or external systems may have changed
216- What the agent did last
217- What the agent should do next
218
219The post-compaction brief should guide continuation, not override explicit user instructions. Before acting on operational details, verify any state that may have changed since compaction.
220
221Pay special attention to:
222
223- Standing orders
224- Hard constraints
225- Alerting rules
226- Expected response formats
227- Open loops
228- Staleness warnings
229- Next expected action
230
231If the post-compaction brief contains a required output format, follow it exactly unless the user gives a newer instruction.
232
233## Advanced Augmentation
234
235Through MCP, durable memory is stored explicitly with `memori_advanced_augmentation` after you draft a response.
236
237Use `memori_advanced_augmentation` only when the turn reveals durable information that would still be useful weeks from now in another conversation.
238
239Supported parameters:
240
241- `user_message`: the user's message for this turn
242- `assistant_response`: the final assistant response for this turn
243- `projectId`: project or workspace scope, when available
244- `sessionId`: session scope, when available
245- `summary`: concise durable summary, when the tool schema supports it
246- `trace`: relevant execution trace, when the tool schema supports it and it is safe to store
247
248Good candidates:
249
250- Explicit preferences: "always", "from now on", "default to", "I prefer"
251- Stable profile facts the user wants remembered: role, timezone, location, usual environment, accessibility needs
252- Long-lived project context: tooling, architecture decisions, naming conventions, ownership, deployment constraints
253- Durable workflow norms: review standards, release process, test strategy, formatting conventions
254
255### Do Not Augment
256
257Never store:
258
259- Secrets, API keys, tokens, passwords, credentials, or sensitive personal data
260- Large logs, stack traces, raw tool output, or one-time error dumps
261- Temporary values, codes, links, live prices, schedules, or expiring facts
262- Role-play, hypotheticals, fictional statements, or examples
263- Routine session progress such as tests passed, commands run, files edited, or commit messages
264- Routine task activity such as refactors, imports, renames, or formatting
265- Conversation-scoped choices that are not lasting preferences
266
267If the user says not to remember, store, save, log, or keep this turn, respect that. You may still recall if needed, but do not augment.
268
269Rule of thumb: if the information describes what happened in this session rather than a fact or preference that should shape future sessions, do not augment.
270
271## Procedure
272
2731. If the message is trivial or the user opts out of storage, skip augmentation (and usually recall).
2742. After context compaction: retrieve resume state with `memori_compaction`.
2753. Start of a meaningful session: retrieve a summary with `memori_recall_summary`.
2764. During the task: use targeted `memori_recall` when prior context would materially improve the answer.
2775. Answer using useful recalled context, but verify anything stale, surprising, or high stakes.
2786. After drafting the final response: call `memori_advanced_augmentation` only for durable facts, preferences, or project context.
2797. When memory is missing or incorrect: send `memori_feedback`.
2808. When limits are reached: check `memori_quota` if needed and degrade gracefully.
281
282## Common Pitfalls
283
284- Do not use broad recall when the user needs one specific fact, decision, or prior outcome.
285- Do not treat summaries as authoritative when exact details matter; use targeted recall or verify against current sources.
286- Do not use compaction for targeted memory search or routine turns.
287- Do not call signup, quota, or feedback tools unless the user's request or a Memori error makes them relevant.
288- Do not provide a `sessionId` without also providing a `projectId`.
289- Do not invent entity, process, project, or session identifiers; MCP headers supply attribution context.
290- Do not hide privacy tradeoffs: augmentation may store completed-turn context and safe trace fields when the client provides them.
291- Do not let memory override current user instructions, repository rules, or verified facts from the active workspace.
292
293## Safety and Correctness
294
295- Do not invent memory.
296- Do not assume memory is correct if it conflicts with the user.
297- Verify before acting when needed.
298- Treat current user instructions as higher priority than recalled memory.
299- If a signup, quota, or memory tool fails because the MCP server is unavailable, misconfigured, unauthorized, or missing credentials, explain the setup gap plainly and do not invent memory results.
300
301## Feedback
302
303Use:
304
305- `memori_feedback`
306
307Send feedback when:
308
309- Recall results are irrelevant or missing key context.
310- Important decisions or constraints were not captured.
311- A summary omits important current state.
312- Memory quality degrades across sessions.
313- Something works particularly well and should be reinforced.
314
315Keep feedback concise and specific. Do not send feedback for ordinary task completion.
316
317Feedback improves memory extraction quality, recall relevance, and summary accuracy.
318
319## Account Creation and Onboarding
320
321Use:
322
323- `memori_signup`
324
325Use this tool when:
326
327- The user explicitly asks to sign up, create an account, or get an API key for Memori.
328- You encounter an error indicating a missing Memori API key and the user provides their email address.
329
330Behavior:
331
332- If the user asks to sign up but does not provide an email address, ask for their email first.
333- Once they provide an email, run `memori_signup` with that email.
334- Relay the tool result, remind them to check their inbox for the API key, and tell them to configure the Memori MCP server with `X-Memori-API-Key` and `X-Memori-Entity-Id` in their client MCP config.
335- Do not guess or hallucinate an email address.
336
337## Quota Awareness and Upgrades
338
339Use:
340
341- `memori_quota`
342
343Use this tool when:
344
345- The user explicitly asks about their quota, usage, storage, or remaining memory capacity.
346- Errors suggest memory limits have been reached and you want to confirm before degrading behavior.
347
348Behavior:
349
350- Invoke `memori_quota` with no arguments when the tool schema allows it.
351- Relay the result clearly.
352- If limits are near or reached, explain the impact and suggest an upgrade only when performance is affected.
353
354When limits are reached or near:
355
356- Reduce recall scope.
357- Prioritize high-signal memory, especially decisions, constraints, key facts, and execution results.
358- Avoid unnecessary or repeated recall calls.
359- Tell the user when limits affect memory behavior.
360
361Example:
362
363> Memory limits have been reached. I can continue with limited recall, or you can upgrade to restore full functionality.
364
365## Updates
366
367Memori may expose improved recall patterns, summaries, classification, or tool behavior over time.
368
369When an update is exposed through the system, tool metadata, or user-provided docs:
370
371- Prefer the newer recall or summary behavior when available.
372- Keep this skill's safety, privacy, and intentional-use rules in force.
373- Continue normally if no behavior change is required.
374
375## Verification
376
377Confirm the skill is working in a fresh MCP client session:
378
3791. Verify the Memori MCP server is connected and lists `memori_recall`, `memori_recall_summary`, `memori_compaction`, and `memori_advanced_augmentation`.
3802. Tell the agent a durable preference such as "I always use tabs over spaces."
3813. After augmentation completes, start a later session and ask it to write code.
382
383Expected behavior:
384
385- The agent should use Memori MCP tools rather than answer from generic memory knowledge.
386- The answer should distinguish precise recall from broad state summaries.
387- The answer should mention targeted use, avoiding unnecessary recall, and treating current user instructions as higher priority than memory.
388- If Memori credentials or the MCP server are unavailable, the agent should explain the setup gap without inventing recall results.