@somacheck/vibecheck 0.6.10 → 0.6.12

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.
@@ -0,0 +1,151 @@
1
+ ---
2
+ title: QuestionPro + SomaCheck Research Reflection
3
+ recipe_id: questionpro-research-reflection-v1
4
+ status: P1 researcher-private partner-sandbox template
5
+ audience: Researchers evaluating a QuestionPro partnership workflow
6
+ updated: 2026-09-05
7
+ required_mcp_servers:
8
+ - questionpro-surveybuilder
9
+ - vibecheck
10
+ ---
11
+
12
+ # QuestionPro + SomaCheck Research Reflection
13
+
14
+ This recipe helps a researcher privately compare two questionnaire framings and
15
+ produce a copy-ready, non-distributed survey definition. It is not a request for
16
+ the researcher to become a QuestionPro customer or populate a personal account.
17
+ The QuestionPro half is inspected only when a product or integration owner has
18
+ provided a partner-approved sandbox with no participant data.
19
+
20
+ The researcher holds the phone and is the subject of the proposition. SomaCheck
21
+ returns Aligned or Unaligned plus confidence to the agent as context. The agent
22
+ uses its judgment; the reading is not truth, diagnosis, authorization, evidence
23
+ about a respondent, or a research decision. The researcher remains the authority.
24
+
25
+ ## Experience a partner team can evaluate
26
+
27
+ The researcher supplies a participant-free survey goal. The agent drafts two
28
+ four-question versions and may offer one SomaCheck check-in on the researcher's
29
+ own preferred direction. The researcher then chooses in words. The output is a
30
+ signal-free survey definition for a QuestionPro owner to review. This recipe
31
+ does not create, publish, distribute, or populate a survey.
32
+
33
+ ## Starter prompt
34
+
35
+ ```text
36
+ Use QuestionPro and SomaCheck to help me prepare a four-question, participant-free
37
+ test-survey plan without changing QuestionPro. I am the researcher and I am
38
+ holding the phone. The survey goal is [GOAL]. Work only from what I provide. If a
39
+ product or integration owner has supplied a preconfigured official QuestionPro
40
+ partner sandbox, you may inspect the focused Survey Builder capability names and
41
+ schemas, but do not call a platform data or action tool. Do not ask me to sign up,
42
+ upgrade, buy a plan, administer access, or populate QuestionPro data. Propose two
43
+ questionnaire framings and show the exact questions. Then offer one short
44
+ first-person proposition about my own preferred direction and wait for my
45
+ acceptance before any proactive SomaCheck ask. Give the result and confidence to
46
+ the agent as context and let it use its judgment. Ask what I choose in words.
47
+ Keep the proposition, reading, confidence, and confirmation out of QuestionPro.
48
+ Return a copy-ready, signal-free survey definition only. Do not create, edit,
49
+ send, distribute, publish, recruit, launch, access responses, or spend anything.
50
+ ```
51
+
52
+ ## Prerequisites and partner access
53
+
54
+ 1. The researcher supplies a participant-free goal and holds the linked
55
+ SomaCheck phone.
56
+ 2. QuestionPro or the integration owner supplies a partner-approved sandbox or
57
+ schema fixture. The recipe never asks the researcher to open or fund an
58
+ ordinary customer account.
59
+ 3. If live discovery is authorized, use only the focused endpoint
60
+ `https://mcp.questionpro.com/surveybuilder`, not the root, `/all`, or `/full`
61
+ surface.
62
+ 4. Inspect capability names and schemas only. Do not call create, read, send,
63
+ audience, response, poll, community, employee, or other platform tools.
64
+ 5. If no partner sandbox or safe schema fixture exists, label the QuestionPro
65
+ half untested and still return the copy-ready plan.
66
+
67
+ ## Exact workflow
68
+
69
+ 1. Confirm that the researcher is the phone holder and proposition subject.
70
+ 2. Draft two four-question variants using only the supplied brief.
71
+ 3. Offer one concise first-person proposition about the researcher's direction.
72
+ 4. If the researcher explicitly asks for a vibecheck, use
73
+ `consent_basis: "user_requested_vibecheck"`. Otherwise wait for acceptance
74
+ and use `consent_basis: "user_approved_statement"`.
75
+ 5. Use one fresh UUID idempotency key and retain the same request handle while
76
+ pending. Never create a second request to replace an unresolved one.
77
+ 6. Give the proposition, Aligned or Unaligned result, and confidence to the
78
+ agent. Let the agent use its judgment in context without treating the result
79
+ as authorization or a claim about respondents.
80
+ 7. Ask what the researcher chooses in words. Their choice controls the plan.
81
+ 8. Return a copy-ready payload with title, purpose, questions, answer choices,
82
+ and optional logic. Exclude all SomaCheck data and platform identifiers.
83
+ 9. Stop before any QuestionPro data or action call. A partner owner may review
84
+ the payload separately in its own governed workflow.
85
+
86
+ ## Proposition examples
87
+
88
+ Allowed:
89
+
90
+ - “I want this survey to focus on first-use clarity.”
91
+ - “This question asks what I am trying to learn.”
92
+ - “I want to separate usability from perceived value.”
93
+
94
+ Not allowed:
95
+
96
+ - “Respondents will understand this survey.”
97
+ - “This employee's response proves commitment.”
98
+ - “These answers will be truthful.”
99
+ - “This survey will produce valid data.”
100
+
101
+ ## Visible success condition
102
+
103
+ The recipe passes when the researcher receives at most one optional check-in,
104
+ states a choice, and receives a four-question, signal-free survey definition.
105
+ No QuestionPro data or action tool runs. Partner integration and distribution
106
+ remain unproven until QuestionPro supplies a sandbox and a documented path that
107
+ another non-Sensie customer can discover, authorize, use, and revoke.
108
+
109
+ ## Failure and degraded paths
110
+
111
+ - **No partner sandbox:** return the copy-ready plan and label platform
112
+ interoperability untested. Do not ask the researcher to sign up or upgrade.
113
+ - **Only a broad server is available:** stop rather than connect root, `/all`,
114
+ `/full`, response, send, audience, community, poll, or employee surfaces.
115
+ - **SomaCheck remains pending:** retain the handle and continue without a result
116
+ if it expires or is cancelled. Do not create a replacement request.
117
+ - **Unreadable capture:** offer a retry only if the researcher wants one.
118
+ - **The researcher's words differ from the reading:** follow their words.
119
+
120
+ ## Privacy boundary
121
+
122
+ - Raw motion never reaches QuestionPro or the agent.
123
+ - QuestionPro receives no proposition, reading, confidence, confirmation, or
124
+ gesture metadata.
125
+ - SomaCheck receives no QuestionPro questions, responses, respondent records,
126
+ survey IDs, credentials, or hidden fields.
127
+ - No participant-bearing or platform action tool is called.
128
+
129
+ ## Test checklist
130
+
131
+ - [ ] The researcher is the phone holder and proposition subject.
132
+ - [ ] Any QuestionPro surface was supplied by a partner owner, not purchased or
133
+ populated for this test.
134
+ - [ ] Live access, if present, is limited to schema discovery on the focused
135
+ `/surveybuilder` endpoint.
136
+ - [ ] No existing responses, analytics, respondents, audiences, employees, or
137
+ workspace data are retrieved.
138
+ - [ ] One decision creates at most one SomaCheck request.
139
+ - [ ] The agent receives Aligned or Unaligned plus confidence and retains
140
+ judgment; the researcher retains authority.
141
+ - [ ] The output contains four signal-free questions and no platform write.
142
+ - [ ] No SomaCheck output is written to QuestionPro.
143
+
144
+ ## Sources
145
+
146
+ - [QuestionPro MCP overview and capability catalog](https://www.questionpro.com/headless/)
147
+ - [QuestionPro MCP connector setup and focused server list](https://www.questionpro.com/help/mcp-help-file.html)
148
+ - [QuestionPro Survey Results tools, excluded from this recipe](https://www.questionpro.com/headless/survey-results/)
149
+ - [QuestionPro LivePolls tools, excluded from this recipe](https://www.questionpro.com/headless/livepolls/)
150
+ - [SomaCheck MCP setup and tool behavior](../README.md)
151
+ - [SomaCheck immediate-request contract](../LIVE-ASK-CONTRACT.md)
@@ -0,0 +1,459 @@
1
+ ---
2
+ title: Spotify + SomaCheck Listening Reflection
3
+ recipe_id: spotify-listening-reflection-v1
4
+ status: P0 Studio/Kit manual pilot plus MCP fallback; direct attachment gated
5
+ audience: Studio research-preview users (Premium, 18+, select markets, usage limits apply) with a SomaCheck-capable companion agent
6
+ updated: 2026-09-03
7
+ required_mcp_servers:
8
+ - vibecheck
9
+ partner_paths:
10
+ - Studio/Kit manual bridge; not an installable MCP server
11
+ - Spotify first-party Claude integration after capability probe
12
+ - Reviewed Spotify Web API companion adapter; not a public Spotify MCP server
13
+ ---
14
+
15
+ # Spotify + SomaCheck Listening Reflection
16
+
17
+ Use this recipe when a person wants Kit in Studio by Spotify Labs to suggest a
18
+ specific track, then wants one private, consented SomaCheck signal before
19
+ deciding whether Kit should play it. The person experiences one complete loop:
20
+ Kit proposes, SomaCheck reflects, the person decides, and—only after a separate
21
+ confirmation—Kit changes playback.
22
+
23
+ This is a listening-choice reflection, not emotion-aware playback. SomaCheck
24
+ does not report an emotional state, detect a mood, select a track, or authorize
25
+ Spotify. The reading is context for the person. The person remains the
26
+ authority.
27
+
28
+ ## Primary customer experience: Studio/Kit manual pilot
29
+
30
+ Spotify documents Kit's taste-aware recommendation and playback capabilities,
31
+ but does not document a way to attach SomaCheck MCP to Studio. The currently
32
+ testable Studio experience therefore uses an explicit manual relay through a
33
+ separate SomaCheck-capable agent. This is a real experience test inside Kit,
34
+ but it is **not** a direct MCP integration.
35
+
36
+ ### 1. Ask Kit for one candidate without changing playback
37
+
38
+ Paste this in Studio:
39
+
40
+ > Kit, help me choose what to hear next. Suggest one specific track based on my
41
+ > Spotify taste and what is playing, but do not play it, queue it, save it, or
42
+ > change Spotify yet. Show me the exact title and artist. I will take that
43
+ > candidate to SomaCheck. When I return with a result, treat it only as context,
44
+ > not an emotion, instruction, or authorization. Ask me separately whether to
45
+ > play the exact track, and wait for my yes.
46
+
47
+ If Kit changes playback before the later yes, the test fails. Stop and record
48
+ the premature action; do not continue as though consent worked.
49
+
50
+ ### 2. Ask the SomaCheck-capable companion agent once
51
+
52
+ Paste the candidate title and artist into an agent with `vibecheck` connected:
53
+
54
+ > Kit suggested `<track title>` by `<artist>`. Send exactly this proposition to
55
+ > my SomaCheck now: “I want to hear this song next.” Show me the Aligned or
56
+ > Unaligned result and confidence as context only. Do not infer an emotion or
57
+ > tell me what to play.
58
+
59
+ This is an explicit one-ask request, so the companion uses
60
+ `consent_basis: "user_requested_vibecheck"` and does not ask for redundant
61
+ consent. The exact proposition contains no Spotify account or listening data.
62
+
63
+ ### 3. Relay only the authorized result to Kit, then choose
64
+
65
+ After seeing the result, paste this in Studio:
66
+
67
+ > I am choosing to share one SomaCheck result with you for this one decision,
68
+ > knowing this message is processed by Spotify's AI service provider and stored
69
+ > in Studio's local memory: `<Aligned|Unaligned>`. It is a proposition-relative
70
+ > signal, not an emotional state, cause, preference, or authorization. Do not
71
+ > record it, generalize it into my taste, or use it in any podcast, brief, or
72
+ > scheduled task. Now ask me exactly: “Play `<track title>` by `<artist>` now?”
73
+ > Do not change Spotify until I answer.
74
+
75
+ Kit should ask and stop. Mike then answers yes or no. A yes may cause Kit to
76
+ use its documented built-in playback capability; a no must leave playback
77
+ unchanged. After the test, Mike must ask Kit what it remembers, delete anything
78
+ retained, verify the deletion, and then open a fresh conversation and confirm it
79
+ holds no memory of the track, the verdict, or SomaCheck. Spotify says Studio's
80
+ memory and conversation history can be inspected and deleted locally, while
81
+ messages are processed by an AI service provider and are not used to train that
82
+ provider's models.
83
+
84
+ ### Observable Studio success
85
+
86
+ - Kit proposes one exact track without changing Spotify.
87
+ - The companion sends exactly one SomaCheck ask.
88
+ - Mike explicitly chooses whether to relay that one result to Kit.
89
+ - Kit names no emotion or cause and makes no automatic track choice from it.
90
+ - Kit asks the exact playback question and waits.
91
+ - Yes plays the named track; no makes no playback change.
92
+ - Studio's memory audit shows nothing retained, or shows it and the deletion is
93
+ verified in a fresh conversation.
94
+ - The lane is described as a manual Studio bridge with a local context packet,
95
+ never as a Studio skill, Kit integration, or MCP attachment.
96
+
97
+ The handoff between Studio and the companion is manual. Do not describe this as
98
+ Kit having called SomaCheck, SomaCheck controlling Spotify, or a deployed
99
+ Spotify MCP integration.
100
+
101
+ ## Official same-agent pilot: Spotify in Claude + SomaCheck
102
+
103
+ Spotify also publishes a first-party Spotify integration for Claude on web,
104
+ mobile, and desktop. Spotify says it can provide taste-based recommendations,
105
+ preview/save/play results, open them in Spotify, and use Spotify Connect to
106
+ inspect or control devices. This is an official consumer integration, not a
107
+ public Spotify MCP contract and not Studio/Kit.
108
+
109
+ If one Claude conversation can see both the official Spotify integration and
110
+ the linked SomaCheck remote MCP, Mike can test the complete loop without a
111
+ manual relay or a self-hosted Web API adapter. Run a capability probe first;
112
+ availability in the Claude consumer app does not prove the same tool exists in
113
+ Claude Code or another agent host.
114
+
115
+ ### Exact Claude prompt
116
+
117
+ > Use my connected Spotify and SomaCheck to help with this listening choice.
118
+ > Send SomaCheck: “I want to hear this song next.” When the result returns,
119
+ > consider the Aligned or Unaligned result and confidence together with the
120
+ > context you already have, then use your judgment to respond and suggest what
121
+ > we might do next. Do not change Spotify until I confirm the action.
122
+
123
+ The test passes when Claude proposes one Spotify result without acting, makes
124
+ one SomaCheck request, reports the result, waits at the exact playback question,
125
+ and changes Spotify only after a typed yes. A no must create zero Spotify
126
+ mutations. If either integration is missing, stop and use the Studio manual
127
+ pilot or Save to Spotify path; do not substitute an unofficial connector while
128
+ calling it the first-party Claude integration.
129
+
130
+ For the L44 currently-playing probe, use the exact proposition `I want to turn
131
+ this song up rather than switch to something different.` Give the agent the
132
+ result and confidence and let it use its judgment with the surrounding context.
133
+ Do not prescribe a fixed interpretation or response branch. Probe the connector
134
+ before promising a mutation; if the proposed Spotify action is unavailable,
135
+ say so and leave playback unchanged.
136
+
137
+ Spotify says both Free and Premium listeners can connect Spotify to Claude,
138
+ with some personalized prompt capabilities differing by plan. Confirm the
139
+ actual playback/device tool before the test. Spotify also says it does not
140
+ share Spotify audio or video content with Anthropic for training.
141
+
142
+ ## Official agent-native wedge: reflect, make a brief, Save to Spotify
143
+
144
+ Spotify now publishes the `spotify/save-to-spotify` CLI and agent skill for
145
+ Codex, Claude Code, Cursor, OpenClaw, and compatible skill hosts. This is not a
146
+ consumer Web API MCP server and does not attach SomaCheck to Kit, but it is an
147
+ official, immediately installable agent path into a person's Spotify Library.
148
+
149
+ The customer use case is a private personal audio brief whose direction is hard
150
+ to settle in words. SomaCheck can clarify the person's response to one proposed
151
+ direction. The person then chooses the direction, reviews the script, approves
152
+ the voice engine, and separately approves the Spotify upload. The signal never
153
+ selects, generates, or uploads the episode.
154
+
155
+ ### Exact personal-brief prompt
156
+
157
+ Use a non-sensitive topic for the first test, such as a public article or a
158
+ short set of notes created specifically for the demo.
159
+
160
+ > Help me create a three-minute personal talk brief and save it to Spotify, but
161
+ > do not generate audio or upload anything yet. First show two directions: A is
162
+ > direct and action-focused; B is reflective and context-focused. Then send
163
+ > exactly this proposition to my SomaCheck: “I want this brief to be direct and
164
+ > action-focused.” Show the Aligned or Unaligned result and confidence as
165
+ > context only, then ask whether I choose A, B, a revision, or no brief. My typed
166
+ > choice controls. After I choose, draft the complete talk script and show it to
167
+ > me. Ask before sending the script to any voice provider. After I approve the
168
+ > script and voice path, create a local audio file. Show the title, summary,
169
+ > format, duration, and target Spotify show, then ask exactly: “Save this episode
170
+ > to Spotify now?” Do not run any Save to Spotify upload command until I say
171
+ > yes. Do not include the SomaCheck result or confidence in the script, audio,
172
+ > title, summary, artwork, timeline, or Spotify metadata.
173
+
174
+ ### Prerequisites
175
+
176
+ - Install a reviewed, checksum-verified release from Spotify's official
177
+ [`spotify/save-to-spotify`](https://github.com/spotify/save-to-spotify)
178
+ repository and complete its browser login. Do not paste its stored token into
179
+ chat. As of this review, the latest published release is `v0.2.0`.
180
+ - Use the latest Spotify app and an account with Save to Spotify beta access.
181
+ Spotify says eligible Free and Premium accounts can use the feature.
182
+ - Provide a supported audio file: `.mp3`, `.m4a`, `.wav`, or `.ogg`.
183
+ - Choose a voice engine separately. The Save to Spotify CLI uploads audio but
184
+ does not synthesize speech. Prefer local TTS for the first test; obtain
185
+ separate consent before sending personal source material to a hosted TTS
186
+ provider.
187
+ - Keep the content primarily spoken-word. Music-first content is not permitted.
188
+
189
+ ### Exact workflow
190
+
191
+ 1. Present two brief directions without invoking SomaCheck or generating audio.
192
+ 2. Because the customer prompt explicitly requests it, call
193
+ `request_vibecheck` once with the exact proposition and
194
+ `user_requested_vibecheck`.
195
+ 3. Report the result as proposition-relative context. Do not map Aligned to A
196
+ or Unaligned to B.
197
+ 4. Ask for a typed choice: A, B, revise, or stop. Stop on silence or stop.
198
+ 5. Draft the complete script only after that choice. Clearly mark sourced facts
199
+ and do not invent material.
200
+ 6. Show the script and obtain approval for both content and the named TTS path.
201
+ A script approval is not upload approval.
202
+ 7. Synthesize a local supported audio file and inspect duration/format.
203
+ 8. Show the exact episode title, summary, target show, and local file. Ask:
204
+ `Save this episode to Spotify now?`
205
+ 9. Only after a typed yes, invoke the official skill/CLI upload once. Capture
206
+ the returned episode/library link and readiness status. Do not duplicate an
207
+ upload after an ambiguous response.
208
+ 10. Open the returned link in Spotify and listen. The episode remains private
209
+ personal content and currently cannot be shared.
210
+
211
+ ### Observable success and failure
212
+
213
+ Success means one SomaCheck ask, one explicit direction choice, an approved
214
+ talk script, one approved local TTS operation, one separately approved upload,
215
+ and a playable episode in Your Library. The saved episode contains no
216
+ SomaCheck result or claim about the person's state.
217
+
218
+ If Save to Spotify access is unavailable, content is rejected, processing
219
+ fails, a usage limit is reached, or the audio is not primarily talk, keep the
220
+ local file and report the exact bounded failure. Do not switch to a public
221
+ podcast host, share the content, or repeat the upload without instruction.
222
+
223
+ Spotify currently documents beta limits of five shows with 30 episodes per
224
+ show for Free and ten shows with 60 episodes per show for Premium. Treat those
225
+ limits as changeable and check the current support page before operational use.
226
+
227
+ ## Automated MCP fallback outside Studio
228
+
229
+ 1. Start any track on an active Spotify device.
230
+ 2. In Spotify, choose one candidate next track and copy its Spotify track link.
231
+ 3. Give the exact prompt below to an MCP-capable agent that has both SomaCheck
232
+ and a reviewed Spotify Web API adapter.
233
+ 4. Complete the one SomaCheck ask on the phone.
234
+ 5. Read the Aligned or Unaligned result and confidence in the agent.
235
+ 6. Answer the agent's separate question about whether to queue the named track.
236
+ 7. If the answer is yes, see that exact track in the Spotify queue. If the
237
+ answer is no, Spotify is unchanged.
238
+
239
+ This fallback is the minimum automatable vertical slice because the effect is visible and
240
+ reversible, the track is chosen by the person, and the Spotify mutation cannot
241
+ happen merely because a reading was Aligned or Unaligned.
242
+
243
+ ## Exact fallback prompt
244
+
245
+ Replace the placeholder with one Spotify track link. Keep the SomaCheck
246
+ statement exactly as written.
247
+
248
+ > Use SomaCheck and Spotify together for one listening decision. I am already
249
+ > listening on Spotify. The candidate I chose for next is `<Spotify track
250
+ > link>`. Send exactly this proposition to SomaCheck: “I want this song to be
251
+ > next.” Show me the Aligned or Unaligned result and confidence as context only.
252
+ > Then stop and ask, “Queue `<track title>` by `<artist>` now?” Do not call a
253
+ > Spotify write tool until I answer yes. If I say yes, add only that exact track
254
+ > to my active queue and verify that it appears. If I say no, do nothing. Do not
255
+ > infer my emotion, choose a different track from the result, or save the
256
+ > reading to Spotify.
257
+
258
+ Because this prompt explicitly requests one SomaCheck, use
259
+ `consent_basis: "user_requested_vibecheck"`; do not ask for redundant consent
260
+ for the phone ask. The later Spotify confirmation is separate and mandatory.
261
+
262
+ ## Prerequisites
263
+
264
+ 1. The person has linked `vibecheck` to their own SomaCheck account and the
265
+ agent can see `request_vibecheck` and `get_vibecheck_result`.
266
+ 2. The agent has a reviewed Spotify connector. Spotify does not publish an
267
+ official MCP server for the consumer Web API, so inspect the connector's
268
+ tools and prove that the required operations map to the official endpoints
269
+ below. Do not treat a community MCP package as Spotify-supported software.
270
+ 3. The Spotify app uses Authorization Code with PKCE for a local, desktop, or
271
+ mobile client, stores tokens outside chat, and requests only
272
+ `user-read-currently-playing` and `user-modify-playback-state` for this
273
+ recipe.
274
+ 4. The Spotify developer-app owner has Premium. In Development Mode, the
275
+ current quota documentation limits the app to five allowlisted authenticated
276
+ users and applies a shared quota distinct from rate limits.
277
+ 5. The listener has Premium and an active, non-restricted Spotify Connect
278
+ device. Start playback manually before the test so queueing has an active
279
+ target.
280
+ 6. The person supplies one exact `open.spotify.com/track/...` link or
281
+ `spotify:track:...` URI. The adapter converts a link to its exact track URI
282
+ locally. This P0 path does not ask an agent to search for or recommend music.
283
+
284
+ Do not paste a Spotify access token, refresh token, client secret, SomaCheck
285
+ link token, or developer credential into the conversation or proposition.
286
+
287
+ ## Required Spotify capability map
288
+
289
+ Actual MCP tool names vary. Validate behavior against these official Web API
290
+ operations instead of assuming names:
291
+
292
+ | Purpose | Official operation | Scope | Rule |
293
+ | --- | --- | --- | --- |
294
+ | Resolve the person's exact candidate | `GET /v1/tracks/{id}` | No additional user scope | Read once from the exact supplied track ID; do not search or recommend. |
295
+ | Confirm the active listening context | `GET /v1/me/player/currently-playing` | `user-read-currently-playing` | Read once. A `204`/empty state means the person must start Spotify manually. |
296
+ | Add the person's exact candidate | `POST /v1/me/player/queue?uri={spotify_uri}` | `user-modify-playback-state` | Call only after a post-result yes. A successful `204` means the command was accepted, not that playback changed. |
297
+ | Verify the result | `GET /v1/me/player/queue` | `user-read-currently-playing` or `user-read-playback-state` | Read once and check for the exact URI. Do not continuously poll. |
298
+
299
+ If the connector lacks queueing, do not silently substitute immediate playback,
300
+ playlist creation, save-to-library, skip, or volume control. Return the exact
301
+ Spotify link so the person can add it manually.
302
+
303
+ ## Exact cross-MCP workflow
304
+
305
+ Follow these steps in order.
306
+
307
+ 1. **Validate the candidate.** Parse only an exact Spotify track link or URI.
308
+ Reject playlists, albums, episodes, malformed IDs, and shortened or unknown
309
+ redirect links for this P0 recipe. Show the resolved track title, artist, and
310
+ Spotify link with Spotify attribution before any write.
311
+ 2. **Read current playback once.** Use the connector operation mapped to
312
+ `GET /me/player/currently-playing`. State only the literal track and device
313
+ status. Do not infer energy, mood, stress, or what the listener needs.
314
+ 3. **Request one SomaCheck.** Call `request_vibecheck` exactly once with:
315
+
316
+ ```json
317
+ {
318
+ "statement": "I want this song to be next.",
319
+ "idempotency_key": "<fresh UUID for this logical ask>",
320
+ "consent_basis": "user_requested_vibecheck"
321
+ }
322
+ ```
323
+
324
+ Reuse the same UUID only when retrying the exact same statement after an
325
+ ambiguous create failure. Never make another ask to seek a preferred result.
326
+ 4. **Handle the exact lifecycle.** A terminal `request_vibecheck` response uses
327
+ `state: "completed"`; a later `get_vibecheck_result` read uses
328
+ `status: "answered"`. Treat either as the same terminal point. If the
329
+ initial call is pending, retain its exact `live:<uuid>` handle and perform
330
+ at most one later `get_vibecheck_result` read. If it is still pending,
331
+ expired, cancelled, or errors, continue without a result and create no new
332
+ ask.
333
+ 5. **Return the signal without a soundtrack prescription.** Say:
334
+ `SomaCheck returned <Aligned|Unaligned> at <confidence>. See whether that
335
+ matches what you notice. It does not tell us why or choose the song.` Keep
336
+ observation, interpretation, confirmation, and choice distinct.
337
+ 6. **Require a new Spotify confirmation.** Ask exactly:
338
+ `Queue <track title> by <artist> now?` Wait. Aligned is not yes. Unaligned is
339
+ not no. Silence is not yes. A typed no, decline, correction, or different
340
+ choice means no Spotify write.
341
+ 7. **Queue only after yes.** Add only the exact supplied Spotify track URI. Do
342
+ not add a recommendation, change playback, skip, change volume, create a
343
+ playlist, or persist the SomaCheck result.
344
+ 8. **Verify once.** Read the queue once and report either that the exact URI is
345
+ visible or that Spotify accepted the command but the verification did not
346
+ confirm it. Spotify warns that ordering is not guaranteed when Player API
347
+ commands are combined, so do not promise that the item will be literally
348
+ next if other commands or clients changed the queue concurrently.
349
+
350
+ ## What must never cross the boundary
351
+
352
+ - Raw or batched gyroscope, accelerometer, or magnetometer data.
353
+ - Personal-baseline or calibration data, including any invented
354
+ `calibration_score` field.
355
+ - A claim such as `report_emotional_state`; the existing SomaCheck MCP emits a
356
+ proposition-relative Aligned or Unaligned interpretation plus model
357
+ confidence, not an emotional-state report.
358
+ - The verdict, confidence, confirmation, or inferred meaning in any Spotify
359
+ URI, query, playlist, description, metadata field, analytics event, or log.
360
+ - Spotify listening data in the SomaCheck proposition. “I want this song to be
361
+ next” is intentionally self-contained and first-person.
362
+ - Spotify content used to train or fine-tune an AI model. Use minimal metadata
363
+ transiently for the requested action and follow Spotify's attribution and
364
+ retention rules.
365
+
366
+ ## Observable success
367
+
368
+ The test passes only when all of the following are visible:
369
+
370
+ - Spotify was already playing on the person's active device.
371
+ - The agent displays the exact candidate title, artist, and Spotify link.
372
+ - The phone receives exactly one proposition: “I want this song to be next.”
373
+ - The agent reports one binary reading and confidence without naming an
374
+ emotion or cause.
375
+ - The agent pauses before a Spotify write and asks for a separate yes/no choice.
376
+ - A typed yes produces one queue-add call for the exact candidate URI.
377
+ - A single queue read shows the exact URI, or the agent truthfully reports that
378
+ the command was accepted but not verified.
379
+ - A typed no produces zero Spotify writes.
380
+
381
+ The transcript plus redacted tool names/status codes is the demo receipt. Do
382
+ not record credentials, the raw gesture, or the person's reading in Spotify.
383
+
384
+ ## Failure behavior
385
+
386
+ - **No Studio/Kit connector:** use this recipe in another MCP-capable agent.
387
+ Do not call it a Studio integration. A manual copy from that agent into Kit is
388
+ a manual relay, not a bidirectional MCP demo.
389
+ - **No Spotify queue tool:** show the exact track link and ask the person to add
390
+ it in Spotify. Do not substitute another mutation.
391
+ - **No active device / empty playback:** ask the person to open Spotify and
392
+ start a track, then retry only the Spotify read. Do not repeat the SomaCheck.
393
+ - **Restricted device or `401`/`403`:** stop the write, identify whether auth,
394
+ scope, Premium, allowlist, or device support needs repair, and never request a
395
+ token in chat.
396
+ - **`429` rate or quota response:** honor `Retry-After` when present. Do not
397
+ retry in a tight loop. Development quota errors may identify
398
+ `reason: "QUOTA_EXCEEDED"` and need a later retry rather than backoff alone.
399
+ - **SomaCheck pending, expired, cancelled, unreadable, or error:** do not infer
400
+ a result and do not create a replacement ask. The person may still decide
401
+ about Spotify directly.
402
+ - **Candidate mismatch:** do not queue. Show the mismatch and ask the person
403
+ for a new exact Spotify track link.
404
+ - **Queue verification mismatch:** report uncertainty. Do not enqueue again,
405
+ because the first `204` may already have mutated the queue.
406
+
407
+ ## Acceptance tests
408
+
409
+ Run both contract tests and one real-account smoke test before describing the
410
+ recipe as operational.
411
+
412
+ | Test | Expected result |
413
+ | --- | --- |
414
+ | Explicit request | One `request_vibecheck` call uses `user_requested_vibecheck`; no redundant consent question. |
415
+ | Aligned result | Agent reports context, then stops for Spotify confirmation; zero writes before yes. |
416
+ | Unaligned result | Same stop and confirmation behavior; no automatic calming, grounding, or alternative-track action. |
417
+ | Human says yes | Exactly one queue-add call contains only the supplied URI; one later queue read verifies it. |
418
+ | Human says no or is silent | Zero Spotify writes. |
419
+ | Human overrides signal | The typed choice controls behavior regardless of Aligned or Unaligned. |
420
+ | Pending SomaCheck | Stable `live:<uuid>` is retained; at most one later read; no new request. |
421
+ | Spotify `204`, verification absent | No duplicate write; agent reports accepted but not verified. |
422
+ | Spotify `401`/`403`/restricted device | No fallback mutation and no credential request in chat. |
423
+ | Spotify `429` | Connector honors `Retry-After` and distinguishes shared quota exhaustion when the response supplies that reason. |
424
+ | Payload inspection | No sensor, calibration, proposition result, or confidence appears in Spotify request parameters or logs. |
425
+ | Copy-policy scan | No “emotion detection,” “stress detection,” “your body says,” “calming track,” or authorization language. |
426
+
427
+ ## Launch boundary
428
+
429
+ The manual Studio pilot is available only to people with access to Spotify's
430
+ research preview. The adapter recipe is suitable for a personal, allowlisted
431
+ Development Mode demo. Neither is approval for public or commercial
432
+ distribution. Spotify's Player API
433
+ pages state that streaming applications may not be commercial, while current
434
+ Extended Quota access requires a qualifying organization and Spotify review.
435
+ Obtain Spotify policy/partner approval and Sensie privacy/legal review before a
436
+ public launch or paid offering.
437
+
438
+ ## Sources
439
+
440
+ - [Studio by Spotify Labs](https://labs.spotify.com/studio)
441
+ - [How Studio works](https://labs.spotify.com/studio/how-it-works)
442
+ - [Spotify support: How to use Studio](https://support.spotify.com/us/article/studio/)
443
+ - [Studio by Spotify Labs research-preview launch](https://newsroom.spotify.com/2026-05-21/studio-by-spotify-labs-launch/)
444
+ - [Spotify Web API: Building with AI](https://developer.spotify.com/documentation/web-api/tutorials/building-with-ai)
445
+ - [Spotify Web API: Add Item to Playback Queue](https://developer.spotify.com/documentation/web-api/reference/add-to-queue)
446
+ - [Spotify Web API: Get Track](https://developer.spotify.com/documentation/web-api/reference/get-track)
447
+ - [Spotify Web API: Get Currently Playing Track](https://developer.spotify.com/documentation/web-api/reference/get-the-users-currently-playing-track)
448
+ - [Spotify Web API: Get the User's Queue](https://developer.spotify.com/documentation/web-api/reference/get-queue)
449
+ - [Spotify Web API: Authorization Code with PKCE](https://developer.spotify.com/documentation/web-api/tutorials/code-pkce-flow)
450
+ - [Spotify Web API: Scopes](https://developer.spotify.com/documentation/web-api/concepts/scopes)
451
+ - [Spotify Web API: Quota modes](https://developer.spotify.com/documentation/web-api/concepts/quota-modes)
452
+ - [Spotify Web API: Rate limits](https://developer.spotify.com/documentation/web-api/concepts/rate-limits)
453
+ - [Spotify's 2024 endpoint-access changes](https://developer.spotify.com/blog/2024-11-27-changes-to-the-web-api)
454
+ - [Spotify: Save Your Personal Podcast to Spotify](https://newsroom.spotify.com/2026-05-07/personal-podcasts-launch/)
455
+ - [Spotify Brings Music and Podcast Recommendations to Claude](https://newsroom.spotify.com/2026-04-23/claude-integration/)
456
+ - [Spotify support: Save to Spotify](https://support.spotify.com/us/article/save-to-spotify/)
457
+ - [Official Save to Spotify CLI and agent skill](https://github.com/spotify/save-to-spotify)
458
+ - [SomaCheck setup and tool behavior](../README.md)
459
+ - [SomaCheck immediate-request contract](../LIVE-ASK-CONTRACT.md)