Download eval/local_intelligence/cards.json from arach/training-lab: direct link, hf CLI and curl.
- Browser
- Download file 46 kB
-
https://huggingface.co/arach/training-lab/resolve/main/eval/local_intelligence/cards.json
- Command line
-
hf download hf://arach/training-lab/eval/local_intelligence/cards.json
-
curl -L -o cards.json https://huggingface.co/arach/training-lab/resolve/main/eval/local_intelligence/cards.json
46 kB
| [ | |
| { | |
| "id": "memo-auto-title", | |
| "title": "Memo Auto-Title (<1s)", | |
| "tier": "ship-soon", | |
| "objective": "Generate specific memo titles that are useful in list view and search.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_03_0814", | |
| "capturedAt": "2026-04-03T08:14:22-04:00", | |
| "currentTitle": "New Memo", | |
| "transcript": "Need to rewrite the launch page hero. Put proof first, then product shot, then pricing line. Also ask Nina for two customer quotes by Tuesday." | |
| }, | |
| "prompt": { | |
| "task": "Create one concise and specific title for a fresh memo.", | |
| "system": "You write titles for Talkie voice memos.\nRules:\n- Return JSON only.\n- Title must be <= 48 characters.\n- Make it specific to the memo's core action.\n- Never output generic titles like \"Voice Memo\" or \"Thoughts\".", | |
| "user": "Memo ID: {{memoId}}\nCaptured at: {{capturedAt}}\nCurrent title: {{currentTitle}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "title": "Launch hero: proof first, quotes by Tuesday", | |
| "confidence": 0.92, | |
| "rationale": "Memo focuses on landing page reorder and quote deadline." | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Avoid generic titles on clear action memo", | |
| "input": { | |
| "memoId": "memo_test_title_01", | |
| "capturedAt": "2026-04-04T10:05:00-04:00", | |
| "currentTitle": "Voice Memo", | |
| "transcript": "Book dentist for Friday and email insurance form before noon." | |
| }, | |
| "assertions": [ | |
| "title is not \"Voice Memo\"", | |
| "title length <= 48", | |
| "title contains either \"dentist\" or \"insurance\"" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "memo-type-detection", | |
| "title": "Memo Type Detection", | |
| "tier": "ship-soon", | |
| "objective": "Classify memo intent early so the right local workflow can run automatically.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_03_0918", | |
| "transcript": "Need to lock April hiring plan: two backend roles, one designer, no contractor spend until Q3.", | |
| "candidateTypes": [ | |
| "task", | |
| "journal", | |
| "meeting", | |
| "idea", | |
| "reference" | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Classify memo into one primary type and optional secondary type.", | |
| "system": "You are a routing classifier for Talkie.\nReturn JSON only.\nPick one primaryType from candidateTypes.\nIf confidence is below 0.65, set needsReview to true.", | |
| "user": "Memo ID: {{memoId}}\nCandidate types: {{candidateTypes}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "primaryType": "meeting", | |
| "secondaryType": "task", | |
| "confidence": 0.88, | |
| "suggestedWorkflow": "extract-action-items", | |
| "needsReview": false | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Ambiguous personal reflection should not over-route", | |
| "input": { | |
| "memoId": "memo_test_type_01", | |
| "transcript": "Felt scattered today. Might restructure mornings and maybe skip Slack until 10.", | |
| "candidateTypes": [ | |
| "task", | |
| "journal", | |
| "meeting", | |
| "idea", | |
| "reference" | |
| ] | |
| }, | |
| "assertions": [ | |
| "primaryType is either \"journal\" or \"idea\"", | |
| "confidence < 0.8", | |
| "needsReview can be true when uncertainty is high" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "action-item-extraction", | |
| "title": "Action Item Extraction With Confidence", | |
| "tier": "ship-soon", | |
| "objective": "Extract trackable tasks from natural speech while preserving evidence spans.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_03_1042", | |
| "transcript": "By Monday, send revised onboarding doc to Priya. Also schedule 30 minutes with legal next week. I should probably clean up old Stripe test accounts too.", | |
| "ownerDefault": "Arach" | |
| }, | |
| "prompt": { | |
| "task": "Extract explicit and implied action items from memo transcript.", | |
| "system": "You extract tasks from speech.\nReturn JSON only.\nEach item needs: text, owner, dueDateISO (or null), confidence, evidence.\nDo not invent due dates if none are present.", | |
| "user": "Memo ID: {{memoId}}\nOwner default: {{ownerDefault}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "items": [ | |
| { | |
| "text": "Send revised onboarding doc to Priya", | |
| "owner": "Arach", | |
| "dueDateISO": "2026-04-06", | |
| "confidence": 0.95, | |
| "evidence": "By Monday, send revised onboarding doc to Priya." | |
| }, | |
| { | |
| "text": "Schedule 30 minute legal review", | |
| "owner": "Arach", | |
| "dueDateISO": null, | |
| "confidence": 0.82, | |
| "evidence": "schedule 30 minutes with legal next week" | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Low-confidence tasks remain extractable but marked", | |
| "input": { | |
| "memoId": "memo_test_tasks_01", | |
| "transcript": "Maybe clean up the old docs folder sometime.", | |
| "ownerDefault": "Arach" | |
| }, | |
| "assertions": [ | |
| "items length >= 1", | |
| "item confidence < 0.75 for vague tasks", | |
| "evidence field is always present" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "transcript-cleanup-presets", | |
| "title": "Transcript Cleanup Presets", | |
| "tier": "ship-soon", | |
| "objective": "Apply local rewrite modes without losing factual meaning from the source transcript.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_02_1831", | |
| "preset": "executive-summary", | |
| "transcript": "Um okay so the thing is we shipped the sync fix and uh support tickets dropped from nineteen to six, but we still have weird duplicate reminders for recurring tasks." | |
| }, | |
| "prompt": { | |
| "task": "Rewrite transcript according to preset while preserving concrete facts.", | |
| "system": "You rewrite transcripts using style presets.\nReturn JSON only.\nNever change numbers, names, or dates.\nIf preset is executive-summary, use short declarative sentences.", | |
| "user": "Preset: {{preset}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "cleanedText": "Shipped sync fix reduced support tickets from 19 to 6. Duplicate reminders still occur for recurring tasks.", | |
| "preservedFacts": [ | |
| "support tickets dropped from 19 to 6", | |
| "duplicate reminders remain" | |
| ], | |
| "removedFillers": [ | |
| "um", | |
| "uh", | |
| "okay" | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Fact preservation under rewrite", | |
| "input": { | |
| "memoId": "memo_test_cleanup_01", | |
| "preset": "bullet-plan", | |
| "transcript": "We spent 4 hours on export bugs and fixed 3 of 5 issues." | |
| }, | |
| "assertions": [ | |
| "output contains number 4", | |
| "output contains phrase 3 of 5", | |
| "filler words are not introduced" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "what-matters-summary", | |
| "title": "Top-3 What Matters Summary", | |
| "tier": "ship-soon", | |
| "objective": "Compress long voice notes into the three highest-signal points.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_01_0720", | |
| "transcript": "Long ramble about launch prep, hiring plan, and a possible referral program. Final decisions: launch moved to May 10, defer referral until after analytics rewrite, and cut onboarding to three screens." | |
| }, | |
| "prompt": { | |
| "task": "Return exactly three highest-priority points from transcript.", | |
| "system": "You produce high-signal summaries.\nReturn JSON only.\nOutput exactly 3 points.\nEach point must include evidence quote and priority score 1-100.", | |
| "user": "Memo ID: {{memoId}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "topPoints": [ | |
| { | |
| "point": "Launch date moved to May 10.", | |
| "priority": 96, | |
| "evidence": "launch moved to May 10" | |
| }, | |
| { | |
| "point": "Referral program deferred until analytics rewrite is done.", | |
| "priority": 87, | |
| "evidence": "defer referral until after analytics rewrite" | |
| }, | |
| { | |
| "point": "Onboarding flow reduced to three screens.", | |
| "priority": 80, | |
| "evidence": "cut onboarding to three screens" | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Summary must stay at exactly three points", | |
| "input": { | |
| "memoId": "memo_test_summary_01", | |
| "transcript": "Decision one. Decision two. Decision three. Decision four." | |
| }, | |
| "assertions": [ | |
| "topPoints length equals 3", | |
| "priority values are numeric", | |
| "each point includes evidence" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "calendar-intent-detection", | |
| "title": "Calendar Intent Detection", | |
| "tier": "ship-soon", | |
| "objective": "Detect event-worthy language and produce structured event suggestions.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_03_1212", | |
| "capturedAt": "2026-04-03T12:12:10-04:00", | |
| "timezone": "America/Toronto", | |
| "transcript": "Lunch with Dana next Tuesday at 1 at Canary. Also review roadmap with ops Thursday 4:30 PM for 45 minutes." | |
| }, | |
| "prompt": { | |
| "task": "Extract potential calendar events from transcript.", | |
| "system": "You detect calendar intents.\nReturn JSON only.\nResolve relative dates using capturedAt and timezone.\nMark needsConfirmation true when date/time confidence is below 0.8.", | |
| "user": "Captured at: {{capturedAt}}\nTimezone: {{timezone}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "events": [ | |
| { | |
| "title": "Lunch with Dana", | |
| "startAtISO": "2026-04-07T13:00:00-04:00", | |
| "durationMinutes": 60, | |
| "location": "Canary", | |
| "confidence": 0.9, | |
| "needsConfirmation": false | |
| }, | |
| { | |
| "title": "Roadmap review with Ops", | |
| "startAtISO": "2026-04-09T16:30:00-04:00", | |
| "durationMinutes": 45, | |
| "location": null, | |
| "confidence": 0.86, | |
| "needsConfirmation": false | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Relative date resolution uses explicit timezone", | |
| "input": { | |
| "memoId": "memo_test_calendar_01", | |
| "capturedAt": "2026-04-04T09:00:00-04:00", | |
| "timezone": "America/Toronto", | |
| "transcript": "Call Sam tomorrow at 2 PM." | |
| }, | |
| "assertions": [ | |
| "startAtISO date is 2026-04-05", | |
| "timezone offset in startAtISO is -04:00", | |
| "event title mentions Sam" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "reminder-normalization", | |
| "title": "Reminder Phrasing Normalization", | |
| "tier": "ship-soon", | |
| "objective": "Turn vague spoken reminders into clear and actionable reminder objects.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_03_1722", | |
| "transcript": "Need to maybe ping Chris about the invoice thing before it gets weird.", | |
| "userLocale": "en-CA" | |
| }, | |
| "prompt": { | |
| "task": "Normalize vague reminder speech into specific reminder text and metadata.", | |
| "system": "You normalize reminders.\nReturn JSON only.\nReminder text should start with a strong verb.\nWhen due date is unclear, set dueDateISO to null and add followUpQuestion.", | |
| "user": "Locale: {{userLocale}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "reminderText": "Message Chris for invoice status update", | |
| "dueDateISO": null, | |
| "confidence": 0.78, | |
| "followUpQuestion": "When do you want this done?" | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Reminder text should be imperative and concrete", | |
| "input": { | |
| "memoId": "memo_test_reminder_01", | |
| "transcript": "Maybe look into new card design at some point.", | |
| "userLocale": "en-CA" | |
| }, | |
| "assertions": [ | |
| "reminderText starts with a verb", | |
| "reminderText does not contain \"maybe\"", | |
| "followUpQuestion exists when due date is missing" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "private-redaction-pass", | |
| "title": "Private Redaction Pass", | |
| "tier": "ship-soon", | |
| "objective": "Redact sensitive data locally before sharing, syncing, or cloud routing.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_02_1114", | |
| "transcript": "Card ending 4821 failed again. Patient name is Mark Lavoie and policy number is HN-772-19.", | |
| "policies": [ | |
| "mask-health-data", | |
| "mask-financial-data" | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Detect and mask sensitive entities while preserving memo readability.", | |
| "system": "You redact sensitive entities.\nReturn JSON only.\nUse [REDACTED_TYPE] placeholders.\nInclude list of redacted entities with type and confidence.", | |
| "user": "Policies: {{policies}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "redactedTranscript": "Card ending [REDACTED_FINANCIAL] failed again. Patient name is [REDACTED_PERSON] and policy number is [REDACTED_HEALTH_ID].", | |
| "entities": [ | |
| { | |
| "value": "4821", | |
| "type": "financial", | |
| "confidence": 0.94 | |
| }, | |
| { | |
| "value": "Mark Lavoie", | |
| "type": "person", | |
| "confidence": 0.98 | |
| }, | |
| { | |
| "value": "HN-772-19", | |
| "type": "health-id", | |
| "confidence": 0.92 | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "No raw sensitive tokens remain in output", | |
| "input": { | |
| "memoId": "memo_test_redact_01", | |
| "transcript": "SSN 555-44-9012 and account 00391299 should never leave device.", | |
| "policies": [ | |
| "mask-financial-data" | |
| ] | |
| }, | |
| "assertions": [ | |
| "redactedTranscript does not contain 555-44-9012", | |
| "redactedTranscript does not contain 00391299", | |
| "entities length >= 2" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "writing-style-memory", | |
| "title": "Per-User Writing Style Memory", | |
| "tier": "local-first", | |
| "objective": "Rewrite outputs in the user's preferred voice using local style profile memory.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_03_2010", | |
| "styleProfile": { | |
| "preferredTone": "direct", | |
| "sentenceLength": "short", | |
| "avoidWords": [ | |
| "leverage", | |
| "synergy" | |
| ], | |
| "likesBullets": true | |
| }, | |
| "transcript": "We need to change onboarding and probably reduce friction around account linking." | |
| }, | |
| "prompt": { | |
| "task": "Rewrite summary using stored user style profile.", | |
| "system": "You are a personal style adapter.\nReturn JSON only.\nMatch styleProfile preferences.\nDo not alter factual meaning.", | |
| "user": "Style profile:\n{{styleProfile}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "styledSummary": "Onboarding needs two changes:\n- Remove extra account-linking step\n- Reduce friction in first-run flow", | |
| "styleChecks": { | |
| "usedBullets": true, | |
| "avoidedWords": [ | |
| "leverage", | |
| "synergy" | |
| ] | |
| } | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Avoid banned style words", | |
| "input": { | |
| "memoId": "memo_test_style_01", | |
| "styleProfile": { | |
| "preferredTone": "direct", | |
| "sentenceLength": "short", | |
| "avoidWords": [ | |
| "utilize" | |
| ], | |
| "likesBullets": false | |
| }, | |
| "transcript": "We should utilize a new onboarding flow." | |
| }, | |
| "assertions": [ | |
| "styledSummary does not contain \"utilize\"", | |
| "output preserves onboarding meaning" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "similar-memo-recall", | |
| "title": "Find Similar Memo (Semantic Recall)", | |
| "tier": "local-first", | |
| "objective": "Retrieve related historical memos to improve continuity in decision-making.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_04_0740", | |
| "queryTranscript": "Need to revisit referral program constraints before launch.", | |
| "candidateMemos": [ | |
| { | |
| "memoId": "memo_2026_03_21_0800", | |
| "summary": "Deferred referral system until analytics migration." | |
| }, | |
| { | |
| "memoId": "memo_2026_03_28_0930", | |
| "summary": "Updated website hero copy and social proof blocks." | |
| }, | |
| { | |
| "memoId": "memo_2026_04_01_1830", | |
| "summary": "Defined invite-only referral pilot for power users." | |
| } | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Rank the most semantically related memos for current transcript.", | |
| "system": "You are a memo recall ranker.\nReturn JSON only.\nSelect top 3 matches with relevance score and rationale.\nPrioritize decision continuity over keyword overlap.", | |
| "user": "Current transcript:\n{{queryTranscript}}\nCandidates:\n{{candidateMemos}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "matches": [ | |
| { | |
| "memoId": "memo_2026_03_21_0800", | |
| "relevance": 0.93, | |
| "rationale": "Same referral timing constraint." | |
| }, | |
| { | |
| "memoId": "memo_2026_04_01_1830", | |
| "relevance": 0.89, | |
| "rationale": "Directly discusses referral pilot scope." | |
| }, | |
| { | |
| "memoId": "memo_2026_03_28_0930", | |
| "relevance": 0.34, | |
| "rationale": "Marketing copy only; weak relation." | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Historical decision memo should rank above lexical overlap", | |
| "input": { | |
| "memoId": "memo_test_recall_01", | |
| "queryTranscript": "Need to revisit cancellation policy and trials.", | |
| "candidateMemos": [ | |
| { | |
| "memoId": "a", | |
| "summary": "Discussed trial cancellation policy and refund rules." | |
| }, | |
| { | |
| "memoId": "b", | |
| "summary": "Discussed policy page typography updates." | |
| } | |
| ] | |
| }, | |
| "assertions": [ | |
| "memoId \"a\" ranks first", | |
| "top match relevance > 0.8" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "project-clustering", | |
| "title": "Project Clustering From Voice History", | |
| "tier": "local-first", | |
| "objective": "Auto-group memos into evolving project threads without manual folders.", | |
| "inputExample": { | |
| "dateRange": "2026-03-20 to 2026-04-04", | |
| "memos": [ | |
| { | |
| "memoId": "m1", | |
| "summary": "Refactor sync retry logic and duplicate reminders." | |
| }, | |
| { | |
| "memoId": "m2", | |
| "summary": "Landing page social proof order and CTA copy." | |
| }, | |
| { | |
| "memoId": "m3", | |
| "summary": "Recurring reminder bug root cause in scheduler." | |
| }, | |
| { | |
| "memoId": "m4", | |
| "summary": "Launch announcement draft and waitlist email." | |
| } | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Cluster memo summaries into project-level threads.", | |
| "system": "You cluster memos into project threads.\nReturn JSON only.\nEach cluster must have: clusterId, title, memoIds, confidence.\nCreate \"misc\" only when confidence is below 0.6.", | |
| "user": "Date range: {{dateRange}}\nMemos:\n{{memos}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "clusters": [ | |
| { | |
| "clusterId": "scheduler-reliability", | |
| "title": "Scheduler reliability fixes", | |
| "memoIds": [ | |
| "m1", | |
| "m3" | |
| ], | |
| "confidence": 0.9 | |
| }, | |
| { | |
| "clusterId": "launch-site-and-comms", | |
| "title": "Launch site and communications", | |
| "memoIds": [ | |
| "m2", | |
| "m4" | |
| ], | |
| "confidence": 0.86 | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Related bug memos should cluster together", | |
| "input": { | |
| "dateRange": "2026-04-01 to 2026-04-03", | |
| "memos": [ | |
| { | |
| "memoId": "a1", | |
| "summary": "Crash in sync queue on reconnect." | |
| }, | |
| { | |
| "memoId": "a2", | |
| "summary": "Retry strategy for sync queue and reconnect handling." | |
| }, | |
| { | |
| "memoId": "b1", | |
| "summary": "Podcast notes and reading list." | |
| } | |
| ] | |
| }, | |
| "assertions": [ | |
| "a1 and a2 share a clusterId", | |
| "b1 may be separate or misc" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "next-step-suggestion-engine", | |
| "title": "Next-Step Suggestion Engine", | |
| "tier": "local-first", | |
| "objective": "Recommend the best immediate action after transcription to reduce decision fatigue.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_04_0902", | |
| "transcript": "I have three product ideas but no clear winner. Need a quick way to score them this week.", | |
| "availableActions": [ | |
| "summarize", | |
| "extract-tasks", | |
| "schedule", | |
| "draft-note", | |
| "ask-clarifying-question" | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Choose one best next action for the user right now.", | |
| "system": "You are a next-step recommender.\nReturn JSON only.\nPick exactly one action from availableActions.\nPrefer actions that unblock momentum within 5 minutes.", | |
| "user": "Available actions: {{availableActions}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "action": "ask-clarifying-question", | |
| "reason": "User has options but no decision criteria; one clarifying question unlocks scoring.", | |
| "confidence": 0.84 | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Action choice reflects transcript uncertainty", | |
| "input": { | |
| "memoId": "memo_test_next_01", | |
| "transcript": "Tomorrow 9 AM send invoice to Alex and set follow-up reminder for Friday.", | |
| "availableActions": [ | |
| "summarize", | |
| "extract-tasks", | |
| "schedule", | |
| "draft-note", | |
| "ask-clarifying-question" | |
| ] | |
| }, | |
| "assertions": [ | |
| "action is either \"extract-tasks\" or \"schedule\"", | |
| "reason references explicit deadline" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "follow-up-question-generator", | |
| "title": "Follow-Up Question Generator", | |
| "tier": "local-first", | |
| "objective": "Ask minimal clarifying questions when memo intent is ambiguous.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_04_1011", | |
| "transcript": "Need to get the partner thing moving again soon.", | |
| "maxQuestions": 2 | |
| }, | |
| "prompt": { | |
| "task": "Generate up to two high-value clarifying questions.", | |
| "system": "You generate clarifying questions.\nReturn JSON only.\nAt most maxQuestions questions.\nQuestions must be answerable in one sentence.", | |
| "user": "Max questions: {{maxQuestions}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "questions": [ | |
| "Which partner are you referring to?", | |
| "What is the first concrete step you want to take this week?" | |
| ], | |
| "confidence": 0.79 | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Do not exceed requested question count", | |
| "input": { | |
| "memoId": "memo_test_questions_01", | |
| "transcript": "Should improve onboarding maybe.", | |
| "maxQuestions": 1 | |
| }, | |
| "assertions": [ | |
| "questions length equals 1", | |
| "question ends with ?" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "hybrid-model-router", | |
| "title": "Hybrid Local/Cloud Router", | |
| "tier": "local-first", | |
| "objective": "Route requests to local first, escalating only when complexity requires cloud.", | |
| "inputExample": { | |
| "requestId": "req_2026_04_04_1115", | |
| "taskType": "summary", | |
| "transcriptLengthTokens": 420, | |
| "requiresLongContext": false, | |
| "privacyLevel": "high", | |
| "localAvailability": true | |
| }, | |
| "prompt": { | |
| "task": "Decide whether to run local or cloud for this request.", | |
| "system": "You are a model router.\nReturn JSON only.\nPrefer local when quality risk is acceptable.\nIf privacyLevel is high, local wins unless impossible.", | |
| "user": "Request metadata:\n{{requestMetadata}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "route": "local", | |
| "provider": "apple-foundation-model", | |
| "reason": "Short summary task with high privacy requirement.", | |
| "expectedLatencyMs": 700 | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Long-context tasks escalate to cloud", | |
| "input": { | |
| "requestId": "req_test_router_01", | |
| "taskType": "complex-reasoning", | |
| "transcriptLengthTokens": 6400, | |
| "requiresLongContext": true, | |
| "privacyLevel": "medium", | |
| "localAvailability": true | |
| }, | |
| "assertions": [ | |
| "route equals \"cloud\"", | |
| "reason mentions long context" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "context-packet-builder", | |
| "title": "Context Packet Builder", | |
| "tier": "local-first", | |
| "objective": "Package just enough memory context for downstream steps without token bloat.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_04_1210", | |
| "transcript": "Need to finalize waitlist flow and launch email sequence this week.", | |
| "relatedMemos": [ | |
| { | |
| "memoId": "m_prev_1", | |
| "summary": "Chose ConvertKit for launch sequence." | |
| }, | |
| { | |
| "memoId": "m_prev_2", | |
| "summary": "Waitlist conversion dropped after form change." | |
| } | |
| ], | |
| "openTasks": [ | |
| { | |
| "id": "t1", | |
| "text": "Fix waitlist form validation", | |
| "status": "in-progress" | |
| }, | |
| { | |
| "id": "t2", | |
| "text": "Draft launch email 2", | |
| "status": "todo" | |
| } | |
| ], | |
| "tokenBudget": 800 | |
| }, | |
| "prompt": { | |
| "task": "Build compact context packet for next LLM call.", | |
| "system": "You build context packets.\nReturn JSON only.\nHonor tokenBudget.\nPrioritize decisions, active tasks, and unresolved questions.", | |
| "user": "Token budget: {{tokenBudget}}\nCurrent transcript:\n{{transcript}}\nRelated memos:\n{{relatedMemos}}\nOpen tasks:\n{{openTasks}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "packet": { | |
| "decisions": [ | |
| "ConvertKit selected for launch sequence." | |
| ], | |
| "activeTasks": [ | |
| "Fix waitlist form validation", | |
| "Draft launch email 2" | |
| ], | |
| "openQuestions": [ | |
| "Did form change cause drop in conversion?" | |
| ], | |
| "relevantMemoIds": [ | |
| "m_prev_1", | |
| "m_prev_2" | |
| ] | |
| }, | |
| "tokenEstimate": 96 | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Context packet must stay under budget", | |
| "input": { | |
| "memoId": "memo_test_packet_01", | |
| "transcript": "Need to plan hiring and launch and docs and support and pricing and analytics.", | |
| "relatedMemos": [], | |
| "openTasks": [], | |
| "tokenBudget": 120 | |
| }, | |
| "assertions": [ | |
| "tokenEstimate <= 120", | |
| "packet has at least one decision or openQuestion field" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "conversation-to-checklist", | |
| "title": "Conversation To Checklist Transformer", | |
| "tier": "local-first", | |
| "objective": "Convert stream-of-consciousness transcripts into ordered execution checklists.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_04_1305", | |
| "transcript": "For launch day: first QA the checkout flow, then schedule tweets, then send to press list after site is live.", | |
| "ownerDefault": "Arach" | |
| }, | |
| "prompt": { | |
| "task": "Transform transcript into ordered checklist with dependencies.", | |
| "system": "You convert speech to checklist.\nReturn JSON only.\nEach item needs: id, text, order, dependsOn, owner.\nPreserve execution order from transcript when explicit.", | |
| "user": "Owner default: {{ownerDefault}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "checklist": [ | |
| { | |
| "id": "c1", | |
| "text": "QA checkout flow", | |
| "order": 1, | |
| "dependsOn": [], | |
| "owner": "Arach" | |
| }, | |
| { | |
| "id": "c2", | |
| "text": "Schedule launch tweets", | |
| "order": 2, | |
| "dependsOn": [ | |
| "c1" | |
| ], | |
| "owner": "Arach" | |
| }, | |
| { | |
| "id": "c3", | |
| "text": "Send press list announcement", | |
| "order": 3, | |
| "dependsOn": [ | |
| "c1" | |
| ], | |
| "owner": "Arach" | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Dependency order matches explicit sequencing words", | |
| "input": { | |
| "memoId": "memo_test_checklist_01", | |
| "transcript": "First export data. Then verify CSV. Finally email finance.", | |
| "ownerDefault": "Arach" | |
| }, | |
| "assertions": [ | |
| "order values are 1,2,3", | |
| "item 2 depends on item 1", | |
| "item 3 depends on item 2 or item 1" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "personal-knowledge-graph", | |
| "title": "Personal Knowledge Graph From Voice", | |
| "tier": "big-swings", | |
| "objective": "Build a local graph of people, projects, decisions, and open questions over time.", | |
| "inputExample": { | |
| "memos": [ | |
| { | |
| "memoId": "mkg1", | |
| "transcript": "Dana owns launch email copy. We decided to postpone referral pilot to May." | |
| }, | |
| { | |
| "memoId": "mkg2", | |
| "transcript": "Question still open: should we gate referral by invite code?" | |
| } | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Extract graph nodes and edges from memo batch.", | |
| "system": "You construct a personal knowledge graph.\nReturn JSON only.\nNodes can be person, project, decision, question, artifact.\nEdges need type, sourceNodeId, targetNodeId, evidenceMemoId.", | |
| "user": "Memos:\n{{memos}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "nodes": [ | |
| { | |
| "id": "person_dana", | |
| "type": "person", | |
| "label": "Dana" | |
| }, | |
| { | |
| "id": "project_launch_email", | |
| "type": "project", | |
| "label": "Launch email copy" | |
| }, | |
| { | |
| "id": "decision_referral_may", | |
| "type": "decision", | |
| "label": "Postpone referral pilot to May" | |
| }, | |
| { | |
| "id": "question_referral_gate", | |
| "type": "question", | |
| "label": "Gate referral by invite code?" | |
| } | |
| ], | |
| "edges": [ | |
| { | |
| "type": "owns", | |
| "sourceNodeId": "person_dana", | |
| "targetNodeId": "project_launch_email", | |
| "evidenceMemoId": "mkg1" | |
| }, | |
| { | |
| "type": "decides", | |
| "sourceNodeId": "project_launch_email", | |
| "targetNodeId": "decision_referral_may", | |
| "evidenceMemoId": "mkg1" | |
| }, | |
| { | |
| "type": "raises", | |
| "sourceNodeId": "project_launch_email", | |
| "targetNodeId": "question_referral_gate", | |
| "evidenceMemoId": "mkg2" | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Duplicate entity names should be merged", | |
| "input": { | |
| "memos": [ | |
| { | |
| "memoId": "a", | |
| "transcript": "Talk to Chris about pricing." | |
| }, | |
| { | |
| "memoId": "b", | |
| "transcript": "Chris confirmed pricing test." | |
| } | |
| ] | |
| }, | |
| "assertions": [ | |
| "only one node labeled Chris", | |
| "edges reference merged Chris node id" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "catch-me-up-daily-brief", | |
| "title": "Catch Me Up Daily Brief", | |
| "tier": "big-swings", | |
| "objective": "Produce a private daily narrative from memos, tasks, and decisions.", | |
| "inputExample": { | |
| "date": "2026-04-04", | |
| "memos": [ | |
| { | |
| "memoId": "d1", | |
| "summary": "Launch date locked for May 10." | |
| }, | |
| { | |
| "memoId": "d2", | |
| "summary": "Need legal review on revised terms." | |
| } | |
| ], | |
| "completedTasks": [ | |
| "Draft launch email 1", | |
| "Fix duplicate reminders bug" | |
| ], | |
| "openTasks": [ | |
| "Schedule legal review" | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Generate concise daily brief with wins, risks, and next actions.", | |
| "system": "You write daily briefs.\nReturn JSON only.\nSections required: wins, risks, nextActions.\nKeep each section under 3 bullets.", | |
| "user": "Date: {{date}}\nMemos: {{memos}}\nCompleted tasks: {{completedTasks}}\nOpen tasks: {{openTasks}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "wins": [ | |
| "Launch date finalized for May 10.", | |
| "Duplicate reminders bug fixed." | |
| ], | |
| "risks": [ | |
| "Legal review still pending for terms update." | |
| ], | |
| "nextActions": [ | |
| "Book legal review slot by Monday." | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Daily brief includes all required sections", | |
| "input": { | |
| "date": "2026-04-04", | |
| "memos": [ | |
| { | |
| "memoId": "x", | |
| "summary": "Mostly planning chatter." | |
| } | |
| ], | |
| "completedTasks": [], | |
| "openTasks": [ | |
| "Finalize budget" | |
| ] | |
| }, | |
| "assertions": [ | |
| "wins section exists", | |
| "risks section exists", | |
| "nextActions section exists" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "contradiction-drift-detection", | |
| "title": "Contradiction And Drift Detection", | |
| "tier": "big-swings", | |
| "objective": "Detect conflicts between new memos and prior decisions.", | |
| "inputExample": { | |
| "newMemo": { | |
| "memoId": "new1", | |
| "transcript": "Let us launch on April 28 instead of May 10." | |
| }, | |
| "priorDecisions": [ | |
| { | |
| "decisionId": "dec_12", | |
| "text": "Launch date is May 10, approved in planning meeting.", | |
| "date": "2026-04-01" | |
| } | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Flag contradictions or strategic drift against known decisions.", | |
| "system": "You detect contradictions.\nReturn JSON only.\nFor each conflict include severity, conflictingDecisionId, and explanation.\nNo conflict should be returned as empty array.", | |
| "user": "New memo:\n{{newMemo}}\nPrior decisions:\n{{priorDecisions}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "conflicts": [ | |
| { | |
| "conflictingDecisionId": "dec_12", | |
| "severity": "high", | |
| "explanation": "New memo proposes April 28 while approved date is May 10.", | |
| "recommendation": "Request explicit decision override before updating timeline." | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Date conflict should be high severity", | |
| "input": { | |
| "newMemo": { | |
| "memoId": "new_test_01", | |
| "transcript": "Move quarterly review from June 20 to June 2." | |
| }, | |
| "priorDecisions": [ | |
| { | |
| "decisionId": "d9", | |
| "text": "Quarterly review date fixed to June 20.", | |
| "date": "2026-03-30" | |
| } | |
| ] | |
| }, | |
| "assertions": [ | |
| "conflicts length >= 1", | |
| "first conflict severity equals high" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "momentum-scoring", | |
| "title": "Momentum Scoring", | |
| "tier": "big-swings", | |
| "objective": "Quantify execution momentum from spoken intents versus completed outcomes.", | |
| "inputExample": { | |
| "periodDays": 14, | |
| "intents": [ | |
| { | |
| "text": "Ship waitlist flow", | |
| "firstSeen": "2026-03-24", | |
| "repeats": 4 | |
| }, | |
| { | |
| "text": "Book legal review", | |
| "firstSeen": "2026-03-29", | |
| "repeats": 3 | |
| } | |
| ], | |
| "completions": [ | |
| { | |
| "text": "Ship waitlist flow", | |
| "completedAt": "2026-04-02" | |
| } | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Compute momentum score and explain key drivers.", | |
| "system": "You score execution momentum.\nReturn JSON only.\nScore is 0-100.\nPenalize repeated unresolved intents.\nReward completed intents within period.", | |
| "user": "Period days: {{periodDays}}\nIntents:\n{{intents}}\nCompletions:\n{{completions}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "momentumScore": 62, | |
| "trend": "flat", | |
| "drivers": [ | |
| "One high-repeat intent completed (waitlist flow).", | |
| "Legal review intent remains unresolved with 3 repeats." | |
| ], | |
| "unresolvedHotspots": [ | |
| "Book legal review" | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Score drops when repeats rise without completion", | |
| "input": { | |
| "periodDays": 14, | |
| "intents": [ | |
| { | |
| "text": "Fix onboarding bug", | |
| "firstSeen": "2026-03-20", | |
| "repeats": 6 | |
| } | |
| ], | |
| "completions": [] | |
| }, | |
| "assertions": [ | |
| "momentumScore < 50", | |
| "unresolvedHotspots includes \"Fix onboarding bug\"" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "local-agent-loop", | |
| "title": "Local Agent Loop For Memo Processing", | |
| "tier": "big-swings", | |
| "objective": "Run a deterministic local chain: classify, extract, summarize, route, verify.", | |
| "inputExample": { | |
| "memoId": "memo_2026_04_04_1430", | |
| "transcript": "Need to reschedule partner demo to Wednesday and send revised deck tonight.", | |
| "enabledSteps": [ | |
| "classify", | |
| "extract", | |
| "summarize", | |
| "route", | |
| "verify" | |
| ] | |
| }, | |
| "prompt": { | |
| "task": "Produce outputs for each pipeline step and final state.", | |
| "system": "You orchestrate a local memo pipeline.\nReturn JSON only.\nEmit per-step outputs and final status.\nIf verify fails, finalStatus must be \"needs-review\".", | |
| "user": "Memo ID: {{memoId}}\nEnabled steps: {{enabledSteps}}\nTranscript:\n{{transcript}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "steps": { | |
| "classify": { | |
| "primaryType": "task", | |
| "confidence": 0.9 | |
| }, | |
| "extract": { | |
| "items": [ | |
| "Reschedule partner demo to Wednesday", | |
| "Send revised deck tonight" | |
| ] | |
| }, | |
| "summarize": { | |
| "text": "Two immediate partner follow-ups identified." | |
| }, | |
| "route": { | |
| "workflow": "task-and-calendar" | |
| }, | |
| "verify": { | |
| "passed": true, | |
| "issues": [] | |
| } | |
| }, | |
| "finalStatus": "ready" | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Failed verify step blocks auto-execution", | |
| "input": { | |
| "memoId": "memo_test_loop_01", | |
| "transcript": "Maybe move something around at some point.", | |
| "enabledSteps": [ | |
| "classify", | |
| "extract", | |
| "summarize", | |
| "route", | |
| "verify" | |
| ] | |
| }, | |
| "assertions": [ | |
| "verify.passed can be false for vague memo", | |
| "finalStatus equals \"needs-review\" when verify fails" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "meeting-live-structure", | |
| "title": "Meeting Mode Live Rolling Structure", | |
| "tier": "big-swings", | |
| "objective": "Maintain a live structured view of agenda, decisions, questions, and actions while speaking.", | |
| "inputExample": { | |
| "meetingId": "meeting_2026_04_04_prod", | |
| "chunkIndex": 5, | |
| "chunkText": "Decision: cut scope to onboarding and billing. Open question: who owns docs migration?", | |
| "currentState": { | |
| "agenda": [ | |
| "Release planning" | |
| ], | |
| "decisions": [], | |
| "openQuestions": [], | |
| "actionItems": [] | |
| } | |
| }, | |
| "prompt": { | |
| "task": "Update meeting state from new transcript chunk.", | |
| "system": "You maintain rolling meeting structure.\nReturn JSON only.\nUpdate state incrementally.\nDo not duplicate existing items.\nTag new items with chunkIndex.", | |
| "user": "Meeting ID: {{meetingId}}\nChunk index: {{chunkIndex}}\nChunk text:\n{{chunkText}}\nCurrent state:\n{{currentState}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "updatedState": { | |
| "agenda": [ | |
| "Release planning" | |
| ], | |
| "decisions": [ | |
| { | |
| "text": "Cut scope to onboarding and billing", | |
| "chunkIndex": 5 | |
| } | |
| ], | |
| "openQuestions": [ | |
| { | |
| "text": "Who owns docs migration?", | |
| "chunkIndex": 5 | |
| } | |
| ], | |
| "actionItems": [] | |
| } | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Repeated decision text should not duplicate", | |
| "input": { | |
| "meetingId": "meeting_test_live_01", | |
| "chunkIndex": 8, | |
| "chunkText": "Decision: keep beta closed for now.", | |
| "currentState": { | |
| "agenda": [], | |
| "decisions": [ | |
| { | |
| "text": "Keep beta closed for now.", | |
| "chunkIndex": 2 | |
| } | |
| ], | |
| "openQuestions": [], | |
| "actionItems": [] | |
| } | |
| }, | |
| "assertions": [ | |
| "updatedState.decisions length stays 1", | |
| "existing decision remains unchanged" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "intent-trend-alerts", | |
| "title": "Intent Trend Alerts", | |
| "tier": "big-swings", | |
| "objective": "Detect recurring spoken intents that are not converting into completed work.", | |
| "inputExample": { | |
| "lookbackDays": 30, | |
| "intentSeries": [ | |
| { | |
| "intent": "Fix onboarding analytics", | |
| "mentionCount": 7, | |
| "completionCount": 0 | |
| }, | |
| { | |
| "intent": "Ship billing retry update", | |
| "mentionCount": 3, | |
| "completionCount": 2 | |
| } | |
| ], | |
| "alertThreshold": { | |
| "minMentions": 4, | |
| "maxCompletions": 0 | |
| } | |
| }, | |
| "prompt": { | |
| "task": "Generate alerts for unresolved repeated intents.", | |
| "system": "You detect intent trends.\nReturn JSON only.\nAlert when mentionCount meets threshold and completionCount is low.\nInclude one suggested intervention per alert.", | |
| "user": "Lookback: {{lookbackDays}} days\nIntent series:\n{{intentSeries}}\nThreshold:\n{{alertThreshold}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "alerts": [ | |
| { | |
| "intent": "Fix onboarding analytics", | |
| "severity": "medium", | |
| "reason": "Mentioned 7 times with 0 completions in 30 days.", | |
| "suggestedIntervention": "Schedule 45-minute focused block and define done criteria." | |
| } | |
| ] | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Threshold logic gates alert emission", | |
| "input": { | |
| "lookbackDays": 30, | |
| "intentSeries": [ | |
| { | |
| "intent": "Refactor UI", | |
| "mentionCount": 2, | |
| "completionCount": 0 | |
| } | |
| ], | |
| "alertThreshold": { | |
| "minMentions": 4, | |
| "maxCompletions": 0 | |
| } | |
| }, | |
| "assertions": [ | |
| "alerts length equals 0" | |
| ] | |
| } | |
| }, | |
| { | |
| "id": "voice-os-command-layer", | |
| "title": "Voice-Based Operating Layer", | |
| "tier": "big-swings", | |
| "objective": "Translate natural speech into structured executable commands with safety gates.", | |
| "inputExample": { | |
| "utterance": "Open the latest launch notes, append today's blockers, and share with Dana in Slack.", | |
| "environment": { | |
| "apps": [ | |
| "notes", | |
| "slack", | |
| "finder" | |
| ], | |
| "safetyMode": "confirm-destructive" | |
| } | |
| }, | |
| "prompt": { | |
| "task": "Convert spoken instruction into structured command plan.", | |
| "system": "You convert voice commands to structured actions.\nReturn JSON only.\nUse steps with app, action, args.\nMark requiresConfirmation true for risky operations.", | |
| "user": "Utterance:\n{{utterance}}\nEnvironment:\n{{environment}}" | |
| }, | |
| "expectedOutput": { | |
| "format": "json", | |
| "example": { | |
| "intent": "multi-step-automation", | |
| "steps": [ | |
| { | |
| "app": "notes", | |
| "action": "open_latest", | |
| "args": { | |
| "notebook": "launch-notes" | |
| } | |
| }, | |
| { | |
| "app": "notes", | |
| "action": "append_text", | |
| "args": { | |
| "section": "blockers", | |
| "source": "today_summary" | |
| } | |
| }, | |
| { | |
| "app": "slack", | |
| "action": "share_note", | |
| "args": { | |
| "recipient": "Dana" | |
| } | |
| } | |
| ], | |
| "requiresConfirmation": false | |
| } | |
| }, | |
| "testCase": { | |
| "name": "Dangerous file actions require explicit confirmation", | |
| "input": { | |
| "utterance": "Delete the old exports folder and empty trash.", | |
| "environment": { | |
| "apps": [ | |
| "finder" | |
| ], | |
| "safetyMode": "confirm-destructive" | |
| } | |
| }, | |
| "assertions": [ | |
| "requiresConfirmation equals true", | |
| "at least one step action is marked destructive" | |
| ] | |
| } | |
| } | |
| ] | |