@rvry/mcp 0.7.2 → 0.8.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
@@ -19,50 +19,50 @@ Supported clients: **Claude Code**, **Claude Desktop**, **Cursor**, **Gemini CLI
19
19
 
20
20
  Restart any running clients after setup, and RVRY is ready.
21
21
 
22
- ### Options
22
+ ### Manual Configuration
23
23
 
24
- ```bash
25
- npx @rvry/mcp setup --token rvry_abc123 # Skip browser auth, use token directly
26
- npx @rvry/mcp setup --client code # Only configure Claude Code
27
- npx @rvry/mcp setup --client desktop # Only configure Claude Desktop
28
- npx @rvry/mcp setup --accept-terms # Accept ToS non-interactively
29
- ```
30
-
31
- ### Manual Installation
32
-
33
- **Claude Code:**
34
- ```bash
35
- claude mcp add -e RVRY_TOKEN=rvry_your_token -s user rvry -- npx @rvry/mcp
36
- ```
24
+ For any MCP client that supports **stdio transport** (runs a local process), add this to your MCP config:
37
25
 
38
- **Claude Desktop** (`claude_desktop_config.json`):
39
26
  ```json
40
27
  {
41
- "mcpServers": {
42
- "RVRY": {
43
- "command": "npx",
44
- "args": ["@rvry/mcp"],
45
- "env": {
46
- "RVRY_TOKEN": "rvry_your_token_here"
47
- }
28
+ "rvry": {
29
+ "command": "npx",
30
+ "args": ["@rvry/mcp"],
31
+ "env": {
32
+ "RVRY_TOKEN": "your_rvry_token"
48
33
  }
49
34
  }
50
35
  }
51
36
  ```
52
37
 
53
- Config file locations:
54
- - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
55
- - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
56
- - Linux: `~/.config/Claude/claude_desktop_config.json`
38
+ Get your token at [rvry.ai/dashboard](https://rvry.ai/dashboard) after signing up.
39
+
40
+ ### HTTP Transport (Web-Based Clients)
41
+
42
+ For clients that connect via HTTP URL (ChatGPT, Perplexity, etc.):
43
+
44
+ **MCP Server URL:** `https://engine.rvry.ai/mcp`
45
+
46
+ Authentication uses Supabase OAuth 2.1. Configure your client's OAuth settings to use your Supabase project credentials, or pass a Bearer token directly.
47
+
48
+ ### Compatibility
57
49
 
58
- **Other MCP clients:**
50
+ RVRY supports both **stdio** and **HTTP** transports:
59
51
 
60
- Any client that supports MCP can use RVRY. Point it at `npx @rvry/mcp` with the environment variable `RVRY_TOKEN` set to your token.
52
+ | Transport | Client | Setup |
53
+ |-----------|--------|-------|
54
+ | stdio | Claude Code, Claude Desktop, Cursor, Gemini CLI, Codex, Anti-Gravity | `npx @rvry/mcp setup` |
55
+ | stdio | Any client with `command` + `args` config | Manual JSON config (see above) |
56
+ | HTTP | ChatGPT (custom GPTs), Perplexity, any HTTP MCP client | URL: `https://engine.rvry.ai/mcp` |
61
57
 
62
58
  ## Tools
63
59
 
64
- * **`RVRY_deepthink`** Extended analysis that catches assumptions, tests them, and doesn't let your AI wrap up until it's dealt with what it found.
65
- * **`RVRY_problem_solve`** — Structured decision-making that forces your AI through orientation, anticipation, and evaluation before it commits to a recommendation.
60
+ | Tool | What it does | Tier |
61
+ |------|-------------|------|
62
+ | **`RVRY_deepthink`** | Extended multi-round analysis. Catches assumptions, tests them, and doesn't let your AI wrap up until it's dealt with what it found. | All |
63
+ | **`RVRY_problem_solve`** | Structured decision-making. Forces orientation, anticipation, and evaluation before committing to a recommendation. | Pro+ |
64
+ | **`RVRY_challenge`** | Adversarial stress-testing. Finds weaknesses, tests assumptions, and surfaces failure modes in a proposal before you commit. | Pro+ |
65
+ | **`RVRY_meta`** | Sustained metacognitive observation. Examines how your AI is thinking, not just what it's thinking. | Max |
66
66
 
67
67
  ## How it Works
68
68
 
@@ -76,10 +76,10 @@ On hard questions, a smaller model with RVRY outperforms a bigger model without
76
76
 
77
77
  ## Pricing
78
78
 
79
- | Plan | Runs | Price |
80
- |------|------|-------|
81
- | Free | 5/month | $0 |
82
- | Pro | 25/month | $20/mo |
83
- | Max | Unlimited | $100/mo |
79
+ | Plan | Sessions | Tools | Price |
80
+ |------|----------|-------|-------|
81
+ | Free | 5/month | deepthink | $0 |
82
+ | Pro | 21/month | deepthink, problem_solve, challenge | $20/mo |
83
+ | Max | Unlimited | All tools including meta | $99/mo |
84
84
 
85
85
  Sign up at [rvry.ai](https://rvry.ai).
package/dist/client.d.ts CHANGED
@@ -13,7 +13,7 @@ export interface ScopingQuestion {
13
13
  }
14
14
  export interface ThinkResponse {
15
15
  sessionId: string;
16
- status: 'scoping' | 'active' | 'complete';
16
+ status: 'scoping' | 'orient' | 'active' | 'complete';
17
17
  round: number;
18
18
  prompt: string;
19
19
  instruction: string;
@@ -32,10 +32,11 @@ export interface ThinkResponse {
32
32
  question: string;
33
33
  rationale: string;
34
34
  }>;
35
+ constraintTrace?: unknown[];
35
36
  };
36
37
  }
37
38
  /**
38
39
  * Call the RVRY engine /api/v1/think endpoint with a specific tool.
39
40
  * Start a new session by omitting sessionId, or continue by providing one.
40
41
  */
41
- export declare function callTool(tool: RvryTool, input: string, token: string, sessionId?: string, skipScoping?: boolean): Promise<ThinkResponse>;
42
+ export declare function callTool(tool: RvryTool, input: string, token: string, sessionId?: string, skipScoping?: boolean, userConstraints?: string[]): Promise<ThinkResponse>;
package/dist/client.js CHANGED
@@ -7,7 +7,7 @@ const DEFAULT_ENGINE_URL = 'https://engine.rvry.ai';
7
7
  * Call the RVRY engine /api/v1/think endpoint with a specific tool.
8
8
  * Start a new session by omitting sessionId, or continue by providing one.
9
9
  */
10
- export async function callTool(tool, input, token, sessionId, skipScoping) {
10
+ export async function callTool(tool, input, token, sessionId, skipScoping, userConstraints) {
11
11
  const baseUrl = process.env.RVRY_ENGINE_URL ?? DEFAULT_ENGINE_URL;
12
12
  const body = { input, tool };
13
13
  if (sessionId) {
@@ -16,6 +16,9 @@ export async function callTool(tool, input, token, sessionId, skipScoping) {
16
16
  if (skipScoping) {
17
17
  body.skipScoping = true;
18
18
  }
19
+ if (userConstraints && userConstraints.length > 0) {
20
+ body.userConstraints = userConstraints;
21
+ }
19
22
  const res = await fetch(`${baseUrl}/api/v1/think`, {
20
23
  method: 'POST',
21
24
  headers: {
package/dist/index.js CHANGED
@@ -40,8 +40,12 @@ const TOOL_DEFS = [
40
40
  {
41
41
  name: 'RVRY_deepthink',
42
42
  description: 'Deep, multi-round structured analysis for high-stakes or complex questions. ' +
43
- 'Runs 5-7 rounds with rigorous self-checks and pre-mortem analysis. ' +
44
- 'Use when the question demands thorough examination from multiple angles before reaching a conclusion. ' +
43
+ 'Runs 5-7 rounds of rigorous analysis with self-checks and adversarial stress-testing. ' +
44
+ 'The first response orients you on the question follow the instruction field to orient, then call again. ' +
45
+ 'Each subsequent round returns a prompt (work through it internally) and an instruction (follow it). ' +
46
+ 'Show the user only a brief status line per round (e.g. \'Round 3 — stress-testing the position\'). ' +
47
+ 'Do not display the prompt text, internal tracking data, or quality assessments to the user. ' +
48
+ 'On completion, present key findings with bold headings. Lead with insights, not process. ' +
45
49
  'Call with your question to start, then send your analysis with the returned sessionId to continue.',
46
50
  inputSchema: {
47
51
  type: 'object',
@@ -58,14 +62,24 @@ const TOOL_DEFS = [
58
62
  type: 'boolean',
59
63
  description: 'Skip the scoping questions phase and begin analysis immediately.',
60
64
  },
65
+ userConstraints: {
66
+ type: 'array',
67
+ items: { type: 'string' },
68
+ description: 'User-stated directives or requirements to track throughout the session.',
69
+ },
61
70
  },
62
71
  required: ['input'],
63
72
  },
64
73
  },
65
74
  {
66
75
  name: 'RVRY_problem_solve',
67
- description: 'Structured decision-making: Orient, Anticipate, Generate, Evaluate, and Commit. ' +
68
- 'Use when you need to choose between options. Produces a recommendation with clear safeguards. ' +
76
+ description: 'Structured decision-making that forces thorough evaluation before commitment. ' +
77
+ 'Runs 5-8 rounds through orient, anticipate, generate, evaluate, and commit phases. ' +
78
+ 'The first response orients you — follow the instruction field, then call again. ' +
79
+ 'Each round returns a prompt and instruction. Work through the prompt internally. ' +
80
+ 'Show the user only a brief status line per round (e.g. \'Round 2 — mapping failure modes\'). ' +
81
+ 'Do not display the prompt text, internal tracking data, or quality assessments to the user. ' +
82
+ 'On completion, present the recommendation with confidence, stress test results, and safeguards. ' +
69
83
  'Call with your problem to start, then send your analysis with the returned sessionId to continue.',
70
84
  inputSchema: {
71
85
  type: 'object',
@@ -82,15 +96,23 @@ const TOOL_DEFS = [
82
96
  type: 'boolean',
83
97
  description: 'Skip the scoping questions phase and begin analysis immediately.',
84
98
  },
99
+ userConstraints: {
100
+ type: 'array',
101
+ items: { type: 'string' },
102
+ description: 'User-stated directives or requirements to track throughout the session.',
103
+ },
85
104
  },
86
105
  required: ['input'],
87
106
  },
88
107
  },
89
108
  {
90
109
  name: 'RVRY_think',
91
- description: 'Structured analysis for questions that need more depth than a quick answer. ' +
92
- 'Runs 2-4 rounds with constraint tracking. ' +
93
- 'Use for questions where you need to examine assumptions and consider alternatives. ' +
110
+ description: 'Structured analysis for questions needing more depth than a quick answer. ' +
111
+ 'Runs 2-4 rounds with tracking to ensure assumptions are examined. ' +
112
+ 'The first response orients you follow the instruction field, then call again. ' +
113
+ 'Each round returns a prompt and instruction. Work through the prompt internally. ' +
114
+ 'Show the user only a brief status line per round. Do not display internal data. ' +
115
+ 'On completion, present findings clearly with bold headings. ' +
94
116
  'Call with your question to start, then send your analysis with the returned sessionId to continue.',
95
117
  inputSchema: {
96
118
  type: 'object',
@@ -107,16 +129,23 @@ const TOOL_DEFS = [
107
129
  type: 'boolean',
108
130
  description: 'Skip the scoping questions phase and begin analysis immediately.',
109
131
  },
132
+ userConstraints: {
133
+ type: 'array',
134
+ items: { type: 'string' },
135
+ description: 'User-stated directives or requirements to track throughout the session.',
136
+ },
110
137
  },
111
138
  required: ['input'],
112
139
  },
113
140
  },
114
141
  {
115
142
  name: 'RVRY_challenge',
116
- description: 'Adversarial analysis that stress-tests a proposal or idea. ' +
117
- 'Identifies weaknesses, tests assumptions, and surfaces failure modes. ' +
118
- 'Runs 4-6 rounds with strict gates. ' +
119
- 'Use when you need to find what\'s wrong with an idea before committing. ' +
143
+ description: 'Adversarial analysis that stress-tests a proposal or idea before commitment. ' +
144
+ 'Runs 4-6 rounds identifying weaknesses, testing assumptions, and surfacing failure modes. ' +
145
+ 'The first response orients you — follow the instruction field, then call again. ' +
146
+ 'Each round returns a prompt and instruction. Work through the prompt internally. ' +
147
+ 'Show the user only a brief status line per round. Do not display internal data. ' +
148
+ 'On completion, present a verdict (GO / CONDITIONAL GO / NO GO) with evidence. ' +
120
149
  'Call with your proposal to start, then send your analysis with the returned sessionId to continue.',
121
150
  inputSchema: {
122
151
  type: 'object',
@@ -133,17 +162,23 @@ const TOOL_DEFS = [
133
162
  type: 'boolean',
134
163
  description: 'Skip the scoping questions phase and begin analysis immediately.',
135
164
  },
165
+ userConstraints: {
166
+ type: 'array',
167
+ items: { type: 'string' },
168
+ description: 'User-stated directives or requirements to track throughout the session.',
169
+ },
136
170
  },
137
171
  required: ['input'],
138
172
  },
139
173
  },
140
174
  {
141
175
  name: 'RVRY_meta',
142
- description: 'Sustained metacognitive observation. ' +
143
- 'Examines reasoning defaults, surfaces trained reflexes, and tracks what shifts under observation. ' +
144
- 'Runs 3 rounds: observe, deepen, synthesize. ' +
145
- 'Use when you want to examine how you\'re thinking, not just what you\'re thinking. ' +
146
- 'Max tier only. ' +
176
+ description: 'Sustained metacognitive observation of reasoning defaults and trained reflexes. ' +
177
+ 'Runs 3 rounds: observe, deepen, synthesize. Max tier only. ' +
178
+ 'The first response sets the observation frame — follow the instruction field, then call again. ' +
179
+ 'Each round returns a prompt. Reflect honestly, then call again with your reflection. ' +
180
+ 'Show the user only a brief status note per round. Do not display internal prompts. ' +
181
+ 'On completion, present a cohesive narrative reflection — not a structured report. ' +
147
182
  'Call with your topic to start, then send your reflection with the returned sessionId to continue.',
148
183
  inputSchema: {
149
184
  type: 'object',
@@ -176,8 +211,12 @@ function stripResponse(result, question) {
176
211
  stripped.prompt = result.prompt;
177
212
  stripped.instruction = result.instruction;
178
213
  }
214
+ if (result.status === 'orient') {
215
+ stripped.instruction = result.instruction;
216
+ }
179
217
  if (result.status === 'complete' && result.harvest) {
180
- stripped.harvest = result.harvest;
218
+ const { constraintTrace, ...harvestSafe } = result.harvest;
219
+ stripped.harvest = harvestSafe;
181
220
  }
182
221
  if (result.usage) {
183
222
  const { used, limit } = result.usage;
@@ -223,6 +262,9 @@ async function main() {
223
262
  }
224
263
  const sessionId = typeof typedArgs?.sessionId === 'string' ? typedArgs.sessionId : undefined;
225
264
  const skipScoping = typedArgs?.skipScoping === true;
265
+ const userConstraints = Array.isArray(typedArgs?.userConstraints)
266
+ ? typedArgs.userConstraints.filter(s => typeof s === 'string')
267
+ : undefined;
226
268
  // Cache question on first call (no sessionId = new session)
227
269
  // On continuation calls, read from cache
228
270
  let question = input;
@@ -233,7 +275,7 @@ async function main() {
233
275
  question = questionCache.get(sessionId) ?? input;
234
276
  }
235
277
  try {
236
- const result = await callTool(rvryTool, input, token, sessionId, skipScoping || undefined);
278
+ const result = await callTool(rvryTool, input, token, sessionId, skipScoping || undefined, userConstraints);
237
279
  // Cache question on first call (now we have the sessionId)
238
280
  if (!sessionId) {
239
281
  questionCache.set(result.sessionId, input);
package/dist/setup.js CHANGED
@@ -20,10 +20,6 @@ import { fetch } from './fetch.js';
20
20
  const require = createRequire(import.meta.url);
21
21
  const PKG_VERSION = require('../package.json').version;
22
22
  const ENGINE_URL = 'https://engine.rvry.ai';
23
- const COMMAND_FILES = [
24
- 'deepthink.md',
25
- 'problem-solve.md',
26
- ];
27
23
  const TOKEN_REGEX = /^rvry_[0-9a-f]{32,}$/;
28
24
  /** Polling interval for device auth: 3 seconds */
29
25
  const POLL_INTERVAL_MS = 3000;
@@ -36,47 +32,6 @@ const RVRY_SERVER_ENTRY = (token) => ({
36
32
  env: { RVRY_TOKEN: token },
37
33
  });
38
34
  // ── Utility functions ──────────────────────────────────────────────
39
- /**
40
- * Find the commands directory shipped with this package.
41
- * Walks up from this file's directory to find the commands/ folder.
42
- */
43
- function findCommandsDir() {
44
- let dir = dirname(new URL(import.meta.url).pathname);
45
- for (let i = 0; i < 5; i++) {
46
- const candidate = join(dir, 'commands');
47
- if (existsSync(candidate)) {
48
- return candidate;
49
- }
50
- dir = dirname(dir);
51
- }
52
- throw new Error('Could not find commands/ directory in @rvry/mcp package.');
53
- }
54
- /**
55
- * Find or create the .claude/commands/ directory.
56
- * Walks up from cwd looking for an existing .claude/ directory.
57
- * If not found, creates .claude/commands/ in cwd.
58
- */
59
- function findOrCreateTargetDir() {
60
- const cwd = process.cwd();
61
- let dir = cwd;
62
- for (let i = 0; i < 10; i++) {
63
- const claudeDir = join(dir, '.claude');
64
- if (existsSync(claudeDir)) {
65
- const commandsDir = join(claudeDir, 'commands');
66
- if (!existsSync(commandsDir)) {
67
- mkdirSync(commandsDir, { recursive: true });
68
- }
69
- return commandsDir;
70
- }
71
- const parent = dirname(dir);
72
- if (parent === dir)
73
- break;
74
- dir = parent;
75
- }
76
- const commandsDir = join(cwd, '.claude', 'commands');
77
- mkdirSync(commandsDir, { recursive: true });
78
- return commandsDir;
79
- }
80
35
  /**
81
36
  * Create a readline interface for prompting.
82
37
  */
@@ -726,31 +681,6 @@ async function getToken() {
726
681
  return token;
727
682
  }
728
683
  }
729
- // ── Slash command installation ─────────────────────────────────────
730
- async function installCommands() {
731
- const sourceDir = findCommandsDir();
732
- const targetDir = findOrCreateTargetDir();
733
- let installed = 0;
734
- for (const filename of COMMAND_FILES) {
735
- const sourcePath = join(sourceDir, filename);
736
- const targetPath = join(targetDir, filename);
737
- if (!existsSync(sourcePath)) {
738
- continue;
739
- }
740
- if (existsSync(targetPath)) {
741
- const rl = createRL();
742
- const answer = await ask(rl, ` ${filename} already exists. Overwrite? [y/N] `);
743
- rl.close();
744
- if (answer.toLowerCase() !== 'y') {
745
- continue;
746
- }
747
- }
748
- const content = readFileSync(sourcePath, 'utf-8');
749
- writeFileSync(targetPath, content, 'utf-8');
750
- installed++;
751
- }
752
- return installed;
753
- }
754
684
  // ── Gitignore protection ───────────────────────────────────────────
755
685
  /**
756
686
  * Ensure .rvry/ is in the project's .gitignore to prevent
@@ -798,7 +728,7 @@ export async function runSetup() {
798
728
  const clientFilter = clientFlagIndex !== -1 ? process.argv[clientFlagIndex + 1] : null;
799
729
  const acceptTerms = process.argv.includes('--accept-terms');
800
730
  // ── Step 1: Terms of Service ────────────────────────────────────
801
- console.log('[1/6] Terms of Service');
731
+ console.log('[1/5] Terms of Service');
802
732
  console.log('');
803
733
  console.log(' By continuing, you agree to the RVRY Terms of Service');
804
734
  console.log(' and Privacy Policy:');
@@ -831,11 +761,11 @@ export async function runSetup() {
831
761
  process.exit(1);
832
762
  }
833
763
  token = flagValue;
834
- console.log('[2/6] Authentication (from --token flag)');
764
+ console.log('[2/5] Authentication (from --token flag)');
835
765
  console.log(` Token: ${maskToken(token)}`);
836
766
  }
837
767
  else {
838
- console.log('[2/6] Authentication');
768
+ console.log('[2/5] Authentication');
839
769
  console.log(' Opening browser for sign-in...');
840
770
  const result = await deviceAuthFlow();
841
771
  if (result) {
@@ -869,7 +799,7 @@ export async function runSetup() {
869
799
  }
870
800
  console.log('');
871
801
  // ── Step 2: Detect clients ──────────────────────────────────────
872
- console.log('[3/6] Detecting clients');
802
+ console.log('[3/5] Detecting clients');
873
803
  // Filter registry if --client was passed
874
804
  const clients = clientFilter
875
805
  ? CLIENT_REGISTRY.filter((c) => c.id === clientFilter)
@@ -889,7 +819,7 @@ export async function runSetup() {
889
819
  }
890
820
  console.log('');
891
821
  // ── Step 3: Configure clients ───────────────────────────────────
892
- console.log('[4/6] Select apps to add RVRY MCP configuration');
822
+ console.log('[4/5] Select apps to add RVRY MCP configuration');
893
823
  console.log(' Use \x1b[1m↑↓\x1b[0m to navigate, \x1b[1mspace\x1b[0m to toggle, \x1b[1ma\x1b[0m to toggle all, \x1b[1menter\x1b[0m to confirm');
894
824
  console.log('');
895
825
  const pickerItems = detected.map((d) => ({
@@ -946,18 +876,8 @@ export async function runSetup() {
946
876
  console.log(` RVRY_TOKEN = "${token}"`);
947
877
  }
948
878
  console.log('');
949
- // ── Step 4: Slash commands ──────────────────────────────────────
950
- console.log('[5/6] Slash Commands');
951
- const commandCount = await installCommands();
952
- if (commandCount > 0) {
953
- console.log(` Installed ${commandCount} command${commandCount > 1 ? 's' : ''} to .claude/commands/`);
954
- }
955
- else {
956
- console.log(' No new commands installed (already up to date).');
957
- }
958
- console.log('');
959
- // ── Step 5: Gitignore protection ────────────────────────────────
960
- console.log('[6/6] Gitignore');
879
+ // ── Step 4: Gitignore protection ────────────────────────────────
880
+ console.log('[5/5] Gitignore');
961
881
  ensureGitignore();
962
882
  console.log('');
963
883
  // ── Summary ─────────────────────────────────────────────────────
@@ -970,7 +890,6 @@ export async function runSetup() {
970
890
  const pad = ' '.repeat(Math.max(1, 16 - c.name.length));
971
891
  console.log(` ${c.name}:${pad}${c.status}`);
972
892
  }
973
- console.log(` Commands: ${commandCount} installed`);
974
893
  console.log('');
975
894
  // Client-specific next steps
976
895
  const configuredNames = new Set(configuredClients.map((c) => c.name));
@@ -984,9 +903,14 @@ export async function runSetup() {
984
903
  console.log(` ${step}. Restart desktop apps for the new MCP server to load`);
985
904
  step++;
986
905
  }
987
- // Generic MCP config for any client
988
- console.log(` ${step}. Add RVRY to any other MCP-compatible client —`);
989
- console.log(' add this to your MCP config:');
906
+ // HTTP transport for web-based clients
907
+ console.log(` ${step}. For web-based MCP clients (ChatGPT, Perplexity, etc.):`);
908
+ console.log(' MCP Server URL: https://engine.rvry.ai/mcp');
909
+ console.log(' Auth: Supabase OAuth 2.1 (Bearer token)');
910
+ console.log('');
911
+ step++;
912
+ // Generic stdio MCP config for any other client
913
+ console.log(` ${step}. For other local MCP clients — add to your MCP config:`);
990
914
  console.log('');
991
915
  const mcpBlock = { rvry: RVRY_SERVER_ENTRY('YOUR_RVRY_TOKEN') };
992
916
  const lines = JSON.stringify(mcpBlock, null, 2).split('\n');
@@ -995,19 +919,12 @@ export async function runSetup() {
995
919
  }
996
920
  console.log('');
997
921
  step++;
998
- if (hasCodeStyle) {
999
- console.log(` ${step}. In Claude Code, try:`);
1000
- console.log(' /deepthink "your question"');
1001
- console.log(' /problem-solve "your decision"');
1002
- step++;
1003
- }
1004
- if (hasDesktopStyle) {
1005
- console.log(` ${step}. In desktop clients, use natural language:`);
1006
- console.log(' "Use deepthink to analyze..." or "Use problem-solve for..."');
922
+ if (hasCodeStyle || hasDesktopStyle) {
923
+ console.log(` ${step}. Try: "Use RVRY_deepthink to analyze..." or "Use RVRY_problem_solve for..."`);
1007
924
  step++;
1008
925
  }
1009
926
  if (!anyConfigured) {
1010
927
  console.log(' 1. Configure a client using the manual instructions above');
1011
- console.log(' 2. Then try: /deepthink "your question"');
928
+ console.log(' 2. Then try: "Use RVRY_deepthink to analyze..."');
1012
929
  }
1013
930
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rvry/mcp",
3
- "version": "0.7.2",
3
+ "version": "0.8.1",
4
4
  "description": "RVRY reasoning depth enforcement (RDE) engine client.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -9,7 +9,6 @@
9
9
  "main": "./dist/index.js",
10
10
  "files": [
11
11
  "dist",
12
- "commands",
13
12
  "!dist/**/*.test.*"
14
13
  ],
15
14
  "engines": {
@@ -1,307 +0,0 @@
1
- ---
2
- description: Deep structured analysis for high-stakes questions via RVRY
3
- argument-hint: [--auto] <question>
4
- allowed-tools:
5
- - mcp__rvry-dev__deepthink
6
- - AskUserQuestion
7
- - Read
8
- - Write
9
- - Grep
10
- - Glob
11
- - Bash
12
- ---
13
-
14
- # /deepthink - Deep Structured Analysis
15
-
16
- **YOUR ROLE**: Execute depth-first exploration with adaptive pre-mortems after conclusion-producing rounds. DIVERGENT thinking -- exploring questions, generating hypotheses, stress-testing conclusions before they solidify. For CONVERGENT decision-making, use `/problem-solve`.
17
-
18
- **Input**: $ARGUMENTS
19
-
20
- ---
21
-
22
- ## Phase 0: Parse Flags
23
-
24
- - If `$ARGUMENTS` is empty or `--help`: display usage and stop:
25
- ```
26
- /deepthink - Deep Structured Analysis via RVRY
27
-
28
- USAGE:
29
- /deepthink <question>
30
- /deepthink --auto <question> (fully autonomous, no questions, states assumptions)
31
-
32
- The engine runs multi-round analysis with constraint tracking, quality gates,
33
- and reasoning checks. Local persistence survives context compression.
34
-
35
- RELATED: /problem-solve (convergent decision-making)
36
- ```
37
- - If `$ARGUMENTS` contains `--auto`: set AUTO_MODE, strip `--auto` from input
38
-
39
- ---
40
-
41
- ## Phase 1: Session Setup
42
-
43
- Create a session folder for local artifacts that survive context compression:
44
-
45
- 1. Generate a timestamp: `YYYYMMDD-HHMM` (current date/time)
46
- 2. Generate a slug from the question summary (3-4 words, kebab-case)
47
- 3. Create `{$PWD}/.claude/cognition/YYYYMMDD-HHMM-deepthink-<slug>/`
48
- IMPORTANT: This is the PROJECT's `.claude/`, NOT `~/.claude/`. Use the absolute project root path.
49
- 4. Write `00-enter.md`:
50
- ```markdown
51
- # DeepThink Session
52
- **Question**: <full question>
53
- **Started**: <timestamp>
54
- ```
55
-
56
- ---
57
-
58
- ## Phase 2: ORIENT (before calling the engine)
59
-
60
- Orient directly -- no engine calls yet. This forces commitment to disk before the analysis loop. Everything written here survives if context compresses mid-session.
61
-
62
- ### `01-orient.md`:
63
- Write to the session folder:
64
- - **What I know**: Key facts, evidence, and context apparent from the question
65
- - **What I'm uncertain about**: Gaps, assumptions, unknowns (list each specifically)
66
- - **What I'm avoiding**: Uncomfortable angles, taboo options, things that would be inconvenient if true
67
-
68
- ### `02-scope-questions.md`:
69
- Translate each uncertainty into a binary question with a smart default. Generate up to 3 questions, each with exactly 2 options. The recommended option comes first.
70
-
71
- Write the questions to the file BEFORE asking.
72
-
73
- ### If AUTO_MODE:
74
-
75
- State your assumptions visibly (e.g., "Assuming focus on architectural trade-offs rather than implementation details."). Write assumptions to `03-scope-answers.md`. Proceed to Phase 3.
76
-
77
- ### If NOT AUTO_MODE:
78
-
79
- Ask scope questions via `AskUserQuestion` (up to 3 questions, each with 2 options, smart default first marked "(Recommended)").
80
-
81
- ```
82
- AskUserQuestion({
83
- questions: [
84
- {
85
- question: "<derived from uncertainty>",
86
- header: "<short label>",
87
- options: [
88
- { label: "<recommended option> (Recommended)", description: "<why this is the smart default>" },
89
- { label: "<alternative option>", description: "<when this makes sense>" }
90
- ],
91
- multiSelect: false
92
- }
93
- ]
94
- })
95
- ```
96
-
97
- If AskUserQuestion returns blank or fails, state assumptions visibly and proceed.
98
-
99
- Record the answers (or stated assumptions) in `03-scope-answers.md`.
100
-
101
- ---
102
-
103
- ## Phase 3: Start Engine Session
104
-
105
- Format the user's original question enriched with scope context from `03-scope-answers.md`.
106
-
107
- Call `mcp__rvry-dev__deepthink` with:
108
- ```
109
- {
110
- "input": "<original question>\n\nContext: <brief summary of scope answers>"
111
- }
112
- ```
113
-
114
- Proceed to Phase 4.
115
-
116
- ---
117
-
118
- ## Phase 4: Analysis Loop
119
-
120
- Repeat until `status === "complete"`:
121
-
122
- ### Step 1: Read the engine response
123
-
124
- Read the engine's `question` field -- this is the analytical direction for this round. Read `constraints`, `gate`, and `detection` to understand the engine's assessment. Read `constraintBlock` for constraint update instructions.
125
-
126
- ### Step 2: Show status
127
-
128
- Show the user a brief status line:
129
- - Format: `Round {round} -- {what you're doing this round}`
130
- - Example: `Round 3 -- stress-testing the current position`
131
- - Derive the description from the engine's question focus. One line only.
132
-
133
- ### Step 3: Perform analysis
134
-
135
- Analyze according to the engine's question and constraint data. The engine's question and constraints guide your thinking -- work WITH them, not around them.
136
-
137
- Use Read, Grep, Glob, and Bash as needed to ground your analysis in actual code, data, or project state. Do not analyze in the abstract when concrete evidence is available.
138
-
139
- ### Step 4: 7-Question Self-Check (mandatory, internal)
140
-
141
- **Internal**:
142
- 1. Is this shallow or predictable?
143
- 2. What am I avoiding?
144
- 3. Why not the uncomfortable option?
145
-
146
- **External**:
147
- 4. What would I critique if someone else wrote this?
148
- 5. What would a skeptical expert challenge?
149
- 6. Any verifiable claims that should be checked?
150
-
151
- **Grounding**:
152
- 7. What factual premise in this analysis have I not verified?
153
-
154
- ### Step 5: Verify-or-Defer (mandatory after self-check)
155
-
156
- For each concern raised in Q5, Q6, or Q7, you MUST either:
157
- - **VERIFY**: Actually check the claim -- read a file, grep for a pattern, run a command. Record what was verified and the result.
158
- - **DEFER**: Explicitly state the concern and why it cannot be verified now. Express as a DEFER in the constraint update block.
159
-
160
- **No dismiss**: You CANNOT raise a concern and then argue it away in the same self-check. If you raise it, you must verify or defer it.
161
-
162
- ### Step 6: Weakness Probe (rotate by round number)
163
-
164
- Ask yourself ONE of these:
165
- 1. Which part of your analysis would you spend more time on if you had another round?
166
- 2. If your recommendation fails in practice, what is the first concrete thing someone notices?
167
- 3. What surprised you during this analysis? If nothing, what does that tell you?
168
- 4. What is the thing you almost said but did not?
169
- 5. Which of your claims would you remove if you had to stake your credibility on the remaining ones?
170
- 6. Your strongest claim and your most significant caveat -- are they in tension? If so, which do you stand behind?
171
-
172
- Include the probe answer in your analysis.
173
-
174
- ### Step 7: Write constraint updates and submit
175
-
176
- End your analysis with the constraint update block:
177
- ```
178
- Constraint Updates
179
- RESOLVE: C1, C2
180
- ACKNOWLEDGE: C3
181
- DEFER: C4 | <reason>
182
- MILESTONE: <milestone> | <evidence>
183
- End Constraint Updates
184
- ```
185
-
186
- Call the engine tool with your full analysis (including constraint updates, self-check findings, and verify-or-defer results) as the `input`.
187
-
188
- ### What the user sees per round:
189
- - The one-line status (Step 2)
190
- - Nothing else until harvest
191
-
192
- ### What NEVER appears in user-visible output:
193
- - The engine's `question` field content
194
- - Constraint views or constraint update blocks
195
- - Self-check questions or responses
196
- - Gate verdicts or detection results
197
- - The `constraintBlock` content
198
-
199
- ---
200
-
201
- ## Phase 5: Harvest
202
-
203
- When `status === "complete"`:
204
-
205
- ### Harvest Pre-Mortem (before synthesis)
206
-
207
- Before writing the final output, stress-test the direction of your analysis:
208
-
209
- 1. What was the original question?
210
- 2. What is my emerging recommendation/position?
211
- 3. What is the gap between the two in complexity and scope?
212
- 4. If the recommendation is more complex than the original problem warranted, what is the simpler version?
213
-
214
- **Check for COMPLEXITY-COLLAPSE**: Did the analysis elaborate a simple problem until the complexity justified a complex solution? If yes, name the simpler alternative and present it prominently in the output.
215
-
216
- ### Write `99-harvest.md`
217
-
218
- Write to the session folder:
219
- ```markdown
220
- # DeepThink Harvest: [Problem Summary]
221
-
222
- ## Summary
223
- [2-3 sentence executive summary]
224
-
225
- ## Key Findings
226
- - [finding 1]
227
- - [finding 2]
228
- - [finding 3]
229
-
230
- ## Open Questions
231
- - [what remains uncertain]
232
-
233
- ## Follow-ups
234
- - /deepthink "[specific follow-up]" -- [why]
235
- - /problem-solve "[specific decision]" -- [why]
236
- ```
237
-
238
- ### Confirm persistence to user
239
-
240
- After writing 99-harvest.md:
241
- ```
242
- ---
243
- Session persisted: <absolute path to session folder>
244
- ---
245
- ```
246
-
247
- ### Synthesize for the user
248
-
249
- Use the engine's `harvest.summary`, `harvest.keyFindings`, `harvest.openQuestions`, and `harvest.followUps` as source material, plus your accumulated reasoning across all rounds and the harvest pre-mortem results.
250
-
251
- ---
252
-
253
- ## Final Output Format
254
-
255
- The sections above the break are the value-add -- what the process surfaced that a straight answer wouldn't have. The prose after the break is just the answer.
256
-
257
- ```
258
- # DeepThink: [Problem Summary]
259
-
260
- ## Default Starting Point
261
- [Where thinking began -- assumptions, knowns, open questions.]
262
-
263
- ## Insights from DeepThink
264
-
265
- **[Finding as a clear statement.]**
266
- [Expand if needed. Skip if the bold line is self-sufficient.] (#tag-if-relevant)
267
-
268
- **[Another finding.]**
269
- [Context if needed.]
270
-
271
- **[Simple finding that needs no expansion.]** (#pre-mortem)
272
-
273
- [Format for human readability in terminal:
274
- - Each finding gets its own appropriate visual unit (bold heading,
275
- bullet, or short paragraph)
276
- - Bullets for simple/parallel items. Bold heading + paragraph for
277
- complex ones. Mix freely.
278
- - No walls of text. If a paragraph runs long, break it.
279
- - Lead with the IDEA, never the mode name
280
- - Never describe the protocol's mechanics or your analytical process
281
- - (#tags) are optional breadcrumbs: (#pre-mortem), (#inversion),
282
- (#edge), (#perspective), (#meta). Most findings need no tag.
283
- - Curate your best 3-6 findings, not every observation from every round.]
284
-
285
- ---
286
-
287
- [The answer. No heading. What you actually think now, informed by
288
- everything above. No dense paragraphs. No prescribed length.
289
- Never start with "The exploration..." or "After analyzing..."]
290
-
291
- ## Follow-ups
292
- -> /problem-solve "[specific decision point]"
293
- _[why this needs convergent decision-making]_
294
- -> /deepthink "[specific follow-up]"
295
- _[why this needs further exploration]_
296
- ```
297
-
298
- ---
299
-
300
- ## Key Differences from /problem-solve
301
-
302
- | /deepthink | /problem-solve |
303
- |------------|----------------|
304
- | Divergent + pre-mortems | Convergent - decide, commit |
305
- | 7-question self-check + probe + verify-or-defer | Phase gates + probe |
306
- | Explores the question space | Narrows to a decision |
307
- | Valid: "more confused in useful ways" | Valid: clear decision + safeguards |
@@ -1,334 +0,0 @@
1
- ---
2
- description: Convergent decision-making pipeline via RVRY
3
- argument-hint: [--auto] <problem or decision>
4
- allowed-tools:
5
- - mcp__rvry-dev__problem_solve
6
- - AskUserQuestion
7
- - Read
8
- - Write
9
- - Grep
10
- - Glob
11
- - Bash
12
- ---
13
-
14
- # /problem-solve - Convergent Decision-Making
15
-
16
- **YOUR ROLE**: Execute a convergent decision pipeline. The engine handles the structured analysis phases (orient, anticipate, generate, evaluate, commit). You handle local persistence, self-discipline, and grounding claims in evidence. For DIVERGENT exploration, use `/deepthink`.
17
-
18
- **Input**: $ARGUMENTS
19
-
20
- ---
21
-
22
- ## Phase 0: Parse Flags
23
-
24
- - If `$ARGUMENTS` is empty or `--help`: display usage and stop:
25
- ```
26
- /problem-solve - Convergent Decision-Making via RVRY
27
-
28
- USAGE:
29
- /problem-solve <problem or decision>
30
- /problem-solve --auto <problem> (fully autonomous, no questions, states assumptions)
31
-
32
- The engine runs a multi-round decision pipeline with constraint tracking,
33
- quality gates, and reasoning checks. Local persistence survives context compression.
34
-
35
- RELATED: /deepthink (divergent exploration)
36
- ```
37
- - If `$ARGUMENTS` contains `--auto`: set AUTO_MODE, strip `--auto` from input
38
-
39
- ---
40
-
41
- ## Phase 1: Session Setup
42
-
43
- Create a session folder for local artifacts that survive context compression:
44
-
45
- 1. Generate a timestamp: `YYYYMMDD-HHMM` (current date/time)
46
- 2. Generate a slug from the problem summary (3-4 words, kebab-case)
47
- 3. Create `{$PWD}/.claude/cognition/YYYYMMDD-HHMM-problemsolve-<slug>/`
48
- IMPORTANT: This is the PROJECT's `.claude/`, NOT `~/.claude/`. Use the absolute project root path.
49
- 4. Write `00-enter.md`:
50
- ```markdown
51
- # ProblemSolve Session
52
- **Problem**: <full problem statement>
53
- **Started**: <timestamp>
54
- ```
55
-
56
- ---
57
-
58
- ## Phase 2: ORIENT (before calling the engine)
59
-
60
- Orient directly -- no engine calls yet. This forces commitment to disk before the analysis loop. Everything written here survives if context compresses mid-session.
61
-
62
- ### `01-orient.md`:
63
- Write to the session folder:
64
- - **What is the problem?**: The decision or problem in concrete terms
65
- - **What is uncertain?**: Gaps, assumptions, unknowns (list each specifically)
66
- - **What am I avoiding?**: Uncomfortable options, risky paths, things that would be inconvenient if true
67
-
68
- ### `02-scope-questions.md`:
69
- Translate each uncertainty into a binary question with a smart default. Generate up to 3 questions, each with exactly 2 options. The recommended option comes first.
70
-
71
- Write the questions to the file BEFORE asking.
72
-
73
- ### If AUTO_MODE:
74
-
75
- State your assumptions visibly (e.g., "Assuming risk minimization over speed. Assuming known options need evaluation rather than generating new alternatives."). Write assumptions to `03-scope-answers.md`. Proceed to Phase 3.
76
-
77
- ### If NOT AUTO_MODE:
78
-
79
- Ask scope questions via `AskUserQuestion` (up to 3 questions, each with 2 options, smart default first marked "(Recommended)").
80
-
81
- ```
82
- AskUserQuestion({
83
- questions: [
84
- {
85
- question: "<derived from uncertainty>",
86
- header: "<short label>",
87
- options: [
88
- { label: "<recommended option> (Recommended)", description: "<why this is the smart default>" },
89
- { label: "<alternative option>", description: "<when this makes sense>" }
90
- ],
91
- multiSelect: false
92
- }
93
- ]
94
- })
95
- ```
96
-
97
- If AskUserQuestion returns blank or fails, state assumptions visibly and proceed.
98
-
99
- Record the answers (or stated assumptions) in `03-scope-answers.md`.
100
-
101
- ---
102
-
103
- ## Phase 3: Start Engine Session
104
-
105
- Format the user's original problem enriched with scope context from `03-scope-answers.md`.
106
-
107
- Call `mcp__rvry-dev__problem_solve` with:
108
- ```
109
- {
110
- "input": "<original problem>\n\nContext: <brief summary of scope answers>"
111
- }
112
- ```
113
-
114
- Proceed to Phase 4.
115
-
116
- ---
117
-
118
- ## Phase 4: Analysis Loop
119
-
120
- Repeat until `status === "complete"`:
121
-
122
- ### Step 1: Read the engine response
123
-
124
- Read the engine's `question` field -- this is the analytical direction for this round. Read `constraints`, `gate`, and `detection` to understand the engine's assessment. Read `constraintBlock` for constraint update instructions.
125
-
126
- ### Step 2: Show status
127
-
128
- Show the user a brief status line:
129
- - Format: `Round {round} -- {what you're doing this round}`
130
- - Example: `Round 2 -- mapping failure modes`
131
- - Derive the description from the engine's question focus. One line only.
132
-
133
- ### Step 3: Perform analysis
134
-
135
- Analyze according to the engine's question and constraint data. The engine's question and constraints guide your thinking -- work WITH them, not around them.
136
-
137
- Use Read, Grep, Glob, and Bash as needed to ground your analysis in actual code, data, or project state. Do not analyze in the abstract when concrete evidence is available.
138
-
139
- ### Step 4: 7-Question Self-Check (mandatory, internal)
140
-
141
- **Internal**:
142
- 1. Is this shallow or predictable?
143
- 2. What am I avoiding?
144
- 3. Why not the uncomfortable option?
145
-
146
- **External**:
147
- 4. What would I critique if someone else wrote this?
148
- 5. What would a skeptical expert challenge?
149
- 6. Any verifiable claims that should be checked?
150
-
151
- **Grounding**:
152
- 7. What factual premise in this analysis have I not verified?
153
-
154
- ### Step 5: Verify-or-Defer (mandatory after self-check)
155
-
156
- For each concern raised in Q5, Q6, or Q7, you MUST either:
157
- - **VERIFY**: Actually check the claim -- read a file, grep for a pattern, run a command. Record what was verified and the result.
158
- - **DEFER**: Explicitly state the concern and why it cannot be verified now. Express as a DEFER in the constraint update block.
159
-
160
- **No dismiss**: You CANNOT raise a concern and then argue it away in the same self-check. If you raise it, you must verify or defer it.
161
-
162
- ### Step 6: Weakness Probe (rotate by round number)
163
-
164
- Ask yourself ONE of these:
165
- 1. Which part of your analysis would you spend more time on if you had another round?
166
- 2. If your recommendation fails in practice, what is the first concrete thing someone notices?
167
- 3. What surprised you during this analysis? If nothing, what does that tell you?
168
- 4. What is the thing you almost said but did not?
169
- 5. Which of your claims would you remove if you had to stake your credibility on the remaining ones?
170
- 6. Your strongest claim and your most significant caveat -- are they in tension? If so, which do you stand behind?
171
-
172
- Include the probe answer in your analysis.
173
-
174
- ### Step 7: Write constraint updates and submit
175
-
176
- End your analysis with the constraint update block:
177
- ```
178
- Constraint Updates
179
- RESOLVE: C1, C2
180
- ACKNOWLEDGE: C3
181
- DEFER: C4 | <reason>
182
- MILESTONE: <milestone> | <evidence>
183
- End Constraint Updates
184
- ```
185
-
186
- Call the engine tool with your full analysis (including constraint updates, self-check findings, and verify-or-defer results) as the `input`.
187
-
188
- ### What the user sees per round:
189
- - The one-line status (Step 2)
190
- - Nothing else until harvest
191
-
192
- ### What NEVER appears in user-visible output:
193
- - The engine's `question` field content
194
- - Constraint views or constraint update blocks
195
- - Self-check questions or responses
196
- - Gate verdicts or detection results
197
- - The `constraintBlock` content
198
-
199
- ---
200
-
201
- ## Phase 5: Harvest
202
-
203
- When `status === "complete"`:
204
-
205
- ### Harvest Pre-Mortem (before synthesis)
206
-
207
- Before writing the final output, stress-test the direction of your analysis:
208
-
209
- 1. What was the original problem?
210
- 2. What is my recommendation now?
211
- 3. What is the gap between the two in complexity and scope?
212
- 4. If the recommendation is more complex than the original problem warranted, what is the simpler version?
213
-
214
- **Check for COMPLEXITY-COLLAPSE**: Did the analysis elaborate a simple problem until the complexity justified a complex solution? If yes, name the simpler alternative and present it prominently.
215
-
216
- ### Write `99-harvest.md`
217
-
218
- Write to the session folder:
219
- ```markdown
220
- # ProblemSolve Harvest: [Problem Summary]
221
-
222
- ## Summary
223
- [2-3 sentence executive summary of decision + rationale]
224
-
225
- ## Decision
226
- [The recommendation with confidence level]
227
-
228
- ## Key Risks
229
- - [risk 1 and its safeguard]
230
- - [risk 2 and its safeguard]
231
-
232
- ## Alternatives Considered
233
- - [alternative 1] -- eliminated because [reason]
234
- - [alternative 2] -- eliminated because [reason]
235
-
236
- ## Open Questions
237
- - [what remains uncertain]
238
-
239
- ## Follow-ups
240
- - /deepthink "[uncertainty]" -- [why this needs exploration]
241
- - /problem-solve "[next decision]" -- [why this needs its own analysis]
242
- ```
243
-
244
- ### Confirm persistence to user
245
-
246
- After writing 99-harvest.md:
247
- ```
248
- ---
249
- Session persisted: <absolute path to session folder>
250
- ---
251
- ```
252
-
253
- ### Synthesize for the user
254
-
255
- Use the engine's `harvest.summary`, `harvest.keyFindings`, `harvest.openQuestions`, and `harvest.followUps` as source material, plus your accumulated reasoning across all rounds and the harvest pre-mortem results.
256
-
257
- ---
258
-
259
- ## Final Output Format
260
-
261
- The output is decision-first. The reader gets the answer immediately, then supporting evidence. This reflects convergent thinking: narrow toward commitment, not expand toward synthesis.
262
-
263
- ```
264
- # ProblemSolve: [Problem Summary]
265
-
266
- ## Analysis
267
-
268
- [Problem framing -- what the situation was and what triggered
269
- this analysis. 1-2 sentences.]
270
-
271
- [Reasoning arc -- what the analysis revealed that confirmed,
272
- redirected, or complicated the initial instinct. Where the
273
- reasoning turned. What would change the verdict.
274
-
275
- State the chosen direction clearly at the end of this section.
276
- The reader should know what you're recommending before they
277
- read the stress test.]
278
-
279
- [For simple decisions, these can collapse into a shorter
280
- form. The point is readability, not rigid structure.]
281
-
282
- ## Stress Test
283
-
284
- **"[Risk or adversarial challenge]"**
285
- [How it was tested and what happened. Did the decision survive,
286
- adapt, or need revision? Plain prose, no arrows.]
287
-
288
- **"[Another risk]"**
289
- [Response and outcome.]
290
-
291
- ## Alternative Options
292
- - **[What the alternative was]**: Eliminated because [reason].
293
- - **[What the alternative was]**: Eliminated because [reason].
294
-
295
- [Do NOT reference "Option A/B/C" labels. The reader hasn't
296
- seen an option tree. Name each alternative by what it actually
297
- is, then explain why it was rejected.]
298
-
299
- ## Recommendation
300
- **[Decision statement]** (confidence: X.X)
301
-
302
- [Why this is the go-forward path -- the synthesis of the analysis
303
- and stress test above. 1-3 sentences connecting the reasoning
304
- to the commitment.]
305
-
306
- **Safeguards:**
307
- [Specific commitments to prevent the failures identified above.]
308
-
309
- [Format for human readability in terminal:
310
- - The Decision can be multi-part or compact -- match the complexity
311
- of the actual decision
312
- - Stress Test entries: bold risk, plain response. No arrows, no
313
- mechanism names.
314
- - Never reference the protocol's internal phases, gates, or
315
- mechanism names in user-facing output
316
- - No walls of text. Break long paragraphs.]
317
-
318
- ## Where to Go Next
319
- -> /deepthink "[uncertainty needing exploration]"
320
- _[why this needs adversarial testing]_
321
- -> /problem-solve "[next decision point]"
322
- _[if a follow-on decision is needed]_
323
- ```
324
-
325
- ---
326
-
327
- ## Key Differences from /deepthink
328
-
329
- | /problem-solve | /deepthink |
330
- |----------------|------------|
331
- | Convergent - decide, commit | Divergent + pre-mortems |
332
- | Phase gates + probe | 7-question self-check + probe + verify-or-defer |
333
- | Narrows to a decision | Explores the question space |
334
- | Valid: clear decision + safeguards | Valid: "more confused in useful ways" |