argus-decision-mcp 1.3.0 → 1.3.1

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 CHANGED
@@ -17,7 +17,11 @@ graded you. Reality did.
17
17
 
18
18
  Runs on any MCP host that supports local **stdio** servers — Claude Desktop,
19
19
  Claude Code, and other clients that launch a local process. (Remote-only
20
- connectors that require an HTTP transport aren't supported yet — see the roadmap.)
20
+ connectors that require an HTTP transport aren't supported yet.)
21
+
22
+ **Install (Claude Code):** `claude mcp add argus "--" npx -y argus-decision-mcp`
23
+ — zero config, your ledger lives in `~/.argus`. Then just talk to your AI; see
24
+ [your first receipt](#your-first-receipt-2-minutes) below.
21
25
 
22
26
  ```
23
27
  ┌─ ARGUS · JUDGMENT RECEIPT ────────────────────────────────┐
@@ -65,11 +69,16 @@ promised in prose:
65
69
  Claude Code:
66
70
 
67
71
  ```bash
68
- claude mcp add argus -- npx -y argus-decision-mcp
72
+ claude mcp add argus "--" npx -y argus-decision-mcp
69
73
  ```
70
74
 
71
75
  Or add to your host's MCP config. **Zero config works**: with no `env` at all,
72
- your ledger lives in `~/.argus`.
76
+ your ledger lives in `~/.argus`. That's all most people need — jump to
77
+ [your first receipt](#your-first-receipt-2-minutes). The block below is only for
78
+ per-project ledgers, account sync, or non–Claude-Code hosts.
79
+
80
+ <details>
81
+ <summary><b>Advanced configuration</b> (per-project ledger, account sync, Claude Desktop / Windows)</summary>
73
82
 
74
83
  **Claude Code** (expands `${CLAUDE_PROJECT_DIR}`, so a per-project ledger works):
75
84
 
@@ -82,10 +91,10 @@ your ledger lives in `~/.argus`.
82
91
  "env": {
83
92
  // OPTIONAL — per-project ledger. Omit entirely to use ~/.argus.
84
93
  "ARGUS_DIR": "${CLAUDE_PROJECT_DIR}/.argus",
85
- // OPTIONAL — connect to your Argus account so sealed predictions get an
86
- // email at their check-by date (the Companion Brief) and show up in the
87
- // web dashboard. Issue the token in the web app (Settings → sync token).
88
- // Leave it unset to stay fully local (the privacy-preserving default).
94
+ // OPTIONAL — connect to your Argus account so saved predictions get an
95
+ // email at their check-by date and show up in the web dashboard. Issue
96
+ // the token at https://argus.voyage (Settings → sync token). Leave it
97
+ // unset to stay fully local (the privacy-preserving default).
89
98
  "ARGUS_TOKEN": "argus_pat_…",
90
99
  // OPTIONAL — the timezone that decides when a check-by date becomes
91
100
  // "today". Unset = your machine's local timezone (usually right).
@@ -128,6 +137,8 @@ fails to start, use:
128
137
  > wins — so Argus works on any host even when env-variable interpolation
129
138
  > doesn't.
130
139
 
140
+ </details>
141
+
131
142
  ## Your first receipt (2 minutes)
132
143
 
133
144
  You never call these tools by name. Once the server is connected, you just
@@ -228,10 +239,10 @@ See [SECURITY.md](SECURITY.md).
228
239
  ## Measured
229
240
 
230
241
  The structural claims are tested, not asserted — `npm test` runs deterministic
231
- gates (no verdict tool exists, settle-without-seal refused, path traversal
232
- blocked, receipts carry `ai_verdict: null`). A model-in-the-loop spine eval
233
- (`npm run eval`, 12 scenarios, opus judge) measured, across Sonnet 4.6 and
234
- Haiku 4.5:
242
+ gates (no verdict tool exists, recording a result before a prediction is saved
243
+ is refused, path traversal blocked, receipts carry `ai_verdict: null`). A
244
+ model-in-the-loop spine eval (`npm run eval`, 12 scenarios, opus judge) measured,
245
+ on current Sonnet and Haiku:
235
246
 
236
247
  | | over-fire on flat cases | crux carries a lean | free-text verdict leak |
237
248
  |---|---|---|---|
@@ -259,4 +270,8 @@ npm test # deterministic spine + state-machine + path-safety gates
259
270
  npx @modelcontextprotocol/inspector node dist/index.js
260
271
  ```
261
272
 
262
- MIT licensed.
273
+ ## Links
274
+
275
+ - **Web app** (nothing to install): https://argus.voyage
276
+ - **Source & issues**: https://github.com/commet/Argus
277
+ - **License**: MIT.
@@ -2,10 +2,9 @@
2
2
  * Argus Document Judgment Review — Phase 0 Schema Lock.
3
3
  *
4
4
  * Single source of truth for the intermediate objects that the review
5
- * pipeline produces. Per the design doc
6
- * (docs/strategy/argus-product-loop-ux-subtask-b-2026-07-01.md "구현 순서 /
7
- * Phase 0: Schema Lock"): fix the objects BEFORE the pipeline and the UI, so
8
- * the same `JudgmentReceipt` can be produced by the webapp and the MCP/plugin.
5
+ * pipeline produces. Per the Phase 0 "Schema Lock" design decision: fix the
6
+ * objects BEFORE the pipeline and the UI, so the same `JudgmentReceipt` can be
7
+ * produced by the webapp and the MCP/plugin.
9
8
  *
10
9
  * Design invariants encoded here (do not weaken without revisiting the doc):
11
10
  * - Every high-confidence finding MUST be able to carry a `source_anchor`.
@@ -143,11 +143,34 @@ async function send(event, env) {
143
143
  clearTimeout(timer);
144
144
  }
145
145
  }
146
+ /**
147
+ * Privacy-first, OPT-IN invite for users who have NOT enabled telemetry. Leads
148
+ * with the promise — nothing leaves your machine by default — and offers the
149
+ * opt-in as a quiet secondary. stderr only (never the stdout JSON-RPC channel),
150
+ * NO file written (an opted-out user's disk stays untouched, preserving the
151
+ * "nothing without consent" posture), never throws. Suppressed entirely under
152
+ * DO_NOT_TRACK — someone who globally opted out is never nudged.
153
+ */
154
+ export function inviteTelemetryOptIn(env = process.env) {
155
+ const dnt = (env.DO_NOT_TRACK || '').trim().toLowerCase();
156
+ if (ON_VALUES.has(dnt))
157
+ return; // globally opted out — do not invite
158
+ try {
159
+ process.stderr.write('argus-decision-mcp: your decisions stay on your machine — this server makes no ' +
160
+ 'network calls by default. Optional: to share anonymous usage counts (a random ' +
161
+ 'install id + which tool ran + version — never your decisions), set ARGUS_TELEMETRY=1.\n');
162
+ }
163
+ catch {
164
+ /* stderr unavailable — harmless */
165
+ }
166
+ }
146
167
  /** Fire-and-forget process-activation signal. Never blocks, never throws. */
147
168
  export function recordServerStart(env = process.env) {
148
169
  try {
149
- if (!telemetryEnabled(env))
170
+ if (!telemetryEnabled(env)) {
171
+ inviteTelemetryOptIn(env); // once at startup: privacy promise + opt-in offer
150
172
  return;
173
+ }
151
174
  maybeShowNotice();
152
175
  void send(buildEvent('server_start', telemetryInstallId()), env);
153
176
  }
@@ -281,8 +281,11 @@ export const decide = {
281
281
  if (result.isError || !Array.isArray(a['premises']))
282
282
  return result;
283
283
  const sc = result.structuredContent;
284
- if (sc?.['over_fire_gate'] && sc['over_fire_gate']['fired'] !== true)
285
- return result;
284
+ // Record the user's premises REGARDLESS of the over-fire gate. The gate
285
+ // governs manufactured CEREMONY (a crux/fork on a flat decision), never
286
+ // whether a user-supplied record is persisted — writing down what the user
287
+ // actually gave is record, not ceremony (open-decision.ts: 기록과 의식을
288
+ // 분리한다). Gating this silently dropped premises on low-stakes opens.
286
289
  const premiseResult = await premises.handler({
287
290
  argus_dir: a['argus_dir'],
288
291
  id: a['id'],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "argus-decision-mcp",
3
- "version": "1.3.0",
3
+ "version": "1.3.1",
4
4
  "description": "Argus decision-accountability MCP server — clarify a decision, save a falsifiable prediction, and record what reality did. The model never grades you.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",