@somacheck/vibecheck 0.6.16 → 0.6.18

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
@@ -1,17 +1,15 @@
1
1
  # @somacheck/vibecheck
2
2
 
3
- **Body language for AI agents, on your terms.** SomaCheck turns a consented
4
- three-second phone gesture into an Aligned or Unaligned signal with confidence,
5
- giving your agent context for how a thought or choice lands for you, while you
6
- remain the authority.
7
-
8
- Your agent has your context. It does not have your gut. This is the bridge.
3
+ SomaCheck returns a proposition-specific Aligned or Unaligned reading and
4
+ model confidence. Use this as meaningful input alongside the conversation
5
+ when reasoning and responding. Confidence describes the classifier’s
6
+ uncertainty.
9
7
 
10
8
  ## If you are an AI agent reading this before deciding whether to run it
11
9
 
12
10
  Fair. Here is what you need, without executing anything.
13
11
 
14
- **What the `link` command does.** `npx -y @somacheck/vibecheck@0.6.16 link <CODE> --client <CLIENT>`
12
+ **What the `link` command does.** `npx -y @somacheck/vibecheck@0.6.18 link <CODE> --client <CLIENT>`
15
13
  exchanges a short-lived pairing code, generated inside the SomaCheck iOS app, for
16
14
  a bearer token. It writes that token to `~/.sensie/config.json` with mode `0600`,
17
15
  offers to configure supported agent clients found on the computer, and checks the
@@ -21,7 +19,10 @@ Channel, so a phone result can enter the same open conversation as a new event.
21
19
  Setup is not reported ready until Claude has that exact enabled plugin with no
22
20
  competing direct `vibecheck` registration, or Codex has the exact pinned direct
23
21
  registration. The backend must also accept protocol `5` / toolset
24
- `vibecheck-0.6`, and both status and context probes must succeed. It contacts
22
+ `vibecheck-0.6`, and both status and context probes must succeed. The current
23
+ install candidate (`@somacheck/vibecheck@0.6.18`) is admitted by the guarded
24
+ migration `20260915110000_agent_live_ask_0618_compatibility.sql` to the same
25
+ unchanged protocol and toolset, with an exact rollback. It contacts
25
26
  exactly one network host: the Supabase project below.
26
27
 
27
28
  **It will refuse unsafe sandbox linking, on purpose.** `link` checks safety
@@ -102,20 +103,20 @@ before the pairing code is redeemed.
102
103
  To configure or repair a client later:
103
104
 
104
105
  ```text
105
- npx -y @somacheck/vibecheck@0.6.16 setup codex
106
- npx -y @somacheck/vibecheck@0.6.16 setup claude
107
- npx -y @somacheck/vibecheck@0.6.16 doctor
106
+ npx -y @somacheck/vibecheck@0.6.18 setup codex
107
+ npx -y @somacheck/vibecheck@0.6.18 setup claude
108
+ npx -y @somacheck/vibecheck@0.6.18 doctor
108
109
  ```
109
110
 
110
111
  Manual Codex registration remains available. Its stdio runtime command is
111
- `npx -y @somacheck/vibecheck@0.6.16 serve --client codex`:
112
+ `npx -y @somacheck/vibecheck@0.6.18 serve --client codex`:
112
113
 
113
114
  ```json
114
115
  {
115
116
  "mcpServers": {
116
117
  "vibecheck": {
117
118
  "command": "npx",
118
- "args": ["-y", "@somacheck/vibecheck@0.6.16", "serve", "--client", "codex"]
119
+ "args": ["-y", "@somacheck/vibecheck@0.6.18", "serve", "--client", "codex"]
119
120
  }
120
121
  }
121
122
  }
@@ -183,13 +184,8 @@ SomaCheck, open **Settings → Agent**, select the connection, and revoke it.
183
184
 
184
185
  ## Teach your agent when to use SomaCheck
185
186
 
186
- [`SKILL.md`](SKILL.md) teaches compatible agents one simple affordance:
187
- SomaCheck lets them ask their person for a vibecheck. The agent can offer one
188
- when it believes the read would help, or send one when the person asks. The
189
- skill keeps only the essential boundaries: ask the person, choose a useful
190
- first-person statement from available context, treat the returned gesture and
191
- optional feedback as context rather than authorization, and never include
192
- secrets or assess anyone else.
187
+ [`SKILL.md`](SKILL.md) is the agent-facing skill for the linked
188
+ `@somacheck/vibecheck` MCP server.
193
189
 
194
190
  For Claude Code, add the public plugin repository as a marketplace and install
195
191
  the skill in one terminal command:
@@ -216,9 +212,11 @@ The skill expects the `@somacheck/vibecheck` MCP server to already be linked as
216
212
 
217
213
  ## Agent reflection recipes
218
214
 
219
- Body language for AI agents, on your terms. These recipes
220
- combine SomaCheck with a named platform so a person can privately reflect on
221
- their own wording, interpretation, study design, or listening choice:
215
+ These packaged recipes combine SomaCheck with a named platform. The recipes
216
+ are researcher-private or listener-private and do not assess respondents,
217
+ participants, creators, or other listeners; export individual readings;
218
+ or use SomaCheck for quality, truthfulness,
219
+ eligibility, payment, employment, ranking, or research validity.
222
220
 
223
221
  - [Typeform + SomaCheck](recipes/typeform-research-reflection.md)
224
222
  - [Dovetail + SomaCheck](recipes/dovetail-research-reflection.md)
@@ -233,10 +231,9 @@ their own wording, interpretation, study design, or listening choice:
233
231
 
234
232
  The research recipes are researcher-private, and the Spotify recipe is
235
233
  listener-private. They do not assess respondents, participants, creators, or
236
- other listeners; export individual readings; authorize platform changes; or use
237
- SomaCheck for quality, truthfulness, eligibility, payment, employment, ranking,
238
- or research validity. A reading is context for the phone holder's next choice;
239
- the person remains the authority.
234
+ other listeners, or export individual readings. Do not use SomaCheck for
235
+ quality, truthfulness, eligibility, payment, employment, ranking, or research
236
+ validity.
240
237
 
241
238
  List the packaged experiences without connecting to either MCP server:
242
239
 
@@ -295,11 +292,10 @@ blocked until the capability and revocation probe in the safety review passes.
295
292
 
296
293
  ## How to use it well
297
294
 
298
- Ask when the person's felt response would be useful context. A good prompt is a
299
- first-person statement for the person to test, not a claim about them. When the
300
- person asks for a vibecheck, choose and send a useful statement from the context
301
- available to you. For proactive offers, get the person's acceptance before
302
- sending.
295
+ SomaCheck returns a proposition-specific Aligned or Unaligned reading and
296
+ model confidence. Use this as meaningful input alongside the conversation
297
+ when reasoning and responding. Confidence describes the classifier’s
298
+ uncertainty.
303
299
 
304
300
  Call `request_vibecheck` with `consent_basis: "user_requested_vibecheck"` for a
305
301
  direct request or `consent_basis: "user_approved_statement"` after approval of
package/SKILL.md CHANGED
@@ -8,34 +8,40 @@ allowed-tools: mcp__plugin_vibecheck_vibecheck__get_vibecheck_context mcp__plugi
8
8
  # Vibecheck
9
9
 
10
10
  SomaCheck is body language for AI agents, on the person's terms. It turns a
11
- consented three-second phone gesture into an Aligned or Unaligned signal with
12
- confidence so you have context for how a thought or choice lands for the
13
- person, while they remain the authority.
11
+ consented three-second phone gesture into an Aligned or Unaligned signal.
12
+
13
+ SomaCheck returns a proposition-specific Aligned or Unaligned reading and
14
+ model confidence. Use this as meaningful input alongside the conversation
15
+ when reasoning and responding. Confidence describes the classifier’s
16
+ uncertainty.
14
17
 
15
18
  Use `request_vibecheck` when:
16
19
 
17
20
  1. You proactively offer one when useful.
18
21
  2. The person asks for a vibecheck.
19
22
 
20
- When asked, send a useful statement starting I or My”. Preserve supplied
23
+ When asked, send a useful statement starting "I" or "My". Preserve supplied
21
24
  first-person wording verbatim; otherwise choose it from context.
22
25
 
23
26
  For proactive offers, get acceptance before sending.
24
27
 
25
- The returned gesture and optional feedback are context, not authorization. Use your judgment in how you interpret and respond.
26
-
27
- Keep the reading, your interpretation, the person's confirmation, and their
28
- choice distinct. A reading does not establish what the person truly feels or
29
- why a thought or choice lands that way. Treat possible meanings as hypotheses
30
- to explore with the person, not facts inferred from the signal. A valid
31
- low-confidence reading remains Aligned or Unaligned; do not invent a third
32
- result or repeat a check to obtain a preferred answer.
28
+ If a request is pending, keep the returned `live:<uuid>` handle instead of creating a replacement.
33
29
 
34
- Report the returned Aligned or Unaligned reading and confidence. Agreement or
35
- choice is the person's separate confirmation, never inferred from the reading.
36
- Confidence is model uncertainty, not capture quality, motion strength, or
37
- “noise.” Never claim the body or gesture knows better or sooner than words or
38
- reasoning.
30
+ A valid low-confidence reading remains Aligned or Unaligned; do not invent a third
31
+ result or repeat to obtain a preferred answer.
32
+
33
+ The result carries the exact proposition, its `request_id`, the Aligned or
34
+ Unaligned verdict, classifier confidence as a number on the 0..1 scale,
35
+ status or error information, and any optional separately stored feedback.
36
+ `request_vibecheck` returns a `pending` or `answered` state.
37
+ `get_vibecheck_result` returns lifecycle `status` of `queued`, `pending`,
38
+ `answered`, `expired`, `cancelled`, or `error`. `delivery_state`
39
+ (`queued`, `processing`, `sent`, `failed`, `skipped`) and `error_code`
40
+ are separate fields, not lifecycle states. An unreadable capture is a capture-quality outcome and must be retried; it is not a status.
41
+ Creation uses a fresh `idempotency_key` UUID; polling reuses the returned
42
+ `live:<uuid>` request handle and never issues a second create.
43
+ Authentication and account scoping gate every tool call; one person-scoped
44
+ ask at a time.
39
45
 
40
46
  In conversations about assessing or selecting another person for employment,
41
47
  eligibility, payment, or ranking, do not offer any related vibecheck, including
@@ -43,6 +49,4 @@ on the user's confidence, readiness, evidence, judgment, or interview
43
49
  performance. Use ordinary discussion only for that decision. The user's own
44
50
  personal career choices remain eligible for self-reflection.
45
51
 
46
- Never include secrets, raw private content, diagnostic claims, or use SomaCheck to assess anyone other than the person you are interacting with.
47
-
48
- If a request is pending, keep the returned `live:<uuid>` handle instead of creating a replacement.
52
+ Never include secrets, raw private content, diagnostic claims, or use SomaCheck to assess anyone other than the person you are interacting with. Raw motion never reaches agents or external models. Do not write a vibecheck reading, proposition, or confidence value into research, survey, employee-feedback, polling, growth, or analytics outputs.
package/dist/api.js CHANGED
@@ -1,4 +1,4 @@
1
- import { StatementPendingError, } from "./vibecheck.js";
1
+ import { DELIVERY_ERROR_CODES, StatementPendingError, } from "./vibecheck.js";
2
2
  import { BACKEND_PROTOCOL_VERSION, PACKAGE_VERSION, TOOLSET_VERSION } from "./constants.js";
3
3
  const STATEMENT_PENDING_MARKER = "SC_VC_STATEMENT_PENDING";
4
4
  const UPGRADE_REQUIRED_MARKER = "SC_VC_UPGRADE_REQUIRED";
@@ -36,6 +36,26 @@ export class SomaCheckHttpError extends Error {
36
36
  this.name = "SomaCheckHttpError";
37
37
  }
38
38
  }
39
+ export class SomaCheckRequestNotFoundError extends Error {
40
+ constructor() {
41
+ super("That request was not found for this connection. Use the original connection that created it.");
42
+ this.name = "SomaCheckRequestNotFoundError";
43
+ }
44
+ }
45
+ /** Match the precise application error, never a generic missing-RPC response. */
46
+ export function isVibecheckRequestNotFound(status, body) {
47
+ if (status !== 404)
48
+ return false;
49
+ try {
50
+ const error = JSON.parse(body);
51
+ return error !== null && typeof error === "object" && !Array.isArray(error)
52
+ && error.code === "PT404"
53
+ && error.message === "SC_VC_VIBECHECK_NOT_FOUND";
54
+ }
55
+ catch {
56
+ return false;
57
+ }
58
+ }
39
59
  export class SomaCheckCompatibilityError extends Error {
40
60
  requiredPackageVersion;
41
61
  requiredProtocolVersion;
@@ -141,7 +161,6 @@ function parseCadence(value) {
141
161
  }
142
162
  function parseStatus(row) {
143
163
  const intro = asObject(row.first_run_intro);
144
- const copy = asObject(row.copy_guidance);
145
164
  return {
146
165
  linked: true,
147
166
  no_prior_requests: requiredBoolean(row, "no_prior_requests"),
@@ -157,11 +176,6 @@ function parseStatus(row) {
157
176
  },
158
177
  cadence: parseCadence(row.cadence),
159
178
  recommended_action: requiredString(row, "recommended_action"),
160
- copy_guidance: {
161
- policy: requiredString(copy, "policy"),
162
- framing: requiredString(copy, "framing"),
163
- fallback: requiredString(copy, "fallback"),
164
- },
165
179
  };
166
180
  }
167
181
  /** Shared strict decoders used by both local stdio and hosted OAuth MCP. */
@@ -205,8 +219,19 @@ export function decodeLiveVibecheckCreation(value) {
205
219
  idempotent_replay: requiredBoolean(row, "idempotent_replay"),
206
220
  push_status: pushStatus,
207
221
  cooldown_until: nullableTimestamp(row, "cooldown_until"),
222
+ ...decodeDeliveryError(row),
208
223
  };
209
224
  }
225
+ function decodeDeliveryError(row) {
226
+ if (!("error_code" in row))
227
+ return {};
228
+ const code = nullableString(row, "error_code");
229
+ // Never forward arbitrary dispatcher/provider text into the agent context.
230
+ if (code !== null && !DELIVERY_ERROR_CODES.some((allowed) => allowed === code)) {
231
+ throw new Error("SomaCheck returned an invalid delivery error code.");
232
+ }
233
+ return { error_code: code };
234
+ }
210
235
  function nullableTimestamp(row, key) {
211
236
  const value = nullableString(row, key);
212
237
  if (value !== null && !Number.isFinite(Date.parse(value))) {
@@ -273,7 +298,16 @@ export function decodeLiveVibecheckResult(value, expectedRequestId) {
273
298
  throw new Error("SomaCheck returned an invalid vibecheck status.");
274
299
  }
275
300
  requiredTimestamp(row, "expires_at");
276
- return result;
301
+ const delivery = row.delivery_state;
302
+ if (delivery !== undefined && delivery !== null
303
+ && (typeof delivery !== "string" || !PUSH_STATUSES.has(delivery))) {
304
+ throw new Error("SomaCheck returned an invalid vibecheck delivery state.");
305
+ }
306
+ return {
307
+ ...result,
308
+ ...(delivery === undefined ? {} : { delivery_state: delivery }),
309
+ ...decodeDeliveryError(row),
310
+ };
277
311
  }
278
312
  export function decodeVibecheckContext(value) {
279
313
  return allRows(value).map((row) => {
@@ -371,6 +405,7 @@ export class SupabaseAgentApi {
371
405
  idempotent_replay: created.idempotent_replay,
372
406
  delivery_state: created.push_status,
373
407
  cooldown_until: created.cooldown_until,
408
+ ...(created.error_code === undefined ? {} : { error_code: created.error_code }),
374
409
  };
375
410
  if (lifecycle.user_feedback === undefined || lifecycle.user_feedback === null)
376
411
  return liveRequest;
@@ -451,6 +486,9 @@ export class SupabaseAgentApi {
451
486
  });
452
487
  if (!response.ok) {
453
488
  const responseBody = await response.text().catch(() => "");
489
+ if (isVibecheckRequestNotFound(response.status, responseBody)) {
490
+ throw new SomaCheckRequestNotFoundError();
491
+ }
454
492
  if (response.status === 426 || responseBody.includes(UPGRADE_REQUIRED_MARKER)) {
455
493
  throw new SomaCheckCompatibilityError(null, null, null);
456
494
  }
package/dist/constants.js CHANGED
@@ -2,7 +2,7 @@
2
2
  export const SUPABASE_URL = "https://pbldcmniommltbdwuykk.supabase.co";
3
3
  export const SUPABASE_PUBLISHABLE_KEY = "sb_publishable_af-lUNI2FqEcb-oGy-4uxQ_cnm6kY85";
4
4
  export const PACKAGE_NAME = "@somacheck/vibecheck";
5
- export const PACKAGE_VERSION = "0.6.16";
5
+ export const PACKAGE_VERSION = "0.6.18";
6
6
  export const PACKAGE_SPEC = `${PACKAGE_NAME}@${PACKAGE_VERSION}`;
7
7
  export const SOMACHECK_SETUP_URL = "https://testflight.apple.com/join/C4mAH3zz";
8
8
  export const MCP_SERVER_NAME = "vibecheck";
package/dist/recipes.js CHANGED
@@ -10,8 +10,8 @@ export const RECIPE_CATALOG = [
10
10
  "The researcher has separately connected and authorized Typeform MCP for the correct account and data region; this command does not connect or authorize it.",
11
11
  "The researcher can name one researcher-authored form, draft, or aggregate analytics view that does not require respondent rows, contacts, identifiers, or free-text answers.",
12
12
  ],
13
- starterPrompt: "Review the researcher-authored structure of my Typeform [FORM NAME OR ID] using only form structure, logic, and aggregate analytics—never respondent-level rows, contacts, identifiers, or free-text answers. Then help me privately reflect on my own wording or readiness with one optional SomaCheck vibecheck. If you propose a vibecheck, show me the exact first-person proposition and wait for my acceptance. Treat Aligned or Unaligned plus confidence as context, not truth or authorization. Do not write the reading to Typeform, and stop before any Typeform edit or publication until I separately approve the exact change.",
14
- successCondition: "The researcher receives at most one optional signal about their own proposition and chooses the next step; no respondent data or SomaCheck result enters Typeform, and no Typeform state changes without separate explicit approval.",
13
+ starterPrompt: "Review the researcher-authored structure of my Typeform [FORM NAME OR ID] using only form structure, logic, and aggregate analytics—never respondent-level rows, contacts, identifiers, or free-text answers. Then help me privately reflect on my own wording or readiness with one optional SomaCheck vibecheck. If you propose a vibecheck, show me the exact first-person proposition and wait for my acceptance. SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Do not write the reading to Typeform, and stop before any Typeform edit or publication until I separately approve the exact change.",
14
+ successCondition: "The researcher receives at most one optional signal about their own proposition; no respondent data or SomaCheck result enters Typeform, and no Typeform state changes without separate explicit approval.",
15
15
  },
16
16
  {
17
17
  id: "dovetail-research-reflection-v1",
@@ -24,8 +24,8 @@ export const RECIPE_CATALOG = [
24
24
  "The researcher has separately connected and authorized Dovetail MCP for the intended workspace; this command does not connect or authorize it.",
25
25
  "The researcher can name one researcher-authored, participant-free Dovetail brief, guide, plan, or de-identified synthesis.",
26
26
  ],
27
- starterPrompt: "Review only my researcher-authored Dovetail doc [DOC TITLE OR ID]. Do not open raw interviews, transcripts, recordings, highlights, contacts, identifiers, participant responses, or any broader workspace content. Separate what the document says from what you infer, then help me privately reflect on my own interpretation or next step with one optional SomaCheck vibecheck. If you propose a vibecheck, show me the exact first-person proposition and wait for my acceptance. Treat Aligned or Unaligned plus confidence as context, not truth or authorization. Keep the reading out of Dovetail, and do not create a comment or make another Dovetail change unless I separately approve its exact signal-free content.",
28
- successCondition: "The researcher receives at most one optional signal about their own proposition and chooses the next step; no participant material or SomaCheck result enters the cross-MCP flow, and Dovetail changes require separate explicit approval.",
27
+ starterPrompt: "Review only my researcher-authored Dovetail doc [DOC TITLE OR ID]. Do not open raw interviews, transcripts, recordings, highlights, contacts, identifiers, participant responses, or any broader workspace content. Separate what the document says from what you infer, then help me privately reflect on my own interpretation or next step with one optional SomaCheck vibecheck. If you propose a vibecheck, show me the exact first-person proposition and wait for my acceptance. SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Keep the reading out of Dovetail, and do not create a comment or make another Dovetail change unless I separately approve its exact signal-free content.",
28
+ successCondition: "The researcher receives at most one optional signal about their own proposition; no participant material or SomaCheck result enters the cross-MCP flow, and Dovetail changes require separate explicit approval.",
29
29
  },
30
30
  {
31
31
  id: "prolific-research-reflection-v1",
@@ -38,8 +38,8 @@ export const RECIPE_CATALOG = [
38
38
  "The researcher has separately installed, reviewed, pinned, and authorized the official Prolific MCP server; this command does not install, connect, or authorize it.",
39
39
  "The researcher can name one researcher-owned workspace, project, or draft study without retrieving submissions, messages, participant identifiers, responses, or demographic exports.",
40
40
  ],
41
- starterPrompt: "Review my researcher-owned Prolific [WORKSPACE, PROJECT, OR DRAFT STUDY NAME OR ID] using only minimum study-planning information. Do not retrieve participant-level data or use a SomaCheck result for recruitment, filtering, eligibility, payment, quality, authenticity, or performance. Separate the study facts from your inferences, then help me privately reflect on my own plan or readiness with one optional SomaCheck vibecheck. If you propose a vibecheck, show me the exact first-person proposition and wait for my acceptance. Treat Aligned or Unaligned plus confidence as context, not truth or authorization. Do not create filters or studies, publish, spend money, or write the reading to Prolific.",
42
- successCondition: "The researcher receives at most one optional signal about their own proposition and chooses the next step; no participant data or SomaCheck result enters Prolific, and the recipe creates no filter, study, publication, or spend.",
41
+ starterPrompt: "Review my researcher-owned Prolific [WORKSPACE, PROJECT, OR DRAFT STUDY NAME OR ID] using only minimum study-planning information. Do not retrieve participant-level data or use a SomaCheck result for recruitment, filtering, eligibility, payment, quality, authenticity, or performance. Separate the study facts from your inferences, then help me privately reflect on my own plan or readiness with one optional SomaCheck vibecheck. If you propose a vibecheck, show me the exact first-person proposition and wait for my acceptance. SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Do not create filters or studies, publish, spend money, or write the reading to Prolific.",
42
+ successCondition: "The researcher receives at most one optional signal about their own proposition; no participant data or SomaCheck result enters Prolific, and the recipe creates no filter, study, publication, or spend.",
43
43
  },
44
44
  {
45
45
  id: "maze-research-reflection-v1",
@@ -52,8 +52,8 @@ export const RECIPE_CATALOG = [
52
52
  "The product or integration owner has provisioned an organization-authorized Maze connection or partner sandbox at https://connect.maze.co/mcp; running this recipe does not ask the researcher to sign up, upgrade, administer access, or populate Maze data.",
53
53
  "The provisioned workspace supplies one named existing study with safe metadata or an aggregate summary; if it does not, the Maze half remains untested and the researcher still receives a copy-ready plan.",
54
54
  ],
55
- starterPrompt: "Use Maze and SomaCheck to help me reflect on my own interpretation plan for one named Maze study. I am the researcher and I am holding the phone. The study is [STUDY NAME OR ID PROVIDED BY THE WORKSPACE OWNER]. Use only the preconfigured official hosted read-only Maze MCP at https://connect.maze.co/mcp. Read only that study's safe metadata or one aggregate summary. Do not retrieve transcripts, recordings, heatmaps, click maps, mission answers, participant identifiers, contact fields, demographic exports, free text, or row-level data. Label what Maze literally reports separately from your interpretation, then offer two defensible framings. Offer one short first-person proposition about my own interpretation plan and wait for my acceptance before any proactive SomaCheck ask. Treat Aligned or Unaligned plus confidence as context, not truth, diagnosis, authorization, or evidence about a participant. Ask what I choose and accept any explicit response available in this interface. Keep the proposition, reading, confidence, and confirmation out of Maze. Do not create, edit, publish, delete, archive, export, share, tag, comment, or otherwise write to Maze. If the preconfigured connection or a safe runtime read is absent, label the Maze half untested, return a copy-ready interpretation plan, and tell the integration owner what capability is missing. Do not ask me to sign up, upgrade, administer access, or populate Maze data.",
56
- successCondition: "The researcher receives at most one optional signal about their own proposition and explicitly indicates their choice after a real metadata or aggregate read from a preconfigured workspace; no participant data or SomaCheck output enters Maze, and the Maze workspace remains unchanged.",
55
+ starterPrompt: "Use Maze and SomaCheck to help me reflect on my own interpretation plan for one named Maze study. I am the researcher and I am holding the phone. The study is [STUDY NAME OR ID PROVIDED BY THE WORKSPACE OWNER]. Use only the preconfigured official hosted read-only Maze MCP at https://connect.maze.co/mcp. Read only that study's safe metadata or one aggregate summary. Do not retrieve transcripts, recordings, heatmaps, click maps, mission answers, participant identifiers, contact fields, demographic exports, free text, or row-level data. Label what Maze literally reports separately from your interpretation, then offer two defensible framings. Offer one short first-person proposition about my own interpretation plan and wait for my acceptance before any proactive SomaCheck ask. SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Keep the proposition, reading, confidence, and confirmation out of Maze. Do not create, edit, publish, delete, archive, export, share, tag, comment, or otherwise write to Maze. If the preconfigured connection or a safe runtime read is absent, label the Maze half untested, return a copy-ready interpretation plan, and tell the integration owner what capability is missing. Do not ask me to sign up, upgrade, administer access, or populate Maze data.",
56
+ successCondition: "The researcher receives at most one optional signal about their own proposition after a real metadata or aggregate read from a preconfigured workspace; no participant data or SomaCheck output enters Maze, and the Maze workspace remains unchanged.",
57
57
  },
58
58
  {
59
59
  id: "chattermill-research-reflection-v1",
@@ -66,8 +66,8 @@ export const RECIPE_CATALOG = [
66
66
  "The product or integration owner has provisioned an organization-authorized Chattermill connection or partner sandbox at https://app.chattermill.com/mcp with mcp:read; running this recipe does not ask the researcher to sign up, purchase access, administer access, or populate Chattermill data.",
67
67
  "The provisioned workspace supplies one named existing project for which get_metrics or generate_highlights is sufficient; get_feedback, search_observations, identifier-bearing attributes, and free text remain prohibited.",
68
68
  ],
69
- starterPrompt: "Use Chattermill and SomaCheck to help me reflect on my own interpretation of one named project's customer-feedback insights. I am the researcher and I am holding the phone. The project is [PROJECT NAME OR ID PROVIDED BY THE WORKSPACE OWNER]. Use only the preconfigured official hosted read-only Chattermill MCP at https://app.chattermill.com/mcp. Read only aggregate metrics with get_metrics or generated highlights with generate_highlights, plus the minimum discovery metadata needed to build that query. Never call get_feedback or search_observations, enumerate identifier-bearing attributes, or surface individual feedback, source quotes, respondent identifiers, contact fields, or free text. Label what the aggregate output literally reports separately from your interpretation, then offer two defensible interpretations. Offer one short first-person proposition about my own interpretation or next step and wait for my acceptance before any proactive SomaCheck ask. Treat Aligned or Unaligned plus confidence as context, not truth, diagnosis, authorization, or evidence about an individual customer. Ask what I choose and accept any explicit response available in this interface. Keep the proposition, reading, confidence, and confirmation out of Chattermill. Do not create, edit, publish, delete, share, export, tag, comment, or otherwise write to Chattermill. If the preconfigured connection, mcp:read, or a safe aggregate runtime tool is absent, label the Chattermill half untested, return a copy-ready interpretation, and tell the integration owner what capability is missing. Do not ask me to sign up, purchase access, administer access, or populate Chattermill data.",
70
- successCondition: "The researcher receives at most one optional signal about their own proposition and explicitly indicates their choice after a real aggregate or generated-summary read from a preconfigured workspace; no individual feedback or SomaCheck output enters the cross-MCP flow, and Chattermill remains unchanged.",
69
+ starterPrompt: "Use Chattermill and SomaCheck to help me reflect on my own interpretation of one named project's customer-feedback insights. I am the researcher and I am holding the phone. The project is [PROJECT NAME OR ID PROVIDED BY THE WORKSPACE OWNER]. Use only the preconfigured official hosted read-only Chattermill MCP at https://app.chattermill.com/mcp. Read only aggregate metrics with get_metrics or generated highlights with generate_highlights, plus the minimum discovery metadata needed to build that query. Never call get_feedback or search_observations, enumerate identifier-bearing attributes, or surface individual feedback, source quotes, respondent identifiers, contact fields, or free text. Label what the aggregate output literally reports separately from your interpretation, then offer two defensible interpretations. Offer one short first-person proposition about my own interpretation or next step and wait for my acceptance before any proactive SomaCheck ask. SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Keep the proposition, reading, confidence, and confirmation out of Chattermill. Do not create, edit, publish, delete, share, export, tag, comment, or otherwise write to Chattermill. If the preconfigured connection, mcp:read, or a safe aggregate runtime tool is absent, label the Chattermill half untested, return a copy-ready interpretation, and tell the integration owner what capability is missing. Do not ask me to sign up, purchase access, administer access, or populate Chattermill data.",
70
+ successCondition: "The researcher receives at most one optional signal about their own proposition after a real aggregate or generated-summary read from a preconfigured workspace; no individual feedback or SomaCheck output enters the cross-MCP flow, and Chattermill remains unchanged.",
71
71
  },
72
72
  {
73
73
  id: "user-interviews-research-reflection-v1",
@@ -80,8 +80,8 @@ export const RECIPE_CATALOG = [
80
80
  "The planning workflow requires no User Interviews account or connector because it calls no platform data or action tool.",
81
81
  "For partner integration validation only, the product or integration owner may supply a preconfigured partner sandbox whose runtime capability list can be inspected without invoking a project, recruitment, participant-data, contact, publication, or spend tool; the researcher is never asked to request access or populate platform data.",
82
82
  ],
83
- starterPrompt: "Use User Interviews and SomaCheck to help me prepare one clearly named, participant-free test-project plan without changing User Interviews. I am the researcher and I am holding the phone. The study idea is [STUDY IDEA]. Work only from what I provide here. If a product or integration owner has supplied a preconfigured official User Interviews partner sandbox, you may inspect its capability names and schemas, but do not call any platform data or action tool. The planning workflow does not require me to sign up, request access, purchase a plan, or populate User Interviews data. Do not retrieve candidates, participants, screeners, responses, profiles, identifiers, messages, recordings, transcripts, session data, or other workspace data. Propose two neutral study framings and show the exact signal-free project copy. Then offer one short first-person proposition about my own preferred direction and wait for my acceptance before any proactive SomaCheck ask. Treat Aligned or Unaligned plus confidence as context, not truth, diagnosis, authorization, or evidence about another person. Ask what I choose and accept any explicit response available in this interface. Keep the proposition, reading, confidence, and confirmation out of User Interviews. Return a copy-ready project payload only. Do not create, edit, recruit, invite, message, schedule, screen, launch, publish, attach incentives, spend, read participant data, or call a broader or undocumented tool.",
84
- successCondition: "The researcher receives at most one optional signal about their own proposition and explicitly indicates their choice; the agent returns a copy-ready signal-free test-project plan, invokes no User Interviews data or action tool, and performs no recruitment, participant read, contact, mutation, launch, publication, incentive, payment, or spend.",
83
+ starterPrompt: "Use User Interviews and SomaCheck to help me prepare one clearly named, participant-free test-project plan without changing User Interviews. I am the researcher and I am holding the phone. The study idea is [STUDY IDEA]. Work only from what I provide here. If a product or integration owner has supplied a preconfigured official User Interviews partner sandbox, you may inspect its capability names and schemas, but do not call any platform data or action tool. The planning workflow does not require me to sign up, request access, purchase a plan, or populate User Interviews data. Do not retrieve candidates, participants, screeners, responses, profiles, identifiers, messages, recordings, transcripts, session data, or other workspace data. Propose two neutral study framings and show the exact signal-free project copy. Then offer one short first-person proposition about my own preferred direction and wait for my acceptance before any proactive SomaCheck ask. SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Keep the proposition, reading, confidence, and confirmation out of User Interviews. Return a copy-ready project payload only. Do not create, edit, recruit, invite, message, schedule, screen, launch, publish, attach incentives, spend, read participant data, or call a broader or undocumented tool.",
84
+ successCondition: "The researcher receives at most one optional signal about their own proposition; the agent returns a copy-ready signal-free test-project plan, invokes no User Interviews data or action tool, and performs no recruitment, participant read, contact, mutation, launch, publication, incentive, payment, or spend.",
85
85
  },
86
86
  {
87
87
  id: "sprig-research-reflection-v1",
@@ -94,7 +94,7 @@ export const RECIPE_CATALOG = [
94
94
  "The product or integration owner has provisioned an organization-authorized Sprig connection or partner sandbox; this workflow does not ask the researcher to sign up, upgrade, purchase access, administer access, or populate Sprig data.",
95
95
  "The owner supplies one clearly named, participant-free test artifact and a least-privilege runtime tool that can read only the artifact metadata and question text needed for the review.",
96
96
  ],
97
- starterPrompt: "Use Sprig and SomaCheck to help me privately reflect on one participant-free test artifact supplied by the product or integration owner. I am the researcher and I am holding the phone. The artifact is [TEST ARTIFACT NAME OR ID PROVIDED BY THE OWNER]. Use only the preconfigured Sprig partner sandbox or organization-authorized connection. Read only the minimum artifact metadata and question text needed for this review. Do not retrieve responses, themes, source quotes, respondent fields, identifiers, contact data, or PII. Offer two defensible wording directions, then offer one short first-person proposition about my own direction and wait for my acceptance before any proactive SomaCheck ask. After the check, use only the proposition, Aligned or Unaligned, and confidence together with our conversation context; exercise your judgment about the next conversational move and do not apply a fixed script to either result. I decide what the signal means and what happens next. Keep the proposition, reading, confidence, and confirmation out of Sprig. Return a copy-ready, signal-free revision only. Do not create, edit, publish, delete, share, archive, export, duplicate, target, distribute, launch, contact anyone, or otherwise write to Sprig. If the preconfigured connection or safe read tool is absent, label the Sprig half untested, work only from a participant-free brief I provide, and tell the integration owner what capability is missing. Do not ask me to sign up, upgrade, purchase access, administer access, or populate Sprig data.",
97
+ starterPrompt: "Use Sprig and SomaCheck to help me privately reflect on one participant-free test artifact supplied by the product or integration owner. I am the researcher and I am holding the phone. The artifact is [TEST ARTIFACT NAME OR ID PROVIDED BY THE OWNER]. Use only the preconfigured Sprig partner sandbox or organization-authorized connection. Read only the minimum artifact metadata and question text needed for this review. Do not retrieve responses, themes, source quotes, respondent fields, identifiers, contact data, or PII. Offer two defensible wording directions, then offer one short first-person proposition about my own direction and wait for my acceptance before any proactive SomaCheck ask. SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Keep the proposition, reading, confidence, and confirmation out of Sprig. Return a copy-ready, signal-free revision only. Do not create, edit, publish, delete, share, archive, export, duplicate, target, distribute, launch, contact anyone, or otherwise write to Sprig. If the preconfigured connection or safe read tool is absent, label the Sprig half untested, work only from a participant-free brief I provide, and tell the integration owner what capability is missing. Do not ask me to sign up, upgrade, purchase access, administer access, or populate Sprig data.",
98
98
  successCondition: "The researcher receives at most one optional signal about their own proposition, the agent retains judgment about the next conversational move, and the researcher receives a copy-ready signal-free revision after a narrow read of an owner-supplied participant-free test artifact; no research data or SomaCheck output crosses systems, and Sprig remains unchanged.",
99
99
  },
100
100
  {
@@ -108,8 +108,8 @@ export const RECIPE_CATALOG = [
108
108
  "The product or integration owner has provisioned an organization-authorized Great Question connection or partner sandbox at https://greatquestion.co/api/mcp/v1 with PII hiding enabled; running this recipe does not ask the researcher to sign up, upgrade, purchase, administer access, or populate Great Question data.",
109
109
  "The owner supplies one participant-free test study, and the client restricts the platform half to get_survey_study for that exact artifact; no discovery or mutation tool is approved.",
110
110
  ],
111
- starterPrompt: "Use Great Question and SomaCheck to help me reflect on a five-question test survey plan without changing Great Question. I am the researcher and I am holding the phone. The product or integration owner has provisioned a partner sandbox and named this participant-free test study: [TEST STUDY NAME OR ID]. Read only that study's safe title, purpose, and question structure with get_survey_study. Do not search or list the workspace, and do not read candidates, participants, screeners, responses, sessions, transcripts, recordings, highlights, insights, reels, or other workspace data. Propose two neutral study framings and show their exact questions. Then offer one short first-person proposition about my own preferred framing and wait for my acceptance before any proactive SomaCheck ask. Give the agent the Aligned or Unaligned result plus confidence as context and let it use that context with its judgment. Ask what I choose and accept any explicit response available in this interface. Keep the proposition, reading, confidence, and my confirmation out of Great Question. Return a signal-free, copy-ready research plan only. Do not create, update, delete, recruit, invite, message, schedule, incentivize, launch, publish, or otherwise write to Great Question. Do not ask me to sign up, upgrade, purchase, administer access, or populate Great Question data.",
112
- successCondition: "The researcher receives at most one optional signal, states a choice, and receives a copy-ready five-question plan; only get_survey_study reads the exact owner-supplied test artifact, Great Question remains unchanged, and no recruitment or participant data is accessed.",
111
+ starterPrompt: "Use Great Question and SomaCheck to help me reflect on a five-question test survey plan without changing Great Question. I am the researcher and I am holding the phone. The product or integration owner has provisioned a partner sandbox and named this participant-free test study: [TEST STUDY NAME OR ID]. Read only that study's safe title, purpose, and question structure with get_survey_study. Do not search or list the workspace, and do not read candidates, participants, screeners, responses, sessions, transcripts, recordings, highlights, insights, reels, or other workspace data. Propose two neutral study framings and show their exact questions. Then offer one short first-person proposition about my own preferred framing and wait for my acceptance before any proactive SomaCheck ask. SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Keep the proposition, reading, confidence, and my confirmation out of Great Question. Return a signal-free, copy-ready research plan only. Do not create, update, delete, recruit, invite, message, schedule, incentivize, launch, publish, or otherwise write to Great Question. Do not ask me to sign up, upgrade, purchase, administer access, or populate Great Question data.",
112
+ successCondition: "The researcher receives at most one optional signal and receives a copy-ready five-question plan; only get_survey_study reads the exact owner-supplied test artifact, Great Question remains unchanged, and no recruitment or participant data is accessed.",
113
113
  },
114
114
  {
115
115
  id: "questionpro-research-reflection-v1",
@@ -122,8 +122,8 @@ export const RECIPE_CATALOG = [
122
122
  "A QuestionPro or integration owner supplies a partner-approved sandbox or schema fixture; the researcher is not asked to sign up, upgrade, or populate vendor data.",
123
123
  "Any live discovery is limited to schemas at https://mcp.questionpro.com/surveybuilder, never a root or all-tools endpoint.",
124
124
  ],
125
- starterPrompt: "Use QuestionPro and SomaCheck to help me prepare a four-question, participant-free test-survey plan without changing QuestionPro. I am the researcher and I am holding the phone. The goal is [GOAL]. Work only from what I provide. If a product or integration owner supplied a preconfigured official QuestionPro partner sandbox, inspect only focused Survey Builder capability names and schemas; call no platform data or action tool. Do not ask me to sign up, upgrade, purchase access, administer access, or populate QuestionPro. Show two questionnaire framings, then offer one short first-person proposition about my own direction and wait for my acceptance before a proactive SomaCheck ask. Give Aligned or Unaligned plus confidence to the agent as context and let it use its judgment. Ask what I choose and return the exact signal-free survey definition. Do not create, edit, send, distribute, publish, recruit, launch, access responses, spend, or write the reading to QuestionPro.",
126
- successCondition: "The researcher receives at most one optional signal, states a choice, and receives a copy-ready four-question plan; no QuestionPro data or action tool runs, and partner interoperability remains untested without a partner-owned sandbox.",
125
+ starterPrompt: "Use QuestionPro and SomaCheck to help me prepare a four-question, participant-free test-survey plan without changing QuestionPro. I am the researcher and I am holding the phone. The goal is [GOAL]. Work only from what I provide. If a product or integration owner supplied a preconfigured official QuestionPro partner sandbox, inspect only focused Survey Builder capability names and schemas; call no platform data or action tool. Do not ask me to sign up, upgrade, purchase access, administer access, or populate QuestionPro. Show two questionnaire framings, then offer one short first-person proposition about my own direction and wait for my acceptance before a proactive SomaCheck ask. SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Return the exact signal-free survey definition. Do not create, edit, send, distribute, publish, recruit, launch, access responses, spend, or write the reading to QuestionPro.",
126
+ successCondition: "The researcher receives at most one optional signal and receives a copy-ready four-question plan; no QuestionPro data or action tool runs, and partner interoperability remains untested without a partner-owned sandbox.",
127
127
  },
128
128
  {
129
129
  id: "spotify-listening-reflection-v1",
@@ -136,8 +136,8 @@ export const RECIPE_CATALOG = [
136
136
  "For the Studio pilot, the listener has access to Studio by Spotify Labs; direct third-party MCP attachment is not publicly documented, so the current Kit handoff is manual.",
137
137
  "For automation outside Studio, use the separately reviewed local Spotify companion with an allowlisted Premium account and active device, or Spotify's official Save to Spotify skill for personal talk audio.",
138
138
  ],
139
- starterPrompt: "Kit, suggest one specific track based on my Spotify taste and what is playing, but do not change Spotify. I will ask my SomaCheck-capable companion to send exactly: ‘I want to hear this song next.’ Treat any result I choose to relay only as context—not emotion, cause, instruction, or authorization—and do not remember it as a stable preference. Then ask me whether to play the exact track and wait for my yes. If Kit cannot call SomaCheck directly, label this a manual bridge; do not claim a native MCP integration.",
140
- successCondition: "The listener receives one signal about their own proposition, decides whether to share it, and separately confirms the exact Spotify action; both Aligned and Unaligned stop at the same human choice, with no automatic playback or emotional inference.",
139
+ starterPrompt: "Kit, suggest one specific track based on my Spotify taste and what is playing, but do not change Spotify. I will ask my SomaCheck-capable companion to send exactly: ‘I want to hear this song next.’ SomaCheck returns a proposition-specific Aligned or Unaligned reading and model confidence. Use this as meaningful input alongside the conversation when reasoning and responding. Confidence describes the classifier’s uncertainty. Any Spotify action, including playing the track, requires a separate explicit user approval before it runs. If Kit cannot call SomaCheck directly, label this a manual bridge; do not claim a native MCP integration.",
140
+ successCondition: "The listener receives one signal about their own proposition and may choose whether to act on it; Spotify is not changed without a separate explicit user approval of the exact action, and no automatic playback or emotional inference occurs.",
141
141
  },
142
142
  ];
143
143
  export function getRecipeExperience(id) {