@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 +2 -2
- package/dist/bundle/{auto-U76QA2DW.js → auto-2TNLCAEM.js} +3 -3
- package/dist/bundle/{chunk-DHGQTARJ.js → chunk-DVHDIQBI.js} +1 -1
- package/dist/bundle/{chunk-VHYJIRK7.js → chunk-GSVNF5TX.js} +1 -1
- package/dist/bundle/{chunk-DZA5OWKD.js → chunk-HJTDA7AE.js} +1 -1
- package/dist/bundle/{chunk-UOJWRYVD.js → chunk-L2CXODLV.js} +1 -1
- package/dist/bundle/{chunk-QMY4EZ6B.js → chunk-M3TUIVRK.js} +1 -1
- package/dist/bundle/{chunk-RBCI432I.js → chunk-RS5WAI7D.js} +1 -1
- package/dist/bundle/{failure-NMC4BQ2P.js → failure-NBJBRA6G.js} +2 -2
- package/dist/bundle/memo.js +5 -5
- package/dist/bundle/{program-GVEBIXZL.js → program-EVPU3PMC.js} +7 -7
- package/dist/bundle/{server-DMU7GDV2.js → server-5XHYKDVY.js} +4 -4
- package/dist/bundle/{update-GLX3YE67.js → update-CVHXLX72.js} +2 -2
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +1 -1
- package/skills/mail-triage/SKILL.md +16 -37
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.
|
|
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-
|
|
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-
|
|
19
|
-
import "./chunk-
|
|
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-
|
|
59
|
+
import "./chunk-L2CXODLV.js";
|
|
60
60
|
import "./chunk-CID4MNRQ.js";
|
|
61
61
|
import "./chunk-AT5Y62SD.js";
|
|
62
62
|
import "./chunk-D72URWJE.js";
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
recognisable,
|
|
7
7
|
reportFailure,
|
|
8
8
|
throwParseFailures
|
|
9
|
-
} from "./chunk-
|
|
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-
|
|
48
|
+
import "./chunk-L2CXODLV.js";
|
|
49
49
|
import "./chunk-CID4MNRQ.js";
|
|
50
50
|
import "./chunk-AT5Y62SD.js";
|
|
51
51
|
import "./chunk-D72URWJE.js";
|
package/dist/bundle/memo.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
} from "./chunk-BPGYTJNB.js";
|
|
7
7
|
import {
|
|
8
8
|
APP
|
|
9
|
-
} from "./chunk-
|
|
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-
|
|
177
|
-
const { createProgram, refuseJoinedPath } = await import("./program-
|
|
178
|
-
const { autoNotice, followInstall } = await import("./auto-
|
|
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-
|
|
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-
|
|
9
|
+
} from "./chunk-DVHDIQBI.js";
|
|
10
10
|
import {
|
|
11
11
|
installer,
|
|
12
12
|
latest,
|
|
13
13
|
upgradeCommand
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-M3TUIVRK.js";
|
|
15
15
|
import {
|
|
16
16
|
mcpOwnerAllowed,
|
|
17
17
|
readOnlyAvailability,
|
|
18
18
|
refuseWritesUnderLock
|
|
19
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
9
|
+
} from "./chunk-HJTDA7AE.js";
|
|
10
10
|
import {
|
|
11
11
|
itemAnswer
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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.
|
|
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.
|
|
1
|
+
export const VERSION = "0.131.38";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
package/package.json
CHANGED
|
@@ -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.
|
|
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
|
|
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
|
|
37
|
-
|
|
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`
|
|
57
|
-
|
|
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
|
|
99
|
-
|
|
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
|
|
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
|
|
157
|
-
|
|
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
|
-
|
|
188
|
-
`
|
|
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
|
|
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
|
|
217
|
-
|
|
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
|