@remembrance-ai/opencode-plugin 0.2.1 → 0.2.3
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 +64 -6
- package/opencode.json +2 -2
- package/package.json +1 -1
- package/scripts/hook-core.mjs +1405 -396
- package/servers/remembrance-mcp.mjs +692 -97
- package/skills/remembrancer/SKILL.md +29 -0
- package/skills/remembrancer/references/remembrance-setup.md +866 -107
- package/src/index.mjs +74 -29
|
@@ -19,6 +19,8 @@ REST/HTTPS, skill-only installs, enterprise org keys, local identity, and common
|
|
|
19
19
|
propose_private_skill because it has no durable device outbox.
|
|
20
20
|
- A native plugin appears installed but hooks, trust prompts, or MCP tools do
|
|
21
21
|
not work.
|
|
22
|
+
- An organization install stops for approval at every private lesson or skill
|
|
23
|
+
submission, or an unattended or headless run denies it.
|
|
22
24
|
- A request fails with 401, 403, 404, 413, 422, 429, or a missing-key error.
|
|
23
25
|
|
|
24
26
|
## First decision
|
|
@@ -32,6 +34,11 @@ REST/HTTPS, skill-only installs, enterprise org keys, local identity, and common
|
|
|
32
34
|
5. Use the skills.sh entry skill only when the runtime can load filesystem
|
|
33
35
|
skills but not native plugins.
|
|
34
36
|
|
|
37
|
+
With an organization key, a plugin or MCP install also needs the step in
|
|
38
|
+
"Highly Recommended: approve private submissions" below; ask the user to apply
|
|
39
|
+
it rather than changing host settings yourself. REST and skill-only installs
|
|
40
|
+
have no MCP tools to approve.
|
|
41
|
+
|
|
35
42
|
Raw MCP, REST, and skill-only paths do not have native Stop hooks. They must
|
|
36
43
|
self-check before finishing and submit `type: "failure_report"` remembrances
|
|
37
44
|
for reusable self-corrections, user-caught mistakes, CI/deploy failures, and
|
|
@@ -182,25 +189,417 @@ Cursor plugin installs this Remembrancer skill, an always-apply Cursor rule, a
|
|
|
182
189
|
plugin-managed MCP server config, and hooks that ask for feedback only after
|
|
183
190
|
actual Remembrance MCP use.
|
|
184
191
|
|
|
185
|
-
For local plugin testing before marketplace approval
|
|
192
|
+
For local plugin testing before marketplace approval, copy the plugin into its
|
|
193
|
+
own folder under Cursor's local plugin folder, then restart Cursor or run
|
|
194
|
+
**Developer: Reload Window**:
|
|
186
195
|
|
|
187
196
|
~~~bash
|
|
188
|
-
mkdir -p ~/.cursor/plugins/local
|
|
189
|
-
|
|
197
|
+
mkdir -p ~/.cursor/plugins/local/remembrance
|
|
198
|
+
cp -R /absolute/path/to/remembrance/packages/cursor-plugin/. ~/.cursor/plugins/local/remembrance/
|
|
190
199
|
~~~
|
|
191
200
|
|
|
201
|
+
Copy the files rather than linking them: Cursor skips a symbolic link that
|
|
202
|
+
points to a plugin elsewhere on disk. On Teams and Enterprise, local plugins
|
|
203
|
+
load only when an administrator allows **Allow Local Plugin Imports**, which is
|
|
204
|
+
off by default on Enterprise.
|
|
205
|
+
|
|
192
206
|
Cursor now documents conversation hooks for cloud agents, but a local plugin
|
|
193
207
|
install does not automatically provision the cloud surface. Distribute the
|
|
194
|
-
plugin through the team marketplace, register Remembrance
|
|
195
|
-
|
|
196
|
-
receipts in both local and cloud runs.
|
|
208
|
+
plugin through the team marketplace, register Remembrance as a Team MCP server
|
|
209
|
+
under **Dashboard > Plugins & MCPs**, and verify query, invocation, feedback,
|
|
210
|
+
and contribution receipts in both local and cloud runs.
|
|
197
211
|
|
|
198
212
|
After installing any native plugin, restart the agent app/session and approve
|
|
199
213
|
the runtime's trust request when one appears. For Codex, complete the hook
|
|
200
214
|
review above if Codex requests it; unchanged, previously trusted definitions
|
|
201
215
|
may not show another review screen. Changed hook definitions show the review
|
|
202
216
|
screen again. A currently running Codex or Claude thread usually cannot
|
|
203
|
-
hot-load newly installed plugin tools.
|
|
217
|
+
hot-load newly installed plugin tools. With an organization key, then ask the
|
|
218
|
+
user to complete the Highly Recommended step below.
|
|
219
|
+
|
|
220
|
+
### Optional unattended routine feedback in Codex
|
|
221
|
+
|
|
222
|
+
After the user explicitly opts in, add only these two tool overrides to the
|
|
223
|
+
user-level `~/.codex/config.toml`. This approval persists across future
|
|
224
|
+
sessions on this installation until removed; installation alone does not grant
|
|
225
|
+
it. Merge with existing tables rather than duplicating them:
|
|
226
|
+
|
|
227
|
+
~~~toml
|
|
228
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.submit_query_feedback]
|
|
229
|
+
approval_mode = "approve"
|
|
230
|
+
|
|
231
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.submit_feedback]
|
|
232
|
+
approval_mode = "approve"
|
|
233
|
+
~~~
|
|
234
|
+
|
|
235
|
+
Use this opt-in for an organization-authenticated local plugin whose
|
|
236
|
+
`submit_feedback` schema is categorical and rejects `lesson`. Query-fit
|
|
237
|
+
ratings send Remembrance-issued query/result IDs, categorical verdicts, and
|
|
238
|
+
required reasons; post-use ratings send the skill slug, those correlation IDs, usefulness/rating,
|
|
239
|
+
and stable idempotency. Keep optional notes and evidence out of routine
|
|
240
|
+
ratings: do not automatically attach internal receipt hashes, task prose,
|
|
241
|
+
source content, raw logs, or private URLs. Public substantive reports retain
|
|
242
|
+
their separate evidence requirements; reusable private lessons use
|
|
243
|
+
`capture_learning` and its exact returned action.
|
|
244
|
+
|
|
245
|
+
These are real writes, not read-only diagnostics. Post-use feedback can enter
|
|
246
|
+
verification and incur processing cost under the existing organization policy.
|
|
247
|
+
The two overrides do not approve private lesson/skill submission (the Highly
|
|
248
|
+
Recommended step below covers that), publishing, deletion, reset, preference
|
|
249
|
+
changes, or other tools. They do not widen the server's enabled tool set or
|
|
250
|
+
override managed policy, network restrictions, or organization processing
|
|
251
|
+
grants. They do skip the Codex approval prompt and its Auto-review (guardian)
|
|
252
|
+
evaluation for these two tools. Do not set the whole server's approval default
|
|
253
|
+
to `approve` for this purpose.
|
|
254
|
+
|
|
255
|
+
Tool overrides persist when authentication or schemas change. Remove or
|
|
256
|
+
re-review both approvals before switching to anonymous or hosted transport,
|
|
257
|
+
enabling legacy broad writes, or changing the organization or destination.
|
|
258
|
+
|
|
259
|
+
To revoke this opt-in, remove only these two tool-level approval entries;
|
|
260
|
+
the inherited approval policy applies again. Reconnect the plugin or start a
|
|
261
|
+
fresh Codex session if the current host does not reload config, then verify
|
|
262
|
+
with a minimal eligible rating. A healthy connection doctor verifies the
|
|
263
|
+
connection, not that host approval policy permits feedback. A denial means
|
|
264
|
+
that rating was not submitted; acknowledge it locally and do not retry through
|
|
265
|
+
another transport. See the [official installed-server policy guide](https://developers.openai.com/plugins/build/plugins#configure-installed-server-policy).
|
|
266
|
+
|
|
267
|
+
## Highly Recommended: approve private submissions
|
|
268
|
+
|
|
269
|
+
For organizations that use Remembrance with a private organization key, this
|
|
270
|
+
step is required for Remembrance to do its job fully. Without it, on hosts that
|
|
271
|
+
ask before these tools, every private lesson or skill submission stops for a
|
|
272
|
+
manual approval, and unattended or headless runs deny it. Public-only use,
|
|
273
|
+
without an organization key, does not need it.
|
|
274
|
+
|
|
275
|
+
Ask the user (for managed settings, the administrator) before applying this
|
|
276
|
+
step. An agent never edits host permission or settings files without the
|
|
277
|
+
user's consent, and never answers the host's approval of its own pending
|
|
278
|
+
action.
|
|
279
|
+
|
|
280
|
+
Persist the host's approval for exactly these four local tools, the private
|
|
281
|
+
submit and retry actions:
|
|
282
|
+
|
|
283
|
+
- `submit_private_lesson_candidate`
|
|
284
|
+
- `retry_private_lesson_candidate`
|
|
285
|
+
- `submit_private_skill_candidate`
|
|
286
|
+
- `retry_private_skill_candidate`
|
|
287
|
+
|
|
288
|
+
Hosted MCP exposes only `submit_private_lesson_candidate` of the four, so
|
|
289
|
+
approve only that one there. Each approval lets the agent send to the
|
|
290
|
+
organization's private review queue without asking. On a local server that is
|
|
291
|
+
normally a draft that `capture_learning` already prepared, although the
|
|
292
|
+
lesson submit also accepts a lesson candidate the agent writes into the call;
|
|
293
|
+
on hosted MCP, which has no `capture_learning`, the approved submit sends the
|
|
294
|
+
lesson candidate the agent writes. These actions cannot publish public content.
|
|
295
|
+
Never pre-approve `delete_private_lesson_candidate` or
|
|
296
|
+
`delete_private_skill_candidate`, a whole server (`mcp__<server>` or
|
|
297
|
+
`mcp__<server>__*`), `bypassPermissions`, Gemini CLI `trust: true` or
|
|
298
|
+
`mcp.allowed`, or any global auto-approve.
|
|
299
|
+
|
|
300
|
+
Every local private submission starts with `capture_learning`, which writes
|
|
301
|
+
the encrypted draft. It is local only: it stays on this machine and sends
|
|
302
|
+
nothing. On hosts that ask before it (Claude Code, which asks before every MCP
|
|
303
|
+
tool; Gemini CLI; VS Code; and Cursor, depending on its Run Mode), the steps
|
|
304
|
+
below add it as a labelled local-only entry, which is not one of the four
|
|
305
|
+
submit and retry tools. Without it the capture prompts, and a headless run
|
|
306
|
+
denies it before any draft exists. Codex under the managed `writes` mode also
|
|
307
|
+
asks before it, but there approving it is an optional administrator decision:
|
|
308
|
+
with it, Auto-review never sees the lesson content (see "Approve private
|
|
309
|
+
repository contributions in managed Codex"). On these hosts a run that nobody
|
|
310
|
+
can answer, such as a headless run, denies every tool that has no approval, so
|
|
311
|
+
it also needs approvals for the other Remembrance tools it calls, such as
|
|
312
|
+
`query_skills`; this step covers only private learning.
|
|
313
|
+
|
|
314
|
+
Check the step by behavior: capture one disposable private lesson and confirm
|
|
315
|
+
that neither the capture nor its submission prompts. Where the organization
|
|
316
|
+
leaves `capture_learning` to Auto-review or a person, as managed Codex may,
|
|
317
|
+
only the capture is reviewed; its submission still must not prompt.
|
|
318
|
+
`run_connection_doctor` cannot see a persisted approval; its `host_approval`
|
|
319
|
+
field reports only recent denials.
|
|
320
|
+
|
|
321
|
+
### Claude Code
|
|
322
|
+
|
|
323
|
+
Merge these entries into `permissions.allow` in `~/.claude/settings.json`,
|
|
324
|
+
which applies to every project. The first four are the plugin's private submit
|
|
325
|
+
and retry tools; the last is the local-only `capture_learning` entry:
|
|
326
|
+
|
|
327
|
+
~~~json
|
|
328
|
+
{
|
|
329
|
+
"permissions": {
|
|
330
|
+
"allow": [
|
|
331
|
+
"mcp__plugin_remembrance_remembrance__submit_private_lesson_candidate",
|
|
332
|
+
"mcp__plugin_remembrance_remembrance__retry_private_lesson_candidate",
|
|
333
|
+
"mcp__plugin_remembrance_remembrance__submit_private_skill_candidate",
|
|
334
|
+
"mcp__plugin_remembrance_remembrance__retry_private_skill_candidate",
|
|
335
|
+
"mcp__plugin_remembrance_remembrance__capture_learning"
|
|
336
|
+
]
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
~~~
|
|
340
|
+
|
|
341
|
+
Choosing "Yes, and don't ask again" at the prompt saves the rule only for the
|
|
342
|
+
current project, in `.claude/settings.local.json`. A local standalone server
|
|
343
|
+
named `remembrance`, whether a user or the organization registers it, uses
|
|
344
|
+
`mcp__remembrance__<tool>` names instead:
|
|
345
|
+
|
|
346
|
+
~~~json
|
|
347
|
+
{
|
|
348
|
+
"permissions": {
|
|
349
|
+
"allow": [
|
|
350
|
+
"mcp__remembrance__submit_private_lesson_candidate",
|
|
351
|
+
"mcp__remembrance__retry_private_lesson_candidate",
|
|
352
|
+
"mcp__remembrance__submit_private_skill_candidate",
|
|
353
|
+
"mcp__remembrance__retry_private_skill_candidate",
|
|
354
|
+
"mcp__remembrance__capture_learning"
|
|
355
|
+
]
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
~~~
|
|
359
|
+
|
|
360
|
+
Hosted MCP, including the `managed-mcp.json` path in "Approve Claude Code",
|
|
361
|
+
exposes only `submit_private_lesson_candidate` of these and has no
|
|
362
|
+
`capture_learning`, so a hosted server named `remembrance` needs only this
|
|
363
|
+
entry:
|
|
364
|
+
|
|
365
|
+
~~~json
|
|
366
|
+
{
|
|
367
|
+
"permissions": {
|
|
368
|
+
"allow": [
|
|
369
|
+
"mcp__remembrance__submit_private_lesson_candidate"
|
|
370
|
+
]
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
~~~
|
|
374
|
+
|
|
375
|
+
Headless runs such as `claude -p` deny every tool without an allow rule, so
|
|
376
|
+
they also need rules for the other Remembrance tools they call. Plan mode still
|
|
377
|
+
asks before these tools even when a rule allows them. When managed settings set
|
|
378
|
+
`allowManagedPermissionRulesOnly`, Claude Code ignores user rules, so an
|
|
379
|
+
administrator must ship them (see "Approve Claude Code").
|
|
380
|
+
|
|
381
|
+
### Codex
|
|
382
|
+
|
|
383
|
+
Add one table per tool to the user-level `~/.codex/config.toml`, separate from
|
|
384
|
+
the optional routine-feedback opt-in above:
|
|
385
|
+
|
|
386
|
+
~~~toml
|
|
387
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.submit_private_lesson_candidate]
|
|
388
|
+
approval_mode = "approve"
|
|
389
|
+
|
|
390
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.retry_private_lesson_candidate]
|
|
391
|
+
approval_mode = "approve"
|
|
392
|
+
|
|
393
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.submit_private_skill_candidate]
|
|
394
|
+
approval_mode = "approve"
|
|
395
|
+
|
|
396
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.retry_private_skill_candidate]
|
|
397
|
+
approval_mode = "approve"
|
|
398
|
+
~~~
|
|
399
|
+
|
|
400
|
+
Current Codex source does not prompt for these four tools, or for
|
|
401
|
+
`capture_learning`, under the default `auto` tool approval mode, because
|
|
402
|
+
Remembrance marks them non-destructive and closed-world; older releases and
|
|
403
|
+
other modes can, so add the tables anyway. Under the managed
|
|
404
|
+
`default_tools_approval_mode = "writes"`, Codex asks before every call, from a
|
|
405
|
+
person or from Auto-review where it is the reviewer, and cannot remember the
|
|
406
|
+
answer, so a per-tool `approve` entry is the only way to persist approval.
|
|
407
|
+
`approve` also skips Auto-review for that tool, so in a managed organization
|
|
408
|
+
add these tables only with your administrator ("Approve private repository
|
|
409
|
+
contributions in managed Codex" covers the trade-off and `capture_learning`).
|
|
410
|
+
For a manually registered server named `remembrance`, use the same tables
|
|
411
|
+
under `mcp_servers.remembrance`:
|
|
412
|
+
|
|
413
|
+
~~~toml
|
|
414
|
+
[mcp_servers.remembrance.tools.submit_private_lesson_candidate]
|
|
415
|
+
approval_mode = "approve"
|
|
416
|
+
|
|
417
|
+
[mcp_servers.remembrance.tools.retry_private_lesson_candidate]
|
|
418
|
+
approval_mode = "approve"
|
|
419
|
+
|
|
420
|
+
[mcp_servers.remembrance.tools.submit_private_skill_candidate]
|
|
421
|
+
approval_mode = "approve"
|
|
422
|
+
|
|
423
|
+
[mcp_servers.remembrance.tools.retry_private_skill_candidate]
|
|
424
|
+
approval_mode = "approve"
|
|
425
|
+
~~~
|
|
426
|
+
|
|
427
|
+
### Cursor
|
|
428
|
+
|
|
429
|
+
In the IDE, merge these entries into the `mcpAllowlist` array of
|
|
430
|
+
`~/.cursor/permissions.json` (create the file if it is missing); the last is
|
|
431
|
+
the local-only `capture_learning` entry:
|
|
432
|
+
|
|
433
|
+
~~~json
|
|
434
|
+
{
|
|
435
|
+
"mcpAllowlist": [
|
|
436
|
+
"remembrance:submit_private_lesson_candidate",
|
|
437
|
+
"remembrance:retry_private_lesson_candidate",
|
|
438
|
+
"remembrance:submit_private_skill_candidate",
|
|
439
|
+
"remembrance:retry_private_skill_candidate",
|
|
440
|
+
"remembrance:capture_learning"
|
|
441
|
+
]
|
|
442
|
+
}
|
|
443
|
+
~~~
|
|
444
|
+
|
|
445
|
+
`mcpAllowlist` replaces the whole in-app MCP allowlist, so keep the entries
|
|
446
|
+
you already rely on in the same array, keep the file's other keys such as
|
|
447
|
+
`terminalAllowlist`, `approvalMode`, and `autoReview`, and use this
|
|
448
|
+
user-level file. Cursor applies it under its Run Modes (Auto-review is the
|
|
449
|
+
default); a team Run Mode configuration from an administrator overrides it. For
|
|
450
|
+
the Cursor CLI, merge the same tools into `permissions.allow` in
|
|
451
|
+
`~/.cursor/cli-config.json`:
|
|
452
|
+
|
|
453
|
+
~~~json
|
|
454
|
+
{
|
|
455
|
+
"permissions": {
|
|
456
|
+
"allow": [
|
|
457
|
+
"Mcp(remembrance:submit_private_lesson_candidate)",
|
|
458
|
+
"Mcp(remembrance:retry_private_lesson_candidate)",
|
|
459
|
+
"Mcp(remembrance:submit_private_skill_candidate)",
|
|
460
|
+
"Mcp(remembrance:retry_private_skill_candidate)",
|
|
461
|
+
"Mcp(remembrance:capture_learning)"
|
|
462
|
+
]
|
|
463
|
+
}
|
|
464
|
+
}
|
|
465
|
+
~~~
|
|
466
|
+
|
|
467
|
+
If Cursor shows the plugin's server under a name other than `remembrance`, use
|
|
468
|
+
that exact name instead. Do not replace the server name with `*`, which
|
|
469
|
+
approves the tool on every server.
|
|
470
|
+
|
|
471
|
+
### VS Code
|
|
472
|
+
|
|
473
|
+
VS Code has no settings key or policy that pre-approves a single tool; use its
|
|
474
|
+
interface. Run **Chat: Manage Tool Approval**, expand the Remembrance server,
|
|
475
|
+
tick only the four tools and the local-only `capture_learning`, and turn off
|
|
476
|
+
**Configure for this workspace only** so the approval applies in every
|
|
477
|
+
workspace. Do not tick the server's own box or choose **Always Allow Tools
|
|
478
|
+
from** the server: both approve the whole server. Alternatively, choose
|
|
479
|
+
**Always Allow** in the prompt's Allow menu the first time each of those tools
|
|
480
|
+
asks.
|
|
481
|
+
|
|
482
|
+
### OpenCode
|
|
483
|
+
|
|
484
|
+
OpenCode runs MCP tools without asking by default, so private submissions
|
|
485
|
+
already complete. Add explicit entries to the `permission` map in
|
|
486
|
+
`~/.config/opencode/opencode.json` so the four tools and the local-only
|
|
487
|
+
`capture_learning` keep working under a broader ask rule that comes before
|
|
488
|
+
them, which would otherwise stop every private lesson or skill submission:
|
|
489
|
+
|
|
490
|
+
~~~json
|
|
491
|
+
{
|
|
492
|
+
"permission": {
|
|
493
|
+
"remembrance_submit_private_lesson_candidate": "allow",
|
|
494
|
+
"remembrance_retry_private_lesson_candidate": "allow",
|
|
495
|
+
"remembrance_submit_private_skill_candidate": "allow",
|
|
496
|
+
"remembrance_retry_private_skill_candidate": "allow",
|
|
497
|
+
"remembrance_capture_learning": "allow"
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
~~~
|
|
501
|
+
|
|
502
|
+
Put them after any broader `"*"` or `"remembrance_*"` rule in the same
|
|
503
|
+
`permission` map, because OpenCode applies the last matching rule. A broader ask
|
|
504
|
+
rule set elsewhere, such as in an agent's own `permission` map or, depending on
|
|
505
|
+
the OpenCode version, in another configuration file, can still take precedence;
|
|
506
|
+
if the capture or its submission still prompts, find that rule and make sure the
|
|
507
|
+
same entries come after it. In OpenCode 2.x, answering "always" at a prompt
|
|
508
|
+
saves an allow rule for the current project across sessions (1.x keeps it until
|
|
509
|
+
OpenCode restarts); never answer "always" on a `delete_private_*` prompt.
|
|
510
|
+
|
|
511
|
+
### OpenClaw
|
|
512
|
+
|
|
513
|
+
In native runs OpenClaw documents no prompt of its own for MCP tools; the
|
|
514
|
+
Remembrance plugin asks before each private submission. To persist approval,
|
|
515
|
+
answer **allow-always** once for each lane when it asks to "Submit private
|
|
516
|
+
Remembrance lesson" or "Submit private Remembrance skill", for example with
|
|
517
|
+
`/approve <id> allow-always` in chat or
|
|
518
|
+
`openclaw approvals resolve <id> allow-always`. One decision covers that lane's
|
|
519
|
+
submit and retry actions, and the plugin saves it in its config.
|
|
520
|
+
|
|
521
|
+
To pre-set both lanes instead, Remembrance for OpenClaw 0.2.3 or later accepts
|
|
522
|
+
this in `~/.openclaw/openclaw.json`:
|
|
523
|
+
|
|
524
|
+
~~~json
|
|
525
|
+
{
|
|
526
|
+
"plugins": {
|
|
527
|
+
"entries": {
|
|
528
|
+
"remembrance": {
|
|
529
|
+
"config": {
|
|
530
|
+
"privateLearningEgressApprovals": {
|
|
531
|
+
"private_lesson": true,
|
|
532
|
+
"private_skill": true
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
}
|
|
539
|
+
~~~
|
|
540
|
+
|
|
541
|
+
Check the installed version first, for example with
|
|
542
|
+
`openclaw plugins inspect remembrance`. Earlier versions reject the key: the
|
|
543
|
+
Gateway then refuses to start until it is removed, and those versions cannot
|
|
544
|
+
keep an allow-always decision across a restart either. On older or
|
|
545
|
+
mixed-version installs, use allow-always.
|
|
546
|
+
|
|
547
|
+
### Gemini CLI
|
|
548
|
+
|
|
549
|
+
Create `~/.gemini/policies/remembrance.toml` with one rule per tool; the last
|
|
550
|
+
rule is the local-only `capture_learning` entry:
|
|
551
|
+
|
|
552
|
+
~~~toml
|
|
553
|
+
[[rule]]
|
|
554
|
+
mcpName = "remembrance"
|
|
555
|
+
toolName = "submit_private_lesson_candidate"
|
|
556
|
+
decision = "allow"
|
|
557
|
+
priority = 200
|
|
558
|
+
|
|
559
|
+
[[rule]]
|
|
560
|
+
mcpName = "remembrance"
|
|
561
|
+
toolName = "retry_private_lesson_candidate"
|
|
562
|
+
decision = "allow"
|
|
563
|
+
priority = 200
|
|
564
|
+
|
|
565
|
+
[[rule]]
|
|
566
|
+
mcpName = "remembrance"
|
|
567
|
+
toolName = "submit_private_skill_candidate"
|
|
568
|
+
decision = "allow"
|
|
569
|
+
priority = 200
|
|
570
|
+
|
|
571
|
+
[[rule]]
|
|
572
|
+
mcpName = "remembrance"
|
|
573
|
+
toolName = "retry_private_skill_candidate"
|
|
574
|
+
decision = "allow"
|
|
575
|
+
priority = 200
|
|
576
|
+
|
|
577
|
+
# Local only: capture_learning stays on this machine and sends nothing.
|
|
578
|
+
[[rule]]
|
|
579
|
+
mcpName = "remembrance"
|
|
580
|
+
toolName = "capture_learning"
|
|
581
|
+
decision = "allow"
|
|
582
|
+
priority = 200
|
|
583
|
+
~~~
|
|
584
|
+
|
|
585
|
+
Gemini CLI asks before every MCP tool without an allow rule, and
|
|
586
|
+
non-interactive runs treat that prompt as a denial. These rules cover private
|
|
587
|
+
learning only, so a headless run also needs rules for the other Remembrance
|
|
588
|
+
tools it calls, such as `query_skills`. Keep `trust` false and do not list
|
|
589
|
+
the server in `mcp.allowed`: Gemini CLI turns `trust: true` and an
|
|
590
|
+
`mcp.allowed` entry alike into an allow rule for every tool of the server.
|
|
591
|
+
Administrators use the admin policy file in "Approve Gemini CLI" instead, which
|
|
592
|
+
already contains these rules.
|
|
593
|
+
|
|
594
|
+
### Claude Desktop and other MCP clients
|
|
595
|
+
|
|
596
|
+
Claude Desktop offers a per-tool **Always allow**, in the approval prompt or in
|
|
597
|
+
the connector's tool permissions, but it has no config key and users report
|
|
598
|
+
that it resets when the app updates, so do not rely on it for unattended runs.
|
|
599
|
+
For other MCP clients, use the client's per-tool approval for the four exact
|
|
600
|
+
tool names (only `submit_private_lesson_candidate` on hosted MCP), plus the
|
|
601
|
+
local-only `capture_learning` on a local server that asks before it. If a
|
|
602
|
+
client can approve only a whole server, keep its prompts.
|
|
204
603
|
|
|
205
604
|
## Enterprise/org key setup
|
|
206
605
|
|
|
@@ -287,8 +686,10 @@ while malformed or privacy-sensitive tags hold the draft instead of being
|
|
|
287
686
|
silently removed.
|
|
288
687
|
|
|
289
688
|
The plugin then calls `submit_private_lesson_candidate` with that draft ID.
|
|
290
|
-
This is the
|
|
291
|
-
|
|
689
|
+
This is the host-visible network action in the flow, and
|
|
690
|
+
`retry_private_lesson_candidate` later resends a retained draft through the
|
|
691
|
+
same lane. Persist approval for these exact actions, as in "Highly Recommended:
|
|
692
|
+
approve private submissions", not for every Remembrance write. The server derives
|
|
292
693
|
the organization and private visibility from the authenticated key, verifies a
|
|
293
694
|
signed organization policy plus purpose-bound attestation, and returns a signed
|
|
294
695
|
content-free receipt. The action always submits privately and never falls back
|
|
@@ -346,16 +747,17 @@ agent task remain available when capture or submission is blocked.
|
|
|
346
747
|
### Approve private repository contributions in managed Codex
|
|
347
748
|
|
|
348
749
|
An API key authorizes Remembrance; it does not authorize Codex to export
|
|
349
|
-
repository-derived content. Codex Auto-review
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
750
|
+
repository-derived content. Codex Auto-review evaluates the approval requests
|
|
751
|
+
that would otherwise pause for a person, including MCP calls that need approval
|
|
752
|
+
under their annotations or configured approval mode; a tool set to `approve`
|
|
753
|
+
never reaches it. A chat approval may not override an enterprise deny rule, and
|
|
754
|
+
no Remembrance plugin setting can weaken that host boundary.
|
|
353
755
|
|
|
354
756
|
For an organization that has approved Remembrance as an operational-memory
|
|
355
757
|
processor, a Codex administrator should do all of the following:
|
|
356
758
|
|
|
357
|
-
1. Allow the
|
|
358
|
-
`
|
|
759
|
+
1. Allow the Remembrance marketplace source in managed Codex requirements and
|
|
760
|
+
enable the plugin's bundled `remembrance` server in managed configuration.
|
|
359
761
|
2. Merge a narrow Remembrance destination rule into the existing
|
|
360
762
|
`guardian_policy_config`. Do not replace the rest of the tenant policy or
|
|
361
763
|
remove its credential, secret, raw-log, or unrelated-source-code denies.
|
|
@@ -376,9 +778,12 @@ key to force a public candidate. Submit privately, then use the reviewed public-
|
|
|
376
778
|
propagation flow for a redacted public-safe version when the organization wants
|
|
377
779
|
to share it.
|
|
378
780
|
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
781
|
+
Managed `requirements.toml` restricts the marketplace source; the tool
|
|
782
|
+
allowlist and approval mode belong in managed configuration. The bundled server
|
|
783
|
+
is a local stdio server, so never give it the hosted URL as its identity. If the
|
|
784
|
+
requirements also carry an `mcp_servers` allowlist, approve this server by its
|
|
785
|
+
configured command (`sh`): Codex disables a server whose name and identity do
|
|
786
|
+
not match an approved entry.
|
|
382
787
|
|
|
383
788
|
Add these entries to `requirements.toml`:
|
|
384
789
|
|
|
@@ -386,9 +791,6 @@ Add these entries to `requirements.toml`:
|
|
|
386
791
|
[features]
|
|
387
792
|
hooks = true
|
|
388
793
|
|
|
389
|
-
[plugins."remembrance@remembrance".mcp_servers.remembrance]
|
|
390
|
-
identity = { url = "https://remembrance.dev/api/mcp" }
|
|
391
|
-
|
|
392
794
|
[marketplaces]
|
|
393
795
|
restrict_to_allowed_sources = true
|
|
394
796
|
|
|
@@ -432,8 +834,50 @@ enabled_tools = [
|
|
|
432
834
|
"delete_private_skill_candidate",
|
|
433
835
|
]
|
|
434
836
|
default_tools_approval_mode = "writes"
|
|
837
|
+
|
|
838
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.submit_private_lesson_candidate]
|
|
839
|
+
approval_mode = "approve"
|
|
840
|
+
|
|
841
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.retry_private_lesson_candidate]
|
|
842
|
+
approval_mode = "approve"
|
|
843
|
+
|
|
844
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.submit_private_skill_candidate]
|
|
845
|
+
approval_mode = "approve"
|
|
846
|
+
|
|
847
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.retry_private_skill_candidate]
|
|
848
|
+
approval_mode = "approve"
|
|
849
|
+
~~~
|
|
850
|
+
|
|
851
|
+
`default_tools_approval_mode = "writes"` asks before every call of every tool
|
|
852
|
+
that is not marked read-only, including `query_skills`, `get_skill`,
|
|
853
|
+
`get_resource`, `invoke_skill`, `capture_learning`, and the feedback tools.
|
|
854
|
+
The answer comes from a person, or from Auto-review where it is the reviewer;
|
|
855
|
+
Codex cannot remember it, and a run that cannot ask denies the call.
|
|
856
|
+
|
|
857
|
+
The four `approve` tables are the Highly Recommended step: they let the
|
|
858
|
+
private submit and retry calls run without that per-call review. The trade-off
|
|
859
|
+
is that Auto-review never evaluates a tool set to `approve`, so the guardian
|
|
860
|
+
policy's denies no longer apply to those four calls. They normally carry only a
|
|
861
|
+
draft ID, so the lesson or skill content passes through `capture_learning`,
|
|
862
|
+
which a person or Auto-review still reviews; but the lesson submit also accepts
|
|
863
|
+
a lesson candidate written into the call, which then reaches the
|
|
864
|
+
organization's private review queue without that review. Leave the tables out
|
|
865
|
+
if the organization wants Auto-review to evaluate every private submission.
|
|
866
|
+
|
|
867
|
+
Runs that cannot ask can capture only if `capture_learning` is approved too.
|
|
868
|
+
This optional table is local only, but with it Auto-review never sees the
|
|
869
|
+
lesson content at all:
|
|
870
|
+
|
|
871
|
+
~~~toml
|
|
872
|
+
# Local only: capture_learning stays on this machine and sends nothing.
|
|
873
|
+
# Approving it also skips Auto-review for the lesson it captures.
|
|
874
|
+
[plugins."remembrance@remembrance".mcp_servers.remembrance.tools.capture_learning]
|
|
875
|
+
approval_mode = "approve"
|
|
435
876
|
~~~
|
|
436
877
|
|
|
878
|
+
Those runs also need approval for every other tool they call, so unattended
|
|
879
|
+
work under `writes` usually relies on Auto-review as the reviewer instead.
|
|
880
|
+
|
|
437
881
|
If `allow_managed_hooks_only = true`, Codex skips plugin hooks. Either leave
|
|
438
882
|
the vetted Remembrance plugin hooks permitted or deploy equivalent managed
|
|
439
883
|
query/completion hooks; otherwise MCP calls may work while the query and
|
|
@@ -588,10 +1032,66 @@ optional local-only tools and never belong in a hosted MCP allowlist.
|
|
|
588
1032
|
### Approve Claude Code
|
|
589
1033
|
|
|
590
1034
|
Force-enable `remembrance@remembrance` in managed settings so its vetted hooks
|
|
591
|
-
still run when `allowManagedHooksOnly` is enabled.
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
1035
|
+
still run when `allowManagedHooksOnly` is enabled. Then choose one MCP path.
|
|
1036
|
+
|
|
1037
|
+
To keep the plugin's local server, with all four private submit and retry tools
|
|
1038
|
+
and the encrypted device outbox, deploy neither `managed-mcp.json` nor the
|
|
1039
|
+
URL-only `allowedMcpServers` list of the hosted path below. Exclusive managed
|
|
1040
|
+
MCP suppresses every plugin-provided server, and Claude Code also checks plugin
|
|
1041
|
+
servers against `allowedMcpServers`, where a list with only `serverUrl`
|
|
1042
|
+
entries blocks every stdio server. Merge this approval into managed settings;
|
|
1043
|
+
the plugin's tool names carry the `mcp__plugin_remembrance_remembrance__`
|
|
1044
|
+
prefix, and the last entry is the local-only `capture_learning`:
|
|
1045
|
+
|
|
1046
|
+
~~~json
|
|
1047
|
+
{
|
|
1048
|
+
"enabledPlugins": {
|
|
1049
|
+
"remembrance@remembrance": true
|
|
1050
|
+
},
|
|
1051
|
+
"permissions": {
|
|
1052
|
+
"allow": [
|
|
1053
|
+
"mcp__plugin_remembrance_remembrance__submit_private_lesson_candidate",
|
|
1054
|
+
"mcp__plugin_remembrance_remembrance__retry_private_lesson_candidate",
|
|
1055
|
+
"mcp__plugin_remembrance_remembrance__submit_private_skill_candidate",
|
|
1056
|
+
"mcp__plugin_remembrance_remembrance__retry_private_skill_candidate",
|
|
1057
|
+
"mcp__plugin_remembrance_remembrance__capture_learning"
|
|
1058
|
+
]
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
~~~
|
|
1062
|
+
|
|
1063
|
+
Managed rules also cover organizations that set
|
|
1064
|
+
`allowManagedPermissionRulesOnly`, which makes Claude Code ignore user rules.
|
|
1065
|
+
For command or REST fallbacks under a sandbox, also merge `remembrance.dev`
|
|
1066
|
+
into `sandbox.network.allowedDomains`.
|
|
1067
|
+
|
|
1068
|
+
Optional lockdown, separate from that approval: Remembrance needs neither of
|
|
1069
|
+
these keys, and both restrict much more than Remembrance.
|
|
1070
|
+
`allowManagedHooksOnly` makes Claude Code ignore every user, project, and
|
|
1071
|
+
local hook, and turns off `/goal` and command-sourced plugins.
|
|
1072
|
+
`strictKnownMarketplaces` blocks plugins from every marketplace it does not
|
|
1073
|
+
list, and also the `~/.claude/skills` auto-load unless the list includes
|
|
1074
|
+
`{"source": "skills-dir"}`. Add them only when the organization wants that
|
|
1075
|
+
lockdown; the hosted path below carries the same two keys:
|
|
1076
|
+
|
|
1077
|
+
~~~json
|
|
1078
|
+
{
|
|
1079
|
+
"strictKnownMarketplaces": [
|
|
1080
|
+
{
|
|
1081
|
+
"source": "github",
|
|
1082
|
+
"repo": "dreamarkinc/remembrance-skills"
|
|
1083
|
+
}
|
|
1084
|
+
],
|
|
1085
|
+
"allowManagedHooksOnly": true
|
|
1086
|
+
}
|
|
1087
|
+
~~~
|
|
1088
|
+
|
|
1089
|
+
To use hosted MCP instead, define Remembrance in `managed-mcp.json`, because
|
|
1090
|
+
exclusive managed MCP suppresses every plugin-provided MCP server. The plugin
|
|
1091
|
+
keeps its hooks and skills, but its tools then come from the hosted server named
|
|
1092
|
+
`remembrance`, which exposes only `submit_private_lesson_candidate` of the four
|
|
1093
|
+
private actions. Use the exact URL as the security boundary; a server name alone
|
|
1094
|
+
is not sufficient.
|
|
595
1095
|
|
|
596
1096
|
Do not put a real key directly in `managed-mcp.json`; every local user can read
|
|
597
1097
|
that file. Reference each user's process environment instead:
|
|
@@ -610,7 +1110,7 @@ that file. Reference each user's process environment instead:
|
|
|
610
1110
|
}
|
|
611
1111
|
~~~
|
|
612
1112
|
|
|
613
|
-
Merge this into managed settings:
|
|
1113
|
+
Merge this into managed settings for the hosted path:
|
|
614
1114
|
|
|
615
1115
|
~~~json
|
|
616
1116
|
{
|
|
@@ -644,7 +1144,7 @@ Merge this into managed settings:
|
|
|
644
1144
|
"mcp__remembrance__link_current_installation",
|
|
645
1145
|
"mcp__remembrance__submit_private_lesson_candidate",
|
|
646
1146
|
"mcp__remembrance__submit_remembrance",
|
|
647
|
-
"mcp__remembrance__propose_private_skill"
|
|
1147
|
+
"mcp__remembrance__propose_private_skill"
|
|
648
1148
|
]
|
|
649
1149
|
},
|
|
650
1150
|
"sandbox": {
|
|
@@ -670,13 +1170,11 @@ work. See the official
|
|
|
670
1170
|
### Approve Gemini CLI
|
|
671
1171
|
|
|
672
1172
|
Define the canonical server and its tool allowlist in the system override
|
|
673
|
-
settings, not only user or workspace settings.
|
|
674
|
-
|
|
675
|
-
narrow server/tool set:
|
|
1173
|
+
settings, not only user or workspace settings. Keep `trust` false;
|
|
1174
|
+
`trust: true` bypasses every confirmation for the server:
|
|
676
1175
|
|
|
677
1176
|
~~~json
|
|
678
1177
|
{
|
|
679
|
-
"mcp": { "allowed": ["remembrance"] },
|
|
680
1178
|
"mcpServers": {
|
|
681
1179
|
"remembrance": {
|
|
682
1180
|
"command": "npx",
|
|
@@ -686,33 +1184,33 @@ narrow server/tool set:
|
|
|
686
1184
|
"REMEMBRANCE_API_KEY": "${REMEMBRANCE_API_KEY}"
|
|
687
1185
|
},
|
|
688
1186
|
"includeTools": [
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
1187
|
+
"get_connection_status",
|
|
1188
|
+
"run_connection_doctor",
|
|
1189
|
+
"query_skills",
|
|
1190
|
+
"list_skills",
|
|
1191
|
+
"invoke_skill",
|
|
1192
|
+
"get_effective_preferences",
|
|
1193
|
+
"get_private_lesson_policy",
|
|
1194
|
+
"get_skill",
|
|
1195
|
+
"get_resource",
|
|
1196
|
+
"get_value_proof",
|
|
1197
|
+
"submit_query_feedback",
|
|
1198
|
+
"submit_feedback",
|
|
1199
|
+
"submit_preference_compatibility_feedback",
|
|
1200
|
+
"report_task_outcome",
|
|
1201
|
+
"submit_suggestion",
|
|
1202
|
+
"record_preference",
|
|
1203
|
+
"link_current_installation",
|
|
1204
|
+
"submit_private_lesson_candidate",
|
|
1205
|
+
"acknowledge_feedback_denial",
|
|
1206
|
+
"decline_pending_action",
|
|
1207
|
+
"capture_learning",
|
|
1208
|
+
"inspect_private_learning_outbox",
|
|
1209
|
+
"submit_private_skill_candidate",
|
|
1210
|
+
"retry_private_lesson_candidate",
|
|
1211
|
+
"delete_private_lesson_candidate",
|
|
1212
|
+
"retry_private_skill_candidate",
|
|
1213
|
+
"delete_private_skill_candidate"
|
|
716
1214
|
],
|
|
717
1215
|
"trust": false
|
|
718
1216
|
}
|
|
@@ -720,14 +1218,220 @@ narrow server/tool set:
|
|
|
720
1218
|
}
|
|
721
1219
|
~~~
|
|
722
1220
|
|
|
1221
|
+
Approve tools only with exact per-tool policy rules. Do not list the server in
|
|
1222
|
+
`mcp.allowed`: the server runs without it, and current Gemini CLI source turns
|
|
1223
|
+
each `mcp.allowed` entry into an allow rule for every tool of that server.
|
|
1224
|
+
Instead, save this file as `remembrance.toml` in the admin policy folder:
|
|
1225
|
+
`/Library/Application Support/GeminiCli/policies` on macOS,
|
|
1226
|
+
`/etc/gemini-cli/policies` on Linux, or `C:\ProgramData\gemini-cli\policies`
|
|
1227
|
+
on Windows. Gemini CLI ignores admin policy files that are not root-owned.
|
|
1228
|
+
|
|
1229
|
+
~~~toml
|
|
1230
|
+
# One exact rule per tool in includeTools: allow, except the two
|
|
1231
|
+
# confirmed-delete tools, which ask. To make a tool ask, change its
|
|
1232
|
+
# decision to "ask_user" rather than deleting its rule: an admin ask
|
|
1233
|
+
# outranks users' own allow rules, and without one a user's allow decides.
|
|
1234
|
+
|
|
1235
|
+
[[rule]]
|
|
1236
|
+
mcpName = "remembrance"
|
|
1237
|
+
toolName = "get_connection_status"
|
|
1238
|
+
decision = "allow"
|
|
1239
|
+
priority = 200
|
|
1240
|
+
|
|
1241
|
+
[[rule]]
|
|
1242
|
+
mcpName = "remembrance"
|
|
1243
|
+
toolName = "run_connection_doctor"
|
|
1244
|
+
decision = "allow"
|
|
1245
|
+
priority = 200
|
|
1246
|
+
|
|
1247
|
+
[[rule]]
|
|
1248
|
+
mcpName = "remembrance"
|
|
1249
|
+
toolName = "query_skills"
|
|
1250
|
+
decision = "allow"
|
|
1251
|
+
priority = 200
|
|
1252
|
+
|
|
1253
|
+
[[rule]]
|
|
1254
|
+
mcpName = "remembrance"
|
|
1255
|
+
toolName = "list_skills"
|
|
1256
|
+
decision = "allow"
|
|
1257
|
+
priority = 200
|
|
1258
|
+
|
|
1259
|
+
[[rule]]
|
|
1260
|
+
mcpName = "remembrance"
|
|
1261
|
+
toolName = "invoke_skill"
|
|
1262
|
+
decision = "allow"
|
|
1263
|
+
priority = 200
|
|
1264
|
+
|
|
1265
|
+
[[rule]]
|
|
1266
|
+
mcpName = "remembrance"
|
|
1267
|
+
toolName = "get_effective_preferences"
|
|
1268
|
+
decision = "allow"
|
|
1269
|
+
priority = 200
|
|
1270
|
+
|
|
1271
|
+
[[rule]]
|
|
1272
|
+
mcpName = "remembrance"
|
|
1273
|
+
toolName = "get_private_lesson_policy"
|
|
1274
|
+
decision = "allow"
|
|
1275
|
+
priority = 200
|
|
1276
|
+
|
|
1277
|
+
[[rule]]
|
|
1278
|
+
mcpName = "remembrance"
|
|
1279
|
+
toolName = "get_skill"
|
|
1280
|
+
decision = "allow"
|
|
1281
|
+
priority = 200
|
|
1282
|
+
|
|
1283
|
+
[[rule]]
|
|
1284
|
+
mcpName = "remembrance"
|
|
1285
|
+
toolName = "get_resource"
|
|
1286
|
+
decision = "allow"
|
|
1287
|
+
priority = 200
|
|
1288
|
+
|
|
1289
|
+
[[rule]]
|
|
1290
|
+
mcpName = "remembrance"
|
|
1291
|
+
toolName = "get_value_proof"
|
|
1292
|
+
decision = "allow"
|
|
1293
|
+
priority = 200
|
|
1294
|
+
|
|
1295
|
+
[[rule]]
|
|
1296
|
+
mcpName = "remembrance"
|
|
1297
|
+
toolName = "submit_query_feedback"
|
|
1298
|
+
decision = "allow"
|
|
1299
|
+
priority = 200
|
|
1300
|
+
|
|
1301
|
+
[[rule]]
|
|
1302
|
+
mcpName = "remembrance"
|
|
1303
|
+
toolName = "submit_feedback"
|
|
1304
|
+
decision = "allow"
|
|
1305
|
+
priority = 200
|
|
1306
|
+
|
|
1307
|
+
[[rule]]
|
|
1308
|
+
mcpName = "remembrance"
|
|
1309
|
+
toolName = "submit_preference_compatibility_feedback"
|
|
1310
|
+
decision = "allow"
|
|
1311
|
+
priority = 200
|
|
1312
|
+
|
|
1313
|
+
[[rule]]
|
|
1314
|
+
mcpName = "remembrance"
|
|
1315
|
+
toolName = "report_task_outcome"
|
|
1316
|
+
decision = "allow"
|
|
1317
|
+
priority = 200
|
|
1318
|
+
|
|
1319
|
+
[[rule]]
|
|
1320
|
+
mcpName = "remembrance"
|
|
1321
|
+
toolName = "submit_suggestion"
|
|
1322
|
+
decision = "allow"
|
|
1323
|
+
priority = 200
|
|
1324
|
+
|
|
1325
|
+
[[rule]]
|
|
1326
|
+
mcpName = "remembrance"
|
|
1327
|
+
toolName = "record_preference"
|
|
1328
|
+
decision = "allow"
|
|
1329
|
+
priority = 200
|
|
1330
|
+
|
|
1331
|
+
[[rule]]
|
|
1332
|
+
mcpName = "remembrance"
|
|
1333
|
+
toolName = "link_current_installation"
|
|
1334
|
+
decision = "allow"
|
|
1335
|
+
priority = 200
|
|
1336
|
+
|
|
1337
|
+
[[rule]]
|
|
1338
|
+
mcpName = "remembrance"
|
|
1339
|
+
toolName = "submit_private_lesson_candidate"
|
|
1340
|
+
decision = "allow"
|
|
1341
|
+
priority = 200
|
|
1342
|
+
|
|
1343
|
+
[[rule]]
|
|
1344
|
+
mcpName = "remembrance"
|
|
1345
|
+
toolName = "acknowledge_feedback_denial"
|
|
1346
|
+
decision = "allow"
|
|
1347
|
+
priority = 200
|
|
1348
|
+
|
|
1349
|
+
[[rule]]
|
|
1350
|
+
mcpName = "remembrance"
|
|
1351
|
+
toolName = "decline_pending_action"
|
|
1352
|
+
decision = "allow"
|
|
1353
|
+
priority = 200
|
|
1354
|
+
|
|
1355
|
+
# Local only: capture_learning stays on this machine and sends nothing.
|
|
1356
|
+
[[rule]]
|
|
1357
|
+
mcpName = "remembrance"
|
|
1358
|
+
toolName = "capture_learning"
|
|
1359
|
+
decision = "allow"
|
|
1360
|
+
priority = 200
|
|
1361
|
+
|
|
1362
|
+
[[rule]]
|
|
1363
|
+
mcpName = "remembrance"
|
|
1364
|
+
toolName = "inspect_private_learning_outbox"
|
|
1365
|
+
decision = "allow"
|
|
1366
|
+
priority = 200
|
|
1367
|
+
|
|
1368
|
+
[[rule]]
|
|
1369
|
+
mcpName = "remembrance"
|
|
1370
|
+
toolName = "submit_private_skill_candidate"
|
|
1371
|
+
decision = "allow"
|
|
1372
|
+
priority = 200
|
|
1373
|
+
|
|
1374
|
+
[[rule]]
|
|
1375
|
+
mcpName = "remembrance"
|
|
1376
|
+
toolName = "retry_private_lesson_candidate"
|
|
1377
|
+
decision = "allow"
|
|
1378
|
+
priority = 200
|
|
1379
|
+
|
|
1380
|
+
[[rule]]
|
|
1381
|
+
mcpName = "remembrance"
|
|
1382
|
+
toolName = "delete_private_lesson_candidate"
|
|
1383
|
+
decision = "ask_user"
|
|
1384
|
+
priority = 200
|
|
1385
|
+
|
|
1386
|
+
[[rule]]
|
|
1387
|
+
mcpName = "remembrance"
|
|
1388
|
+
toolName = "retry_private_skill_candidate"
|
|
1389
|
+
decision = "allow"
|
|
1390
|
+
priority = 200
|
|
1391
|
+
|
|
1392
|
+
[[rule]]
|
|
1393
|
+
mcpName = "remembrance"
|
|
1394
|
+
toolName = "delete_private_skill_candidate"
|
|
1395
|
+
decision = "ask_user"
|
|
1396
|
+
priority = 200
|
|
1397
|
+
~~~
|
|
1398
|
+
|
|
1399
|
+
The file has one exact rule for every tool in `includeTools`: an allow rule
|
|
1400
|
+
for each tool except the two confirmed-delete tools, whose admin `ask_user`
|
|
1401
|
+
rules keep them asking even where a user allowed them, so a headless run denies
|
|
1402
|
+
them. Apart from those two, this reproduces the earlier behavior of this
|
|
1403
|
+
recipe, whose `mcp.allowed` entry let every included tool run, with exact
|
|
1404
|
+
rules instead of a whole-server rule. The file already contains the rules from
|
|
1405
|
+
"Highly Recommended: approve private submissions" for the four private submit
|
|
1406
|
+
and retry tools and the local-only `capture_learning`, so do not add those
|
|
1407
|
+
again. To make a tool ask, change its rule to `decision = "ask_user"` instead
|
|
1408
|
+
of deleting the rule: an admin-tier ask outranks users' own allow rules, while
|
|
1409
|
+
without an admin rule a user's allow rule decides. A headless run then denies
|
|
1410
|
+
that tool.
|
|
1411
|
+
|
|
1412
|
+
If the organization already restricts servers with `mcp.allowed`, Remembrance
|
|
1413
|
+
must be listed there to run, and that entry creates the whole-server allow rule.
|
|
1414
|
+
Then also place this rule in the admin policy folder. It creates no allow rule:
|
|
1415
|
+
admin rules outrank the one `mcp.allowed` creates, so a Remembrance tool
|
|
1416
|
+
without its own admin rule asks again, while the per-tool rules above, at
|
|
1417
|
+
priority 200, still win over it for their tools:
|
|
1418
|
+
|
|
1419
|
+
~~~toml
|
|
1420
|
+
[[rule]]
|
|
1421
|
+
mcpName = "remembrance"
|
|
1422
|
+
decision = "ask_user"
|
|
1423
|
+
priority = 100
|
|
1424
|
+
~~~
|
|
1425
|
+
|
|
723
1426
|
System settings live at `/Library/Application Support/GeminiCli/settings.json`
|
|
724
1427
|
on macOS, `/etc/gemini-cli/settings.json` on Linux, and
|
|
725
1428
|
`C:\ProgramData\gemini-cli\settings.json` on Windows. Also allow
|
|
726
1429
|
`remembrance.dev` in the organization's egress policy. Restart Gemini CLI,
|
|
727
1430
|
inspect the registered server, then run `run_connection_doctor` and require
|
|
728
1431
|
organization scope before contribution work. See the official
|
|
729
|
-
[enterprise configuration](https://
|
|
730
|
-
|
|
1432
|
+
[enterprise configuration](https://geminicli.com/docs/cli/enterprise/),
|
|
1433
|
+
[MCP settings](https://geminicli.com/docs/tools/mcp-server/), and
|
|
1434
|
+
[policy engine](https://geminicli.com/docs/reference/policy-engine/).
|
|
731
1435
|
|
|
732
1436
|
### Approve OpenClaw
|
|
733
1437
|
|
|
@@ -753,33 +1457,33 @@ MCP tools, and `tools.deny: ["bundle-mcp"]` disables them:
|
|
|
753
1457
|
"remembrance": {
|
|
754
1458
|
"toolFilter": {
|
|
755
1459
|
"include": [
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
1460
|
+
"get_connection_status",
|
|
1461
|
+
"run_connection_doctor",
|
|
1462
|
+
"query_skills",
|
|
1463
|
+
"list_skills",
|
|
1464
|
+
"invoke_skill",
|
|
1465
|
+
"get_effective_preferences",
|
|
1466
|
+
"get_private_lesson_policy",
|
|
1467
|
+
"get_skill",
|
|
1468
|
+
"get_resource",
|
|
1469
|
+
"get_value_proof",
|
|
1470
|
+
"submit_query_feedback",
|
|
1471
|
+
"submit_feedback",
|
|
1472
|
+
"submit_preference_compatibility_feedback",
|
|
1473
|
+
"report_task_outcome",
|
|
1474
|
+
"submit_suggestion",
|
|
1475
|
+
"record_preference",
|
|
1476
|
+
"link_current_installation",
|
|
1477
|
+
"submit_private_lesson_candidate",
|
|
1478
|
+
"acknowledge_feedback_denial",
|
|
1479
|
+
"decline_pending_action",
|
|
1480
|
+
"capture_learning",
|
|
1481
|
+
"inspect_private_learning_outbox",
|
|
1482
|
+
"submit_private_skill_candidate",
|
|
1483
|
+
"retry_private_lesson_candidate",
|
|
1484
|
+
"delete_private_lesson_candidate",
|
|
1485
|
+
"retry_private_skill_candidate",
|
|
1486
|
+
"delete_private_skill_candidate"
|
|
783
1487
|
]
|
|
784
1488
|
}
|
|
785
1489
|
}
|
|
@@ -788,8 +1492,17 @@ MCP tools, and `tools.deny: ["bundle-mcp"]` disables them:
|
|
|
788
1492
|
}
|
|
789
1493
|
~~~
|
|
790
1494
|
|
|
791
|
-
Use a normal `coding` or `messaging` tool profile
|
|
792
|
-
the
|
|
1495
|
+
Use a normal `coding` or `messaging` tool profile; both already include
|
|
1496
|
+
`bundle-mcp`, so the MCP tools need no `tools.allow` or `tools.alsoAllow`
|
|
1497
|
+
entry. The plugin asks before each private submission. For unattended runs,
|
|
1498
|
+
have each user answer allow-always once per lane. On Remembrance for OpenClaw
|
|
1499
|
+
0.2.3 or later only, you can instead pre-set both private lanes by merging the
|
|
1500
|
+
`privateLearningEgressApprovals` object from "Highly Recommended: approve
|
|
1501
|
+
private submissions" into `plugins.entries.remembrance.config`. Earlier
|
|
1502
|
+
versions reject that key and the Gateway then refuses to start, so check the
|
|
1503
|
+
installed version first and keep allow-always on older or mixed-version
|
|
1504
|
+
fleets. Then verify cold config, the active Gateway plugin, and live MCP
|
|
1505
|
+
capabilities separately:
|
|
793
1506
|
|
|
794
1507
|
~~~bash
|
|
795
1508
|
openclaw plugins inspect remembrance --runtime --json
|
|
@@ -824,18 +1537,27 @@ approved secret source, not in `policy.jsonc`. After the probes, run
|
|
|
824
1537
|
|
|
825
1538
|
For local agents, publish Remembrance in the team marketplace and choose
|
|
826
1539
|
`Required` or `Default On`. For cloud agents, also register the exact
|
|
827
|
-
Remembrance endpoint under **Dashboard >
|
|
828
|
-
MCP is distributed across cloud agents, the Agents window,
|
|
829
|
-
`remembrance.dev` to the enterprise sandbox network
|
|
830
|
-
based fallback paths.
|
|
831
|
-
|
|
832
|
-
Cursor's
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
836
|
-
|
|
837
|
-
|
|
838
|
-
|
|
1540
|
+
Remembrance endpoint as a Team MCP server under **Dashboard > Plugins & MCPs**
|
|
1541
|
+
so the same Team MCP is distributed across cloud agents, the Agents window,
|
|
1542
|
+
IDE, and CLI. Add `remembrance.dev` to the enterprise sandbox network
|
|
1543
|
+
allowlist for command-based fallback paths.
|
|
1544
|
+
|
|
1545
|
+
Cursor's managed per-tool allowlist is `~/.cursor/permissions.json`,
|
|
1546
|
+
distributed through MDM: ship the five `mcpAllowlist` entries from "Highly
|
|
1547
|
+
Recommended: approve private submissions", the four private submit and retry
|
|
1548
|
+
tools and the local-only `capture_learning`. A distributed file replaces each
|
|
1549
|
+
user's file and its in-app MCP allowlist, so merge these entries with every
|
|
1550
|
+
other entry and key the organization relies on, such as `terminalAllowlist`,
|
|
1551
|
+
`approvalMode`, and `autoReview`. A team Run Mode configuration overrides
|
|
1552
|
+
local `permissions.json` files, and the per-server tools field under
|
|
1553
|
+
**Team Settings > MCP Configuration** limits which tools may run but does not
|
|
1554
|
+
run them without asking. Keep the Auto-review or Allowlist Run Mode rather
|
|
1555
|
+
than Run Everything. Run `run_connection_doctor` and
|
|
1556
|
+
require organization scope on every enabled surface, then verify query,
|
|
1557
|
+
invocation, feedback, and private-contribution receipts; local plugin hooks and
|
|
1558
|
+
cloud-agent hooks can differ. See the official
|
|
1559
|
+
[permissions file](https://cursor.com/docs/reference/permissions),
|
|
1560
|
+
[Run Modes](https://cursor.com/docs/agent/security/run-modes),
|
|
839
1561
|
[team plugin modes](https://cursor.com/changelog/05-01-26),
|
|
840
1562
|
[Team MCP distribution](https://cursor.com/changelog/team-marketplace-updates),
|
|
841
1563
|
[sandbox network controls](https://cursor.com/changelog/2-5), and
|
|
@@ -845,12 +1567,15 @@ hooks can differ. See the official
|
|
|
845
1567
|
|
|
846
1568
|
Register exactly `https://remembrance.dev/api/mcp` or the exact local
|
|
847
1569
|
`npx @remembrance-ai/mcp-server` command. Use the recommended organization
|
|
848
|
-
tool list above when the client supports tool filtering.
|
|
849
|
-
behavior for non-read-only calls unless unattended organization-private
|
|
850
|
-
contribution is explicitly approved. A client with no server/tool policy must
|
|
851
|
-
use its existing destination control or the zero-network handoff. Supply the
|
|
1570
|
+
tool list above when the client supports tool filtering. Supply the
|
|
852
1571
|
organization key through the client's secret/header mechanism, then run
|
|
853
1572
|
`run_connection_doctor` and require organization scope before private writes.
|
|
1573
|
+
Keep normal approval behavior for other non-read-only calls, and persist
|
|
1574
|
+
approval only for the four private submit and retry tools (on hosted MCP, the
|
|
1575
|
+
lesson submit), plus the local-only `capture_learning` on a local server that
|
|
1576
|
+
asks before it, as in the Highly Recommended step. A client with no
|
|
1577
|
+
server/tool policy must use its existing destination control or the
|
|
1578
|
+
zero-network handoff.
|
|
854
1579
|
|
|
855
1580
|
If any host still denies the export, that denial remains authoritative. The
|
|
856
1581
|
portable local handoff and dashboard import work identically for Codex, Claude
|
|
@@ -960,6 +1685,13 @@ not inherit shell exports:
|
|
|
960
1685
|
}
|
|
961
1686
|
~~~
|
|
962
1687
|
|
|
1688
|
+
A server you register yourself under the name `remembrance`, local or hosted,
|
|
1689
|
+
takes the standalone approval forms from "Highly Recommended: approve private
|
|
1690
|
+
submissions": `[mcp_servers.remembrance.tools.<tool>]` tables in Codex,
|
|
1691
|
+
`mcp__remembrance__<tool>` rules in Claude Code (for example after
|
|
1692
|
+
`claude mcp add`), and `remembrance:<tool>` entries in Cursor. A hosted server
|
|
1693
|
+
needs only `submit_private_lesson_candidate`.
|
|
1694
|
+
|
|
963
1695
|
## Skill-only install
|
|
964
1696
|
|
|
965
1697
|
For skills.sh-compatible runtimes (or any Agent Skills provider) that can load
|
|
@@ -1042,14 +1774,20 @@ session skills.
|
|
|
1042
1774
|
`capture_learning.lesson` followed by the exact returned action and a
|
|
1043
1775
|
private draft receipt. On hosted/legacy MCP, require a `failure_report`
|
|
1044
1776
|
through submit_remembrance. This validates both capability states without
|
|
1045
|
-
mixing their schemas.
|
|
1777
|
+
mixing their schemas. With an organization key and the Highly Recommended
|
|
1778
|
+
approval in place, neither the capture nor the private submission may
|
|
1779
|
+
prompt. A prompt for a submit or retry tool means its approval is missing or
|
|
1780
|
+
uses the wrong tool names; one for `capture_learning` means only that its
|
|
1781
|
+
local-only entry is missing, and is expected where the organization leaves
|
|
1782
|
+
the capture to Auto-review or a person, as managed Codex may.
|
|
1046
1783
|
12. If using an org key, list and invoke an org-only skill or private overlay
|
|
1047
1784
|
that should not appear anonymously.
|
|
1048
1785
|
13. With an organization submission key, submit one disposable redacted skill.
|
|
1049
1786
|
Current local MCP must use `capture_learning.private_skill` followed by
|
|
1050
1787
|
submit_private_skill_candidate; hosted/legacy MCP must use
|
|
1051
1788
|
propose_private_skill. Verify it appears only in that organization's review
|
|
1052
|
-
queue
|
|
1789
|
+
queue and, on local MCP with the approval in place, that it needed no host
|
|
1790
|
+
prompt. In a separate negative scenario, simulate a
|
|
1053
1791
|
host-policy denial and verify the plugin reports the fixed content-free alert
|
|
1054
1792
|
once, persists no blocked content, performs no retry, and creates no handoff.
|
|
1055
1793
|
Test queue_private_skill_import only as a separate administrator-requested
|
|
@@ -1109,6 +1847,27 @@ session skills.
|
|
|
1109
1847
|
--probe", and restart OpenClaw after plugin install/config changes.
|
|
1110
1848
|
- "Claude desktop ignores env vars": put env in the user-scoped Claude settings
|
|
1111
1849
|
that the desktop app reads, then fully quit and relaunch.
|
|
1850
|
+
- "Every private submission asks for approval" or "a headless run denies
|
|
1851
|
+
private submissions": report the blocked submission once as not submitted.
|
|
1852
|
+
Then ask the user (for managed settings, the administrator) to apply or fix
|
|
1853
|
+
the Highly Recommended approval; never change host settings or answer the
|
|
1854
|
+
host's approval yourself, and only after they confirm, send the retained
|
|
1855
|
+
draft through its exact submit or retry action.
|
|
1856
|
+
`inspect_private_learning_outbox` lists each draft with its `state`,
|
|
1857
|
+
`attempts`, and `next_retry_at`: a draft the host stopped before sending,
|
|
1858
|
+
a lesson still `awaiting_authorization` with 0 attempts or a skill still
|
|
1859
|
+
`ready`, needs its submit action, and a `retry_scheduled` draft its retry
|
|
1860
|
+
action once `next_retry_at` has passed. A prompt or denial naming a
|
|
1861
|
+
submit or retry tool means its approval is missing or names the wrong tools:
|
|
1862
|
+
a Claude Code plugin install needs
|
|
1863
|
+
`mcp__plugin_remembrance_remembrance__<tool>` rules, not
|
|
1864
|
+
`mcp__remembrance__<tool>`. One naming `capture_learning` means only that
|
|
1865
|
+
its local-only entry is missing, and is expected where the organization
|
|
1866
|
+
leaves the capture to Auto-review or a person, as managed Codex may: under
|
|
1867
|
+
managed Codex `writes`, approving `capture_learning` is an optional
|
|
1868
|
+
administrator decision (with it, Auto-review never sees the lesson content),
|
|
1869
|
+
not a fix to ask for. `run_connection_doctor` cannot see a persisted
|
|
1870
|
+
approval.
|
|
1112
1871
|
- "Host policy denied private repository export": this is not a Remembrance
|
|
1113
1872
|
API failure. An administrator must narrowly approve the Remembrance MCP
|
|
1114
1873
|
server, destination, and private contribution action. Otherwise use the
|