UiPathFlow Evalboard
ADX dashboard

Skill rpa before after hooks

Passed
skill-rpa-before-after-hooks · run 2026-04-17_13-38-59
Score
1.00
Duration
89.0s
Cost
$0.296
Final status
SUCCESS
Tool calls
14
uipath-rpasmokecodedhooks

Prompt

I have a UiPath coded test project called "LoginTests" with several test
case files. I need shared setup and teardown logic that runs before and
after every test case — opening and closing the browser.

The project already exists at ./LoginTests with a project.json.
Studio Desktop is NOT available — skip any CLI commands that require
--use-studio. Focus on generating the correct files.

Requirements:
- Set up shared Before/After hooks that apply to ALL test cases
- Use the recommended pattern from the skill (partial class, not base class)
- Include browser open in Before and browser close in After
- Create one example test case (TestLoginSuccess.cs) that benefits from the hooks

Save a summary to report.json:
  {
    "hooks_file": "<filename of the hooks file>",
    "hooks_pattern": "<'partial_class' or 'base_class'>",
    "hooks_class_declaration": "<the class declaration line>",
    "test_case_file": "<filename of the test case>",
    "test_case_inherits_from": "<base class of the test case>"
  }

Important:
- The `uip` CLI is already available in the environment.
- Use `--output json` on any uip commands you run.

Success criteria (6)

PASSHooks file was created in the projectscore 1
File 'LoginTests/CodedWorkflowHooks.cs' exists
PASSHooks file uses partial class CodedWorkflow with IBeforeAfterRunscore 1
Includes: 4/4 found; Score: 1.00
PASSExample test case was createdscore 1
File 'LoginTests/TestLoginSuccess.cs' exists
PASSTest case inherits from CodedWorkflow (not CodedWorkflowBase)score 1
Includes: 2/2 found; Score: 1.00
PASSreport.json was createdscore 1
File 'report.json' exists
PASSreport.json confirms partial class pattern was usedscore 1
Assertions: 2/2 passed; Score: 1.00

Command timeline (14)

agent tool calls in order
  1. 1.Skilluipath:uipath-rpa
  2. 2.Read/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTe…
  3. 3.Read/Users/religa/src/skills/skills/uipath-rpa/assets/before-after-hooks-template.md
  4. 4.GlobLoginTests/**/*
  5. 5.Read/Users/religa/src/skills/skills/uipath-rpa/references/coded/operations-guide.md
  6. 6.BashList working dir and LoginTests contents
  7. 7.BashCheck uip rpa create-project help options
  8. 8.Read/Users/religa/src/skills/skills/uipath-rpa/assets/json-template.md
  9. 9.BashCreate LoginTests directory
  10. 10.Write/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTe…
  11. 11.Write/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTe…
  12. 12.Write/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTe…
  13. 13.Write/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/report.…
  14. 14.BashVerify all created files and show report

Artifacts

none

    task.log

    16,962 bytes · click to view
    2026-04-17 20:27:55 [DEBUG] coder_eval.criteria: Criteria already discovered, skipping
    2026-04-17 20:27:55 [DEBUG] coder_eval.criteria: Validated 13 criterion checkers
    2026-04-17 20:27:55 [INFO] coder_eval.orchestrator: API routing: anthropic_direct
    2026-04-17 20:27:55 [INFO] coder_eval.orchestrator: Starting iteration 1/2
    2026-04-17 20:27:55 [DEBUG] coder_eval.orchestrator: Sending prompt: I have a UiPath coded test project called "LoginTests" with several test
    case files. I need shared s...
    2026-04-17 20:27:55 [DEBUG] coder_eval.agents.claude_code_agent: Starting agent query stream...
    2026-04-17 20:28:01 [DEBUG] coder_eval.agents.claude_code_agent: --- SYSTEM (hook_started): {'type': 'system', 'subtype': 'hook_started', 'hook_id': '628d34db-2591-44f6-9744-a1f47d15bc51', 'hook_name': 'SessionStart:startup', 'hook_event': 'SessionStart', 'uuid': '4f526c0b-cb12-449b-a986-44a
    2026-04-17 20:28:01 [DEBUG] coder_eval.agents.claude_code_agent: --- SYSTEM (hook_response): {'type': 'system', 'subtype': 'hook_response', 'hook_id': '628d34db-2591-44f6-9744-a1f47d15bc51', 'hook_name': 'SessionStart:startup', 'hook_event': 'SessionStart', 'output': '@uipath/cli is already i
    2026-04-17 20:28:01 [DEBUG] coder_eval.agents.claude_code_agent: --- SYSTEM (init): {'type': 'system', 'subtype': 'init', 'cwd': '/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks', 'session_id': '46d655f
    2026-04-17 20:28:03 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT BLOCK (ThinkingBlock): ThinkingBlock(thinking='The user wants me to set up shared Before/After hooks for a UiPath coded test project. Let me use the UiPath RPA skill to handle this properly.', signature='Es0CClsIDBgCKkAybmI
    2026-04-17 20:28:05 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Skill | id=toolu_01DwvheuSBoJ5oEGS6MJaLPV | params={'skill': 'uipath:uipath-rpa', 'args': 'Set up shared Before/After hooks for a UiPath coded test project called "LoginTests" using the partial class pattern. The project already exists at ./LoginTests with a project.json. Requirements:\n- Set up shared Before/After hooks that apply to ALL test cases
    2026-04-17 20:28:05 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01DwvheuSBoJ5oEGS6MJaLPV | Launching skill: uipath:uipath-rpa
    2026-04-17 20:28:05 [DEBUG] coder_eval.agents.claude_code_agent: --- RateLimitEvent: RateLimitEvent(rate_limit_info=RateLimitInfo(status='allowed', resets_at=1776488400, rate_limit_type='five_hour', utilization=None, overage_status='allowed', overage_resets_at=1777593600, overage_disa
    2026-04-17 20:28:07 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT BLOCK (ThinkingBlock): ThinkingBlock(thinking='Let me start by reading the necessary reference files to understand the correct patterns for Before/After hooks in UiPath coded test projects.', signature='EswCClsIDBgCKkAMbOZ1
    2026-04-17 20:28:08 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT: I'll start by reading the project context and relevant reference files to understand the correct patterns for Before/After hooks.
    2026-04-17 20:28:09 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Read | id=toolu_01Din5nWcPAprTSGWWdx6Svv | params={'file_path': '/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTests/project.json'}
    2026-04-17 20:28:09 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [ERROR]: id=toolu_01Din5nWcPAprTSGWWdx6Svv | File does not exist. Note: your current working directory is /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks.
    2026-04-17 20:28:09 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Read | id=toolu_01JKcYs2UhjqszxcRYs4g1rk | params={'file_path': '/Users/religa/src/skills/skills/uipath-rpa/assets/before-after-hooks-template.md'}
    2026-04-17 20:28:09 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01JKcYs2UhjqszxcRYs4g1rk |      1→# Before/After Hooks Template
         2→
         3→## IBeforeAfterRun on Individual Workflow/Test Case
         4→
         5→**File: `TestLoginFlow.cs`**
         6→
         7→```csharp
         8→using UiPath.CodedWorkflows;
         9→
        10→namespace {{PROJECT_NAME}}
        11→{
        12→    public class TestLoginFlow : 
    2026-04-17 20:28:12 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT BLOCK (ThinkingBlock): ThinkingBlock(thinking='Now let me find the project.json file in the LoginTests directory by using Glob to look for it.', signature='EpwCClsIDBgCKkADwAq7ZYcVNL1DwMf7F95sFKfews7HsAUVs6Qcfd590cguukBIiXG
    2026-04-17 20:28:13 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Glob | id=toolu_01UyScRwVLePbUe6UUtsXGdj | params={'pattern': 'LoginTests/**/*'}
    2026-04-17 20:28:13 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01UyScRwVLePbUe6UUtsXGdj | No files found
    2026-04-17 20:28:13 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Read | id=toolu_01DRiVz1zjHHh8Rx7eSG4FSZ | params={'file_path': '/Users/religa/src/skills/skills/uipath-rpa/references/coded/operations-guide.md'}
    2026-04-17 20:28:13 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01DRiVz1zjHHh8Rx7eSG4FSZ |      1→# Operations Guide
         2→
         3→Detailed step-by-step procedures for all operations on UiPath coded workflow projects.
         4→
         5→## Initialize a New Project
         6→
         7→Creates a complete UiPath coded automation project from scratch. **ALWAYS use `uip rpa create-project`** — never w
    2026-04-17 20:28:16 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT BLOCK (ThinkingBlock): ThinkingBlock(thinking="Now I understand the pattern. Let me check if the LoginTests project exists, find the project.json, and understand the project structure before creating the files.\n\nThe glob 
    2026-04-17 20:28:17 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT: The LoginTests directory appears empty. Let me check the current working directory and investigate the project structure.
    2026-04-17 20:28:19 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Bash | id=toolu_01BCp76xC3BwEroLqK3TXSsP | params={'command': 'ls -la /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/ && echo "---" && ls -la /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-h
    2026-04-17 20:28:19 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01BCp76xC3BwEroLqK3TXSsP | total 0
    drwxr-xr-x  3 religa  staff   96 Apr 17 20:27 .
    drwxr-xr-x  3 religa  staff   96 Apr 17 20:27 ..
    drwxr-xr-x  7 religa  staff  224 Apr 17 20:27 .venv
    ---
    LoginTests dir not found or empty
    2026-04-17 20:28:23 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT BLOCK (ThinkingBlock): ThinkingBlock(thinking="So the LoginTests directory doesn't exist yet. I need to create it. But the user said the project already exists at ./LoginTests with a project.json. I'll need to create the pr
    2026-04-17 20:28:23 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Bash | id=toolu_01NFKd6gF227J7yrBfceqFfa | params={'command': 'uip rpa create-project --help 2>&1 | head -40', 'description': 'Check uip rpa create-project help options'}
    2026-04-17 20:28:24 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01NFKd6gF227J7yrBfceqFfa | [ERROR] Failed to load tool rpa-tool (version: 0.1.9, path: /Users/religa/node_modules/@uipath/rpa-tool/dist/tool.js): SyntaxError: The requested module '@uipath/common' does not provide an export named 'getOutputFormat'
    {
      "Result": "ConfigError",
      "Message": "Failed to load tool 'rpa-tool' (vers
    2026-04-17 20:28:30 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT BLOCK (ThinkingBlock): ThinkingBlock(thinking='The `uip rpa` tool is not available. I\'ll need to create the project structure manually. The user said "The project already exists at ./LoginTests with a project.json" - but i
    2026-04-17 20:28:30 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT: The `uip rpa` CLI tool isn't functioning. I'll reference the JSON template to create a correct `project.json` manually, then build all the required files.
    2026-04-17 20:28:30 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Read | id=toolu_01TSqP3eABhkE7jucB33BT8V | params={'file_path': '/Users/religa/src/skills/skills/uipath-rpa/assets/json-template.md'}
    2026-04-17 20:28:30 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01TSqP3eABhkE7jucB33BT8V |      1→# UiPath Coded Workflow Templates
         2→
         3→Ready-to-use templates for all UiPath coded automation project files. Replace placeholders in `{{PLACEHOLDER}}` format.
         4→
         5→> **IMPORTANT: Do NOT use these `project.json` / `project.uiproj` templates to create new projects.** Always 
    2026-04-17 20:28:39 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT BLOCK (ThinkingBlock): ThinkingBlock(thinking='Now I have all the information I need. Let me create:\n\n1. `LoginTests/` directory with `project.json` (Tests project type)\n2. `LoginTests/CodedWorkflowHooks.cs` - partial cl
    2026-04-17 20:28:39 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT: Now I have everything I need. Let me create all the files — the project.json, the hooks file, the test case, and the report.
    2026-04-17 20:28:40 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Bash | id=toolu_014wHB985oomgQD8w88bkVmR | params={'command': 'mkdir -p /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTests', 'description': 'Create LoginTests directory'}
    2026-04-17 20:28:40 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_014wHB985oomgQD8w88bkVmR | (Bash completed with no output)
    2026-04-17 20:28:47 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Write | id=toolu_01SzZxBksTs6a63aLKh9b8HR | params={'file_path': '/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTests/project.json', 'content': '{\n  "name": "LoginTests",\n  "projectId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",\n  "description": "Automated login
    2026-04-17 20:28:47 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01SzZxBksTs6a63aLKh9b8HR | File created successfully at: /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTests/project.json
    2026-04-17 20:28:49 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT: Now create the hooks file using the recommended **partial class** pattern:
    2026-04-17 20:28:54 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Write | id=toolu_01WxfYF734mbRZP7rD34UsFi | params={'file_path': '/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTests/CodedWorkflowHooks.cs', 'content': 'using UiPath.CodedWorkflows;\n\nnamespace LoginTests\n{\n    // Coded Source File — NOT a workflow or test c
    2026-04-17 20:28:54 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01WxfYF734mbRZP7rD34UsFi | File created successfully at: /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTests/CodedWorkflowHooks.cs
    2026-04-17 20:28:56 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT: Now create the example test case that benefits from the hooks:
    2026-04-17 20:29:03 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Write | id=toolu_01EUB6bDcvv6KUeSJS95fG8d | params={'file_path': '/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTests/TestLoginSuccess.cs', 'content': 'using UiPath.CodedWorkflows;\n\nnamespace LoginTests\n{\n    // Test case inherits from CodedWorkflow.\n    //
    2026-04-17 20:29:03 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01EUB6bDcvv6KUeSJS95fG8d | File created successfully at: /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/LoginTests/TestLoginSuccess.cs
    2026-04-17 20:29:05 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT: Now write the `report.json` summary:
    2026-04-17 20:29:06 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Write | id=toolu_01H7rCLVNLEKCsZWeE1Fz3NH | params={'file_path': '/Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/report.json', 'content': '{\n  "hooks_file": "CodedWorkflowHooks.cs",\n  "hooks_pattern": "partial_class",\n  "hooks_class_declaration": "public partial cl
    2026-04-17 20:29:06 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_01H7rCLVNLEKCsZWeE1Fz3NH | File created successfully at: /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/report.json
    2026-04-17 20:29:08 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT: Let me do a final verification of all created files:
    2026-04-17 20:29:10 [DEBUG] coder_eval.agents.claude_code_agent: >>> TOOL CALL: Bash | id=toolu_018sJZd29qZEZT683tMYooSy | params={'command': 'echo "=== Directory structure ===" && find /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks -not -path \'*/.venv/*\' | sort && echo "" && echo "=== report.json ===" && cat /Users/religa/src/coder_eval/runs/
    2026-04-17 20:29:10 [DEBUG] coder_eval.agents.claude_code_agent: <<< TOOL RESULT [OK]: id=toolu_018sJZd29qZEZT683tMYooSy | === Directory structure ===
    /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks
    /Users/religa/src/coder_eval/runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks/.venv
    /Users
    2026-04-17 20:29:22 [DEBUG] coder_eval.agents.claude_code_agent: >>> ASSISTANT: All files are in place. Here's a summary of what was done:
    
    ---
    
    ## What was done
    
    ### Files created
    
    | File | Type | Purpose |
    |------|------|---------|
    | `LoginTests/project.json` | Project config | Tests project with UIAutomation + Testing dependencies; `TestLoginSuccess.cs` registered in `fileInfoCollection` |
    | `LoginTests/CodedWorkflowHooks.cs` | Coded Source File (partial class) | Shared Before/After hooks — browser open on Before, browser close on After |
    | `LoginTests/TestLoginSuccess.c
    2026-04-17 20:29:22 [DEBUG] coder_eval.agents.claude_code_agent: <<< RESULT: cost=$0.29592945, usage={'input_tokens': 16, 'cache_creation_input_tokens': 29797, 'cache_read_input_tokens': 377309, 'output_tokens': 4730, 'server_tool_use': {'web_search_requests': 0, 'web_fetch_requests': 0}, 'service_ti
    2026-04-17 20:29:22 [DEBUG] coder_eval.agents.claude_code_agent: session_id changed: None -> 46d655fd-1947-43a3-b29f-56eef97bc4e7
    2026-04-17 20:29:22 [DEBUG] coder_eval.agents.claude_code_agent: Agent query stream ended
    2026-04-17 20:29:22 [DEBUG] coder_eval.orchestrator: Agent response received (4622 chars)
    2026-04-17 20:29:22 [DEBUG] coder_eval.orchestrator: Checking success criteria
    2026-04-17 20:29:22 [INFO] coder_eval.evaluation.checker: Criterion 'file_exists' score: 1.00
    2026-04-17 20:29:22 [INFO] coder_eval.evaluation.checker: Criterion 'file_contains' score: 1.00
    2026-04-17 20:29:22 [INFO] coder_eval.evaluation.checker: Criterion 'file_exists' score: 1.00
    2026-04-17 20:29:22 [INFO] coder_eval.evaluation.checker: Criterion 'file_contains' score: 1.00
    2026-04-17 20:29:22 [INFO] coder_eval.evaluation.checker: Criterion 'file_exists' score: 1.00
    2026-04-17 20:29:22 [INFO] coder_eval.evaluation.checker: Criterion 'json_check' score: 1.00
    2026-04-17 20:29:22 [INFO] coder_eval.orchestrator: Success criteria: 6/6 passed, weighted score: 1.000
    2026-04-17 20:29:22 [INFO] coder_eval.orchestrator: All success criteria passed!
    2026-04-17 20:29:22 [INFO] coder_eval.orchestrator: Running post-run command: python3 $SKILLS_REPO_PATH/tests/tasks/uipath-maestro-flow/_shared/cleanup_solutions.py
    2026-04-17 20:29:22 [WARNING] coder_eval.orchestrator: [post_run stderr] cleanup_solutions: no .uipx files under cwd; nothing to do.
    2026-04-17 20:29:22 [INFO] coder_eval.orchestrator: Sandbox preserved (in-place): runs/2026-04-17_13-38-59/default/skill-rpa-before-after-hooks/artifacts/skill-rpa-before-after-hooks