@wirecat/cli-memo 0.131.37 → 0.131.38

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/dist/bin/memo.js CHANGED
@@ -9,7 +9,7 @@ if (
9
9
  (words[0] === "--version" || words[0] === "-V") &&
10
10
  !Object.keys(process.env).some((key) => key.endsWith("_TEST_ARGV_LOG"))
11
11
  ) {
12
- process.stdout.write("0.131.37\n")
12
+ process.stdout.write("0.131.38\n")
13
13
  } else {
14
14
  // Before the bundle compiles: the bundle's own call comes after its chunks.
15
15
  module.enableCompileCache()
@@ -28,7 +28,7 @@ if (
28
28
  : next(specifier, context),
29
29
  })
30
30
  }
31
- const chunks = ["../bundle/all-profiles-W26PFZ2J.js","../bundle/anthropic-SY6QPTQW.js","../bundle/app-server-WUXDTYU4.js","../bundle/auto-U76QA2DW.js","../bundle/bun-O3KE32D7.js","../bundle/bun-sqlite-5X2NBSLA.js","../bundle/command-contract-FRRW2Z4S.js","../bundle/decode-RVPTVZ3W.js","../bundle/dispatch-MLRETSNQ.js","../bundle/dist-GZQWFMCL.js","../bundle/echarts-CW6DTALT.js","../bundle/embed-VXWYSZ7X.js","../bundle/embedder-QX3GSPBN.js","../bundle/entry-LBDVYMDG.js","../bundle/failure-NMC4BQ2P.js","../bundle/failure-UJBGB2GP.js","../bundle/first-run-VPR5YFMD.js","../bundle/first-screen-WRKQ4GAM.js","../bundle/instructions-2XLUHPQH.js","../bundle/mcp-RD54TNKO.js","../bundle/mcp-YMXA6IH6.js","../bundle/node-AQ7O3PGH.js","../bundle/node-P4E63KXA.js","../bundle/node-TLZSIHIJ.js","../bundle/node-sqlite-RKDBK624.js","../bundle/oauth-ZQCL2HPA.js","../bundle/open-ME6M3BWL.js","../bundle/openai-PHW5QKNC.js","../bundle/process-4HJLMEHS.js","../bundle/program-GVEBIXZL.js","../bundle/prompt-U5JMQJPC.js","../bundle/recognize-OYKFXOLL.js","../bundle/remote-IXABNXVH.js","../bundle/rerank-6ASLHI5I.js","../bundle/serve-ZYQO2Z23.js","../bundle/server-BMXFJO2T.js","../bundle/server-DMU7GDV2.js","../bundle/server-V7JU6YLA.js","../bundle/state-5W7BQVQO.js","../bundle/stdio-FRV4R7LJ.js","../bundle/store-6WW7XV2O.js","../bundle/store-maintenance-command-YPNP663U.js","../bundle/update-GLX3YE67.js"]
31
+ const chunks = ["../bundle/all-profiles-W26PFZ2J.js","../bundle/anthropic-SY6QPTQW.js","../bundle/app-server-WUXDTYU4.js","../bundle/auto-2TNLCAEM.js","../bundle/bun-O3KE32D7.js","../bundle/bun-sqlite-5X2NBSLA.js","../bundle/command-contract-FRRW2Z4S.js","../bundle/decode-RVPTVZ3W.js","../bundle/dispatch-MLRETSNQ.js","../bundle/dist-GZQWFMCL.js","../bundle/echarts-CW6DTALT.js","../bundle/embed-VXWYSZ7X.js","../bundle/embedder-QX3GSPBN.js","../bundle/entry-LBDVYMDG.js","../bundle/failure-NBJBRA6G.js","../bundle/failure-UJBGB2GP.js","../bundle/first-run-VPR5YFMD.js","../bundle/first-screen-WRKQ4GAM.js","../bundle/instructions-2XLUHPQH.js","../bundle/mcp-RD54TNKO.js","../bundle/mcp-YMXA6IH6.js","../bundle/node-AQ7O3PGH.js","../bundle/node-P4E63KXA.js","../bundle/node-TLZSIHIJ.js","../bundle/node-sqlite-RKDBK624.js","../bundle/oauth-ZQCL2HPA.js","../bundle/open-ME6M3BWL.js","../bundle/openai-PHW5QKNC.js","../bundle/process-4HJLMEHS.js","../bundle/program-EVPU3PMC.js","../bundle/prompt-U5JMQJPC.js","../bundle/recognize-OYKFXOLL.js","../bundle/remote-IXABNXVH.js","../bundle/rerank-6ASLHI5I.js","../bundle/serve-ZYQO2Z23.js","../bundle/server-5XHYKDVY.js","../bundle/server-BMXFJO2T.js","../bundle/server-V7JU6YLA.js","../bundle/state-5W7BQVQO.js","../bundle/stdio-FRV4R7LJ.js","../bundle/store-6WW7XV2O.js","../bundle/store-maintenance-command-YPNP663U.js","../bundle/update-CVHXLX72.js"]
32
32
  if (((words) => words
33
33
  .filter((word) => !word.startsWith("-"))
34
34
  .slice(0, 2)
@@ -15,8 +15,8 @@ import {
15
15
  recordAutoRun,
16
16
  serviceUnit,
17
17
  timerUnit
18
- } from "./chunk-DHGQTARJ.js";
19
- import "./chunk-VHYJIRK7.js";
18
+ } from "./chunk-DVHDIQBI.js";
19
+ import "./chunk-GSVNF5TX.js";
20
20
  import "./chunk-5ZKNRR6O.js";
21
21
  import "./chunk-QP3KNC5D.js";
22
22
  import "./chunk-AJ4SVCBD.js";
@@ -56,7 +56,7 @@ import "./chunk-CEOXSWU3.js";
56
56
  import "./chunk-4CD37FZU.js";
57
57
  import "./chunk-QTLYWZXB.js";
58
58
  import "./chunk-4CADISNA.js";
59
- import "./chunk-UOJWRYVD.js";
59
+ import "./chunk-L2CXODLV.js";
60
60
  import "./chunk-CID4MNRQ.js";
61
61
  import "./chunk-AT5Y62SD.js";
62
62
  import "./chunk-D72URWJE.js";
@@ -3,7 +3,7 @@ const require = __bundleRequire(import.meta.url);
3
3
  import {
4
4
  answers,
5
5
  itemAnswer
6
- } from "./chunk-VHYJIRK7.js";
6
+ } from "./chunk-GSVNF5TX.js";
7
7
  import {
8
8
  loadConfig,
9
9
  updateConfig
@@ -21,7 +21,7 @@ import {
21
21
  } from "./chunk-XCAGVFRC.js";
22
22
  import {
23
23
  STORE_CLIENT
24
- } from "./chunk-UOJWRYVD.js";
24
+ } from "./chunk-L2CXODLV.js";
25
25
  import {
26
26
  createRenderer
27
27
  } from "./chunk-2R2Z2VWL.js";
@@ -23,7 +23,7 @@ import {
23
23
  } from "./chunk-4NJQJZRO.js";
24
24
  import {
25
25
  APP
26
- } from "./chunk-UOJWRYVD.js";
26
+ } from "./chunk-L2CXODLV.js";
27
27
  import {
28
28
  CliError
29
29
  } from "./chunk-RZ54DSVU.js";
@@ -90,7 +90,7 @@ var REASONS = defineReasons([
90
90
  ]);
91
91
 
92
92
  // dist/version.js
93
- var VERSION = "0.131.37";
93
+ var VERSION = "0.131.38";
94
94
 
95
95
  // dist/app.js
96
96
  var APP = {
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  APP,
21
21
  VERSION
22
- } from "./chunk-UOJWRYVD.js";
22
+ } from "./chunk-L2CXODLV.js";
23
23
  import {
24
24
  installerOf
25
25
  } from "./chunk-CID4MNRQ.js";
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-BPGYTJNB.js";
16
16
  import {
17
17
  APP
18
- } from "./chunk-UOJWRYVD.js";
18
+ } from "./chunk-L2CXODLV.js";
19
19
  import {
20
20
  ValiError,
21
21
  errorObjectOf,
@@ -6,7 +6,7 @@ import {
6
6
  recognisable,
7
7
  reportFailure,
8
8
  throwParseFailures
9
- } from "./chunk-RBCI432I.js";
9
+ } from "./chunk-RS5WAI7D.js";
10
10
  import "./chunk-AJ4SVCBD.js";
11
11
  import "./chunk-43CMY3YD.js";
12
12
  import "./chunk-O762IE2F.js";
@@ -45,7 +45,7 @@ import "./chunk-4CD37FZU.js";
45
45
  import "./chunk-QTLYWZXB.js";
46
46
  import "./chunk-4CADISNA.js";
47
47
  import "./chunk-BPGYTJNB.js";
48
- import "./chunk-UOJWRYVD.js";
48
+ import "./chunk-L2CXODLV.js";
49
49
  import "./chunk-CID4MNRQ.js";
50
50
  import "./chunk-AT5Y62SD.js";
51
51
  import "./chunk-D72URWJE.js";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-BPGYTJNB.js";
7
7
  import {
8
8
  APP
9
- } from "./chunk-UOJWRYVD.js";
9
+ } from "./chunk-L2CXODLV.js";
10
10
  import {
11
11
  installerOf
12
12
  } from "./chunk-CID4MNRQ.js";
@@ -173,15 +173,15 @@ if (wcat.code !== void 0) {
173
173
  interactive: interactiveOf,
174
174
  reasons: APP.errors.reasons,
175
175
  run: /* @__PURE__ */ __name(async (entry) => {
176
- failure = await import("./failure-NMC4BQ2P.js");
177
- const { createProgram, refuseJoinedPath } = await import("./program-GVEBIXZL.js");
178
- const { autoNotice, followInstall } = await import("./auto-U76QA2DW.js");
176
+ failure = await import("./failure-NBJBRA6G.js");
177
+ const { createProgram, refuseJoinedPath } = await import("./program-EVPU3PMC.js");
178
+ const { autoNotice, followInstall } = await import("./auto-2TNLCAEM.js");
179
179
  if (entry.args[0] !== "jobs") {
180
180
  const notice2 = autoNotice(entry.env);
181
181
  if (notice2)
182
182
  processStreams.diagnostic(notice2);
183
183
  }
184
- const { updateNotice } = await import("./update-GLX3YE67.js");
184
+ const { updateNotice } = await import("./update-CVHXLX72.js");
185
185
  const notice = updateNotice(entry.args);
186
186
  program = createProgram({ signal: entry.signal });
187
187
  program.hook("preAction", (_root, command) => entry.atStart(command));
@@ -6,17 +6,17 @@ import {
6
6
  autoState,
7
7
  lastAutoRun,
8
8
  recordAutoRun
9
- } from "./chunk-DHGQTARJ.js";
9
+ } from "./chunk-DVHDIQBI.js";
10
10
  import {
11
11
  installer,
12
12
  latest,
13
13
  upgradeCommand
14
- } from "./chunk-QMY4EZ6B.js";
14
+ } from "./chunk-M3TUIVRK.js";
15
15
  import {
16
16
  mcpOwnerAllowed,
17
17
  readOnlyAvailability,
18
18
  refuseWritesUnderLock
19
- } from "./chunk-DZA5OWKD.js";
19
+ } from "./chunk-HJTDA7AE.js";
20
20
  import {
21
21
  answers,
22
22
  atDetail,
@@ -26,7 +26,7 @@ import {
26
26
  trackAnswers,
27
27
  wholeList,
28
28
  withStore
29
- } from "./chunk-VHYJIRK7.js";
29
+ } from "./chunk-GSVNF5TX.js";
30
30
  import {
31
31
  ATTACHMENT_CHARS,
32
32
  DIALECTS,
@@ -63,7 +63,7 @@ import "./chunk-CXWKBOKQ.js";
63
63
  import {
64
64
  errorObject,
65
65
  recognisable
66
- } from "./chunk-RBCI432I.js";
66
+ } from "./chunk-RS5WAI7D.js";
67
67
  import {
68
68
  DISCOVERY_DESCRIPTIONS,
69
69
  addContractInfo,
@@ -320,7 +320,7 @@ import {
320
320
  REASONS,
321
321
  STORE_CLIENT,
322
322
  VERSION
323
- } from "./chunk-UOJWRYVD.js";
323
+ } from "./chunk-L2CXODLV.js";
324
324
  import "./chunk-CID4MNRQ.js";
325
325
  import "./chunk-AT5Y62SD.js";
326
326
  import "./chunk-D72URWJE.js";
@@ -6482,7 +6482,7 @@ var mcpCommandDefinition = /* @__PURE__ */ __name((program, streams, env, create
6482
6482
  }).summary("serve this profile's commands to an AI agent").description("serve memo commands over MCP on stdio or authenticated HTTP, limited by saved permissions").option("--permission <key=level>", "tighten one saved permission for this server; repeat for more keys", (value, previous = []) => [...previous, value]).option("--http", "serve on 127.0.0.1 behind an HTTPS tunnel with an owner access-code login").option("--port <port>", `local HTTP port (default ${DEFAULT_PORT}); requires --http`).option("--public-url <url>", "tunnel's HTTPS address without /mcp, or a path of it such as https://<name>.ts.net/memo; requires --http").action(async (options) => {
6483
6483
  if (!options.http && (options.port !== void 0 || options.publicUrl !== void 0))
6484
6484
  throw new CliError("validation_error", "--port and --public-url require --http");
6485
- const { createMemoServer } = await import("./server-DMU7GDV2.js");
6485
+ const { createMemoServer } = await import("./server-5XHYKDVY.js");
6486
6486
  const build = /* @__PURE__ */ __name(() => createMemoServer(env, createProgram2, options.permission), "build");
6487
6487
  if (options.http) {
6488
6488
  const { httpLockFile, mcpUrlOf, portOf, publicUrlOf, serveOverHttp } = await import("./mcp-RD54TNKO.js");
@@ -6,10 +6,10 @@ import {
6
6
  memoLevels,
7
7
  readOnly,
8
8
  refuseUnknownPermissions
9
- } from "./chunk-DZA5OWKD.js";
9
+ } from "./chunk-HJTDA7AE.js";
10
10
  import {
11
11
  itemAnswer
12
- } from "./chunk-VHYJIRK7.js";
12
+ } from "./chunk-GSVNF5TX.js";
13
13
  import "./chunk-5ZKNRR6O.js";
14
14
  import "./chunk-QP3KNC5D.js";
15
15
  import "./chunk-75QQ7MLH.js";
@@ -17,7 +17,7 @@ import {
17
17
  errorObject,
18
18
  mcpFailure,
19
19
  throwParseFailures
20
- } from "./chunk-RBCI432I.js";
20
+ } from "./chunk-RS5WAI7D.js";
21
21
  import "./chunk-AJ4SVCBD.js";
22
22
  import "./chunk-43CMY3YD.js";
23
23
  import "./chunk-UUD4QHAN.js";
@@ -90,7 +90,7 @@ import {
90
90
  APP,
91
91
  STORE_CLIENT,
92
92
  VERSION
93
- } from "./chunk-UOJWRYVD.js";
93
+ } from "./chunk-L2CXODLV.js";
94
94
  import "./chunk-CID4MNRQ.js";
95
95
  import "./chunk-AT5Y62SD.js";
96
96
  import "./chunk-D72URWJE.js";
@@ -7,7 +7,7 @@ import {
7
7
  runUpdate,
8
8
  updateNotice,
9
9
  upgradeCommand
10
- } from "./chunk-QMY4EZ6B.js";
10
+ } from "./chunk-M3TUIVRK.js";
11
11
  import "./chunk-5ZKNRR6O.js";
12
12
  import "./chunk-QP3KNC5D.js";
13
13
  import "./chunk-AJ4SVCBD.js";
@@ -47,7 +47,7 @@ import "./chunk-CEOXSWU3.js";
47
47
  import "./chunk-4CD37FZU.js";
48
48
  import "./chunk-QTLYWZXB.js";
49
49
  import "./chunk-4CADISNA.js";
50
- import "./chunk-UOJWRYVD.js";
50
+ import "./chunk-L2CXODLV.js";
51
51
  import "./chunk-CID4MNRQ.js";
52
52
  import "./chunk-AT5Y62SD.js";
53
53
  import "./chunk-D72URWJE.js";
package/dist/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const VERSION = "0.131.37";
1
+ export declare const VERSION = "0.131.38";
2
2
  //# sourceMappingURL=version.d.ts.map
package/dist/version.js CHANGED
@@ -1,2 +1,2 @@
1
- export const VERSION = "0.131.37";
1
+ export const VERSION = "0.131.38";
2
2
  //# sourceMappingURL=version.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wirecat/cli-memo",
3
- "version": "0.131.37",
3
+ "version": "0.131.38",
4
4
  "description": "Context about people across messengers, notes and mail, from a local store",
5
5
  "mcpName": "dev.wirecat/cli-memo",
6
6
  "license": "Apache-2.0",
@@ -12,8 +12,7 @@ description: >-
12
12
  You run on a schedule with `Bash(memo:*)` under `MEMO_READ_ONLY`. memo lets you read, stage one findings batch per
13
13
  mailbox (`memo mail findings add`) and move your own mark (`memo messages acknowledge`). Your schedule names your
14
14
  holder (`--on-new-mail mail-triage`), and memo refuses to move any other mark. Everything else is refused, and that is
15
- intended. A run starts once enough mail waits (10 emails, or the oldest 30 minutes old, by default), so expect several
16
- emails per run.
15
+ intended. Expect several emails per run.
17
16
 
18
17
  ## Hard rules
19
18
 
@@ -29,13 +28,12 @@ emails per run.
29
28
  shorten, abbreviate, re-encode or retype a ref, not even its middle: a cut ref is refused or cites another email.
30
29
  - Every Bash call is one memo command and nothing else: it starts with `memo`, with no `cd`, `ls`, `cat` or `jq`,
31
30
  no variable set before it, nothing after it and no output sent to a file or another command. Anything more is
32
- refused before it runs, so work through mailboxes one call at a time. Replace every `<…>` placeholder below with
31
+ refused. Replace every `<…>` placeholder below with
33
32
  its value: the angle brackets never reach the command.
34
33
  - Read only through existing links (below). No broad search over all mail or all chats.
35
34
  - Stage first, acknowledge after. If staging fails, do not acknowledge: the next run reads the same mail again.
36
- - The mailbox itself belongs to the `mail` CLI, which this run cannot call: its sync, rules and cleanup are the
37
- owner's. When a sender should be skipped or kept as an envelope, put the command in the report for the owner, such
38
- as `mail <profile> rules add --domain <domain> --do envelope`; `mail session list` names the profile of an address.
35
+ - The mailbox's sync and rules are the owner's `mail` CLI, which you cannot call. When a sender should be skipped
36
+ or kept as an envelope, put the command in the report: `mail <profile> rules add --domain <domain> --do envelope`.
39
37
 
40
38
  ## One run
41
39
 
@@ -53,9 +51,8 @@ many). Other mail sent to many — orders, invoices, site forms and notification
53
51
  comes after the rest, with `email.bulk: true` and `email.excerpt_only: true`: its `text` is only the subject and the
54
52
  first lines. Each item is one email: `ref` (`msg:email/…`), `chat_id` (the thread), `sender_is_me`, `text`, and
55
53
  `email` with `fingerprint`, `from`, `new_sender`, `sender_identities`. `text` is the email's own text: quoted earlier
56
- mail and the signature are left out, and the fingerprint still covers the whole stored email. `next` holds two
57
- steps: `mail-findings.add`, whose `args.key` is the findings key of this review, and `mail-messages.acknowledge`,
58
- whose `args.cursor` is your cursor. Keep both exactly as given. A first run has no mark yet: no items, only the
54
+ mail and the signature are left out, and the fingerprint still covers the whole stored email. `next` gives your
55
+ `key` (step `mail-findings.add`) and `cursor` (step `mail-messages.acknowledge`). A first run has no mark yet: no items, only the
59
56
  cursor — go straight to step 6.
60
57
 
61
58
  No items: go to step 6 with the cursor.
@@ -95,12 +92,11 @@ inside double quotes runs. Put an address or name in single quotes, and only whe
95
92
  and `. _ + - @` alone; otherwise skip that read and say so in the report.
96
93
 
97
94
  - The thread: `memo messages show <ref> --before-n 3 --trimmed`.
98
- - The sender: `memo context 'email:<address>' --limit 5 --trimmed` — earlier mail from them, their facts and
99
- memories, and messages in Telegram, MAX and other tools reached through identity links the store already has.
95
+ - The sender: `memo context 'email:<address>' --limit 5 --trimmed` — their earlier mail, facts, memories and
96
+ messages in other tools.
100
97
  - A known person or project the email names: `memo context person:<id> --trimmed`, `memo tasks show <task>`.
101
98
 
102
- Always pass `--trimmed` to these reads: it keeps quoted earlier mail and signatures out of what you read. Do not
103
- search everything for a name. If the links do not reach it, it stays out of context.
99
+ Always pass `--trimmed`. Do not search everything for a name: what the links do not reach stays out.
104
100
 
105
101
  ### 4. Propose
106
102
 
@@ -153,24 +149,8 @@ plainly.
153
149
  date, such as "E-signature certificate 12-345 from <issuer>, expires 2027-03-01". `subject` is the organization
154
150
  or person it belongs to when linked.
155
151
 
156
- A finding takes only its kind's fields; any other field refuses it. `title` is a task's field alone: an invoice,
157
- payment, order or fact has none, and a fact has no `reason` either. Every kind takes `id`, `kind` and `evidence`:
158
-
159
- | kind | its other fields |
160
- |---|---|
161
- | `task` | `type`, `title`, `reason`, `commitment`, `project`, `due_at`, `due_evidence`, `assignee`, `assignee_evidence`, `external_id`, `source_url` |
162
- | `task_update` | `task`, `change`, `due_at`, `detail`, `reason` |
163
- | `fact` | `type`, `statement`, `subject`, `project` |
164
- | `memory` | `memory_kind`, `scope`, `body`, `subject`, `project` |
165
- | `link` | `from`, `to`, `reason` |
166
- | `new_contact` | `address`, `name`, `reason` |
167
- | `invoice` | `direction`, `counterparty`, `counterparty_name`, `counterparty_email`, `currency`, `lines`, `total`, `number`, `issue_date`, `due_date`, `project`, `reason` |
168
- | `payment` | `direction`, `payer`, `payer_name`, `payer_email`, `payee`, `payee_name`, `payee_email`, `amount`, `currency`, `date`, `reference`, `allocations`, `project`, `reason` |
169
- | `order` | `purpose`, `customer`, `customer_name`, `customer_email`, `supplier`, `supplier_name`, `number`, `total`, `currency`, `status`, `order_date`, `fulfilled_date`, `invoice`, `payment`, `project`, `source_url`, `reason` |
170
- | `order_update` | `supplier_name`, `number`, `status`, `date`, `reason` |
171
-
172
- A list command takes `field:value` terms, never a bare word: `memo invoices list number:FACT-2026-00012 --json`,
173
- `memo orders list number:<number> --json`. A bare word is refused (`query.bare-word`).
152
+ A finding takes only its kind's fields above, plus `id`, `kind`, `evidence`: no `title` on an invoice, payment,
153
+ order or fact, no `reason` on a fact. A list takes `field:value` terms, never a bare word: `number:FACT-2026-00012`.
174
154
 
175
155
  ### 5. New senders, among kept emails
176
156
 
@@ -184,9 +164,8 @@ For every email you kept in step 2 whose item has `new_sender: true`:
184
164
 
185
165
  ### 6. Check, stage once, then acknowledge
186
166
 
187
- The batch's key is the `args.key` of review's `mail-findings.add` step, such as `mail-triage:9123` or
188
- `mail-triage:9123-r1`: pass it as `--key`, copied exactly, and leave `key` out of the JSON. Never build a key from
189
- the cursor. Every finding cites 1–8 emails with the exact `ref` and `fingerprint` from step 1; at most 30 findings
167
+ Pass review's `key` as `--key`, exactly (`mail-triage:9123`, `mail-triage:9123-r1`); never build one, and leave
168
+ `key` out of the JSON. Every finding cites 1–8 emails with the exact `ref` and `fingerprint` from step 1; at most 30 findings
190
169
  and 5 per sender.
191
170
 
192
171
  A key takes one input only: once a batch is staged, nothing can be added to it. So build the whole batch for the
@@ -198,7 +177,7 @@ memo mail findings add '{"schema_version":1,"extractor":"mail-triage/1","finding
198
177
 
199
178
  The answer's `item.valid` says whether staging would take it; `item.problems` lists every finding that would be
200
179
  refused, with its `finding` id, `kind` and `message` (an unknown field names the fields that kind takes in
201
- `details.allowed`: keep only those). Fix every problem, or drop that finding, and check again. When `valid` is
180
+ `details.allowed`). Fix every problem, or drop that finding, and check again. When `valid` is
202
181
  true, stage the same JSON once, the same command without `--dry-run`.
203
182
 
204
183
  The whole JSON is the one argument between single quotes, on one line. A double quote inside a value is `\"`. A
@@ -213,8 +192,8 @@ memo messages acknowledge --holder mail-triage --cursor <cursor> --source email:
213
192
  ```
214
193
 
215
194
  A refused batch stages nothing. `mail-findings.stale` means an email changed since review: read that mailbox again
216
- from step 1. `mail-findings.key-used` means a batch with other input is already staged under this key — by this run, or
217
- by one that stopped before acknowledging: stage nothing more and say so in the report. Other refusals name the finding at fault: fix or drop it, check again and stage. If it
195
+ from step 1. `mail-findings.key-used` means a batch with other input is already staged under this key: stage nothing
196
+ more and say so in the report. Other refusals name the finding at fault: fix or drop it, check again and stage. If it
218
197
  still fails, leave the mark where it is and say so in the report.
219
198
 
220
199
  When the review's `meta.complete` was false, more mail waits past the cursor: after acknowledging, run step 1 again