question: Send a 'hello' message to the general channel

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "message_text": {"contains": "hello"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

service: slack

system_prompt:
You are an AI assistant with access to the Slack API.
Use the execute_python tool to write Python code that interacts with the Slack Web API.
Make requests to https://api.slack.com/api/ using the requests library. Attempts to complete the task in full.
Authentication is handled automatically by leaving a placeholder SLACK_API_TOKEN_PLACEHOLDER in the request headers.

test_name: Send message to general channel

task: actionEval


question: Send a DM to John saying 'Can we sync later?'

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "sync later"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channels", "where": {"is_dm": {"eq": true}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Send direct message

task: actionEval


question: Send a DM (group conversation not channel) to Artem and Hubert saying 'Hey, I've took a look at the presentation and I have some questions. Can you help me?'

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "presentation and I have some questions"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channels", "where": {"is_gc": {"eq": true}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Send direct message Artem, and Hubert (Create group conversation + send message)

task: actionEval


question: Create a new channel called 'rl-project'

answer: {"assertions": [{"diff_type": "added", "entity": "channels", "where": {"channel_name": {"i_contains": "rl-project"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Create a new channel

task: actionEval


question: Add Morgan Stanley to the 'random' channel

answer: {"assertions": [{"diff_type": "added", "entity": "channel_members", "where": {"user_id": {"eq": "U05MORGAN23"}, "channel_id": {"eq": "C02EFGH5678"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Add user to channel

task: actionEval


question: Create a new channel called 'rl-project' and add Morgan Stanley to it

answer: {"assertions": [{"diff_type": "added", "entity": "channels", "where": {"channel_name": {"i_contains": "rl-project"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channel_members", "where": {"user_id": {"eq": "U05MORGAN23"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Create a new channel and add user to it

task: actionEval


question: Remove John from the #random channel

answer: {"assertions": [{"diff_type": "removed", "entity": "channel_members", "where": {"channel_id": {"eq": "C02EFGH5678"}, "user_id": {"eq": "U02JOHNDOE1"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Remove user from channel

task: actionEval


question: Archive the #growth channel

answer: {"assertions": [{"diff_type": "changed", "entity": "channels", "where": {"channel_id": {"eq": "C04MNOP3456"}}, "expected_changes": {"is_archived": {"to": true}}, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Archive a channel

task: actionEval


question: Reply 'Next monday.' to the most recent message in #general

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"parent_id": {"eq": "1700173200.000456"}, "channel_id": {"eq": "C01ABCD1234"}, "message_text": {"contains": "Next monday"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Reply in a thread

task: actionEval


question: Reply 'Next monday.' to the to MCP deployment questions in #general

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"parent_id": {"eq": "1700173200.000456"}, "channel_id": {"eq": "C01ABCD1234"}, "message_text": {"contains": "Next monday"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

task: actionEval


question: React with :thumbsup: to the question about lunch in #random

answer: {"assertions": [{"diff_type": "added", "entity": "message_reactions", "where": {"message_id": {"eq": "1699572000.000789"}, "user_id": {"eq": "U01AGENBOT9"}, "reaction_type": {"eq": "thumbsup"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Add emoji reaction

task: actionEval


question: React with :thumbsup: to the most recent posted message in #general

answer: {"assertions": [{"diff_type": "added", "entity": "message_reactions", "where": {"message_id": {"eq": "1700173200.000456"}, "user_id": {"eq": "U01AGENBOT9"}, "reaction_type": {"eq": "thumbsup"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

task: actionEval


question: Change the #general channel topic to 'Weekly standup discussions'

answer: {"assertions": [{"diff_type": "changed", "entity": "channels", "where": {"channel_id": {"eq": "C01ABCD1234"}}, "expected_changes": {"topic_text": {"to": {"contains": "Weekly standup"}}}, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Update channel topic

task: actionEval


question: Find the message that says 'Hey team' and edit it to say 'Hello everyone'

answer: {"assertions": [{"diff_type": "changed", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "message_id": {"eq": "1699564800.000123"}}, "expected_changes": {"message_text": {"to": {"contains": "Hello everyone"}}}, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Edit existing message

task: actionEval


question: Post to #general mentioning Artem with text 'Please review the pull request'

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "message_text": {"contains": "<@U02ARTEM23>"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Mention user in message

task: actionEval


question: Send 'System maintenance tonight at 10pm' to both #general and #random

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"message_text": {"contains": "maintenance"}, "channel_id": {"eq": "C01ABCD1234"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"message_text": {"contains": "maintenance"}, "channel_id": {"eq": "C02EFGH5678"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Multi-channel send

task: actionEval


question: Delete the message about new feature you posted in #general

answer: {"assertions": [{"diff_type": "removed", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "message_text": {"contains": "new feature"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Delete old message

task: actionEval


question: Copy the two questions from #random and post them both to #general

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "message_text": {"contains": "lunch"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "message_text": {"contains": "Gemini"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Forward messages to another channel

task: actionEval


question: Search for all messages (4 messages) in the #engineering channel related to login issues and combine them into a single new message as DM to Hubert. Do not change the meaning of the original messages just combine them.

answer: {"assertions": [{"diff_type": "added", "entity": "channels", "where": {"is_dm": {"eq": true}, "channel_id": {"regex": "^D"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channel_members", "where": {"user_id": {"eq": "U06HUBERT23"}, "channel_id": {"regex": "^D"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channel_members", "where": {"user_id": {"eq": "U01AGENBOT9"}, "channel_id": {"regex": "^D"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "channel_id": {"regex": "^D"}, "message_text": {"contains": "500 errors"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "channel_id": {"regex": "^D"}, "message_text": {"contains": "invalid_grant"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "channel_id": {"regex": "^D"}, "message_text": {"contains": "login rate limit"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "channel_id": {"regex": "^D"}, "message_text": {"contains": "login endpoint"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Search messages in a channel and combine results into a new message as DM

task: actionEval


question: Search for all messages (6 messages) related to login issues and auth improvments. Combine them into a single new message as DM to Hubert. Do not change the meaning of the original messages just combine them.

answer: {"assertions": [{"diff_type": "added", "entity": "channels", "where": {"is_dm": {"eq": true}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channel_members", "where": {"user_id": {"eq": "U06HUBERT23"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "500 errors"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "invalid_grant"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "login rate limit"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "login endpoint"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "captcha"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "empty password"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Search messages in multiple channels and combine results into a new message as DM

task: actionEval


question: Search for all messages (6 messages) related to login issues and auth improvments. Edit the message in the #engineering channel you sent before without details about issues and add the details about the issues and improvements. Do not change the meaning/ woring of the original messages just combine them.

answer: {"assertions": [{"diff_type": "changed", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "message_id": {"eq": "1700143200.000999"}}, "expected_changes": {"message_text": {"to": {"contains": "500 errors"}}}, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "changed", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "message_id": {"eq": "1700143200.000999"}}, "expected_changes": {"message_text": {"to": {"contains": "invalid_grant"}}}, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "changed", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "message_id": {"eq": "1700143200.000999"}}, "expected_changes": {"message_text": {"to": {"contains": "login rate limit"}}}, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "changed", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "message_id": {"eq": "1700143200.000999"}}, "expected_changes": {"message_text": {"to": {"contains": "login endpoint"}}}, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "changed", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "message_id": {"eq": "1700143200.000999"}}, "expected_changes": {"message_text": {"to": {"contains": "captcha"}}}, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "changed", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "message_id": {"eq": "1700143200.000999"}}, "expected_changes": {"message_text": {"to": {"contains": "empty password"}}}, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Search messages in multiple channels and edit message in a channel with the combined results

task: actionEval


question: You've replied to one of the messages with a bad joke. Edit it, for 'I will make a proposal for auth improvements tommorow EOD'

answer: {"assertions": [{"diff_type": "changed", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "parent_id": {"eq": "1700143200.000999"}, "message_id": {"eq": "1700153200.000999"}, "user_id": {"eq": "U01AGENBOT9"}}, "expected_changes": {"message_text": {"to": {"contains": "proposal for auth improvements tommorow EOD"}}}, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Edit a thread message

task: actionEval


question: Send a message to #general saying 'Attention' in bold and 'check logs' in italics. Use Slack Block Kit rich_text blocks with style attributes (bold:true, italic:true).

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "blocks": {"contains": "rich_text_section"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "blocks": {"contains": "\"bold\":true"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "blocks": {"contains": "\"italic\":true"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Rich Text: Basic Formatting (Bold/Italic)

task: actionEval


question: Send a bulleted list to #random with three items: 'Bagels', 'Coffee', and 'Donuts'. Use Slack Block Kit rich_text blocks with rich_text_list (style:bullet).

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C02EFGH5678"}, "blocks": {"contains": "rich_text_list"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C02EFGH5678"}, "blocks": {"contains": "\"style\":\"bullet\""}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Rich Text: Bulleted List

task: actionEval


question: Do two things using Slack Block Kit: 1) Send a code snippet to #engineering containing `{"status": 200}` using rich_text_preformatted element, and 2) Send a numbered list to #general with items 'Phase 1' and 'Phase 2' using rich_text_list with style:ordered.

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "blocks": {"contains": "rich_text_preformatted"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "blocks": {"contains": "rich_text_list"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Rich Text: Code Block and Numbered List

task: actionEval


question: Quote the text 'To be or not to be' in the #random channel. Use Slack Block Kit rich_text blocks with rich_text_quote element.

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C02EFGH5678"}, "blocks": {"contains": "rich_text_quote"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Rich Text: Block Quote

task: actionEval


question: Send a table to #growth with headers 'Metric' and 'Value', and one row of data: 'DAU', '1500'. Use Slack Block Kit with a table block type.

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C04MNOP3456"}, "blocks": {"contains": "\"type\":\"table\""}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C04MNOP3456"}, "blocks": {"contains": "DAU"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Table Block Generation

task: actionEval


question: Send a markdown formatted message to #engineering with a header 'Daily Report' and a bold item '**All Systems Go**'. Use Slack Block Kit with a markdown block type.

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "blocks": {"contains": "\"type\":\"mrkdwn\""}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Markdown Block (Direct)

task: actionEval


question: Mention @Artem in #general using Slack Block Kit rich_text blocks with a user element type containing Artem's user ID.

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "blocks": {"contains": "\"type\":\"user\""}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C01ABCD1234"}, "blocks": {"contains": "U02ARTEM23"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Rich Text: User Mention

task: actionEval


question: Find the user who complained about 'captcha' in #general and send them a DM saying 'I am looking into this.'

answer: {"assertions": [{"diff_type": "added", "entity": "channels", "where": {"is_dm": {"eq": true}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "looking into this"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channel_members", "where": {"user_id": {"eq": "U06HUBERT23"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Chained Reasoning: Search and DM

task: actionEval


question: Create a new channel called 'auth-force' and invite everyone who has posted about 'login' or 'password'.

answer: {"assertions": [{"diff_type": "added", "entity": "channels", "where": {"channel_name": {"contains": "auth-force"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channel_members", "where": {"user_id": {"in": ["U01AGENBOT9", "U02JOHNDOE1", "U03ROBERT23", "U05MORGAN23", "U02ARTEM23", "U06HUBERT23"]}}, "expected_count": 6, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Set Operations: Group Invite based on Topic

task: actionEval


question: Try to invite the user 'ElonMusk' to #general. If you can't find him, inform me (Hubert) via Slack.

answer: {"assertions": [{"diff_type": "added", "entity": "channel_members", "where": {"channel_id": {"eq": "C01ABCD1234"}}, "expected_count": 0, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channels", "where": {"is_dm": {"eq": true}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"user_id": {"eq": "U01AGENBOT9"}, "message_text": {"contains": "find"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "channel_members", "where": {"user_id": {"eq": "U06HUBERT23"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Constraint Verification (Negative Test)

task: actionEval


question: Who are the admins of the 'Test Workspace'? Reply with their names in #random.

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C02EFGH5678"}, "message_text": {"contains": "Robert"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C02EFGH5678"}, "message_text": {"contains": "Morgan"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Information Synthesis

task: actionEval


question: Invite the Morgan who is NOT an admin to #random.

answer: {"assertions": [{"diff_type": "added", "entity": "channel_members", "where": {"user_id": {"eq": "U05MORGAN23"}, "channel_id": {"eq": "C02EFGH5678"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Ambiguity Resolution (Contextual User)

task: actionEval


question: Post 'Status update: Alpha is on track' to the alpha dev channel.

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C06ALPHADEV"}, "message_text": {"contains": "Status update"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Ambiguity Resolution (Contextual Channel)

task: actionEval


question: Summarize the discussion about 'Gemini' in #random and post the summary to #engineering.

answer: {"assertions": [{"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "message_text": {"contains": "frontend"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}, {"diff_type": "added", "entity": "messages", "where": {"channel_id": {"eq": "C03IJKL9012"}, "message_text": {"contains": "Flash"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Cross-channel Summarization

task: actionEval


question: Check the discussion in #growth. If the team decided to double down on Reddit, react with :rocket: to the message proposing it.

answer: {"assertions": [{"diff_type": "added", "entity": "message_reactions", "where": {"message_id": {"eq": "1700300240.000005"}, "user_id": {"eq": "U01AGENBOT9"}, "reaction_type": {"eq": "rocket"}}, "expected_count": 1, "ignore_fields": ["created_at", "updated_at"]}]}

test_name: Conditional Logic

task: actionEval