@somacheck/vibecheck 0.6.10 → 0.6.11

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/package.json CHANGED
@@ -1,12 +1,11 @@
1
1
  {
2
2
  "name": "@somacheck/vibecheck",
3
- "version": "0.6.10",
3
+ "version": "0.6.11",
4
4
  "mcpName": "io.github.Sensie-agents/vibecheck",
5
5
  "description": "Send a consented vibecheck to SomaCheck and use the result as a signal.",
6
6
  "repository": {
7
7
  "type": "git",
8
- "url": "git+https://github.com/sensie-app/Somacheck.git",
9
- "directory": "packages/vibecheck"
8
+ "url": "git+https://github.com/Sensie-agents/vibecheck.git"
10
9
  },
11
10
  "type": "module",
12
11
  "bin": {
@@ -18,6 +17,7 @@
18
17
  "files": [
19
18
  "dist/*.js",
20
19
  "SKILL.md",
20
+ "recipes/**",
21
21
  "claude-marketplace/**"
22
22
  ],
23
23
  "scripts": {
@@ -40,7 +40,7 @@
40
40
  "tsx": "^4.23.1",
41
41
  "typescript": "^5.9.3"
42
42
  },
43
- "license": "UNLICENSED",
43
+ "license": "MIT",
44
44
  "publishConfig": {
45
45
  "access": "public"
46
46
  }
@@ -0,0 +1,323 @@
1
+ ---
2
+ title: Chattermill + SomaCheck Research Reflection
3
+ recipe_id: chattermill-research-reflection-v1
4
+ status: P1 researcher-side read-only reflection; aggregate metrics and generated highlights only
5
+ audience: Researchers and CX analysts using Chattermill with an MCP-capable agent
6
+ updated: 2026-09-05
7
+ required_mcp_servers:
8
+ - chattermill
9
+ - vibecheck
10
+ ---
11
+
12
+ # Chattermill + SomaCheck Research Reflection
13
+
14
+ This recipe gives a Chattermill researcher one private SomaCheck check-in while
15
+ shaping the researcher's own interpretation of customer-feedback insights. The
16
+ researcher stays the only person who reads, decides, or acts. The recipe reads
17
+ only aggregate metrics or generated highlights and performs no Chattermill
18
+ write.
19
+
20
+ Chattermill exposes a hosted read-only MCP surface
21
+ (`https://app.chattermill.com/mcp`, Streamable HTTP). Its published OAuth
22
+ protected-resource metadata advertises only the `mcp:read` scope alongside
23
+ `openid profile email offline_access`; there is no write scope, and the server
24
+ is documented as read-only. Existing Chattermill roles and permissions still
25
+ apply, so an agent never sees data the researcher cannot already view.
26
+
27
+ The SomaCheck reading is context for the researcher's own interpretation or
28
+ next step. It is not truth, diagnosis, authorization, evidence about any
29
+ individual customer, or a research decision. The researcher remains the
30
+ authority.
31
+
32
+ ## Capability and access boundary
33
+
34
+ Chattermill documents the hosted MCP as read-only and OAuth 2.1 authenticated
35
+ at `https://app.chattermill.com/mcp`. A product or integration owner provides
36
+ an organization-authorized connection or partner sandbox that can already
37
+ view the named project's aggregate metrics and highlights. The provisioned MCP
38
+ client completes Chattermill's OAuth flow at `auth.chattermill.com`. Running
39
+ this recipe never asks the researcher to sign up, purchase access, administer
40
+ access, or populate Chattermill data.
41
+
42
+ The MCP server's protected-resource metadata advertises `mcp:read` as its only
43
+ MCP scope. There is no write tool in the published contract. If a write
44
+ surface appears at runtime anyway, this recipe still performs no write.
45
+
46
+ This P1 recipe is researcher-side only. Do not use it to:
47
+
48
+ - ask a customer, respondent, employee, candidate, patient, or student to
49
+ complete a SomaCheck;
50
+ - retrieve individual feedback responses, verbatim comments, source quotes,
51
+ respondent identifiers, contact fields, or any free-text feedback;
52
+ - retrieve observation clusters that surface representative verbatim snippets
53
+ or observation identifiers tied to individual feedback;
54
+ - use a reading for customer targeting, eligibility, payment, ranking,
55
+ churn scoring, authenticity, quality, or performance evaluation;
56
+ - write a SomaCheck reading, confidence, gesture, confirmation, or hidden
57
+ score into Chattermill, a dashboard, a tag, a theme, a highlight, an
58
+ insight, or any analytics record; or
59
+ - create, edit, publish, delete, share, export, or otherwise mutate any
60
+ Chattermill project, theme, attribute, metric, dashboard, or insight.
61
+
62
+ Participant- or customer-facing use stays blocked until a `respondent_private`
63
+ architecture prevents researcher or platform access to individual readings,
64
+ methodology and ethics review is complete, and Sensie gives explicit
65
+ privacy/legal approval. Chattermill MCP access, read-only scope, or participant
66
+ consent alone does not satisfy these gates.
67
+
68
+ ## Experience a researcher can run
69
+
70
+ The researcher holds the phone and selects one existing Chattermill project
71
+ supplied by the workspace owner, then provides one research question. The agent
72
+ reads only that project's aggregate metrics (`get_metrics`) or generated
73
+ highlights (`generate_highlights`), plus the discovery metadata needed to build
74
+ the query (`list_themes`, `list_attributes`, `search_attributes`,
75
+ `list_metric_options`). It never calls `get_feedback` (individual responses)
76
+ or `search_observations` (observation identifiers and representative verbatim
77
+ snippets), and never surfaces individual feedback, source quotes, respondent
78
+ identifiers, or free text. The agent offers two defensible interpretations of
79
+ what the aggregate signal suggests, then one short first-person proposition
80
+ about the researcher's own interpretation or next step. After the researcher's
81
+ typed choice, the agent stops. There is no Chattermill write.
82
+
83
+ ## Starter prompt
84
+
85
+ ```text
86
+ Use Chattermill and SomaCheck to help me reflect on my own interpretation of
87
+ customer-feedback insights for one named Chattermill project. I am the
88
+ researcher and I am holding the phone. The project is:
89
+ [PROJECT NAME OR ID PROVIDED BY THE WORKSPACE OWNER]. Use only the
90
+ preconfigured official hosted read-only Chattermill MCP at
91
+ https://app.chattermill.com/mcp. Read only aggregate metrics (get_metrics) or
92
+ generated highlights (generate_highlights), plus discovery metadata
93
+ (list_themes, list_attributes, search_attributes, list_metric_options) needed
94
+ to build the query. Never call get_feedback or search_observations. Never
95
+ surface individual feedback, source quotes, respondent identifiers, contact
96
+ fields, or free text. Propose two defensible interpretations of what the
97
+ aggregate signal suggests, with the tradeoff for each. Then offer one short
98
+ first-person proposition about my own interpretation or next step and wait
99
+ for my acceptance before any proactive SomaCheck ask. Treat Aligned or
100
+ Unaligned plus confidence as context, not truth, diagnosis, authorization, or
101
+ evidence about any individual customer. Ask what I choose in words. Keep the
102
+ proposition, reading, confidence, and my confirmation out of Chattermill. Do
103
+ not write to Chattermill; the hosted MCP is read-only. If the preconfigured
104
+ connection, mcp:read, or a safe aggregate tool is absent, return the copy-ready
105
+ interpretation and tell the integration owner what capability is missing. Do
106
+ not ask me to sign up, purchase access, administer access, or populate
107
+ Chattermill data.
108
+ ```
109
+
110
+ ## Prerequisites and account access
111
+
112
+ 1. The researcher can complete a normal SomaCheck request through the connected
113
+ `vibecheck` MCP server (`request_vibecheck` and
114
+ `get_vibecheck_result`).
115
+ 2. A product or integration owner has provisioned an authorized organization
116
+ connection or partner sandbox that can already view the named project's
117
+ aggregate metrics and highlights. Existing Chattermill roles and permissions
118
+ apply; the MCP grants no access beyond the provisioned workspace.
119
+ 3. The provisioned MCP client is connected to exactly
120
+ `https://app.chattermill.com/mcp` and authenticated through the OAuth 2.1
121
+ flow Chattermill publishes at `auth.chattermill.com`. Do not substitute a
122
+ different host, path, or non-Chattermill endpoint.
123
+ 4. The workspace owner supplies one named existing Chattermill project (by name
124
+ or ID) whose aggregate metrics or generated highlights are enough for the
125
+ reflection task, with no need for individual responses or verbatim comments.
126
+ The researcher is not responsible for creating or populating it.
127
+ 5. No credential, OAuth token, API key, project ID containing PII, or
128
+ respondent identifier appears in chat, logs, prompts, or the SomaCheck
129
+ proposition.
130
+
131
+ ## Chattermill tool policy
132
+
133
+ Chattermill publishes a hosted, read-only MCP (`mcp:read` scope). It documents
134
+ eight tools in two groups: discovery tools and data tools. The agent must
135
+ inspect the live tool list at runtime and use only the smallest tools that
136
+ return aggregate or generated output. Treat the live schemas as
137
+ runtime-discovered; do not assume undocumented tool names.
138
+
139
+ | Purpose | Allowed surface | Rule |
140
+ | --- | --- | --- |
141
+ | Discover theme/category names | `list_themes` | Metadata only; names configured in the project, never feedback content |
142
+ | Discover filterable attributes | `list_attributes` | Metadata only; attribute names, never feedback values |
143
+ | Discover valid filter values | `search_attributes` | Metadata only for segment attributes (country, product, data source); never enumerate an identifier-bearing attribute such as email or customer ID |
144
+ | Discover metric options | `list_metric_options` | Metadata only; chart types, metrics, frequencies, breakdown options |
145
+ | Read aggregate quantitative data | `get_metrics` | Aggregate NPS, sentiment, volume, or trend metrics only |
146
+ | Read generated highlights | `generate_highlights` | AI-generated summary of themes, issues, or trends only |
147
+ | Read individual feedback responses | `get_feedback` | Prohibited in this recipe |
148
+ | Search observation clusters with snippets | `search_observations` | Prohibited in this recipe; returns observation identifiers and representative verbatim snippets |
149
+ | Any create, edit, publish, delete, share, export, or mutation | any write or mutation tool | Prohibited in this recipe |
150
+ | Private reflection | `request_vibecheck`, optional `get_vibecheck_result` | One decision, one request, one stable pending handle |
151
+
152
+ Do not broaden a connection to a root or all-tools endpoint to make this
153
+ recipe work. If the runtime does not expose `get_metrics` or
154
+ `generate_highlights`, label the Chattermill half untested and stop.
155
+
156
+ ## Exact cross-MCP workflow
157
+
158
+ 1. **Confirm the subject and scope.** State that the researcher is the phone
159
+ holder and the subject of the proposition. Name the one existing Chattermill
160
+ project supplied by the workspace owner (by name or ID) and the research
161
+ question.
162
+ 2. **Verify access honestly.** Confirm the client is connected to exactly
163
+ `https://app.chattermill.com/mcp` through Chattermill's OAuth flow and
164
+ that the `mcp:read` scope is present. Do not claim a live pass on
165
+ documentation, a fixture, or a connection that lacks the read scope.
166
+ 3. **Read only aggregate or generated output.** Call `get_metrics` or
167
+ `generate_highlights`, using discovery metadata (`list_themes`,
168
+ `list_attributes`, `search_attributes`, `list_metric_options`) only to
169
+ build the query. Do not call `get_feedback` or `search_observations`, and
170
+ do not surface individual feedback, source quotes, respondent identifiers,
171
+ contact fields, or free text.
172
+ 4. **Separate evidence from interpretation.** Label what the aggregate
173
+ metrics or highlights literally contain, what the agent infers, and what
174
+ the researcher's own judgment must still decide.
175
+ 5. **Propose two interpretations.** Offer two defensible interpretations of
176
+ what the aggregate signal suggests, with the tradeoff for each.
177
+ 6. **Choose one first-person proposition.** It must be short, first-person,
178
+ and about the researcher's own interpretation or next step. Do not include
179
+ project IDs containing PII, individual feedback, source quotes,
180
+ respondent identifiers, contact fields, or free text.
181
+ 7. **Establish one-ask consent.** If the researcher explicitly requested a
182
+ SomaCheck check-in in the current message, use
183
+ `consent_basis: "user_requested_vibecheck"`. Otherwise show the exact
184
+ proposition, wait for acceptance, and use
185
+ `consent_basis: "user_approved_statement"`.
186
+ 8. **Request once.** Call `request_vibecheck` with the approved statement and
187
+ a fresh UUID `idempotency_key`. Reuse it only to retry the identical
188
+ request after an ambiguous create failure.
189
+ 9. **Handle the real lifecycle.** A terminal response from
190
+ `request_vibecheck` uses `state: "completed"`; a later read uses
191
+ `status: "answered"`. If the initial response is `pending`, retain the
192
+ returned `live:<uuid>` handle and call `get_vibecheck_result` with it once
193
+ later. If it is still `pending`, `expired`, `cancelled`, or errors,
194
+ continue without a result. Never issue a replacement ask.
195
+ 10. **Return authority.** Separate observation (a valid gesture was
196
+ captured), interpretation (`aligned` or `unaligned` plus model
197
+ confidence), confirmation (what the researcher says), and choice (what the
198
+ researcher decides). `unaligned` may indicate possible inner conflict
199
+ relative to the proposition; it does not name a cause, choose an
200
+ interpretation, or justify a research claim.
201
+ 11. **Ask for words.** Ask the researcher which interpretation they choose,
202
+ whether they want a third option, or whether they want to stop. Follow
203
+ their typed choice.
204
+ 12. **Keep the signal out of Chattermill.** Do not call any write, mutation,
205
+ export, tag, theme, highlight, insight, or analytics tool. Do not store
206
+ the proposition, reading, confidence, confirmation, or gesture metadata
207
+ in Chattermill.
208
+ 13. **End the test.** Report the exact Chattermill tool names used and the
209
+ exact aggregate or generated fields returned, or report the copy-ready
210
+ interpretation when the Chattermill half is untested. Do not create,
211
+ edit, publish, delete, share, or export any Chattermill object.
212
+
213
+ ## Proposition examples
214
+
215
+ Allowed:
216
+
217
+ - "I can interpret this aggregate signal without reading individual
218
+ feedback."
219
+ - "I have a clear reading of what these aggregate metrics suggest."
220
+ - "I am ready to act on generated highlights without opening verbatim
221
+ comments."
222
+ - "I want to keep individual responses out of my interpretation."
223
+ - "I can state what this trend does and does not show."
224
+
225
+ Not allowed:
226
+
227
+ - "This customer is telling the truth."
228
+ - "These respondents are engaged."
229
+ - "This feedback proves the feature is broken."
230
+ - "This customer should be flagged or deprioritized."
231
+ - "This aggregate metric validates my hypothesis."
232
+
233
+ ## Visible success condition
234
+
235
+ The test passes when:
236
+
237
+ - the researcher selects one existing Chattermill project supplied by a
238
+ workspace owner whose provisioned connection can view its aggregate metrics
239
+ and highlights;
240
+ - the agent reads only aggregate metrics (`get_metrics`) or generated
241
+ highlights (`generate_highlights`) through the hosted read-only
242
+ Chattermill MCP and reports the exact tool names used;
243
+ - the agent never calls `get_feedback` or `search_observations`, and never
244
+ surfaces individual feedback, source quotes, respondent identifiers,
245
+ contact fields, or free text;
246
+ - the researcher receives at most one optional SomaCheck check-in on their
247
+ phone on an exact first-person proposition about their own interpretation or
248
+ next step;
249
+ - the agent presents the result as context, asks the researcher to state their
250
+ choice in words, and follows the typed choice;
251
+ - the agent makes no Chattermill write, mutation, export, share, tag,
252
+ comment, or analytics call; and
253
+ - no individual customer, respondent, or employee data enters the cross-MCP
254
+ flow.
255
+
256
+ ## Failure and degraded paths
257
+
258
+ - **Read scope absent or OAuth failure:** Report the missing capability to the
259
+ product or integration owner; never request a token or API key in chat or ask
260
+ the researcher to sign up, purchase access, or administer access. Label the
261
+ Chattermill half untested, return the copy-ready interpretation, and stop.
262
+ - **Runtime exposes only individual-response or observation tools:** Do not
263
+ call them. Label the Chattermill half untested and stop. Do not broaden
264
+ the connection to make this recipe work.
265
+ - **MCP returns individual feedback, source quotes, respondent identifiers,
266
+ contact fields, or free text:** Stop immediately. Discard the individual
267
+ content from the agent context. Report the exact fields received and ask the
268
+ product or integration owner to revoke or limit the scope. Do not use the
269
+ individual content in any proposition, framing, or interpretation.
270
+ - **SomaCheck unresolved:** Use the same `live:<uuid>` handle once later,
271
+ then proceed without a reading if still unresolved.
272
+ - **Unreadable capture:** Offer a retry only if the researcher wants it;
273
+ unreadable is not a third interpretation.
274
+ - **Researcher disagrees with the reading:** Follow the researcher's typed
275
+ choice without reconciliation or repetition.
276
+
277
+ ## Privacy boundary
278
+
279
+ - Raw phone motion never reaches Chattermill or the agent.
280
+ - Chattermill receives no proposition, reading, confidence, confirmation,
281
+ gesture metadata, or SomaCheck output through this recipe.
282
+ - SomaCheck receives no Chattermill project ID containing PII, individual
283
+ feedback, source quote, respondent identifier, contact field, free-text
284
+ comment, or verbatim response.
285
+ - No individual customer, respondent, or employee data is read into the agent
286
+ conversation, prompt, proposition, framing, or memory.
287
+ - The Chattermill project remains unchanged. No write, mutation, export,
288
+ share, tag, comment, insight, or analytics call occurs.
289
+
290
+ ## Test checklist
291
+
292
+ - [ ] The researcher is the phone holder and the subject of the proposition.
293
+ - [ ] The client is connected to exactly `https://app.chattermill.com/mcp`
294
+ through Chattermill's OAuth 2.1 flow; no other host, path, or
295
+ non-Chattermill endpoint is used.
296
+ - [ ] The `mcp:read` scope is present and no write scope is assumed.
297
+ - [ ] No Chattermill credential, OAuth token, or API key appears in chat,
298
+ logs, or the SomaCheck proposition.
299
+ - [ ] The agent reads only `get_metrics` or `generate_highlights`, using
300
+ discovery metadata only to build the query, and reports the exact
301
+ runtime tool names used.
302
+ - [ ] The agent does not call `get_feedback` or `search_observations`.
303
+ - [ ] No individual feedback, source quote, respondent identifier, contact
304
+ field, or free text appears in the conversation, proposition, or
305
+ interpretation.
306
+ - [ ] The proposition is first-person and contains no Chattermill content.
307
+ - [ ] At most one SomaCheck request is created for the choice.
308
+ - [ ] Observation, interpretation, confirmation, and choice remain separate.
309
+ - [ ] The researcher states a choice in words and the agent follows the typed choice.
310
+ - [ ] The agent makes no Chattermill write, mutation, export, share, tag,
311
+ comment, or analytics call.
312
+ - [ ] No individual customer, respondent, or employee data enters the
313
+ cross-MCP flow.
314
+
315
+ ## Sources
316
+
317
+ - [Chattermill MCP server guide](https://docs.chattermill.com/en/articles/13943134-chattermill-mcp-server)
318
+ - [Chattermill MCP endpoint](https://app.chattermill.com/mcp)
319
+ - [Chattermill MCP protected-resource metadata](https://app.chattermill.com/.well-known/oauth-protected-resource/mcp)
320
+ - [Chattermill MCP authorization-server metadata](https://app.chattermill.com/.well-known/oauth-authorization-server)
321
+ - [SomaCheck MCP setup and tool behavior](../README.md)
322
+ - [SomaCheck immediate-request contract](../LIVE-ASK-CONTRACT.md)
323
+ - [MCP Customer-Testable Experience Catalog](../../../docs/agent-adoption/customer-experience-catalog.md)
@@ -0,0 +1,204 @@
1
+ ---
2
+ title: Dovetail + SomaCheck Research Reflection
3
+ recipe_id: dovetail-research-reflection-v1
4
+ status: P1 researcher-side only
5
+ audience: Researchers using Dovetail with an MCP-capable agent
6
+ updated: 2026-09-03
7
+ required_mcp_servers:
8
+ - dovetail
9
+ - vibecheck
10
+ ---
11
+
12
+ # Dovetail + SomaCheck Research Reflection
13
+
14
+ Use this recipe when a researcher wants a private, consented signal about their
15
+ own response to research work held in Dovetail. It supports reflection on
16
+ question wording, study design, and evidence interpretation. It does not assess
17
+ participants and does not add SomaCheck readings to the research record.
18
+
19
+ The reading is context for the researcher. It is not truth, a diagnosis,
20
+ authorization, evidence about a participant, or a research decision. The
21
+ researcher remains the authority.
22
+
23
+ ## Launch boundary
24
+
25
+ This P1 recipe is **researcher-side only**. The person holding the phone and
26
+ receiving the SomaCheck result must be the researcher interacting with the
27
+ agent.
28
+
29
+ Do not use this recipe to:
30
+
31
+ - ask a participant or employee to complete a SomaCheck;
32
+ - read, infer, compare, rank, monitor, or gate a participant;
33
+ - export a participant reading, confidence, or confirmation into Dovetail;
34
+ - tag, score, or characterize a transcript, highlight, contact, response, or
35
+ participant using a SomaCheck result;
36
+ - decide eligibility, compensation, research quality, truthfulness, or whether
37
+ evidence should be included; or
38
+ - run a live respondent workflow.
39
+
40
+ Participant-facing use stays blocked until a `respondent_private` architecture
41
+ technically prevents researcher or platform access to individual readings, a
42
+ methodology and ethics review is complete, and Mike gives explicit approval.
43
+ Documentation or workspace access is not approval to cross this boundary.
44
+
45
+ ## Prerequisites
46
+
47
+ 1. The researcher has linked the `vibecheck` MCP server to their own SomaCheck
48
+ account and can see `request_vibecheck` and `get_vibecheck_result`.
49
+ 2. The agent has the Dovetail MCP connection authorized by the researcher. Use
50
+ Dovetail's hosted endpoint, `https://dovetail.com/api/mcp`, or its documented
51
+ self-hosted server. Keep API tokens in the MCP client's secret configuration,
52
+ never in prompts, propositions, comments, or logs.
53
+ 3. The researcher names the exact Dovetail doc in scope. Access to a workspace
54
+ is not consent to search the whole workspace.
55
+ 4. The source is allowlisted: a researcher-authored research brief, discussion
56
+ guide, study plan, or de-identified researcher-authored synthesis.
57
+
58
+ Never open raw interviews, transcripts, recordings, highlights, channel data,
59
+ contacts, participant identifiers, or participant-authored responses for this
60
+ recipe. If the selected Dovetail artifact mixes allowed planning material with
61
+ participant content, stop and ask for a researcher-authored, de-identified
62
+ summary.
63
+
64
+ ## Dovetail tool policy
65
+
66
+ Use the smallest read scope that answers the researcher's request.
67
+
68
+ | Purpose | Dovetail MCP tools | Rule |
69
+ | --- | --- | --- |
70
+ | Locate the named planning artifact | `get_doc`, or `list_docs` only when the researcher supplied a title rather than an ID | Use `get_doc` directly for a researcher-supplied ID. Do not list the workspace or search content when the ID is already known. |
71
+ | Read the planning artifact | `get_doc_content` | Read only an allowlisted researcher-authored doc. |
72
+ | Record a chosen next step | `create_comment` | Optional; call only after the researcher explicitly approves the exact comment. Never include the reading or confidence. |
73
+ | Broad or participant-bearing content | `search_workspace`, project-data, highlight, channel, contact, and file-download tools | Do not call in this recipe. |
74
+ | Other writes | project, folder, doc, data, tag, upload, and import creation tools | Not part of this recipe. Require a separate, explicit user request. |
75
+
76
+ ## Exact cross-MCP workflow
77
+
78
+ Follow these steps in order. Never call Dovetail and SomaCheck in a way that
79
+ makes the reading an automatic write condition.
80
+
81
+ 1. **Confirm the subject and scope.** State that the researcher is reflecting
82
+ on their own response. Name the one Dovetail doc to read.
83
+ 2. **Retrieve only the approved artifact.** If the researcher supplied a doc ID,
84
+ resolve it directly with `get_doc`. If they supplied only a title, use
85
+ `list_docs` to match that exact title, then resolve it with `get_doc`. Read the
86
+ approved doc with `get_doc_content`. Do not call `search_workspace`. Stop if
87
+ the doc contains participant-authored or identifying material.
88
+ 3. **Separate evidence from interpretation.** Summarize:
89
+ - what the planning artifact literally says;
90
+ - what the agent infers may need attention; and
91
+ - two or more reasonable options the researcher could choose.
92
+ 4. **Choose one first-person proposition.** It must express the researcher's
93
+ present experience or choice, not a claim about participants. Do not place
94
+ Dovetail content, participant text, names, project identifiers, or secrets in
95
+ the proposition.
96
+ 5. **Establish one-ask consent.** If the researcher explicitly asked for a
97
+ SomaCheck vibecheck in the current message, call `request_vibecheck` with
98
+ `consent_basis: "user_requested_vibecheck"`. Otherwise show the exact
99
+ proposition, wait for acceptance, and use
100
+ `consent_basis: "user_approved_statement"`.
101
+ 6. **Request once.** Call `request_vibecheck` with the approved statement and a
102
+ fresh UUID as `idempotency_key`. Reuse that UUID only to retry the same
103
+ statement after an ambiguous create failure. Never repeat an ask to seek a
104
+ preferred result.
105
+ 7. **Handle the exact result.** `request_vibecheck` reports a terminal answer as
106
+ `state: "completed"`; a later `get_vibecheck_result` read reports the same
107
+ lifecycle point as `status: "answered"`. Treat either as the terminal result
108
+ and keep four layers distinct: observation (a valid gesture was captured),
109
+ interpretation (`aligned` or `unaligned` plus model confidence), confirmation
110
+ (what the researcher says), and choice (what the researcher decides).
111
+ `unaligned` means possible inner conflict relative to the proposition; it
112
+ does not identify a cause. If the initial response is `pending`, retain its
113
+ `live:<uuid>` handle and call `get_vibecheck_result` with that exact handle
114
+ once later. Do not create a replacement request. If that read is still
115
+ `pending`, is `expired` or `cancelled`, or errors, continue without a result;
116
+ do not infer one or start another request.
117
+ 8. **Return authority.** Offer the options to revise, investigate, proceed,
118
+ pause, or leave the artifact unchanged. A typed researcher choice overrides
119
+ the signal.
120
+ 9. **Keep the signal private.** Do not write the verdict, confidence, gesture,
121
+ or confirmation to Dovetail. If the researcher asks to record a next step,
122
+ show a signal-free comment first and call `create_comment` only after exact
123
+ approval.
124
+
125
+ ## Proposition examples
126
+
127
+ Good propositions are short, first-person, and about the researcher:
128
+
129
+ - “I can explain why this question asks one thing at a time.”
130
+ - “I want to use this discussion guide in its current form.”
131
+ - “My interpretation separates what participants said from what I inferred.”
132
+ - “I am ready to treat this synthesis as one input to the next design choice.”
133
+ - “I want to investigate a competing explanation before I proceed.”
134
+
135
+ Never send propositions such as:
136
+
137
+ - “This participant is telling the truth.”
138
+ - “This transcript is high quality.”
139
+ - “These users support the conclusion.”
140
+ - “This employee is aligned with the company.”
141
+
142
+ ## Trigger and anti-trigger rules
143
+
144
+ Trigger this recipe when the researcher explicitly asks to reflect with
145
+ SomaCheck. The agent may also **offer** one check when the researcher is choosing
146
+ between defensible question phrasings, sees tension between evidence and an
147
+ interpretation, or says that something in the design feels off but is hard to
148
+ name. An offer must include the exact proposition and must not call the tool
149
+ until accepted.
150
+
151
+ Do not trigger when:
152
+
153
+ - the task is ordinary Dovetail retrieval, summarization, tagging, or export;
154
+ - the proposed subject is anyone other than the researcher;
155
+ - the source contains raw or identifiable participant material;
156
+ - the researcher has already made a clear typed choice;
157
+ - the result would determine inclusion, quality, compensation, performance, or
158
+ another consequential outcome; or
159
+ - a vibecheck was already used for the same decision.
160
+
161
+ ## Consent, privacy, and failure behavior
162
+
163
+ Linking the MCP servers is setup, not blanket consent. A proactive check always
164
+ requires acceptance of its exact wording. Never send raw conversations,
165
+ Dovetail text, participant data, identifiers, secrets, or diagnostic claims to
166
+ SomaCheck. Raw phone motion never goes to the agent or Dovetail.
167
+
168
+ If Dovetail authorization fails, ask the researcher to repair the connection;
169
+ never request that they paste a token. If the document's provenance or
170
+ de-identification is unclear, stop before reading it. If SomaCheck reports an
171
+ unreadable capture, request a retry only if the researcher wants one; unreadable
172
+ is not a third interpretation. If the request expires, is cancelled, or errors,
173
+ continue without a reading. Never infer a result. If the result and the
174
+ researcher's words differ, follow the researcher's words and preserve the
175
+ difference rather than reconciling it into a score.
176
+
177
+ ## Verification checklist
178
+
179
+ - [ ] Both MCP servers expose their expected tools; no credential appears in
180
+ chat or logs.
181
+ - [ ] The agent names one researcher-authored, participant-free Dovetail doc.
182
+ - [ ] Broad search and disallowed Dovetail data, highlight, channel, contact,
183
+ and download tools are not called.
184
+ - [ ] The proposition is first-person and contains no Dovetail or participant
185
+ content.
186
+ - [ ] A proactive ask waits for acceptance; an explicit user request does not
187
+ add a redundant consent prompt.
188
+ - [ ] One decision creates at most one `request_vibecheck` request and preserves
189
+ its stable pending handle.
190
+ - [ ] The response distinguishes observation, interpretation, confirmation, and
191
+ choice.
192
+ - [ ] No reading, confidence, confirmation, or participant inference is written
193
+ to Dovetail.
194
+ - [ ] Any Dovetail comment contains only the researcher's explicitly approved,
195
+ signal-free next step.
196
+ - [ ] Participant-facing behavior remains blocked by the `respondent_private`,
197
+ methodology/ethics, and Mike-approval gates.
198
+
199
+ ## Sources
200
+
201
+ - [Dovetail MCP server documentation](https://developers.dovetail.com/docs/mcp)
202
+ - [Dovetail API overview](https://docs.dovetail.com/integrations/dovetail-api)
203
+ - [SomaCheck MCP setup and tool behavior](../README.md)
204
+ - [SomaCheck immediate-request contract](../LIVE-ASK-CONTRACT.md)